66 auto dJ =
dot(Finv, d);
74 Qtemp_comp.
at(3) = this->
knc*dJ.at(3);
79 if ( oldDamage < 0.99 ) {
90 Qtrial +=
dot(Kstiff, dJ);
91 double Qn = Qtrial.at(3);
94 double Qt =
norm(QtrialShear);
97 double sigf = this->sigf;
98 double gamma = this->gamma;
100 double mu = this->mu;
103 double Qn_M = 0.5*(Qn + fabs(Qn));
114 if ( loadFun/
sigf < 0.0000001 ) {
117 Qtemp *= 1-oldDamage;
122 double C1 = (pow((Qt/
gamma),2)+(1-c)*pow(Qn_M,2))/(pow(
sigf,2));
123 double C2 = c*Qn_M/
sigf;
129 xi = (-C2 + sqrt(pow(C2,2)+4*C1))/(2*C1);
134 OOFEM_ERROR(
"Inconsistent cohesive model specification, 1-c*Qn/sigf = %e", 1 - c*Qn /
sigf);
139 Qn = 0.5*((1+xi)-(1-xi)*
sgn(Qn))*Qn;
140 Qn_M = 0.5*(Qn + fabs(Qn));
142 double beta = pow(Qt,2)*Kstiff.at(3,3)/(pow(Qn_M,2)*Kstiff.at(1,1) + pow(Qt,2)*Kstiff.at(3,3));
147 double eta = (pow(Qn_M,2) + pow(Qt,2)*Kstiff.at(3,3)/Kstiff.at(1,1))/(G_beta*
sigf);
149 dAlpha = (1/xi-1)*
sigf/(2*Kstiff.at(3,3))*eta;
151 if ( oldDamage + dAlpha > 1 ) {
152 dAlpha = 1-oldDamage;
155 double Qt_trial =
norm(QtrialShear);
159 if ( Qt_trial > 0 ) {
160 Qt1 = Qt*QtrialShear.
at(1)/Qt_trial;
161 Qt2 = Qt*QtrialShear.
at(2)/Qt_trial;
170 Mstar.
at(1) = 2*Qt1*this->
kn0/Kstiff.at(1,1)/(
sigf);
171 Mstar.
at(2) = 2*Qt2*this->
kn0/Kstiff.at(2,2)/(
sigf);
172 Mstar.
at(3) = 2*Qn_M/
sigf;
176 M.
at(3) = 2*(1-c)/(
sigf)*Qn_M + c;
181 Smat.at(1,1) = 1.0 + dAlpha*(1/eta)*2*this->
kn0/(
sigf);
182 Smat.at(2,2) = 1.0 + dAlpha*(1/eta)*2*this->
kn0/(
sigf);
185 Smat.at(3,3) = 1.0 + dAlpha*(1/eta)*2*Kstiff.at(3,3)/(
sigf);
190 Smat.at(1,4) = (1/eta)*Mstar.
at(1);
191 Smat.at(2,4) = (1/eta)*Mstar.
at(2);
192 Smat.at(3,4) = (1/eta)*Mstar.
at(3);
194 Smat.at(4,1) = M.
at(1)*Kstiff.at(1,1);
195 Smat.at(4,2) = M.
at(2)*Kstiff.at(2,2);
196 Smat.at(4,3) = M.
at(3)*Kstiff.at(3,3);
215 alpha_v.
at(1) = Smati.
at(4,1);
216 alpha_v.
at(2) = Smati.
at(4,2);
217 alpha_v.
at(3) = Smati.
at(4,3);
223 Qtemp *= 1 - oldDamage - dAlpha;
228 Qtemp.times(1-oldDamage-dAlpha);
230 if (oldDamage + dAlpha<1) {
231 Qtemp.at(3) = (1-oldDamage)/(1-oldDamage + dAlpha)*Qtemp.at(3);
233 Qtemp.times(1-oldDamage-dAlpha);
236 Qtemp.times(1-oldDamage-dAlpha);
237 Qtemp.at(3) = (1-oldDamage)*(Qold.
at(3) + Kstiff.at(3,3)*dJElastic.at(3));
243 dAlpha = 1.0 - oldDamage;
253 auto answer =
Tdot(Finv, Qtemp);
265 Qtemp = (1-oldDamage) * Qtrial + Qtemp_comp;
266 answer =
Tdot(Finv, Qtemp);
274IntMatBilinearCZJansson :: give3dStiffnessMatrix_dTdj(MatResponseMode rMode,
GaussPoint *gp,
TimeStep *tStep)
const
297 if ( damage >= 1.0 ) {
299 Kstiff.at(1,1) = 0.0;
300 Kstiff.at(2,2) = 0.0;
301 Kstiff.at(3,3) = this->
knc;
303 answer =
rotate(Kstiff, Finv);
308 Kstiff.at(3,3) += this->
knc/(1-damage);
311 answer = (1-damage) *
rotate(Kstiff, Finv);
323 answer = (1-damage) *
dot(Kstiff, Iep);
332 auto temp1 =
Tdot(Finv, Qtemp);
333 auto temp2 =
Tdot(Finv, alpha_v);
335 auto t1hatFinvOpen =
dyad(temp1, temp2);
338 answer.
at(3,3) += this->
knc;
342 answer =
rotate(answer, Finv) - t1hatFinvOpen;
380 if ( this->
kn0 < 0.0 ) {
382 }
else if ( this->
ks0 < 0.0 ) {
384 }
else if ( this->
GIc < 0.0 ) {
386 }
else if ( this->
GIIc < 0.0 ) {
388 }
else if ( this->
gamma < 0.0 ) {
394 printf(
"In IntMatBilinearCZJansson::initializeFrom: Semi-explicit time integration activated.\n");
399IntMatBilinearCZJansson :: checkConsistency()
405IntMatBilinearCZJansson :: printYourself()
407 printf(
"Paramters for BilinearCZMaterial: \n");
409 printf(
"-Strength paramters \n");
410 printf(
" sigf = %e \n", this->
sigf);
411 printf(
" GIc = %e \n", this->
GIc);
412 printf(
" GIIc = %e \n", this->
GIIc);
413 printf(
" gamma = sigfs/sigfn = %e \n", this->
gamma);
414 printf(
" mu = %e \n", this->
mu);
416 printf(
"-Stiffness parameters \n");
417 printf(
" kn0 = %e \n", this->
kn0);
418 printf(
" ks0 = %e \n", this->
ks0);
419 printf(
" knc = %e \n", this->
knc);
437 OOFEM_ERROR(
"BilinearCZMaterialJansson :: giveRealStressVector - oh no wrong element type");
440 lCoords.
at(1) =
gp->giveCoordinate(1);
441 lCoords.
at(2) =
gp->giveCoordinate(2);
447 N.beVectorProductOf(G1,G2);
463IntMatBilinearCZJanssonStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
466 StructuralInterfaceMaterialStatus :: printOutputAt(file, tStep);
479IntMatBilinearCZJanssonStatus :: initTempStatus()
481 StructuralInterfaceMaterialStatus :: initTempStatus();
496IntMatBilinearCZJanssonStatus :: updateYourself(
TimeStep *atTime)
498 StructuralInterfaceMaterialStatus :: updateYourself(atTime);
#define REGISTER_Material(class)
double & at(std::size_t i)
void beVectorProductOf(const FloatArray &v1, const FloatArray &v2)
double at(std::size_t i, std::size_t j) const
void copyColumn(FloatArray &dest, int c) const
void beSubMatrixOf(const FloatMatrix &src, Index topRow, Index bottomRow, Index topCol, Index bottomCol)
bool beInverseOf(const FloatMatrix &src)
double at(std::size_t i, std::size_t j) const
const FloatMatrixF< 3, 3 > & giveTempInverseDefGrad() const
void letTempAlphavBe(const FloatArrayF< 3 > &v)
const FloatArrayF< 3 > & giveTempAlphav() const
void letTempdTdJBe(const FloatMatrix &v)
FloatMatrixF< 3, 3 > tempRot
void letTempInverseDefGradBe(const FloatMatrixF< 3, 3 > &v)
double giveTempDamage() const override
FloatArrayF< 3 > oldMaterialJump
const FloatMatrixF< 3, 3 > & giveOlddTdJ() const
FloatArrayF< 3 > tempMaterialJump
FloatMatrixF< 3, 3 > old_dTdJ
void letTempEffectiveMandelTractionBe(const FloatArrayF< 3 > &v)
FloatMatrixF< 3, 3 > tempFInv
bool giveOldDamageDev() const
void letTempMaterialJumpBe(const FloatArrayF< 3 > &v)
FloatArrayF< 3 > tempQEffective
FloatArrayF< 3 > QEffective
const FloatArrayF< 3 > & giveTempEffectiveMandelTraction() const
double giveDamage() const override
void letOldDamageDevBe(bool v)
void letTempDamageBe(double v)
const FloatArrayF< 3 > & giveEffectiveMandelTraction() const
const FloatMatrixF< 3, 3 > & giveTempIep() const
void letTempDamageDevBe(bool v)
const FloatArrayF< 3 > & giveOldMaterialJump() const
void letTempIepBe(const FloatMatrixF< 3, 3 > &v)
FloatMatrixF< 3, 3 > temp_dTdJ
GaussPoint * gp
Associated integration point.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
FloatMatrixF< 3, 3 > evalInitialCovarBaseVectorsAt(const FloatArrayF< 3 > &lCoords)
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)
#define _IFT_IntMatBilinearCZJansson_ks
#define _IFT_IntMatBilinearCZJansson_g2c
#define _IFT_IntMatBilinearCZJansson_sigf
#define _IFT_IntMatBilinearCZJansson_kn
#define _IFT_IntMatBilinearCZJansson_gamma
#define _IFT_IntMatBilinearCZJansson_semiexplicit
#define _IFT_IntMatBilinearCZJansson_g1c
#define _IFT_IntMatBilinearCZJansson_mu
#define _IFT_IntMatBilinearCZJansson_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)
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.
FloatMatrixF< N, N > eye()
Constructs an identity matrix.