68 auto dJ =
dot(Finv, d);
76 Qtemp_comp.
at(3) = this->
knc*dJ.at(3);
81 if ( oldDamage < 0.99 ) {
88 double Qn = Qtrial.at(3);
91 double Qt =
norm(QtrialShear);
92 double sigf = this->sigf;
93 double gamma = this->gamma;
99 double Qn_M = 0.5*(Qn + fabs(Qn));
105 if ( loadFun/
sigf < 1e-7 ) {
108 Qtemp *= 1 - oldDamage;
111 double Qt1 = Qtemp.
at(1);
112 double Qt2 = Qtemp.
at(2);
120 auto dJElastic = dJ -
S * dAlpha * M;
124 const double errorTol = 0.0001;
125 for(
int iter = 1; fabs(loadFun)/
sigf > errorTol; iter++) {
128 OOFEM_ERROR(
"BilinearCZMaterialFagerstrom :: giveRealStressVector - no convergence in constitutive driver");
133 R.
at(1) = dJElastic.at(1) - (dJ.at(1) - gammaGf*
S*dAlpha*M.
at(1));
134 R.
at(2) = dJElastic.at(2) - (dJ.at(2) - gammaGf*
S*dAlpha*M.
at(2));
135 R.
at(3) = dJElastic.at(3) - (dJ.at(3) -
S*dAlpha*M.
at(3));
139 Smat.
at(1,1) = 1.0 + gammaGf*dAlpha*
S*2*Kstiff.at(1,1)/(pow(
gamma,2)*
sigf);
140 Smat.
at(2,2) = 1.0 + gammaGf*dAlpha*
S*2*Kstiff.at(2,2)/(pow(
gamma,2)*
sigf);
143 Smat.
at(3,3) = 1.0 + dAlpha*
S*2*Kstiff.at(3,3)/(
sigf);
148 Smat.
at(1,4) = gammaGf*
S*M.
at(1);
149 Smat.
at(2,4) = gammaGf*
S*M.
at(2);
150 Smat.
at(3,4) =
S*M.
at(3);
152 Smat.
at(4,1) = M.
at(1)*Kstiff.at(1,1);
153 Smat.
at(4,2) = M.
at(2)*Kstiff.at(2,2);
163 auto inc =
dot(Smati, R);
165 dJElastic.at(1) -= inc.at(1);
166 dJElastic.at(2) -= inc.at(2);
167 dJElastic.at(3) -= inc.at(3);
168 dAlpha = dAlpha - inc.at(4);
170 Qtemp = Qold +
dot(Kstiff, dJElastic);
172 double Qt1 = Qtemp.
at(1);
173 double Qt2 = Qtemp.
at(2);
174 Qt = sqrt(Qt1*Qt1 + Qt2*Qt2);
176 Qn_M = 0.5*(Qtemp.
at(3)+fabs(Qtemp.
at(3)));
187 if (oldDamage + dAlpha > 1) {
188 dAlpha = 1. - oldDamage;
201 Qtemp *= 1 - oldDamage - dAlpha;
208 dAlpha = 1.0 - oldDamage;
218 auto answer =
Tdot(Finv, Qtemp);
233IntMatBilinearCZFagerstrom :: give3dStiffnessMatrix_dTdj(MatResponseMode rMode,
GaussPoint *gp,
TimeStep *tStep)
const
252 if ( damage >= 1.0 ) {
255 answer =
rotate(Kstiff, Finv);
263 Kstiff.
at(3,3) = Kstiff.
at(3,3) + (this->
knc)/(1-damage);
267 answer = (1-damage) *
rotate(Kstiff, Finv);
282 answer = (1 - damage) *
dot(Kstiff, Iep);
292 auto temp1 =
Tdot(Finv, Qtemp);
293 auto temp2 =
Tdot(Finv, alpha_v);
295 auto t1hatFinvOpen =
dyad(temp1, temp2);
298 answer.
at(3,3) = answer.
at(3,3) + this->
knc;
303 answer =
rotate(answer, Finv) - t1hatFinvOpen;
335 StructuralInterfaceMaterial ::initializeFrom(ir);
338 if ( this->
kn0 < 0.0 ) {
340 }
else if ( this->
ks0 < 0.0 ) {
342 }
else if ( this->
GIc < 0.0 ) {
344 }
else if ( this->
GIIc < 0.0 ) {
346 }
else if ( this->
gamma < 0.0 ) {
369IntMatBilinearCZFagerstrom :: checkConsistency()
375IntMatBilinearCZFagerstrom :: printYourself()
377 printf(
"Parameters for BilinearCZMaterial: \n");
379 printf(
"-Strength paramters \n");
380 printf(
" sigf = %e \n", this->
sigf);
381 printf(
" GIc = %e \n", this->
GIc);
382 printf(
" GIIc = %e \n", this->
GIIc);
383 printf(
" gamma = sigfs/sigfn = %e \n", this->
gamma);
384 printf(
" mu = %e \n", this->
mu);
386 printf(
"-Stiffness parameters \n");
387 printf(
" kn0 = %e \n", this->
kn0);
388 printf(
" ks0 = %e \n", this->
ks0);
389 printf(
" knc = %e \n", this->
knc);
402IntMatBilinearCZFagerstromStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
405 StructuralInterfaceMaterialStatus :: printOutputAt(file, tStep);
418IntMatBilinearCZFagerstromStatus :: initTempStatus()
420 StructuralInterfaceMaterialStatus :: initTempStatus();
434IntMatBilinearCZFagerstromStatus :: updateYourself(
TimeStep *tStep)
436 StructuralInterfaceMaterialStatus :: updateYourself(tStep);
#define REGISTER_Material(class)
double & at(std::size_t i)
double at(std::size_t i, std::size_t j) const
void letTempInverseDefGradBe(const FloatMatrixF< 3, 3 > &v)
FloatMatrixF< 3, 3 > old_dTdJ
FloatArrayF< 3 > tempMaterialJump
void letTempEffectiveMandelTractionBe(const FloatArrayF< 3 > &v)
bool giveOldDamageDev() const
const FloatArrayF< 3 > & giveEffectiveMandelTraction() const
void letTempdTdJBe(const FloatMatrixF< 3, 3 > &v)
const FloatArrayF< 3 > & giveTempAlphav() const
FloatMatrixF< 3, 3 > temp_dTdJ
const FloatArrayF< 3 > & giveTempEffectiveMandelTraction() const
const FloatMatrixF< 3, 3 > & giveOlddTdJ() const
double giveDamage() const override
void letTempAlphavBe(const FloatArrayF< 3 > &v)
FloatArrayF< 3 > oldMaterialJump
const FloatMatrixF< 3, 3 > & giveTempInverseDefGrad() const
void letOldDamageDevBe(bool v)
FloatArrayF< 3 > QEffective
const FloatArrayF< 3 > & giveOldMaterialJump() const
double giveTempDamage() const override
FloatMatrixF< 3, 3 > tempFInv
void letTempMaterialJumpBe(const FloatArrayF< 3 > &v)
void letTempIepBe(const FloatMatrixF< 3, 3 > &v)
void letTempDamageDevBe(bool v)
const FloatMatrixF< 3, 3 > & giveTempIep() const
FloatArrayF< 3 > tempQEffective
void letTempDamageBe(double v)
double kn0
Material parameters.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
StructuralInterfaceMaterialStatus(GaussPoint *g)
Constructor. Creates new StructuralInterfaceMaterialStatus with number n, belonging to domain d and I...
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.
StructuralInterfaceMaterial(int n, Domain *d)
void giveInputRecord(DynamicInputRecord &input) override
#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
double norm(const FloatArray &x)
FloatMatrixF< N, P > Tdot(const FloatMatrixF< M, N > &a, const FloatMatrixF< M, P > &b)
Computes .
FloatMatrixF< N, M > dyad(const FloatArrayF< N > &a, const FloatArrayF< M > &b)
Computes the dyadic product .
FloatMatrixF< M, M > rotate(FloatMatrixF< N, N > &a, const FloatMatrixF< N, M > &r)
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.
FloatMatrixF< N, N > eye()
Constructs an identity matrix.