diff --git a/lib/simd/Grid_avx.h b/lib/simd/Grid_avx.h index 2dc38cca..a00e29eb 100644 --- a/lib/simd/Grid_avx.h +++ b/lib/simd/Grid_avx.h @@ -4,7 +4,7 @@ Using intrinsics */ -// Time-stamp: <2015-06-09 14:26:59 neo> +// Time-stamp: <2015-06-16 23:30:41 neo> //---------------------------------------------------------------------- #include @@ -248,7 +248,7 @@ namespace Optimization { return _mm256_set_m128i(a1,a0); #endif #if defined (AVX2) - return _mm256_mul_epi32(a,b); + return _mm256_mullo_epi32(a,b); #endif } diff --git a/lib/simd/Grid_sse4.h b/lib/simd/Grid_sse4.h index 3a54c0b3..62516201 100644 --- a/lib/simd/Grid_sse4.h +++ b/lib/simd/Grid_sse4.h @@ -4,7 +4,7 @@ Using intrinsics */ -// Time-stamp: <2015-06-09 14:24:01 neo> +// Time-stamp: <2015-06-16 23:27:54 neo> //---------------------------------------------------------------------- #include @@ -97,7 +97,7 @@ namespace Optimization { } // Integer inline __m128i operator()(Integer *a){ - return _mm_set_epi32(a[0],a[1],a[2],a[3]); + return _mm_set_epi32(a[3],a[2],a[1],a[0]); } @@ -181,7 +181,7 @@ namespace Optimization { } // Integer inline __m128i operator()(__m128i a, __m128i b){ - return _mm_mul_epi32(a,b); + return _mm_mullo_epi32(a,b); } }; diff --git a/lib/tensors/Tensor_Ta.h b/lib/tensors/Tensor_Ta.h index f06dbf04..0eea1e6d 100644 --- a/lib/tensors/Tensor_Ta.h +++ b/lib/tensors/Tensor_Ta.h @@ -63,26 +63,70 @@ namespace Grid { for(int c1=0;c1 inline auto Determinant(const iScalar&r) -> iScalar + { + iScalar ret; + ret._internal = Determinant(r._internal); + return ret; + } + + template::TensorLevel == 0 >::type * =nullptr> + inline iScalar Determinant(const iMatrix &arg) + { + iMatrix ret(arg); + iScalar det = vtype(1.0); + /* Conversion of matrix to upper triangular */ + for(int i = 0; i < N; i++){ + for(int j = 0; j < N; j++){ + if(j>i){ + vtype ratio = ret._internal[j][i]/ret._internal[i][i]; + for(int k = 0; k < N; k++){ + ret._internal[j][k] -= ratio * ret._internal[i][k]; + } + } + } + } + + for(int i = 0; i < N; i++) + det *= ret._internal[i][i]; + + return det; + } + + + + /////////////////////////////////////////////// // Exponentiate function for scalar, vector, matrix /////////////////////////////////////////////// diff --git a/lib/tensors/Tensor_extract_merge.h b/lib/tensors/Tensor_extract_merge.h index cea9bb64..21ffd778 100644 --- a/lib/tensors/Tensor_extract_merge.h +++ b/lib/tensors/Tensor_extract_merge.h @@ -57,7 +57,7 @@ inline void extract(typename std::enable_if::value, const v extracted[i]=buf[i*s]; for(int ii=1;ii(scm); - //random(SerialRNG, cm); + random(SerialRNG, cm); + std::cout << cm << std::endl; + + //cm = Ta(cm); + //TComplex tracecm= trace(cm); //std::cout << cm << std::endl; - cm = Ta(cm); - //TComplex tracecm= trace(cm); - //std::cout << cm << " "<< tracecm << std::endl; - cm = ProjectOnGroup(cm); + std::cout << cm << " " << std::endl; + cm = ProjectOnGroup(cm); + std::cout << cm << " " << std::endl; + + TComplex det = Determinant(cm); + + std::cout << "determinant: " << det << std::endl; cm = Exponentiate(cm, 1.0, 10); + std::cout << cm << " " << std::endl; + det = Determinant(cm); + std::cout << "determinant: " << det << std::endl; + // Foo = Foo+scalar; // LatticeColourMatrix+Scalar // Foo = Foo*scalar; // LatticeColourMatrix*Scalar @@ -296,10 +303,12 @@ int main (int argc, char ** argv) LatticeInteger coor(&Fine); LatticeCoordinate(coor,d); lex = lex + coor*mm[d]; + } Bar = zero; Bar = where(lex coor(4); for(coor[3]=0;coor[3]