68 auto dJ =
dot(Finv, d);
77 Qtemp_comp.
at(3) = this->
knc*dJ.at(3);
81 if ( oldDamage < 0.99 ) {
88 Kstiff.at(3,3) = this->
kn0;
90 Kstiff.at(3,3) = this->
kn0/(1-oldDamage);
98 Qtrial +=
dot(Kstiff, dJ);
100 double Qn = Qtrial.
at(3);
101 auto QtrialShear = {Qtrial.
at(1), Qtrial.
at(2), 0.};
103 double Qt =
norm(QtrialShear);
106 double sigf = this->sigf;
107 double gamma = this->gamma;
109 double mu = this->mu;
110 double c_star = this->c_star;
116 double Qn_M = 0.5*(Qn + fabs(Qn));
132 if ( loadFun/
sigf < 0.0000001 ) {
135 Qtemp *= 1-oldDamage;
138 double Qt1 = Qtemp.
at(1);
139 double Qt2 = Qtemp.
at(2);
146 auto dJElastic = dJ - (
S * dAlpha) * M;
151 double loadFunDyn = loadFun;
153 const double errorTol = 0.0001;
154 for(
int iter = 1; fabs(loadFunDyn)/
sigf > errorTol; iter++) {
160 OOFEM_ERROR(
"BilinearCZMaterialFagerstrom :: giveRealStressVector - no convergence in constitutive driver");
165 R.
at(1) = dJElastic.at(1) - (dJ.at(1) - gammaGf*
S*dAlpha*M.
at(1));
166 R.
at(2) = dJElastic.at(2) - (dJ.at(2) - gammaGf*
S*dAlpha*M.
at(2));
167 R.
at(3) = dJElastic.at(3) - (dJ.at(3) -
S*dAlpha*M.
at(3));
171 dJp = dJ - dJElastic;
188 Smat.
at(1,1) = 1.0 + gammaGf*dAlpha*
S*2*Kstiff.at(1,1)/(pow(
gamma,2)*
sigf);
189 Smat.
at(2,2) = 1.0 + gammaGf*dAlpha*
S*2*Kstiff.at(2,2)/(pow(
gamma,2)*
sigf);
192 Smat.
at(3,3) = 1.0 + dAlpha*
S*2*Kstiff.at(3,3)/(
sigf);
197 Smat.
at(1,4) = gammaGf*
S*M.
at(1);
198 Smat.
at(2,4) = gammaGf*
S*M.
at(2);
199 Smat.
at(3,4) =
S*M.
at(3);
202 if (
norm(dJp) > 0 ) {
209 Smat.
at(4,1) = M.
at(1)*Kstiff.at(1,1) + fac1*dJp.
at(1);
210 Smat.
at(4,2) = M.
at(2)*Kstiff.at(2,2) + fac1*dJp.
at(2);
218 Smat.
at(4,1) = M.
at(1)*Kstiff.at(1,1);
219 Smat.
at(4,2) = M.
at(2)*Kstiff.at(2,2);
230 auto inc =
dot(Smati,R);
232 dJElastic.at(1) -= inc.at(1);
233 dJElastic.at(2) -= inc.at(2);
234 dJElastic.at(3) -= inc.at(3);
238 Qtemp = Qold +
dot(Kstiff, dJElastic);
240 double Qt1 = Qtemp.
at(1);
241 double Qt2 = Qtemp.
at(2);
242 Qt = sqrt(Qt1*Qt1 + Qt2*Qt2);
244 Qn_M = 0.5*(Qtemp.
at(3)+fabs(Qtemp.
at(3)));
252 loadFunDyn = loadFun -
c_star*pow(
norm(dJp)/dt,
m);
255 if ( oldDamage + dAlpha > 1 ) {
256 dAlpha = 1. - oldDamage;
270 Qtemp *= 1 - oldDamage - dAlpha;
276 dAlpha = 1.0 - oldDamage;
286 auto answer =
Tdot(Finv,Qtemp);
325 StructuralInterfaceMaterial ::initializeFrom(ir);
340IntMatBilinearCZFagerstromRate :: checkConsistency()
342 if ( this->
kn0 < 0.0 ) {
344 }
else if ( this->
ks0 < 0.0 ) {
346 }
else if ( this->
GIc < 0.0 ) {
348 }
else if ( this->
GIIc < 0.0 ) {
350 }
else if ( this->
gamma < 0.0 ) {
351 OOFEM_ERROR(
"gamma (%.2e) is below zero which is unphysical",
358IntMatBilinearCZFagerstromRate :: printYourself()
360 IntMatBilinearCZFagerstrom :: printYourself();
361 printf(
"-Rate parameters \n");
362 printf(
" c_star = %e \n", this->
c_star);
363 printf(
" m = %e \n", this->
m);
#define REGISTER_Material(class)
double & at(std::size_t i)
double at(std::size_t i, std::size_t j) const
void printYourself() override
Prints receiver state on stdout. Useful for debugging.
double c_star
Rate dependence coefficient.
double m
Rate dependence exponent.
int checkConsistency() override
void letTempInverseDefGradBe(const FloatMatrixF< 3, 3 > &v)
void letTempEffectiveMandelTractionBe(const FloatArrayF< 3 > &v)
const FloatArrayF< 3 > & giveEffectiveMandelTraction() const
double giveDamage() const override
void letTempAlphavBe(const FloatArrayF< 3 > &v)
const FloatArrayF< 3 > & giveOldMaterialJump() const
void letTempMaterialJumpBe(const FloatArrayF< 3 > &v)
void letTempIepBe(const FloatMatrixF< 3, 3 > &v)
void letTempDamageDevBe(bool v)
void letTempDamageBe(double v)
double kn0
Material parameters.
IntMatBilinearCZFagerstrom(int n, Domain *d)
Constructor.
void giveInputRecord(DynamicInputRecord &input) override
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
const FloatArrayF< 3 > & giveTempJump() const
Returns the const pointer to receiver's temporary jump.
void letTempFBe(const FloatMatrixF< 3, 3 > &v)
Assigns tempFVector to given vector v.
void letTempFirstPKTractionBe(const FloatArrayF< 3 > v)
Assigns tempFirstPKTraction to given vector v.
void letTempJumpBe(const FloatArrayF< 3 > v)
Assigns tempJump to given vector v.
double giveTimeIncrement()
Returns solution step associated time increment.
#define _IFT_IntMatBilinearCZFagerstrom_ks
#define _IFT_IntMatBilinearCZFagerstrom_kn
#define _IFT_IntMatBilinearCZFagerstrom_sigf
#define _IFT_IntMatBilinearCZFagerstrom_g1c
#define _IFT_IntMatBilinearCZFagerstrom_g2c
#define _IFT_IntMatBilinearCZFagerstrom_gamma
#define _IFT_IntMatBilinearCZFagerstrom_mu
#define _IFT_IntMatBilinearCZFagerstrom_knc
#define _IFT_IntMatBilinearCZFagerstromRate_cstar
#define _IFT_IntMatBilinearCZFagerstromRate_m
double norm(const FloatArray &x)
FloatMatrixF< N, P > Tdot(const FloatMatrixF< M, N > &a, const FloatMatrixF< M, P > &b)
Computes .
FloatMatrixF< N, N > diag(const FloatArrayF< N > &v)
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.