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