mirror of
https://github.com/paboyle/Grid.git
synced 2025-06-14 22:07:05 +01:00
Compare commits
3 Commits
hotfix/vir
...
master
Author | SHA1 | Date | |
---|---|---|---|
12d20d8e15 | |||
25777e5967 | |||
deab11e68b |
@ -542,7 +542,6 @@ public:
|
|||||||
(*this)(in[i], out[i]);
|
(*this)(in[i], out[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
virtual ~LinearFunction(){};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class Field> class IdentityLinearFunction : public LinearFunction<Field> {
|
template<class Field> class IdentityLinearFunction : public LinearFunction<Field> {
|
||||||
|
@ -128,7 +128,7 @@ double CartesianCommunicator::StencilSendToRecvFromBegin(std::vector<CommsReques
|
|||||||
int recv_from_rank,int dor,
|
int recv_from_rank,int dor,
|
||||||
int xbytes,int rbytes, int dir)
|
int xbytes,int rbytes, int dir)
|
||||||
{
|
{
|
||||||
return xbytes+rbytes;
|
return 2.0*bytes;
|
||||||
}
|
}
|
||||||
void CartesianCommunicator::StencilSendToRecvFromComplete(std::vector<CommsRequest_t> &waitall,int dir)
|
void CartesianCommunicator::StencilSendToRecvFromComplete(std::vector<CommsRequest_t> &waitall,int dir)
|
||||||
{
|
{
|
||||||
|
@ -91,59 +91,6 @@ void *SharedMemory::ShmBufferSelf(void)
|
|||||||
//std::cerr << "ShmBufferSelf "<<ShmRank<<" "<<std::hex<< ShmCommBufs[ShmRank] <<std::dec<<std::endl;
|
//std::cerr << "ShmBufferSelf "<<ShmRank<<" "<<std::hex<< ShmCommBufs[ShmRank] <<std::dec<<std::endl;
|
||||||
return ShmCommBufs[ShmRank];
|
return ShmCommBufs[ShmRank];
|
||||||
}
|
}
|
||||||
static inline int divides(int a,int b)
|
|
||||||
{
|
|
||||||
return ( b == ( (b/a)*a ) );
|
|
||||||
}
|
|
||||||
void GlobalSharedMemory::GetShmDims(const Coordinate &WorldDims,Coordinate &ShmDims)
|
|
||||||
{
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
// Allow user to configure through environment variable
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
char* str = getenv(("GRID_SHM_DIMS_" + std::to_string(ShmDims.size())).c_str());
|
|
||||||
if ( str ) {
|
|
||||||
std::vector<int> IntShmDims;
|
|
||||||
GridCmdOptionIntVector(std::string(str),IntShmDims);
|
|
||||||
assert(IntShmDims.size() == WorldDims.size());
|
|
||||||
long ShmSize = 1;
|
|
||||||
for (int dim=0;dim<WorldDims.size();dim++) {
|
|
||||||
ShmSize *= (ShmDims[dim] = IntShmDims[dim]);
|
|
||||||
assert(divides(ShmDims[dim],WorldDims[dim]));
|
|
||||||
}
|
|
||||||
assert(ShmSize == WorldShmSize);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
// Powers of 2,3,5 only in prime decomposition for now
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
int ndimension = WorldDims.size();
|
|
||||||
ShmDims=Coordinate(ndimension,1);
|
|
||||||
|
|
||||||
std::vector<int> primes({2,3,5});
|
|
||||||
|
|
||||||
int dim = 0;
|
|
||||||
int last_dim = ndimension - 1;
|
|
||||||
int AutoShmSize = 1;
|
|
||||||
while(AutoShmSize != WorldShmSize) {
|
|
||||||
int p;
|
|
||||||
for(p=0;p<primes.size();p++) {
|
|
||||||
int prime=primes[p];
|
|
||||||
if ( divides(prime,WorldDims[dim]/ShmDims[dim])
|
|
||||||
&& divides(prime,WorldShmSize/AutoShmSize) ) {
|
|
||||||
AutoShmSize*=prime;
|
|
||||||
ShmDims[dim]*=prime;
|
|
||||||
last_dim = dim;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (p == primes.size() && last_dim == dim) {
|
|
||||||
std::cerr << "GlobalSharedMemory::GetShmDims failed" << std::endl;
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
dim=(dim+1) %ndimension;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NAMESPACE_END(Grid);
|
NAMESPACE_END(Grid);
|
||||||
|
|
||||||
|
@ -174,6 +174,55 @@ static inline int divides(int a,int b)
|
|||||||
{
|
{
|
||||||
return ( b == ( (b/a)*a ) );
|
return ( b == ( (b/a)*a ) );
|
||||||
}
|
}
|
||||||
|
void GlobalSharedMemory::GetShmDims(const Coordinate &WorldDims,Coordinate &ShmDims)
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
// Allow user to configure through environment variable
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
char* str = getenv(("GRID_SHM_DIMS_" + std::to_string(ShmDims.size())).c_str());
|
||||||
|
if ( str ) {
|
||||||
|
std::vector<int> IntShmDims;
|
||||||
|
GridCmdOptionIntVector(std::string(str),IntShmDims);
|
||||||
|
assert(IntShmDims.size() == WorldDims.size());
|
||||||
|
long ShmSize = 1;
|
||||||
|
for (int dim=0;dim<WorldDims.size();dim++) {
|
||||||
|
ShmSize *= (ShmDims[dim] = IntShmDims[dim]);
|
||||||
|
assert(divides(ShmDims[dim],WorldDims[dim]));
|
||||||
|
}
|
||||||
|
assert(ShmSize == WorldShmSize);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
// Powers of 2,3,5 only in prime decomposition for now
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
int ndimension = WorldDims.size();
|
||||||
|
ShmDims=Coordinate(ndimension,1);
|
||||||
|
|
||||||
|
std::vector<int> primes({2,3,5});
|
||||||
|
|
||||||
|
int dim = 0;
|
||||||
|
int last_dim = ndimension - 1;
|
||||||
|
int AutoShmSize = 1;
|
||||||
|
while(AutoShmSize != WorldShmSize) {
|
||||||
|
int p;
|
||||||
|
for(p=0;p<primes.size();p++) {
|
||||||
|
int prime=primes[p];
|
||||||
|
if ( divides(prime,WorldDims[dim]/ShmDims[dim])
|
||||||
|
&& divides(prime,WorldShmSize/AutoShmSize) ) {
|
||||||
|
AutoShmSize*=prime;
|
||||||
|
ShmDims[dim]*=prime;
|
||||||
|
last_dim = dim;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p == primes.size() && last_dim == dim) {
|
||||||
|
std::cerr << "GlobalSharedMemory::GetShmDims failed" << std::endl;
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
dim=(dim+1) %ndimension;
|
||||||
|
}
|
||||||
|
}
|
||||||
void GlobalSharedMemory::OptimalCommunicatorHypercube(const Coordinate &processors,Grid_MPI_Comm & optimal_comm,Coordinate &SHM)
|
void GlobalSharedMemory::OptimalCommunicatorHypercube(const Coordinate &processors,Grid_MPI_Comm & optimal_comm,Coordinate &SHM)
|
||||||
{
|
{
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
@ -38,15 +38,19 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
// cf. GeneralEvenOddRational.h for details
|
// cf. GeneralEvenOddRational.h for details
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
template<class ImplD, class ImplF>
|
template<class ImplD, class ImplF, class ImplD2>
|
||||||
class GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction : public GeneralEvenOddRatioRationalPseudoFermionAction<ImplD> {
|
class GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction : public GeneralEvenOddRatioRationalPseudoFermionAction<ImplD> {
|
||||||
private:
|
private:
|
||||||
|
typedef typename ImplD2::FermionField FermionFieldD2;
|
||||||
typedef typename ImplD::FermionField FermionFieldD;
|
typedef typename ImplD::FermionField FermionFieldD;
|
||||||
typedef typename ImplF::FermionField FermionFieldF;
|
typedef typename ImplF::FermionField FermionFieldF;
|
||||||
|
|
||||||
FermionOperator<ImplD> & NumOpD;
|
FermionOperator<ImplD> & NumOpD;
|
||||||
FermionOperator<ImplD> & DenOpD;
|
FermionOperator<ImplD> & DenOpD;
|
||||||
|
|
||||||
|
FermionOperator<ImplD2> & NumOpD2;
|
||||||
|
FermionOperator<ImplD2> & DenOpD2;
|
||||||
|
|
||||||
FermionOperator<ImplF> & NumOpF;
|
FermionOperator<ImplF> & NumOpF;
|
||||||
FermionOperator<ImplF> & DenOpF;
|
FermionOperator<ImplF> & DenOpF;
|
||||||
|
|
||||||
@ -60,31 +64,40 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
ConjugateGradientMultiShift<FermionFieldD> msCG(MaxIter, approx);
|
ConjugateGradientMultiShift<FermionFieldD> msCG(MaxIter, approx);
|
||||||
msCG(schurOp,in, out);
|
msCG(schurOp,in, out);
|
||||||
#else
|
#else
|
||||||
SchurDifferentiableOperator<ImplD> schurOpD(numerator ? NumOpD : DenOpD);
|
SchurDifferentiableOperator<ImplD2> schurOpD2(numerator ? NumOpD2 : DenOpD2);
|
||||||
SchurDifferentiableOperator<ImplF> schurOpF(numerator ? NumOpF : DenOpF);
|
SchurDifferentiableOperator<ImplF> schurOpF(numerator ? NumOpF : DenOpF);
|
||||||
FermionFieldD inD(NumOpD.FermionRedBlackGrid());
|
FermionFieldD2 inD2(NumOpD2.FermionRedBlackGrid());
|
||||||
FermionFieldD outD(NumOpD.FermionRedBlackGrid());
|
FermionFieldD2 outD2(NumOpD2.FermionRedBlackGrid());
|
||||||
|
|
||||||
// Action better with higher precision?
|
// Action better with higher precision?
|
||||||
ConjugateGradientMultiShiftMixedPrec<FermionFieldD, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
|
ConjugateGradientMultiShiftMixedPrec<FermionFieldD2, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
|
||||||
msCG(schurOpD, in, out);
|
precisionChange(inD2,in);
|
||||||
|
std::cout << "msCG single solve "<<norm2(inD2)<<" " <<norm2(in)<<std::endl;
|
||||||
|
msCG(schurOpD2, inD2, outD2);
|
||||||
|
precisionChange(out,outD2);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
virtual void multiShiftInverse(bool numerator, const MultiShiftFunction &approx, const Integer MaxIter, const FermionFieldD &in, std::vector<FermionFieldD> &out_elems, FermionFieldD &out){
|
virtual void multiShiftInverse(bool numerator, const MultiShiftFunction &approx, const Integer MaxIter, const FermionFieldD &in, std::vector<FermionFieldD> &out_elems, FermionFieldD &out){
|
||||||
SchurDifferentiableOperator<ImplD> schurOpD(numerator ? NumOpD : DenOpD);
|
SchurDifferentiableOperator<ImplD2> schurOpD2(numerator ? NumOpD2 : DenOpD2);
|
||||||
SchurDifferentiableOperator<ImplF> schurOpF (numerator ? NumOpF : DenOpF);
|
SchurDifferentiableOperator<ImplF> schurOpF (numerator ? NumOpF : DenOpF);
|
||||||
|
|
||||||
FermionFieldD inD(NumOpD.FermionRedBlackGrid());
|
FermionFieldD2 inD2(NumOpD2.FermionRedBlackGrid());
|
||||||
FermionFieldD outD(NumOpD.FermionRedBlackGrid());
|
FermionFieldD2 outD2(NumOpD2.FermionRedBlackGrid());
|
||||||
std::vector<FermionFieldD> out_elemsD(out_elems.size(),NumOpD.FermionRedBlackGrid());
|
std::vector<FermionFieldD2> out_elemsD2(out_elems.size(),NumOpD2.FermionRedBlackGrid());
|
||||||
ConjugateGradientMultiShiftMixedPrecCleanup<FermionFieldD, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
|
ConjugateGradientMultiShiftMixedPrecCleanup<FermionFieldD2, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
|
||||||
msCG(schurOpD, in, out_elems, out);
|
precisionChange(inD2,in);
|
||||||
|
std::cout << "msCG in "<<norm2(inD2)<<" " <<norm2(in)<<std::endl;
|
||||||
|
msCG(schurOpD2, inD2, out_elemsD2, outD2);
|
||||||
|
precisionChange(out,outD2);
|
||||||
|
for(int i=0;i<out_elems.size();i++){
|
||||||
|
precisionChange(out_elems[i],out_elemsD2[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
//Allow derived classes to override the gauge import
|
//Allow derived classes to override the gauge import
|
||||||
virtual void ImportGauge(const typename ImplD::GaugeField &Ud){
|
virtual void ImportGauge(const typename ImplD::GaugeField &Ud){
|
||||||
|
|
||||||
typename ImplF::GaugeField Uf(NumOpF.GaugeGrid());
|
typename ImplF::GaugeField Uf(NumOpF.GaugeGrid());
|
||||||
typename ImplD::GaugeField Ud2(NumOpD.GaugeGrid());
|
typename ImplD2::GaugeField Ud2(NumOpD2.GaugeGrid());
|
||||||
precisionChange(Uf, Ud);
|
precisionChange(Uf, Ud);
|
||||||
precisionChange(Ud2, Ud);
|
precisionChange(Ud2, Ud);
|
||||||
|
|
||||||
@ -96,18 +109,20 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
NumOpF.ImportGauge(Uf);
|
NumOpF.ImportGauge(Uf);
|
||||||
DenOpF.ImportGauge(Uf);
|
DenOpF.ImportGauge(Uf);
|
||||||
|
|
||||||
NumOpD.ImportGauge(Ud2);
|
NumOpD2.ImportGauge(Ud2);
|
||||||
DenOpD.ImportGauge(Ud2);
|
DenOpD2.ImportGauge(Ud2);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction(FermionOperator<ImplD> &_NumOpD, FermionOperator<ImplD> &_DenOpD,
|
GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction(FermionOperator<ImplD> &_NumOpD, FermionOperator<ImplD> &_DenOpD,
|
||||||
FermionOperator<ImplF> &_NumOpF, FermionOperator<ImplF> &_DenOpF,
|
FermionOperator<ImplF> &_NumOpF, FermionOperator<ImplF> &_DenOpF,
|
||||||
|
FermionOperator<ImplD2> &_NumOpD2, FermionOperator<ImplD2> &_DenOpD2,
|
||||||
const RationalActionParams & p, Integer _ReliableUpdateFreq
|
const RationalActionParams & p, Integer _ReliableUpdateFreq
|
||||||
) : GeneralEvenOddRatioRationalPseudoFermionAction<ImplD>(_NumOpD, _DenOpD, p),
|
) : GeneralEvenOddRatioRationalPseudoFermionAction<ImplD>(_NumOpD, _DenOpD, p),
|
||||||
ReliableUpdateFreq(_ReliableUpdateFreq),
|
ReliableUpdateFreq(_ReliableUpdateFreq),
|
||||||
NumOpD(_NumOpD), DenOpD(_DenOpD),
|
NumOpD(_NumOpD), DenOpD(_DenOpD),
|
||||||
NumOpF(_NumOpF), DenOpF(_DenOpF)
|
NumOpF(_NumOpF), DenOpF(_DenOpF),
|
||||||
|
NumOpD2(_NumOpD2), DenOpD2(_DenOpD2)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
virtual std::string action_name(){return "GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction";}
|
virtual std::string action_name(){return "GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction";}
|
||||||
|
@ -67,9 +67,9 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}
|
virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class Impl,class ImplF>
|
template<class Impl,class ImplF,class ImplD2>
|
||||||
class OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction
|
class OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction
|
||||||
: public GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF> {
|
: public GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF,ImplD2> {
|
||||||
public:
|
public:
|
||||||
typedef OneFlavourRationalParams Params;
|
typedef OneFlavourRationalParams Params;
|
||||||
private:
|
private:
|
||||||
@ -91,9 +91,11 @@ NAMESPACE_BEGIN(Grid);
|
|||||||
FermionOperator<Impl> &_DenOp,
|
FermionOperator<Impl> &_DenOp,
|
||||||
FermionOperator<ImplF> &_NumOpF,
|
FermionOperator<ImplF> &_NumOpF,
|
||||||
FermionOperator<ImplF> &_DenOpF,
|
FermionOperator<ImplF> &_DenOpF,
|
||||||
|
FermionOperator<ImplD2> &_NumOpD2,
|
||||||
|
FermionOperator<ImplD2> &_DenOpD2,
|
||||||
const Params & p, Integer ReliableUpdateFreq
|
const Params & p, Integer ReliableUpdateFreq
|
||||||
) :
|
) :
|
||||||
GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF>(_NumOp, _DenOp,_NumOpF, _DenOpF, transcribe(p),ReliableUpdateFreq){}
|
GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF,ImplD2>(_NumOp, _DenOp,_NumOpF, _DenOpF,_NumOpD2, _DenOpD2, transcribe(p),ReliableUpdateFreq){}
|
||||||
|
|
||||||
virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}
|
virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}
|
||||||
};
|
};
|
||||||
|
@ -320,7 +320,7 @@ struct Conj{
|
|||||||
|
|
||||||
struct TimesMinusI{
|
struct TimesMinusI{
|
||||||
//Complex single
|
//Complex single
|
||||||
inline float32x4_t operator()(float32x4_t in){
|
inline float32x4_t operator()(float32x4_t in, float32x4_t ret){
|
||||||
// ar ai br bi -> ai -ar ai -br
|
// ar ai br bi -> ai -ar ai -br
|
||||||
float32x4_t r0, r1;
|
float32x4_t r0, r1;
|
||||||
r0 = vnegq_f32(in); // -ar -ai -br -bi
|
r0 = vnegq_f32(in); // -ar -ai -br -bi
|
||||||
@ -328,7 +328,7 @@ struct TimesMinusI{
|
|||||||
return vtrn1q_f32(r1, r0); // ar -ai br -bi
|
return vtrn1q_f32(r1, r0); // ar -ai br -bi
|
||||||
}
|
}
|
||||||
//Complex double
|
//Complex double
|
||||||
inline float64x2_t operator()(float64x2_t in){
|
inline float64x2_t operator()(float64x2_t in, float64x2_t ret){
|
||||||
// a ib -> b -ia
|
// a ib -> b -ia
|
||||||
float64x2_t tmp;
|
float64x2_t tmp;
|
||||||
tmp = vnegq_f64(in);
|
tmp = vnegq_f64(in);
|
||||||
@ -338,7 +338,7 @@ struct TimesMinusI{
|
|||||||
|
|
||||||
struct TimesI{
|
struct TimesI{
|
||||||
//Complex single
|
//Complex single
|
||||||
inline float32x4_t operator()(float32x4_t in){
|
inline float32x4_t operator()(float32x4_t in, float32x4_t ret){
|
||||||
// ar ai br bi -> -ai ar -bi br
|
// ar ai br bi -> -ai ar -bi br
|
||||||
float32x4_t r0, r1;
|
float32x4_t r0, r1;
|
||||||
r0 = vnegq_f32(in); // -ar -ai -br -bi
|
r0 = vnegq_f32(in); // -ar -ai -br -bi
|
||||||
@ -346,7 +346,7 @@ struct TimesI{
|
|||||||
return vtrn1q_f32(r1, in); // -ai ar -bi br
|
return vtrn1q_f32(r1, in); // -ai ar -bi br
|
||||||
}
|
}
|
||||||
//Complex double
|
//Complex double
|
||||||
inline float64x2_t operator()(float64x2_t in){
|
inline float64x2_t operator()(float64x2_t in, float64x2_t ret){
|
||||||
// a ib -> -b ia
|
// a ib -> -b ia
|
||||||
float64x2_t tmp;
|
float64x2_t tmp;
|
||||||
tmp = vnegq_f64(in);
|
tmp = vnegq_f64(in);
|
||||||
|
@ -434,7 +434,6 @@ public:
|
|||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
void CommunicateBegin(std::vector<std::vector<CommsRequest_t> > &reqs)
|
void CommunicateBegin(std::vector<std::vector<CommsRequest_t> > &reqs)
|
||||||
{
|
{
|
||||||
accelerator_barrier();
|
|
||||||
for(int i=0;i<Packets.size();i++){
|
for(int i=0;i<Packets.size();i++){
|
||||||
_grid->StencilSendToRecvFromBegin(MpiReqs,
|
_grid->StencilSendToRecvFromBegin(MpiReqs,
|
||||||
Packets[i].send_buf,
|
Packets[i].send_buf,
|
||||||
|
@ -458,8 +458,7 @@ inline void acceleratorCopySynchronise(void) { hipStreamSynchronize(copyStream);
|
|||||||
// Common on all GPU targets
|
// Common on all GPU targets
|
||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
#if defined(GRID_SYCL) || defined(GRID_CUDA) || defined(GRID_HIP)
|
#if defined(GRID_SYCL) || defined(GRID_CUDA) || defined(GRID_HIP)
|
||||||
// FIXME -- the non-blocking nature got broken March 30 2023 by PAB
|
#define accelerator_forNB( iter1, num1, nsimd, ... ) accelerator_for2dNB( iter1, num1, iter2, 1, nsimd, {__VA_ARGS__} );
|
||||||
#define accelerator_forNB( iter1, num1, nsimd, ... ) accelerator_for2dNB( iter1, num1, iter2, 1, nsimd, {__VA_ARGS__} );
|
|
||||||
|
|
||||||
#define accelerator_for( iter, num, nsimd, ... ) \
|
#define accelerator_for( iter, num, nsimd, ... ) \
|
||||||
accelerator_forNB(iter, num, nsimd, { __VA_ARGS__ } ); \
|
accelerator_forNB(iter, num, nsimd, { __VA_ARGS__ } ); \
|
||||||
@ -526,7 +525,7 @@ inline void acceleratorFreeCpu (void *ptr){free(ptr);};
|
|||||||
//////////////////////////////////////////////
|
//////////////////////////////////////////////
|
||||||
|
|
||||||
#ifdef GRID_SYCL
|
#ifdef GRID_SYCL
|
||||||
inline void acceleratorFenceComputeStream(void){ theGridAccelerator->submit_barrier();};
|
inline void acceleratorFenceComputeStream(void){ accelerator_barrier();};
|
||||||
#else
|
#else
|
||||||
// Ordering within a stream guaranteed on Nvidia & AMD
|
// Ordering within a stream guaranteed on Nvidia & AMD
|
||||||
inline void acceleratorFenceComputeStream(void){ };
|
inline void acceleratorFenceComputeStream(void){ };
|
||||||
|
@ -451,7 +451,7 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
#define MIXED_PRECISION
|
#define MIXED_PRECISION
|
||||||
#ifdef MIXED_PRECISION
|
#ifdef MIXED_PRECISION
|
||||||
std::vector<GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF> *> Bdys;
|
std::vector<GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy> *> Bdys;
|
||||||
#else
|
#else
|
||||||
std::vector<GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
|
std::vector<GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
|
||||||
#endif
|
#endif
|
||||||
@ -526,13 +526,15 @@ int main(int argc, char **argv) {
|
|||||||
Quotients.push_back (new TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],*MPCG[h],*ActionMPCG[h],CG));
|
Quotients.push_back (new TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],*MPCG[h],*ActionMPCG[h],CG));
|
||||||
} else {
|
} else {
|
||||||
#ifdef MIXED_PRECISION
|
#ifdef MIXED_PRECISION
|
||||||
Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF>(
|
Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy>(
|
||||||
*Numerators[h],*Denominators[h],
|
*Numerators[h],*Denominators[h],
|
||||||
*NumeratorsF[h],*DenominatorsF[h],
|
*NumeratorsF[h],*DenominatorsF[h],
|
||||||
|
*Numerators[h],*Denominators[h],
|
||||||
OFRp, SP_iters) );
|
OFRp, SP_iters) );
|
||||||
Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF>(
|
Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy>(
|
||||||
*Numerators[h],*Denominators[h],
|
*Numerators[h],*Denominators[h],
|
||||||
*NumeratorsF[h],*DenominatorsF[h],
|
*NumeratorsF[h],*DenominatorsF[h],
|
||||||
|
*Numerators[h],*Denominators[h],
|
||||||
OFRp, SP_iters) );
|
OFRp, SP_iters) );
|
||||||
#else
|
#else
|
||||||
Bdys.push_back( new GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],OFRp));
|
Bdys.push_back( new GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],OFRp));
|
||||||
|
@ -164,6 +164,11 @@ int main(int argc, char **argv) {
|
|||||||
typedef MobiusEOFAFermionF FermionEOFAActionF;
|
typedef MobiusEOFAFermionF FermionEOFAActionF;
|
||||||
typedef typename FermionActionF::FermionField FermionFieldF;
|
typedef typename FermionActionF::FermionField FermionFieldF;
|
||||||
|
|
||||||
|
typedef WilsonImplD2 FermionImplPolicyD2;
|
||||||
|
typedef MobiusFermionD2 FermionActionD2;
|
||||||
|
typedef MobiusEOFAFermionD2 FermionEOFAActionD2;
|
||||||
|
typedef typename FermionActionD2::FermionField FermionFieldD2;
|
||||||
|
|
||||||
typedef Grid::XmlReader Serialiser;
|
typedef Grid::XmlReader Serialiser;
|
||||||
|
|
||||||
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
@ -267,6 +272,7 @@ int main(int argc, char **argv) {
|
|||||||
// temporarily need a gauge field
|
// temporarily need a gauge field
|
||||||
LatticeGaugeFieldD U(GridPtr); U=Zero();
|
LatticeGaugeFieldD U(GridPtr); U=Zero();
|
||||||
LatticeGaugeFieldF UF(GridPtrF); UF=Zero();
|
LatticeGaugeFieldF UF(GridPtrF); UF=Zero();
|
||||||
|
LatticeGaugeFieldD2 UD2(GridPtrF); UD2=Zero();
|
||||||
|
|
||||||
std::cout << GridLogMessage << " Running the HMC "<< std::endl;
|
std::cout << GridLogMessage << " Running the HMC "<< std::endl;
|
||||||
TheHMC.ReadCommandLine(argc,argv); // params on CML or from param file
|
TheHMC.ReadCommandLine(argc,argv); // params on CML or from param file
|
||||||
@ -388,13 +394,15 @@ int main(int argc, char **argv) {
|
|||||||
std::vector<FermionAction *> Denominators;
|
std::vector<FermionAction *> Denominators;
|
||||||
std::vector<FermionActionF *> NumeratorsF;
|
std::vector<FermionActionF *> NumeratorsF;
|
||||||
std::vector<FermionActionF *> DenominatorsF;
|
std::vector<FermionActionF *> DenominatorsF;
|
||||||
|
std::vector<FermionActionD2 *> NumeratorsD2;
|
||||||
|
std::vector<FermionActionD2 *> DenominatorsD2;
|
||||||
std::vector<TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy> *> Quotients;
|
std::vector<TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy> *> Quotients;
|
||||||
std::vector<MxPCG *> ActionMPCG;
|
std::vector<MxPCG *> ActionMPCG;
|
||||||
std::vector<MxPCG *> MPCG;
|
std::vector<MxPCG *> MPCG;
|
||||||
|
|
||||||
#define MIXED_PRECISION
|
#define MIXED_PRECISION
|
||||||
#ifdef MIXED_PRECISION
|
#ifdef MIXED_PRECISION
|
||||||
std::vector<OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF> *> Bdys;
|
std::vector<OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicyD2> *> Bdys;
|
||||||
#else
|
#else
|
||||||
std::vector<OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
|
std::vector<OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
# Grid
|
# Grid [),branch:name:develop)/statusIcon.svg)](http://ci.cliath.ph.ed.ac.uk/project.html?projectId=GridBasedSoftware_Grid&tab=projectOverview)
|
||||||
**Data parallel C++ mathematical object library.**
|
|
||||||
|
|
||||||
[),branch:default:true)/statusIcon.svg)](https://ci.dev.dirac.ed.ac.uk/project/GridBasedSoftware_Grid?mode=builds)
|
**Data parallel C++ mathematical object library.**
|
||||||
|
|
||||||
License: GPL v2.
|
License: GPL v2.
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
CLIME=`spack find --paths c-lime@2-3-9 | grep c-lime| cut -c 15-`
|
CLIME=`spack find --paths c-lime@2-3-9 | grep c-lime| cut -c 15-`
|
||||||
../../configure --enable-comms=mpi-auto \
|
../../configure --enable-comms=mpi-auto \
|
||||||
--with-lime=$CLIME \
|
--with-lime=$CLIME \
|
||||||
--enable-unified=no \
|
--enable-unified=yes \
|
||||||
--enable-shm=nvlink \
|
--enable-shm=nvlink \
|
||||||
--enable-tracing=timer \
|
--enable-tracing=timer \
|
||||||
--enable-accelerator=hip \
|
--enable-accelerator=hip \
|
||||||
|
@ -5,8 +5,8 @@ module load emacs
|
|||||||
#module load gperftools
|
#module load gperftools
|
||||||
module load PrgEnv-gnu
|
module load PrgEnv-gnu
|
||||||
module load rocm/5.3.0
|
module load rocm/5.3.0
|
||||||
#module load cray-mpich/8.1.16
|
module load cray-mpich/8.1.16
|
||||||
module load cray-mpich/8.1.17
|
#module load cray-mpich/8.1.17
|
||||||
module load gmp
|
module load gmp
|
||||||
module load cray-fftw
|
module load cray-fftw
|
||||||
module load craype-accel-amd-gfx90a
|
module load craype-accel-amd-gfx90a
|
||||||
|
@ -53,7 +53,7 @@ static int readInt(int* argc, char*** argv, std::string&& option, int defaultVal
|
|||||||
|
|
||||||
static float readFloat(int* argc, char*** argv, std::string&& option, float defaultValue) {
|
static float readFloat(int* argc, char*** argv, std::string&& option, float defaultValue) {
|
||||||
std::string arg;
|
std::string arg;
|
||||||
double ret = defaultValue;
|
float ret = defaultValue;
|
||||||
if(checkPresent(argc, argv, option)) {
|
if(checkPresent(argc, argv, option)) {
|
||||||
arg = getContent(argc, argv, option);
|
arg = getContent(argc, argv, option);
|
||||||
GridCmdOptionFloat(arg, ret);
|
GridCmdOptionFloat(arg, ret);
|
||||||
|
244
tests/core/Test_fft_matt.cc
Normal file
244
tests/core/Test_fft_matt.cc
Normal file
@ -0,0 +1,244 @@
|
|||||||
|
/*************************************************************************************
|
||||||
|
|
||||||
|
Gamma::Algebra Gmu [] = {
|
||||||
|
Gamma::Algebra::GammaX,
|
||||||
|
Gamma::Algebra::GammaY,
|
||||||
|
Gamma::Algebra::GammaZ,
|
||||||
|
Gamma::Algebra::GammaT,
|
||||||
|
Gamma::Algebra::Gamma5
|
||||||
|
};
|
||||||
|
|
||||||
|
int main (int argc, char ** argv)
|
||||||
|
{
|
||||||
|
Grid_init(&argc,&argv);
|
||||||
|
|
||||||
|
int threads = GridThread::GetThreads();
|
||||||
|
std::cout<<GridLogMessage << "Grid is setup to use "<<threads<<" threads"<<std::endl;
|
||||||
|
|
||||||
|
Coordinate latt_size = GridDefaultLatt();
|
||||||
|
Coordinate simd_layout = GridDefaultSimd(Nd,vComplexD::Nsimd());
|
||||||
|
Coordinate mpi_layout = GridDefaultMpi();
|
||||||
|
|
||||||
|
int vol = 1;
|
||||||
|
for(int d=0;d<latt_size.size();d++){
|
||||||
|
vol = vol * latt_size[d];
|
||||||
|
}
|
||||||
|
GridCartesian GRID(latt_size,simd_layout,mpi_layout);
|
||||||
|
GridRedBlackCartesian RBGRID(&GRID);
|
||||||
|
|
||||||
|
LatticeComplexD coor(&GRID);
|
||||||
|
|
||||||
|
ComplexD ci(0.0,1.0);
|
||||||
|
|
||||||
|
std::vector<int> seeds({1,2,3,4});
|
||||||
|
GridSerialRNG sRNG; sRNG.SeedFixedIntegers(seeds); // naughty seeding
|
||||||
|
GridParallelRNG pRNG(&GRID);
|
||||||
|
pRNG.SeedFixedIntegers(seeds);
|
||||||
|
|
||||||
|
LatticeGaugeFieldD Umu(&GRID);
|
||||||
|
SU<Nc>::ColdConfiguration(pRNG,Umu); // Unit gauge
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
// Wilson test
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
{
|
||||||
|
LatticeFermionD src(&GRID); gaussian(pRNG,src);
|
||||||
|
LatticeFermionD src_p(&GRID);
|
||||||
|
LatticeFermionD tmp(&GRID);
|
||||||
|
LatticeFermionD ref(&GRID);
|
||||||
|
LatticeFermionD result(&GRID);
|
||||||
|
|
||||||
|
RealD mass=0.1;
|
||||||
|
WilsonFermionD Dw(Umu,GRID,RBGRID,mass);
|
||||||
|
|
||||||
|
Dw.M(src,ref);
|
||||||
|
std::cout << "Norm src "<<norm2(src)<<std::endl;
|
||||||
|
std::cout << "Norm Dw x src "<<norm2(ref)<<std::endl;
|
||||||
|
{
|
||||||
|
FFT theFFT(&GRID);
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// operator in Fourier space
|
||||||
|
////////////////
|
||||||
|
tmp =ref;
|
||||||
|
theFFT.FFT_all_dim(result,tmp,FFT::forward);
|
||||||
|
std::cout<<"FFT[ Dw x src ] "<< norm2(result)<<std::endl;
|
||||||
|
|
||||||
|
tmp = src;
|
||||||
|
theFFT.FFT_all_dim(src_p,tmp,FFT::forward);
|
||||||
|
std::cout<<"FFT[ src ] "<< norm2(src_p)<<std::endl;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
// work out the predicted FT from Fourier
|
||||||
|
/////////////////////////////////////////////////////////////////
|
||||||
|
auto FGrid = &GRID;
|
||||||
|
LatticeFermionD Kinetic(FGrid); Kinetic = Zero();
|
||||||
|
LatticeComplexD kmu(FGrid);
|
||||||
|
LatticeInteger scoor(FGrid);
|
||||||
|
LatticeComplexD sk (FGrid); sk = Zero();
|
||||||
|
LatticeComplexD sk2(FGrid); sk2= Zero();
|
||||||
|
LatticeComplexD W(FGrid); W= Zero();
|
||||||
|
LatticeComplexD one(FGrid); one =ComplexD(1.0,0.0);
|
||||||
|
ComplexD ci(0.0,1.0);
|
||||||
|
|
||||||
|
for(int mu=0;mu<Nd;mu++) {
|
||||||
|
|
||||||
|
RealD TwoPiL = M_PI * 2.0/ latt_size[mu];
|
||||||
|
|
||||||
|
LatticeCoordinate(kmu,mu);
|
||||||
|
|
||||||
|
kmu = TwoPiL * kmu;
|
||||||
|
|
||||||
|
sk2 = sk2 + 2.0*sin(kmu*0.5)*sin(kmu*0.5);
|
||||||
|
sk = sk + sin(kmu) *sin(kmu);
|
||||||
|
|
||||||
|
// -1/2 Dw -> 1/2 gmu (eip - emip) = i sinp gmu
|
||||||
|
Kinetic = Kinetic + sin(kmu)*ci*(Gamma(Gmu[mu])*src_p);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
W = mass + sk2;
|
||||||
|
Kinetic = Kinetic + W * src_p;
|
||||||
|
|
||||||
|
std::cout<<"Momentum space src "<< norm2(src_p)<<std::endl;
|
||||||
|
std::cout<<"Momentum space Dw x src "<< norm2(Kinetic)<<std::endl;
|
||||||
|
std::cout<<"FT[Coordinate space Dw] "<< norm2(result)<<std::endl;
|
||||||
|
|
||||||
|
result = result - Kinetic;
|
||||||
|
std::cout<<"diff "<< norm2(result)<<std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
std::cout << " =======================================" <<std::endl;
|
||||||
|
std::cout << " Checking FourierFreePropagator x Dw = 1" <<std::endl;
|
||||||
|
std::cout << " =======================================" <<std::endl;
|
||||||
|
std::cout << "Dw src = " <<norm2(src)<<std::endl;
|
||||||
|
std::cout << "Dw tmp = " <<norm2(tmp)<<std::endl;
|
||||||
|
Dw.M(src,tmp);
|
||||||
|
|
||||||
|
Dw.FreePropagator(tmp,ref,mass);
|
||||||
|
|
||||||
|
std::cout << "Dw ref = " <<norm2(ref)<<std::endl;
|
||||||
|
|
||||||
|
ref = ref - src;
|
||||||
|
|
||||||
|
std::cout << "Dw ref-src = " <<norm2(ref)<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
// Wilson prop
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
{
|
||||||
|
std::cout<<"****************************************"<<std::endl;
|
||||||
|
std::cout << "Wilson Mom space 4d propagator \n";
|
||||||
|
std::cout<<"****************************************"<<std::endl;
|
||||||
|
|
||||||
|
LatticeFermionD src(&GRID); gaussian(pRNG,src);
|
||||||
|
LatticeFermionD tmp(&GRID);
|
||||||
|
LatticeFermionD ref(&GRID);
|
||||||
|
LatticeFermionD diff(&GRID);
|
||||||
|
|
||||||
|
src=Zero();
|
||||||
|
Coordinate point(4,0); // 0,0,0,0
|
||||||
|
SpinColourVectorD ferm;
|
||||||
|
ferm=Zero();
|
||||||
|
ferm()(0)(0) = ComplexD(1.0);
|
||||||
|
pokeSite(ferm,src,point);
|
||||||
|
|
||||||
|
RealD mass=0.1;
|
||||||
|
|
||||||
|
WilsonFermionD Dw(Umu,GRID,RBGRID,mass);
|
||||||
|
|
||||||
|
// Momentum space prop
|
||||||
|
std::cout << " Solving by FFT and Feynman rules" <<std::endl;
|
||||||
|
Dw.FreePropagator(src,ref,mass) ;
|
||||||
|
|
||||||
|
Gamma G5(Gamma::Algebra::Gamma5);
|
||||||
|
|
||||||
|
LatticeFermionD result(&GRID);
|
||||||
|
const int sdir=0;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// Conjugate gradient on normal equations system
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
std::cout << " Solving by Conjugate Gradient (CGNE)" <<std::endl;
|
||||||
|
Dw.Mdag(src,tmp);
|
||||||
|
src=tmp;
|
||||||
|
MdagMLinearOperator<WilsonFermionD,LatticeFermionD> HermOp(Dw);
|
||||||
|
ConjugateGradient<LatticeFermionD> CG(1.0e-10,10000);
|
||||||
|
CG(HermOp,src,result);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
std::cout << " Taking difference" <<std::endl;
|
||||||
|
std::cout << "Dw result "<<norm2(result)<<std::endl;
|
||||||
|
std::cout << "Dw ref "<<norm2(ref)<<std::endl;
|
||||||
|
|
||||||
|
diff = ref - result;
|
||||||
|
std::cout << "result - ref "<<norm2(diff)<<std::endl;
|
||||||
|
|
||||||
|
DumpSliceNorm("Slice Norm Solution ",result,Nd-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
//Gauge invariance test
|
||||||
|
////////////////////////////////////////////////////
|
||||||
|
{
|
||||||
|
std::cout<<"****************************************"<<std::endl;
|
||||||
|
std::cout << "Gauge invariance test \n";
|
||||||
|
std::cout<<"****************************************"<<std::endl;
|
||||||
|
LatticeGaugeField U_GT(&GRID); // Gauge transformed field
|
||||||
|
LatticeColourMatrix g(&GRID); // local Gauge xform matrix
|
||||||
|
U_GT = Umu;
|
||||||
|
// Make a random xform to teh gauge field
|
||||||
|
SU<Nc>::RandomGaugeTransform(pRNG,U_GT,g); // Unit gauge
|
||||||
|
|
||||||
|
LatticeFermionD src(&GRID);
|
||||||
|
LatticeFermionD tmp(&GRID);
|
||||||
|
LatticeFermionD ref(&GRID);
|
||||||
|
LatticeFermionD diff(&GRID);
|
||||||
|
|
||||||
|
// could loop over colors
|
||||||
|
src=Zero();
|
||||||
|
Coordinate point(4,0); // 0,0,0,0
|
||||||
|
SpinColourVectorD ferm;
|
||||||
|
ferm=Zero();
|
||||||
|
ferm()(0)(0) = ComplexD(1.0);
|
||||||
|
pokeSite(ferm,src,point);
|
||||||
|
|
||||||
|
RealD mass=0.1;
|
||||||
|
WilsonFermionD Dw(U_GT,GRID,RBGRID,mass);
|
||||||
|
|
||||||
|
// Momentum space prop
|
||||||
|
std::cout << " Solving by FFT and Feynman rules" <<std::endl;
|
||||||
|
Dw.FreePropagator(src,ref,mass) ;
|
||||||
|
|
||||||
|
Gamma G5(Gamma::Algebra::Gamma5);
|
||||||
|
|
||||||
|
LatticeFermionD result(&GRID);
|
||||||
|
const int sdir=0;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// Conjugate gradient on normal equations system
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
std::cout << " Solving by Conjugate Gradient (CGNE)" <<std::endl;
|
||||||
|
Dw.Mdag(src,tmp);
|
||||||
|
src=tmp;
|
||||||
|
MdagMLinearOperator<WilsonFermionD,LatticeFermionD> HermOp(Dw);
|
||||||
|
ConjugateGradient<LatticeFermionD> CG(1.0e-10,10000);
|
||||||
|
CG(HermOp,src,result);
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
std::cout << " Taking difference" <<std::endl;
|
||||||
|
std::cout << "Dw result "<<norm2(result)<<std::endl;
|
||||||
|
std::cout << "Dw ref "<<norm2(ref)<<std::endl;
|
||||||
|
|
||||||
|
diff = ref - result;
|
||||||
|
std::cout << "result - ref "<<norm2(diff)<<std::endl;
|
||||||
|
|
||||||
|
DumpSliceNorm("Slice Norm Solution ",result,Nd-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Grid_finalize();
|
||||||
|
}
|
Reference in New Issue
Block a user