*** empty log message ***
This commit is contained in:
parent
a12bdedce8
commit
226f89425d
72
fourindex.h
72
fourindex.h
@ -515,5 +515,77 @@ istream& operator>>(istream &s, fourindex<I,T> &x)
|
||||
return s;
|
||||
}
|
||||
|
||||
/////////////////////densely stored fourindex///////////////////////////////////
|
||||
//not all symmetry cases implemented yet, but a general template declaration used
|
||||
//we use a general template forward declaration, but then it has to be done differently for (almost) each case
|
||||
//by means of partial template specialization
|
||||
|
||||
template<fourindexsymtype S, class T, class DUMMY> class fourindex_dense;
|
||||
|
||||
//make it as a derived class in order to be able to use it in a base class context - "supermatrix" operations
|
||||
template<class T, class I>
|
||||
class fourindex_dense<twoelectronrealmullikan,T,I> : public NRSMat<T> {
|
||||
public:
|
||||
fourindex_dense(): NRSMat<T>() {};
|
||||
explicit fourindex_dense(const int n): NRSMat<T>(n*(n+1)/2) {};
|
||||
fourindex_dense(const NRSMat<T> &rhs): NRSMat<T>(rhs) {}; //be able to convert the parent class transparently to this
|
||||
fourindex_dense(const T &a, const int n): NRSMat<T>(a,n*(n+1)/2) {};
|
||||
fourindex_dense(const T *a, const int n): NRSMat<T>(a,n*(n+1)/2) {};
|
||||
//and also construct it from sparse and externally stored fourindex classes
|
||||
//it seems not possible to nest template<class I> just for the two constructors
|
||||
fourindex_dense(const fourindex<I,T> &rhs);
|
||||
fourindex_dense(const fourindex_ext<I,T> &rhs);
|
||||
|
||||
T& operator() (unsigned int i, unsigned int j, unsigned int k, unsigned int l);
|
||||
const T& operator() (unsigned int i, unsigned int j, unsigned int k, unsigned int l) const;
|
||||
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
typename fourindex_ext<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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<class T, class DUMMY>
|
||||
T& fourindex_dense<twoelectronrealmullikan,T,DUMMY>::operator() (unsigned int i, unsigned int j, unsigned int k, unsigned int l)
|
||||
{
|
||||
unsigned long I = i>j? i*(i-1)/2+j-1 : j*(j-1)/2+i-1;
|
||||
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
|
||||
#ifdef DEBUG
|
||||
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 (!v) laerror("access to unallocated fourindex_dense");
|
||||
#endif
|
||||
return I>=J ? v[I*(I+1)/2+J] : v[J*(J+1)/2+I];
|
||||
}
|
||||
|
||||
template<class T, class DUMMY>
|
||||
const T& fourindex_dense<twoelectronrealmullikan,T,DUMMY>::operator() (unsigned int i, unsigned int j, unsigned int k, unsigned int l) const
|
||||
{
|
||||
unsigned long I = i>j? i*(i-1)/2+j-1 : j*(j-1)/2+i-1;
|
||||
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
|
||||
#ifdef DEBUG
|
||||
if (I<0 || I>=nn || J<0 || J>=nn) laerror("fourindex_dense index out of range");
|
||||
if (!v) laerror("access to unallocated fourindex_dense");
|
||||
#endif
|
||||
return I>=J ? v[I*(I+1)/2+J] : v[J*(J+1)/2+I];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#endif /*_fourindex_included*/
|
||||
|
Loading…
Reference in New Issue
Block a user