Hermes2D  3.0
weakforms_elasticity.cpp
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 #include "weakform_library/weakforms_elasticity.h"
17 #include "weakform_library/integrals_h1.h"
18 
19 namespace Hermes
20 {
21  namespace Hermes2D
22  {
23  namespace WeakFormsElasticity
24  {
25  template<typename Scalar>
26  DefaultJacobianElasticity_0_0<Scalar>::DefaultJacobianElasticity_0_0
27  (unsigned int i, unsigned int j, double lambda, double mu)
28  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
29  {
30  this->setSymFlag(HERMES_SYM);
31  }
32 
33  template<typename Scalar>
34  DefaultJacobianElasticity_0_0<Scalar>::DefaultJacobianElasticity_0_0
35  (unsigned int i, unsigned int j, std::string area, double lambda, double mu)
36  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
37  {
38  this->setSymFlag(HERMES_SYM);
39  this->set_area(area);
40  }
41 
42  template<typename Scalar>
43  Scalar DefaultJacobianElasticity_0_0<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
44  Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext) const
45  {
46  return (lambda + 2 * mu) * int_dudx_dvdx<double, Scalar>(n, wt, u, v) +
47  mu * int_dudy_dvdy<double, Scalar>(n, wt, u, v);
48  }
49 
50  template<typename Scalar>
51  Ord DefaultJacobianElasticity_0_0<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
52  GeomVol<Ord> *e, Func<Ord> **ext) const
53  {
54  return (lambda + 2 * mu) * int_dudx_dvdx<Ord, Ord>(n, wt, u, v) +
55  mu * int_dudy_dvdy<Ord, Ord>(n, wt, u, v);
56  }
57 
58  template<typename Scalar>
59  MatrixFormVol<Scalar>* DefaultJacobianElasticity_0_0<Scalar>::clone() const
60  {
61  return new DefaultJacobianElasticity_0_0<Scalar>(this->i, this->j, this->areas[0], this->lambda, this->mu);
62  }
63 
64  template<typename Scalar>
65  DefaultJacobianElasticity_0_1<Scalar>::DefaultJacobianElasticity_0_1
66  (unsigned int i, unsigned int j, double lambda, double mu)
67  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
68  {
69  this->setSymFlag(HERMES_SYM);
70  }
71 
72  template<typename Scalar>
73  DefaultJacobianElasticity_0_1<Scalar>::DefaultJacobianElasticity_0_1
74  (unsigned int i, unsigned int j, std::string area, double lambda, double mu)
75  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
76  {
77  this->setSymFlag(HERMES_SYM);
78  this->set_area(area);
79  }
80 
81  template<typename Scalar>
82  Scalar DefaultJacobianElasticity_0_1<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
83  Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext) const
84  {
85  return lambda * int_dudy_dvdx<double, Scalar>(n, wt, u, v) +
86  mu * int_dudx_dvdy<double, Scalar>(n, wt, u, v);
87  }
88 
89  template<typename Scalar>
90  Ord DefaultJacobianElasticity_0_1<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *u,
91  Func<Ord> *v, GeomVol<Ord> *e, Func<Ord> **ext) const
92  {
93  return lambda * int_dudy_dvdx<Ord, Ord>(n, wt, u, v) +
94  mu * int_dudx_dvdy<Ord, Ord>(n, wt, u, v);
95  }
96 
97  template<typename Scalar>
98  MatrixFormVol<Scalar>* DefaultJacobianElasticity_0_1<Scalar>::clone() const
99  {
100  return new DefaultJacobianElasticity_0_1<Scalar>(this->i, this->j, this->areas[0], this->lambda, this->mu);
101  }
102 
103  template<typename Scalar>
104  DefaultResidualElasticity_0_0<Scalar>::DefaultResidualElasticity_0_0
105  (unsigned int i, double lambda, double mu)
106  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
107  {
108  }
109 
110  template<typename Scalar>
111  DefaultResidualElasticity_0_0<Scalar>::DefaultResidualElasticity_0_0
112  (unsigned int i, std::string area, double lambda, double mu)
113  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
114  {
115  this->set_area(area);
116  }
117 
118  template<typename Scalar>
119  Scalar DefaultResidualElasticity_0_0<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
120  GeomVol<double> *e, Func<Scalar> **ext) const
121  {
122  return (2 * mu + lambda) * int_dudx_dvdx<Scalar, double>(n, wt, u_ext[0], v) +
123  mu * int_dudy_dvdy<Scalar, double>(n, wt, u_ext[0], v);
124  }
125 
126  template<typename Scalar>
127  Ord DefaultResidualElasticity_0_0<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
128  GeomVol<Ord> *e, Func<Ord> **ext) const
129  {
130  return (2 * mu + lambda) * int_dudx_dvdx<Ord, Ord>(n, wt, u_ext[0], v) +
131  mu * int_dudy_dvdy<Ord, Ord>(n, wt, u_ext[0], v);
132  }
133 
134  template<typename Scalar>
135  VectorFormVol<Scalar>* DefaultResidualElasticity_0_0<Scalar>::clone() const
136  {
137  return new DefaultResidualElasticity_0_0<Scalar>(this->i, this->areas[0], this->lambda, this->mu);
138  }
139 
140  template<typename Scalar>
141  DefaultResidualElasticity_0_1<Scalar>::DefaultResidualElasticity_0_1
142  (unsigned int i, double lambda, double mu)
143  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
144  {
145  }
146 
147  template<typename Scalar>
148  DefaultResidualElasticity_0_1<Scalar>::DefaultResidualElasticity_0_1
149  (unsigned int i, std::string area, double lambda, double mu)
150  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
151  {
152  this->set_area(area);
153  }
154 
155  template<typename Scalar>
156  Scalar DefaultResidualElasticity_0_1<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
157  GeomVol<double> *e, Func<Scalar> **ext) const
158  {
159  return lambda * int_dudy_dvdx<double, Scalar>(n, wt, u_ext[1], v) +
160  mu * int_dudx_dvdy<double, Scalar>(n, wt, u_ext[1], v);
161  }
162 
163  template<typename Scalar>
164  Ord DefaultResidualElasticity_0_1<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
165  GeomVol<Ord> *e, Func<Ord> **ext) const
166  {
167  return lambda * int_dudy_dvdx<Ord, Ord>(n, wt, u_ext[1], v) +
168  mu * int_dudx_dvdy<Ord, Ord>(n, wt, u_ext[1], v);
169  }
170 
171  template<typename Scalar>
172  VectorFormVol<Scalar>* DefaultResidualElasticity_0_1<Scalar>::clone() const
173  {
174  return new DefaultResidualElasticity_0_1<Scalar>(this->i, this->areas[0], this->lambda, this->mu);
175  }
176 
177  template<typename Scalar>
178  DefaultResidualElasticity_1_0<Scalar>::DefaultResidualElasticity_1_0
179  (unsigned int i, double lambda, double mu)
180  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
181  {
182  }
183 
184  template<typename Scalar>
185  DefaultResidualElasticity_1_0<Scalar>::DefaultResidualElasticity_1_0
186  (unsigned int i, std::string area, double lambda, double mu)
187  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
188  {
189  this->set_area(area);
190  }
191 
192  template<typename Scalar>
193  Scalar DefaultResidualElasticity_1_0<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
194  GeomVol<double> *e, Func<Scalar> **ext) const
195  {
196  return mu * int_dudy_dvdx<double, Scalar>(n, wt, u_ext[0], v) +
197  lambda * int_dudx_dvdy<double, Scalar>(n, wt, u_ext[0], v);
198  }
199 
200  template<typename Scalar>
201  Ord DefaultResidualElasticity_1_0<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
202  GeomVol<Ord> *e, Func<Ord> **ext) const
203  {
204  return mu * int_dudy_dvdx<Ord, Ord>(n, wt, u_ext[0], v) +
205  lambda * int_dudx_dvdy<Ord, Ord>(n, wt, u_ext[0], v);
206  }
207 
208  template<typename Scalar>
209  VectorFormVol<Scalar>* DefaultResidualElasticity_1_0<Scalar>::clone() const
210  {
211  return new DefaultResidualElasticity_1_0<Scalar>(this->i, this->areas[0], this->lambda, this->mu);
212  }
213 
214  template<typename Scalar>
215  DefaultResidualElasticity_1_1<Scalar>::DefaultResidualElasticity_1_1
216  (unsigned int i, double lambda, double mu)
217  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
218  {
219  }
220 
221  template<typename Scalar>
222  DefaultResidualElasticity_1_1<Scalar>::DefaultResidualElasticity_1_1
223  (unsigned int i, std::string area, double lambda, double mu)
224  : VectorFormVol<Scalar>(i), lambda(lambda), mu(mu)
225  {
226  this->set_area(area);
227  }
228 
229  template<typename Scalar>
230  Scalar DefaultResidualElasticity_1_1<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *v,
231  GeomVol<double> *e, Func<Scalar> **ext) const
232  {
233  return (2 * mu + lambda) * int_dudy_dvdy<double, Scalar>(n, wt, u_ext[1], v) +
234  mu * int_dudx_dvdx<double, Scalar>(n, wt, u_ext[1], v);
235  }
236 
237  template<typename Scalar>
238  Ord DefaultResidualElasticity_1_1<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *v,
239  GeomVol<Ord> *e, Func<Ord> **ext) const
240  {
241  return (2 * mu + lambda) * int_dudy_dvdy<Ord, Ord>(n, wt, u_ext[1], v) +
242  mu * int_dudx_dvdx<Ord, Ord>(n, wt, u_ext[1], v);
243  }
244 
245  template<typename Scalar>
246  VectorFormVol<Scalar>* DefaultResidualElasticity_1_1<Scalar>::clone() const
247  {
248  return new DefaultResidualElasticity_1_1<Scalar>(this->i, this->areas[0], this->lambda, this->mu);
249  }
250 
251  template<typename Scalar>
252  DefaultJacobianElasticity_1_1<Scalar>::DefaultJacobianElasticity_1_1
253  (unsigned int i, unsigned int j, double lambda, double mu)
254  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
255  {
256  }
257 
258  template<typename Scalar>
259  DefaultJacobianElasticity_1_1<Scalar>::DefaultJacobianElasticity_1_1
260  (unsigned int i, unsigned int j, std::string area, double lambda, double mu)
261  : MatrixFormVol<Scalar>(i, j), lambda(lambda), mu(mu)
262  {
263  this->set_area(area);
264  }
265 
266  template<typename Scalar>
267  Scalar DefaultJacobianElasticity_1_1<Scalar>::value(int n, double *wt, Func<Scalar> *u_ext[], Func<double> *u,
268  Func<double> *v, GeomVol<double> *e, Func<Scalar> **ext) const
269  {
270  return mu * int_dudx_dvdx<double, Scalar>(n, wt, u, v) +
271  (lambda + 2 * mu) * int_dudy_dvdy<double, Scalar>(n, wt, u, v);
272  }
273 
274  template<typename Scalar>
275  Ord DefaultJacobianElasticity_1_1<Scalar>::ord(int n, double *wt, Func<Ord> *u_ext[], Func<Ord> *u, Func<Ord> *v,
276  GeomVol<Ord> *e, Func<Ord> **ext) const
277  {
278  return mu * int_dudx_dvdx<Ord, Ord>(n, wt, u, v) +
279  (lambda + 2 * mu) * int_dudy_dvdy<Ord, Ord>(n, wt, u, v);
280  }
281 
282  template<typename Scalar>
283  MatrixFormVol<Scalar>* DefaultJacobianElasticity_1_1<Scalar>::clone() const
284  {
285  return new DefaultJacobianElasticity_1_1<Scalar>(this->i, this->j, this->areas[0], this->lambda, this->mu);
286  }
287 
288  template class HERMES_API DefaultJacobianElasticity_0_0 < double > ;
289  template class HERMES_API DefaultJacobianElasticity_0_1 < double > ;
290  template class HERMES_API DefaultResidualElasticity_0_0 < double > ;
291  template class HERMES_API DefaultResidualElasticity_0_1 < double > ;
292  template class HERMES_API DefaultResidualElasticity_1_0 < double > ;
293  template class HERMES_API DefaultResidualElasticity_1_1 < double > ;
294  template class HERMES_API DefaultJacobianElasticity_1_1 < double > ;
295  };
296  }
297 }
Definition: adapt.h:24
void set_area(std::string area)
Definition: weakform.cpp:326
::xsd::cxx::tree::string< char, simple_type > string
C++ type corresponding to the string XML Schema built-in type.