MBDyn-1.7.3
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups
shelleasans.cc
Go to the documentation of this file.
1 /*
2  * MBDyn (C) is a multibody analysis code.
3  * http://www.mbdyn.org
4  *
5  * Copyright (C) 2010-2017
6  *
7  * Marco Morandini <morandini@aero.polimi.it>
8  * Riccardo Vescovini <vescovini@aero.polimi.it>
9  *
10  * Dipartimento di Ingegneria Aerospaziale - Politecnico di Milano
11  * via La Masa, 34 - 20156 Milano, Italy
12  * http://www.aero.polimi.it
13  *
14  * Changing this copyright notice is forbidden.
15  *
16  * This program is free software; you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation (version 2 of the License).
19  *
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program; if not, write to the Free Software
28  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29  */
30 
31 /*
32  * Inspired by
33  * Wojciech Witkowski
34  * "4-Node combined shell element with semi-EAS-ANS strain interpolations
35  * in 6-parameter shell theories with drilling degrees of freedom"
36  * Comput Mech (2009) 43:307­319 DOI 10.1007/s00466-008-0307-x
37  */
38 
39 #include "mbconfig.h" /* This goes first in every *.c,*.cc file */
40 
41 #include "constltp_impl.h"
42 #include "tpldrive_impl.h"
43 #include "shelleasans.h"
44 #include "mynewmem.h"
45 
46 #include "shell.hc"
47 
48 // #define _GNU_SOURCE 1
49 // #include <fenv.h>
50 // static void __attribute__ ((constructor))
51 // trapfpe ()
52 // {
53 // /* Enable some exceptions. At startup all exceptions are masked. */
54 //
55 // feenableexcept (FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW);
56 // }
57 
58 /***************************************
59 *
60 *
61 ****************************************/
62 
64  {-1. / std::sqrt(3.), -1. / std::sqrt(3.)},
65  { 1. / std::sqrt(3.), -1. / std::sqrt(3.)},
66  { 1. / std::sqrt(3.), 1. / std::sqrt(3.)},
67  {-1. / std::sqrt(3.), 1. / std::sqrt(3.)}
68 
69 
70 // {-0.774596669241483, -0.774596669241483},
71 // {-0.774596669241483, 0.},
72 // {-0.774596669241483, 0.774596669241483},
73 // { 0., -0.774596669241483},
74 // { 0., 0.},
75 // { 0., 0.774596669241483},
76 // { 0.774596669241483, -0.774596669241483},
77 // { 0.774596669241483, 0.},
78 // { 0.774596669241483, 0.774596669241483}
79 };
80 
82  1.,
83  1.,
84  1.,
85  1.
86 
87 // 0.555555555555556 * 0.555555555555556,
88 // 0.555555555555556 * 0.888888888888889,
89 // 0.555555555555556 * 0.555555555555556,
90 // 0.888888888888889 * 0.555555555555556,
91 // 0.888888888888889 * 0.888888888888889,
92 // 0.888888888888889 * 0.555555555555556,
93 // 0.555555555555556 * 0.555555555555556,
94 // 0.555555555555556 * 0.888888888888889,
95 // 0.555555555555556 * 0.555555555555556
96 
97 };
98 
100  { 0., 1.},
101  {-1., 0.},
102  { 0., -1.},
103  { 1., 0.}
104 };
105 
107  { 1., 1.},
108  {-1., 1.},
109  {-1., -1.},
110  { 1., -1.}
111 };
112 
113 doublereal Shell4EASANS::xi_0[2] = {0., 0.};
114 
115 void
117 {
118  Mat3x3 T_avg(Zero3x3);
119  Mat3x3 Tn[NUMNODES];
120  Mat3x3 R_tilde_n[NUMNODES];
121  for (integer i = 0; i < NUMNODES; i++) {
122 // xa[i] = pNode[i]->GetXCurr()+pNode[i]->GetRCurr()*f[i];
123  xa[i] = pNode[i]->GetXCurr();
124  Tn[i] = pNode[i]->GetRCurr() * iTa[i];
125 // T_a_avg += Ta[i];
126  T_avg += pNode[i]->GetRRef() * iTa[i];
127  }
128  T_avg /= 4.;
129  //FIXME; alternative solution: polar decomposition of T_a_avg = T0*U
131  for (integer i = 0; i < NUMNODES; i++) {
132  R_tilde_n[i] = T_overline.MulTM(Tn[i]);
133  phi_tilde_n[i] = RotManip::VecRot(R_tilde_n[i]);
134  }
135 }
136 
137 void
139 {
140  for (integer i = 0; i < NUMNODES; i++) {
141  xa[i] = pNode[i]->GetXCurr();
142  }
143  for (integer i = 0; i < NUMNODES; i++) {
144  Vec3 t1 = InterpDeriv_xi1(xa, xi_n[i]);
145  t1 = t1 / t1.Norm();
146  Vec3 t2 = InterpDeriv_xi2(xa, xi_n[i]);
147  t2 = t2 / t2.Norm();
148  Vec3 t3 = t1.Cross(t2);
149  t3 = t3 / t3.Norm();
150  t2 = t3.Cross(t1);
151  iTa[i] = (pNode[i]->GetRCurr()).MulTM(Mat3x3(t1, t2, t3));
152  }
153  for (integer i = 0; i < NUMIP; i++) {
154  iTa_i[i] = Eye3;
155  }
156  for (integer i = 0; i < NUMSSEP; i++) {
157  iTa_A[i] = Eye3;
158  }
161  for (integer i = 0; i < NUMIP; i++) {
162  Vec3 t1 = InterpDeriv_xi1(xa, xi_i[i]);
163  t1 = t1 / t1.Norm();
164  Vec3 t2 = InterpDeriv_xi2(xa, xi_i[i]);
165  t2 = t2 / t2.Norm();
166  Vec3 t3 = t1.Cross(t2);
167  t3 = t3 / t3.Norm();
168  t2 = t3.Cross(t1);
169  iTa_i[i] = (T_i[i]).MulTM(Mat3x3(t1, t2, t3));
170  }
171  for (integer i = 0; i < NUMSSEP; i++) {
172  Vec3 t1 = InterpDeriv_xi1(xa, xi_A[i]);
173  t1 = t1 / t1.Norm();
174  Vec3 t2 = InterpDeriv_xi2(xa, xi_A[i]);
175  t2 = t2 / t2.Norm();
176  Vec3 t3 = t1.Cross(t2);
177  t3 = t3 / t3.Norm();
178  t2 = t3.Cross(t1);
179  iTa_A[i] = (T_A[i]).MulTM(Mat3x3(t1, t2, t3));
180  }
182 }
183 
184 void
186 {
187  Mat3x3 DRot_I_phi_tilde_n_MT_T_overline[NUMNODES];
188  Mat3x3 Ri, Gammai;
189  for (integer n = 0; n < NUMNODES; n++) {
190  DRot_I_phi_tilde_n_MT_T_overline[n] =
192  }
193  for (integer i = 0; i < NUMIP; i++) {
194  phi_tilde_i[i] = Interp(phi_tilde_n, xi_i[i]);
195  RotManip::RotAndDRot(phi_tilde_i[i], Ri, Gammai);
196  T_i[i] = T_overline * Ri * iTa_i[i];
197  Mat3x3 T_overline_Gamma_tilde_i(T_overline * Gammai);
198  for (int n = 0; n < NUMNODES; n++) {
199  Phi_Delta_i[i][n] = T_overline_Gamma_tilde_i *
200  DRot_I_phi_tilde_n_MT_T_overline[n];
201  }
202  }
203  Vec3 phi_tilde_0 = Interp(phi_tilde_n, xi_0);
204  T_0 = T_overline * RotManip::Rot(phi_tilde_0);
205  for (integer i = 0; i < NUMSSEP; i++) {
206  phi_tilde_A[i] = Interp(phi_tilde_n, xi_A[i]);
207  RotManip::RotAndDRot(phi_tilde_A[i], Ri, Gammai);
208  T_A[i] = T_overline * Ri * iTa_A[i];
209  Mat3x3 T_overline_Gamma_tilde_A(T_overline * Gammai);
210  for (int n = 0; n < NUMNODES; n++) {
211  Phi_Delta_A[i][n] = T_overline_Gamma_tilde_A *
212  DRot_I_phi_tilde_n_MT_T_overline[n];
213  }
214  }
215 }
216 
217 // void
218 // Shell4::ComputeIPSEPRotations(void)
219 // {
220 // for (integer i = 0; i < NUMIP; i++) {
221 // Q_i[i] = T_i[i].MulMT(T_0_i[i]);
222 // }
223 // for (integer i = 0; i < NUMSSEP; i++) {
224 // Q_A[i] = T_A[i].MulMT(T_0_A[i]);
225 // }
226 // }
227 
228 void
230 {
231  Mat3x3 Gamma_I_n_MT_T_overline[NUMNODES];
232  for (integer n = 0; n < NUMNODES; n++) {
233  Gamma_I_n_MT_T_overline[n] = RotManip::DRot_I(phi_tilde_n[n]).MulMT(T_overline);
234  }
235  for (integer i = 0; i < NUMIP; i++) {
236  Vec3 phi_tilde_1_i(Zero3);
237  Vec3 phi_tilde_2_i(Zero3);
238  InterpDeriv(phi_tilde_n, L_alpha_beta_i[i], phi_tilde_1_i, phi_tilde_2_i);
239  Mat3x3 T_overlineGamma_tilde_i(T_overline * RotManip::DRot(phi_tilde_i[i]));
240  k_1_i[i] = T_overlineGamma_tilde_i * phi_tilde_1_i;
241  k_2_i[i] = T_overlineGamma_tilde_i * phi_tilde_2_i;
242  Mat3x3 tmp1 = T_overline * RotManip::Elle(phi_tilde_i[i], phi_tilde_1_i);
243  Mat3x3 tmp2 = T_overline * RotManip::Elle(phi_tilde_i[i], phi_tilde_2_i);
244  for (int n = 0; n < NUMNODES; n++) {
245  Kappa_delta_i_1[i][n] = tmp1 * Gamma_I_n_MT_T_overline[n] * LI[n](xi_i[i]) +
246  Phi_Delta_i[i][n] * L_alpha_beta_i[i](n + 1, 1);
247  Kappa_delta_i_2[i][n] = tmp2 * Gamma_I_n_MT_T_overline[n] * LI[n](xi_i[i]) +
248  Phi_Delta_i[i][n] * L_alpha_beta_i[i](n + 1, 2);
249  }
250  }
251 }
252 
254  const DofOwner* pDO,
255  const StructNode* pN1, const StructNode* pN2,
256  const StructNode* pN3, const StructNode* pN4,
257 #if 0 // TODO: offset
258  const Vec3& f1, const Vec3& f2,
259  const Vec3& f3, const Vec3& f4,
260 #endif
261  const Mat3x3& R1, const Mat3x3& R2,
262  const Mat3x3& R3, const Mat3x3& R4,
263 #ifdef USE_CL_IN_SHELL
264  const ConstitutiveLaw<vh, fmh>** pDTmp,
265 #else // ! USE_CL_IN_SHELL
266  const fmh& pDTmp,
267  const vh& PreStress,
268 #endif // ! USE_CL_IN_SHELL
269  flag fOut)
270 :
271 Elem(uL, fOut),
272 Shell(uL, pDO, fOut),
273 
274 S_alpha_beta_0(2, 2),
275 S_alpha_beta_i(NUMIP, fmh(2, 2) ),
276 S_alpha_beta_A(NUMSSEP, fmh(2, 2) ),
277 
278 L_alpha_beta_i(NUMIP, fmh(4, 2) ),
279 L_alpha_beta_A(NUMSSEP, fmh(4, 2) ),
280 
281 B_overline_i(NUMIP, fmh(12, 24) ),
282 D_overline_i(NUMIP, fmh(15, 24) ),
283 G_i(NUMIP, fmh(15, 15) ),
284 
285 P_i(NUMIP, fmh(12, iGetNumDof()) ),
286 
287 K_beta_beta_i(NUMIP, fmh(iGetNumDof(), iGetNumDof()) ),
288 
289 beta(iGetNumDof()),
290 epsilon_hat(12),
291 epsilon(12),
292 
293 #ifndef USE_CL_IN_SHELL
294 bPreStress(PreStress.Norm() > 0.),
295 PreStress(PreStress),
296 #endif // ! USE_CL_IN_SHELL
297 
298 DRef(NUMIP, fmh(12, 12)),
299 stress_i(NUMIP, vh(12))
300 {
301 #ifdef USE_CL_IN_SHELL
302  for (integer i = 0; i < NUMIP; i++) {
303  pD[i] = 0;
306  ConstitutiveLawOwnerType(pDTmp[i]));
307  }
308 #else // ! USE_CL_IN_SHELL
309  for (unsigned i = 0; i < NUMIP; i++) {
310  DRef[i] = pDTmp;
311  }
312 #endif // ! USE_CL_IN_SHELL
313 
314  pNode[NODE1] = pN1;
315  pNode[NODE2] = pN2;
316  pNode[NODE3] = pN3;
317  pNode[NODE4] = pN4;
318 // f[NODE1] = f1;
319 // f[NODE2] = f2;
320 // f[NODE3] = f3;
321 // f[NODE4] = f4;
323 // UpdateNodalAndAveragePosAndOrientation();
324 // InterpolateOrientation();
325  // copy ref values
327  T_0_0 = T_0;
328  for (integer i = 0; i < NUMNODES; i++) {
329  xa_0[i] = xa[i];
330  }
331  for (integer i = 0; i < NUMIP; i++) {
332  T_0_i[i] = T_i[i];
333  }
334  for (integer i = 0; i < NUMSSEP; i++) {
335  T_0_A[i] = T_A[i];
336  }
337 
338 
339  fmh M_0(4, 4);
340  fmh M_0_Inv(4, 4);
341  {
342  Vec3 x_1 = InterpDeriv_xi1(xa, xi_0);
343  Vec3 x_2 = InterpDeriv_xi2(xa, xi_0);
344  S_alpha_beta_0(1, 1) = T_0_0.GetCol(1) * x_1;
345  S_alpha_beta_0(2, 1) = T_0_0.GetCol(2) * x_1;
346  S_alpha_beta_0(1, 2) = T_0_0.GetCol(1) * x_2;
347  S_alpha_beta_0(2, 2) = T_0_0.GetCol(2) * x_2;
348  alpha_0 = S_alpha_beta_0(1, 1) * S_alpha_beta_0(2, 2) -
349  S_alpha_beta_0(1, 2) * S_alpha_beta_0(2, 1);
350 
351  M_0(1, 1) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(1, 1);
352  M_0(1, 2) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(1, 2);
353  M_0(1, 3) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(1, 1);
354  M_0(1, 4) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(1, 2);
355 
356  M_0(2, 1) = S_alpha_beta_0(2, 1) * S_alpha_beta_0(2, 1);
357  M_0(2, 2) = S_alpha_beta_0(2, 2) * S_alpha_beta_0(2, 2);
358  M_0(2, 3) = S_alpha_beta_0(2, 2) * S_alpha_beta_0(2, 1);
359  M_0(2, 4) = S_alpha_beta_0(2, 1) * S_alpha_beta_0(2, 2);
360 
361  M_0(3, 1) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(2, 1);
362  M_0(3, 2) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(2, 2);
363  M_0(3, 3) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(2, 2);
364  M_0(3, 4) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(2, 1);
365 
366  M_0(4, 1) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(2, 1);
367  M_0(4, 2) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(2, 2);
368  M_0(4, 3) = S_alpha_beta_0(1, 2) * S_alpha_beta_0(2, 1);
369  M_0(4, 4) = S_alpha_beta_0(1, 1) * S_alpha_beta_0(2, 2);
370 
371  Inv4x4(M_0, M_0_Inv);
372  }
373 
374  for (integer i = 0; i < NUMIP; i++) {
375  fmh L_alpha_B_i(4, 2);
376  Vec3 x_1 = InterpDeriv_xi1(xa, xi_i[i]);
377  Vec3 x_2 = InterpDeriv_xi2(xa, xi_i[i]);
378  S_alpha_beta_i[i](1, 1) = T_0_i[i].GetCol(1) * x_1;
379  S_alpha_beta_i[i](2, 1) = T_0_i[i].GetCol(2) * x_1;
380  S_alpha_beta_i[i](1, 2) = T_0_i[i].GetCol(1) * x_2;
381  S_alpha_beta_i[i](2, 2) = T_0_i[i].GetCol(2) * x_2;
382  // alpha_i = det(S_alpha_beta_i)
383  alpha_i[i] = S_alpha_beta_i[i](1, 1) * S_alpha_beta_i[i](2, 2) -
384  S_alpha_beta_i[i](1, 2) * S_alpha_beta_i[i](2, 1);
385 
386  // xi_i_i = S_alpha_beta_i^{-1}
387  FullMatrixHandler xi_i_i(2, 2);
388  Inv2x2(S_alpha_beta_i[i], xi_i_i);
389 
390  for (integer n = 0; n < NUMNODES; n++) {
391  for (integer ii = 0; ii < 2; ii++) {
392  L_alpha_B_i(n + 1, ii + 1) = LI_J[n][ii](xi_i[i]);
393  }
394  }
395 
396  L_alpha_B_i.MatMatMul(L_alpha_beta_i[i], xi_i_i);
397 
398  fmh H(4, iGetNumDof());
399  doublereal t = xi_i[i][0] * xi_i[i][1];
400  H(1, 1) = xi_i[i][0];
401  H(1, 2) = t;
402 
403  H(2, 3) = xi_i[i][1];
404  H(2, 4) = t;
405 
406  H(3, 5) = xi_i[i][0];
407  H(3, 6) = t;
408 
409  H(4, 7) = xi_i[i][1];
410  H(4, 6) = t;
411 
412 // M_0_Inv.MatTMatMul(P_i[i], H);
413 // P_i[i].ScalarMul(alpha_0 / alpha_i[i]);
414 //
415 // //////////////
416  fmh Perm(12, 4), tmpP(4, iGetNumDof());
417  // 1, 5, 4, 2, 3, 6
418  Perm(1, 1) = 1.;
419  Perm(2, 3) = 1.;
420  Perm(4, 4) = 1.;
421  Perm(5, 2) = 1.;
422 
423  M_0_Inv.MatTMatMul(tmpP, H);
424  Perm.MatMatMul(P_i[i], tmpP);
425  P_i[i].ScalarMul(alpha_0 / alpha_i[i]);
426 
427  }
428  // save initial axial values
430  for (integer i = 0; i < NUMIP; i++) {
431  InterpDeriv(xa, L_alpha_beta_i[i], y_i_1[i], y_i_2[i]);
432  eps_tilde_1_0_i[i] = T_i[i].MulTV(y_i_1[i]);
433  eps_tilde_2_0_i[i] = T_i[i].MulTV(y_i_2[i]);
434  k_tilde_1_0_i[i] = T_i[i].MulTV(k_1_i[i]);
435  k_tilde_2_0_i[i] = T_i[i].MulTV(k_2_i[i]);
436  }
437  for (integer i = 0; i < NUMSSEP; i++) {
438  fmh L_alpha_B_A(4, 2);
439  Vec3 x_1 = InterpDeriv_xi1(xa, xi_A[i]);
440  Vec3 x_2 = InterpDeriv_xi2(xa, xi_A[i]);
441  S_alpha_beta_A[i](1, 1) = T_0_A[i].GetCol(1) * x_1;
442  S_alpha_beta_A[i](2, 1) = T_0_A[i].GetCol(2) * x_1;
443  S_alpha_beta_A[i](1, 2) = T_0_A[i].GetCol(1) * x_2;
444  S_alpha_beta_A[i](2, 2) = T_0_A[i].GetCol(2) * x_2;
445 
446  Vec3 y_A_1;
447  Vec3 y_A_2;
448  InterpDeriv(xa, L_alpha_beta_A[i], y_A_1, y_A_2);
449  eps_tilde_1_0_A[i] = T_A[i].MulTV(y_A_1);
450  eps_tilde_2_0_A[i] = T_A[i].MulTV(y_A_2);
451 
452  // xi_A_i = S_alpha_beta_A^{-1}
453  FullMatrixHandler xi_A_i(2, 2);
454  Inv2x2(S_alpha_beta_A[i], xi_A_i);
455 
456  for (integer n = 0; n < NUMNODES; n++) {
457  for (integer ii = 0; ii < 2; ii++) {
458  L_alpha_B_A(n + 1, ii + 1) = LI_J[n][ii](xi_A[i]);
459  }
460  }
461 
462  L_alpha_B_A.MatMatMul(L_alpha_beta_A[i], xi_A_i);
463 
464  }
465  {
466  Vec3 y_A_1;
467  Vec3 y_A_2;
468  for (integer i = 0; i < NUMSSEP; i++) {
469  InterpDeriv(xa, L_alpha_beta_A[i], y_A_1, y_A_2);
470  eps_tilde_1_0_A[i] = T_A[i].MulTV(y_A_1);
471  eps_tilde_2_0_A[i] = T_A[i].MulTV(y_A_2);
472  }
473  }
474 }
475 
477 {
478 #ifdef USE_CL_IN_SHELL
479  for (integer i = 0; i < NUMIP; i++) {
480  ASSERT(pD[i] != 0);
481  if (pD[i] != 0) {
482  SAFEDELETE(pD[i]);
483  }
484  }
485 #endif // USE_CL_IN_SHELL
486 }
487 
489  doublereal dCoef,
490  const VectorHandler& XCurr,
491  const VectorHandler& XPrimeCurr)
492 {
493  /* Dimensiona e resetta la matrice di lavoro */
494  integer iNumRows = 0;
495  integer iNumCols = 0;
496  WorkSpaceDim(&iNumRows, &iNumCols);
497  WorkVec.ResizeReset(iNumRows);
498 
499  /* Recupera e setta gli indici */
500  for (integer i = 0; i < 4; i++) {
501  integer iNodeFirstMomIndex = pNode[i]->iGetFirstMomentumIndex();
502  for (int iCnt = 1; iCnt <= 6; iCnt++) {
503  WorkVec.PutRowIndex(iCnt + 6 * i, iNodeFirstMomIndex + iCnt);
504  }
505  }
506 
507  integer iFirstReactionIndex = iGetFirstIndex();
508  for (unsigned int iCnt = 1; iCnt <= iGetNumDof(); iCnt++) {
509  WorkVec.PutRowIndex(24 + iCnt, iFirstReactionIndex + iCnt);
510  }
511 
514 // ComputeIPSEPRotations();
515  for (unsigned int i = 1; i <= iGetNumDof(); i++) {
516  beta(i) = XCurr(iFirstReactionIndex + i);
517  }
518 
519 
521  for (integer i = 0; i < NUMIP; i++) {
522  InterpDeriv(xa, L_alpha_beta_i[i], y_i_1[i], y_i_2[i]);
523  eps_tilde_1_i[i] = T_i[i].MulTV(y_i_1[i]) - eps_tilde_1_0_i[i];
524  eps_tilde_2_i[i] = T_i[i].MulTV(y_i_2[i]) - eps_tilde_2_0_i[i];
525  k_tilde_1_i[i] = T_i[i].MulTV(k_1_i[i]) - k_tilde_1_0_i[i];
526  k_tilde_2_i[i] = T_i[i].MulTV(k_2_i[i]) - k_tilde_2_0_i[i];
527  // parte variabile di B_overline_i
528  for (integer n = 0; n < NUMNODES; n++) {
529  Mat3x3 Phi_Delta_i_n_LI_i = Phi_Delta_i[i][n] * LI[n](xi_i[i]);
530 
531  // delta epsilon_tilde_1_i
532  B_overline_i[i].PutT(1, 1 + 6 * n, T_i[i] * L_alpha_beta_i[i](n + 1, 1));
533  B_overline_i[i].Put(1, 4 + 6 * n, T_i[i].MulTM(Mat3x3(MatCross, y_i_1[i])) * Phi_Delta_i_n_LI_i);
534 
535  // delta epsilon_tilde_2_i
536  B_overline_i[i].PutT(4, 1 + 6 * n, T_i[i] * L_alpha_beta_i[i](n + 1, 2));
537  B_overline_i[i].Put(4, 4 + 6 * n, T_i[i].MulTM(Mat3x3(MatCross, y_i_2[i])) * Phi_Delta_i_n_LI_i);
538 
539  // delta k_tilde_1_i
540  Vec3 phi_tilde_1_i(Zero3);
541  Vec3 phi_tilde_2_i(Zero3);
542  InterpDeriv(phi_tilde_n, L_alpha_beta_i[i], phi_tilde_1_i, phi_tilde_2_i);
543  B_overline_i[i].Put(7, 4 + 6 * n,
544  T_i[i].MulTM(Mat3x3(MatCross, k_1_i[i])) * Phi_Delta_i_n_LI_i
545  +
546  T_i[i].MulTM(Kappa_delta_i_1[i][n])
547  );
548 
549  // delta k_tilde_2_i
550  B_overline_i[i].Put(10, 4 + 6 * n,
551  T_i[i].MulTM(Mat3x3(MatCross, k_2_i[i])) * Phi_Delta_i_n_LI_i
552  +
553  T_i[i].MulTM(Kappa_delta_i_2[i][n])
554  );
555 
556  // delta y_alpha_1
557  D_overline_i[i].Put(1, 1 + n * 6, mb_deye<Mat3x3>(L_alpha_beta_i[i](n + 1, 1)));
558 
559  // delta y_alpha_2
560  D_overline_i[i].Put(4, 1 + n * 6, mb_deye<Mat3x3>(L_alpha_beta_i[i](n + 1, 2)));
561 
562  // delta k_1_i
563  D_overline_i[i].Put(7, 4 + n * 6, Kappa_delta_i_1[i][n]);
564 
565  // delta k_1_i
566  D_overline_i[i].Put(10, 4 + n * 6, Kappa_delta_i_2[i][n]);
567 
568  // phi_delta
569  D_overline_i[i].Put(13, 4 + n * 6, Phi_Delta_i_n_LI_i);
570  }
571  }
572  // ANS
573  {
574  fmh B_overline_A(6, 24);
575  Vec3 y_A_1;
576  Vec3 y_A_2;
577  fmh B_overline_3_ABCD(4, 24);
578  fmh B_overline_6_ABCD(4, 24);
579  for (integer i = 0; i < NUMSSEP; i++) {
580  B_overline_A.Reset();
581  InterpDeriv(xa, L_alpha_beta_A[i], y_A_1, y_A_2);
582  eps_tilde_1_A[i] = T_A[i].MulTV(y_A_1) - eps_tilde_1_0_A[i];
583  eps_tilde_2_A[i] = T_A[i].MulTV(y_A_2) - eps_tilde_2_0_A[i];
584  for (integer n = 0; n < NUMNODES; n++) {
585  Mat3x3 Phi_Delta_A_n_LI_i = Phi_Delta_A[i][n] * LI[n](xi_A[i]);
586 
587  // delta epsilon_tilde_1_A
588  B_overline_A.PutT(1, 1 + 6 * n, T_A[i] * L_alpha_beta_A[i](n + 1, 1));
589  B_overline_A.Put(1, 4 + 6 * n,
590  T_A[i].MulTM(Mat3x3(MatCross, y_A_1)) * Phi_Delta_A_n_LI_i
591  );
592 
593  // delta epsilon_tilde_2_A
594  B_overline_A.PutT(4, 1 + 6 * n, T_A[i] * L_alpha_beta_A[i](n + 1, 2));
595  B_overline_A.Put(4, 4 + 6 * n,
596  T_A[i].MulTM(Mat3x3(MatCross, y_A_2)) * Phi_Delta_A_n_LI_i
597  );
598  }
599 #if 0
600  CopyMatrixRow(B_overline_3_ABCD, i + 1, B_overline_A, 3);
601  CopyMatrixRow(B_overline_6_ABCD, i + 1, B_overline_A, 6);
602 #endif
603  B_overline_3_ABCD.CopyMatrixRow(i + 1, B_overline_A, 3);
604  B_overline_6_ABCD.CopyMatrixRow(i + 1, B_overline_A, 6);
605  }
606  fmh tmp_B_ANS(1, 24);
607  for (integer i = 0; i < NUMIP; i++) {
608  FullMatrixHandler sh1(1, 4);
609  FullMatrixHandler sh2(1, 4);
610  sh1(1, 1) = (1. + xi_i[i][1]) * 0.5;
611  sh1(1, 3) = (1. - xi_i[i][1]) * 0.5;
612  sh2(1, 4) = (1. + xi_i[i][0]) * 0.5;
613  sh2(1, 2) = (1. - xi_i[i][0]) * 0.5;
614 
615  eps_tilde_1_i[i](3) =
616  sh1(1, 1) * eps_tilde_1_A[0](3) +
617  sh1(1, 3) * eps_tilde_1_A[2](3)
618  ;
619  eps_tilde_2_i[i](3) =
620  sh2(1, 2) * eps_tilde_2_A[1](3) +
621  sh2(1, 4) * eps_tilde_2_A[3](3)
622  ;
623 
624  sh1.MatMatMul(tmp_B_ANS, B_overline_3_ABCD);
625 #if 0
626  CopyMatrixRow(B_overline_i[i], 3, tmp_B_ANS, 1);
627 #endif
628  B_overline_i[i].CopyMatrixRow(3, tmp_B_ANS, 1);
629 
630  sh2.MatMatMul(tmp_B_ANS, B_overline_6_ABCD);
631 #if 0
632  CopyMatrixRow(B_overline_i[i], 6, tmp_B_ANS, 1);
633 #endif
634  B_overline_i[i].CopyMatrixRow(6, tmp_B_ANS, 1);
635  }
636  }
637 
638  // EAS: B membranali
639 // {
640 // integer tmpidx1[5] = {0, 1, 5, 4, 2};
641 // for (integer i = 0; i < NUMIP; i++) {
642 // for (integer n = 1; n <= 4; n++) {
643 //#if 0
644 // CopyMatrixRow(B_overline_m_i[i], n, B_overline_i[i], tmpidx1[n]);
645 //#endif
646 // B_overline_m_i[i].CopyMatrixRow(n, B_overline_i[i], tmpidx1[n]);
647 // }
648 // }
649 // }
650 
651  /* Calcola le azioni interne */
652  for (integer i = 0; i < NUMIP; i++) {
653  epsilon.Put(1, eps_tilde_1_i[i]);
654  epsilon.Put(4, eps_tilde_2_i[i]);
655  epsilon.Put(7, k_tilde_1_i[i]);
656  epsilon.Put(10, k_tilde_2_i[i]);
657  // TODO: recupera epsilon_hat con l'ordine giusto per qua
658  P_i[i].MatVecMul(epsilon_hat, beta);
659 
660  epsilon += epsilon_hat;
661 #ifdef USE_CL_IN_SHELL
662  pD[i]->Update(epsilon);
663  stress_i[i] = pD[i]->GetF();
664 #else // ! USE_CL_IN_SHELL
665  DRef[i].MatVecMul(stress_i[i], epsilon);
666  if (bPreStress) {
667  stress_i[i] += PreStress;
668  }
669 #endif // ! USE_CL_IN_SHELL
670 
671  Vec3 n1, n2, m1, m2;
672  ExtractVec3(n1, stress_i[i], 1);
673  ExtractVec3(n2, stress_i[i], 4);
674  ExtractVec3(m1, stress_i[i], 7);
675  ExtractVec3(m2, stress_i[i], 10);
676 
677  Mat3x3 Hh;
678  Vec3 Tn1 = T_i[i] * n1;
679  Vec3 Tn2 = T_i[i] * n2;
680  Vec3 Tm1 = T_i[i] * m1;
681  Vec3 Tm2 = T_i[i] * m2;
682  Hh = Tn1.Tens(y_i_1[i]) - mb_deye<Mat3x3>(Tn1.Dot(y_i_1[i]))
683  + Tn2.Tens(y_i_2[i]) - mb_deye<Mat3x3>(Tn2.Dot(y_i_2[i]))
684  + Tm1.Tens(k_1_i[i]) - mb_deye<Mat3x3>(Tm1.Dot(k_1_i[i]))
685  + Tm2.Tens(k_2_i[i]) - mb_deye<Mat3x3>(Tm2.Dot(k_2_i[i]))
686  ;
687 
688  // NOTE: use PutCross()?
689  G_i[i].PutT(1, 13, Mat3x3(MatCross, Tn1));
690  G_i[i].PutT(4, 13, Mat3x3(MatCross, Tn2));
691  G_i[i].Put(13, 7, Mat3x3(MatCross, Tm1));
692  G_i[i].Put(13, 10, Mat3x3(MatCross, Tm2));
693  G_i[i].Put(13, 1, Mat3x3(MatCross, Tn1));
694  G_i[i].Put(13, 4, Mat3x3(MatCross, Tn2));
695  G_i[i].Put(13, 13, Hh);
696  }
697 
698  //Residuo
699  //forze di volume
700  MyVectorHandler rd(24);
701  MyVectorHandler rbeta(iGetNumDof());
702  for (integer i = 0; i < NUMIP; i++) {
703  B_overline_i[i].MatTVecMul(rd, stress_i[i]);
704  P_i[i].MatTVecMul(rbeta, stress_i[i]);
705 
706  AssembleVector(WorkVec, 1, rd, -alpha_i[i] * w_i[i]);
707  AssembleVector(WorkVec, 25, rbeta, -alpha_i[i] * w_i[i] / dCoef);
708  }
709 
710  return WorkVec;
711 }
712 
713 // Jacobian matrix assembly
716  doublereal dCoef,
717  const VectorHandler& XCurr,
718  const VectorHandler& XPrimeCurr)
719 {
720  FullSubMatrixHandler& WM = WorkMat.SetFull();
721 
722  /* Dimensiona e resetta la matrice di lavoro */
723  integer iNumRows = 0;
724  integer iNumCols = 0;
725  WorkSpaceDim(&iNumRows, &iNumCols);
726  WM.ResizeReset(iNumRows, iNumCols);
727 
728  /* Recupera e setta gli indici */
729  integer iFirstReactionIndex = iGetFirstIndex();
730  for (integer i = 0; i < 4; i++) {
731  integer iNodeFirstMomIndex = pNode[i]->iGetFirstMomentumIndex();
732  integer iNodeFirstPosIndex = pNode[i]->iGetFirstPositionIndex();
733  for (int iCnt = 1; iCnt <= 6; iCnt++) {
734  WM.PutRowIndex(iCnt + 6 * i, iNodeFirstMomIndex + iCnt);
735  WM.PutColIndex(iCnt + 6 * i, iNodeFirstPosIndex + iCnt);
736  }
737  }
738  for (unsigned int iCnt = 1; iCnt <= iGetNumDof(); iCnt++) {
739  WM.PutRowIndex(24 + iCnt, iFirstReactionIndex + iCnt);
740  WM.PutColIndex(24 + iCnt, iFirstReactionIndex + iCnt);
741  }
742 
743  // tangente
744 
745  FullMatrixHandler Kg(24, 24);
746  FullMatrixHandler Km(24, 24);
747  FullMatrixHandler K_beta_q(iGetNumDof(), 24);
748  FullMatrixHandler K_beta_beta(iGetNumDof(), iGetNumDof());
749 
750  FullMatrixHandler Ktg(24, 15);
751  FullMatrixHandler Ktm(24, 12);
752 
753  FullMatrixHandler Ktbetaq(iGetNumDof(), 12);
754 
755  FullMatrixHandler C(12, 12);
756  for (integer i = 0; i < NUMIP; i++) {
757  D_overline_i[i].MatTMatMul(Ktg, G_i[i]);
758  Ktg.MatMatMul(Kg, D_overline_i[i]);
759 
760 #ifdef USE_CL_IN_SHELL
761  C = pD[i]->GetFDE();
762 #else // ! USE_CL_IN_SHELL
763  C = DRef[i];
764 #endif // ! USE_CL_IN_SHELL
765 
766  B_overline_i[i].MatTMatMul(Ktm, C);
767 
768  Ktm.MatMatMul(Km, B_overline_i[i]);
769 
770  // extract Cm matrix from C
771 
772  P_i[i].MatTMatMul(Ktbetaq, C);
773  Ktbetaq.MatMatMul(K_beta_q, B_overline_i[i]);
774 
775  Ktbetaq.MatMatMul(K_beta_beta, P_i[i]);
776 
777 // std::cerr << "Kg:\n" << std::fixed << std::setprecision(12) << Kg << std::endl;
778 // std::cerr << "Km:\n" << std::fixed << std::setprecision(12) << Km << std::endl;
779 
780  // AssembleMatrix(WM, 1, 1, Kg, alpha_i[i] * w_i[i] * dCoef);
781 
782  // AssembleMatrix(WM, 1, 1, Km, alpha_i[i] * w_i[i] * dCoef);
783 
784  // AssembleTransposeMatrix(WM, 1, 25, K_beta_q, alpha_i[i] * w_i[i]);
785  // AssembleMatrix(WM, 25, 1, K_beta_q, alpha_i[i] * w_i[i]);
786  // AssembleMatrix(WM, 25, 25, K_beta_beta, alpha_i[i] * w_i[i] / dCoef);
787 
788  WM.Add(1, 1, Kg, alpha_i[i] * w_i[i] * dCoef);
789 
790  WM.Add(1, 1, Km, alpha_i[i] * w_i[i] * dCoef);
791 
792  WM.AddT(1, 25, K_beta_q, alpha_i[i] * w_i[i]);
793  WM.Add(25, 1, K_beta_q, alpha_i[i] * w_i[i]);
794  WM.Add(25, 25, K_beta_beta, alpha_i[i] * w_i[i] / dCoef);
795  }
796  return WorkMat;
797 
798 }
799 
800 // Contribution to restart file
801 std::ostream&
802 Shell4EASANS::Restart(std::ostream& out) const
803 {
804  return out << "# not implemented yet" << std::endl;
805 }
806 
807 // Initial settings
808 void
810  VectorHandler& /* X */ , VectorHandler& /* XP */ ,
812 {
813  NO_OP;
814 }
815 
818  const VectorHandler& XCurr)
819 {
820  WorkMat.SetNullMatrix();
821  return WorkMat;
822 }
823 
826 {
827  WorkVec.Resize(0);
828  return WorkVec;
829 }
830 
831 // Access to nodes
832 const StructNode*
833 Shell4EASANS::pGetNode(unsigned int i) const
834 {
835  ASSERT(i >= 1 && i <= 4);
836  switch (i) {
837  case 1:
838  case 2:
839  case 3:
840  case 4:
841  return pNode[i - 1];
842  default:
844  }
845 }
846 
847 void
849 {
850  if (bToBeOutput()) {
851  if (OH.UseText(OutputHandler::PLATES)) {
852  std::ostream& out = OH.Plates();
853  out << std::setw(8) << GetLabel();
854  // TODO: complete
855  for (integer i = 0; i < NUMIP; i++) {
856  for (integer r = 1; r <= 12; r++) {
857  out << " " << stress_i[i](r);
858  }
859  }
860  out << std::endl;
861  }
862  }
863 }
864 
865 
867 
868 Elem*
870  MBDynParser& HP,
871  const DofOwner* pDO,
872  unsigned int uLabel)
873 {
874  const StructNode* pN[4];
875  Mat3x3 R[4];
876  for (unsigned i = 0; i < 4; i++) {
877  pN[i] = pDM->ReadNode<const StructNode, Node::STRUCTURAL>(HP);
878  ReferenceFrame RF(pN[i]);
879  if (HP.IsKeyWord("orientation")) {
880  R[i] = HP.GetRotRel(RF);
881  } else {
882  R[i] = Eye3;
883  }
884  }
885 
886  /* Prestress and prestrain */
887  Shell::vh PreStress(12);
888  PreStress.Reset();
889 
890 #ifdef USE_CL_IN_SHELL
892 
894 
895  Shell::fmh S(12, 12);
896  for (unsigned ir = 1; ir <= 12; ir++) {
897  for (unsigned ic = 1; ic <= 12; ic++) {
898  S(ir, ic) = HP.GetReal();
899  }
900  }
901 
902  pD[0] = 0;
903  SAFENEWWITHCONSTRUCTOR(pD[0], LEGCLShell, LEGCLShell(pTplDC, PreStress, S));
904 
905  for (unsigned i = 1; i < 4; i++) {
906  pD[i] = pD[0]->Copy();
907  }
908 #else // ! USE_CL_IN_SHELL
909  Shell::fmh pD(12, 12);
910 
911  if (ReadShellConstLaw(HP, pD, PreStress)) {
912  silent_cerr("Shell(" << uLabel << "): unable to read constitutive law" << std::endl);
914  }
915 #endif // ! USE_CL_IN_SHELL
916 
917  flag fOut = pDM->fReadOutput(HP, Elem::PLATE);
918 
919  Elem *pEl = 0;
921  Shell4EASANS(uLabel, pDO,
922  pN[0], pN[1], pN[2], pN[3],
923  R[0], R[1], R[2], R[3],
924 #ifdef USE_CL_IN_SHELL
925 #else // ! USE_CL_IN_SHELL
926  pD, PreStress,
927 #endif // ! USE_CL_IN_SHELL
928  fOut));
929 
930  std::ostream& out = pDM->GetLogFile();
931  out << "shell4: " << uLabel
932  << " " << pN[0]->GetLabel()
933  << " " << pN[1]->GetLabel()
934  << " " << pN[2]->GetLabel()
935  << " " << pN[3]->GetLabel()
936  << std::endl;
937 
938  return pEl;
939 }
flag fReadOutput(MBDynParser &HP, const T &t) const
Definition: dataman.h:1064
Mat3x3 Phi_Delta_i[NUMIP][NUMNODES]
Definition: shelleasans.h:191
void PutT(integer iRow, integer iCol, const FullMatrixHandler &source)
Definition: fullmh.cc:1338
Mat3x3 GetRotRel(const ReferenceFrame &rf)
Definition: mbpar.cc:1795
static doublereal xi_0[2]
Definition: shelleasans.h:142
Vec3 eps_tilde_2_A[NUMSSEP]
Definition: shelleasans.h:221
void PutColIndex(integer iSubCol, integer iCol)
Definition: submat.h:325
virtual ~Shell4EASANS(void)
Definition: shelleasans.cc:476
Vec3 y_i_2[NUMIP]
Definition: shelleasans.h:267
Mat3x3 Kappa_delta_i_1[NUMIP][NUMNODES]
Definition: shelleasans.h:193
Vec3 k_1_i[NUMIP]
Definition: shelleasans.h:206
const Vec3 Zero3(0., 0., 0.)
Vec3 Cross(const Vec3 &v) const
Definition: matvec3.h:218
long int flag
Definition: mbdyn.h:43
static doublereal w_i[NUMIP]
Definition: shelleasans.h:117
virtual const Mat3x3 & GetRRef(void) const
Definition: strnode.h:1006
virtual bool bToBeOutput(void) const
Definition: output.cc:890
fmh S_alpha_beta_0
Definition: shelleasans.h:249
#define MBDYN_EXCEPT_ARGS
Definition: except.h:63
Definition: matvec3.h:98
Mat3x3 T_0_A[NUMSSEP]
Definition: shelleasans.h:185
virtual void ResizeReset(integer)
Definition: vh.cc:55
doublereal alpha_0
Definition: shelleasans.h:252
const MatCross_Manip MatCross
Definition: matvec3.cc:639
FullSubMatrixHandler & SetFull(void)
Definition: submat.h:1168
virtual const Mat3x3 & GetRCurr(void) const
Definition: strnode.h:1012
doublereal Norm(void) const
Definition: matvec3.h:263
LinearElasticGenericConstitutiveLaw< Shell::vh, Shell::fmh > LEGCLShell
Definition: shelleasans.cc:866
vfmh S_alpha_beta_A
Definition: shelleasans.h:251
Vec3 y_i_1[NUMIP]
Definition: shelleasans.h:266
doublereal Dot(const Vec3 &v) const
Definition: matvec3.h:243
void Add(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:209
Elem * ReadShell4EASANS(DataManager *pDM, MBDynParser &HP, const DofOwner *pDO, unsigned int uLabel)
Definition: shelleasans.cc:869
Mat3x3 DRot(const Vec3 &phi)
Definition: Rot.cc:74
static doublereal xi_i[NUMIP][2]
Definition: shelleasans.h:116
void Put(integer iRow, integer iCol, const FullMatrixHandler &source)
Definition: fullmh.cc:1113
Shell4EASANS(unsigned int uL, const DofOwner *pDO, const StructNode *pN1, const StructNode *pN2, const StructNode *pN3, const StructNode *pN4, const Mat3x3 &R1, const Mat3x3 &R2, const Mat3x3 &R3, const Mat3x3 &R4, const fmh &pDTmp, const vh &PreStress, flag fOut)
Definition: shelleasans.cc:253
Vec3 xa_0[NUMNODES]
Definition: shelleasans.h:162
virtual SubVectorHandler & AssRes(SubVectorHandler &WorkVec, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: shelleasans.cc:488
Vec3 k_tilde_2_0_i[NUMIP]
Definition: shelleasans.h:226
const Mat3x3 Eye3(1., 0., 0., 0., 1., 0., 0., 0., 1.)
void CopyMatrixRow(integer dest_row, const FullMatrixHandler &source, integer source_row)
Definition: fullmh.cc:2301
Vec3 GetCol(unsigned short int i) const
Definition: matvec3.h:903
Mat3x3 Phi_Delta_A[NUMIP][NUMNODES]
Definition: shelleasans.h:192
Vec3 k_tilde_1_0_i[NUMIP]
Definition: shelleasans.h:225
Mat3x3 T_A[NUMSSEP]
Definition: shelleasans.h:189
Vec3 k_tilde_2_i[NUMIP]
Definition: shelleasans.h:229
vfmh L_alpha_beta_i
Definition: shelleasans.h:254
vfmh S_alpha_beta_i
Definition: shelleasans.h:250
virtual void Put(integer iRow, const Vec3 &v)
Definition: vh.cc:699
Mat3x3 mb_deye< Mat3x3 >(const doublereal d)
Definition: matvec3.h:1584
#define NO_OP
Definition: myassert.h:74
std::vector< Hint * > Hints
Definition: simentity.h:89
void ComputeInitialNodeOrientation()
Definition: shelleasans.cc:138
Vec3 xa[NUMNODES]
Definition: shelleasans.h:163
virtual SubVectorHandler & InitialAssRes(SubVectorHandler &WorkVec, const VectorHandler &XCurr)
Definition: shelleasans.cc:825
void AddT(integer iRow, integer iCol, const Vec3 &v)
Definition: submat.cc:227
Vec3 VecRot(const Mat3x3 &Phi)
Definition: Rot.cc:136
void InterpolateOrientation()
Definition: shelleasans.cc:185
Vec3 phi_tilde_0
Definition: shelleasans.h:174
Vec3 MulTV(const Vec3 &v) const
Definition: matvec3.cc:482
Mat3x3 T_i[NUMIP]
Definition: shelleasans.h:188
vfmh D_overline_i
Definition: shelleasans.h:259
virtual void PutRowIndex(integer iSubRow, integer iRow)=0
doublereal alpha_i[NUMIP]
Definition: shelleasans.h:253
Vec3 eps_tilde_1_0_A[NUMSSEP]
Definition: shelleasans.h:215
Vec3 eps_tilde_2_i[NUMIP]
Definition: shelleasans.h:219
Mat3x3 iTa_A[NUMSSEP]
Definition: shelleasans.h:167
const Mat3x3 Zero3x3(0., 0., 0., 0., 0., 0., 0., 0., 0.)
virtual const StructNode * pGetNode(unsigned int i) const
Definition: shelleasans.cc:833
int ReadShellConstLaw(MBDynParser &HP, Shell::fmh &pD, Shell::vh &PreStress)
Definition: shell.cc:62
Vec3 eps_tilde_1_i[NUMIP]
Definition: shelleasans.h:218
Vec3 eps_tilde_1_0_i[NUMIP]
Definition: shelleasans.h:213
virtual VariableSubMatrixHandler & InitialAssJac(VariableSubMatrixHandler &WorkMat, const VectorHandler &XCurr)
Definition: shelleasans.cc:817
Mat3x3 T0_overline
Definition: shelleasans.h:177
virtual unsigned int iGetNumDof(void) const
Definition: shelleasans.h:336
virtual std::ostream & Restart(std::ostream &out) const
Definition: shelleasans.cc:802
vfmh L_alpha_beta_A
Definition: shelleasans.h:255
void SetNullMatrix(void)
Definition: submat.h:1159
virtual bool IsKeyWord(const char *sKeyWord)
Definition: parser.cc:910
Vec3 phi_tilde_i[NUMIP]
Definition: shelleasans.h:172
virtual VariableSubMatrixHandler & AssJac(VariableSubMatrixHandler &WorkMat, doublereal dCoef, const VectorHandler &XCurr, const VectorHandler &XPrimeCurr)
Definition: shelleasans.cc:715
Vec3 phi_tilde_n[NUMNODES]
Definition: shelleasans.h:169
Mat3x3 Rot(const Vec3 &phi)
Definition: Rot.cc:62
virtual integer iGetFirstMomentumIndex(void) const =0
virtual integer iGetFirstPositionIndex(void) const
Definition: strnode.h:452
Vec3 phi_tilde_A[NUMSSEP]
Definition: shelleasans.h:173
Mat3x3 iTa_i[NUMIP]
Definition: shelleasans.h:166
#define ASSERT(expression)
Definition: colamd.c:977
Mat3x3 Tens(const Vec3 &v) const
Definition: matvec3.cc:53
GradientExpression< UnaryExpr< FuncSqrt, Expr > > sqrt(const GradientExpression< Expr > &u)
Definition: gradient.h:2974
Mat3x3 MulTM(const Mat3x3 &m) const
Definition: matvec3.cc:500
virtual void Reset(void)
Definition: vh.cc:459
#define SAFENEWWITHCONSTRUCTOR(pnt, item, constructor)
Definition: mynewmem.h:698
virtual const Vec3 & GetXCurr(void) const
Definition: strnode.h:310
Mat3x3 Elle(const Vec3 &phi, const Vec3 &a)
Definition: Rot.cc:179
vfmh B_overline_i
Definition: shelleasans.h:257
Mat3x3 T_overline
Definition: shelleasans.h:179
virtual void ResizeReset(integer, integer)
Definition: submat.cc:182
Vec3 eps_tilde_1_A[NUMSSEP]
Definition: shelleasans.h:220
static doublereal xi_n[NUMNODES][2]
Definition: shelleasans.h:140
Mat3x3 T_0_i[NUMIP]
Definition: shelleasans.h:184
VectorExpression< VectorExpr, N_rows >::ScalarType Norm(const VectorExpression< VectorExpr, N_rows > &u)
Definition: matvec.h:3163
const StructNode * pNode[NUMNODES]
Definition: shelleasans.h:153
virtual void WorkSpaceDim(integer *piNumRows, integer *piNumCols) const
Definition: shelleasans.h:366
Definition: elem.h:75
void PutRowIndex(integer iSubRow, integer iRow)
Definition: submat.h:311
Vec3 eps_tilde_2_0_i[NUMIP]
Definition: shelleasans.h:214
void RotAndDRot(const Vec3 &phi, Mat3x3 &Phi, Mat3x3 &Ga)
Definition: Rot.cc:86
void SetValue(DataManager *pDM, VectorHandler &, VectorHandler &, SimulationEntity::Hints *ph=0)
Definition: shelleasans.cc:809
Mat3x3 iTa[NUMNODES]
Definition: shelleasans.h:165
std::ostream & GetLogFile(void) const
Definition: dataman.h:326
virtual void Output(OutputHandler &OH) const
Definition: shelleasans.cc:848
Vec3 eps_tilde_2_0_A[NUMSSEP]
Definition: shelleasans.h:216
Vec3 k_tilde_1_i[NUMIP]
Definition: shelleasans.h:228
static doublereal xi_A[NUMSSEP][2]
Definition: shelleasans.h:129
void UpdateNodalAndAveragePosAndOrientation()
Definition: shelleasans.cc:116
void ComputeIPCurvature()
Definition: shelleasans.cc:229
Mat3x3 MulMT(const Mat3x3 &m) const
Definition: matvec3.cc:444
virtual integer iGetFirstIndex(void) const
Definition: dofown.h:127
std::ostream & Plates(void) const
Definition: output.h:580
Vec3 k_2_i[NUMIP]
Definition: shelleasans.h:207
double doublereal
Definition: colamd.c:52
long int integer
Definition: colamd.c:51
virtual MatrixHandler & MatMatMul(MatrixHandler &out, const MatrixHandler &in) const
Definition: mh.cc:232
unsigned int GetLabel(void) const
Definition: withlab.cc:62
virtual MatrixHandler & MatTMatMul(MatrixHandler &out, const MatrixHandler &in) const
Definition: mh.cc:241
Node * ReadNode(MBDynParser &HP, Node::Type type) const
Definition: dataman3.cc:2309
ConstitutiveLawOwner< vh, fmh > ConstitutiveLawOwnerType
Definition: shell.h:84
virtual void Resize(integer iNewSize)=0
Mat3x3 DRot_I(const Vec3 &phi)
Definition: Rot.cc:111
Mat3x3 R
Mat3x3 Kappa_delta_i_2[NUMIP][NUMNODES]
Definition: shelleasans.h:194
bool UseText(int out) const
Definition: output.cc:446
Definition: shell.h:63
void Reset(void)
Definition: fullmh.cc:44
#define SAFEDELETE(pnt)
Definition: mynewmem.h:710
virtual doublereal GetReal(const doublereal &dDefval=0.0)
Definition: parser.cc:1056
Mat3x3 T_0_0
Definition: shelleasans.h:183