JDFTx  1.2.0
FluidSolver.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------
2 Copyright 2011 Ravishankar Sundararaman, Kendra Letchworth Weaver, Deniz Gunceler
3 
4 This file is part of JDFTx.
5 
6 JDFTx is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10 
11 JDFTx is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15 
16 You should have received a copy of the GNU General Public License
17 along with JDFTx. If not, see <http://www.gnu.org/licenses/>.
18 -------------------------------------------------------------------*/
19 
20 #ifndef JDFTX_ELECTRONIC_FLUIDSOLVER_H
21 #define JDFTX_ELECTRONIC_FLUIDSOLVER_H
22 
25 
26 #include <core/ScalarField.h>
28 #include <electronic/IonicMinimizer.h>
29 
32 {
33  const Everything& e;
34  const GridInfo& gInfo; //relevant gInfo for fluid (uses embedded grid when coulomb truncation is enabled)
35  const FluidSolverParams& fsp;
36  double epsBulk, epsInf;
37  double k2factor;
38  std::vector<std::vector< vector3<> > > atpos;
39 
41  FluidSolver(const Everything &e, const FluidSolverParams& fsp);
42  virtual ~FluidSolver() {}
43 
44  double ionWidthMuCorrection() const;
45 
46  //Whether a gummel loop is in use
47  inline bool useGummel() const
48  { switch(fsp.solveFrequency)
49  { case FluidFreqGummel: return true;
50  case FluidFreqInner: return false;
51  default: return prefersGummel(); //pick by fluid type
52  }
53  }
54 
58  void set(const ScalarFieldTilde& rhoExplicitTilde, const ScalarFieldTilde& nCavityTilde);
59 
64  double get_Adiel_and_grad(ScalarFieldTilde* Adiel_rhoExplicitTilde=0, ScalarFieldTilde* Adiel_nCavityTilde=0, IonicGradient* extraForces=0, bool electricOnly=false) const;
65 
66  virtual double bulkPotential() {return 0.0;}
67 
71  virtual void dumpDensities(const char* filenamePattern) const {};
72 
76  virtual void dumpDebug(const char* filenamePattern) const {};
77 
78  //------------Fluid solver implementations must provide these pure virtual functions
79 
81  virtual bool prefersGummel() const=0;
82 
84  virtual void loadState(const char* filename)=0;
85 
87  virtual void saveState(const char* filename) const=0;
88 
90  virtual void minimizeFluid()=0;
91 
92 protected:
94  virtual void set_internal(const ScalarFieldTilde& rhoExplicitTilde, const ScalarFieldTilde& nCavityTilde)=0;
95 
97  virtual double get_Adiel_and_grad_internal(ScalarFieldTilde& Adiel_rhoExplicitTilde, ScalarFieldTilde& Adiel_nCavityTilde, IonicGradient* extraForces, bool electricOnly) const =0;
98 };
99 
102 
103 #endif // JDFTX_ELECTRONIC_FLUIDSOLVER_H
Simulation grid descriptor.
Definition: GridInfo.h:45
Solve fluid every electronic step.
Definition: FluidSolverParams.h:41
std::shared_ptr< ScalarFieldTildeData > ScalarFieldTilde
A smart reference-counting pointer to ScalarFieldTildeData.
Definition: ScalarField.h:45
double ionWidthMuCorrection() const
correction to electron chemical potential due to finite ion width in fluid interaction ...
virtual void saveState(const char *filename) const =0
Save fluid state to a file.
Real and complex scalar fields in real and reciprocal space.
Use a Gummel iteration.
Definition: FluidSolverParams.h:42
Abstract base class for the fluid solvers.
Definition: FluidSolver.h:31
virtual void loadState(const char *filename)=0
Initialize fluid state from a file.
virtual void minimizeFluid()=0
Minimize fluid side (holding explicit electronic system fixed)
virtual bool prefersGummel() const =0
Specify whether fluid prefers a gummel loop (true) or is minimized each time (false) ...
Definition: Everything.h:41
FluidSolver * createFluidSolver(const Everything &e, const FluidSolverParams &params)
Create and return a JDFTx solver (the solver can be freed using delete)
double k2factor
prefactor to screening term (0 => no ionic screening)
Definition: FluidSolver.h:37
FluidSolver(const Everything &e, const FluidSolverParams &fsp)
atomic positions per species in the relevant coordinate system (depending on embedding option) ...
double get_Adiel_and_grad(ScalarFieldTilde *Adiel_rhoExplicitTilde=0, ScalarFieldTilde *Adiel_nCavityTilde=0, IonicGradient *extraForces=0, bool electricOnly=false) const
virtual void set_internal(const ScalarFieldTilde &rhoExplicitTilde, const ScalarFieldTilde &nCavityTilde)=0
Fluid-dependent implementation of set()
virtual void dumpDensities(const char *filenamePattern) const
Definition: FluidSolver.h:71
virtual void dumpDebug(const char *filenamePattern) const
Definition: FluidSolver.h:76
Extra parameters for fluids:
Definition: FluidSolverParams.h:93
double epsInf
bulk dielectric constants of fluid
Definition: FluidSolver.h:36
virtual double get_Adiel_and_grad_internal(ScalarFieldTilde &Adiel_rhoExplicitTilde, ScalarFieldTilde &Adiel_nCavityTilde, IonicGradient *extraForces, bool electricOnly) const =0
Fluid-dependent implementation of get_Adiel_and_grad()
Object to hold all the forces.
Definition: IonicMinimizer.h:31