1 #ifndef WEAK_EQUATION_POISSON_H 2 #define WEAK_EQUATION_POISSON_H 3 4 #include <set> 5 #include <string> 6 7 #include "WeakEquation.h" 8 9 namespace ATC{ 10 11 /** 12 * @class WeakEquationPoisson 13 * @brief Poisson equation 14 * 0 = perm grad^2 \phi + \rho --> 15 * \int B^T perm B dv \phi = \int N^T \rho dv 16 */ 17 18 class WeakEquationPoisson : public WeakEquation { 19 20 public: 21 22 // constructor 23 WeakEquationPoisson(); 24 25 // destructor ~WeakEquationPoisson()26 virtual ~WeakEquationPoisson(){}; 27 28 /** flux that is integrated with B = Grad N as its weight */ has_B_integrand(void)29 virtual bool has_B_integrand(void) const {return true;} 30 virtual void B_integrand(const FIELD_MATS &fields, 31 const GRAD_FIELD_MATS &grad_fields, 32 const Material * material, 33 DENS_MAT_VEC &flux) const ; 34 35 /** flux that is integrated with N as its weight */ 36 //virtual bool has_N_integrand(void) const {return false;} has_N_integrand(void)37 virtual bool has_N_integrand(void) const {return true;} 38 virtual bool N_integrand(const FIELD_MATS &fields, 39 const GRAD_FIELD_MATS &grad_fields, 40 const Material * material, 41 DENS_MAT &flux) const ; 42 43 44 /** linear RHS stiffness matrix */ has_BB_tangent_coefficients(void)45 virtual bool has_BB_tangent_coefficients(void) const {return true;} 46 virtual void BB_tangent_coefficients(const FieldName field, 47 const FIELD_MATS &fields, 48 const Material * material, 49 DENS_MAT &coefs) const; 50 51 /** linear RHS stiffness matrix */ has_NN_tangent_coefficients(void)52 virtual bool has_NN_tangent_coefficients(void) const {return true;} 53 virtual void NN_tangent_coefficients(const FieldName field, 54 const FIELD_MATS &fields, 55 const Material * material, 56 DENS_MAT &coefs) const; 57 58 /** necessary interfaces */ needs_material_functions(void)59 virtual std::set<std::string> needs_material_functions(void) const 60 { 61 std::set<std::string> needs; 62 needs.insert("electric_displacement"); 63 needs.insert("electron_charge_density"); 64 return needs; 65 } 66 }; 67 68 /** 69 * @class WeakEquationPoissonConstantRHS 70 * @brief Poisson equation with constant RHS 71 */ 72 73 74 class WeakEquationPoissonConstantRHS : public WeakEquationPoisson { 75 76 public: 77 78 // constructor 79 WeakEquationPoissonConstantRHS(); 80 81 // destructor ~WeakEquationPoissonConstantRHS()82 virtual ~WeakEquationPoissonConstantRHS(){}; 83 84 /** flux that is integrated with B = Grad N as its weight */ has_B_integrand(void)85 virtual bool has_B_integrand(void) const {return true;} B_integrand(const FIELD_MATS & fields,const GRAD_FIELD_MATS & grad_fields,const Material * material,DENS_MAT_VEC & flux)86 virtual void B_integrand(const FIELD_MATS &fields, 87 const GRAD_FIELD_MATS &grad_fields, 88 const Material * material, 89 DENS_MAT_VEC &flux) const 90 { WeakEquationPoisson::B_integrand(fields, grad_fields, material, flux) ; } 91 92 /** flux that is integrated with N as its weight */ has_N_integrand(void)93 virtual bool has_N_integrand(void) const {return true;} 94 virtual bool N_integrand(const FIELD_MATS &fields, 95 const GRAD_FIELD_MATS &grad_fields, 96 const Material * material, 97 DENS_MAT &flux) const ; 98 99 /** rhs is constant */ has_NN_tangent_coefficients(void)100 virtual bool has_NN_tangent_coefficients(void) const {return false;} NN_tangent_coefficients(const FieldName field,const FIELD_MATS & fields,const Material * material,DENS_MAT & coefs)101 virtual void NN_tangent_coefficients(const FieldName field, 102 const FIELD_MATS &fields, 103 const Material * material, 104 DENS_MAT &coefs) const {}; 105 needs_material_functions(void)106 virtual std::set<std::string> needs_material_functions(void) const 107 { 108 std::set<std::string> needs; 109 needs.insert("electric_displacement"); 110 return needs; 111 } 112 113 }; 114 115 }; // namespace 116 #endif 117