Hermes2D  2.0
weakforms_elasticity.h
1 // This file is part of Hermes2D.
2 //
3 // Hermes2D is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 2 of the License, or
6 // (at your option) any later version.
7 //
8 // Hermes2D is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with Hermes2D. If not, see <http://www.gnu.org/licenses/>.
15 
16 #ifndef __H2D_ELASTICITY_WEAK_FORMS_H
17 #define __H2D_ELASTICITY_WEAK_FORMS_H
18 
19 #include "../integrals/h1.h"
20 #include "../weakform/weakform.h"
21 #include "../spline.h"
22 
23 /* Default weak form for linear elasticity (Lame equations)
24 with Dirichlet and/or zero Neumann BC
25 
26 Nonzero Neumann and Newton boundary conditions can be enabled
27 by creating a descendant and adding surface forms to it.
28 */
29 namespace Hermes
30 {
31  namespace Hermes2D
32  {
33  namespace WeakFormsElasticity {
34  /* Single-component version -- to be used for multimesh assembling */
35 
36  template<typename Scalar>
37  class HERMES_API DefaultJacobianElasticity_0_0 : public MatrixFormVol<Scalar>
38  {
39  public:
40  DefaultJacobianElasticity_0_0(unsigned int i, unsigned int j, double lambda, double mu);
41  DefaultJacobianElasticity_0_0(unsigned int i, unsigned int j, std::string area, double lambda, double mu);
42 
43  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
44  Func<double> *v, Geom<double> *e, Func<Scalar> **ext) const;
45 
46  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u, Func<Hermes::Ord> *v,
47  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
48 
49  virtual MatrixFormVol<Scalar>* clone() const;
50  private:
51  double lambda, mu;
52  };
53 
54  template<typename Scalar>
55  class HERMES_API DefaultJacobianElasticity_0_1 : public MatrixFormVol<Scalar>
56  {
57  public:
58  DefaultJacobianElasticity_0_1(unsigned int i, unsigned int j, double lambda, double mu);
59  DefaultJacobianElasticity_0_1(unsigned int i, unsigned int j, std::string area, double lambda, double mu);
60 
61  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
62  Func<double> *v, Geom<double> *e, Func<Scalar> **ext) const;
63 
64  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u,
65  Func<Hermes::Ord> *v, Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
66 
67  virtual MatrixFormVol<Scalar>* clone() const;
68  private:
69  double lambda, mu;
70  };
71 
72  template<typename Scalar>
73  class HERMES_API DefaultResidualElasticity_0_0 : public VectorFormVol<Scalar>
74  {
75  public:
76  DefaultResidualElasticity_0_0(unsigned int i, double lambda, double mu);
77  DefaultResidualElasticity_0_0(unsigned int i, std::string area, double lambda, double mu);
78 
79  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
80  Geom<double> *e, Func<Scalar> **ext) const;
81 
82  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
83  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
84 
85  virtual VectorFormVol<Scalar>* clone() const;
86  private:
87  double lambda, mu;
88  };
89 
90  template<typename Scalar>
91  class HERMES_API DefaultResidualElasticity_0_1 : public VectorFormVol<Scalar>
92  {
93  public:
94  DefaultResidualElasticity_0_1(unsigned int i, double lambda, double mu);
95  DefaultResidualElasticity_0_1(unsigned int i, std::string area, double lambda, double mu);
96 
97  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
98  Geom<double> *e, Func<Scalar> **ext) const;
99 
100  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
101  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
102 
103  virtual VectorFormVol<Scalar>* clone() const;
104  private:
105  double lambda, mu;
106  };
107 
108  template<typename Scalar>
109  class HERMES_API DefaultResidualElasticity_1_0 : public VectorFormVol<Scalar>
110  {
111  public:
112  DefaultResidualElasticity_1_0(unsigned int i, double lambda, double mu);
113  DefaultResidualElasticity_1_0(unsigned int i, std::string area, double lambda, double mu);
114 
115  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
116  Geom<double> *e, Func<Scalar> **ext) const;
117 
118  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
119  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
120 
121  virtual VectorFormVol<Scalar>* clone() const;
122  private:
123  double lambda, mu;
124  };
125 
126  template<typename Scalar>
127  class HERMES_API DefaultResidualElasticity_1_1 : public VectorFormVol<Scalar>
128  {
129  public:
130  DefaultResidualElasticity_1_1(unsigned int i, double lambda, double mu);
131  DefaultResidualElasticity_1_1(unsigned int i, std::string area, double lambda, double mu);
132 
133  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
134  Geom<double> *e, Func<Scalar> **ext) const;
135 
136  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *v,
137  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
138 
139  virtual VectorFormVol<Scalar>* clone() const;
140  private:
141  double lambda, mu;
142  };
143 
144  template<typename Scalar>
145  class HERMES_API DefaultJacobianElasticity_1_1 : public MatrixFormVol<Scalar>
146  {
147  public:
148  DefaultJacobianElasticity_1_1(unsigned int i, unsigned int j, double lambda, double mu);
149  DefaultJacobianElasticity_1_1(unsigned int i, unsigned int j, std::string area, double lambda, double mu);
150 
151  virtual Scalar value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
152  Func<double> *v, Geom<double> *e, Func<Scalar> **ext) const;
153 
154  virtual Hermes::Ord ord(int n, double *wt, Func<Hermes::Ord> *u_ext[], Func<Hermes::Ord> *u, Func<Hermes::Ord> *v,
155  Geom<Hermes::Ord> *e, Func<Ord> **ext) const;
156 
157  virtual MatrixFormVol<Scalar>* clone() const;
158  private:
159  double lambda, mu;
160  };
161  };
162  }
163 }
164 #endif