72 template <
class T,
class X,
class W>
79 m_nelem = m_x.shape(0);
86 m_N = xt::empty<double>({m_nip, s_nne});
87 m_dNxi = xt::empty<double>({m_nip, s_nne, s_ndim});
88 m_B = xt::empty<double>({m_nelem, m_nip, s_nne, s_tdim, s_tdim, s_tdim});
91 for (
size_t q = 0;
q < m_nip; ++
q) {
92 m_N(
q, 0) = 0.25 * (1.0 - m_xi(
q, 0)) * (1.0 - m_xi(
q, 1));
93 m_N(
q, 1) = 0.25 * (1.0 + m_xi(
q, 0)) * (1.0 - m_xi(
q, 1));
94 m_N(
q, 2) = 0.25 * (1.0 + m_xi(
q, 0)) * (1.0 + m_xi(
q, 1));
95 m_N(
q, 3) = 0.25 * (1.0 - m_xi(
q, 0)) * (1.0 + m_xi(
q, 1));
98 for (
size_t q = 0;
q < m_nip; ++
q) {
100 m_dNxi(
q, 0, 0) = -0.25 * (1.0 - m_xi(
q, 1));
101 m_dNxi(
q, 1, 0) = +0.25 * (1.0 - m_xi(
q, 1));
102 m_dNxi(
q, 2, 0) = +0.25 * (1.0 + m_xi(
q, 1));
103 m_dNxi(
q, 3, 0) = -0.25 * (1.0 + m_xi(
q, 1));
105 m_dNxi(
q, 0, 1) = -0.25 * (1.0 - m_xi(
q, 0));
106 m_dNxi(
q, 1, 1) = -0.25 * (1.0 + m_xi(
q, 0));
107 m_dNxi(
q, 2, 1) = +0.25 * (1.0 + m_xi(
q, 0));
108 m_dNxi(
q, 3, 1) = +0.25 * (1.0 - m_xi(
q, 0));
111 this->compute_dN_impl();
132 template <
class T,
class R>
140#pragma omp parallel for
141 for (
size_t e = 0;
e < m_nelem; ++
e) {
143 auto u = xt::adapt(&
elemvec(
e, 0, 0), xt::xshape<s_nne, s_ndim>());
145 for (
size_t q = 0;
q < m_nip; ++
q) {
148 xt::adapt(&m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>());
149 auto gradu = xt::adapt(&
qtensor(
e,
q, 0, 0), xt::xshape<s_tdim, s_tdim>());
153 gradu(0, 0) =
B(0, 0, 0, 0) *
u(0, 1) +
B(1, 0, 0, 0) *
u(1, 1) +
154 B(2, 0, 0, 0) *
u(2, 1) +
B(3, 0, 0, 0) *
u(3, 1);
155 gradu(1, 1) =
B(0, 1, 1, 0) *
u(0, 1) +
B(1, 1, 1, 0) *
u(1, 1) +
156 B(2, 1, 1, 0) *
u(2, 1) +
B(3, 1, 1, 0) *
u(3, 1);
157 gradu(2, 2) =
B(0, 2, 2, 2) *
u(0, 0) +
B(1, 2, 2, 2) *
u(1, 0) +
158 B(2, 2, 2, 2) *
u(2, 0) +
B(3, 2, 2, 2) *
u(3, 0);
159 gradu(0, 2) =
B(0, 0, 2, 2) *
u(0, 0) +
B(1, 0, 2, 2) *
u(1, 0) +
160 B(2, 0, 2, 2) *
u(2, 0) +
B(3, 0, 2, 2) *
u(3, 0);
161 gradu(2, 0) =
B(0, 2, 0, 0) *
u(0, 1) +
B(1, 2, 0, 0) *
u(1, 1) +
162 B(2, 2, 0, 0) *
u(2, 1) +
B(3, 2, 0, 0) *
u(3, 1);
167 template <
class T,
class R>
175#pragma omp parallel for
176 for (
size_t e = 0;
e < m_nelem; ++
e) {
178 auto u = xt::adapt(&
elemvec(
e, 0, 0), xt::xshape<s_nne, s_ndim>());
180 for (
size_t q = 0;
q < m_nip; ++
q) {
183 xt::adapt(&m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>());
184 auto gradu = xt::adapt(&
qtensor(
e,
q, 0, 0), xt::xshape<s_tdim, s_tdim>());
188 gradu(0, 0) =
B(0, 0, 0, 0) *
u(0, 1) +
B(1, 0, 0, 0) *
u(1, 1) +
189 B(2, 0, 0, 0) *
u(2, 1) +
B(3, 0, 0, 0) *
u(3, 1);
190 gradu(1, 1) =
B(0, 1, 1, 0) *
u(0, 1) +
B(1, 1, 1, 0) *
u(1, 1) +
191 B(2, 1, 1, 0) *
u(2, 1) +
B(3, 1, 1, 0) *
u(3, 1);
192 gradu(2, 2) =
B(0, 2, 2, 2) *
u(0, 0) +
B(1, 2, 2, 2) *
u(1, 0) +
193 B(2, 2, 2, 2) *
u(2, 0) +
B(3, 2, 2, 2) *
u(3, 0);
194 gradu(2, 0) =
B(0, 0, 2, 2) *
u(0, 0) +
B(1, 0, 2, 2) *
u(1, 0) +
195 B(2, 0, 2, 2) *
u(2, 0) +
B(3, 0, 2, 2) *
u(3, 0);
196 gradu(0, 2) =
B(0, 2, 0, 0) *
u(0, 1) +
B(1, 2, 0, 0) *
u(1, 1) +
197 B(2, 2, 0, 0) *
u(2, 1) +
B(3, 2, 0, 0) *
u(3, 1);
202 template <
class T,
class R>
210#pragma omp parallel for
211 for (
size_t e = 0;
e < m_nelem; ++
e) {
213 auto u = xt::adapt(&
elemvec(
e, 0, 0), xt::xshape<s_nne, s_ndim>());
215 for (
size_t q = 0;
q < m_nip; ++
q) {
218 xt::adapt(&m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>());
219 auto eps = xt::adapt(&
qtensor(
e,
q, 0, 0), xt::xshape<s_tdim, s_tdim>());
224 eps(0, 0) =
B(0, 0, 0, 0) *
u(0, 1) +
B(1, 0, 0, 0) *
u(1, 1) +
225 B(2, 0, 0, 0) *
u(2, 1) +
B(3, 0, 0, 0) *
u(3, 1);
226 eps(1, 1) =
B(0, 1, 1, 0) *
u(0, 1) +
B(1, 1, 1, 0) *
u(1, 1) +
227 B(2, 1, 1, 0) *
u(2, 1) +
B(3, 1, 1, 0) *
u(3, 1);
228 eps(2, 2) =
B(0, 2, 2, 2) *
u(0, 0) +
B(1, 2, 2, 2) *
u(1, 0) +
229 B(2, 2, 2, 2) *
u(2, 0) +
B(3, 2, 2, 2) *
u(3, 0);
230 eps(2, 0) = 0.5 * (
B(0, 0, 2, 2) *
u(0, 0) +
B(1, 0, 2, 2) *
u(1, 0) +
231 B(2, 0, 2, 2) *
u(2, 0) +
B(3, 0, 2, 2) *
u(3, 0) +
232 B(0, 2, 0, 0) *
u(0, 1) +
B(1, 2, 0, 0) *
u(1, 1) +
233 B(2, 2, 0, 0) *
u(2, 1) +
B(3, 2, 0, 0) *
u(3, 1));
241 template <
class T,
class R>
249#pragma omp parallel for
250 for (
size_t e = 0;
e < m_nelem; ++
e) {
252 auto M = xt::adapt(&
elemmat(
e, 0, 0), xt::xshape<s_nne * s_ndim, s_nne * s_ndim>());
254 for (
size_t q = 0;
q < m_nip; ++
q) {
256 auto N = xt::adapt(&m_N(
q, 0), xt::xshape<s_nne>());
257 auto&
vol = m_vol(
e,
q);
261 for (
size_t m = 0;
m < s_nne; ++
m) {
262 for (
size_t n = 0;
n < s_nne; ++
n) {
263 M(
m * s_ndim + 0,
n * s_ndim + 0) +=
N(
m) *
rho *
N(
n) *
vol;
264 M(
m * s_ndim + 1,
n * s_ndim + 1) +=
N(
m) *
rho *
N(
n) *
vol;
272 template <
class T,
class R>
280#pragma omp parallel for
281 for (
size_t e = 0;
e < m_nelem; ++
e) {
283 auto f = xt::adapt(&
elemvec(
e, 0, 0), xt::xshape<s_nne, s_ndim>());
285 for (
size_t q = 0;
q < m_nip; ++
q) {
288 xt::adapt(&m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>());
289 auto sig = xt::adapt(&
qtensor(
e,
q, 0, 0), xt::xshape<s_tdim, s_tdim>());
290 auto&
vol = m_vol(
e,
q);
294 for (
size_t m = 0;
m < s_nne; ++
m) {
295 f(
m, 0) +=
vol * (
B(
m, 2, 2, 2) *
sig(2, 2) +
B(
m, 0, 2, 2) *
sig(0, 2));
296 f(
m, 1) +=
vol * (
B(
m, 0, 0, 0) *
sig(0, 0) +
B(
m, 1, 1, 0) *
sig(1, 1) +
297 B(
m, 2, 0, 0) *
sig(2, 0));
304 template <
class T,
class R>
305 void int_gradN_dot_tensor4_dot_gradNT_dV_impl(
const T&
qtensor,
R&
elemmat)
const
312#pragma omp parallel for
313 for (
size_t e = 0;
e < m_nelem; ++
e) {
315 auto K = xt::adapt(&
elemmat(
e, 0, 0), xt::xshape<s_nne * s_ndim, s_nne * s_ndim>());
317 for (
size_t q = 0;
q < m_nip; ++
q) {
320 xt::adapt(&m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>());
322 &
qtensor(
e,
q, 0, 0, 0, 0), xt::xshape<s_tdim, s_tdim, s_tdim, s_tdim>()
324 auto&
vol = m_vol(
e,
q);
328 for (
size_t m = 0;
m < s_nne; ++
m) {
329 for (
size_t n = 0;
n < s_nne; ++
n) {
330 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
331 B(
m, 0, 0, 0) *
C(0, 0, 0, 0) *
B(
n, 0, 0, 0) *
vol;
332 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
333 B(
m, 0, 0, 0) *
C(0, 0, 1, 1) *
B(
n, 1, 1, 0) *
vol;
334 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
335 B(
m, 0, 0, 0) *
C(0, 0, 2, 2) *
B(
n, 2, 2, 2) *
vol;
336 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
337 B(
m, 0, 0, 0) *
C(0, 0, 2, 0) *
B(
n, 0, 2, 2) *
vol;
338 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
339 B(
m, 0, 0, 0) *
C(0, 0, 0, 2) *
B(
n, 2, 0, 0) *
vol;
341 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
342 B(
m, 1, 1, 0) *
C(1, 1, 0, 0) *
B(
n, 0, 0, 0) *
vol;
343 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
344 B(
m, 1, 1, 0) *
C(1, 1, 1, 1) *
B(
n, 1, 1, 0) *
vol;
345 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
346 B(
m, 1, 1, 0) *
C(1, 1, 2, 2) *
B(
n, 2, 2, 2) *
vol;
347 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
348 B(
m, 1, 1, 0) *
C(1, 1, 2, 0) *
B(
n, 0, 2, 2) *
vol;
349 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
350 B(
m, 1, 1, 0) *
C(1, 1, 0, 2) *
B(
n, 2, 0, 0) *
vol;
352 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
353 B(
m, 2, 2, 2) *
C(2, 2, 0, 0) *
B(
n, 0, 0, 0) *
vol;
354 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
355 B(
m, 2, 2, 2) *
C(2, 2, 1, 1) *
B(
n, 1, 1, 0) *
vol;
356 K(
m * s_ndim + 0,
n * s_ndim + 0) +=
357 B(
m, 2, 2, 2) *
C(2, 2, 2, 2) *
B(
n, 2, 2, 2) *
vol;
358 K(
m * s_ndim + 0,
n * s_ndim + 0) +=
359 B(
m, 2, 2, 2) *
C(2, 2, 2, 0) *
B(
n, 0, 2, 2) *
vol;
360 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
361 B(
m, 2, 2, 2) *
C(2, 2, 0, 2) *
B(
n, 2, 0, 0) *
vol;
363 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
364 B(
m, 0, 2, 2) *
C(0, 2, 0, 0) *
B(
n, 0, 0, 0) *
vol;
365 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
366 B(
m, 0, 2, 2) *
C(0, 2, 1, 1) *
B(
n, 1, 1, 0) *
vol;
367 K(
m * s_ndim + 0,
n * s_ndim + 0) +=
368 B(
m, 0, 2, 2) *
C(0, 2, 2, 2) *
B(
n, 2, 2, 2) *
vol;
369 K(
m * s_ndim + 0,
n * s_ndim + 0) +=
370 B(
m, 0, 2, 2) *
C(0, 2, 2, 0) *
B(
n, 0, 2, 2) *
vol;
371 K(
m * s_ndim + 0,
n * s_ndim + 1) +=
372 B(
m, 0, 2, 2) *
C(0, 2, 0, 2) *
B(
n, 2, 0, 0) *
vol;
374 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
375 B(
m, 2, 0, 0) *
C(2, 0, 0, 0) *
B(
n, 0, 0, 0) *
vol;
376 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
377 B(
m, 2, 0, 0) *
C(2, 0, 1, 1) *
B(
n, 1, 1, 0) *
vol;
378 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
379 B(
m, 2, 0, 0) *
C(2, 0, 2, 2) *
B(
n, 2, 2, 2) *
vol;
380 K(
m * s_ndim + 1,
n * s_ndim + 0) +=
381 B(
m, 2, 0, 0) *
C(2, 0, 2, 0) *
B(
n, 0, 2, 2) *
vol;
382 K(
m * s_ndim + 1,
n * s_ndim + 1) +=
383 B(
m, 2, 0, 0) *
C(2, 0, 0, 2) *
B(
n, 2, 0, 0) *
vol;
390 void compute_dN_impl()
397 array_type::tensor<double, 2>
J = xt::empty<double>({2, 2});
398 array_type::tensor<double, 2>
Jinv = xt::empty<double>({2, 2});
401 for (
size_t e = 0;
e < m_nelem; ++
e) {
403 auto x = xt::adapt(&m_x(
e, 0, 0), xt::xshape<s_nne, s_ndim>());
405 for (
size_t q = 0;
q < m_nip; ++
q) {
407 auto dNxi = xt::adapt(&m_dNxi(
q, 0, 0), xt::xshape<s_nne, s_ndim>());
409 &m_B(
e,
q, 0, 0, 0, 0), xt::xshape<s_nne, s_tdim, s_tdim, s_tdim>()
411 auto N = xt::adapt(&m_N(
q, 0), xt::xshape<s_nne>());
414 J(0, 0) =
dNxi(0, 0) *
x(0, 0) +
dNxi(1, 0) *
x(1, 0) +
dNxi(2, 0) *
x(2, 0) +
415 dNxi(3, 0) *
x(3, 0);
416 J(0, 1) =
dNxi(0, 0) *
x(0, 1) +
dNxi(1, 0) *
x(1, 1) +
dNxi(2, 0) *
x(2, 1) +
417 dNxi(3, 0) *
x(3, 1);
418 J(1, 0) =
dNxi(0, 1) *
x(0, 0) +
dNxi(1, 1) *
x(1, 0) +
dNxi(2, 1) *
x(2, 0) +
419 dNxi(3, 1) *
x(3, 0);
420 J(1, 1) =
dNxi(0, 1) *
x(0, 1) +
dNxi(1, 1) *
x(1, 1) +
dNxi(2, 1) *
x(2, 1) +
421 dNxi(3, 1) *
x(3, 1);
423 double Jdet = detail::tensor<2>::inv(
J,
Jinv);
426 double rq =
N(0) *
x(0, 1) +
N(1) *
x(1, 1) +
N(2) *
x(2, 1) +
N(3) *
x(3, 1);
429 for (
size_t m = 0;
m < s_nne; ++
m) {
435 B(
m, 1, 1, 0) = 1.0 /
rq *
N(
m);
448 constexpr static size_t s_nne = 4;
449 constexpr static size_t s_ndim = 2;
450 constexpr static size_t s_tdim = 3;
454 array_type::tensor<double, 3> m_x;
455 array_type::tensor<double, 1> m_w;
456 array_type::tensor<double, 2> m_xi;
457 array_type::tensor<double, 2> m_N;
458 array_type::tensor<double, 3> m_dNxi;
459 array_type::tensor<double, 2> m_vol;
460 array_type::tensor<double, 6> m_B;