#ifndef IMPLICIT_SOLVE_OPERATOR_H
#define IMPLICIT_SOLVE_OPERATOR_H
#include "Array2D.h"
#include "MatrixLibrary.h"
#include "PhysicsModel.h"
#include <vector>
#include <map>
namespace ATC {
class ATC_Coupling;
class FE_Engine;
class ImplicitSolveOperator {
public:
ImplicitSolveOperator(double alpha, double dt);
virtual ~ImplicitSolveOperator() {};
virtual DENS_VEC operator * (const DENS_VEC &x) const;
virtual void R(const DENS_VEC &f, DENS_VEC &v) const = 0;
virtual DENS_VEC r() const;
virtual DiagonalMatrix<double> preconditioner() const;
virtual void solution(const DENS_MAT & dx, DENS_MAT &x) const = 0;
virtual void rhs(const DENS_MAT & r, DENS_MAT &rhs) const = 0;
protected:
int n_,dof_;
DENS_VEC x0_; mutable DENS_VEC x_; DENS_VEC R0_; mutable DENS_VEC R_; double dt_; double alpha_; double epsilon0_; };
class FieldImplicitSolveOperator : public ImplicitSolveOperator {
public:
FieldImplicitSolveOperator(ATC_Coupling * atc,
FIELDS & fields,
const FieldName f,
const Array2D< bool > & rhsMask,
const PhysicsModel * physicsModel,
double simTime, double dt, double alpha = 0.5);
virtual ~FieldImplicitSolveOperator() {};
virtual void R(const DENS_VEC &f, DENS_VEC &v) const;
virtual void solution(const DENS_MAT & dx, DENS_MAT &x) const;
virtual void rhs(const DENS_MAT & r, DENS_MAT &rhs) const;
protected:
void to_all(const VECTOR& free, MATRIX& all) const;
void to_free(const MATRIX& all, VECTOR& free) const;
FieldName fieldName_; ATC_Coupling * atc_;
const PhysicsModel * physicsModel_;
FIELDS & fields0_; mutable FIELDS fields_; std::map<int,int> freeNodes_;
Array2D<bool> rhsMask_;
Array<FieldName> massMask_;
mutable FIELDS rhs_; double time_;
};
}
#endif