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); }