70 FloatArrayF<6> stress = (1.0 - tempDam) * nlStatus->giveTempEffectiveStress();
71 nlStatus->setTempDamage(tempDam);
72 nlStatus->letTempStrainVectorBe(totalStrain);
73 nlStatus->letTempStressVectorBe(stress);
83 double kappa = status->giveCumulativePlasticStrain();
84 double tempKappa = status->giveTempCumulativePlasticStrain();
85 double tempDamage = status->giveTempDamage();
86 double damage = status->giveDamage();
88 auto tangent = ( 1 - tempDamage ) *
E;
89 if ( mode != TangentStiffness ) {
93 if ( tempKappa <= kappa ) {
98 const auto &stressVector = status->giveTempEffectiveStress();
99 double stress = stressVector.at(1);
100 tangent = ( 1. - tempDamage ) *
E *
H / (
E +
H );
101 if ( tempDamage > damage ) {
125 nlstatus->setLocalCumPlasticStrainForAverage(cumPlasticStrain);
135MisesMatNl :: modifyNonlocalWeightFunctionAround(
GaussPoint *gp)
const
139 std :: vector< localIntegrationRecord > :: iterator pos, postarget;
142 for ( pos = list->begin(); pos != list->end(); ++pos ) {
143 if ( pos->nearGp == gp ) {
151 double xtarget = coords.
at(1);
153 double w, wsum = 0., x, xprev, damage, damageprev = 0.0;
159 for ( pos = postarget; pos != list->end(); ++pos ) {
160 nearElem = ( pos->nearGp )->giveElement();
165 if ( pos != postarget ) {
178 for ( pos = postarget; pos != list->begin(); --pos ) {
179 nearElem = ( pos->nearGp )->giveElement();
184 if ( pos != postarget ) {
197 if ( pos != postarget ) {
198 nearElem = ( pos->nearGp )->giveElement();
213MisesMatNl :: computeDistanceModifier(
double damage)
const
216 case 2:
return 1. / (
Rf /
cl + ( 1. -
Rf /
cl ) * pow(1. - damage,
exponent) );
218 case 3:
if ( damage == 0. ) {
221 return 1. / ( 1. - ( 1. -
Rf /
cl ) * pow(damage,
exponent) );
224 case 4:
return 1. / pow(
Rf /
cl, damage);
226 case 5:
return ( 2. *
cl ) / (
cl +
Rf + (
cl -
Rf ) * cos(
M_PI * damage) );
239 double localCumPlasticStrain = status->giveLocalCumPlasticStrainForAverage();
243 double nonlocalCumPlasticStrain = 0.0;
244 for (
auto &lir: *list ) {
247 if ( nonlocalContribution > 0 ) {
248 nonlocalContribution *= lir.weight;
251 nonlocalCumPlasticStrain += nonlocalContribution;
254 double scale = status->giveIntegrationScale();
256 nonlocalCumPlasticStrain *= 1. / scale;
259 nonlocalCumPlasticStrain *= 1. / scale;
261 nonlocalCumPlasticStrain += ( 1. - scale ) * status->giveLocalCumPlasticStrainForAverage();
265 return mm * nonlocalCumPlasticStrain + ( 1. -
mm ) * localCumPlasticStrain;
284 MisesMat :: initializeFrom(ir);
285 StructuralNonlocalMaterialExtensionInterface :: initializeFrom(ir);
310 StructuralMaterial :: giveInputRecord(input);
311 StructuralNonlocalMaterialExtensionInterface :: giveInputRecord(input);
330 double dam = nlStatus->giveDamage();
332 if ( tempDam < dam ) {
357 for (
auto &lir: *list ) {
358 rmat =
dynamic_cast< MisesMatNl *
>( lir.nearGp->giveMaterial() );
371std :: vector< localIntegrationRecord > *
372MisesMatNl :: NonlocalMaterialStiffnessInterface_giveIntegrationDomainList(
GaussPoint *gp)
389 double damage = status->giveDamage();
390 double tempDamage = status->giveTempDamage();
391 if ( ( tempDamage - damage ) > 0 ) {
392 const FloatArray &stress = status->giveTempEffectiveStress();
393 elem->giveLocationArray(loc, s);
394 elem->computeBmatrixAt(gp, b);
408 double kappa, tempKappa;
419 if ( ( tempKappa - kappa ) > 0 ) {
423 double coeff =
sgn( stress.
at(1) ) *
E / (
E +
H );
441MisesMatNlStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
443 StructuralMaterialStatus :: printOutputAt(file, tStep);
444 fprintf(file,
"status { ");
445 fprintf(file,
"kappa %f, damage %f ", this->
kappa, this->
damage);
446 fprintf(file,
"}\n");
451MisesMatNlStatus :: initTempStatus()
457 MisesMatStatus :: initTempStatus();
469 MisesMatStatus :: updateYourself(tStep);
476 MisesMatStatus :: saveContext(stream, mode);
484 MisesMatStatus :: restoreContext(stream, mode);
495 return MisesMatStatus :: giveInterface(type);
517 double localCumPlasticStrainForAverage;
519 result = buff.
read(localCumPlasticStrainForAverage);
#define REGISTER_Material(class)
virtual int read(int *data, std::size_t count)=0
Reads count integer values into array pointed by data.
virtual int givePackSizeOfDouble(std::size_t count)=0
virtual int write(const int *data, std::size_t count)=0
Writes count integer values from array pointed by data.
virtual int computeGlobalCoordinates(FloatArray &answer, const FloatArray &lcoords)
void giveLocationArray(IntArray &locationArray, const UnknownNumberingScheme &s, IntArray *dofIds=NULL) const
virtual double computeVolumeAround(GaussPoint *gp)
void plusProduct(const FloatMatrix &b, const FloatArray &s, double dV)
void zero()
Zeroes all coefficients of receiver.
*Sets size of receiver to be an empty matrix It will have zero rows and zero columns size void clear()
int giveNumberOfColumns() const
Returns number of columns of receiver.
void plusDyadUnsym(const FloatArray &a, const FloatArray &b, double dV)
const FloatArray & giveNaturalCoordinates() const
Returns coordinate array of receiver.
MaterialMode giveMaterialMode()
Returns corresponding material mode of receiver.
Element * giveElement()
Returns corresponding element to receiver.
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
virtual void initTempStatus(GaussPoint *gp) const
double giveLocalCumPlasticStrainForAverage()
void setLocalCumPlasticStrainForAverage(double ls)
void modifyNonlocalWeightFunctionAround(GaussPoint *gp) const
double computeDistanceModifier(double damage) const
MisesMatNl(int n, Domain *d)
double computeDamage(GaussPoint *gp, TimeStep *tStep) const
virtual double computeCumPlasticStrain(GaussPoint *gp, TimeStep *tStep) const
int giveLocalNonlocalStiffnessContribution(GaussPoint *gp, IntArray &loc, const UnknownNumberingScheme &s, FloatArray &lcontrib, TimeStep *tStep)
void giveRemoteNonlocalStiffnessContribution(GaussPoint *gp, IntArray &rloc, const UnknownNumberingScheme &s, FloatArray &rcontrib, TimeStep *tStep)
double computeLocalCumPlasticStrain(GaussPoint *gp, TimeStep *tStep) const
double damage
damage variable (initial).
double giveTempCumulativePlasticStrain() const
double giveTempDamage() const
double giveCumulativePlasticStrain() const
const FloatArray & giveTempEffectiveStress() const
double kappa
Cumulative plastic strain (initial).
MisesMatStatus(GaussPoint *g)
IsotropicLinearElasticMaterial linearElasticMaterial
Reference to the basic elastic material.
double computeDamageParam(double tempKappa) const
void performPlasticityReturn(const FloatArray &totalStrain, GaussPoint *gp, TimeStep *tStep) const
double H
Hardening modulus.
double computeDamageParamPrime(double tempKappa) const
MisesMat(int n, Domain *d)
virtual double computeWeightFunction(const double cl, const double distance) const
void buildNonlocalPointTable(GaussPoint *gp) const
ScalingType scaling
Parameter specifying the type of scaling of nonlocal weight function.
double mm
For "undernonlocal" or "overnonlocal" formulation.
void updateDomainBeforeNonlocAverage(TimeStep *tStep) const
std ::vector< localIntegrationRecord > * giveIPIntegrationList(GaussPoint *gp) const
void setIntegrationScale(double val)
Sets associated integration scale.
std ::vector< localIntegrationRecord > * giveIntegrationDomainList()
double giveIntegrationScale()
Returns associated integration scale.
NonlocalMaterialStiffnessInterface()
Constructor.
virtual int assemble(const IntArray &loc, const FloatMatrix &mat)=0
virtual void computeBmatrixAt(GaussPoint *gp, FloatMatrix &answer, int lowerIndx=1, int upperIndx=ALL_STRAINS)=0
StructuralNonlocalMaterialExtensionInterface(Domain *d)
StructuralNonlocalMaterialStatusExtensionInterface()
#define _IFT_MisesMatNl_exp
#define _IFT_MisesMatNl_averagingtype
#define _IFT_MisesMatNl_rf
double sgn(double i)
Returns the signum of given value (if value is < 0 returns -1, otherwise returns 1).
@ NonlocalMaterialStiffnessInterfaceType
@ NonlocalMaterialStatusExtensionInterfaceType
@ NonlocalMaterialExtensionInterfaceType
double distance(const FloatArray &x, const FloatArray &y)