lammps/lib/atc/WeakEquation.h

109 lines
3.8 KiB
C++

#ifndef WEAK_EQUATION_H
#define WEAK_EQUATION_H
#include <string>
#include <set>
#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<std::string> 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