void TrabBoneNL3D :: giveRealStressVector_3d(FloatArray &answer, GaussPoint *gp, const FloatArray &totalStrain, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); this->initTempStatus(gp); double tempDam; FloatArray effStress, totalStress, densStress; performPlasticityReturn(gp, totalStrain, tStep); tempDam = computeDamage(gp, tStep); effStress = nlStatus->giveTempEffectiveStress(); totalStress = ( 1 - tempDam ) * effStress; for ( int i = 1; i <= 6; i++ ) { if ( sqrt( totalStress.at(i) * totalStress.at(i) ) < 1e-8 ) { totalStress.at(i) = 0.; } } computePlasStrainEnerDensity(gp, totalStrain, totalStress); if ( densCrit != 0. ) { computeDensificationStress(densStress, gp, totalStrain, tStep); answer.add(densStress); } answer = totalStress; nlStatus->setTempDam(tempDam); nlStatus->letTempStrainVectorBe(totalStrain); nlStatus->letTempStressVectorBe(answer); }
std :: list< localIntegrationRecord > * TrabBoneNL3D :: NonlocalMaterialStiffnessInterface_giveIntegrationDomainList(GaussPoint *gp) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); this->buildNonlocalPointTable(gp); return nlStatus->giveIntegrationDomainList(); }
void TrabBoneNL3D :: NonlocalMaterialStiffnessInterface_addIPContribution(SparseMtrx &dest, const UnknownNumberingScheme &s, GaussPoint *gp, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); std :: list< localIntegrationRecord > *list = nlStatus->giveIntegrationDomainList(); TrabBoneNL3D *rmat; double coeff; FloatArray rcontrib, lcontrib; IntArray loc, rloc; FloatMatrix contrib; if ( this->giveLocalNonlocalStiffnessContribution(gp, loc, s, lcontrib, tStep) == 0 ) { return; } for ( auto &lir: *list ) { rmat = dynamic_cast< TrabBoneNL3D * >( lir.nearGp->giveMaterial() ); if ( rmat ) { rmat->giveRemoteNonlocalStiffnessContribution(lir.nearGp, rloc, s, rcontrib, tStep); coeff = gp->giveElement()->computeVolumeAround(gp) * lir.weight / nlStatus->giveIntegrationScale(); contrib.clear(); contrib.plusDyadUnsym(lcontrib, rcontrib, - 1.0 * coeff); dest.assemble(loc, rloc, contrib); } } }
void TrabBoneNL3D :: updateBeforeNonlocAverage(const FloatArray &strainVector, GaussPoint *gp, TimeStep *tStep) { FloatArray SDstrainVector; double cumPlastStrain; TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); this->initTempStatus(gp); this->giveStressDependentPartOfStrainVector(SDstrainVector, gp, strainVector, tStep, VM_Total); nlStatus->letTempStrainVectorBe(strainVector); this->performPlasticityReturn(gp, strainVector, tStep); this->computeLocalCumPlastStrain(cumPlastStrain, strainVector, gp, tStep); nlStatus->setLocalCumPlastStrainForAverage(cumPlastStrain); }
int TrabBoneNL3D :: giveLocalNonlocalStiffnessContribution(GaussPoint *gp, IntArray &loc, const UnknownNumberingScheme &s, FloatArray &lcontrib, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); StructuralElement *elem = static_cast< StructuralElement * >( gp->giveElement() ); int nrows, nsize; double sum, nlKappa, dDamFunc, dam, tempDam; FloatArray localNu; FloatMatrix b; this->computeCumPlastStrain(nlKappa, gp, tStep); dam = nlStatus->giveDam(); tempDam = nlStatus->giveTempDam(); if ( ( tempDam - dam ) > 0.0 ) { elem->giveLocationArray(loc, s); localNu = nlStatus->giveTempEffectiveStress(); elem->giveLocationArray(loc, EModelDefaultEquationNumbering() ); elem->computeBmatrixAt(gp, b); dDamFunc = expDam * critDam * exp(-expDam * nlKappa); nrows = b.giveNumberOfColumns(); nsize = localNu.giveSize(); lcontrib.resize(nrows); for ( int i = 1; i <= nrows; i++ ) { sum = 0.0; for ( int j = 1; j <= nsize; j++ ) { sum += b.at(j, i) * localNu.at(j); } lcontrib.at(i) = mParam * dDamFunc * sum; } return 1; } else { loc.clear(); return 0; } }
void TrabBoneNL3D :: giveRemoteNonlocalStiffnessContribution(GaussPoint *gp, IntArray &rloc, const UnknownNumberingScheme &s, FloatArray &rcontrib, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); StructuralElement *elem = static_cast< StructuralElement * >( gp->giveElement() ); FloatMatrix b; elem->giveLocationArray(rloc, s); elem->computeBmatrixAt(gp, b); double kappa = nlStatus->giveKappa(); double tempKappa = nlStatus->giveTempKappa(); double dKappa = tempKappa - kappa; if ( dKappa < 10.e-9 ) { dKappa = 0; } if ( dKappa > 0.0 ) { FloatArray remoteNu, prodTensor; const FloatArray &plasFlowDirec = nlStatus->givePlasFlowDirec(); const FloatMatrix &SSaTensor = nlStatus->giveSSaTensor(); double beta = nlStatus->giveBeta(); prodTensor.beTProductOf(SSaTensor, plasFlowDirec); remoteNu = 1 / beta * prodTensor; rcontrib.beTProductOf(b, remoteNu); } else { rcontrib.resize(b.giveNumberOfColumns()); rcontrib.zero(); } }
void TrabBoneNL3D :: giveRemoteNonlocalStiffnessContribution(GaussPoint *gp, IntArray &rloc, const UnknownNumberingScheme &s, FloatArray &rcontrib, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); StructuralElement *elem = static_cast< StructuralElement * >( gp->giveElement() ); int ncols, nsize; double sum, beta; FloatArray remoteNu, plasFlowDirec, prodTensor; FloatMatrix b, SSaTensor; elem->giveLocationArray(rloc, s); elem->computeBmatrixAt(gp, b); ncols = b.giveNumberOfColumns(); rcontrib.resize(ncols); double kappa = nlStatus->giveKappa(); double tempKappa = nlStatus->giveTempKappa(); double dKappa = tempKappa - kappa; if ( dKappa < 10.e-9 ) { dKappa = 0; } if ( dKappa > 0.0 ) { plasFlowDirec = nlStatus->givePlasFlowDirec(); SSaTensor = nlStatus->giveSSaTensor(); beta = nlStatus->giveBeta(); prodTensor.beTProductOf(SSaTensor, plasFlowDirec); remoteNu = 1 / beta * prodTensor; nsize = remoteNu.giveSize(); for ( int i = 1; i <= ncols; i++ ) { sum = 0.0; for ( int j = 1; j <= nsize; j++ ) { sum += remoteNu.at(j) * b.at(j, i); } rcontrib.at(i) = sum; } } else { for ( int i = 1; i <= ncols; i++ ) { rcontrib.at(i) = 0.; } } }
void TrabBoneNL3D :: give3dMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep) { TrabBoneNL3DStatus *nlStatus = static_cast< TrabBoneNL3DStatus * >( this->giveStatus(gp) ); double tempDam, beta, nlKappa; FloatArray tempEffectiveStress, tempTensor2, prodTensor, plasFlowDirec; FloatMatrix elasticity, compliance, SSaTensor, secondTerm, thirdTerm, tangentMatrix; if ( mode == ElasticStiffness ) { this->constructAnisoComplTensor(compliance); elasticity.beInverseOf(compliance); answer = elasticity; } else if ( mode == SecantStiffness ) { this->constructAnisoComplTensor(compliance); elasticity.beInverseOf(compliance); tempDam = nlStatus->giveTempDam(); answer = elasticity; answer.times(1.0 - tempDam); } else if ( mode == TangentStiffness ) { double kappa = nlStatus->giveKappa(); double tempKappa = nlStatus->giveTempKappa(); double dKappa = tempKappa - kappa; if ( dKappa < 10.e-9 ) { dKappa = 0; } if ( dKappa > 0.0 ) { // Imports tempEffectiveStress = nlStatus->giveTempEffectiveStress(); this->computeCumPlastStrain(nlKappa, gp, tStep); tempDam = nlStatus->giveTempDam(); double dam = nlStatus->giveDam(); plasFlowDirec = nlStatus->givePlasFlowDirec(); SSaTensor = nlStatus->giveSSaTensor(); beta = nlStatus->giveBeta(); // Construction of the dyadic product tensor prodTensor.beTProductOf(SSaTensor, plasFlowDirec); // Construction of the tangent stiffness third term if ( tempDam - dam > 0 ) { thirdTerm.beDyadicProductOf(tempEffectiveStress, prodTensor); thirdTerm.times(-expDam * critDam * exp(-expDam * nlKappa) * ( 1.0 - mParam ) / beta); } else { thirdTerm.resize(6, 6); } // Construction of the tangent stiffness second term tempTensor2.beProductOf(SSaTensor, plasFlowDirec); secondTerm.beDyadicProductOf(tempTensor2, prodTensor); secondTerm.times(-( 1.0 - tempDam ) / beta); // Construction of the tangent stiffness tangentMatrix = SSaTensor; tangentMatrix.times(1.0 - tempDam); tangentMatrix.add(secondTerm); tangentMatrix.add(thirdTerm); answer = tangentMatrix; } else { // Import of state variables tempDam = nlStatus->giveTempDam(); // Construction of the tangent stiffness this->constructAnisoComplTensor(compliance); elasticity.beInverseOf(compliance); answer = elasticity; answer.times(1.0 - tempDam); } } nlStatus->setSmtrx(answer); }