37 template<
class BlockType>
49 template<
class BlockType>
52 blocks.resize(blockmat_copy.
blocks.size());
54 #pragma omp parallel for
55 for(
int i=0;i<blocks.size();i++)
56 blocks[i].reset(
new BlockType(blockmat_copy[i]));
58 degen = blockmat_copy.
degen;
61 template<
class BlockType>
64 blocks = std::move(blockmat_copy.blocks);
66 degen = std::move(blockmat_copy.degen);
75 template<
class BlockType>
78 assert(block < blocks.size());
80 this->degen[block] = degeneracy;
82 blocks[block].reset(
new BlockType(dim));
90 template<
class BlockType>
93 return *blocks[block];
101 template<
class BlockType>
104 return *blocks[block];
112 template<
class BlockType>
115 blocks.resize(blockmat_copy.
blocks.size());
117 #pragma omp parallel for
118 for(
int i=0;i<blocks.size();i++)
119 blocks[i].reset(
new BlockType(blockmat_copy[i]));
128 template<
class BlockType>
131 #pragma omp parallel for
132 for(
int i = 0;i < blocks.size();++i)
142 template<
class BlockType>
145 #pragma omp parallel for
146 for(
int i = 0;i < blocks.size();++i)
147 *blocks[i] += blockmat_pl[i];
156 template<
class BlockType>
159 #pragma omp parallel for
160 for(
int i = 0;i < blocks.size();++i)
161 *blocks[i] -= blockmat_pl[i];
171 template<
class BlockType>
174 #pragma omp parallel for
175 for(
int i = 0;i < blocks.size();++i)
176 blocks[i]->daxpy(alpha,blockmat_pl[i]);
185 template<
class BlockType>
188 #pragma omp parallel for
189 for(
int i = 0;i < blocks.size();++i)
195 template<
class BlockType>
198 #pragma omp parallel for
199 for(
int i = 0;i < blocks.size();++i)
216 return (*blocks[block])(i,j);
229 return (*blocks[block])(i,j);
235 return (*blocks[block])[index];
241 return (*blocks[block])[index];
249 template<
class BlockType>
252 return blocks.size();
258 template<
class BlockType>
261 return blocks[i]->gn();
267 template<
class BlockType>
276 template<
class BlockType>
281 #pragma omp parallel for reduction(+:ward)
282 for(
int i = 0;i < blocks.size();++i)
283 ward += degen[i]*blocks[i]->trace();
292 template<
class BlockType>
297 #pragma omp parallel for reduction(+:ward)
298 for(
int i = 0;i < blocks.size();i++)
299 ward += degen[i]*blocks[i]->ddot(blocks_in[i]);
307 template<
class BlockType>
310 #pragma omp parallel for
311 for(
int i = 0;i < blocks.size();++i)
319 template<
class BlockType>
322 #pragma omp parallel for
323 for(
int i = 0;i < blocks.size();++i)
324 blocks[i]->dscal(alpha);
330 template<
class BlockType>
333 for(
int i = 0;i < blocks.size();++i)
334 blocks[i]->fill_Random();
341 template<
class BlockType>
344 for(
int i = 0;i < blocks.size();++i)
345 blocks[i]->fill_Random(seed);
352 template<
class BlockType>
355 #pragma omp parallel for
356 for(
int i = 0;i < blocks.size();++i)
357 blocks[i]->sqrt(option);
366 template<
class BlockType>
369 #pragma omp parallel for
370 for(
int i = 0;i < blocks.size();++i)
371 blocks[i]->L_map(map[i],
object[i]);
379 template<
class BlockType>
382 #pragma omp parallel for
383 for(
int i = 0;i < blocks.size();++i)
384 blocks[i]->mprod(A[i],B[i]);
392 template<
class BlockType>
395 #pragma omp parallel for
396 for(
int i = 0;i < blocks.size();++i)
397 blocks[i]->symmetrize();
404 for(
unsigned int i = 0;i < blocks.size();++i)
409 template<
class BlockType>
412 for(
unsigned int i=0;i<blocks.size();++i)
419 template<
class MyBlockType>
420 std::ostream &operator<< (std::ostream &output,const doci2DM::BlockStructure<MyBlockType> &blocks_p)
422 for(
int i = 0;i < blocks_p.blocks.size();++i)
424 output << i <<
"\t" << blocks_p.blocks[i]->gn() <<
"\t" << blocks_p.degen[i] << std::endl;
427 output << *blocks_p.blocks[i] << std::endl;
438 template std::ostream &operator<< (std::ostream &output,const doci2DM::BlockStructure<doci2DM::Matrix> &blocks_p);
439 template std::ostream &operator<< (std::ostream &output,const doci2DM::BlockStructure<doci2DM::Vector> &blocks_p);
BlockStructure & operator*=(double)
std::vector< int > degen
degeneracy of the blocks
double ddot(const BlockStructure< BlockType > &) const
BlockStructure & operator-=(const BlockStructure< BlockType > &)
virtual BlockStructure< BlockType > & mprod(const BlockStructure< BlockType > &, const BlockStructure< BlockType > &)
double & operator()(int block, int i, int j)
BlockType & operator[](int block)
void setDim(int, int, int)
std::vector< std::unique_ptr< BlockType > > blocks
BlockStructure & operator=(const BlockStructure< BlockType > &)
BlockStructure & operator/=(double)
virtual void L_map(const BlockStructure< BlockType > &, const BlockStructure< BlockType > &)
virtual void sep_pm(BlockStructure< BlockType > &, BlockStructure< BlockType > &)
BlockStructure & operator+=(const BlockStructure< BlockType > &)
BlockStructure & daxpy(double alpha, const BlockStructure< BlockType > &)