void KelvinChainSolidMaterial :: computeHiddenVars(GaussPoint *gp, TimeStep *tStep) { /* * Updates hidden variables used to effectively trace the load history */ double betaMu; double lambdaMu; FloatArray help, SigmaVMu, deltaEps0, deltaSigma; FloatMatrix D; KelvinChainSolidMaterialStatus *status = static_cast< KelvinChainSolidMaterialStatus * >( this->giveStatus(gp) ); if ( !this->isActivated(tStep) ) { help.resize(StructuralMaterial :: giveSizeOfVoigtSymVector( gp->giveMaterialMode() ) ); help.zero(); for ( int mu = 1; mu <= nUnits; mu++ ) { status->letTempHiddenVarsVectorBe(mu, help); } return; } help = status->giveTempStrainVector(); // gives updated strain vector (at the end of time-step) help.subtract( status->giveStrainVector() ); // strain increment in current time-step // Subtract the stress-independent part of strain this->computeStressIndependentStrainVector(deltaEps0, gp, tStep, VM_Incremental); if ( deltaEps0.giveSize() ) { help.subtract(deltaEps0); // should be equal to zero if there is no stress change during the time-step } this->giveUnitStiffnessMatrix(D, gp, tStep); help.times( this->giveEModulus(gp, tStep) ); deltaSigma.beProductOf(D, help); for ( int mu = 1; mu <= nUnits; mu++ ) { betaMu = this->computeBetaMu(gp, tStep, mu); lambdaMu = this->computeLambdaMu(gp, tStep, mu); help = deltaSigma; help.times(lambdaMu); SigmaVMu = status->giveHiddenVarsVector(mu); if ( SigmaVMu.giveSize() ) { SigmaVMu.times(betaMu); SigmaVMu.add(help); status->letTempHiddenVarsVectorBe(mu, SigmaVMu); } else { status->letTempHiddenVarsVectorBe(mu, help); } } }
void KelvinChainSolidMaterial :: updateYourself(GaussPoint *gp, TimeStep *tNow) { /* * Updates hidden variables used to effectively trace the load history */ double betaMu; double lambdaMu; FloatArray help, *SigmaVMu, deltaEps0, deltaSigma; FloatMatrix D; KelvinChainSolidMaterialStatus *status = ( KelvinChainSolidMaterialStatus * ) this->giveStatus(gp); help = status->giveTempStrainVector(); // gives updated strain vector (at the end of time-step) help.subtract( status->giveStrainVector() ); // strain increment in current time-step // Subtract the stress-independent part of strain this->computeStressIndependentStrainVector(deltaEps0, gp, tNow, VM_Incremental); if ( deltaEps0.giveSize() ) { help.subtract(deltaEps0); // should be equal to zero if there is no stress change during the time-step } this->giveUnitStiffnessMatrix(D, ReducedForm, gp, tNow); help.times( this->giveEModulus(gp, tNow) ); deltaSigma.beProductOf(D, help); for ( int mu = 1; mu <= nUnits; mu++ ) { betaMu = this->computeBetaMu(gp, tNow, mu); lambdaMu = this->computeLambdaMu(gp, tNow, mu); help = deltaSigma; help.times(lambdaMu); SigmaVMu = status->giveHiddenVarsVector(mu); if ( SigmaVMu ) { SigmaVMu->times(betaMu); SigmaVMu->add(help); } else { status->letHiddenVarsVectorBe( mu, ( new FloatArray(help) ) ); } } status->updateYourself(tNow); }