46 #ifndef _PEXSI_NUMTNS_IMPL_HPP_
47 #define _PEXSI_NUMTNS_IMPL_HPP_
52 template <
class F> NumTns<F>::NumTns(Int m, Int n, Int p): m_(m), n_(n), p_(p), owndata_(true) {
54 ErrorHandling(
"Cannot allocate memory.");}
58 template <
class F> NumTns<F>::NumTns(Int m, Int n, Int p,
bool owndata, F* data): m_(m), n_(n), p_(p), owndata_(owndata) {
61 ErrorHandling(
"Cannot allocate memory.");}
69 template <
class F> NumTns<F>::NumTns(
const NumTns<F>& C): m_(C.m_), n_(C.n_), p_(C.p_), owndata_(C.owndata_) {
73 ErrorHandling(
"Cannot allocate memory.");}
82 template <
class F> NumTns<F>::~NumTns() {
84 if(m_>0 && n_>0 && p_>0) {
delete[] data_; data_ = NULL; }
88 template <
class F> NumTns<F>& NumTns<F>::operator=(
const NumTns<F>& C) {
90 if(m_>0 && n_>0 && p_>0) {
delete[] data_; data_ = NULL; }
92 m_ = C.m_; n_=C.n_; p_=C.p_; owndata_=C.owndata_;
94 if(m_>0 && n_>0 && p_>0) { data_ =
new F[m_*n_*p_];
if( data_ == NULL ) {
95 ErrorHandling(
"Cannot allocate memory.");} }
else data_=NULL;
96 if(m_>0 && n_>0 && p_>0) {
for(Int i=0; i<m_*n_*p_; i++) data_[i] = C.data_[i]; }
103 template <
class F>
void NumTns<F>::Resize(Int m, Int n, Int p) {
104 if( owndata_ ==
false ){
105 ErrorHandling(
"Tensor being resized must own data.");
107 if(m_!=m || n_!=n || p_!=p) {
108 if(m_>0 && n_>0 && p_>0) {
delete[] data_; data_ = NULL; }
109 m_ = m; n_ = n; p_=p;
110 if(m_>0 && n_>0 && p_>0) { data_ =
new F[m_*n_*p_];
if( data_ == NULL ) {
111 ErrorHandling(
"Cannot allocate memory.");}
116 template <
class F>
const F& NumTns<F>::operator()(Int i, Int j, Int k)
const {
117 if( i < 0 || i >= m_ ||
120 ErrorHandling(
"Index is out of bound." );
122 return data_[i+j*m_+k*m_*n_];
125 template <
class F> F& NumTns<F>::operator()(Int i, Int j, Int k) {
126 if( i < 0 || i >= m_ ||
129 ErrorHandling(
"Index is out of bound." );
131 return data_[i+j*m_+k*m_*n_];
135 template <
class F> F* NumTns<F>::MatData (Int j)
const {
136 if( j < 0 || j >= p_ ) {
137 ErrorHandling(
"Index is out of bound." );
139 return &(data_[j*m_*n_]);
142 template <
class F> F* NumTns<F>::VecData (Int j, Int k)
const {
143 if( j < 0 || j >= n_ ||
145 ErrorHandling(
"Index is out of bound." );
148 return &(data_[k*m_*n_+j*m_]);
154 for(Int i=0; i < T.m() * T.n() * T.p(); i++) *(ptr++) = val;
166 for(Int i=0; i < T.m() * T.n() * T.p(); i++)
167 sum += abs(ptr[i]) * abs(ptr[i]);
174 #endif // _PEXSI_NUMTNS_IMPL_HPP_
Int n_
The size of second dimension.
Definition: NumTns.hpp:70
Int m_
The size of the first dimension.
Definition: NumTns.hpp:67
Real Energy(const NumMat< F > &M)
Energy computes the L2 norm of a matrix (treated as a vector).
Definition: NumMat_impl.hpp:158
bool owndata_
Whether it owns the data.
Definition: NumTns.hpp:76
void SetValue(NumMat< F > &M, F val)
SetValue sets a numerical matrix to a constant val.
Definition: NumMat_impl.hpp:153
Numerical tensor.
Definition: NumTns.hpp:63
F * data_
The pointer for the actual data.
Definition: NumTns.hpp:79
Int p_
The size of third dimension.
Definition: NumTns.hpp:73