CHROMA
central_tprec_logdet_tt_monomial_w.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 /*! \file
3  * \brief Even-odd preconditioned log(det(A_ee))
4  */
5 
6 #ifndef __central_tprec_logdet_tt_monomial_h__
7 #define __central_tprec_logdet_tt_monomial_h__
8 
9 #include "qdp_config.h"
10 
11 #if QDP_NS == 4
12 #if QDP_NC == 3
13 #if QDP_ND == 4
14 
19 #include "io/xmllog_io.h"
20 
21 
22 namespace Chroma
23 {
24 
25  //! A Monomial For Just the EvenEven part of EvenOddPrecLogDetWilsonTypeFermActs
26  /*! @ingroup monomial
27  *
28  * Monomial is expected to be the same for these fermacts
29  */
30  template<typename P, typename Q, typename Phi>
31  class CentralTimePrecLogDetTTMonomial : public ExactMonomial<P,Q>
32  {
33  public:
34  virtual ~CentralTimePrecLogDetTTMonomial() {}
35 
36  void dsdq(P& F, const AbsFieldState<P,Q>& s)
37  {
38  START_CODE();
39 
40  XMLWriter& xml_out = TheXMLLogWriter::Instance();
41  push(xml_out, "CentralTimePrecLogDetTTMonomial");
42 
43  // Create FermAct
44  const CentralTimePrecFermAct<Phi,P,Q>& FA = getFermAct();
45 
46  // Create a state for linop
47  Handle< FermState<Phi,P,Q> > state(FA.createState(s.getQ()));
48 
49  //Create LinOp
50  Handle< CentralTimePrecLinearOperator<Phi,P,Q> > lin(FA.linOp(state));
51 
52  lin->derivLogDetTDagT(F, PLUS);
53  F[lin->tDir()] *= Real(getNumFlavors());
54 
55  state->deriv(F);
56 
57  monitorForces(xml_out, "Forces", F);
58  pop(xml_out);
59 
60  END_CODE();
61  }
62 
63 
64  //! Gauge action value
65  Double S(const AbsFieldState<P,Q>& s)
66  {
67  START_CODE();
68 
69  XMLWriter& xml_out = TheXMLLogWriter::Instance();
70 
71  push(xml_out, "CentralTimePrecLogDetTTMonomial");
72  const CentralTimePrecFermAct<Phi,P,Q>& FA = getFermAct();
73  Handle< FermState<Phi,P,Q> > bc_g_state = FA.createState(s.getQ());
74 
75  // Need way to get gauge state from AbsFieldState<P,Q>
76  Handle< CentralTimePrecLinearOperator<Phi,P,Q> > lin(FA.linOp(bc_g_state));
77 
78  Double S_ee =(Double(-2*getNumFlavors())*lin->logDetTDagT());
79  write(xml_out, "S", S_ee);
80  pop(xml_out);
81 
82  END_CODE();
83 
84  return S_ee;
85  }
86 
87 
88  void refreshInternalFields(const AbsFieldState<multi1d<LatticeColorMatrix>,
89  multi1d<LatticeColorMatrix> >& s) {
90  //No internal fields to refresh => Nop
91  }
92 
93  void setInternalFields(const Monomial<multi1d<LatticeColorMatrix>,
94  multi1d<LatticeColorMatrix> >& m) {
95  // No internal fields to refresh => Nop
96  }
97 
98  protected:
99  virtual const CentralTimePrecFermAct<Phi,P,Q>& getFermAct() const = 0;
100  virtual int getNumFlavors() const = 0;
101  };
102 
103 
104  /*! @ingroup monomial */
105  namespace CentralTimePrecLogDetTTMonomial4DEnv
106  {
107  bool registerAll();
108  }
109 
110  // Parameter structure
111  /*! @ingroup monomial */
112  struct CentralTimePrecLogDetTTMonomialParams
113  {
114  // Base Constructor
115  CentralTimePrecLogDetTTMonomialParams();
116 
117  // Read monomial from some root path
118  CentralTimePrecLogDetTTMonomialParams(XMLReader& in, const std::string& path);
119  GroupXML_t fermact;
120  int num_flavors;
121  };
122 
123  /*! @ingroup monomial */
124  void read(XMLReader& r, const std::string& path, CentralTimePrecLogDetTTMonomialParams& p);
125 
126  /*! @ingroup monomial */
127  void write(XMLWriter& xml, const std::string& path, const CentralTimePrecLogDetTTMonomialParams& p);
128 
129 
130  //! A Monomial For Just the EvenEven part of EvenOddPrecLogDetWilsonTypeFermActs -- concretely a 4D one
131  /*! @ingroup monomial
132  *
133  * Monomial is expected to be the same for these fermacts
134  */
135  class CentralTimePrecLogDetTTMonomial4D :
136  public CentralTimePrecLogDetTTMonomial<multi1d<LatticeColorMatrix>,
137  multi1d<LatticeColorMatrix>,
138  LatticeFermion>
139  {
140  public:
141  // Typedefs to save typing
142  typedef LatticeFermion T;
143  typedef multi1d<LatticeColorMatrix> P;
144  typedef multi1d<LatticeColorMatrix> Q;
145 
146  //! Construct from param struct
147  CentralTimePrecLogDetTTMonomial4D(const CentralTimePrecLogDetTTMonomialParams& p);
148 
149  //! Copy Constructor
150  CentralTimePrecLogDetTTMonomial4D(const CentralTimePrecLogDetTTMonomial4D& m) : num_flavors(m.num_flavors), fermact(m.fermact) {}
151 
152  //! Destructor is automagic
153  ~CentralTimePrecLogDetTTMonomial4D() {}
154 
155 
156  protected:
157  const CentralTimePrecFermAct<T,P,Q> & getFermAct(void) const {
158  return *fermact;
159  }
160 
161  int getNumFlavors() const {
162  return num_flavors;
163  }
164 
165  private:
166  int num_flavors;
167  Handle< CentralTimePrecFermAct<T,P,Q> > fermact;
168  };
169 
170 } //end namespace chroma
171 
172 #endif
173 #endif
174 #endif
175 
176 #endif
Monomials - gauge action or fermion binlinear contributions for HMC.
static T & Instance()
Definition: singleton.h:432
Field state.
Helper function for calculating forces.
void read(XMLReader &xml, const std::string &path, AsqtadFermActParams &param)
Read parameters.
void write(XMLWriter &xml, const std::string &path, const AsqtadFermActParams &param)
Writer parameters.
void monitorForces(XMLWriter &xml_out, const std::string &path, const multi1d< LatticeColorMatrix > &F)
Calculate and write out forces.
static int m[4]
Definition: make_seeds.cc:16
bool registerAll()
Register all the factories.
multi1d< LatticeColorMatrix > P
Asqtad Staggered-Dirac operator.
Definition: klein_gord.cc:10
LinOpSysSolverMGProtoClover::Q Q
push(xml_out,"Condensates")
LinOpSysSolverMGProtoClover::T T
@ PLUS
Definition: chromabase.h:45
pop(xml_out)
START_CODE()
const WilsonTypeFermAct< multi1d< LatticeFermion > > Handle< const ConnectState > state
Definition: pbg5p_w.cc:28
static QDP_ColorVector * in
multi1d< LatticeFermion > s(Ncb)
FloatingPoint< double > Double
Definition: gtest.h:7351
::std::string string
Definition: gtest.h:1979
multi1d< LatticeColorMatrix > P
Definition: t_clover.cc:13
Singleton instances of xml output.
static INTERNAL_PRECISION F