mirror of
				https://github.com/paboyle/Grid.git
				synced 2025-11-03 21:44:33 +00:00 
			
		
		
		
	Dirichlet improvements that I failed to commit
This commit is contained in:
		@@ -38,19 +38,15 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
    // cf. GeneralEvenOddRational.h for details
 | 
			
		||||
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////
 | 
			
		||||
      
 | 
			
		||||
    template<class ImplD, class ImplF, class ImplD2>
 | 
			
		||||
    template<class ImplD, class ImplF>
 | 
			
		||||
    class GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction : public GeneralEvenOddRatioRationalPseudoFermionAction<ImplD> {
 | 
			
		||||
    private:
 | 
			
		||||
      typedef typename ImplD2::FermionField FermionFieldD2;
 | 
			
		||||
      typedef typename ImplD::FermionField FermionFieldD;
 | 
			
		||||
      typedef typename ImplF::FermionField FermionFieldF;
 | 
			
		||||
 | 
			
		||||
      FermionOperator<ImplD> & NumOpD;
 | 
			
		||||
      FermionOperator<ImplD> & DenOpD;
 | 
			
		||||
 | 
			
		||||
      FermionOperator<ImplD2> & NumOpD2;
 | 
			
		||||
      FermionOperator<ImplD2> & DenOpD2;
 | 
			
		||||
     
 | 
			
		||||
      FermionOperator<ImplF> & NumOpF;
 | 
			
		||||
      FermionOperator<ImplF> & DenOpF;
 | 
			
		||||
 | 
			
		||||
@@ -64,40 +60,31 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
	ConjugateGradientMultiShift<FermionFieldD> msCG(MaxIter, approx);
 | 
			
		||||
	msCG(schurOp,in, out);
 | 
			
		||||
#else
 | 
			
		||||
	SchurDifferentiableOperator<ImplD2> schurOpD2(numerator ? NumOpD2 : DenOpD2);
 | 
			
		||||
	SchurDifferentiableOperator<ImplD> schurOpD(numerator ? NumOpD : DenOpD);
 | 
			
		||||
	SchurDifferentiableOperator<ImplF> schurOpF(numerator ? NumOpF : DenOpF);
 | 
			
		||||
	FermionFieldD2 inD2(NumOpD2.FermionRedBlackGrid());
 | 
			
		||||
	FermionFieldD2 outD2(NumOpD2.FermionRedBlackGrid());
 | 
			
		||||
	FermionFieldD inD(NumOpD.FermionRedBlackGrid());
 | 
			
		||||
	FermionFieldD outD(NumOpD.FermionRedBlackGrid());
 | 
			
		||||
 | 
			
		||||
	// Action better with higher precision?
 | 
			
		||||
	ConjugateGradientMultiShiftMixedPrec<FermionFieldD2, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
 | 
			
		||||
	precisionChange(inD2,in);
 | 
			
		||||
	std::cout << "msCG single solve "<<norm2(inD2)<<" " <<norm2(in)<<std::endl;
 | 
			
		||||
	msCG(schurOpD2, inD2, outD2);
 | 
			
		||||
	precisionChange(out,outD2);
 | 
			
		||||
	ConjugateGradientMultiShiftMixedPrec<FermionFieldD, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
 | 
			
		||||
	msCG(schurOpD, in, out);
 | 
			
		||||
#endif
 | 
			
		||||
      }
 | 
			
		||||
      virtual void multiShiftInverse(bool numerator, const MultiShiftFunction &approx, const Integer MaxIter, const FermionFieldD &in, std::vector<FermionFieldD> &out_elems, FermionFieldD &out){
 | 
			
		||||
	SchurDifferentiableOperator<ImplD2> schurOpD2(numerator ? NumOpD2 : DenOpD2);
 | 
			
		||||
	SchurDifferentiableOperator<ImplD> schurOpD(numerator ? NumOpD : DenOpD);
 | 
			
		||||
	SchurDifferentiableOperator<ImplF>  schurOpF (numerator ? NumOpF  : DenOpF);
 | 
			
		||||
 | 
			
		||||
	FermionFieldD2 inD2(NumOpD2.FermionRedBlackGrid());
 | 
			
		||||
	FermionFieldD2 outD2(NumOpD2.FermionRedBlackGrid());
 | 
			
		||||
	std::vector<FermionFieldD2> out_elemsD2(out_elems.size(),NumOpD2.FermionRedBlackGrid());
 | 
			
		||||
	ConjugateGradientMultiShiftMixedPrecCleanup<FermionFieldD2, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
 | 
			
		||||
	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]);
 | 
			
		||||
	}
 | 
			
		||||
	FermionFieldD inD(NumOpD.FermionRedBlackGrid());
 | 
			
		||||
	FermionFieldD outD(NumOpD.FermionRedBlackGrid());
 | 
			
		||||
	std::vector<FermionFieldD> out_elemsD(out_elems.size(),NumOpD.FermionRedBlackGrid());
 | 
			
		||||
	ConjugateGradientMultiShiftMixedPrecCleanup<FermionFieldD, FermionFieldF> msCG(MaxIter, approx, NumOpF.FermionRedBlackGrid(), schurOpF, ReliableUpdateFreq);
 | 
			
		||||
	msCG(schurOpD, in, out_elems, out);
 | 
			
		||||
      }
 | 
			
		||||
      //Allow derived classes to override the gauge import
 | 
			
		||||
      virtual void ImportGauge(const typename ImplD::GaugeField &Ud){
 | 
			
		||||
 | 
			
		||||
	typename ImplF::GaugeField Uf(NumOpF.GaugeGrid());
 | 
			
		||||
	typename ImplD2::GaugeField Ud2(NumOpD2.GaugeGrid());
 | 
			
		||||
	typename ImplD::GaugeField Ud2(NumOpD.GaugeGrid());
 | 
			
		||||
	precisionChange(Uf, Ud);
 | 
			
		||||
	precisionChange(Ud2, Ud);
 | 
			
		||||
 | 
			
		||||
@@ -109,20 +96,18 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
	NumOpF.ImportGauge(Uf);
 | 
			
		||||
	DenOpF.ImportGauge(Uf);
 | 
			
		||||
 | 
			
		||||
	NumOpD2.ImportGauge(Ud2);
 | 
			
		||||
	DenOpD2.ImportGauge(Ud2);
 | 
			
		||||
	NumOpD.ImportGauge(Ud2);
 | 
			
		||||
	DenOpD.ImportGauge(Ud2);
 | 
			
		||||
      }
 | 
			
		||||
      
 | 
			
		||||
    public:
 | 
			
		||||
      GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction(FermionOperator<ImplD>  &_NumOpD, FermionOperator<ImplD>  &_DenOpD, 
 | 
			
		||||
							      FermionOperator<ImplF>  &_NumOpF, FermionOperator<ImplF>  &_DenOpF, 
 | 
			
		||||
							      FermionOperator<ImplD2>  &_NumOpD2, FermionOperator<ImplD2>  &_DenOpD2, 
 | 
			
		||||
							      const RationalActionParams & p, Integer _ReliableUpdateFreq
 | 
			
		||||
							      ) : GeneralEvenOddRatioRationalPseudoFermionAction<ImplD>(_NumOpD, _DenOpD, p),
 | 
			
		||||
								  ReliableUpdateFreq(_ReliableUpdateFreq),
 | 
			
		||||
								  NumOpD(_NumOpD), DenOpD(_DenOpD),
 | 
			
		||||
								  NumOpF(_NumOpF), DenOpF(_DenOpF),
 | 
			
		||||
								  NumOpD2(_NumOpD2), DenOpD2(_DenOpD2)
 | 
			
		||||
								  NumOpF(_NumOpF), DenOpF(_DenOpF)
 | 
			
		||||
      {}
 | 
			
		||||
      
 | 
			
		||||
      virtual std::string action_name(){return "GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction";}
 | 
			
		||||
 
 | 
			
		||||
