void RCM2Material :: giveNormalElasticStiffnessMatrix(FloatMatrix &answer, MatResponseForm form, MatResponseMode rMode, GaussPoint *gp, TimeStep *atTime, const FloatMatrix &dir) // // return Elastic Stiffness matrix for normal Stresses // taking into account the directions of normal stresses // (not supported now) // { StructuralMaterial *lMat = static_cast< StructuralMaterial * >( this->giveLinearElasticMaterial() ); FloatMatrix de, fullAnswer(3, 3); IntArray mask; int i, j, sd; lMat->giveCharacteristicMatrix(de, FullForm, rMode, gp, atTime); // copy first 3x3 submatrix to answer for ( i = 1; i <= 3; i++ ) { for ( j = 1; j <= 3; j++ ) { fullAnswer.at(i, j) = de.at(i, j); } } if ( form == FullForm ) { // 3x3 full form required answer = fullAnswer; } else { // reduced form for only // nonzero normal stresses // // first find spatial dimension of problem sd = 0; for ( i = 1; i <= 3; i++ ) { if ( ( this->giveStressStrainComponentIndOf(FullForm, gp->giveMaterialMode(), i) ) ) { sd++; } } answer.resize(sd, sd); answer.zero(); // copy fullAnswer to reduced one this->giveStressStrainMask( mask, FullForm, gp->giveMaterialMode() ); for ( i = 1; i <= 3; i++ ) { for ( j = 1; j <= 3; j++ ) { if ( mask.at(i) && mask.at(j) ) { answer.at( mask.at(i), mask.at(j) ) = fullAnswer.at(i, j); } } } return; } }
void RCM2Material :: giveEffectiveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseForm form, MatResponseMode rMode, GaussPoint *gp, TimeStep *atTime) // // returns effective material stiffness matrix in full form // for gp stress strain mode // { RCM2MaterialStatus *status = ( RCM2MaterialStatus * ) this->giveStatus(gp); StructuralMaterial *lMat = static_cast< StructuralMaterial * >( this->giveLinearElasticMaterial() ); int numberOfActiveCracks = status->giveNumberOfTempActiveCracks(); int i, j, indi, indj, ii, jj; double G, princStressDis, princStrainDis; FloatMatrix de, invDe, compliance, dcr, d, df, t, tt, tempCrackDirs; FloatArray principalStressVector, principalStrainVector; IntArray mask; if ( ( rMode == ElasticStiffness ) || ( numberOfActiveCracks == 0 ) ) { lMat->giveCharacteristicMatrix(answer, form, rMode, gp, atTime); return; } // this->updateActiveCrackMap(gp) must be done after restart. this->updateActiveCrackMap(gp); status->giveTempCrackDirs(tempCrackDirs); this->giveNormalElasticStiffnessMatrix(de, ReducedForm, rMode, gp, atTime, tempCrackDirs); invDe.beInverseOf(de); this->giveCrackedStiffnessMatrix(dcr, rMode, gp, atTime); this->giveStressStrainMask( mask, ReducedForm, gp->giveMaterialMode() ); compliance.resize( mask.giveSize(), mask.giveSize() ); // we will set // first we set compliances for normal streses in // local coordinate system defined by crackplane for ( i = 1; i <= 3; i++ ) { if ( ( indi = this->giveStressStrainComponentIndOf(FullForm, gp->giveMaterialMode(), i) ) ) { for ( j = 1; j <= 3; j++ ) { if ( ( indj = this->giveStressStrainComponentIndOf(FullForm, gp->giveMaterialMode(), j) ) ) { compliance.at(indi, indj) += invDe.at(i, j); } } if ( status->isCrackActive(i) ) { if ( dcr.at(i, i) <= 1.e-8 ) { compliance.at(indi, indi) *= rcm2_BIGNUMBER; } else { compliance.at(indi, indi) += 1. / dcr.at(i, i); } } } } status->getPrincipalStressVector(principalStressVector); status->getPrincipalStrainVector(principalStrainVector); // now remain to set shears G = this->give(pscm_G, gp); for ( i = 4; i <= 6; i++ ) { if ( ( indi = this->giveStressStrainComponentIndOf(FullForm, gp->giveMaterialMode(), i) ) ) { if ( i == 4 ) { ii = 2; jj = 3; } else if ( i == 5 ) { ii = 1; jj = 3; } else { ii = 1; jj = 2; } princStressDis = principalStressVector.at(ii) - principalStressVector.at(jj); princStrainDis = principalStrainVector.at(ii) - principalStrainVector.at(jj); if ( fabs(princStrainDis) < rcm_SMALL_STRAIN ) { compliance.at(indi, indi) = 1. / G; } else if ( fabs(princStressDis) < 1.e-8 ) { compliance.at(indi, indi) = rcm2_BIGNUMBER; } else { compliance.at(indi, indi) = 2 * princStrainDis / princStressDis; } } } // now we invert compliance to get stiffness in reduced space d.beInverseOf(compliance); // delete compliance; // // now let d to grow to Full Format // this->giveStressStrainMask( mask, ReducedForm, gp->giveMaterialMode() ); df.beSubMatrixOfSizeOf(d, mask, 6); // // final step - transform stiffnes to global c.s // this->giveStressVectorTranformationMtrx(t, tempCrackDirs, 1); tt.beTranspositionOf(t); df.rotatedWith(tt); if ( form == FullForm ) { answer = df; } else { // reduced form asked this->giveStressStrainMask( mask, FullForm, gp->giveMaterialMode() ); answer.beSubMatrixOf(df, mask); } }