45 #include "../sm/Elements/structuralelement.h" 96 double sigma_f_nonlocal = 0.;
100 double sigma_f_local = 0.;
103 if ( numberOfActiveCracks == 0 ) {
126 if ( crackStrain > 0. ) {
144 crackVec.
at(i) = crackDirs.
at(i, iCrack);
157 sigma.
at(iCrack) += sigma_f_nonlocal;
178 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
182 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
184 a =
min( a, this->
Lf / ( 2. * ( 1. + this->
eta ) ) );
186 a = sqrt( ( this->
Ef * this->
Df * delta ) / ( 2. * this->
tau_0 * ( 1. + this->
eta ) ) );
188 a =
min( a, this->
Lf / ( 2. * ( 1. + this->
eta ) ) );
206 double delta_sigma_f = 0.;
210 delta_sigma_f = this->
Vf * 4. * this->
tau_0 * distance / this->
Df;
212 if ( delta < this->
w_star / 2. ) {
219 x =
min(distance, targetDebondedLength);
224 delta_sigma_f = this->
Vf * 4. * tau * ( this->
Lf * x - x * x ) / ( this->
Df * this->
Lf );
228 delta_sigma_f = this->
Vf * 4. * tau * ( this->
Lf * x - x * x ) / ( 3 * this->
Df * this->
Lf );
232 return delta_sigma_f;
238 double A, cx, cy, x_i, x_ii, y_i, y_ii;
249 if ( ( nnode == 3 ) || ( nnode == 4 ) ) {
250 for (
int inod = 1; inod < nnode; inod++ ) {
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 );
269 A += 0.5 * ( x_i * y_ii - x_ii * y_i );
271 cx += ( x_i + x_ii ) * ( x_i * y_ii - x_ii * y_i );
272 cy += ( y_i + y_ii ) * ( x_i * y_ii - x_ii * y_i );
292 double x, y, b_min, b_max, b_home, slope, x_min, x_max;
306 if ( fabs(slope) < 1.e6 ) {
307 b_min = b_max = b_home = 0.;
309 for (
int inod = 1; inod <= nnode; inod++ ) {
316 b_min = y - slope * x;
317 b_max = y - slope * x;
319 b_min =
min(b_min, y - slope * x);
320 b_max =
max(b_max, y - slope * x);
324 b_home = examinedCoords.
at(2) - slope *examinedCoords.
at(1);
326 if ( ( b_min < b_home ) && ( b_home < b_max ) ) {
334 for (
int inod = 1; inod < nnode; inod++ ) {
341 x_min =
min(x_min, x);
342 x_max =
max(x_max, x);
346 if ( ( x_min < examinedCoords.
at(1) ) && ( examinedCoords.
at(1) < x_max ) ) {
378 double sigma_f_left = 0.;
379 double sigma_f_right = 0.;
383 double alpha, k_alpha_Home;
390 double distance, targetCrackOpening, delta, a, targetDebondedLength, theta;
391 double sigma_f_iCr, delta_sigma_f;
397 pointVector = crackVectorTarget;
399 for (
auto &lir : *list ) {
415 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
416 distance += ( coordsHome.
at(i) - coordsTarget.
at(i) ) * ( coordsHome.
at(i) - coordsTarget.
at(i) );
419 distance = sqrt(distance);
436 targetDebondedLength = a;
438 if ( distance < targetDebondedLength ) {
446 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
447 pointVector.
at(i) = ( coordsHome.
at(i) - coordsTarget.
at(i) ) / distance;
454 sigma_f_iCr /= ( fabs( cos(theta) ) * exp(fabs(theta) * this->
f) );
456 sigma_f_iCr *= 2. / ( 3. * this->
g );
464 sigma_f_iCr -= delta_sigma_f;
467 sigma_f_iCr =
max(sigma_f_iCr, 0.);
472 if ( alpha <
M_PI / 2. ) {
484 crackVectorTarget.
zero();
485 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
495 if ( alpha >
M_PI / 2. ) {
496 alpha =
M_PI - alpha;
509 sigma_f_left =
max(k_alpha_Home * sigma_f_iCr, sigma_f_left);
511 sigma_f_right =
max(k_alpha_Home * sigma_f_iCr, sigma_f_right);
523 return (
max(sigma_f_left, sigma_f_right) );
541 double distance, targetCrackOpening, delta, a, targetDebondedLength, theta, sigma_f_iCr, delta_sigma_f;
547 for (
auto &lir : *list ) {
563 for (
int i = 1; i <= coordsHome.
giveSize(); i++ ) {
564 distance += ( coordsHome.
at(i) - coordsTarget.
at(i) ) * ( coordsHome.
at(i) - coordsTarget.
at(i) );
567 distance = sqrt(distance);
581 targetDebondedLength = a;
583 if ( distance < targetDebondedLength ) {
591 sigma_f_iCr /= ( fabs( cos(theta) ) * exp(fabs(theta) * this->
f) );
593 sigma_f_iCr /= this->
g;
601 sigma_f_iCr -= delta_sigma_f;
604 sigma_f_iCr =
max(sigma_f_iCr, 0.);
607 sigma_f =
max(sigma_f_iCr, sigma_f);
634 double sigma_f, sigma_m;
642 crackVec.
at(i) = base.
at(i, iCrack);
653 sigma_m = ( trialStress - sigma_f ) / ( 1. - this->
Vf );
676 if ( rMode == ElasticStiffness ) {
678 }
else if ( rMode == SecantStiffness ) {
711 OOFEM_ERROR(
"the length of vec1 and vec2 is not of the same");
718 double length1 = 0., length2 = 0.;
722 length1 += pow(vec1.
at(i), 2);
723 length2 += pow(vec2.
at(i), 2);
724 theta += vec1.
at(i) * vec2.
at(i);
726 length1 = sqrt(length1);
727 length2 = sqrt(length2);
730 theta /= ( length1 * length2 );
736 }
else if ( theta < -1. ) {
772 if ( type == IST_FiberStressLocal ) {
774 answer.
at(1) = local;
778 }
else if ( type == IST_FiberStressNL ) {
796 fiberStressLoc(), tempFiberStressLoc(), fiberStressNL(), tempFiberStressNL()
816 fprintf(file,
"maxFiberStressLocal: {");
820 fprintf(file,
"}\n");
822 fprintf(file,
"maxFiberStressNL: {");
826 fprintf(file,
"}\n");
InternalStateType
Type representing the physical meaning of element or constitutive model internal variable.
Abstract base class for all nonlocal structural materials.
virtual bool isStrengthExceeded(const FloatMatrix &base, GaussPoint *gp, TimeStep *tStep, int iCrack, double trialStress)
the method from fcm is overridden to consider stress split between the matrix and fibers ...
int nMaxCracks
number of maximum possible cracks (optional parameter)
virtual bool isStrengthExceeded(const FloatMatrix &base, GaussPoint *gp, TimeStep *tStep, int iCrack, double trialStress)
compares trial stress with strength. Returns true if the strength is exceeded. Function oveloaded in ...
double giveFiberStressLoc(int icrack)
LOCAL FIBER STRESSES (from crack opening)
GaussPoint * gp
Associated integration point.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
double giveTempFiberStressLoc(int icrack)
FloatArray tempFiberStressLoc
Non-equilibrated stress (bulk) in fibers.
const FloatMatrix & giveG2LStressVectorTransformationMtrx()
returns transformation matrix for stress transformation from global to local coordinate system ...
The purpose of DataStream abstract class is to allow to store/restore context to different streams...
contextIOResultType storeYourself(DataStream &stream) const
double & at(int i)
Coefficient access function.
int max(int i, int j)
Returns bigger value form two given decimals.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
virtual Interface * giveInterface(InterfaceType it)
Interface requesting service.
void buildNonlocalPointTable(GaussPoint *gp)
Builds list of integration points which take part in nonlocal average in given integration point...
Abstract base class for all finite elements.
Element * giveElement()
Returns corresponding element to receiver.
const FloatMatrix & giveCrackDirs()
returns crack directions
double f
snubbing factor "f"
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
restores context(state) from stream
virtual double computeStressInFibersInCracked(GaussPoint *gp, double eps_cr, int i)
compute the nominal stress in fibers in the i-th crack
FloatArray fiberStressLoc
bulk stress in fibers - evaluated from crack opening
virtual double giveCoordinate(int i)
int giveNumberOfSpatialDimensions()
Returns number of spatial dimensions.
virtual void initTempStatus()
initializes temporary status
MatResponseMode
Describes the character of characteristic material matrix.
double fibreActivationOpening
crack opening at which the crossing fibers begin to be activated
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Writes information into the output file.
bool isInElementProjection(GaussPoint *homeGp, GaussPoint *nearGp, int iNlCrack)
checks if a element center of homeGP is in projection of element containing nearGP ...
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
void rotatedWith(FloatMatrix &r, char mode)
Returns the receiver a rotated according the change-of-base matrix r.
double participAngle
participation angle. The target gauss point must fall into this angle to contribute to the nonlocal s...
virtual int giveNumberOfNodes() const
Returns number of nodes of receiver.
IRResultType initializeFrom(InputRecord *ir)
double g
auxiliary parameter computed from snubbing factor "f"
double giveTempCrackStrain(int icrack) const
returns i-th component of the crack strain vector (temporary)
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
saves current context(state) into stream
double giveFiberStressNL(int icrack)
NON-LOCAL FIBER STRESSES (from surrounding cracks)
double computeAngleBetweenVectors(const FloatArray &vec1, const FloatArray &vec2)
computes an angle between two vectors
double w_star
transitional opening
FRCFCMNLStatus(int n, Domain *d, GaussPoint *g)
const FloatMatrix & giveL2GStressVectorTransformationMtrx()
sets transformation matrix for stress transformation from local to global coordinate system ...
virtual bool isStrengthExceeded(const FloatMatrix &base, GaussPoint *gp, TimeStep *tStep, int iCrack, double trialStress)
the method from fcm is overridden to consider stress split between the matrix and fibers ...
virtual int giveNumberOfTempCracks() const
returns temporary number of cracks
std::vector< localIntegrationRecord > * giveIPIntegrationList(GaussPoint *gp)
Returns integration list corresponding to given integration point.
This class implements a FRCFCM material (Fiber Reinforced Concrete base on Fixed Crack Model) in a fi...
contextIOResultType restoreYourself(DataStream &stream)
void setTempFiberStressLoc(int icrack, double newFiberStressLoc)
Material * giveMaterial()
Returns reference to material associated to related element of receiver.
double at(int i, int j) const
Coefficient access function.
virtual void updateYourself(TimeStep *tStep)
replaces equilibrated values with temporary values
FloatArray orientationVector
orientation of fibres
void setTempFiberStressNL(int icrack, double newFiberStressNL)
double Ef
fiber Young's modulus
virtual void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep)
virtual MaterialStatus * giveStatus(GaussPoint *gp) const
Returns material status of receiver in given integration point.
FloatArray fiberStressNL
bulk stress in fibers - evaluated from crack opening
double tau_0
fiber shear strength at zero slip
Class representing vector of real numbers.
virtual contextIOResultType restoreContext(DataStream &stream, ContextMode mode, void *obj=NULL)
restores context(state) from stream
Implementation of matrix containing floating point numbers.
virtual void initTempStatus()
initializes temporary status
IRResultType
Type defining the return values of InputRecord reading operations.
void letTempStressVectorBe(const FloatArray &v)
Assigns tempStressVector to given vector v.
virtual void updateYourself(TimeStep *tStep)
replaces equilibrated values with temporary values
IntegrationPointStatus * giveMaterialStatus()
Returns reference to associated material status (NULL if not defined).
virtual void printOutputAt(FILE *file, TimeStep *tStep)
Writes information into the output file.
virtual ~FRCFCMNLStatus()
virtual Interface * giveInterface(InterfaceType)
Interface requesting service.
Base class for all nonlocal structural material statuses.
virtual int giveIPValue(FloatArray &answer, GaussPoint *gp, InternalStateType type, TimeStep *tStep)
Returns the integration point corresponding value in Reduced form.
This class implements a FRCFCMNL material in a finite element problem.
void zero()
Zeroes all coefficients of receiver.
virtual int giveMaxNumberOfCracks(GaussPoint *gp)
returns maximum number of cracks associated with current mode
virtual double computeNonlocalStressInFibersInUncracked(GaussPoint *gp, TimeStep *tStep)
computes nonlocal stress in fibers in uncracked GP
virtual contextIOResultType saveContext(DataStream &stream, ContextMode mode, void *obj=NULL)
saves current context(state) into stream
long ContextMode
Context mode (mask), defining the type of information written/read to/from context.
FRCFCMNL(int n, Domain *d)
Domain * giveDomain() const
InterfaceType
Enumerative type, used to identify interface type.
double computeDebondedLength(double delta)
computes debonded length of the fibers from the crack opening. Delta is here one half of the crack op...
int min(int i, int j)
Returns smaller value from two given decimals.
virtual double computeCrackFibreAngle(GaussPoint *gp, int i)
compute the angle between the fibre and i-th crack normal
REGISTER_Material(DummyMaterial)
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
This class manages the status of FRCFCM.
virtual void giveRealStressVector(FloatArray &answer, GaussPoint *gp, const FloatArray &reducedStrain, TimeStep *tStep)
Computes the real stress vector for given total strain and integration point.
int giveSize() const
Returns the size of receiver.
virtual double computeNormalCrackOpening(GaussPoint *gp, int i)
uses temporary cracking strain and characteristic length to obtain the crack opening ...
bool containsOnlyZeroes() const
Returns nonzero if all coefficients of the receiver are 0, else returns zero.
virtual IRResultType initializeFrom(InputRecord *ir)
Initializes receiver according to object description stored in input record.
the oofem namespace is to define a context or scope in which all oofem names are defined.
double computeDecreaseInFibreStress(double distance, double delta, double debondedLength)
compute the the difference in fiber stress in the target (local stress) and receiver (nonlocal stress...
virtual void giveMaterialStiffnessMatrix(FloatMatrix &answer, MatResponseMode, GaussPoint *gp, TimeStep *tStep)
Node * giveNode(int i) const
Returns reference to the i-th node of element.
void computeElementCentroid(FloatArray &answer, GaussPoint *gp)
computes cetroid of a finite element - works only for linear 3 and 4-node elements ...
Class representing integration point in finite element program.
Class representing solution step.
virtual double computeNonlocalStressInFibers(const FloatArray &crackVector, GaussPoint *gp, TimeStep *tStep)
computes nonlocal stress in fibers in cracked GP
virtual double computeFiberBond(double w)
evaluates the fiber bond if w > w*
FloatArray tempFiberStressNL
Non-equilibrated stress (bulk) in fibers.
double Vf
volume fraction of fibers
void resize(int s)
Resizes receiver towards requested size.