@@ -67,9 +67,9 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
      virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}      
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    template<class Impl,class ImplF,class ImplD2>
 | 
			
		||||
    template<class Impl,class ImplF>
 | 
			
		||||
    class OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction
 | 
			
		||||
      : public GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF,ImplD2> {
 | 
			
		||||
      : public GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF> {
 | 
			
		||||
    public:
 | 
			
		||||
      typedef OneFlavourRationalParams Params;
 | 
			
		||||
    private:
 | 
			
		||||
@@ -91,11 +91,9 @@ NAMESPACE_BEGIN(Grid);
 | 
			
		||||
								 FermionOperator<Impl>  &_DenOp, 
 | 
			
		||||
								 FermionOperator<ImplF>  &_NumOpF, 
 | 
			
		||||
								 FermionOperator<ImplF>  &_DenOpF, 
 | 
			
		||||
								 FermionOperator<ImplD2>  &_NumOpD2, 
 | 
			
		||||
								 FermionOperator<ImplD2>  &_DenOpD2, 
 | 
			
		||||
								 const Params & p, Integer ReliableUpdateFreq
 | 
			
		||||
							) : 
 | 
			
		||||
	GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF,ImplD2>(_NumOp, _DenOp,_NumOpF, _DenOpF,_NumOpD2, _DenOpD2, transcribe(p),ReliableUpdateFreq){}
 | 
			
		||||
	GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<Impl,ImplF>(_NumOp, _DenOp,_NumOpF, _DenOpF, transcribe(p),ReliableUpdateFreq){}
 | 
			
		||||
 | 
			
		||||
      virtual std::string action_name(){return "OneFlavourEvenOddRatioRationalPseudoFermionAction";}      
 | 
			
		||||
    };
 | 
			
		||||
 
 | 
			
		||||
