66 #ifdef keep_track_of_strains 98 #ifdef keep_track_of_strains 131 #ifdef keep_track_of_strains 196 double fc, c, wc, ac;
201 this->stiffnessFactor = 1.e6;
205 if ( result !=
IRRT_OK )
return result;
211 OOFEM_WARNING(
"for MPS material timefactor must be equal to 1.");
217 OOFEM_ERROR(
"for MPS p and p_tilde cannot be defined at the same time");
223 p = p_tilde / ( p_tilde - 1. );
241 this->predictParametersFrom(fc, c, wc, ac);
254 OOFEM_WARNING(
"CoupledAnalysisType must be equal to 0, 1, 2 or 3");
261 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
265 if ( this->p < 100. ) {
275 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) ) {
303 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
304 if ( this->CoupledAnalysis == MPS_temperature ) {
311 this->kTc = this->kTm;
315 this->roomTemperature = 298.15;
318 this->temperScaleDifference = 0.;
320 this->temperScaleDifference = 273.15;
351 eps_cas0 = -alpha_as *pow( ( fc / 10. ) / ( 6. + fc / 10. ), 2.5 ) * 1e-6;
355 b4_eps_au_infty = 0.;
362 double b4_r_alpha = 0., b4_eps_au_cem = 0., b4_tau_au_cem = 0., b4_r_ea, b4_r_ew, b4_r_tw;
367 if ( b4_cem_type == 0 ) {
372 b4_eps_au_cem = 210.e-6;
375 }
else if ( b4_cem_type == 1 ) {
380 b4_eps_au_cem = -84.e-6;
383 }
else if ( b4_cem_type == 2 ) {
388 b4_eps_au_cem = 0.e-6;
401 b4_eps_au_infty = -b4_eps_au_cem *pow(ac / 6., b4_r_ea) * pow(wc / 0.38, b4_r_ew);
407 b4_tau_au = b4_tau_au_cem * pow(wc / 0.38, b4_r_tw);
408 b4_tau_au *= lambda0;
414 b4_alpha = b4_r_alpha * wc / 0.38;
421 if ( ( eps_cas0 != 0. ) && ( b4_eps_au_infty != 0. ) ) {
422 OOFEM_ERROR(
"autogenous shrinkage cannot be described according to fib and B4 simultaneously");
434 if ( !this->isActivated(tStep) ) {
440 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
452 if ( ( mode != VM_Total ) && ( mode != VM_Incremental ) ) {
456 #ifndef keep_track_of_strains 457 if ( mode == VM_Total ) {
458 OOFEM_ERROR(
"for total formulation of shrinkage strains need to define keep_track_of_strains");
467 double dryShrIncr = 0.;
468 double autoShrIncr = 0.;
473 if ( ( this->CoupledAnalysis == Basic ) || ( this->CoupledAnalysis == MPS_temperature ) || ( !this->isActivated(tStep) ) ) {
476 this->computePointShrinkageStrainVector(dry_shr, gp, tStep);
479 #ifdef keep_track_of_strains 482 dryShrIncr = dry_shr.
at(1);
487 if ( ( this->eps_cas0 != 0. ) || ( this->b4_eps_au_infty != 0. ) ) {
488 if ( this->eps_cas0 != 0. ) {
489 this->computeFibAutogenousShrinkageStrainVector(eps_as, gp, tStep);
490 }
else if ( this->b4_eps_au_infty != 0. ) {
491 this->computeB4AutogenousShrinkageStrainVector(eps_as, gp, tStep);
494 #ifdef keep_track_of_strains 496 autoShrIncr = eps_as.
at(1);
502 if ( mode == VM_Incremental ) {
514 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
523 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
569 q1 = 1.e-12 * this->stiffnessFactor * 126.74271 / ( sqrt(fc) );
570 q2 = 1.e-12 * this->stiffnessFactor * 185.4 * pow(c, 0.5) * pow(fc, -0.9);
571 q3 = 0.29 * pow(wc, 4.) * q2;
572 q4 = 1.e-12 * this->stiffnessFactor * 20.3 * pow(ac, -0.7);
575 sprintf(buff,
"q1=%lf q2=%lf q3=%lf q4=%lf", q1, q2, q3, q4);
588 double Qf, Z, r, Q, C0;
596 Qf = 1. / ( 0.086 * pow(t_prime, 2. / 9.) + 1.21 * pow(t_prime, 4. / 9.) );
597 Z = pow(t_prime, -m) * log( 1. + pow(t - t_prime, n) );
598 r = 1.7 * pow(t_prime, 0.12) + 8.0;
599 Q = Qf * pow( ( 1. + pow( ( Qf / Z ), r ) ), -1. / r );
601 C0 = q2 * Q + q3 *log( 1. + pow(t - t_prime, n) ) + q4 *log(t / t_prime);
622 if ( this->begOfTimeOfInterest == -1. ) {
623 this->begOfTimeOfInterest = 0.01 * lambda0;
626 if ( this->endOfTimeOfInterest == -1. ) {
627 this->endOfTimeOfInterest = 10000. * lambda0;
631 Tau1 = 0.3 * this->begOfTimeOfInterest;
637 while ( 0.5 * this->endOfTimeOfInterest >= Tau1 * pow( 10.0, (
double ) ( j - 1 ) ) ) {
643 this->charTimes.resize(this->
nUnits);
644 this->charTimes.zero();
646 for ( mu = 1; mu <= this->
nUnits; mu++ ) {
647 charTimes.at(mu) = Tau1 * pow(10., mu - 1);
662 double lambda0ToPowN = pow(lambda0, 0.1);
663 tau0 = pow(2 * this->giveCharTime(1) / sqrt(10.0), 0.1);
664 EspringVal = 1. / ( q2 * log(1.0 + tau0 / lambda0ToPowN) - q2 * tau0 / ( 10.0 * lambda0ToPowN + 10.0 * tau0 ) );
670 for ( mu = 1; mu <= this->
nUnits; mu++ ) {
671 tauMu = pow(2 * this->giveCharTime(mu), 0.1);
672 answer.
at(mu) = 10. * pow(1 + tauMu / lambda0ToPowN, 2) / ( log(10.0) * q2 * ( tauMu / lambda0ToPowN ) * ( 0.9 + tauMu / lambda0ToPowN ) );
673 this->charTimes.at(mu) *= 1.35;
697 double dEtaR, etaR, L;
702 if ( !this->isActivated(tStep) ) {
709 if ( EparVal.giveSize() == 0 ) {
710 this->updateEparModuli(0., gp, tStep);
716 v = computeSolidifiedVolume(gp, tStep);
719 eta = this->computeFlowTermViscosity(gp, tStep);
723 if ( this->CoupledAnalysis == Basic ) {
724 Cf = 0.5 * ( dt ) / eta;
725 }
else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
732 etaR = this->giveInitViscosity(tStep) / this->computePsiR(gp, tStep, 0);
737 dEtaR = eta / this->computePsiR(gp, tStep, 1) - etaR;
738 if ( fabs(dEtaR) > 1.e-4 * etaR ) {
739 L = log(1 + dEtaR / etaR);
740 Cf = dt * ( 1. - etaR * L / dEtaR ) / dEtaR;
742 Cf = dt * ( 0.5 - dEtaR / ( 3 * etaR ) ) / etaR;
758 Emodulus = 1. / ( q1 + 1. / ( EspringVal * v ) + sum + Cf );
763 if ( Emodulus < 0. ) {
764 OOFEM_ERROR(
"Incremental modulus is negative %f", Emodulus);
783 if ( this->CoupledAnalysis == Basic ) {
786 atAge = computeEquivalentTime(gp, tStep, 0);
789 return 1. / ( alpha + pow(lambda0 / atAge, m) );
802 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
803 deltaT *= 0.5 * ( this->computePsiR(gp, tStep, 0) + this->computePsiR(gp, tStep, 1) );
806 tauMu = this->giveCharTime(Mu);
808 if ( deltaT / tauMu > 30 ) {
811 betaMu = exp(-( deltaT ) / tauMu);
826 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
827 deltaT *= 0.5 * ( this->computePsiR(gp, tStep, 0) + this->computePsiR(gp, tStep, 1) );
830 tauMu = this->giveCharTime(Mu);
832 if ( deltaT / tauMu < 1.e-5 ) {
833 lambdaMu = 1 - 0.5 * ( deltaT / tauMu ) + 1 / 6 * ( pow(deltaT / tauMu, 2) ) - 1 / 24 * ( pow(deltaT / tauMu, 3) );
834 }
else if ( deltaT / tauMu > 30 ) {
835 lambdaMu = tauMu / deltaT;
837 lambdaMu = ( 1.0 - exp(-( deltaT ) / tauMu) ) * tauMu / deltaT;
846 double eta = 0., tHalfStep;
848 double prevEta, PsiS, e, dt;
849 double A = 0., B = 0.;
850 double T_new = 0., T_old = 0., H_new = 0., H_old = 0.;
862 if ( this->CoupledAnalysis == Basic ) {
864 eta = tHalfStep / q4;
865 }
else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
877 prevEta = this->giveInitViscosity(tStep);
884 PsiS = this->computePsiS(gp, tStep);
886 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) ) {
887 H_new = this->giveHumidity(gp, tStep, 1);
888 H_old = this->giveHumidity(gp, tStep, 0);
891 if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
892 T_new = this->giveTemperature(gp, tStep, 1);
893 T_old = this->giveTemperature(gp, tStep, 0);
907 if ( this->CoupledAnalysis == MPS_full ) {
909 A = sqrt( muS * fabs( ( T_new + T_old ) * ( H_new - H_old ) / ( H_new + H_old ) + log( ( H_new + H_old ) / 2. ) * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
911 A = sqrt( muS * fabs( ( T_new + T_old ) * ( H_new - H_old ) / ( H_new + H_old ) - kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
913 B = sqrt(PsiS / this->q4);
914 }
else if ( this->CoupledAnalysis == MPS_humidity ) {
916 A = sqrt(muS * ( fabs( log(H_new) - log(H_old) ) ) / dt);
917 B = sqrt(PsiS / this->q4);
918 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
919 A = sqrt( muS * fabs( kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature ) );
920 B = sqrt(PsiS / this->q4);
925 if ( ( A * B * dt ) > 1.e-6 ) {
926 e = exp(-2 * A * B * dt);
927 eta = ( B / A ) * ( B * ( 1. - e ) + A * prevEta * ( 1. + e ) ) / ( B * ( 1. + e ) + A * prevEta * ( 1. - e ) );
929 eta = ( prevEta + B * B * dt ) / ( 1. + A * A * prevEta * dt );
931 }
else if ( ( p < 100 ) && ( p > 2 ) ) {
932 double iterTol = 1.e-12;
934 double deltaDeltaEta;
938 if ( this->CoupledAnalysis == MPS_full ) {
940 A = pow( muS, 1. / ( p - 1. ) ) * fabs( ( T_new + T_old ) * ( H_new - H_old ) / ( H_new + H_old ) + log( ( H_new + H_old ) / 2. ) * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
942 A = pow( muS, 1. / ( p - 1. ) ) * fabs( ( T_new + T_old ) * ( H_new - H_old ) / ( H_new + H_old ) - kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
945 }
else if ( this->CoupledAnalysis == MPS_humidity ) {
946 A = pow( muS, 1. / ( p - 1. ) ) * ( fabs( log(H_new) - log(H_old) ) ) / dt;
948 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
949 A = pow( muS, 1. / ( p - 1. ) ) * fabs( kT * ( T_new - T_old ) ) / ( dt * this->roomTemperature );
958 double relError = 1.;
960 while ( relError > iterTol ) {
961 f = deltaEta / dt + A *pow( prevEta + 0.5 *deltaEta, p / ( p - 1. ) ) - B;
962 df = 1 / dt + A *p *pow( prevEta + 0.5 *deltaEta, 1. / ( p - 1. ) ) / ( 2. * ( p - 1. ) );
964 deltaDeltaEta = -f / df;
965 deltaEta += deltaDeltaEta;
968 OOFEM_ERROR(
"iterative Newton method not converging");
971 relError = fabs(deltaDeltaEta / deltaEta);
974 eta = prevEta + deltaEta;
975 }
else if ( p < 0. ) {
977 double iterTol = 1.e-6;
979 double deltaDeltaEta;
983 if ( this->CoupledAnalysis == MPS_full ) {
985 A = pow( muS, 1. / ( p - 1. ) ) * fabs( T_new * log(H_new) - T_old * log(H_old) ) / ( dt * this->roomTemperature );
987 A = ( kT * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * fabs( log(H_new) - log(H_old) ) ) * pow( muS, 1. / ( p - 1. ) ) / ( dt * this->roomTemperature );
991 }
else if ( this->CoupledAnalysis == MPS_humidity ) {
992 A = ( fabs( log(H_new) - log(H_old) ) ) * pow( muS, 1. / ( p - 1. ) ) / dt;
994 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
995 A = kT * fabs(T_new - T_old) * pow( muS, 1. / ( p - 1. ) ) / ( dt * this->roomTemperature );
1004 double relError = 1.;
1005 double minEta = 1.e-6;
1007 while ( relError > iterTol ) {
1008 f = deltaEta / dt + A *pow( prevEta + deltaEta, p / ( p - 1. ) ) - B;
1009 df = 1 / dt + A *pow( prevEta + deltaEta, 1. / ( p - 1. ) ) * p / ( p - 1. );
1011 deltaDeltaEta = -f / df;
1012 deltaEta += deltaDeltaEta;
1014 if ( ( prevEta + deltaEta ) < 0 ) {
1015 deltaEta = minEta - prevEta;
1019 OOFEM_ERROR(
"iterative Newton method not converging");
1023 relError = fabs(deltaDeltaEta / deltaEta);
1026 eta = prevEta + deltaEta;
1030 if ( this->CoupledAnalysis == MPS_full ) {
1033 A = k3 * fabs( T_new * log(H_new) - T_old * log(H_old) ) / ( dt * this->roomTemperature );
1035 A = k3 * ( kT * fabs(T_new - T_old) + 0.5 * ( T_new + T_old ) * fabs( log(H_new) - log(H_old) ) ) / ( dt * this->roomTemperature );
1038 B = PsiS / this->q4;
1039 }
else if ( this->CoupledAnalysis == MPS_humidity ) {
1042 A = k3 * ( fabs( log(H_new) - log(H_old) ) ) / dt;
1043 B = PsiS / this->q4;
1044 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
1045 A = k3 * kT * fabs(T_new - T_old) / ( dt * this->roomTemperature );
1046 B = PsiS / this->q4;
1053 eta = prevEta + B * dt;
1055 if ( ( A * dt ) > 30. ) {
1058 eta = ( prevEta - B / A ) * exp(-A * dt) + B / A;
1071 OOFEM_ERROR(
"trying to return negative viscosity %f", eta);
1101 FloatArray KelvinEigenStrain, reducedAnswer, sigma;
1105 double dEtaR, etaR, L;
1109 if ( mode == VM_Incremental ) {
1112 this->giveUnitComplianceMatrix(C, gp, tStep);
1118 eta = this->computeFlowTermViscosity(gp, tStep);
1120 if ( this->CoupledAnalysis == Basic ) {
1121 reducedAnswer.
times(dt / eta);
1122 }
else if ( ( this->CoupledAnalysis == MPS_full ) || ( this->CoupledAnalysis == MPS_humidity ) || ( this->CoupledAnalysis == MPS_temperature ) ) {
1127 etaR = this->giveInitViscosity(tStep) / this->computePsiR(gp, tStep, 0);
1132 dEtaR = eta / this->computePsiR(gp, tStep, 1) - etaR;
1134 if ( fabs(dEtaR) > 1.e-4 * etaR ) {
1135 L = log(1 + dEtaR / etaR);
1136 reducedAnswer.
times(dt * L / dEtaR);
1138 reducedAnswer.
times(dt * ( 1 - 0.5 * dEtaR / etaR + dEtaR * dEtaR / ( 3 * etaR * etaR ) ) / etaR);
1156 reducedAnswer.
add(KelvinEigenStrain);
1158 answer = reducedAnswer;
1160 #ifdef keep_track_of_strains 1177 double humDiff, EpsSh;
1181 double h, kShFactor;
1183 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1189 if ( this->sh_a != 1. ) {
1190 h = this->giveHumidity(gp, tStep, 2);
1191 kShFactor = sh_a + ( 1. - sh_a ) / ( 1. + pow( ( 1. - h ) / ( 1. - sh_hC ), sh_n ) );
1196 humDiff = this->giveHumidity(gp, tStep, 3);
1198 EpsSh = humDiff * kSh * kShFactor;
1203 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1204 fullAnswer.
at(1) = EpsSh;
1206 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = EpsSh;
1228 double t_equiv_beg, t_equiv_end;
1231 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1247 t_equiv_beg /= this->lambda0;
1249 t_equiv_end = this->computeEquivalentTime(gp, tStep, 1);
1251 t_equiv_end /= this->lambda0;
1253 eps_cas = eps_cas0 * ( -exp( -0.2 * sqrt(t_equiv_end) ) + exp( -0.2 * sqrt(t_equiv_beg) ) );
1258 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1259 fullAnswer.
at(1) = eps_cas;
1261 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = eps_cas;
1285 double t_equiv_beg, t_equiv_end;
1287 if ( ( mMode == _3dShell ) || ( mMode == _3dBeam ) || ( mMode == _2dPlate ) || ( mMode == _2dBeam ) ) {
1303 t_equiv_end = this->computeEquivalentTime(gp, tStep, 1);
1305 eps_au = b4_eps_au_infty * ( pow(1. + pow(b4_tau_au / t_equiv_end, b4_alpha), b4_r_t) - pow(1. + pow(b4_tau_au / t_equiv_beg, b4_alpha), b4_r_t) );
1310 if ( ( mMode == _2dLattice ) || ( mMode == _3dLattice ) ) {
1311 fullAnswer.
at(1) = eps_au;
1313 fullAnswer.
at(1) = fullAnswer.
at(2) = fullAnswer.
at(3) = eps_au;
1346 double H_tot = 0.0, H_inc = 0.0;
1359 if ( ( tf = fm->
giveField(FT_HumidityConcentration) ) ) {
1361 if ( ( err = tf->evaluateAt(et2, gcoords, VM_Total, tStep) ) ) {
1362 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
1365 if ( ( err = tf->evaluateAt(ei2, gcoords, VM_Incremental, tStep) ) ) {
1366 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
1391 case 0:
return H_tot - H_inc;
1393 case 1:
return H_tot;
1395 case 2:
return H_tot - 0.5 * H_inc;
1397 case 3:
return H_inc;
1399 default:
OOFEM_ERROR(
"option %d not supported", option);
1407 double T_tot = 0.0, T_inc = 0.0;
1419 if ( ( tf = fm->
giveField(FT_Temperature) ) ) {
1421 if ( ( err = tf->evaluateAt(et1, gcoords, VM_Total, tStep) ) ) {
1422 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
1425 if ( ( err = tf->evaluateAt(ei1, gcoords, VM_Incremental, tStep) ) ) {
1426 OOFEM_ERROR(
"tf->evaluateAt failed, error value %d", err);
1429 T_tot = et1.
at(1) + temperScaleDifference;
1440 status->
setT(T_tot);
1443 T_tot = status->
giveT();
1449 case 0:
return T_tot - T_inc;
1451 case 1:
return T_tot;
1453 case 2:
return T_tot - 0.5 * T_inc;
1455 case 3:
return T_inc;
1457 default:
OOFEM_ERROR(
"option %d not supported", option);
1466 double betaRH, betaRT;
1468 if ( this->CoupledAnalysis == MPS_humidity ) {
1469 H = this->giveHumidity(gp, tStep, option);
1470 betaRH = alphaR + ( 1. - alphaR ) * H * H;
1472 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
1473 T = this->giveTemperature(gp, tStep, option);
1474 betaRT = exp( QRtoR * ( 1. / this->roomTemperature - 1. / T ) );
1476 }
else if ( this->CoupledAnalysis == MPS_full ) {
1477 H = this->giveHumidity(gp, tStep, option);
1478 T = this->giveTemperature(gp, tStep, option);
1479 betaRH = alphaR + ( 1. - alphaR ) * H * H;
1480 betaRT = exp( QRtoR * ( 1. / this->roomTemperature - 1. / T ) );
1481 return betaRH * betaRT;
1491 double AverageHum, AverageTemp;
1492 double betaSH, betaST;
1494 if ( this->CoupledAnalysis == MPS_humidity ) {
1495 AverageHum = this->giveHumidity(gp, tStep, 2);
1496 betaSH = alphaS + ( 1. - alphaS ) * AverageHum * AverageHum;
1498 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
1499 AverageTemp = this->giveTemperature(gp, tStep, 2);
1500 betaST = exp( QStoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1502 }
else if ( this->CoupledAnalysis == MPS_full ) {
1503 AverageHum = this->giveHumidity(gp, tStep, 2);
1504 AverageTemp = this->giveTemperature(gp, tStep, 2);
1505 betaSH = alphaS + ( 1. - alphaS ) * AverageHum * AverageHum;
1506 betaST = exp( QStoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1507 return betaSH * betaST;
1517 double AverageHum, AverageTemp;
1518 double betaEH, betaET;
1520 if ( this->CoupledAnalysis == MPS_humidity ) {
1521 AverageHum = this->giveHumidity(gp, tStep, 2);
1522 betaEH = 1. / ( 1. + pow( ( alphaE * ( 1. - AverageHum ) ), 4. ) );
1524 }
else if ( this->CoupledAnalysis == MPS_temperature ) {
1525 AverageTemp = this->giveTemperature(gp, tStep, 2);
1526 betaET = exp( QEtoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1528 }
else if ( this->CoupledAnalysis == MPS_full ) {
1529 AverageHum = this->giveHumidity(gp, tStep, 2);
1530 AverageTemp = this->giveTemperature(gp, tStep, 2);
1531 betaEH = 1. / ( 1. + pow( ( alphaE * ( 1. - AverageHum ) ), 4. ) );
1532 betaET = exp( QEtoR * ( 1. / this->roomTemperature - 1. / AverageTemp ) );
1533 return betaEH * betaET;
1547 PsiE = computePsiE(gp, tStep);
1551 if ( option == 0 ) {
1553 }
else if ( option == 1 ) {
1562 if ( option == 0 ) {
1564 }
else if ( option == 1 ) {
1580 if ( type == IST_DryingShrinkageTensor ) {
1585 }
else if ( type == IST_AutogenousShrinkageTensor ) {
1590 }
else if ( type == IST_TotalShrinkageTensor ) {
1595 }
else if ( type == IST_CreepStrainTensor ) {
double computeEquivalentTime(GaussPoint *gp, TimeStep *tStep, int option)
Computes equivalent time at given time step and GP.
static int giveSizeOfVoigtSymVector(MaterialMode mmode)
Returns the size of symmetric part of a reduced stress/strain vector according to given mode...
double giveStoredEmodulus(void)
Returns Emodulus if computed previously in the same tStep.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
int number
Component number.
void computeB4AutogenousShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Evaluation of the autogenousShrinkageStrainVector according to Bazant's B4 model. In the model the ev...
GaussPoint * gp
Associated integration point.
std::shared_ptr< Field > FieldPtr
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
virtual double computeBetaMu(GaussPoint *gp, TimeStep *tStep, int Mu)
factors for exponential algorithm
double giveDryingShrinkageStrain(void)
Domain * domain
Link to domain object, useful for communicating with other FEM components.
#define _IFT_MPSMaterial_t0
FloatArray creepStrainIncrement
void computeFibAutogenousShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Evaluation of the autogenousShrinkageStrainVector according to fib MC 2010 - autogenous shrinkage is ...
void setTIncrement(double src)
Stores temperature increment.
const FloatArray & giveCreepStrain() const
void setEquivalentTimeTemp(double src)
Stores equivalent time.
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
void setTempAutogenousShrinkageStrain(double src)
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
virtual void computeCharTimes()
Evaluation of characteristic times.
double giveHumIncrement()
Returns relative humidity increment.
#define _IFT_MPSMaterial_eps_cas0
double & at(int i)
Coefficient access function.
ValueModeType
Type representing the mode of UnknownType or CharType, or similar types.
#define _IFT_MPSMaterial_stiffnessfactor
#define _IFT_MPSMaterial_alphae
double giveHumidity(GaussPoint *gp, TimeStep *tStep, int option)
Gives value of humidity at given GP and timestep option = 0 ...
#define _IFT_MPSMaterial_p
void setTmax(double src)
Stores maximum reached temperature.
bool giveStoredEmodulusFlag(void)
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
void setCreepStrainIncrement(FloatArray src)
EngngModel * giveEngngModel()
Returns engineering model to which receiver is associated.
double giveEquivalentTime()
Returns equivalent time.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
double computePsiS(GaussPoint *gp, TimeStep *tStep)
Evaluation of the factor transforming real time to reduced time (effect on the evolution of micropres...
double giveTargetTime()
Returns target time.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Restores the receiver state previously written in stream.
#define _IFT_MPSMaterial_qstor
double tempAutogenousShrinkageStrain
Element * giveElement()
Returns corresponding element to receiver.
#define _IFT_RheoChainMaterial_timefactor
MPSMaterialStatus(int n, Domain *d, GaussPoint *g, int nunits)
double giveTmax()
Returns previously maximum reached temperature.
double giveAutogenousShrinkageStrain(void)
#define _IFT_MPSMaterial_coupledanalysistype
virtual void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by the stress history (typically...
virtual void giveEigenStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by the stress history (typically...
MaterialMode
Type representing material mode of integration point.
FieldManager * giveFieldManager()
#define OOFEM_LOG_DEBUG(...)
#define _IFT_MPSMaterial_q3
virtual int read(int *data, int count)=0
Reads count integer values into array pointed by data.
#define _IFT_MPSMaterial_sh_n
double giveEndOfTimeOfInterest()
Access to the time up to which the response should be accurate.
#define _IFT_MPSMaterial_mode
#define _IFT_MPSMaterial_alphas
#define _IFT_MPSMaterial_k3
#define _IFT_MPSMaterial_qetor
static void giveFullSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the reduced unsymmetric Voigt vector (2nd order tensor) to full form.
double giveTimeIncrement()
Returns solution step associated time increment.
virtual double giveEModulus(GaussPoint *gp, TimeStep *tStep)
Evaluation of the incremental modulus.
bool isTheFirstStep()
Check if receiver is first step.
void setTempDryingShrinkageStrain(double src)
virtual int write(const int *data, int count)=0
Writes count integer values from array pointed by data.
#define _IFT_MPSMaterial_sh_a
#define _IFT_MPSMaterial_B4_cem_type
double giveT()
Returns temperature.
void setEmodulusFlag(bool src)
static void giveReducedSymVectorForm(FloatArray &answer, const FloatArray &vec, MaterialMode matMode)
Converts the full unsymmetric Voigt vector (2nd order tensor) to reduced form.
void setT(double src)
Stores temperature.
#define _IFT_MPSMaterial_alpha_as
double giveTemperature(GaussPoint *gp, TimeStep *tStep, int option)
Gives value of temperature at given GP and timestep option = 0 ...
#define _IFT_MPSMaterial_alphar
#define _IFT_MPSMaterial_B4_r_t
double equivalentTime
Hidden variable - equivalent time: necessary to compute solidified volume.
#define _IFT_MPSMaterial_p_tilde
EngngModelContext * giveContext()
Context requesting service.
double autogenousShrinkageStrain
double giveFlowTermViscosityTemp()
#define _IFT_MPSMaterial_ktc
void computePointShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep)
Evaluation of the shrinkageStrainVector - shrinkage is fully dependent on humidity rate in given GP...
double flowTermViscosityTemp
double computeFlowTermViscosity(GaussPoint *gp, TimeStep *tStep)
Evaluation of the flow term viscosity.
double computePsiR(GaussPoint *gp, TimeStep *tStep, int option)
Evaluation of the factor transforming real time to reduced time (effect on the flow term) option = 0 ...
void setFlowTermViscosityTemp(double src)
bool storedEmodulusFlag
flag for Emodulus - true if modulus has been already computed in the current time step ...
double tempDryingShrinkageStrain
void beProductOf(const FloatMatrix &aMatrix, const FloatArray &anArray)
Receiver becomes the result of the product of aMatrix and anArray.
virtual double giveEModulus(GaussPoint *gp, TimeStep *tStep)
Evaluation of the incremental modulus.
void setHum(double src)
Stores relative humidity.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
#define _IFT_MPSMaterial_qrtor
double giveIntrinsicTime()
Returns intrinsic time, e.g. time in which constitutive model is evaluated.
virtual double computeSolidifiedVolume(GaussPoint *gp, TimeStep *tStep)
Evaluation of the relative volume of the solidified material.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
FieldPtr giveField(FieldType key)
Returns the previously registered field under given key; NULL otherwise.
virtual MaterialStatus * CreateStatus(GaussPoint *gp) const
Creates new copy of associated status and inserts it into given integration point.
double computePsiE(GaussPoint *gp, TimeStep *tStep)
Evaluation of the factor transforming real time to equivalent time (effect on the solidified volume) ...
Abstract base class representing a material status information.
#define _IFT_MPSMaterial_q2
Class representing vector of real numbers.
#define _IFT_MPSMaterial_cc
#define _IFT_MPSMaterial_q1
virtual void giveShrinkageStrainVector(FloatArray &answer, GaussPoint *gp, TimeStep *tStep, ValueModeType mode)
Computes, for the given integration point, the strain vector induced by stress-independent shrinkage...
#define _IFT_MPSMaterial_sh_hC
double giveHum()
Returns relative humidity.
Implementation of matrix containing floating point numbers.
double giveFlowTermViscosity()
Returns viscosity of the flow term (associated with q4 and microprestress evolution) ...
IRResultType
Type defining the return values of InputRecord reading operations.
This class implements associated Material Status to MPSMaterial, which corresponds to a model for hum...
#define _IFT_MPSMaterial_mus
#define _IFT_MPSMaterial_ktm
This class implements associated Material Status to KelvinChainSolidMaterial, which corresponds to a ...
void zero()
Zeroes all coefficients of receiver.
virtual double computeCreepFunction(double t, double t_prime, GaussPoint *gp, TimeStep *tStep)
Evaluation of the basic creep compliance function - can be used to compute elastic modulus in derived...
#define _IFT_MPSMaterial_temperInCelsius
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
#define _IFT_MPSMaterial_q4
void times(double s)
Multiplies receiver with scalar.
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
#define _IFT_MPSMaterial_B4_tau_au
Domain * giveDomain() const
#define _IFT_MPSMaterial_fc
virtual double computeLambdaMu(GaussPoint *gp, TimeStep *tStep, int Mu)
double equivalentTimeTemp
#define _IFT_MPSMaterial_ksh
REGISTER_Material(DummyMaterial)
#define _IFT_MPSMaterial_lambda0
double hum
Values of humidity and temperature in a particular GP and their increment.
#define _IFT_MPSMaterial_ac
double giveInitViscosity(TimeStep *tStep)
Returns initial value of the flow term viscosity.
int giveSize() const
Returns the size of receiver.
virtual const FloatArray & giveViscoelasticStressVector() const
the oofem namespace is to define a context or scope in which all oofem names are defined.
#define _IFT_MPSMaterial_wc
virtual void initTempStatus()
Initializes the temporary internal variables, describing the current state according to previously re...
#define _IFT_MPSMaterial_B4_eps_au_infty
virtual void updateYourself(TimeStep *tStep)
Update equilibrium history variables according to temp-variables.
void predictParametersFrom(double, double, double, double)
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
Class representing integration point in finite element program.
#define OOFEM_WARNING(...)
double dryingShrinkageStrain
Class representing solution step.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
Computes the global coordinates from given element's local coordinates.
double giveTIncrement()
Returns temperature increment.
void add(const FloatArray &src)
Adds array src to receiver.
#define _IFT_MPSMaterial_B4_alpha
virtual void computeCharCoefficients(FloatArray &answer, double, GaussPoint *gp, TimeStep *tStep)
Evaluation of characteristic moduli of the non-aging Kelvin chain.
const FloatArray & giveNaturalCoordinates()
Returns coordinate array of receiver.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
void storeEmodulus(double src)
Returns Emodulus if computed previously in the same tStep.
void setHumIncrement(double src)
Stores relative humidity increment.
int nUnits
Number of units in the chain.
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
Stores receiver state to output stream.
void resize(int s)
Resizes receiver towards requested size.