53TrabBoneGrad3D :: hasMaterialModeCapability(MaterialMode mode)
const
55 return mode == _3dMat;
76 OOFEM_ERROR(
"givePDGradMatrix_uu : unknown mode (%s)", __MaterialModeToString(mMode) );
89 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
102 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
116 OOFEM_ERROR(
"unknown mode (%s)", __MaterialModeToString(mMode) );
121TrabBoneGrad3D :: giveNonlocalInternalForces_N_factor(
double &answer,
double nlDamageDrivingVariable,
GaussPoint *gp,
TimeStep *tStep)
123 answer = nlDamageDrivingVariable;
129 answer = nlDamageDrivingVariable_grad;
143TrabBoneGrad3D :: give3dMaterialStiffnessMatrix(MatResponseMode mode,
GaussPoint *gp,
TimeStep *tStep)
const
147 if ( mode == ElasticStiffness ) {
149 auto elasticity =
inv(compliance);
151 }
else if ( mode == SecantStiffness ) {
157 auto elasticity =
inv(compliance);
158 auto tempDam = status->giveTempDam();
159 answer = elasticity * (1.0 - tempDam);
160 }
else if ( mode == TangentStiffness ) {
161 double kappa = status->giveKappa();
162 double tempKappa = status->giveTempKappa();
163 double tempDam = status->giveTempDam();
164 if ( tempKappa > kappa ) {
167 auto &tempEffectiveStress = status->giveTempEffectiveStress();
168 auto &plasFlowDirec = status->givePlasFlowDirec();
169 auto &SSaTensor = status->giveSSaTensor();
170 auto beta = status->giveBeta();
172 auto prodTensor =
Tdot(SSaTensor, plasFlowDirec);
174 auto tempTensor2 =
dot(SSaTensor, plasFlowDirec);
175 auto secondTerm =
dyad(tempTensor2, prodTensor) * (-( 1.0 - tempDam ) / beta);
177 auto tangentMatrix = SSaTensor * (1.0 - tempDam) + secondTerm;
178 if ( tempDam > status->giveDam() ) {
179 double nlKappa = status->giveNonlocalCumulatedStrain();
180 double kappa =
mParam * nlKappa + ( 1. -
mParam ) * tempKappa;
181 double gPrime = TrabBone3D :: computeDamageParamPrime(kappa);
183 auto thirdTerm =
dyad(tempEffectiveStress, prodTensor) * gPrime * ( ( 1. -
mParam ) / beta );
184 tangentMatrix += thirdTerm;
187 answer = tangentMatrix;
192 auto elasticity =
inv(compliance);
193 answer = elasticity * (1.0 - tempDam);
197 double g = status->giveDensG();
200 answer +=
I6_I6 * factor;
213 if ( mode == TangentStiffness ) {
217 double tempKappa = status->giveTempKappa();
218 double dKappa = tempKappa - kappa;
220 if ( dKappa > 0.0 ) {
221 auto &plasFlowDirec = status->givePlasFlowDirec();
222 auto &SSaTensor = status->giveSSaTensor();
223 double beta = status->giveBeta();
224 auto prodTensor =
Tdot(SSaTensor, plasFlowDirec);
225 for (
int i = 1; i <= 6; i++ ) {
226 answer.
at(1, i) = prodTensor.at(i);
229 answer.
times(1. / beta);
241 if ( mode == TangentStiffness ) {
244 double damage = status->giveDam();
245 double nlKappa = status->giveNonlocalCumulatedStrain();
246 double kappa =
mParam * nlKappa + ( 1. -
mParam ) * tempKappa;
247 double tempDamage = TrabBone3D :: computeDamageParam(kappa);
249 if ( ( tempDamage - damage ) > 0 ) {
250 auto &tempEffStress = status->giveTempEffectiveStress();
251 for (
int i = 1; i <= 6; i++ ) {
252 answer.
at(i, 1) = tempEffStress.at(i);
255 double kappa =
mParam * nlKappa + ( 1. -
mParam ) * tempKappa;
256 double gPrime = TrabBone3D :: computeDamageParamPrime(kappa);
276 TrabBone3D :: performPlasticityReturn(gp, totalStrain, tStep);
279 auto tempEffStress = status->giveTempEffectiveStress();
280 answer1 = (1 - tempDamage) * tempEffStress;
281 answer2 = status->giveTempKappa();
287 status->letTempStrainVectorBe(totalStrain);
288 status->setNonlocalCumulatedStrain(nonlocalCumulatedStrain);
290 status->setTempDam(tempDamage);
291 status->setTempEffectiveStress(tempEffStress);
292 status->letTempStressVectorBe(answer1);
301 double nlCumPlastStrain = status->giveNonlocalCumulatedStrain();
302 return mParam * nlCumPlastStrain + ( 1 -
mParam ) * localCumPlastStrain;
309 TrabBone3D :: initializeFrom(ir);
327TrabBoneGrad3DStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
329 TrabBone3DStatus :: printOutputAt(file, tStep);
334TrabBoneGrad3DStatus :: initTempStatus()
336 TrabBone3DStatus :: initTempStatus();
341TrabBoneGrad3DStatus :: updateYourself(
TimeStep *tStep)
343 StructuralMaterialStatus :: updateYourself(tStep);
#define REGISTER_Material(class)
void add(const FloatArray &src)
void resize(Index rows, Index cols)
void zero()
Zeroes all coefficient of receiver.
double at(std::size_t i, std::size_t j) const
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
GradientDamageMaterialExtensionInterface(Domain *d)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
FloatArrayF< 6 > tempPlasDef
double giveTempKappa() const
TrabBone3DStatus(GaussPoint *g)
FloatMatrixF< 6, 6 > constructAnisoComplTensor() const
Construct anisotropic compliance tensor.
TrabBone3D(int n, Domain *d)
double gammaL0
Densificator properties.
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
FloatArrayF< 6 > computeDensificationStress(GaussPoint *gp, const FloatArrayF< 6 > &totalStrain, TimeStep *tStep) const
FloatMatrixF< 6, 6 > give3dMaterialStiffnessMatrix(MatResponseMode, GaussPoint *gp, TimeStep *tStep) const override
void give3dKappaMatrix(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void give3dGprime(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
void giveInternalLength(FloatMatrix &answer, MatResponseMode mode, GaussPoint *gp, TimeStep *tStep)
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 .
const FloatMatrixF< 6, 6 > I6_I6
I(x)I expressed in Voigt form.
double dot(const FloatArray &x, const FloatArray &y)
FloatMatrixF< N, N > inv(const FloatMatrixF< N, N > &mat, double zeropiv=1e-24)
Computes the inverse.
#define _IFT_TrabBoneGrad3D_m
#define _IFT_TrabBoneGrad3D_L