1
0
mirror of https://github.com/paboyle/Grid.git synced 2025-06-19 08:17:05 +01:00

2f Mixed precision DDHMC running and conserving hamiltonian

This commit is contained in:
Quadro
2021-05-27 17:10:04 -04:00
parent 2e4d4625b6
commit e4ff4c902a
6 changed files with 600 additions and 25 deletions

View File

@ -62,6 +62,7 @@ NAMESPACE_BEGIN(Grid);
// - The Dirichlet ops can be passed to dOmega(Bar) solvers etc...
//
////////////////////////////////////////////////////////
template<class Impl>
class SchurFactoredFermionOperator : public Impl
{
@ -71,17 +72,26 @@ public:
FermionOperator<Impl> & DirichletFermOp;
FermionOperator<Impl> & FermOp;
OperatorFunction<FermionField> &Solver;
OperatorFunction<FermionField> &OmegaSolver;
OperatorFunction<FermionField> &OmegaDagSolver;
OperatorFunction<FermionField> &DSolver;
OperatorFunction<FermionField> &DdagSolver;
Coordinate Block;
SchurFactoredFermionOperator(FermionOperator<Impl> & _FermOp,
FermionOperator<Impl> & _DirichletFermOp,
OperatorFunction<FermionField> &_Solver,
OperatorFunction<FermionField> &_OmegaSolver,
OperatorFunction<FermionField> &_OmegaDagSolver,
OperatorFunction<FermionField> &_DSolver,
OperatorFunction<FermionField> &_DdagSolver,
Coordinate &_Block)
: Block(_Block),
FermOp(_FermOp),
DirichletFermOp(_DirichletFermOp),
Solver(_Solver)
OmegaSolver(_OmegaSolver),
OmegaDagSolver(_OmegaDagSolver),
DSolver(_DSolver),
DdagSolver(_DdagSolver)
{
// Pass in Dirichlet FermOp because we really need two dirac operators
// as double stored gauge fields differ and they will otherwise overwrite
@ -274,12 +284,12 @@ public:
};
void dOmegaInvAndOmegaBarInv(FermionField &in,FermionField &out)
{
SchurRedBlackDiagMooeeSolve<FermionField> PrecSolve(Solver);
SchurRedBlackDiagMooeeSolve<FermionField> PrecSolve(OmegaSolver);
PrecSolve(DirichletFermOp,in,out);
};
void dOmegaDagInvAndOmegaBarDagInv(FermionField &in,FermionField &out)
{
SchurRedBlackDiagMooeeDagSolve<FermionField> PrecSolve(Solver);
SchurRedBlackDiagMooeeDagSolve<FermionField> PrecSolve(OmegaDagSolver);
PrecSolve(DirichletFermOp,in,out);
};
@ -335,12 +345,12 @@ public:
// Non-dirichlet inverter using red-black preconditioning
void Dinverse(FermionField &in,FermionField &out)
{
SchurRedBlackDiagMooeeSolve<FermionField> Solve(Solver);
SchurRedBlackDiagMooeeSolve<FermionField> Solve(DSolver);
Solve(FermOp,in,out);
}
void DinverseDag(FermionField &in,FermionField &out)
{
SchurRedBlackDiagMooeeDagSolve<FermionField> Solve(Solver);
SchurRedBlackDiagMooeeDagSolve<FermionField> Solve(DdagSolver);
Solve(FermOp,in,out);
}
};

View File

@ -36,7 +36,7 @@ NAMESPACE_BEGIN(Grid);
template<typename MomentaField>
struct MomentumFilterBase{
virtual void applyFilter(MomentaField &P) const;
virtual void applyFilter(MomentaField &P) const = 0;
};
//Do nothing

View File

@ -41,22 +41,21 @@ private:
SchurFactoredFermionOperator<Impl> & NumOp;// the basic operator
SchurFactoredFermionOperator<Impl> & DenOp;// the basic operator
OperatorFunction<FermionField> &DerivativeSolver;
OperatorFunction<FermionField> &ActionSolver;
// OperatorFunction<FermionField> &DerivativeSolver;
// OperatorFunction<FermionField> &ActionSolver;
FermionField Phi; // the pseudo fermion field for this trajectory
public:
DomainDecomposedBoundaryTwoFlavourRatioPseudoFermion(SchurFactoredFermionOperator<Impl> &_NumOp,
SchurFactoredFermionOperator<Impl> &_DenOp,
OperatorFunction<FermionField> & DS,
OperatorFunction<FermionField> & AS
) : NumOp(_NumOp), DenOp(_DenOp),
DerivativeSolver(DS), ActionSolver(AS),
SchurFactoredFermionOperator<Impl> &_DenOp
// OperatorFunction<FermionField> & AS,
// OperatorFunction<FermionField> & DS
) : NumOp(_NumOp), DenOp(_DenOp),
// DerivativeSolver(DS), ActionSolver(AS),
Phi(_NumOp.FermOp.FermionGrid()) {};
virtual std::string action_name(){return "DomainDecomposedBoundaryTwoFlavourRatioPseudoFermion";}
virtual std::string LogParameters(){
std::stringstream sstream;