*** empty log message ***
This commit is contained in:
parent
226f89425d
commit
50c278e48c
30
fourindex.h
30
fourindex.h
@ -77,7 +77,7 @@ switch(symmetry)
|
|||||||
break;
|
break;
|
||||||
case T2ijab_real: break; //result will automatically vanish due to generated antisymmetry; i!=a from principle
|
case T2ijab_real: break; //result will automatically vanish due to generated antisymmetry; i!=a from principle
|
||||||
case nosymmetry: break;
|
case nosymmetry: break;
|
||||||
default: laerror("illegal symmetry in piterator");
|
default: laerror("illegal symmetry");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -155,7 +155,8 @@ public:
|
|||||||
inline int getcount() const {return count?*count:0;}
|
inline int getcount() const {return count?*count:0;}
|
||||||
fourindex & operator=(const fourindex &rhs);
|
fourindex & operator=(const fourindex &rhs);
|
||||||
fourindex & operator+=(const fourindex &rhs);
|
fourindex & operator+=(const fourindex &rhs);
|
||||||
inline void setsymmetry(fourindexsymtype s) {symmetry=s;}
|
void setsymmetry(fourindexsymtype s) {symmetry=s;}
|
||||||
|
fourindexsymtype getsymmetry() const {return symmetry;}
|
||||||
fourindex & join(fourindex &rhs); //more efficient +=, rhs will be emptied
|
fourindex & join(fourindex &rhs); //more efficient +=, rhs will be emptied
|
||||||
inline ~fourindex();
|
inline ~fourindex();
|
||||||
inline matel4<I,T> *getlist() const {return list;}
|
inline matel4<I,T> *getlist() const {return list;}
|
||||||
@ -193,24 +194,25 @@ protected:
|
|||||||
I nn;
|
I nn;
|
||||||
|
|
||||||
//methods
|
//methods
|
||||||
void tryread()
|
void tryread() const
|
||||||
{
|
{
|
||||||
current=NULL;
|
const_cast<fourindex_ext<I,T> *>(this)->current=NULL;
|
||||||
ssize_t r=read(fd,buffer,bufsize*sizeof(matel4stored<I,T>));
|
ssize_t r=read(fd,buffer,bufsize*sizeof(matel4stored<I,T>));
|
||||||
if(r<0) {perror("read error"); laerror("read error in fourindex_ext");}
|
if(r<0) {perror("read error"); laerror("read error in fourindex_ext");}
|
||||||
if(r%sizeof(matel4stored<I,T>)) laerror("read inconsistency in fourindex_ext");
|
if(r%sizeof(matel4stored<I,T>)) laerror("read inconsistency in fourindex_ext");
|
||||||
nread= r/sizeof(matel4stored<I,T>);
|
const_cast<fourindex_ext<I,T> *>(this)->nread = r/sizeof(matel4stored<I,T>);
|
||||||
if(nread) current=buffer;
|
if(nread) const_cast<fourindex_ext<I,T> *>(this)->current=buffer;
|
||||||
}
|
}
|
||||||
void next() { if(current && (unsigned int) (++current - buffer) >=nread) tryread(); }
|
void next() const { if(current && (unsigned int) (++ const_cast<fourindex_ext<I,T> *>(this)->current - buffer) >=nread) tryread(); }
|
||||||
bool eof() {return !current;};
|
bool eof() const {return !current;};
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
fourindex_ext(const int file, const fourindexsymtype s=undefined_symmetry, const I n=0, const unsigned int b=256) :current(NULL),fd(file),bufsize(b),nread(0),symmetry(s),nn(n) {buffer = new matel4stored<I,T>[bufsize]; }
|
fourindex_ext(const int file, const fourindexsymtype s=undefined_symmetry, const I n=0, const unsigned int b=256) :current(NULL),fd(file),bufsize(b),nread(0),symmetry(s),nn(n) {buffer = new matel4stored<I,T>[bufsize]; }
|
||||||
~fourindex_ext() {if(buffer) delete[] buffer;}
|
~fourindex_ext() {if(buffer) delete[] buffer;}
|
||||||
void setsymmetry(fourindexsymtype s) {symmetry=s;};
|
void setsymmetry(fourindexsymtype s) {symmetry=s;};
|
||||||
void rewind() {if(0!=lseek(fd,0L,SEEK_SET)) {perror("seek error"); laerror("cannot seek in fourindex_ext");} };
|
fourindexsymtype getsymmetry() const {return symmetry;}
|
||||||
|
void rewind() const {if(0!=lseek(fd,0L,SEEK_SET)) {perror("seek error"); laerror("cannot seek in fourindex_ext");} };
|
||||||
inline I size() const {return nn;}
|
inline I size() const {return nn;}
|
||||||
|
|
||||||
//iterator and permute-iterator are both implemented as poiters to the original class, using private functions of this class
|
//iterator and permute-iterator are both implemented as poiters to the original class, using private functions of this class
|
||||||
@ -219,10 +221,10 @@ public:
|
|||||||
//iterator
|
//iterator
|
||||||
typedef class iterator {
|
typedef class iterator {
|
||||||
private:
|
private:
|
||||||
fourindex_ext *base;
|
const fourindex_ext *base;
|
||||||
public:
|
public:
|
||||||
iterator() {};
|
iterator() {};
|
||||||
iterator(fourindex_ext *p): base(p) {};
|
iterator(const fourindex_ext *p): base(p) {};
|
||||||
~iterator() {};
|
~iterator() {};
|
||||||
bool operator!=(const iterator &rhs) const {return base!=rhs.base;} //should only be used for comparison with end()
|
bool operator!=(const iterator &rhs) const {return base!=rhs.base;} //should only be used for comparison with end()
|
||||||
iterator &operator++() {if(base) base->next(); if(base->eof()) base=NULL; return *this;}
|
iterator &operator++() {if(base) base->next(); if(base->eof()) base=NULL; return *this;}
|
||||||
@ -231,7 +233,7 @@ public:
|
|||||||
const matel4stored<I,T> & operator*() const {return *base->current;}
|
const matel4stored<I,T> & operator*() const {return *base->current;}
|
||||||
bool notNULL() const {return base;}
|
bool notNULL() const {return base;}
|
||||||
};
|
};
|
||||||
iterator begin() {rewind(); tryread(); if(!eof()) return this; else return NULL;}
|
iterator begin() const {rewind(); tryread(); if(!eof()) return this; else return NULL;}
|
||||||
iterator end() const {return iterator(NULL);}
|
iterator end() const {return iterator(NULL);}
|
||||||
|
|
||||||
//piterator ... iterate over all allowed permutations; conveniently expressed via the basic iterator which does the block-buffering
|
//piterator ... iterate over all allowed permutations; conveniently expressed via the basic iterator which does the block-buffering
|
||||||
@ -544,6 +546,7 @@ public:
|
|||||||
template<class T, class I>
|
template<class T, class I>
|
||||||
fourindex_dense<twoelectronrealmullikan,T,I>::fourindex_dense<twoelectronrealmullikan,T,I>(const fourindex<I,T> &rhs) : NRSMat<T>((T)0,rhs.size()*(rhs.size()+1)/2)
|
fourindex_dense<twoelectronrealmullikan,T,I>::fourindex_dense<twoelectronrealmullikan,T,I>(const fourindex<I,T> &rhs) : NRSMat<T>((T)0,rhs.size()*(rhs.size()+1)/2)
|
||||||
{
|
{
|
||||||
|
if(rhs.getsymmetry() != twoelectronrealmullikan ) laerror("fourindex_dense symmetry mismatch");
|
||||||
typename fourindex<I,T>::iterator p;
|
typename fourindex<I,T>::iterator p;
|
||||||
for(p=rhs.begin(); p!= rhs.end(); ++p) (*this)(p->index.indiv.i,p->index.indiv.j,p->index.indiv.k,p->index.indiv.l) = p->elem;
|
for(p=rhs.begin(); p!= rhs.end(); ++p) (*this)(p->index.indiv.i,p->index.indiv.j,p->index.indiv.k,p->index.indiv.l) = p->elem;
|
||||||
}
|
}
|
||||||
@ -551,6 +554,7 @@ for(p=rhs.begin(); p!= rhs.end(); ++p) (*this)(p->index.indiv.i,p->index.indiv.j
|
|||||||
template<class T, class I>
|
template<class T, class I>
|
||||||
fourindex_dense<twoelectronrealmullikan,T,I>::fourindex_dense<twoelectronrealmullikan,T,I>(const fourindex_ext<I,T> &rhs) : NRSMat<T>((T)0,rhs.size()*(rhs.size()+1)/2)
|
fourindex_dense<twoelectronrealmullikan,T,I>::fourindex_dense<twoelectronrealmullikan,T,I>(const fourindex_ext<I,T> &rhs) : NRSMat<T>((T)0,rhs.size()*(rhs.size()+1)/2)
|
||||||
{
|
{
|
||||||
|
if(rhs.getsymmetry() != twoelectronrealmullikan ) laerror("fourindex_dense symmetry mismatch");
|
||||||
typename fourindex_ext<I,T>::iterator p;
|
typename fourindex_ext<I,T>::iterator p;
|
||||||
for(p=rhs.begin(); p!= rhs.end(); ++p) (*this)(p->index.indiv.i,p->index.indiv.j
|
for(p=rhs.begin(); p!= rhs.end(); ++p) (*this)(p->index.indiv.i,p->index.indiv.j
|
||||||
,p->index.indiv.k,p->index.indiv.l) = p->elem;
|
,p->index.indiv.k,p->index.indiv.l) = p->elem;
|
||||||
@ -566,7 +570,7 @@ unsigned long J = k>l? k*(k-1)/2+l-1 : l*(l-1)/2+k-1;
|
|||||||
//I,J act as indices of a NRSmat
|
//I,J act as indices of a NRSmat
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (*count != 1) laerror("lval (i,j,k,l) with count > 1 in fourindex_dense");
|
if (*count != 1) laerror("lval (i,j,k,l) with count > 1 in fourindex_dense");
|
||||||
if (I<0 || I>=nn || J<0 || J>=nn) laerror("fourindex_dense index out of range");
|
if (I<0 || I>=(unsigned long)nn || J<0 || J>=(unsigned long)nn) laerror("fourindex_dense index out of range");
|
||||||
if (!v) laerror("access to unallocated fourindex_dense");
|
if (!v) laerror("access to unallocated fourindex_dense");
|
||||||
#endif
|
#endif
|
||||||
return I>=J ? v[I*(I+1)/2+J] : v[J*(J+1)/2+I];
|
return I>=J ? v[I*(I+1)/2+J] : v[J*(J+1)/2+I];
|
||||||
|
Loading…
Reference in New Issue
Block a user