66 FRCFCM :: initializeFrom(ir);
67 StructuralNonlocalMaterialExtensionInterface :: initializeFrom(ir);
79 FCMMaterial :: giveRealStressVector(answer, gp, totalStrain, tStep);
84 double sigma_f_nonlocal = 0.;
88 double sigma_f_local = 0.;
91 if ( numberOfActiveCracks == 0 ) {
114 if ( crackStrain > 0. ) {
132 crackVec.
at(i) = crackDirs.
at(i, iCrack);
145 sigma.
at(iCrack) += sigma_f_nonlocal;
162FRCFCMNL :: computeDebondedLength(
double delta)
const {
166 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
170 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
172 a =
min( a, this->
Lf / ( 2. * ( 1. + this->
eta ) ) );
174 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
176 a =
min( a, this->
Lf / ( 2. * ( 1. + this->
eta ) ) );
186FRCFCMNL :: computeDecreaseInFibreStress(
double distance,
double delta,
double targetDebondedLength)
const {
194 double delta_sigma_f = 0.;
200 if ( delta < this->
w_star / 2. ) {
212 delta_sigma_f = this->
Vf * 4. * tau * ( this->
Lf * x - x * x ) / ( this->
Df * this->
Lf );
216 delta_sigma_f = this->
Vf * 4. * tau * ( this->
Lf * x - x * x ) / ( 3 * this->
Df * this->
Lf );
220 return delta_sigma_f;
226 double A, cx, cy, x_i, x_ii, y_i, y_ii;
237 if ( ( nnode == 3 ) || ( nnode == 4 ) ) {
238 for (
int inod = 1; inod < nnode; inod++ ) {
245 A += 0.5 * ( x_i * y_ii - x_ii * y_i );
247 cx += ( x_i + x_ii ) * ( x_i * y_ii - x_ii * y_i );
248 cy += ( y_i + y_ii ) * ( x_i * y_ii - x_ii * y_i );
257 A += 0.5 * ( x_i * y_ii - x_ii * y_i );
259 cx += ( x_i + x_ii ) * ( x_i * y_ii - x_ii * y_i );
260 cy += ( y_i + y_ii ) * ( x_i * y_ii - x_ii * y_i );
280 double x, y, b_min, b_max, b_home, slope, x_min, x_max;
294 if ( fabs(slope) < 1.e6 ) {
295 b_min = b_max = b_home = 0.;
297 for (
int inod = 1; inod <= nnode; inod++ ) {
304 b_min = y - slope * x;
305 b_max = y - slope * x;
307 b_min =
min(b_min, y - slope * x);
308 b_max =
max(b_max, y - slope * x);
312 b_home = examinedCoords.
at(2) - slope *examinedCoords.
at(1);
314 if ( ( b_min < b_home ) && ( b_home < b_max ) ) {
322 for (
int inod = 1; inod < nnode; inod++ ) {
329 x_min =
min(x_min, x);
330 x_max =
max(x_max, x);
334 if ( ( x_min < examinedCoords.
at(1) ) && ( examinedCoords.
at(1) < x_max ) ) {
366 double sigma_f_left = 0.;
367 double sigma_f_right = 0.;
371 double alpha, k_alpha_Home;
378 double distance, targetCrackOpening, delta, a, targetDebondedLength, theta;
379 double sigma_f_iCr, delta_sigma_f;
385 pointVector = crackVectorTarget;
387 for (
auto &lir : *list ) {
403 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
404 distance += ( coordsHome.
at(i) - coordsTarget.
at(i) ) * ( coordsHome.
at(i) - coordsTarget.
at(i) );
424 targetDebondedLength = a;
426 if (
distance < targetDebondedLength ) {
434 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
435 pointVector.
at(i) = ( coordsHome.
at(i) - coordsTarget.
at(i) ) /
distance;
442 sigma_f_iCr /= ( fabs( cos(theta) ) * exp(fabs(theta) * this->
f) );
444 sigma_f_iCr *= 2. / ( 3. * this->
g );
452 sigma_f_iCr -= delta_sigma_f;
455 sigma_f_iCr =
max(sigma_f_iCr, 0.);
460 if ( alpha <
M_PI / 2. ) {
472 crackVectorTarget.
zero();
473 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
483 if ( alpha >
M_PI / 2. ) {
484 alpha =
M_PI - alpha;
497 sigma_f_left =
max(k_alpha_Home * sigma_f_iCr, sigma_f_left);
499 sigma_f_right =
max(k_alpha_Home * sigma_f_iCr, sigma_f_right);
511 return (
max(sigma_f_left, sigma_f_right) );
529 double distance, targetCrackOpening, delta, a, targetDebondedLength, theta, sigma_f_iCr, delta_sigma_f;
535 for (
auto &lir : *list ) {
551 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
552 distance += ( coordsHome.
at(i) - coordsTarget.
at(i) ) * ( coordsHome.
at(i) - coordsTarget.
at(i) );
569 targetDebondedLength = a;
571 if (
distance < targetDebondedLength ) {
579 sigma_f_iCr /= ( fabs( cos(theta) ) * exp(fabs(theta) * this->
f) );
581 sigma_f_iCr /= this->
g;
589 sigma_f_iCr -= delta_sigma_f;
592 sigma_f_iCr =
max(sigma_f_iCr, 0.);
595 sigma_f =
max(sigma_f_iCr, sigma_f);
616 if ( !FRCFCM :: isStrengthExceeded(base, gp, tStep, iCrack, trialStress) ) {
622 double sigma_f, sigma_m;
630 crackVec.
at(i) = base.
at(i, iCrack);
641 sigma_m = ( trialStress - sigma_f ) / ( 1. - this->
Vf );
645 if ( FCMMaterial :: isStrengthExceeded(base, gp, tStep, iCrack, sigma_m) ) {
656 MatResponseMode rMode,
664 if ( rMode == ElasticStiffness ) {
665 FCMMaterial :: giveMaterialStiffnessMatrix(answer, rMode, gp, tStep);
666 }
else if ( rMode == SecantStiffness ) {
684 FCMMaterial :: giveMaterialStiffnessMatrix(answer, rMode, gp, tStep);
686 FCMMaterial :: giveMaterialStiffnessMatrix(answer, rMode, gp, tStep);
699 OOFEM_ERROR(
"the length of vec1 and vec2 is not of the same");
706 double length1 = 0., length2 = 0.;
710 length1 += pow(vec1.
at(i), 2);
711 length2 += pow(vec2.
at(i), 2);
712 theta += vec1.
at(i) * vec2.
at(i);
714 length1 = sqrt(length1);
715 length2 = sqrt(length2);
718 theta /= ( length1 * length2 );
724 }
else if ( theta < -1. ) {
760 if ( type == IST_FiberStressLocal ) {
762 answer.
at(1) = local;
766 }
else if ( type == IST_FiberStressNL ) {
771 return FRCFCM :: giveIPValue(answer, gp, type, tStep);
793FRCFCMNLStatus :: printOutputAt(FILE *file,
TimeStep *tStep)
const
795 FRCFCMStatus :: printOutputAt(file, tStep);
797 fprintf(file,
"maxFiberStressLocal: {");
799 fprintf( file,
" %f", s );
801 fprintf(file,
"}\n");
803 fprintf(file,
"maxFiberStressNL: {");
805 fprintf( file,
" %f", s );
807 fprintf(file,
"}\n");
812FRCFCMNLStatus :: initTempStatus()
818 FRCFCMStatus :: initTempStatus();
834 FRCFCMStatus :: updateYourself(tStep);
845 FRCFCMStatus :: saveContext(stream, mode);
860 FRCFCMStatus :: restoreContext(stream, mode);
879 return ConcreteFCMStatus :: giveInterface(type);
#define REGISTER_Material(class)
MaterialStatus * giveStatus(GaussPoint *gp) const override
double giveCoordinate(int i) const
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
Node * giveNode(int i) const
virtual int giveNumberOfNodes() const
const FloatMatrix & giveG2LStressVectorTransformationMtrx()
returns transformation matrix for stress transformation from global to local coordinate system
const FloatMatrix & giveL2GStressVectorTransformationMtrx()
sets transformation matrix for stress transformation from local to global coordinate system
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
double giveTempCrackStrain(int icrack) const
returns i-th component of the crack strain vector (temporary)
const FloatMatrix & giveCrackDirs()
returns crack directions
int nMaxCracks
number of maximum possible cracks (optional parameter)
virtual int giveMaxNumberOfCracks(GaussPoint *gp)
returns maximum number of cracks associated with current mode
virtual double computeNormalCrackOpening(GaussPoint *gp, int i) const
uses temporary cracking strain and characteristic length to obtain the crack opening
Domain * giveDomain() const
double giveFiberStressLoc(int icrack) const
LOCAL FIBER STRESSES (from crack opening).
FloatArray fiberStressLoc
bulk stress in fibers - evaluated from crack opening
double giveTempFiberStressLoc(int icrack) const
void setTempFiberStressLoc(int icrack, double newFiberStressLoc)
FloatArray tempFiberStressNL
Non-equilibrated stress (bulk) in fibers.
FloatArray fiberStressNL
bulk stress in fibers - evaluated from crack opening
void setTempFiberStressNL(int icrack, double newFiberStressNL)
double giveFiberStressNL(int icrack) const
NON-LOCAL FIBER STRESSES (from surrounding cracks).
FloatArray tempFiberStressLoc
Non-equilibrated stress (bulk) in fibers.
virtual double computeNonlocalStressInFibers(const FloatArray &crackVector, GaussPoint *gp, TimeStep *tStep) const
computes nonlocal stress in fibers in cracked GP
bool isInElementProjection(GaussPoint *homeGp, GaussPoint *nearGp, int iNlCrack) const
checks if a element center of homeGP is in projection of element containing nearGP
double computeDecreaseInFibreStress(double distance, double delta, double debondedLength) const
compute the the difference in fiber stress in the target (local stress) and receiver (nonlocal stress...
double computeDebondedLength(double delta) const
computes debonded length of the fibers from the crack opening. Delta is here one half of the crack op...
double participAngle
participation angle. The target gauss point must fall into this angle to contribute to the nonlocal s...
double computeAngleBetweenVectors(const FloatArray &vec1, const FloatArray &vec2) const
computes an angle between two vectors
void computeElementCentroid(FloatArray &answer, GaussPoint *gp) const
computes cetroid of a finite element - works only for linear 3 and 4-node elements
virtual double computeNonlocalStressInFibersInUncracked(GaussPoint *gp, TimeStep *tStep) const
computes nonlocal stress in fibers in uncracked GP
FRCFCMStatus(GaussPoint *g)
virtual double computeFiberBond(double w) const
evaluates the fiber bond if w > w*
double f
snubbing factor "f"
virtual double computeStressInFibersInCracked(GaussPoint *gp, TimeStep *tStep, double eps_cr, int i) const
compute the nominal stress in fibers in the i-th crack
double tau_0
fiber shear strength at zero slip
double g
auxiliary parameter computed from snubbing factor "f"
double Ef
fiber Young's modulus
double w_star
transitional opening
virtual double computeCrackFibreAngle(GaussPoint *gp, int i) const
compute the angle between the fibre and i-th crack normal
double fibreActivationOpening
crack opening at which the crossing fibers begin to be activated
FloatArray orientationVector
orientation of fibres
double Vf
volume fraction of fibers
bool containsOnlyZeroes() const
Index giveSize() const
Returns the size of receiver.
void zero()
Zeroes all coefficients of receiver.
void rotatedWith(FloatMatrix &r, char mode)
double at(std::size_t i, std::size_t j) const
Material * giveMaterial()
Returns reference to material associated to related element of receiver.
IntegrationPointStatus * giveMaterialStatus(IntegrationPointStatusIDType key=IPSID_Default)
Element * giveElement()
Returns corresponding element to receiver.
GaussPoint * gp
Associated integration point.
void buildNonlocalPointTable(GaussPoint *gp) const
std ::vector< localIntegrationRecord > * giveIPIntegrationList(GaussPoint *gp) const
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
StructuralNonlocalMaterialExtensionInterface(Domain *d)
StructuralNonlocalMaterialStatusExtensionInterface()
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
FloatArrayF< N > max(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
@ NonlocalMaterialStatusExtensionInterfaceType
@ NonlocalMaterialExtensionInterfaceType
double distance(const FloatArray &x, const FloatArray &y)