#ifndef FIELD_EULER_INTEGRATOR_H
#define FIELD_EULER_INTEGRATOR_H
#include "Array2D.h"
#include "MatrixLibrary.h"
#include "PhysicsModel.h"
#include "TimeIntegrator.h"
#include "ImplicitSolveOperator.h"
#include <vector>
#include <map>
namespace ATC {
class ATC_Coupling;
class FE_Engine;
class FieldEulerIntegrator {
public:
FieldEulerIntegrator(
const FieldName fieldName,
const PhysicsModel * physicsModel,
FE_Engine * feEngine,
ATC_Coupling * atc,
const Array2D< bool > & rhsMask );
virtual ~FieldEulerIntegrator() {};
virtual void initialize(const double dt, const double time,
FIELDS & fields) {};
virtual void update(const double dt, const double time,
FIELDS & fields, FIELDS & rhs) = 0;
protected:
ATC_Coupling * atc_;
FE_Engine * feEngine_;
const PhysicsModel * physicsModel_;
FieldName fieldName_;
Array2D <bool> rhsMask_;
int nNodes_;
};
class FieldExplicitEulerIntegrator : public FieldEulerIntegrator {
public:
FieldExplicitEulerIntegrator(
const FieldName fieldName,
const PhysicsModel * physicsModel,
FE_Engine * feEngine,
ATC_Coupling * atc,
const Array2D< bool > & rhsMask );
virtual ~FieldExplicitEulerIntegrator() {};
void update(const double dt, const double time,
FIELDS & fields, FIELDS & rhs);
};
class FieldImplicitEulerIntegrator : public FieldEulerIntegrator {
public:
FieldImplicitEulerIntegrator(
const FieldName fieldName,
const PhysicsModel * physicsModel,
FE_Engine * feEngine,
ATC_Coupling * atc,
const Array2D< bool > & rhsMask, const double alpha = 0.5 );
virtual ~FieldImplicitEulerIntegrator() {};
void update(const double dt, const double time,
FIELDS & fields, FIELDS & rhs);
protected:
double alpha_;
double dT_;
int maxRestarts_;
int maxIterations_;
double tol_;
};
class FieldImplicitDirectEulerIntegrator : public FieldEulerIntegrator {
public:
FieldImplicitDirectEulerIntegrator(
const FieldName fieldName,
const PhysicsModel * physicsModel,
FE_Engine * feEngine,
ATC_Coupling * atc,
const Array2D< bool > & rhsMask, const double alpha = 0.5 );
virtual ~FieldImplicitDirectEulerIntegrator();
void initialize(const double dt, const double time,
FIELDS & fields);
void update(const double dt, const double time,
FIELDS & fields, FIELDS & rhs);
protected:
double alpha_;
SPAR_MAT _M_;
SPAR_MAT _K_;
SPAR_MAT _lhsMK_;
SPAR_MAT _rhsMK_;
class LinearSolver * solver_;
};
}
#endif