@@ -451,7 +451,7 @@ int main(int argc, char **argv) {
 | 
			
		||||
  
 | 
			
		||||
#define MIXED_PRECISION
 | 
			
		||||
#ifdef MIXED_PRECISION
 | 
			
		||||
  std::vector<GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy> *> Bdys;
 | 
			
		||||
  std::vector<GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF> *> Bdys;
 | 
			
		||||
#else
 | 
			
		||||
  std::vector<GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
 | 
			
		||||
#endif
 | 
			
		||||
@@ -526,15 +526,13 @@ int main(int argc, char **argv) {
 | 
			
		||||
      Quotients.push_back (new TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],*MPCG[h],*ActionMPCG[h],CG));
 | 
			
		||||
    } else {
 | 
			
		||||
#ifdef MIXED_PRECISION
 | 
			
		||||
      Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy>(
 | 
			
		||||
      Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF>(
 | 
			
		||||
			   *Numerators[h],*Denominators[h],
 | 
			
		||||
			   *NumeratorsF[h],*DenominatorsF[h],
 | 
			
		||||
			   *Numerators[h],*Denominators[h],
 | 
			
		||||
			   OFRp, SP_iters) );
 | 
			
		||||
      Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicy>(
 | 
			
		||||
      Bdys.push_back( new GeneralEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF>(
 | 
			
		||||
			   *Numerators[h],*Denominators[h],
 | 
			
		||||
			   *NumeratorsF[h],*DenominatorsF[h],
 | 
			
		||||
			   *Numerators[h],*Denominators[h],
 | 
			
		||||
			   OFRp, SP_iters) );
 | 
			
		||||
#else
 | 
			
		||||
      Bdys.push_back( new GeneralEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy>(*Numerators[h],*Denominators[h],OFRp));
 | 
			
		||||
 
 | 
			
		||||
@@ -164,11 +164,6 @@ int main(int argc, char **argv) {
 | 
			
		||||
  typedef MobiusEOFAFermionF FermionEOFAActionF;
 | 
			
		||||
  typedef typename FermionActionF::FermionField FermionFieldF;
 | 
			
		||||
 | 
			
		||||
  typedef WilsonImplD2 FermionImplPolicyD2;
 | 
			
		||||
  typedef MobiusFermionD2 FermionActionD2;
 | 
			
		||||
  typedef MobiusEOFAFermionD2 FermionEOFAActionD2;
 | 
			
		||||
  typedef typename FermionActionD2::FermionField FermionFieldD2;
 | 
			
		||||
 | 
			
		||||
  typedef Grid::XmlReader       Serialiser;
 | 
			
		||||
 | 
			
		||||
  //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 | 
			
		||||
@@ -272,7 +267,6 @@ int main(int argc, char **argv) {
 | 
			
		||||
  // temporarily need a gauge field
 | 
			
		||||
  LatticeGaugeFieldD  U(GridPtr); U=Zero();
 | 
			
		||||
  LatticeGaugeFieldF  UF(GridPtrF); UF=Zero();
 | 
			
		||||
  LatticeGaugeFieldD2 UD2(GridPtrF); UD2=Zero();
 | 
			
		||||
 | 
			
		||||
  std::cout << GridLogMessage << " Running the HMC "<< std::endl;
 | 
			
		||||
  TheHMC.ReadCommandLine(argc,argv);  // params on CML or from param file
 | 
			
		||||
@@ -394,15 +388,13 @@ int main(int argc, char **argv) {
 | 
			
		||||
  std::vector<FermionAction *> Denominators;
 | 
			
		||||
  std::vector<FermionActionF *> NumeratorsF;
 | 
			
		||||
  std::vector<FermionActionF *> DenominatorsF;
 | 
			
		||||
  std::vector<FermionActionD2 *> NumeratorsD2;
 | 
			
		||||
  std::vector<FermionActionD2 *> DenominatorsD2;
 | 
			
		||||
  std::vector<TwoFlavourEvenOddRatioPseudoFermionAction<FermionImplPolicy> *> Quotients;
 | 
			
		||||
  std::vector<MxPCG *> ActionMPCG;
 | 
			
		||||
  std::vector<MxPCG *> MPCG;
 | 
			
		||||
  
 | 
			
		||||
#define MIXED_PRECISION
 | 
			
		||||
#ifdef MIXED_PRECISION
 | 
			
		||||
  std::vector<OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF,FermionImplPolicyD2> *> Bdys;
 | 
			
		||||
  std::vector<OneFlavourEvenOddRatioRationalMixedPrecPseudoFermionAction<FermionImplPolicy,FermionImplPolicyF> *> Bdys;
 | 
			
		||||
#else
 | 
			
		||||
  std::vector<OneFlavourEvenOddRatioRationalPseudoFermionAction<FermionImplPolicy> *> Bdys;
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,8 @@ module load emacs
 | 
			
		||||
#module load gperftools
 | 
			
		||||
module load PrgEnv-gnu
 | 
			
		||||
module load rocm/5.3.0
 | 
			
		||||
module load cray-mpich/8.1.16
 | 
			
		||||
#module load cray-mpich/8.1.17
 | 
			
		||||
#module load cray-mpich/8.1.16
 | 
			
		||||
module load cray-mpich/8.1.17
 | 
			
		||||
module load gmp
 | 
			
		||||
module load cray-fftw
 | 
			
		||||
module load craype-accel-amd-gfx90a
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user