24 #ifndef _GEMA_PLUGIN_MECHANICAL_PHYSICS_MECHANIC_LARGEDISPLACEMENT_H_ 25 #define _GEMA_PLUGIN_MECHANICAL_PHYSICS_MECHANIC_LARGEDISPLACEMENT_H_ 40 const GmpFemPhysicsCommonMaterialFactory* matFactory,
const GmLogCategory& logger)
41 : T(pluginType, simulation,
id, description, matFactory, logger)
51 assert(e); Q_UNUSED(N); Q_UNUSED(X);
56 int d = GmpFemPhysicsCommon::nodeDim();
71 assert(Bu.n_rows == 2*d && Bu.n_cols == e->
numNodes()*d);
82 if (modeLD ==
"totalLagrangian")
84 for (
int i = 0; i < e->
numNodes(); i++)
89 Bu(0, l) = F(0, 0)*B(0, i);
90 Bu(1, l) = F(0, 1)*B(1, i);
91 Bu(3, l) = F(0, 0)*B(1, i) + F(0, 1)*B(0, i);
93 Bu(0, k) = F(1, 0)*B(0, i);
94 Bu(1, k) = F(1, 1)*B(1, i);
95 Bu(3, k) = F(1, 0)*B(1, i) + F(1, 1)*B(0, i);
98 else if(modeLD ==
"updatedLagrangian")
100 for (
int i = 0; i < e->
numNodes(); i++)
115 if (modeLD ==
"totalLagrangian")
117 for (
int i = 0; i < e->
numNodes(); i++)
123 Bu(0, k) = F(0, 0)*B(0, i);
124 Bu(1, k) = F(0, 1)*B(1, i);
125 Bu(2, k) = F(0, 2)*B(2, i);
126 Bu(3, k) = F(0, 0)*B(1, i) + F(0, 1)*B(0, i);
127 Bu(4, k) = F(0, 2)*B(0, i) + F(0, 0)*B(2, i);
128 Bu(5, k) = F(0, 1)*B(2, i) + F(0, 2)*B(1, i);
130 Bu(0, l) = F(1, 0)*B(0, i);
131 Bu(1, l) = F(1, 1)*B(1, i);
132 Bu(2, l) = F(1, 2)*B(2, i);
133 Bu(3, l) = F(1, 0)*B(1, i) + F(1, 1)*B(0, i);
134 Bu(4, l) = F(1, 2)*B(0, i) + F(1, 0)*B(2, i);
135 Bu(5, l) = F(1, 1)*B(2, i) + F(1, 2)*B(1, i);
137 Bu(0, m) = F(2, 0)*B(0, i);
138 Bu(1, m) = F(2, 1)*B(1, i);
139 Bu(2, m) = F(2, 2)*B(2, i);
140 Bu(3, m) = F(2, 0)*B(1, i) + F(2, 1)*B(0, i);
141 Bu(4, m) = F(2, 2)*B(0, i) + F(2, 0)*B(2, i);
142 Bu(5, m) = F(2, 1)*B(2, i) + F(2, 2)*B(1, i);
145 else if (modeLD ==
"updatedLagrangian")
147 for (
int i = 0; i < e->
numNodes(); i++)
173 assert(e); Q_UNUSED(X); Q_UNUSED(N); Q_UNUSED(F);
178 int d = GmpFemPhysicsCommon::nodeDim();
195 assert(Bnl.n_rows == d * d + 1 && Bnl.n_cols == e->
numNodes()*d);
197 for (
int i = 0; i < e->
numNodes(); i++)
209 assert(Bnl.n_rows == d * d && Bnl.n_cols == e->
numNodes()*d);
211 for (
int i = 0; i < e->
numNodes(); i++)
235 Q_UNUSED(e); Q_UNUSED(X0); Q_UNUSED(Xt); Q_UNUSED(N);
238 assert(F.n_rows == 3 && F.n_cols == 3);
242 int d = GmpFemPhysicsCommon::nodeDim();
255 dXdzeta = J0.submat(0, 1, 1, 2);
256 dXdzeta.each_row() -= J0.submat(2, 1, 2, 2);
259 dxdzeta = Jt.submat(0, 1, 1, 2);
260 dxdzeta.each_row() -= Jt.submat(2, 1, 2, 2);
263 Ftemp = arma::solve(dXdzeta, dxdzeta);
264 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
269 Ftemp = arma::solve(J0, Jt);
270 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
284 dXdzeta = J0.submat(0, 1, 2, 3);
285 dXdzeta.each_row() -= J0.submat(3, 1, 3, 3);
288 dxdzeta = Jt.submat(0, 1, 2, 3);
289 dxdzeta.each_row() -= Jt.submat(3, 1, 3, 3);
292 Ftemp = arma::solve(dXdzeta, dxdzeta);
298 Ftemp = arma::solve(J0, Jt);
305 return arma::det(F) > 0;
313 const GmpFemPhysicsCommonMaterialFactory* matFactory,
const GmLogCategory& logger)
314 : T(pluginType, simulation,
id, description, matFactory, logger)
323 assert(e); Q_UNUSED(N); Q_UNUSED(X);
329 assert(Bu.n_rows == 2 * nodeDim() && Bu.n_cols == e->
numNodes()*nodeDim());
335 assert(nodeDim() == 2);
340 if (modeLD ==
"totalLagrangian")
342 for (
int i = 0; i < e->
numNodes(); i++)
347 Bu(0, l) = F(0, 0)*B(0, i);
348 Bu(1, l) = F(0, 1)*B(1, i);
349 Bu(3, l) = F(0, 0)*B(1, i) + F(0, 1)*B(0, i);
351 Bu(0, k) = F(1, 0)*B(0, i);
352 Bu(1, k) = F(1, 1)*B(1, i);
353 Bu(3, k) = F(1, 0)*B(1, i) + F(1, 1)*B(0, i);
356 else if (modeLD ==
"updatedLagrangian")
358 for (
int i = 0; i < e->
numNodes(); i++)
375 assert(e); Q_UNUSED(X); Q_UNUSED(N); Q_UNUSED(F);
382 assert(nodeDim() == 2);
383 assert(Bnl.n_rows == nodeDim() * nodeDim() + 1 && Bnl.n_cols == e->
numNodes()*nodeDim());
385 for (
int i = 0; i < e->
numNodes(); i++)
399 Q_UNUSED(e); Q_UNUSED(X0); Q_UNUSED(Xt); Q_UNUSED(N);
402 assert(F.n_rows == 3 && F.n_cols == 3);
414 dXdzeta = J0.submat(0, 1, 1, 2);
415 dXdzeta.each_row() -= J0.submat(2, 1, 2, 2);
418 dxdzeta = Jt.submat(0, 1, 1, 2);
419 dxdzeta.each_row() -= Jt.submat(2, 1, 2, 2);
422 Ftemp = arma::solve(dXdzeta, dxdzeta);
423 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
428 Ftemp = arma::solve(J0, Jt);
429 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
435 return arma::det(F) > 0;
439 virtual bool isPlaneStress() {
return true; }
447 const GmpFemPhysicsCommonMaterialFactory* matFactory,
const GmLogCategory& logger)
448 : T(pluginType, simulation,
id, description, matFactory, logger)
464 for (
int j = 0; j < e->
numNodes(); ++j)
465 rGauss += N(j)*X(j, 0);
467 assert(Bu.n_rows == 2 * nodeDim() && Bu.n_cols == e->
numNodes()*nodeDim());
469 GmMatrix L(nodeDim() + 1, nodeDim() + 1);
473 assert(nodeDim() == 2);
478 if (modeLD ==
"totalLagrangian")
480 for (
int i = 0; i < e->
numNodes(); i++)
485 Bu(0, l) = F(0, 0)*B(0, i);
486 Bu(1, l) = F(0, 1)*B(1, i);
487 Bu(2, l) = F(2, 2)*N(i) / rGauss;
488 Bu(3, l) = F(0, 0)*B(1, i) + F(0, 1)*B(0, i);
490 Bu(0, k) = F(1, 0)*B(0, i);
491 Bu(1, k) = F(1, 1)*B(1, i);
492 Bu(3, k) = F(1, 0)*B(1, i) + F(1, 1)*B(0, i);
496 else if (modeLD ==
"updatedLagrangian")
498 for (
int i = 0; i < e->
numNodes(); i++)
504 Bu(2, l) = N(i) / rGauss;
525 for (
int j = 0; j < e->
numNodes(); ++j)
526 rGauss += N(j)*X(j, 0);
528 assert(Bnl.n_rows == 2 * nodeDim() && Bnl.n_cols == e->
numNodes() * nodeDim());
531 assert(nodeDim() == 2);
533 for (
int i = 0; i < e->
numNodes(); i++)
541 Bnl(4, l) = N(i) / rGauss;
553 assert(F.n_rows == 3 && F.n_cols == 3);
559 for (
int j = 0; j < e->
numNodes(); ++j)
561 RGauss += N(j)*X0(j, 0);
562 rGauss += N(j)*Xt(j, 0);
572 dXdzeta = J0.submat(0, 1, 1, 2);
573 dXdzeta.each_row() -= J0.submat(2, 1, 2, 2);
576 dxdzeta = Jt.submat(0, 1, 1, 2);
577 dxdzeta.each_row() -= Jt.submat(2, 1, 2, 2);
580 Ftemp = arma::solve(dXdzeta, dxdzeta);
581 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
586 Ftemp = arma::solve(J0, Jt);
587 F(arma::span(0, 1), arma::span(0, 1)) = Ftemp.t();
591 F.at(2, 2) = rGauss / RGauss;
594 return arma::det(F) > 0;
603 for (
int j = 0; j < n; ++j)
604 rGauss += N(j)*X(j, 0);
605 return 2 * arma::datum::pi *rGauss;
Declaration of the GmpMechanicalPhysics class.
virtual bool DeformationGradient(const GmElement *e, const GmMatrix &X0, const GmMatrix &Xt, const GmVector &N, const GmMatrix &J0, const GmMatrix &Jt, GmMatrix &F)
Fills the F deformation gradient matrix.
Definition: gmpMechanicLargeDisplacement.h:232
Definition: gmpMechanicLargeDisplacement.h:309
virtual void fillBnlMatrix(const GmElement *e, const GmShape *shape, const GmVector &coord, const GmMatrix &X, const GmVector &N, const GmMatrix &J, GmMatrix &Bnl, const GmMatrix &F)
Fills the Bnl strain- displacement matrix for large displacements.
Definition: gmpMechanicLargeDisplacement.h:169
Declaration of the GmpMechanicPoint class.
virtual GmCellType type() const=0
virtual int numNodes() const=0
virtual double shapeCartesianPartialsFromJacobian(const GmVector &ncoord, const GmMatrix &J, GmMatrix &dN, bool transposed=false) const
Id for retrieving the reference large displacement physics attribute.
Definition: gmpMechanicalLargeDisplacementSolid.h:50
Mechanic Axissymetric for Quad and Tri, Elements.
Definition: gmpMechanicLargeDisplacement.h:443
virtual double fillBuMatrix(const GmElement *e, const GmShape *shape, const GmVector &coord, const GmMatrix &X, const GmVector &N, const GmMatrix &J, GmMatrix &Bu, const GmMatrix &F)
Fills the Bu strain- displacement matrix for large displacements.
Definition: gmpMechanicLargeDisplacement.h:47
Mechanic 2D & 3D for Quad, Tri, Hex and Tet Elements.
Definition: gmpMechanicLargeDisplacement.h:36