Import Geant4 10.3.0 source tree
This commit is contained in:
@@ -47,6 +47,10 @@ inline void vec_sub(const T* a_1,const T* a_2,T* a_res,unsigned int a_number) {
|
||||
}
|
||||
*/
|
||||
|
||||
#include "eqT"
|
||||
|
||||
#include <cstddef> //size_t
|
||||
|
||||
// common code to class mat and nmat.
|
||||
|
||||
#define TOOLS_MATCOM \
|
||||
@@ -101,6 +105,32 @@ public:\
|
||||
void set_random(RANDOM& a_random) {\
|
||||
for(unsigned int i=0;i<dim2();i++) m_vec[i] = a_random.shoot();\
|
||||
}\
|
||||
template <class RANDOM>\
|
||||
void set_symmetric_random(RANDOM& a_random) {\
|
||||
unsigned int _D = dimension();\
|
||||
{for(unsigned int r=0;r<_D;r++) set_value(r,r,a_random.shoot());}\
|
||||
T rd;\
|
||||
{for(unsigned int r=0;r<_D;r++) {\
|
||||
for(unsigned int c=(r+1);c<_D;c++) {\
|
||||
rd = a_random.shoot();\
|
||||
set_value(r,c,rd);\
|
||||
set_value(c,r,rd);\
|
||||
}\
|
||||
}}\
|
||||
}\
|
||||
template <class RANDOM>\
|
||||
void set_antisymmetric_random(RANDOM& a_random) {\
|
||||
unsigned int _D = dimension();\
|
||||
{for(unsigned int r=0;r<_D;r++) set_value(r,r,zero());}\
|
||||
T rd;\
|
||||
{for(unsigned int r=0;r<_D;r++) {\
|
||||
for(unsigned int c=(r+1);c<_D;c++) {\
|
||||
rd = a_random.shoot();\
|
||||
set_value(r,c,rd);\
|
||||
set_value(c,r,minus_one()*rd);\
|
||||
}\
|
||||
}}\
|
||||
}\
|
||||
public:\
|
||||
template <class VEC>\
|
||||
bool mul_vec(VEC& a_vec,T a_tmp[]) const {\
|
||||
@@ -122,6 +152,25 @@ public:\
|
||||
delete [] res;\
|
||||
return status;\
|
||||
}\
|
||||
\
|
||||
bool mul_array(T a_vec[],T a_tmp[]) const {\
|
||||
/* a_vec = this *= a_vec */\
|
||||
unsigned int _dim = dimension();\
|
||||
T* pos = a_tmp;\
|
||||
for(unsigned int r=0;r<_dim;r++,pos++) {\
|
||||
*pos = T();\
|
||||
for(unsigned int c=0;c<_dim;c++) *pos += m_vec[r+c*_dim]*a_vec[c];\
|
||||
}\
|
||||
{for(unsigned int i=0;i<_dim;i++) a_vec[i] = a_tmp[i];}\
|
||||
return true;\
|
||||
}\
|
||||
bool mul_array(T a_vec[]) const {\
|
||||
T* res = new T[dimension()];\
|
||||
bool status = mul_array(a_vec,res);\
|
||||
delete [] res;\
|
||||
return status;\
|
||||
}\
|
||||
\
|
||||
void mul_mtx(const TOOLS_MAT_CLASS& a_m) {\
|
||||
_mul_mtx(a_m.m_vec);\
|
||||
}\
|
||||
@@ -151,6 +200,18 @@ public:\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
template <class PREC>\
|
||||
bool equal_prec(const TOOLS_MAT_CLASS& a_m,const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
|
||||
if(&a_m==this) return true;\
|
||||
T* tp = (T*)m_vec;\
|
||||
T* mp = (T*)a_m.m_vec;\
|
||||
for(unsigned int i=0;i<dim2();i++,tp++,mp++) {\
|
||||
T diff = (*tp) - (*mp);\
|
||||
if(a_fabs(diff)>=a_prec) return false;\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
void mx_diff(const TOOLS_MAT_CLASS& a_m,T& a_mx_diff) const {\
|
||||
T* tp = (T*)m_vec;\
|
||||
@@ -191,6 +252,49 @@ public:\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
public:\
|
||||
template <class PREC>\
|
||||
bool is_proportional_prec(const TOOLS_MAT_CLASS& a_right,const PREC& a_prec,PREC(*a_fabs)(const T&),T& a_factor) const {\
|
||||
/* If true, then : a_right = a_factor * this.*/\
|
||||
if(this==&a_right) {a_factor=T(1);return true;}\
|
||||
T _zero = zero();\
|
||||
a_factor = _zero;\
|
||||
if(dimension()!=a_right.dimension()) return false;\
|
||||
T* lp = (T*)m_vec;\
|
||||
T* rp = (T*)a_right.m_vec;\
|
||||
bool first = true;\
|
||||
size_t _data_size = data_size();\
|
||||
for(size_t i=0;i<_data_size;i++,lp++,rp++) {\
|
||||
if( numbers_are_equals(*lp,_zero,a_prec,a_fabs) && numbers_are_equals(*rp,_zero,a_prec,a_fabs) ) {\
|
||||
continue;\
|
||||
} else if( !numbers_are_equals(*lp,_zero,a_prec,a_fabs) && numbers_are_equals(*rp,_zero,a_prec,a_fabs) ) {\
|
||||
return false;\
|
||||
} else if( numbers_are_equals(*lp,_zero,a_prec,a_fabs) && !numbers_are_equals(*rp,_zero,a_prec,a_fabs) ) {\
|
||||
return false;\
|
||||
} else {\
|
||||
if(first) {\
|
||||
a_factor = (*rp)/(*lp);\
|
||||
first = false;\
|
||||
} else {\
|
||||
if(!numbers_are_equals((*lp)*a_factor,*rp,a_prec,a_fabs)) return false;\
|
||||
}\
|
||||
}\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
template <class PREC>\
|
||||
bool is_diagonal_prec(const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
|
||||
T _zero = zero();\
|
||||
unsigned int _D = dimension();\
|
||||
for(unsigned int r=0;r<_D;r++) {\
|
||||
for(unsigned int c=0;c<_D;c++) {\
|
||||
if(c!=r) {if(!numbers_are_equals(value(r,c),_zero,a_prec,a_fabs)) return false;}\
|
||||
}\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
const T* data() const {return m_vec;}\
|
||||
unsigned int size() const {return dim2();}\
|
||||
@@ -228,6 +332,18 @@ public:\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
template <class PREC>\
|
||||
bool is_symmetric_prec(const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
|
||||
unsigned int _D = dimension();\
|
||||
for(unsigned int r=0;r<_D;r++) {\
|
||||
for(unsigned int c=(r+1);c<_D;c++) {\
|
||||
T diff = value(r,c)-value(c,r);\
|
||||
if(a_fabs(diff)>=a_prec) return false;\
|
||||
}\
|
||||
}\
|
||||
return true;\
|
||||
}\
|
||||
\
|
||||
bool is_antisymmetric() const {\
|
||||
unsigned int _D = dimension();\
|
||||
@@ -479,11 +595,11 @@ public: /*operators*/\
|
||||
return m_vec[a_r + a_c * dimension()];\
|
||||
}\
|
||||
\
|
||||
T& operator[](unsigned int a_index) { /*for inlib/sg/sf_vec*/\
|
||||
T& operator[](size_t a_index) { /*for inlib/sg/sf_vec*/\
|
||||
/*WARNING : no check on a_index.*/\
|
||||
return m_vec[a_index];\
|
||||
}\
|
||||
const T& operator[](unsigned int a_index) const {\
|
||||
const T& operator[](size_t a_index) const {\
|
||||
/*WARNING : no check on a_index.*/\
|
||||
return m_vec[a_index];\
|
||||
}\
|
||||
|
||||
Reference in New Issue
Block a user