UnitTests_DMRGKron.cpp
1 static char help[] =
2  "Test code for DMRGKron routines\n";
3 
4 #include <slepceps.h>
5 #include "linalg_tools.hpp"
6 #include "DMRGKron.hpp"
7 #include <iostream>
8 
9 /* MiscTools.cpp */
10 PETSC_EXTERN PetscErrorCode InitSingleSiteOperator(const MPI_Comm& comm, const PetscInt dim, Mat* mat);
11 
12 /* UnitTests_Misc.cpp */
13 PETSC_EXTERN PetscErrorCode SetRow(const Mat& A, const PetscInt& row, const std::vector<PetscInt>& idxn);
14 PETSC_EXTERN PetscErrorCode CheckRow(const Mat& A, const char* label, const PetscInt& row, const std::vector<PetscInt>& idxn,
15  const std::vector<PetscScalar>& v);
16 PETSC_EXTERN const char hborder[];
17 
18 #define PrintHeader(COMM,TEXT) PetscPrintf((COMM), "%s\n%s\n%s\n", hborder, (TEXT), hborder)
19 
20 static PetscBool verbose = PETSC_FALSE;
21 
23 PetscErrorCode TestKron01();
24 
26 PetscErrorCode TestKron02();
27 
28 int main(int argc, char **argv)
29 {
30  PetscErrorCode ierr = 0;
31  ierr = SlepcInitialize(&argc, &argv, (char*)0, help); CHKERRQ(ierr);
32  ierr = PetscOptionsGetBool(NULL,NULL,"-verbose",&verbose,NULL); CHKERRQ(ierr);
33  // ierr = TestKron01(); CHKERRQ(ierr);
34  ierr = TestKron02(); CHKERRQ(ierr);
35  ierr = SlepcFinalize(); CHKERRQ(ierr);
36  return(0);
37 }
38 
39 PetscErrorCode TestKron01()
40 {
41  PetscErrorCode ierr = 0;
42  MPI_Comm& comm = PETSC_COMM_WORLD;
43  PetscMPIInt nprocs, rank;
44  ierr = MPI_Comm_size(comm, &nprocs); CHKERRQ(ierr);
45  ierr = MPI_Comm_rank(comm, &rank); CHKERRQ(ierr);
46 
47  Block::SpinBase RightBlock, LeftBlock, BlockOut;
48 
49  ierr = LeftBlock.Initialize(PETSC_COMM_WORLD, 3, {+0.5,-0.5}, {2,1}); CHKERRQ(ierr);
50 
51  SetRow( LeftBlock.Sz(0),0, {0, 1 });
52  SetRow( LeftBlock.Sz(0),1, { 1 });
53  SetRow( LeftBlock.Sz(0),2, { 2 });
54 
55  SetRow( LeftBlock.Sz(1),0, {0 });
56  SetRow( LeftBlock.Sz(1),1, { 1 });
57  SetRow( LeftBlock.Sz(1),2, { 2 });
58 
59  SetRow( LeftBlock.Sz(2),0, { 1 });
60  SetRow( LeftBlock.Sz(2),1, { });
61  SetRow( LeftBlock.Sz(2),2, { 2 });
62 
63  SetRow( LeftBlock.Sp(0),0, { 2 });
64  SetRow( LeftBlock.Sp(0),1, { });
65  SetRow( LeftBlock.Sp(0),2, { });
66 
67  SetRow( LeftBlock.Sp(1),0, { 2 });
68  SetRow( LeftBlock.Sp(1),1, { 2 });
69  SetRow( LeftBlock.Sp(1),2, { });
70 
71  SetRow( LeftBlock.Sp(2),0, { });
72  SetRow( LeftBlock.Sp(2),1, { 2 });
73  SetRow( LeftBlock.Sp(2),2, { });
74 
75  ierr = RightBlock.Initialize(PETSC_COMM_WORLD, 2, {+1.,0.,-1.}, {1,2,1}); CHKERRQ(ierr);
76 
77  SetRow(RightBlock.Sz(0),0, {0 });
78  SetRow(RightBlock.Sz(0),1, { 1 });
79  SetRow(RightBlock.Sz(0),2, { 1, 2 });
80  SetRow(RightBlock.Sz(0),3, { 3});
81 
82  SetRow(RightBlock.Sz(1),0, {0 });
83  SetRow(RightBlock.Sz(1),1, { 1, 2 });
84  SetRow(RightBlock.Sz(1),2, { 2 });
85  SetRow(RightBlock.Sz(1),3, { });
86 
87  SetRow(RightBlock.Sp(0),0, { 1 });
88  SetRow(RightBlock.Sp(0),1, { 3});
89  SetRow(RightBlock.Sp(0),2, { 3});
90  SetRow(RightBlock.Sp(0),3, { });
91 
92  SetRow(RightBlock.Sp(1),0, { 1, 2 });
93  SetRow(RightBlock.Sp(1),1, { });
94  SetRow(RightBlock.Sp(1),2, { 3});
95  SetRow(RightBlock.Sp(1),3, { });
96 
97  /* Calculate the Kronecker product of the blocks */
98  ierr = KronEye_Explicit(LeftBlock, RightBlock, {}, BlockOut); CHKERRQ(ierr);
99 
100  if(verbose){
101  ierr = MatPeek(BlockOut.Sz(0), "BlockOut.Sz(0)"); CHKERRQ(ierr);
102  ierr = MatPeek(BlockOut.Sz(1), "BlockOut.Sz(1)"); CHKERRQ(ierr);
103  ierr = MatPeek(BlockOut.Sz(2), "BlockOut.Sz(2)"); CHKERRQ(ierr);
104  ierr = MatPeek(BlockOut.Sz(3), "BlockOut.Sz(3)"); CHKERRQ(ierr);
105  ierr = MatPeek(BlockOut.Sz(4), "BlockOut.Sz(4)"); CHKERRQ(ierr);
106 
107  ierr = MatPeek(BlockOut.Sp(0), "BlockOut.Sp(0)"); CHKERRQ(ierr);
108  ierr = MatPeek(BlockOut.Sp(1), "BlockOut.Sp(1)"); CHKERRQ(ierr);
109  ierr = MatPeek(BlockOut.Sp(2), "BlockOut.Sp(2)"); CHKERRQ(ierr);
110  ierr = MatPeek(BlockOut.Sp(3), "BlockOut.Sp(3)"); CHKERRQ(ierr);
111  ierr = MatPeek(BlockOut.Sp(4), "BlockOut.Sp(4)"); CHKERRQ(ierr);
112  }
113  /* Check all blocks */
114  ierr = BlockOut.CheckOperatorBlocks(); CHKERRQ(ierr);
115 
116  /* Check all entries */
117  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 0, {0,1}, {0,1}); CHKERRQ(ierr);
118  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 1, {1}, {1}); CHKERRQ(ierr);
119  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 2, {2,4}, {0,1}); CHKERRQ(ierr);
120  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 3, {3,5}, {0,1}); CHKERRQ(ierr);
121  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 4, { 4}, { 1}); CHKERRQ(ierr);
122  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 5, { 5}, { 1}); CHKERRQ(ierr);
123  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 6, {6}, {2}); CHKERRQ(ierr);
124  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 7, {7,8}, {0,1}); CHKERRQ(ierr);
125  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 8, {8}, {1}); CHKERRQ(ierr);
126  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 9, {9}, {2}); CHKERRQ(ierr);
127  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 10, {10}, {2}); CHKERRQ(ierr);
128  ierr = CheckRow(BlockOut.Sz(0), "BlockOut.Sz(0)", 11, {11}, {2}); CHKERRQ(ierr);
129 
130  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 0, {0}, {0}); CHKERRQ(ierr);
131  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 1, {1}, {1}); CHKERRQ(ierr);
132  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 2, {2}, {0}); CHKERRQ(ierr);
133  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 3, {3}, {0}); CHKERRQ(ierr);
134  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 4, {4}, {1}); CHKERRQ(ierr);
135  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 5, {5}, {1}); CHKERRQ(ierr);
136  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 6, {6}, {2}); CHKERRQ(ierr);
137  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 7, {7}, {0}); CHKERRQ(ierr);
138  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 8, {8}, {1}); CHKERRQ(ierr);
139  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 9, {9}, {2}); CHKERRQ(ierr);
140  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 10, {10}, {2}); CHKERRQ(ierr);
141  ierr = CheckRow(BlockOut.Sz(1), "BlockOut.Sz(1)", 11, {11}, {2}); CHKERRQ(ierr);
142 
143  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 0, {1}, {1}); CHKERRQ(ierr);
144  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 1, {}, {}); CHKERRQ(ierr);
145  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 2, {4}, {1}); CHKERRQ(ierr);
146  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 3, {5}, {1}); CHKERRQ(ierr);
147  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 4, {}, {}); CHKERRQ(ierr);
148  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 5, {}, {}); CHKERRQ(ierr);
149  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 6, {6}, {2}); CHKERRQ(ierr);
150  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 7, {8}, {1}); CHKERRQ(ierr);
151  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 8, {}, {}); CHKERRQ(ierr);
152  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 9, {9}, {2}); CHKERRQ(ierr);
153  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 10, {10}, {2}); CHKERRQ(ierr);
154  ierr = CheckRow(BlockOut.Sz(2), "BlockOut.Sz(2)", 11, {11}, {2}); CHKERRQ(ierr);
155 
156  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 0, {6}, {2}); CHKERRQ(ierr);
157  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 1, {}, {}); CHKERRQ(ierr);
158  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 2, {9}, {2}); CHKERRQ(ierr);
159  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 3, {10}, {2}); CHKERRQ(ierr);
160  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 4, {}, {}); CHKERRQ(ierr);
161  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 5, {}, {}); CHKERRQ(ierr);
162  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 6, {}, {}); CHKERRQ(ierr);
163  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 7, {11}, {2}); CHKERRQ(ierr);
164  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 8, {}, {}); CHKERRQ(ierr);
165  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 9, {}, {}); CHKERRQ(ierr);
166  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 10, {}, {}); CHKERRQ(ierr);
167  ierr = CheckRow(BlockOut.Sp(0), "BlockOut.Sp(0)", 11, {}, {}); CHKERRQ(ierr);
168 
169  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 0, {6}, {2}); CHKERRQ(ierr);
170  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 1, {6}, {2}); CHKERRQ(ierr);
171  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 2, {9}, {2}); CHKERRQ(ierr);
172  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 3, {10}, {2}); CHKERRQ(ierr);
173  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 4, {9}, {2}); CHKERRQ(ierr);
174  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 5, {10}, {2}); CHKERRQ(ierr);
175  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 6, {}, {}); CHKERRQ(ierr);
176  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 7, {11}, {2}); CHKERRQ(ierr);
177  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 8, {11}, {2}); CHKERRQ(ierr);
178  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 9, {}, {}); CHKERRQ(ierr);
179  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 10, {}, {}); CHKERRQ(ierr);
180  ierr = CheckRow(BlockOut.Sp(1), "BlockOut.Sp(1)", 11, {}, {}); CHKERRQ(ierr);
181 
182  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 0, {}, {}); CHKERRQ(ierr);
183  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 1, {6}, {2}); CHKERRQ(ierr);
184  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 2, {}, {}); CHKERRQ(ierr);
185  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 3, {}, {}); CHKERRQ(ierr);
186  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 4, {9}, {2}); CHKERRQ(ierr);
187  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 5, {10}, {2}); CHKERRQ(ierr);
188  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 6, {}, {}); CHKERRQ(ierr);
189  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 7, {}, {}); CHKERRQ(ierr);
190  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 8, {11}, {2}); CHKERRQ(ierr);
191  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 9, {}, {}); CHKERRQ(ierr);
192  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 10, {}, {}); CHKERRQ(ierr);
193  ierr = CheckRow(BlockOut.Sp(2), "BlockOut.Sp(2)", 11, {}, {}); CHKERRQ(ierr);
194 
195  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 0, {0}, {0}); CHKERRQ(ierr);
196  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 1, {1}, {0}); CHKERRQ(ierr);
197  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 2, {2}, {1}); CHKERRQ(ierr);
198  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 3, {2, 3}, {1, 2}); CHKERRQ(ierr);
199  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 4, {4}, {1}); CHKERRQ(ierr);
200  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 5, {4,5}, {1,2}); CHKERRQ(ierr);
201  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 6, {6}, {0}); CHKERRQ(ierr);
202  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 7, {7}, {3}); CHKERRQ(ierr);
203  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 8, {8}, {3}); CHKERRQ(ierr);
204  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 9, {9}, {1}); CHKERRQ(ierr);
205  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 10, {9,10}, {1,2}); CHKERRQ(ierr);
206  ierr = CheckRow(BlockOut.Sz(3), "BlockOut.Sz(3)", 11, {11}, {3}); CHKERRQ(ierr);
207 
208  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 0, {0}, {0}); CHKERRQ(ierr);
209  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 1, {1}, {0}); CHKERRQ(ierr);
210  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 2, {2,3}, {1,2}); CHKERRQ(ierr);
211  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 3, {3}, {2}); CHKERRQ(ierr);
212  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 4, {4,5}, {1,2}); CHKERRQ(ierr);
213  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 5, {5}, {2}); CHKERRQ(ierr);
214  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 6, {6}, {0}); CHKERRQ(ierr);
215  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 7, {}, {}); CHKERRQ(ierr);
216  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 8, {}, {}); CHKERRQ(ierr);
217  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 9, {9,10}, {1,2}); CHKERRQ(ierr);
218  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 10, {10}, {2}); CHKERRQ(ierr);
219  ierr = CheckRow(BlockOut.Sz(4), "BlockOut.Sz(4)", 11, {}, {}); CHKERRQ(ierr);
220 
221  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 0, {2}, {1}); CHKERRQ(ierr);
222  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 1, {4}, {1}); CHKERRQ(ierr);
223  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 2, {7}, {3}); CHKERRQ(ierr);
224  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 3, {7}, {3}); CHKERRQ(ierr);
225  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 4, {8}, {3}); CHKERRQ(ierr);
226  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 5, {8}, {3}); CHKERRQ(ierr);
227  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 6, {9}, {1}); CHKERRQ(ierr);
228  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 7, {}, {}); CHKERRQ(ierr);
229  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 8, {}, {}); CHKERRQ(ierr);
230  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 9, {11}, {3}); CHKERRQ(ierr);
231  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 10, {11}, {3}); CHKERRQ(ierr);
232  ierr = CheckRow(BlockOut.Sp(3), "BlockOut.Sp(3)", 11, {}, {}); CHKERRQ(ierr);
233 
234  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 0, {2,3}, {1,2}); CHKERRQ(ierr);
235  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 1, {4,5}, {1,2}); CHKERRQ(ierr);
236  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 2, {}, {}); CHKERRQ(ierr);
237  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 3, {7}, {3}); CHKERRQ(ierr);
238  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 4, {}, {}); CHKERRQ(ierr);
239  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 5, {8}, {3}); CHKERRQ(ierr);
240  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 6, {9,10}, {1,2}); CHKERRQ(ierr);
241  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 7, {}, {}); CHKERRQ(ierr);
242  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 8, {}, {}); CHKERRQ(ierr);
243  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 9, {}, {}); CHKERRQ(ierr);
244  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 10, {11}, {3}); CHKERRQ(ierr);
245  ierr = CheckRow(BlockOut.Sp(4), "BlockOut.Sp(4)", 11, {}, {}); CHKERRQ(ierr);
246 
247  ierr = RightBlock.Destroy(); CHKERRQ(ierr);
248  ierr = LeftBlock.Destroy(); CHKERRQ(ierr);
249  ierr = BlockOut.Destroy(); CHKERRQ(ierr);
250 
251  return(0);
252 }
253 
254 
255 PetscErrorCode TestKron02()
256 {
257 
258  PetscErrorCode ierr = 0;
259  MPI_Comm& comm = PETSC_COMM_WORLD;
260  PetscMPIInt nprocs, rank;
261  ierr = MPI_Comm_size(comm, &nprocs); CHKERRQ(ierr);
262  ierr = MPI_Comm_rank(comm, &rank); CHKERRQ(ierr);
263 
264  Block::SpinBase RightBlock, LeftBlock, BlockOut;
265 
266  ierr = LeftBlock.Initialize(PETSC_COMM_WORLD, 1, PETSC_DEFAULT); CHKERRQ(ierr);
267  ierr = RightBlock.Initialize(PETSC_COMM_WORLD, 1, PETSC_DEFAULT); CHKERRQ(ierr);
268 
269  ierr = KronEye_Explicit(LeftBlock, RightBlock, {}, BlockOut); CHKERRQ(ierr);
270 
271  ierr = RightBlock.Destroy(); CHKERRQ(ierr);
272  ierr = LeftBlock.Destroy(); CHKERRQ(ierr);
273  ierr = BlockOut.Destroy(); CHKERRQ(ierr);
274 
275  return(0);
276 }
Base class for the implementation of a block of spin sites.
Definition: DMRGBlock.hpp:79
PetscErrorCode KronEye_Explicit(Block::SpinBase &LeftBlock, Block::SpinBase &RightBlock, const std::vector< Hamiltonians::Term > &Terms, Block::SpinBase &BlockOut)
Calculates a new block combining two spin-1/2 blocks.
Definition: DMRGKron.cpp:459
PetscErrorCode CheckOperatorBlocks() const
Checks whether all matrix blocks follow the correct sector indices using MatCheckOperatorBlocks() ...
Definition: DMRGBlock.cpp:601
Mat Sz(const PetscInt &Isite) const
Returns the matrix pointer to the operator at site Isite.
Definition: DMRGBlock.hpp:353
PetscErrorCode Destroy()
Destroys all operator matrices and frees memory.
Definition: DMRGBlock.cpp:655
PetscErrorCode Initialize(const MPI_Comm &comm_in)
Initializes block object&#39;s MPI attributes.
Definition: DMRGBlock.cpp:31
Mat Sp(const PetscInt &Isite) const
Returns the matrix pointer to the operator at site Isite.
Definition: DMRGBlock.hpp:359
This site was generated by Sphinx using Doxygen with a customized theme from doxygen-bootstrapped.