UnitTests_DMRGBlock_SaveInfo.cpp
1 static char help[] =
2  "Test code for DMRGBlock module on saving and retrieving blocks from disk \n";
3 
4 #include <slepceps.h>
5 #include "DMRGBlock.hpp"
6 #include "linalg_tools.hpp"
7 #include <iostream>
8 
9 PETSC_EXTERN PetscErrorCode SetRow(const Mat& A, const PetscInt& row, const std::vector<PetscInt>& idxn);
10 PETSC_EXTERN PetscErrorCode Makedir(const std::string& dir_name);
11 PETSC_EXTERN PetscErrorCode SetSz0(const Mat& Sz);
12 PETSC_EXTERN PetscErrorCode SetSp0(const Mat& Sp);
13 PETSC_EXTERN PetscErrorCode SetSz1(const Mat& Sz);
14 PETSC_EXTERN PetscErrorCode SetSp1(const Mat& Sp);
15 PETSC_EXTERN PetscErrorCode Makedir(const std::string& dir_name);
16 
17 PetscErrorCode CreateAndSaveBlock(Block::SpinBase& blk)
18 {
19  PetscErrorCode ierr;
20 
21  ierr = blk.Initialize(PETSC_COMM_WORLD, 2, {1.5,0.5,-0.5,-1.5}, {2,3,2,1});CHKERRQ(ierr);
22  ierr = blk.CheckSectors(); CHKERRQ(ierr);
23  ierr = Makedir("trash_block_test_save"); CHKERRQ(ierr);
24  ierr = blk.InitializeSave("trash_block_test_save"); CHKERRQ(ierr);
25 
26  /* Set the entries of the operators following the correct sectors */
27  ierr = SetSz0(blk.Sz(0)); CHKERRQ(ierr);
28  ierr = SetSp0(blk.Sp(0)); CHKERRQ(ierr);
29  ierr = SetSz1(blk.Sz(1)); CHKERRQ(ierr);
30  ierr = SetSp1(blk.Sp(1)); CHKERRQ(ierr);
31  ierr = blk.AssembleOperators(); CHKERRQ(ierr);
32  ierr = blk.EnsureSaved(); CHKERRQ(ierr);
33  ierr = blk.EnsureRetrieved(); CHKERRQ(ierr);
34 
35  return(0);
36 }
37 
38 PetscErrorCode RetrieveBlockFromDisk(Block::SpinBase& blk)
39 {
40  PetscErrorCode ierr;
41  ierr = blk.InitializeFromDisk(PETSC_COMM_WORLD,"trash_block_test_save/"); CHKERRQ(ierr);
42  ierr = blk.AssembleOperators(); CHKERRQ(ierr);
43 
44  return(0);
45 }
46 
47 PetscErrorCode CompareBlocks(
48  Block::SpinBase& blk1,
49  Block::SpinBase& blk2
50  )
51 {
52  PetscErrorCode ierr;
53  PetscBool flg;
54 
55  if(blk1.NumSites()!=blk2.NumSites()) SETERRQ3(PETSC_COMM_WORLD,1,"Unequal %s. "
56  "Block1: %lld. Block2: %lld.", "NumSites", blk1.NumSites(), blk2.NumSites());
57  if(blk1.NumStates()!=blk2.NumStates()) SETERRQ3(PETSC_COMM_WORLD,1,"Unequal %s. "
58  "Block1: %lld. Block2: %lld.", "NumStates", blk1.NumStates(), blk2.NumStates());
60  SETERRQ3(PETSC_COMM_WORLD,1,"Unequal %s. " "Block1: %lld. Block2: %lld.",
61  "Magnetization.NumStates", blk1.Magnetization.NumStates(), blk2.Magnetization.NumStates());
63  SETERRQ3(PETSC_COMM_WORLD,1,"Unequal %s. " "Block1: %lld. Block2: %lld.",
64  "Magnetization.NumSectors", blk1.Magnetization.NumSectors(), blk2.Magnetization.NumSectors());
65 
66  for(PetscInt idx=0; idx<blk1.Magnetization.NumSectors(); ++idx)
67  {
68  if(blk1.Magnetization.List(idx)!=blk2.Magnetization.List(idx))
69  SETERRQ4(PETSC_COMM_WORLD,1,"Unequal %s at idx %lld. Block1: %g. Block2: %g.",
70  "Magnetization.List", idx, blk1.Magnetization.List(idx), blk2.Magnetization.List(idx));
71 
72  if(blk1.Magnetization.Sizes(idx)!=blk2.Magnetization.Sizes(idx))
73  SETERRQ4(PETSC_COMM_WORLD,1,"Unequal %s at idx %lld. Block1: %lld. Block2: %lld.",
74  "Magnetization.List", idx, blk1.Magnetization.Sizes(idx), blk2.Magnetization.Sizes(idx));
75  }
76 
77  /* Compare the operators with each other */
78  ierr = MatEqual(blk1.Sz(0), blk2.Sz(0), &flg); CHKERRQ(ierr);
79  if(!flg) SETERRQ(PETSC_COMM_WORLD,1,"Wrong retrieval of matrix Sz0");
80  ierr = MatEqual(blk1.Sp(0), blk2.Sp(0), &flg); CHKERRQ(ierr);
81  if(!flg) SETERRQ(PETSC_COMM_WORLD,1,"Wrong retrieval of matrix Sp0");
82  ierr = MatEqual(blk1.Sz(1), blk2.Sz(1), &flg); CHKERRQ(ierr);
83  if(!flg) SETERRQ(PETSC_COMM_WORLD,1,"Wrong retrieval of matrix Sz1");
84  ierr = MatEqual(blk1.Sp(1), blk2.Sp(1), &flg); CHKERRQ(ierr);
85  if(!flg) SETERRQ(PETSC_COMM_WORLD,1,"Wrong retrieval of matrix Sp1");
86 
87  return(0);
88 }
89 
90 int main(int argc, char **argv)
91 {
92  PetscErrorCode ierr = 0;
93  PetscMPIInt nprocs, rank;
94  MPI_Comm& comm = PETSC_COMM_WORLD;
95 
96  /* Initialize MPI */
97  ierr = SlepcInitialize(&argc, &argv, (char*)0, help); CHKERRQ(ierr);
98  ierr = MPI_Comm_size(comm, &nprocs); CHKERRQ(ierr);
99  ierr = MPI_Comm_rank(comm, &rank); CHKERRQ(ierr);
100 
101  Block::SpinBase blk1, blk2;
102 
103  ierr = CreateAndSaveBlock(blk1); CHKERRQ(ierr);
104  ierr = RetrieveBlockFromDisk(blk2); CHKERRQ(ierr);
105  ierr = CompareBlocks(blk1, blk2); CHKERRQ(ierr);
106 
107  ierr = blk1.Destroy(); CHKERRQ(ierr);
108  ierr = blk2.Destroy(); CHKERRQ(ierr);
109 
110  ierr = SlepcFinalize(); CHKERRQ(ierr);
111  return ierr;
112 }
PetscErrorCode EnsureRetrieved()
Ensures that the block matrices have been retrieved if the block is initialized, otherwise does nothi...
Definition: DMRGBlock.cpp:1098
PetscErrorCode InitializeSave(const std::string &save_dir_in)
Initializes the writing of the block matrices to file.
Definition: DMRGBlock.cpp:835
PETSC_EXTERN PetscErrorCode Makedir(const std::string &dir_name)
Creates a directory named dir_name.
Definition: MiscTools.cpp:306
Base class for the implementation of a block of spin sites.
Definition: DMRGBlock.hpp:79
PetscErrorCode AssembleOperators()
Ensures that all operators are assembled.
Definition: DMRGBlock.cpp:825
PetscErrorCode EnsureSaved()
Ensures that the block matrices have been saved if the block is initialized, otherwise does nothing...
Definition: DMRGBlock.cpp:1090
std::vector< PetscReal > List() const
Returns the list of quantum numbers.
PetscErrorCode InitializeFromDisk(const MPI_Comm &comm_in, const std::string &block_path)
Initializes block object from data located in the directory block_path.
Definition: DMRGBlock.cpp:214
PetscErrorCode CheckSectors() const
Checks whether sector indexing was done properly.
Definition: DMRGBlock.cpp:429
std::vector< PetscInt > Sizes() const
Returns the number of basis states in each quantum number block.
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
PetscInt NumSectors() const
Returns the number of quantum number sectors.
PetscErrorCode Initialize(const MPI_Comm &comm_in)
Initializes block object&#39;s MPI attributes.
Definition: DMRGBlock.cpp:31
QuantumNumbers Magnetization
Stores the information on the magnetization Sectors.
Definition: DMRGBlock.hpp:326
PetscInt NumSites() const
Gets the number of sites that are currently initialized.
Definition: DMRGBlock.hpp:344
Mat Sp(const PetscInt &Isite) const
Returns the matrix pointer to the operator at site Isite.
Definition: DMRGBlock.hpp:359
PetscInt NumStates() const
Gets the number of states that are currently used.
Definition: DMRGBlock.hpp:347
PetscInt NumStates() const
Returns the total number of states.
This site was generated by Sphinx using Doxygen with a customized theme from doxygen-bootstrapped.