#ifndef WEAK_EQUATION_H #define WEAK_EQUATION_H #include #include #include "ATC_TypeDefs.h" namespace ATC{ class Material; /** * @class WeakEquation * @brief WeakEquation is a template for adapting FE weak equations * for the FE_Engine. It wrappers the correct material functions for * integration over elements */ class WeakEquation { public: /** type of equation */ enum PDE_Type {DYNAMIC_PDE=0, STATIC_PDE, EIGENVALUE_PDE, PROJECTION_PDE}; // constructor WeakEquation(PDE_Type type, FieldName fieldName, int fieldSize) : type_(type), fieldName_(fieldName), fieldSize_(fieldSize), nsd_(3) {}; // destructor virtual ~WeakEquation(){}; /** integrand that used to form the energy */ virtual bool has_E_integrand(void) const {return false;} virtual void E_integrand(const FIELD_MATS & /* fields */, const GRAD_FIELD_MATS & /* grad_fields */, const Material * /* material */, DENS_MAT & /* energy */ ) const {}; /** density that used to form the mass matrix */ virtual bool has_M_integrand(void) const {return false;} virtual void M_integrand(const FIELD_MATS & /* fields */, const Material * /* material */, DENS_MAT & /* density */ ) const {}; /** flux that is integrated with B = Grad N as its weight */ virtual bool has_B_integrand(void) const {return false;} virtual void B_integrand(const FIELD_MATS & /* fields */, const GRAD_FIELD_MATS & /* grad_fields */, const Material * /* material */, DENS_MAT_VEC & /* flux */) const {}; /** flux that is integrated with N as its weight */ virtual bool has_N_integrand(void) const {return false;} // N_integrand bool is for masking in FE_Engine virtual bool N_integrand(const FIELD_MATS & /* fields */, const GRAD_FIELD_MATS & /* grad_fields */, const Material * /* material */, DENS_MAT & /* flux */) const {return false;}; /** stiffness matrix */ // linear virtual void BB_tangent_coefficients(const FieldName /* field */, const Material * /* material */, DENS_MAT & /* coefs */) const {}; virtual void NN_tangent_coefficients(const FieldName /* field */, const Material * /* material */, DENS_MAT & /* coefs */) const {}; // non-linear virtual bool has_BB_tangent_coefficients(void) const {return false;} virtual void BB_tangent_coefficients(const FieldName /* field */, const FIELD_MATS & /* fields */, const Material * /* material */, DENS_MAT & /* coefs */) const {}; virtual bool has_NN_tangent_coefficients(void) const {return false;} virtual void NN_tangent_coefficients(const FieldName /* field */, const FIELD_MATS & /* fields */, const Material * /* material */, DENS_MAT & /* coefs */) const {}; /** type of equation */ PDE_Type type(void) const {return type_;} /** primary field */ FieldName field_name(void) const {return fieldName_;} int field_size(void) const {return fieldSize_;} /** list of require interfaces */ virtual std::set needs_material_functions(void) const = 0; protected: /** type of equation */ PDE_Type type_; /** field */ FieldName fieldName_; /** field size */ int fieldSize_; /** number of spatial dimensions */ int nsd_; }; } #endif