35#include "Shell7BasePhFi.h"
41#include "equationid.h"
66void Shell7BasePhFi :: initializeFrom(InputRecord &ir,
int priority)
68 Shell7Base :: initializeFrom(ir, priority);
74Shell7BasePhFi :: postInitialize()
76 Shell7Base :: postInitialize();
82Shell7BasePhFi :: giveDofManDofIDMask(
int inode, EquationID ut, IntArray &answer)
const
86 this->giveDofManDofIDMask_u(answer);
87 this->giveDofManDofIDMask_d(answer_d);
88 answer.followedBy(answer_d);
93Shell7BasePhFi :: giveDofManDofIDMask_u(IntArray &answer)
const
95 answer.setValues(7, D_u, D_v, D_w, W_u, W_v, W_w, Gamma);
99Shell7BasePhFi :: giveDofManDofIDMask_d(IntArray &answer)
const
103 int sID = this->domain->giveNextFreeDofID(0);
104 for (
int i = 0; i < numberOfLayers; i++) {
105 answer.followedBy(sID + i);
111Shell7BasePhFi :: computeDamageInLayerAt(
int layer, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
114 FloatArray dVec, dVecRed;
116 this->computeDamageUnknowns(dVec, valueMode, stepN);
118 FloatArray Nvec, lcoords;
119 IntArray indx = computeDamageIndexArray(layer);
121 dVecRed.beSubArrayOf(dVec, indx);
122 this->giveInterpolation()->evalN(Nvec, *gp->giveCoordinates(), FEIElementGeometryWrapper(
this));
125 double d_temp = Nvec.dotProduct(dVecRed);
136Shell7BasePhFi :: computeOldDamageInLayerAt(
int layer, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
139 FloatArray dVec, dVecRed, ddVec;
141 this->computeDamageUnknowns(dVec, valueMode, stepN);
143 this->computeDamageUnknowns(ddVec, VM_Incremental, stepN);
145 dVec.subtract(ddVec);
147 FloatArray Nvec, lcoords;
148 IntArray indx = computeDamageIndexArray(layer);
150 dVecRed.beSubArrayOf(dVec, indx);
151 this->giveInterpolation()->evalN(Nvec, *gp->giveCoordinates(), FEIElementGeometryWrapper(
this));
154 double d_temp = Nvec.dotProduct(dVecRed);
164Shell7BasePhFi :: computeDamageInLayerAt_dist(
int layer,
int index, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
167 FloatArray dVec, dVecRed;
169 this->computeDamageUnknowns(dVec, valueMode, stepN);
171 if (valueMode == VM_Total)
173 dVec.at(index) = dVec.at(index) +
disturB;
174 }
else if (valueMode == VM_Incremental)
176 dVec.at(index) = dVec.at(index) +
disturB/(stepN->giveTimeIncrement());
180 FloatArray Nvec, lcoords;
181 IntArray indx = computeDamageIndexArray(layer);
183 dVecRed.beSubArrayOf(dVec, indx);
184 this->giveInterpolation()->evalN(Nvec, *gp->giveCoordinates(), FEIElementGeometryWrapper(
this));
187 double d_temp = Nvec.dotProduct(dVecRed);
199Shell7BasePhFi :: computeDamageInLayerAt_dist(
int layer,
int index, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
202 FloatArray dVec, dVecRed;
204 this->computeDamageUnknowns(dVec, valueMode, stepN);
206 dVec.at(index) = dVec.at(index) +
disturB;
207 FloatArray Nvec, lcoords;
208 IntArray indx = computeDamageIndexArray(layer);
210 dVecRed.beSubArrayOf(dVec, indx);
211 this->giveInterpolation()->evalN(Nvec, *gp->giveCoordinates(), FEIElementGeometryWrapper(
this));
214 double d_temp = Nvec.dotProduct(dVecRed);
215 if ( d_temp < 0.0 ) {
217 }
else if ( d_temp > 1.0 ) {
226Shell7BasePhFi :: computeDamageIndexArray(
int layer)
228 int numberOfNodes = this->giveNumberOfDofManagers();
230 IntArray indx(numberOfNodes);
232 for (
int i = 1; i <= numberOfNodes; i++)
234 indx.at(i) = layer + (i-1)*this->layeredCS->giveNumberOfLayers();
240Shell7BasePhFi :: computeGInLayer(
int layer, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
244 double d = this->computeOldDamageInLayerAt(layer, gp, valueMode, stepN);
248 return (1.0 - d) * (1.0 - d) + r0;
253Shell7BasePhFi :: computeGInLayer_dist(
int layer,
int indx, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
256 double d = this->computeDamageInLayerAt_dist(layer, indx, gp, valueMode, stepN);
259 return (1.0 - d) * (1.0 - d) + r0;
264Shell7BasePhFi :: computeGprimInLayer(
int layer, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
267 double d = this->computeDamageInLayerAt(layer, gp, valueMode, stepN);
268 return -2.0 * (1.0 - d);
273Shell7BasePhFi :: computeGprimInLayer_dist(
int layer,
int indx, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
276 double d = this->computeDamageInLayerAt_dist(layer, indx, gp, valueMode, stepN);
277 return -2.0 * (1.0 - d);
282Shell7BasePhFi :: computeGbisInLayer(
int layer, GaussPoint *gp, ValueModeType valueMode, TimeStep *stepN)
287 double d = this->computeDamageInLayerAt(layer, gp, valueMode, stepN);
298Shell7BasePhFi :: giveNumberOfDofs()
300 return this->giveNumberOfuDofs() + this->giveNumberOfdDofs();
304Shell7BasePhFi :: giveNumberOfuDofs()
306 return 7 * this->giveNumberOfDofManagers();
310Shell7BasePhFi :: giveNumberOfdDofs()
312 return this->giveNumberOfDofManagers() * this->numberOfLayers;
319Shell7BasePhFi :: computeStiffnessMatrix_uu(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
321 Shell7Base :: computeStiffnessMatrix(answer, rMode, tStep);
326Shell7BasePhFi :: computeStiffnessMatrix_ud(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) {
328 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
329 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
330 int ndofs_d = ndofs - ndofs_u;
332 answer.resize( ndofs_u, ndofs_d);
335 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
337 FloatArray fu(ndofs_u), fd(ndofs_d), ftemp_u, sectionalForces, sectionalForces_dv;
338 FloatArray genEps, genEpsD, solVec, lCoords, Nd;
339 FloatMatrix B, Bd, K_ud(ndofs_u, this->numberOfDofMans), K_temp;
340 this->giveUpdatedSolutionVector(solVec, tStep);
342 IntArray ordering_temp(ndofs_u);
343 for (
int i = 1; i <= ndofs_u; i++ ) {
344 ordering_temp.at(i) = i;
347 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
350 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
351 Material *mat = domain->giveMaterial( this->layeredCS->giveLayerMaterial(layer) );
352 IntArray indx_d = computeDamageIndexArray(layer);
353 FloatArray dVecTotal, dVecLayer, Ddam_Dxi;
355 this->computeDamageUnknowns(dVecTotal, VM_Total, tStep);
356 dVecLayer.beSubArrayOf(dVecTotal, indx_d);
358 for (
int j = 1; j <= iRuleL->giveNumberOfIntegrationPoints(); j++ ) {
359 GaussPoint *gp = iRuleL->getIntegrationPoint(j - 1);
360 lCoords = *gp->giveCoordinates();
361 this->computeBmatrixAt(lCoords, B);
362 this->computeNdvectorAt(lCoords, Nd);
364 this->computeGeneralizedStrainVectorNew(genEpsD, solVec, B);
365 this->computeGeneralizedStrainVectorNew(genEps, solVec, B);
367 double zeta = giveGlobalZcoord( *gp->giveCoordinates() );
368 this->computeSectionalForcesAt(sectionalForces, gp, mat, tStep, genEps, genEpsD, zeta);
371 ftemp_u.beTProductOf(B,sectionalForces);
372 double dV = this->computeVolumeAroundLayer(gp, layer);
373 double Gprim = computeGprimInLayer(layer, gp, VM_Total, tStep);
375 fu.add(dV*Gprim, ftemp_u);
376 K_temp.beDyadicProductOf(fu, Nd);
381 answer.assemble(K_ud, ordering_temp, indx_d);
389Shell7BasePhFi :: computeStiffnessMatrix_du(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep) {
391 answer.resize( this->numberOfDofMans*this->layeredCS->giveNumberOfLayers(), 42 );
397Shell7BasePhFi :: computeStiffnessMatrix_dd(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
402 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
403 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
404 int ndofs_d = ndofs - ndofs_u;
406 answer.resize( ndofs_d, ndofs_d );
409 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
412 FloatMatrix Bd, Nd, temp(this->giveNumberOfDofManagers(),this->giveNumberOfDofManagers());
414 IntArray ordering_temp(ndofs_u);
415 for (
int i = 1; i <= ndofs_u; i++ ) {
416 ordering_temp.at(i) = i;
419 double l = this->giveInternalLength();
420 double g_c = this->giveCriticalEnergy();
421 double kp = this->givePenaltyParameter();
422 double Delta_t = tStep->giveTimeIncrement();
424 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
427 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
428 IntArray indx_d = computeDamageIndexArray(layer);
430 for (
int j = 1; j <= iRuleL->giveNumberOfIntegrationPoints(); j++ ) {
431 GaussPoint *gp = iRuleL->getIntegrationPoint(j - 1);
432 lCoords = *gp->giveCoordinates();
433 this->computeBdmatrixAt(lCoords, Bd);
434 this->computeNdMatrixAt(lCoords, Nd);
436 double Gbis = computeGbisInLayer(layer, gp, VM_Total, tStep);
437 double Psibar = this->computeFreeEnergy( gp, tStep );
438 double dV = this->computeVolumeAroundLayer(gp, layer);
442 double Delta_d = computeDamageInLayerAt(layer, gp, VM_Incremental, tStep);
443 double factorN = -kp * neg_MaCauleyPrime(Delta_d/Delta_t)/Delta_t + g_c / l + Gbis * Psibar;
444 temp.plusProductSymmUpper(Nd, Nd, factorN * dV);
448 double factorB = g_c * l;
449 temp.plusProductSymmUpper(Bd, Bd, factorB * dV);
452 answer.assemble(temp, indx_d, indx_d);
459Shell7BasePhFi :: computeStiffnessMatrix(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
462 IntArray loc_u, loc_d;
463 FloatMatrix ansLocal;
465 loc_u = this->giveOrdering_Disp();
466 loc_d = this->giveOrdering_Damage();
468 int nDofs = this->computeNumberOfDofs();
469 answer.resize( nDofs, nDofs );
472 FloatMatrix answer1, answer2, answer3, answer4, answer5, answer6;
473 this->computeStiffnessMatrix_uu(answer1, rMode, tStep);
475 this->computeStiffnessMatrix_dd(answer4, rMode, tStep);
485 answer3.beTranspositionOf(answer5);
490 answer.assemble( answer1, loc_u, loc_u );
493 answer.assemble( answer4, loc_d, loc_d );
500Shell7BasePhFi :: computeStiffnessMatrixNum_ud(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
503 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
504 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
505 int ndofs_d = ndofs - ndofs_u;
508 answer.resize( ndofs_u, ndofs_d);
511 FloatArray force, force_dist, forceTemp, solVec(42), force_small;
516 computeSectionalForces(force, tStep, solVec, upD);
519 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
520 int numdofMans = this->giveNumberOfDofManagers();
522 for (
int indx = 1; indx <= numberOfLayers*numdofMans; indx++ ) {
523 computeSectionalForces_dist(force_dist, indx, tStep, solVec, upD);
528 force_dist.subtract(force);
532 const IntArray &indxDisp = this->giveOrderingPhFi(Displacement);
534 force_small.beSubArrayOf(force_dist,indxDisp);
536 force_small.times(1/disturB);
537 answer.addSubVectorCol(force_small,1,indx);
542Shell7BasePhFi :: computeStiffnessMatrixNum_dd(FloatMatrix &answer, MatResponseMode rMode, TimeStep *tStep)
545 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
546 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
547 int ndofs_d = ndofs - ndofs_u;
550 answer.resize( ndofs_d, ndofs_d);
553 FloatArray force, force_dist, forceTemp, solVec(42), force_small;
558 computeSectionalForces(force, tStep, solVec, upD);
561 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
562 int numdofMans = this->giveNumberOfDofManagers();
564 for (
int indx = 1; indx <= numberOfLayers*numdofMans; indx++ ) {
565 computeSectionalForces_dist(force_dist, indx, tStep, solVec, upD);
567 force_dist.subtract(force);
571 const IntArray &indxDam = this->giveOrderingPhFi(Damage);
573 force_small.beSubArrayOf(force_dist,indxDam);
575 force_small.times(1/disturB);
576 answer.addSubVectorCol(force_small,1,indx);
581Shell7BasePhFi :: new_computeBulkTangentMatrix(FloatMatrix &answer, FloatArray &solVec, FloatArray &solVecI, FloatArray &solVecJ, MatResponseMode rMode, TimeStep *tStep)
586 FloatMatrix A [ 3 ] [ 3 ], lambdaI [ 3 ], lambdaJ [ 3 ];
587 FloatMatrix L(18,18), B;
590 int ndofs = Shell7BasePhFi :: giveNumberOfuDofs();
591 answer.resize(ndofs, ndofs);
594 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
596 FloatArray genEpsI, genEpsJ, genEps, lCoords;
598 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
599 IntegrationRule *iRule = integrationRulesArray [ layer - 1 ];
600 StructuralMaterial *mat =
static_cast< StructuralMaterial*
>( domain->giveMaterial( this->layeredCS->giveLayerMaterial(layer) ) );
602 for (
int i = 0; i < iRule->giveNumberOfIntegrationPoints(); i++ ) {
603 GaussPoint *gp = iRule->getIntegrationPoint(i);
604 lCoords = *gp->giveCoordinates();
606 this->computeBmatrixAt(lCoords, B, 0, 0);
607 this->computeGeneralizedStrainVectorNew(genEpsI, solVecI, B);
608 this->computeGeneralizedStrainVectorNew(genEpsJ, solVecJ, B);
609 this->computeGeneralizedStrainVectorNew(genEps , solVec , B);
611 Shell7Base :: computeLinearizedStiffness(gp, mat, tStep, A, genEps);
613 double zeta = giveGlobalZcoord( *gp->giveCoordinates() );
614 this->computeLambdaGMatrices(lambdaI, genEpsI, zeta);
615 this->computeLambdaGMatrices(lambdaJ, genEpsJ, zeta);
621 for (
int j = 0; j < 3; j++ ) {
622 for (
int k = 0; k < 3; k++ ) {
623 this->computeTripleProduct(temp, lambdaI [ j ], A [ j ][ k ], lambdaJ [ k ]);
628 this->computeTripleProduct(K, B, L, B);
629 double dV = this->computeVolumeAroundLayer(gp, layer);
630 double g = this->computeGInLayer(layer, gp, VM_Total, tStep);
631 answer.add( g*dV, K );
644 Shell7BasePhFi :: giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
648 case IST_CauchyStressTensor:
649 this->computeCauchyStressVector(answer, gp, tStep);
652 return Element :: giveIPValue(answer, gp, type, tStep);
662Shell7BasePhFi :: giveUpdatedSolutionVector_d(FloatArray &answer, TimeStep *tStep)
668 this->giveDofManDofIDMask_d(dofIdArray);
670 this->computeVectorOfDofIDs(dofIdArray, VM_Total, tStep, temp);
671 answer.assemble( temp, this->giveOrdering(AllInv) );
679Shell7BasePhFi :: computeSectionalForces(FloatArray &answer, TimeStep *tStep, FloatArray &solVec,
int useUpdatedGpRecord)
682 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
683 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
684 int ndofs_d = ndofs - ndofs_u;
686 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
687 double sectionalForces_ds = 0;
688 FloatArray fu(ndofs_u), fd(ndofs_d), ftemp_u, ftemp_d(this->giveNumberOfDofManagers()), sectionalForces, sectionalForces_dv;
689 FloatArray genEps, genEpsD, totalSolVec, lCoords, Nd, f_debug(this->giveNumberOfDofManagers()), F_debug(ndofs_d);
692 totalSolVec = solVec;
693 sectionalForces.resize(2);
694 FloatArray dVecTotal, dVecLayer, Ddam_Dxi, gradd;
695 this->computeDamageUnknowns(dVecTotal, VM_Total, tStep);
701 this->computeStiffnessMatrix_dd(K_dd, TangentStiffness, tStep);
702 F_debug.beProductOf(K_dd, dVecTotal);
704 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
707 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
708 Material *mat = domain->giveMaterial( this->layeredCS->giveLayerMaterial(layer) );
709 IntArray indx_d = computeDamageIndexArray(layer);
710 dVecLayer.beSubArrayOf(dVecTotal, indx_d);
712 for (
int j = 1; j <= iRuleL->giveNumberOfIntegrationPoints(); j++ ) {
713 GaussPoint *gp = iRuleL->getIntegrationPoint(j - 1);
714 lCoords = *gp->giveCoordinates();
715 this->computeBmatrixAt(lCoords, B);
716 this->computeBdmatrixAt(lCoords, Bd);
717 this->computeNdvectorAt(lCoords, Nd);
718 gradd.beProductOf(Bd,dVecLayer);
720 this->computeGeneralizedStrainVectorNew(genEps, totalSolVec, B);
721 double zeta = giveGlobalZcoord( *gp->giveCoordinates() );
724 this->computeSectionalForcesAt(sectionalForces, gp, mat, tStep, genEps, genEps, zeta);
725 ftemp_u.beTProductOf(B,sectionalForces);
726 double dV = this->computeVolumeAroundLayer(gp, layer);
727 double g = this->computeGInLayer(layer, gp, VM_Total, tStep);
728 fu.add(dV*g, ftemp_u);
731 this->computeSectionalForcesAt_d(sectionalForces_ds, sectionalForces_dv, gp, mat, tStep, zeta, layer, gradd);
734 double Psibar = this->computeFreeEnergy( gp, tStep );
735 f_debug.add( -2.0*Psibar*dV, Nd );
737 ftemp_d.add( sectionalForces_ds*dV, Nd );
738 ftemp_d.plusProduct(Bd, sectionalForces_dv, dV);
742 F_debug.assemble(f_debug, indx_d);
743 fd.assemble(ftemp_d, indx_d);
747 answer.resize( ndofs );
749 const IntArray &ordering_disp = this->giveOrderingPhFi(Displacement);
750 const IntArray &ordering_damage = this->giveOrderingPhFi(Damage);
751 answer.assemble(fu, ordering_disp);
752 answer.assemble(fd, ordering_damage);
758Shell7BasePhFi :: computeSectionalForces_dist(FloatArray &answer,
int indx, TimeStep *tStep, FloatArray &solVec,
int useUpdatedGpRecord)
761 int ndofs = Shell7BasePhFi :: giveNumberOfDofs();
762 int ndofs_u = Shell7BasePhFi :: giveNumberOfuDofs();
763 int ndofs_d = ndofs - ndofs_u;
765 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
766 double sectionalForces_ds = 0;
767 FloatArray fu(ndofs_u), fd(ndofs_d), ftemp_u, ftemp_d(this->giveNumberOfDofManagers()), sectionalForces, sectionalForces_dv;
768 FloatArray genEps, genEpsD, totalSolVec, lCoords, Nd;
770 this->giveUpdatedSolutionVector(totalSolVec, tStep);
773 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
775 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
776 Material *mat = domain->giveMaterial( this->layeredCS->giveLayerMaterial(layer) );
777 IntArray indx_d = computeDamageIndexArray(layer);
778 FloatArray dVecTotal, dVecLayer, Ddam_Dxi, gradd;
780 this->computeDamageUnknowns(dVecTotal, VM_Total, tStep);
781 dVecTotal.at(indx) = dVecTotal.at(indx) +
disturB;
782 dVecLayer.beSubArrayOf(dVecTotal, indx_d);
785 for (
int j = 1; j <= iRuleL->giveNumberOfIntegrationPoints(); j++ ) {
786 GaussPoint *gp = iRuleL->getIntegrationPoint(j - 1);
787 lCoords = *gp->giveCoordinates();
788 this->computeBmatrixAt(lCoords, B);
789 this->computeBdmatrixAt(lCoords, Bd);
790 this->computeNdvectorAt(lCoords, Nd);
792 gradd.beProductOf(Bd,dVecLayer);
794 this->computeGeneralizedStrainVectorNew(genEpsD, solVec, B);
795 this->computeGeneralizedStrainVectorNew(genEps, totalSolVec, B);
797 double zeta = giveGlobalZcoord( *gp->giveCoordinates() );
801 this->computeSectionalForcesAt(sectionalForces, gp, mat, tStep, genEps, genEps, zeta);
802 ftemp_u.beTProductOf(B,sectionalForces);
803 double dV = this->computeVolumeAroundLayer(gp, layer);
804 double g = this->computeGInLayer_dist(layer, indx, gp, VM_Total, tStep);
805 fu.add(dV*g, ftemp_u);
809 this->computeSectionalForcesAt_d_dist(sectionalForces_ds, sectionalForces_dv, indx, gp, mat, tStep, zeta, layer, gradd);
811 ftemp_d.add( sectionalForces_ds*dV, Nd );
813 ftemp_d.plusProduct(Bd, sectionalForces_dv, dV);
817 fd.assemble(ftemp_d, indx_d);
821 answer.resize( ndofs );
823 const IntArray &ordering_disp = this->giveOrderingPhFi(Displacement);
824 const IntArray &ordering_damage = this->giveOrderingPhFi(Damage);
825 answer.assemble(fu, ordering_disp);
826 answer.assemble(fd, ordering_damage);
831Shell7BasePhFi :: neg_MaCauley(
double par)
833 return 0.5 * ( abs(par) - par );
837Shell7BasePhFi :: neg_MaCauleyPrime(
double par)
839 return 0.5 * ( abs(par)/(par + 1.0e-12) - 1.0 );
843Shell7BasePhFi :: computeSectionalForcesAt_d(
double §ionalForcesScal, FloatArray §ionalForcesVec, IntegrationPoint *gp,
844 Material *mat, TimeStep *tStep,
double zeta,
int layer, FloatArray &gradd)
847 sectionalForcesVec.zero();
849 double kp = this->givePenaltyParameter();
850 double Delta_t = tStep->giveTimeIncrement();
851 double d = computeDamageInLayerAt(layer, gp, VM_Total, tStep);
852 double Delta_d = computeDamageInLayerAt(layer, gp, VM_Incremental, tStep);
853 double l = this->giveInternalLength();
854 double g_c = this->giveCriticalEnergy();
855 double Gprim = computeGprimInLayer(layer, gp, VM_Total, tStep);
856 double Psibar = this->computeFreeEnergy( gp, tStep );
859 OOFEM_ERROR1(
"Shell7BasePhFi :: computeSectionalForcesAt_d - negative strain energy predicted")
862 sectionalForcesScal = -kp * neg_MaCauley(Delta_d/Delta_t) + g_c / l * d + Gprim * Psibar;
865 sectionalForcesVec.beScaled(g_c*l,gradd);
871Shell7BasePhFi :: computeSectionalForcesAt_d_dist(
double §ionalForcesScal, FloatArray §ionalForcesVec,
int indx, IntegrationPoint *gp,
872 Material *mat, TimeStep *tStep,
double zeta,
int layer, FloatArray &gradd)
877 double kp = this->givePenaltyParameter();
878 double Delta_t = tStep->giveTimeIncrement();
879 double d = computeDamageInLayerAt_dist(layer, indx, gp, VM_Total, tStep);
880 double Delta_d = computeDamageInLayerAt_dist(layer, indx, gp, VM_Incremental, tStep);
881 double l = this->giveInternalLength();
882 double g_c = this->giveCriticalEnergy();
883 double Gprim = computeGprimInLayer_dist(layer, indx, gp, VM_Total, tStep);
884 double Psibar = this->computeFreeEnergy( gp, tStep );
886 sectionalForcesScal = -kp * neg_MaCauley(Delta_d/Delta_t) + g_c / l * d + Gprim * Psibar;
887 sectionalForcesVec.zero();
889 sectionalForcesVec.beScaled(g_c*l,gradd);
896Shell7BasePhFi :: computeBdmatrixAt(FloatArray &lCoords, FloatMatrix &answer)
902 this->fei->evaldNdxi( dNdxi, lCoords, FEIElementGeometryWrapper(
this) );
903 answer.beTranspositionOf(dNdxi);
911Shell7BasePhFi :: computeBdmatrixAt(FloatArray &lCoords, FloatMatrix &answer)
917 this->fei->evaldNdxi( dNdxi, lCoords, FEIElementGeometryWrapper(
this) );
919 FloatMatrix Gcon, Gcon_red, temp;
920 Shell7Base :: evalInitialContravarBaseVectorsAt(lCoords, Gcon);
921 Gcon_red.beSubMatrixOf(Gcon,1,2,1,2);
923 temp.beTranspositionOf(dNdxi);
924 answer.beProductOf(Gcon_red, temp);
931Shell7BasePhFi :: computeNdvectorAt(
const FloatArray &iLocCoords, FloatArray &answer)
935 this->fei->evalN( answer, iLocCoords, FEIElementGeometryWrapper(
this) );
940Shell7BasePhFi :: computeNdMatrixAt(
const FloatArray &iLocCoords, FloatMatrix &answer)
943 this->computeNdvectorAt(iLocCoords, Nvec);
944 answer.resize(1,Nvec.giveSize());
945 for (
int i = 1; i<= Nvec.giveSize(); i++ ){
946 answer.at(1,i) = Nvec.at(i);
956Shell7BasePhFi :: computeVectorOfDofIDs(
const IntArray &dofIdArray, ValueModeType u, TimeStep *stepN, FloatArray &answer)
962 answer.resize( Shell7BasePhFi ::giveNumberOfDofs());
965 for (
int i = 1; i <= numberOfDofMans; i++ ) {
966 DofManager *dMan = this->giveDofManager(i);
967 for (
int j = 1; j <= dofIdArray.giveSize(); j++ ) {
969 if ( dMan->hasDofID( (DofIDItem) dofIdArray.at(j) ) ) {
970 Dof *d = dMan->giveDofWithID( dofIdArray.at(j) );
973 answer.at(k+j) = d->giveUnknown(u, stepN);
987Shell7BasePhFi :: giveShellExportData(ExportRegion &vtkPiece, IntArray &primaryVarsToExport, IntArray &internalVarsToExport, IntArray cellVarsToExport, TimeStep *tStep )
990 int numCells = this->layeredCS->giveNumberOfLayers();
991 const int numCellNodes = 15;
992 int numTotalNodes = numCellNodes*numCells;
994 vtkPiece.setNumberOfCells(numCells);
995 vtkPiece.setNumberOfNodes(numTotalNodes);
997 std::vector <FloatArray> nodeCoords;
1000 IntArray nodes(numCellNodes);
1004 for (
int layer = 1; layer <= numCells; layer++ ) {
1008 this->giveFictiousNodeCoordsForExport(nodeCoords, layer);
1010 for (
int node = 1; node <= numCellNodes; node++ ) {
1011 vtkPiece.setNodeCoords(nodeNum, nodeCoords[node-1] );
1016 for (
int i = 1; i <= numCellNodes; i++ ) {
1017 nodes.at(i) = val++;
1019 vtkPiece.setConnectivity(layer, nodes);
1022 offset += numCellNodes;
1023 vtkPiece.setOffset(layer, offset);
1026 vtkPiece.setCellType(layer, 26);
1031 vtkPiece.setNumberOfPrimaryVarsToExport(primaryVarsToExport, numTotalNodes);
1033 std::vector<FloatArray> updatedNodeCoords;
1034 FloatArray u(3), damage(1);
1035 std::vector<FloatArray> values;
1036 FloatArray dVecTotal, dVecLayer, damageArray;
1037 this->computeDamageUnknowns(dVecTotal, VM_Total, tStep);
1039 for (
int fieldNum = 1; fieldNum <= primaryVarsToExport.giveSize(); fieldNum++ ) {
1042 for (
int layer = 1; layer <= numCells; layer++ ) {
1044 if ( type == DisplacementVector ) {
1045 this->giveFictiousNodeCoordsForExport(nodeCoords, layer);
1046 this->giveFictiousUpdatedNodeCoordsForExport(updatedNodeCoords, layer, tStep);
1047 for (
int j = 1; j <= numCellNodes; j++ ) {
1048 u = updatedNodeCoords[j-1];
1049 u.subtract(nodeCoords[j-1]);
1050 vtkPiece.setPrimaryVarInNode(fieldNum, nodeNum, u);
1053 }
else if ( type == ScalarDamage ) {
1056 IntArray indx_d = computeDamageIndexArray(layer);
1058 dVecLayer.beSubArrayOf(dVecTotal, indx_d);
1059 damageArray.setValues(15, dVecLayer.at(1), dVecLayer.at(2), dVecLayer.at(3), dVecLayer.at(1), dVecLayer.at(2), dVecLayer.at(3),
1060 dVecLayer.at(4), dVecLayer.at(5), dVecLayer.at(6), dVecLayer.at(4), dVecLayer.at(5), dVecLayer.at(6),
1061 dVecLayer.at(1), dVecLayer.at(2), dVecLayer.at(3) );
1062 for (
int j = 1; j <= numCellNodes; j++ ) {
1063 damage.at(1) = damageArray.at(j);
1064 vtkPiece.setPrimaryVarInNode(fieldNum, nodeNum, damage);
1068 NodalRecoveryMI_recoverValues(values, layer, ( InternalStateType ) 1, tStep);
1069 for (
int j = 1; j <= numCellNodes; j++ ) {
1070 vtkPiece.setPrimaryVarInNode(fieldNum, nodeNum, values[j-1]);
1079 vtkPiece.setNumberOfInternalVarsToExport( internalVarsToExport, numTotalNodes );
1080 for (
int fieldNum = 1; fieldNum <= internalVarsToExport.giveSize(); fieldNum++ ) {
1084 for (
int layer = 1; layer <= numCells; layer++ ) {
1085 recoverValuesFromIP(values, layer, type, tStep);
1086 for (
int j = 1; j <= numCellNodes; j++ ) {
1087 vtkPiece.setInternalVarInNode( fieldNum, nodeNum, values[j-1] );
1097 vtkPiece.setNumberOfCellVarsToExport(cellVarsToExport, numCells);
1098 for (
int i = 1; i <= cellVarsToExport.giveSize(); i++ ) {
1101 for (
int layer = 1; layer <= numCells; layer++ ) {
1102 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
1103 VTKXMLExportModule::computeIPAverage(average, iRuleL,
this, type, tStep);
1105 if ( average.giveSize() == 6 ) {
1106 vtkPiece.setCellVar(i, layer, convV6ToV9Stress(average) );
1108 vtkPiece.setCellVar(i, layer, average );
1122Shell7BasePhFi :: recoverValuesFromIP(std::vector<FloatArray> &recoveredValues,
int layer, InternalStateType type, TimeStep *tStep)
1129 FloatMatrix localNodeCoords;
1130 this->interpolationForExport.giveLocalNodeCoords(localNodeCoords);
1132 int numNodes = localNodeCoords.giveNumberOfColumns();
1133 recoveredValues.resize(numNodes);
1135 IntegrationRule *iRule = integrationRulesArray [ layer - 1 ];
1139 IntArray closestIPArray(numNodes);
1140 FloatArray nodeCoords, ipCoords, ipValues;
1142 for (
int i = 1; i <= numNodes; i++ ) {
1143 nodeCoords.beColumnOf(localNodeCoords, i);
1144 double distOld = 3.0;
1145 for (
int j = 0; j < iRule->giveNumberOfIntegrationPoints(); j++ ) {
1146 ip = iRule->getIntegrationPoint(j);
1147 ipCoords = *ip->giveCoordinates();
1148 double dist =
distance(nodeCoords, ipCoords);
1149 if ( dist < distOld ) {
1150 closestIPArray.at(i) = j;
1159 for (
int i = 1; i <= numNodes; i++ ) {
1160 ip = iRule->getIntegrationPoint( closestIPArray.at(i) );
1161 this->giveIPValue(ipValues, ip, type, tStep);
1162 if ( valueType == ISVT_TENSOR_S3 ) {
1163 recoveredValues[i-1].resize(9);
1164 recoveredValues[i-1] = convV6ToV9Stress(ipValues);
1165 }
else if ( ipValues.giveSize() == 0 && type == IST_AbaqusStateVector) {
1166 recoveredValues[i-1].resize(23);
1167 recoveredValues[i-1].zero();
1168 }
else if ( ipValues.giveSize() == 0 ) {
1170 recoveredValues[i-1].zero();
1173 recoveredValues[i-1] = ipValues;
1181Shell7BasePhFi :: recoverShearStress(TimeStep *tStep)
1184 std::vector<FloatArray> recoveredValues;
1185 int numberOfLayers = this->layeredCS->giveNumberOfLayers();
1186 IntegrationRule *iRuleThickness = specialIntegrationRulesArray[ 0 ];
1187 FloatArray dS, Sold;
1188 FloatMatrix B, Smat(2,6);
1190 FloatArray Tcon(6), Trec(6); Tcon.zero(); Trec.zero();
1192 for (
int layer = 1; layer <= numberOfLayers; layer++ ) {
1193 IntegrationRule *iRuleL = integrationRulesArray [ layer - 1 ];
1194 this->recoverValuesFromIP(recoveredValues, layer, IST_StressTensor, tStep);
1196 double thickness = this->layeredCS->giveLayerThickness(layer);
1200 FloatArray aS(numNodes*3);
1201 for (
int j = 1, pos = 0; j <= numNodes; j++, pos+=3 ) {
1202 aS.at(pos + 1) = recoveredValues[j-1].at(1);
1203 aS.at(pos + 2) = recoveredValues[j-1].at(2);
1204 aS.at(pos + 3) = recoveredValues[j-1].at(6);
1206 int numInPlaneIP = 6;
1208 for (
int i = 0; i < iRuleThickness->giveNumberOfIntegrationPoints(); i++ ) {
1209 double dz = thickness * iRuleThickness->getIntegrationPoint(i)->giveWeight();
1211 for (
int j = 0; j < numInPlaneIP; j++ ) {
1213 int point = i*numInPlaneIP + j;
1214 GaussPoint *gp = iRuleL->getIntegrationPoint(point);
1216 this->computeBmatrixForStressRecAt(*gp->giveCoordinates(), B, layer);
1217 dS.beProductOf(B,aS*(-dz));
1219 StructuralMaterialStatus* status =
dynamic_cast< StructuralMaterialStatus*
> ( gp->giveMaterialStatus() );
1220 Sold = status->giveStressVector();
1222 Smat.at(1,j+1) += dS.at(1);
1223 Smat.at(2,j+1) += dS.at(2);
1228 Sold.at(5) = Smat.at(1,j+1);
1229 Sold.at(4) = Smat.at(2,j+1);
1232 status->letStressVectorBe(Sold);
1244Shell7BasePhFi :: computeBmatrixForStressRecAt(FloatArray &lcoords, FloatMatrix &answer,
int layer)
1251 const int numNodes = 15;
1252 std::vector<FloatArray> nodes;
1253 giveFictiousNodeCoordsForExport(nodes, layer);
1255 int VTKWedge2EL [] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
1256 FloatArray *coords[numNodes];
1259 for (
int i = 1; i <= numNodes; i++ ) {
1260 int pos = VTKWedge2EL[ i-1 ];
1261 coords[ i - 1 ] = &nodes[ pos - 1];
1265 FEInterpolation *interpol =
static_cast< FEInterpolation *
>( &this->interpolationForExport );
1267 interpol->evaldNdx( dNdx, lcoords, FEIVertexListGeometryWrapper(numNodes, (
const FloatArray **)coords ) );
1273 int ndofs = numNodes*3;
1274 answer.resize(2, ndofs);
1275 for (
int i = 1, j = 0; i <= numNodes; i++, j += 3 ) {
1276 answer.at(1, j + 1) = dNdx.at(i, 1);
1277 answer.at(1, j + 3) = dNdx.at(i, 2);
1278 answer.at(2, j + 2) = dNdx.at(i, 2);
1279 answer.at(2, j + 3) = dNdx.at(i, 1);
1285std::vector<FloatArray>
1286Shell7BasePhFi :: giveFictiousNodeCoordsForExport(
int layer)
1289 FloatMatrix localNodeCoords;
1290 this->interpolationForExport.giveLocalNodeCoords(localNodeCoords);
1292 nodes.resize(localNodeCoords.giveNumberOfColumns());
1293 for (
int i = 1; i <= localNodeCoords.giveNumberOfColumns(); i++ ){
1294 FloatArray localCoords(3);
1295 localCoords.beColumnOf(localNodeCoords,i);
1297 nodes[i-1] = this->vtkEvalInitialGlobalCoordinateAt(localCoords, layer);
1303std::vector<FloatArray>
1304Shell7BasePhFi :: giveFictiousCZNodeCoordsForExport(
int interface)
1307 FloatMatrix localNodeCoords;
1308 this->interpolationForCZExport.giveLocalNodeCoords(localNodeCoords);
1310 std::vector<FloatArray> nodes(localNodeCoords.giveNumberOfColumns());
1311 for (
int i = 1; i <= localNodeCoords.giveNumberOfColumns(); i++ ){
1312 FloatArray localCoords(3);
1313 localCoords.beColumnOf(localNodeCoords,i);
1315 localCoords.at(3) = 1.0;
1316 nodes[i-1] = this->vtkEvalInitialGlobalCoordinateAt(localCoords, interface);
1322Shell7BasePhFi :: giveFictiousUpdatedNodeCoordsForExport(
int layer, TimeStep *tStep)
1326 FloatMatrix localNodeCoords;
1327 this->interpolationForExport.giveLocalNodeCoords(localNodeCoords);
1328 std::vector<FloatArray> nodes(localNodeCoords.giveNumberOfColumns());
1329 for (
int i = 1; i <= localNodeCoords.giveNumberOfColumns(); i++ ){
1330 FloatArray localCoords;
1331 localCoords.beColumnOf(localNodeCoords,i);
1333 nodes[i-1] = this->vtkEvalUpdatedGlobalCoordinateAt(localCoords, layer, tStep);
GaussPoint IntegrationPoint
int giveInternalStateTypeSize(InternalStateValueType valType)
InternalStateValueType
Determines the type of internal variable.
InternalStateValueType giveInternalStateValueType(InternalStateType type)
double distance(const FloatArray &x, const FloatArray &y)