Import Geant4 10.4.0 source tree

This commit is contained in:
Gabriele Cosmo
2017-12-08 12:52:30 +01:00
parent 98e455a940
commit fc6af9e721
2166 changed files with 276760 additions and 100873 deletions
+326 -87
View File
@@ -258,26 +258,25 @@ public:\
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;\
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) ) {\
if( is_zero(*lp,a_prec,a_fabs) && is_zero(*rp,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) ) {\
} else if( !is_zero(*lp,a_prec,a_fabs) && is_zero(*rp,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) ) {\
} else if( is_zero(*lp,a_prec,a_fabs) && !is_zero(*rp,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;\
if(!numbers_are_equal((*lp)*a_factor,*rp,a_prec,a_fabs)) return false;\
}\
}\
}\
@@ -286,11 +285,10 @@ public:\
\
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;}\
if(c!=r) {if(!is_zero(value(r,c),a_prec,a_fabs)) return false;}\
}\
}\
return true;\
@@ -357,6 +355,21 @@ public:\
}\
return true;\
}\
\
template <class PREC>\
bool is_antisymmetric_prec(const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
unsigned int _D = dimension();\
{for(unsigned int r=0;r<_D;r++) {\
if(a_fabs(value(r,r))>=a_prec) return false;\
}}\
for(unsigned int r=0;r<_D;r++) {\
for(unsigned int c=(r+1);c<_D;c++) {\
T diff = value(r,c)-minus_one()*value(c,r);\
if(a_fabs(diff)>=a_prec) return false;\
}\
}\
return true;\
}\
\
void symmetric_part(TOOLS_MAT_CLASS& a_res) const {\
a_res = *this;\
@@ -373,7 +386,49 @@ public:\
a_res.multiply(one()/two());\
}\
\
T determinant(unsigned int a_tmp_rs[],unsigned int a_tmp_cs[]) const { /*[rord=dim-1]*/ \
template <class PREC>\
bool is_block_UL_DR(const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
/* Look if even dim matrix is of the form : |X 0|\
|0 Y|*/\
unsigned int _D = dimension();\
unsigned int _D_2 = _D/2;\
/*if(2*__D_2!=_D) return false;*/\
for(unsigned int r=0;r<_D_2;r++) {\
for(unsigned int c=_D_2;c<_D;c++) {\
if(a_fabs(value(r,c))>=a_prec) return false;\
}\
}\
for(unsigned int r=_D_2;r<_D;r++) {\
for(unsigned int c=0;c<_D_2;c++) {\
if(a_fabs(value(r,c))>=a_prec) return false;\
}\
}\
return true;\
}\
\
template <class PREC>\
bool is_block_UR_DL(const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
/* Look if even dim matrix is of the form : |0 X|\
|Y 0|*/\
unsigned int _D = dimension();\
unsigned int _D_2 = _D/2;\
/*if(2*__D_2!=_D) return false;*/\
for(unsigned int r=0;r<_D_2;r++) {\
for(unsigned int c=0;c<_D_2;c++) {\
if(a_fabs(value(r,c))>=a_prec) return false;\
}\
}\
for(unsigned int r=_D_2;r<_D;r++) {\
for(unsigned int c=_D_2;c<_D;c++) {\
if(a_fabs(value(r,c))>=a_prec) return false;\
}\
}\
return true;\
}\
\
template <class PREC>\
T determinant_prec(unsigned int a_tmp_rs[],unsigned int a_tmp_cs[], /*[rord=dim-1]*/\
const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
unsigned int ord = dimension();\
if(ord==0) {\
return zero();\
@@ -381,27 +436,27 @@ public:\
return *m_vec;\
} else if(ord==2) {\
T v00 = *m_vec;\
T v01 = *(m_vec+ord);\
T v10 = *(m_vec+1);\
T v11 = *(m_vec+1+ord);\
T v01 = *(m_vec+2);\
T v11 = *(m_vec+3);\
return (v00 * v11 - v10 * v01);\
} else if(ord==3) {\
/* 00 01 02 \
10 11 12 \
20 21 22 \
*/\
T v01 = *(m_vec+ord);\
T v02 = *(m_vec+2*ord);\
T v11 = *(m_vec+1+ord);\
T v12 = *(m_vec+1+2*ord);\
T v21 = *(m_vec+2+ord);\
T v22 = *(m_vec+2+2*ord);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v20 = *(m_vec+2);\
T v01 = *(m_vec+3);\
T v11 = *(m_vec+4);\
T v21 = *(m_vec+5);\
T v02 = *(m_vec+6);\
T v12 = *(m_vec+7);\
T v22 = *(m_vec+8);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
return (v00*cof_00-v10*cof_10+v20*cof_20);\
}\
\
@@ -418,8 +473,8 @@ public:\
for(unsigned int r=0;r<ord;r++) {\
if(r>=1) a_tmp_rs[r-1] = r-1;\
v_rc = value(r,c);\
if(v_rc!=zero()) {\
T subdet = sub_determinant(rord,a_tmp_rs,a_tmp_cs);\
if(!is_zero(v_rc,a_prec,a_fabs)) {\
T subdet = sub_determinant_prec(rord,a_tmp_rs,a_tmp_cs,a_prec,a_fabs);\
if(sg) \
det += v_rc * subdet;\
else\
@@ -430,6 +485,10 @@ public:\
\
return det;\
}\
\
T determinant(unsigned int a_tmp_rs[],unsigned int a_tmp_cs[]) const { /*[rord=dim-1]*/ \
return determinant_prec<double>(a_tmp_rs,a_tmp_cs,0,zero_fabs);\
}\
\
T determinant() const {\
unsigned int ord = dimension();\
@@ -439,23 +498,27 @@ public:\
return *m_vec;\
} else if(ord==2) {\
T v00 = *m_vec;\
T v01 = *(m_vec+ord);\
T v10 = *(m_vec+1);\
T v11 = *(m_vec+1+ord);\
T v01 = *(m_vec+2);\
T v11 = *(m_vec+3);\
return (v00 * v11 - v10 * v01);\
} else if(ord==3) {\
T v01 = *(m_vec+ord);\
T v02 = *(m_vec+2*ord);\
T v11 = *(m_vec+1+ord);\
T v12 = *(m_vec+1+2*ord);\
T v21 = *(m_vec+2+ord);\
T v22 = *(m_vec+2+2*ord);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
/* 00 01 02 \
10 11 12 \
20 21 22 \
*/\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v20 = *(m_vec+2);\
T v01 = *(m_vec+3);\
T v11 = *(m_vec+4);\
T v21 = *(m_vec+5);\
T v02 = *(m_vec+6);\
T v12 = *(m_vec+7);\
T v22 = *(m_vec+8);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
return (v00*cof_00-v10*cof_10+v20*cof_20);\
}\
unsigned int rord = ord-1;\
@@ -467,73 +530,200 @@ public:\
return det;\
}\
\
bool invert(TOOLS_MAT_CLASS& a_res) const {\
/*Generic invertion method.*/\
template <class PREC>\
bool invert_prec(TOOLS_MAT_CLASS& a_res,\
unsigned int a_tmp_rs[],unsigned int a_tmp_cs[], /*[rord=dim-1]*/\
const PREC& a_prec,PREC(*a_fabs)(const T&) /*for det=?zero*/ \
) const { \
unsigned int ord = dimension();\
if(ord==0) return true;\
\
if(ord==1) {\
T v = value(0,0);\
if(v==zero()) return false;\
a_res.set_value(0,0,one()/v);\
T det = value(0,0);\
if(is_zero(det,a_prec,a_fabs)) return false;\
a_res.set_value(0,0,one()/det);\
return true;\
} else if(ord==2) {\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v01 = *(m_vec+2);\
T v11 = *(m_vec+3);\
T det = (v00 * v11 - v10 * v01);\
if(is_zero(det,a_prec,a_fabs)) return false;\
a_res.set_value(0,0,v11/det);\
a_res.set_value(1,1,v00/det);\
a_res.set_value(0,1,minus_one()*v01/det);\
a_res.set_value(1,0,minus_one()*v10/det);\
return true;\
} else if(ord==3) {\
/* 00 01 02 \
10 11 12 \
20 21 22 \
*/\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v20 = *(m_vec+2);\
T v01 = *(m_vec+3);\
T v11 = *(m_vec+4);\
T v21 = *(m_vec+5);\
T v02 = *(m_vec+6);\
T v12 = *(m_vec+7);\
T v22 = *(m_vec+8);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
T det = (v00*cof_00-v10*cof_10+v20*cof_20);\
if(is_zero(det,a_prec,a_fabs)) return false;\
T cof_01 = v10 * v22 - v20 * v12;\
T cof_11 = v00 * v22 - v20 * v02;\
T cof_21 = v00 * v12 - v10 * v02;\
T cof_02 = v10 * v21 - v20 * v11;\
T cof_12 = v00 * v21 - v20 * v01;\
T cof_22 = v00 * v11 - v10 * v01;\
a_res.set_value(0,0,cof_00/det);\
a_res.set_value(1,0,minus_one()*cof_01/det);\
a_res.set_value(2,0,cof_02/det);\
a_res.set_value(0,1,minus_one()*cof_10/det);\
a_res.set_value(1,1,cof_11/det);\
a_res.set_value(2,1,minus_one()*cof_12/det);\
a_res.set_value(0,2,cof_20/det);\
a_res.set_value(1,2,minus_one()*cof_21/det);\
a_res.set_value(2,2,cof_22/det);\
return true;\
}\
\
/*Generic invertion method.*/\
\
unsigned int rord = ord-1;\
unsigned int* cs = new unsigned int[rord];\
unsigned int* rs = new unsigned int[rord];\
\
/* Get det with r = 0;*/\
T det = zero();\
T subdet;\
{\
{for(unsigned int i=0;i<rord;i++) {rs[i] = i+1;}}\
{for(unsigned int i=0;i<rord;i++) {a_tmp_rs[i] = i+1;}}\
unsigned int r = 0;\
/*if(r>=1) rs[r-1] = r-1;*/\
/*if(r>=1) a_tmp_rs[r-1] = r-1;*/\
\
{for(unsigned int i=0;i<rord;i++) {cs[i] = i+1;}}\
{for(unsigned int i=0;i<rord;i++) {a_tmp_cs[i] = i+1;}}\
bool sg = true; /*r=0+c=0*/\
for(unsigned int c=0;c<ord;c++) {\
if(c>=1) cs[c-1] = c-1;\
T subdet = sub_determinant(rord,rs,cs);\
T sgn = sg ? one() : minus_one();\
det += value(r,c) * subdet * sgn;\
T _value = subdet * sgn;\
a_res.set_value(c,r,_value);\
sg = sg?false:true;\
if(c>=1) a_tmp_cs[c-1] = c-1;\
subdet = sub_determinant_prec(rord,a_tmp_rs,a_tmp_cs,a_prec,a_fabs);\
if(sg) {\
det += value(r,c) * subdet;\
a_res.set_value(c,r,subdet);\
sg = false;\
} else {\
det += value(r,c) * subdet * minus_one();\
a_res.set_value(c,r,subdet * minus_one());\
sg = true;\
}\
}}\
\
if(det==zero()) {\
delete [] cs;\
delete [] rs;\
return false;\
} \
\
if(is_zero(det,a_prec,a_fabs)) return false;\
\
{for(unsigned int c=0;c<ord;c++) {\
a_res.set_value(c,0,a_res.value(c,0)/det);\
}}\
\
{for(unsigned int i=0;i<rord;i++) {rs[i] = i+1;}}\
{for(unsigned int i=0;i<rord;i++) {a_tmp_rs[i] = i+1;}}\
bool sgr = false; /*r=1+c=0*/\
for(unsigned int r=1;r<ord;r++) {\
if(r>=1) rs[r-1] = r-1;\
{for(unsigned int i=0;i<rord;i++) {cs[i] = i+1;}}\
if(r>=1) a_tmp_rs[r-1] = r-1;\
{for(unsigned int i=0;i<rord;i++) {a_tmp_cs[i] = i+1;}}\
bool sg = sgr;\
for(unsigned int c=0;c<ord;c++) {\
if(c>=1) cs[c-1] = c-1;\
T subdet = sub_determinant(rord,rs,cs);\
T sgn = sg ? one() : minus_one();\
T _value = (subdet * sgn)/det;\
a_res.set_value(c,r,_value);\
sg = sg?false:true;\
if(c>=1) a_tmp_cs[c-1] = c-1;\
subdet = sub_determinant_prec(rord,a_tmp_rs,a_tmp_cs,a_prec,a_fabs);\
if(sg) {\
a_res.set_value(c,r,subdet/det);\
sg = false;\
} else {\
a_res.set_value(c,r,(subdet * minus_one())/det);\
sg = true;\
}\
}\
sgr = sgr?false:true;\
}\
\
delete [] cs;\
delete [] rs;\
\
return true;\
}\
\
template <class PREC>\
bool invert_prec(TOOLS_MAT_CLASS& a_res,const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
unsigned int ord = dimension();\
if(ord==0) return true;\
\
if(ord==1) {\
T det = value(0,0);\
if(is_zero(det,a_prec,a_fabs)) return false;\
a_res.set_value(0,0,one()/det);\
return true;\
} else if(ord==2) {\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v01 = *(m_vec+2);\
T v11 = *(m_vec+3);\
T det = (v00 * v11 - v10 * v01);\
if(is_zero(det,a_prec,a_fabs)) return false;\
a_res.set_value(0,0,v11/det);\
a_res.set_value(1,1,v00/det);\
a_res.set_value(0,1,minus_one()*v01/det);\
a_res.set_value(1,0,minus_one()*v10/det);\
return true;\
} else if(ord==3) {\
/* 00 01 02 \
10 11 12 \
20 21 22 \
*/\
T v00 = *m_vec;\
T v10 = *(m_vec+1);\
T v20 = *(m_vec+2);\
T v01 = *(m_vec+3);\
T v11 = *(m_vec+4);\
T v21 = *(m_vec+5);\
T v02 = *(m_vec+6);\
T v12 = *(m_vec+7);\
T v22 = *(m_vec+8);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
T det = (v00*cof_00-v10*cof_10+v20*cof_20);\
if(is_zero(det,a_prec,a_fabs)) return false;\
T cof_01 = v10 * v22 - v20 * v12;\
T cof_11 = v00 * v22 - v20 * v02;\
T cof_21 = v00 * v12 - v10 * v02;\
T cof_02 = v10 * v21 - v20 * v11;\
T cof_12 = v00 * v21 - v20 * v01;\
T cof_22 = v00 * v11 - v10 * v01;\
a_res.set_value(0,0,cof_00/det);\
a_res.set_value(1,0,minus_one()*cof_01/det);\
a_res.set_value(2,0,cof_02/det);\
a_res.set_value(0,1,minus_one()*cof_10/det);\
a_res.set_value(1,1,cof_11/det);\
a_res.set_value(2,1,minus_one()*cof_12/det);\
a_res.set_value(0,2,cof_20/det);\
a_res.set_value(1,2,minus_one()*cof_21/det);\
a_res.set_value(2,2,cof_22/det);\
return true;\
}\
\
unsigned int rord = ord-1;\
unsigned int* cs = new unsigned int[rord];\
unsigned int* rs = new unsigned int[rord];\
bool status = invert_prec(a_res,rs,cs,a_prec,a_fabs);\
delete [] cs;\
delete [] rs;\
return status;\
}\
\
bool invert(TOOLS_MAT_CLASS& a_res,unsigned int a_tmp_rs[],unsigned int a_tmp_cs[]) const { /*[rord=dim-1]*/ \
return invert_prec<double>(a_res,a_tmp_rs,a_tmp_cs,0,zero_fabs);\
}\
\
bool invert(TOOLS_MAT_CLASS& a_res) const {\
return invert_prec<double>(a_res,0,zero_fabs);\
}\
\
void power(unsigned int a_n,TOOLS_MAT_CLASS& a_res) const {\
a_res.set_identity();\
@@ -553,6 +743,36 @@ public:\
a_res += tmp;\
}\
}\
\
void cosh(unsigned int a_le,TOOLS_MAT_CLASS& a_res) const {\
/* result = I + M**2/2! + M**4/4! + .... */\
a_res.set_identity();\
TOOLS_MAT_CLASS M_2(*this);\
M_2._mul_mtx(m_vec);\
TOOLS_MAT_CLASS tmp(*this);\
tmp.set_identity();\
for(unsigned int i=1;i<=a_le;i+=2) {\
tmp *= M_2;\
tmp.multiply(one()/T(i+0)); \
tmp.multiply(one()/T(i+1)); \
a_res += tmp;\
}\
}\
\
void sinh(unsigned int a_le,TOOLS_MAT_CLASS& a_res) const {\
/* result = M + M**3/3! + .... */\
a_res._copy(m_vec);\
TOOLS_MAT_CLASS M_2(*this);\
M_2._mul_mtx(m_vec);\
TOOLS_MAT_CLASS tmp(*this);\
tmp._copy(m_vec);\
for(unsigned int i=1;i<=a_le;i+=2) {\
tmp *= M_2;\
tmp.multiply(one()/T(i+1)); \
tmp.multiply(one()/T(i+2)); \
a_res += tmp;\
}\
}\
\
void log(unsigned int a_le,TOOLS_MAT_CLASS& a_res) const {\
/* result = (M-I) - (M-I)**2/2 + (M-I)**3/3 +... */\
@@ -565,7 +785,7 @@ public:\
M_I._add_mtx(m_vec);\
\
TOOLS_MAT_CLASS M_Ip(M_I);\
T fact = -1;\
T fact = minus_one();\
\
TOOLS_MAT_CLASS tmp;\
\
@@ -633,22 +853,22 @@ public: /*operators*/\
}\
protected:\
void _copy(const T a_m[]) {\
{T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp = *ap;}\
T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp = *ap;\
/*{for(unsigned int i=0;i<dim2();i++) m_vec[i] = a_m[i];}*/\
/* memcpy does not work with std::complex<> and mat<symbol,4> see inlib/tests/symbolic.cpp */\
/*vec_copy(m_vec,a_m,dim2());*/\
}\
\
void _add_mtx(const T a_m[]) { /* this = this + a_m, */\
{T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp += *ap;}\
T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp += *ap;\
/*for(unsigned int i=0;i<dim2();i++) m_vec[i] += a_m[i];*/\
/*vec_add(m_vec,a_m,m_vec,dim2());*/\
}\
void _sub_mtx(const T a_m[]) { /* this = this - a_m, */\
{T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp -= *ap;}\
T* tp = (T*)m_vec;T* ap = (T*)a_m;\
for(unsigned int i=0;i<dim2();i++,tp++,ap++) *tp -= *ap;\
/*for(unsigned int i=0;i<dim2();i++) m_vec[i] -= a_m[i];*/\
/*vec_sub(m_vec,a_m,m_vec,dim2());*/\
}\
@@ -716,7 +936,9 @@ protected:\
delete [] res;\
}\
\
T sub_determinant(unsigned int a_ord,unsigned int aRs[],unsigned int aCs[]) const {\
template <class PREC>\
T sub_determinant_prec(unsigned int a_ord,unsigned int aRs[],unsigned int aCs[],\
const PREC& a_prec,PREC(*a_fabs)(const T&)) const {\
/*WARNING : to optimize, we do not check the content of aRs, aCs.*/\
unsigned int ord = a_ord;\
if(ord==0) return zero();\
@@ -725,17 +947,32 @@ protected:\
/*return (value(aRs[0],aCs[0]) * value(aRs[1],aCs[1]) -\
value(aRs[1],aCs[0]) * value(aRs[0],aCs[1])); \
Optimize the upper :*/\
\
unsigned int r_0 = aRs[0];\
unsigned int r_1 = aRs[1];\
unsigned int c_0 = aCs[0];\
unsigned int c_1 = aCs[1];\
\
unsigned int _ord = dimension();\
const T* p = m_vec;\
\
return ( (*(p+r_0+c_0*_ord)) * (*(p+r_1+c_1*_ord)) -\
(*(p+r_1+c_0*_ord)) * (*(p+r_0+c_1*_ord)) );\
return ( (*(m_vec+aRs[0]+aCs[0]*_ord)) * (*(m_vec+aRs[1]+aCs[1]*_ord)) -\
(*(m_vec+aRs[1]+aCs[0]*_ord)) * (*(m_vec+aRs[0]+aCs[1]*_ord)) );\
\
} else if(ord==3) {\
/* 00 01 02 \
10 11 12 \
20 21 22 \
*/\
unsigned int _ord = dimension();\
\
T v00 = *(m_vec+aRs[0]+aCs[0]*_ord);\
T v10 = *(m_vec+aRs[1]+aCs[0]*_ord);\
T v20 = *(m_vec+aRs[2]+aCs[0]*_ord);\
T v01 = *(m_vec+aRs[0]+aCs[1]*_ord);\
T v11 = *(m_vec+aRs[1]+aCs[1]*_ord);\
T v21 = *(m_vec+aRs[2]+aCs[1]*_ord);\
T v02 = *(m_vec+aRs[0]+aCs[2]*_ord);\
T v12 = *(m_vec+aRs[1]+aCs[2]*_ord);\
T v22 = *(m_vec+aRs[2]+aCs[2]*_ord);\
T cof_00 = v11 * v22 - v21 * v12;\
T cof_10 = v01 * v22 - v21 * v02;\
T cof_20 = v01 * v12 - v11 * v02;\
return (v00*cof_00-v10*cof_10+v20*cof_20);\
}\
\
unsigned int rord = ord-1;\
@@ -754,8 +991,8 @@ protected:\
for(unsigned int r=0;r<ord;r++) {\
if(r>=1) rs[r-1] = aRs[r-1];\
v_rc = value(aRs[r],aCs[c]);\
if(v_rc!=zero()) {\
T subdet = sub_determinant(rord,rs,cs);\
if(!is_zero(v_rc,a_prec,a_fabs)) {\
T subdet = sub_determinant_prec(rord,rs,cs,a_prec,a_fabs);\
if(sg)\
det += v_rc * subdet;\
else\
@@ -768,6 +1005,8 @@ protected:\
delete [] rs;\
\
return det;\
}
}\
\
static double zero_fabs(const T& a_number) {return a_number==zero()?0:1000000;}
#endif