forked from lijiext/lammps
130 lines
3.0 KiB
C++
130 lines
3.0 KiB
C++
#ifndef IMPLICIT_SOLVE_OPERATOR_H
|
|
#define IMPLICIT_SOLVE_OPERATOR_H
|
|
|
|
// ATC includes
|
|
#include "Array2D.h"
|
|
#include "MatrixLibrary.h"
|
|
#include "PhysicsModel.h"
|
|
|
|
// other includes
|
|
#include <vector>
|
|
#include <map>
|
|
|
|
namespace ATC {
|
|
|
|
// Forward class declarations
|
|
class ATC_Coupling;
|
|
class FE_Engine;
|
|
|
|
/**
|
|
* @class ImplicitSolveOperator
|
|
* @brief Helper class to compute matrix-free product for use with IML++ solvers
|
|
*/
|
|
class ImplicitSolveOperator {
|
|
|
|
public:
|
|
|
|
/** Constructor */
|
|
ImplicitSolveOperator(ATC_Coupling * atc,
|
|
/*const*/ FE_Engine * feEngine,
|
|
const PhysicsModel * physicsModel);
|
|
|
|
/** Destructor */
|
|
virtual ~ImplicitSolveOperator() {};
|
|
|
|
/** pure virtual operator to compute Ax, for equation Ax=b */
|
|
virtual DENS_VEC operator * (DENS_VEC x) const = 0;
|
|
|
|
/** pure virtual method to return the rhs vector b */
|
|
virtual DENS_VEC rhs() = 0;
|
|
|
|
/** pure virtual method to return preconditioner */
|
|
virtual DiagonalMatrix<double> preconditioner(FIELDS & fields) = 0;
|
|
|
|
protected:
|
|
|
|
/** Pointer to atc */
|
|
ATC_Coupling * atc_;
|
|
|
|
/** Pointer to FE_Engine */
|
|
/*const*/ FE_Engine * feEngine_;
|
|
|
|
/** Pointer to PhysicsModel */
|
|
const PhysicsModel * physicsModel_;
|
|
|
|
};
|
|
|
|
/**
|
|
* @class FieldImplicitSolveOperator
|
|
* @brief Class to perform A*x operation for electron temperature solution
|
|
*/
|
|
class FieldImplicitSolveOperator : public ImplicitSolveOperator {
|
|
|
|
public:
|
|
|
|
/** Constructor */
|
|
FieldImplicitSolveOperator(ATC_Coupling * atc,
|
|
/*const*/ FE_Engine * fe_Engine,
|
|
FIELDS & fields,
|
|
const FieldName electronField,
|
|
const Array2D< bool > & rhsMask,
|
|
const PhysicsModel * physicsModel,
|
|
double simTime,
|
|
double dt,
|
|
double alpha);
|
|
|
|
/** Destructor */
|
|
virtual ~FieldImplicitSolveOperator() {};
|
|
|
|
/** operator to compute A*x for the electron temperature equation */
|
|
virtual DENS_VEC operator * (DENS_VEC x) const;
|
|
|
|
/** method to return the rhs vector b */
|
|
virtual DENS_VEC rhs();
|
|
|
|
/** method to return preconditioner (identity matrix) */
|
|
virtual DIAG_MAT preconditioner(FIELDS & fields);
|
|
|
|
protected:
|
|
// field name of ODE to solve
|
|
FieldName fieldName_;
|
|
|
|
// Reference to current fields (passed in constructor)
|
|
FIELDS & fields_;
|
|
|
|
// Local fields
|
|
mutable FIELDS fieldsNp1_;
|
|
|
|
// Vector to hold current temperature
|
|
DENS_VEC TnVect_;
|
|
|
|
// Old and new RHS maps (not including inverse mass)
|
|
FIELDS RnMap_;
|
|
mutable FIELDS RnpMap_;
|
|
|
|
// Matrices/vectors to hold electron temperature components of RHS
|
|
// vectors (including inverse mass)
|
|
DENS_VEC RnVect_;
|
|
mutable DENS_VEC RnpVect_;
|
|
|
|
Array2D<bool> rhsMask_;
|
|
Array<FieldName> massMask_;
|
|
|
|
// simulation time
|
|
double time_;
|
|
|
|
// timestep
|
|
double dt_;
|
|
|
|
// implicit/explicit parameter (0 -> explicit, else implicit)
|
|
double alpha_;
|
|
|
|
// small parameter to compute increment
|
|
double epsilon0_;
|
|
|
|
};
|
|
|
|
} // namespace ATC
|
|
|
|
#endif
|