forked from lijiext/lammps
109 lines
3.6 KiB
C++
109 lines
3.6 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
|