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