1
#ifndef SCHRODINGER_SOLVER_H
2
#define SCHRODINGER_SOLVER_H
6
#include "LinearSolver.h"
15
// Forward class declarations
18
class PrescribedDataManager;
23
* @class SchrodingerSolver
24
* @brief a class to solve the (time-independent) Schrodinger equation
26
class SchrodingerSolver {
32
const FieldName fieldName,
33
const PhysicsModel * physicsModel,
34
const FE_Engine * feEngine,
35
const PrescribedDataManager * prescribedDataMgr,
36
/*const*/ ATC_Coupling * atc,
37
const int solverType = ATC::LinearSolver::DIRECT_SOLVE,
42
virtual ~SchrodingerSolver();
45
bool modify(int narg, char **arg){ return false;}
48
void initialize(void);
51
virtual bool solve(FIELDS & fields);
61
/** Pointer to FE_Engine */
62
const FE_Engine * feEngine_;
64
/** Pointer to PrescribedDataManager */
65
const PrescribedDataManager * prescribedDataMgr_;
67
/** Pointer to FE_Engine */
68
const PhysicsModel * physicsModel_;
70
/** field to solve for */
74
LinearSolver * solver_;
77
/** number of nodes */
80
/** stiffness matrix */
82
//SPAR_MAT stiffness_;
84
//SPAR_MAT massMatrix_;
91
class SliceSchrodingerSolver : public SchrodingerSolver {
96
SliceSchrodingerSolver(
97
const FieldName fieldName,
98
const PhysicsModel * physicsModel,
99
const FE_Engine * feEngine,
100
const PrescribedDataManager * prescribedDataMgr,
101
/*const*/ ATC_Coupling * atc,
102
const Array< std::set<int> > & oneDslices,
103
const int solverType = ATC::LinearSolver::DIRECT_SOLVE,
104
bool parallel = false
108
virtual ~SliceSchrodingerSolver();
111
bool modify(int narg, char **arg){return false;}
114
void initialize(void);
117
virtual bool solve(FIELDS & fields);
119
Array< std::set<int> > & slices(void){ return oneDslices_;}
123
Array< std::set<int> > oneDslices_;
127
class SchrodingerPoissonSolver {
129
SchrodingerPoissonSolver(
130
/*const*/ ATC_Coupling * atc,
131
SchrodingerSolver * schrodingerSolver,
132
PoissonSolver * poissonSolver,
133
const PhysicsModel * physicsModel,
134
int maxConsistencyIter
136
virtual ~SchrodingerPoissonSolver(void);
139
GRAD_FIELD_MATS & fluxes
143
SchrodingerSolver * schrodingerSolver_;
144
PoissonSolver * poissonSolver_;
145
const PhysicsModel * physicsModel_;
146
int maxConsistencyIter_;
150
class SliceSchrodingerPoissonSolver : public SchrodingerPoissonSolver {
152
SliceSchrodingerPoissonSolver(
153
/*const*/ ATC_Coupling * atc,
154
SchrodingerSolver * schrodingerSolver,
155
PoissonSolver * poissonSolver,
156
const PhysicsModel * physicsModel,
157
int maxConsistencyIter,
158
int maxConstraintIter,
163
virtual ~SliceSchrodingerPoissonSolver(void);
166
GRAD_FIELD_MATS & fluxes
169
double update_fermi_energy(double target, bool first,
170
GRAD_FIELD_MATS & fluxes);
171
int maxConstraintIter_;
176
Array< std::set<int> > & oneDslices_;
177
Array2D<double> EfHistory_;
180
class SchrodingerPoissonManager {
182
SchrodingerPoissonManager();
183
~SchrodingerPoissonManager();
186
bool modify(int narg, char **arg);
189
SchrodingerPoissonSolver * initialize(
190
/*const*/ ATC_Coupling * atc,
191
SchrodingerSolver * schrodingerSolver,
192
PoissonSolver * poissonSolver,
193
const PhysicsModel * physicsModel
196
int maxConsistencyIter_;
197
int maxConstraintIter_;