Skip to content

Commit

Permalink
Merge pull request #727 from galvisf/master
Browse files Browse the repository at this point in the history
Update for SteelFractureDI material
  • Loading branch information
mhscott committed Dec 13, 2021
2 parents d675481 + 411c3c6 commit 7775d65
Show file tree
Hide file tree
Showing 4 changed files with 182 additions and 34 deletions.
4 changes: 4 additions & 0 deletions SRC/actor/objectBroker/FEM_ObjectBrokerAllClasses.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@
#include "Steel02.h"
#include "Steel2.h"
#include "Steel4.h"
#include "SteelFractureDI.h"
#include "FatigueMaterial.h"
#include "ReinforcingSteel.h"
#include "HardeningMaterial.h"
Expand Down Expand Up @@ -1207,6 +1208,9 @@ FEM_ObjectBrokerAllClasses::getNewUniaxialMaterial(int classTag)
case MAT_TAG_Steel4:
return new Steel4();

case MAT_TAG_SteelFractureDI:
return new SteelFractureDI();

case MAT_TAG_OriginCentered:
return new OriginCentered();

Expand Down
195 changes: 169 additions & 26 deletions SRC/material/uniaxial/SteelFractureDI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ OPS_SteelFractureDI()
UniaxialMaterial *theMaterial = 0;

int iData[1];
double dData[14];
double dData[15];
int numData = 1;

if (OPS_GetIntInput(&numData, iData) != 0) {
Expand All @@ -60,20 +60,20 @@ OPS_SteelFractureDI()

numData = OPS_GetNumRemainingInputArgs();

if (numData != 14) {
if (numData != 15) {
opserr << "Invalid #args, want: uniaxialMaterial SteelFractureDI " << iData[0] <<
" fy? E? b? R0? cR1? cR2? a1? a2? a3? a4? sigcr? m? sigmin? FI_lim?" << endln;
" Fy? Fyc? E? b? R0? cR1? cR2? a1? a2? a3? a4? sigcr? m? sigmin? FI_lim?" << endln;
return 0;
}
else {
if (OPS_GetDoubleInput(&numData, dData) != 0) {
opserr << "Invalid arggs: uniaxialMaterial SteelFractureDI " << iData[0] <<
" fy? E? b? R0? cR1? cR2? a1? a2? a3? a4? sigcr? m? sigmin? FI_lim?" << endln;
" Fy? FyC? E? b? R0? cR1? cR2? a1? a2? a3? a4? sigcr? m? sigmin? FI_lim?" << endln;
return 0;
}
theMaterial = new SteelFractureDI(iData[0], dData[0], dData[1], dData[2],
dData[3], dData[4], dData[5], dData[6],
dData[7], dData[8], dData[9], dData[10], dData[11], dData[12], dData[13]);
dData[7], dData[8], dData[9], dData[10], dData[11], dData[12], dData[13], dData[14]);
}


Expand All @@ -89,12 +89,12 @@ OPS_SteelFractureDI()


SteelFractureDI::SteelFractureDI(int tag,
double _Fy, double _E0, double _b,
double _Fy, double _FyC, double _E0, double _b,
double _R0, double _cR1, double _cR2,
double _a1, double _a2, double _a3, double _a4, double _sigcr, double _m, double _sigmin, double _FI_lim):
UniaxialMaterial(tag, MAT_TAG_SteelFractureDI),
//UniaxialMaterial(tag, 0),
Fy(_Fy), E0(_E0), b(_b), R0(_R0), cR1(_cR1), cR2(_cR2), a1(_a1), a2(_a2), a3(_a3), a4(_a4),
Fy(_Fy), FyC(_FyC), E0(_E0), b(_b), R0(_R0), cR1(_cR1), cR2(_cR2), a1(_a1), a2(_a2), a3(_a3), a4(_a4),
sigcr(_sigcr), m(_m), sigmin(_sigmin), FI_lim(_FI_lim)
{
konP = 0;
Expand All @@ -105,9 +105,9 @@ SteelFractureDI::SteelFractureDI(int tag,
sig = 0.0;
eps = 0.0;
e = E0;

epsmaxP = Fy / E0;
epsminP = -epsmaxP;
epsminP = -FyC / E0; ////////////////////////////////////////////
epsplP = 0.0;
epss0P = 0.0;
sigs0P = 0.0;
Expand Down Expand Up @@ -161,8 +161,8 @@ SteelFractureDI::~SteelFractureDI(void)
UniaxialMaterial*
SteelFractureDI::getCopy(void)
{
//Steel02 *theCopy = new Steel02(this->getTag(), Fy, E0, b, R0, cR1, cR2, a1, a2, a3, a4, sigini);
SteelFractureDI *theCopy = new SteelFractureDI(this->getTag(), Fy, E0, b, R0, cR1, cR2, a1, a2, a3, a4, sigcr, m, sigmin, FI_lim);
//Steel02 *theCopy = new Steel02(this->getTag(), Fy, FyC, E0, b, R0, cR1, cR2, a1, a2, a3, a4, sigini);
SteelFractureDI *theCopy = new SteelFractureDI(this->getTag(), Fy, FyC, E0, b, R0, cR1, cR2, a1, a2, a3, a4, sigcr, m, sigmin, FI_lim);

return theCopy;
}
Expand All @@ -178,7 +178,8 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
{
double Esh = b * E0;
double epsy = Fy / E0;

double epsyc = FyC / E0; ////////////////////////////////////////////

eps = trialStrain;
double deps = eps - epsP;

Expand Down Expand Up @@ -223,11 +224,11 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
else {

epsmax = epsy;
epsmin = -epsy;
epsmin = -epsyc; ////////////////////////////////////////////
if (deps < 0.0) {
kon = 2;
epss0 = epsmin;
sigs0 = -Fy;
sigs0 = -FyC; ////////////////////////////////////////////
epspl = epsmin;
}
else {
Expand Down Expand Up @@ -258,7 +259,7 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
epsmin = epsP;
double d1 = (epsmax - epsmin) / (2.0*(a4 * epsy));
double shft = 1.0 + a3 * pow(d1, 0.8);
epss0 = (Fy * shft - Esh * epsy * shft - sigr + E0 * epsr) / (E0 - Esh);
epss0 = (Fy * shft - Esh * epsy * shft - sigr + E0 * epsr) / (E0 - Esh);
sigs0 = Fy * shft + Esh * (epss0 - epsy * shft);
epspl = epsmax;

Expand All @@ -279,17 +280,22 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
if (epsP > epsmax)
epsmax = epsP;

double d1 = (epsmax - epsmin) / (2.0*(a2 * epsy));
double d1 = (epsmax - epsmin) / (2.0*(a2 * epsyc));
double shft = 1.0 + a1 * pow(d1, 0.8);
epss0 = (-Fy * shft + Esh * epsy * shft - sigr + E0 * epsr) / (E0 - Esh);
sigs0 = -Fy * shft + Esh * (epss0 + epsy * shft);
epss0 = (-FyC * shft + Esh * epsyc * shft - sigr + E0 * epsr) / (E0 - Esh);
sigs0 = -FyC * shft + Esh * (epss0 + epsyc * shft);
epspl = epsmin;
}


// calculate current stress sig and tangent modulus E
if (kon != 4) { // non-fracture case
// tension
double xi = fabs((epspl - epss0) / epsy);
if (deps < 0.0)
// compresion
xi = fabs((epspl - epss0) / epsyc);

double R = R0 * (1.0 - (cR1*xi) / (cR2 + xi));
double epsrat = (eps - epsr) / (epss0 - epsr);
double dum1 = 1.0 + pow(fabs(epsrat), R);
Expand All @@ -310,8 +316,8 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
konf = 1;

// Point at compression yield envelope
eps_1 = (-Fy + Esh * epsy - sigP + E0 * epsP) / (E0 - Esh);
sig_1 = -Fy + Esh * (eps_1 + epsy);
eps_1 = (-FyC + Esh * epsyc - sigP + E0 * epsP) / (E0 - Esh);
sig_1 = -FyC + Esh * (eps_1 + epsyc);

// Points at horizontal axis
eps_0 = epsP - sigP / E0;
Expand Down Expand Up @@ -357,8 +363,8 @@ SteelFractureDI::setTrialStrain(double trialStrain, double strainRate)
eps_0 = epsP - sigP / E0; // new interception is at reversal point minus elastic unloading
sigs0 = 0; // new interception always at horizontal axis since flange fractured

eps_1 = (-Fy + Esh * epsy + E0 * eps_0) / (E0 - Esh); // Point at compression yield envelope
sig_1 = -Fy + Esh * (eps_1 + epsy);
eps_1 = (-FyC + Esh * epsyc + E0 * eps_0) / (E0 - Esh); // Point at compression yield envelope
sig_1 = -FyC + Esh * (eps_1 + epsyc);

eps_r = 2 * eps_0 - eps_1; // Point at zero stress and e
}
Expand Down Expand Up @@ -650,15 +656,150 @@ SteelFractureDI::revertToStart(void)
int
SteelFractureDI::sendSelf(int commitTag, Channel &theChannel)
{
return -1;
static Vector data(39);

data(0) = this->getTag();

// Material properties
data(1) = Fy;
data(2) = FyC;
data(3) = E0;
data(4) = b;
data(5) = R0;
data(6) = cR1;
data(7) = cR2;
data(8) = a1;
data(9) = a2;
data(10) = a3;
data(11) = a4;
data(12) = sigcr;
data(13) = m;
data(14) = sigmin;
data(15) = FI_lim;

// History variables
data(16) = konP;
data(17) = eP;
data(18) = epsP;
data(19) = sigP;
data(20) = epsmaxP;
data(21) = epsminP;
data(22) = epsplP;
data(23) = epss0P;
data(24) = sigs0P;
data(25) = epssrP;
data(26) = sigsrP;
// ************** added for fracture ***************
data(27) = epsContP;
data(28) = eps_0P;
data(29) = eps_1P;
data(30) = eps_rP;
data(31) = konfP;
data(32) = konCP;
// ************** added for fracture ***************
// ************** added for DI ********************
data(33) = DIP;
data(34) = isStartP;
data(35) = sigPDIP;
data(36) = slopePP;
data(37) = sumTenPP;
data(38) = sumCompPP;
// ************** added for DI ********************

if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
opserr << "SteelFractureDI::sendSelf() - failed to sendSelf\n";
return -1;
}
// opserr << "sendSelf SteelFractureDI completed tag data(0)\n";
return 0;
}

int
SteelFractureDI::recvSelf(int commitTag, Channel &theChannel,
FEM_ObjectBroker &theBroker)
{
static Vector data(39);

// opserr << "recvSelf SteelFractureDI started\n";

return -1;
if (theChannel.recvVector(this->getDbTag(), commitTag, data) < 0) {
opserr << "SteelFractureDI::recvSelf() - failed to recvSelf\n";
return -1;
}

this->setTag(int(data(0)));

// Material properties
Fy = data(1);
FyC = data(2);
E0 = data(3);
b = data(4);
R0 = data(5);
cR1 = data(6);
cR2 = data(7);
a1 = data(8);
a2 = data(9);
a3 = data(10);
a4 = data(11);
sigcr = data(12);
m = data(13);
sigmin = data(14);
FI_lim = data(15);

// History variables
konP = data(16);
eP = data(17);
epsP = data(18);
sigP = data(19);
epsmaxP = data(20);
epsminP = data(21);
epsplP = data(22);
epss0P = data(23);
sigs0P = data(24);
epssrP = data(25);
sigsrP = data(26);
// ************** added for fracture ***************
epsContP = data(27);
eps_0P = data(28);
eps_1P = data(29);
eps_rP = data(30);
konfP = data(31);
konCP = data(32);
// ************** added for fracture ***************
// ************** added for DI ********************
DIP = data(33);
isStartP = data(34);
sigPDIP = data(35);
slopePP = data(36);
sumTenPP = data(37);
sumCompPP = data(38);
// ************** added for DI ********************


// Transient variables
kon = konP;
sig = sigP;
eps = epsP;
e = E0;

epsCont = epsContP;
eps_0 = eps_0P;
eps_1 = eps_1P;
eps_r = eps_rP;
konf = konfP;
konC = konCP;

DI = DIP;
isStart = isStartP;
sigPDI = sigPDIP;
slopeP = slopePP;
sumTenP = sumTenPP;
sumCompP = sumCompPP;

// opserr << "--recvSelf SteelFractureDI completed\n";

return 0;

}

void
Expand All @@ -667,7 +808,8 @@ SteelFractureDI::Print(OPS_Stream &s, int flag)
if (flag == OPS_PRINT_PRINTMODEL_MATERIAL) {
// s << "Steel02:(strain, stress, tangent) " << eps << " " << sig << " " << e << endln;
s << "SteelFracture tag: " << this->getTag() << endln;
s << " fy: " << Fy << ", ";
s << " Fy: " << Fy << ", ";
s << " FyC: " << FyC << ", ";
s << " E0: " << E0 << ", ";
s << " b: " << b << ", ";
s << " R0: " << R0 << ", ";
Expand All @@ -688,7 +830,8 @@ SteelFractureDI::Print(OPS_Stream &s, int flag)
s << "\"name\": \"" << this->getTag() << "\", ";
s << "\"type\": \"SteelFracture\", ";
s << "\"E\": " << E0 << ", ";
s << "\"fy\": " << Fy << ", ";
s << "\"Fy\": " << Fy << ", ";
s << "\"FyC\": " << FyC << ", ";
s << "\"b\": " << b << ", ";
s << "\"R0\": " << R0 << ", ";
s << "\"cR1\": " << cR1 << ", ";
Expand Down
9 changes: 5 additions & 4 deletions SRC/material/uniaxial/SteelFractureDI.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,20 @@ class SteelFractureDI : public UniaxialMaterial
{
public:
SteelFractureDI(int tag,
double fy, double E0, double b,
double Fy, double Fyc, double E0, double b,
double R0, double cR1, double cR2,
double a1, double a2, double a3, double a4, double sigcr, double m, double sigmin, double FI_lim);
/*SteelFracture(int tag,
double fy, double E0, double b);*/
double Fy, double E0, double b);*/

// Constructor for no isotropic hardening
//SteelFracture(int tag,
// double fy, double E0, double b,
// double Fy, double Fyc, double E0, double b,
// double R0, double cR1, double cR2);

//// Constructor for no isotropic hardening
//// Also provides default values for R0, cR1, and cR2
//SteelFracture(int tag, double fy, double E0, double b);
//SteelFracture(int tag, double Fy, double Fyc, double E0, double b);

SteelFractureDI(void);
virtual ~SteelFractureDI();
Expand Down Expand Up @@ -93,6 +93,7 @@ class SteelFractureDI : public UniaxialMaterial
private:
// matpar : STEEL FIXED PROPERTIES
double Fy; // = matpar(1) : yield stress
double FyC; // = matpar(1) : yield stress
double E0; // = matpar(2) : initial stiffness
double b; // = matpar(3) : hardening ratio (Esh/E0)
double R0; // = matpar(4) : exp transition elastic-plastic
Expand Down
8 changes: 4 additions & 4 deletions SRC/tcl/commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ extern void *OPS_NewtonHallM(void);
extern void *OPS_Newmark(void);
extern void *OPS_StagedNewmark(void);
extern void *OPS_GimmeMCK(void);
extern void *OPS_HarmonicSteadyState(void);
//extern void *OPS_HarmonicSteadyState(void);
extern void *OPS_AlphaOS(void);
extern void *OPS_AlphaOS_TP(void);
extern void *OPS_AlphaOSGeneralized(void);
Expand Down Expand Up @@ -4472,9 +4472,9 @@ specifyIntegrator(ClientData clientData, Tcl_Interp *interp, int argc,
theStaticAnalysis->setIntegrator(*theStaticIntegrator);
}

else if (strcmp(argv[1],"HarmonicSteadyState") == 0 || strcmp(argv[1],"HarmonicSS") == 0) {
theStaticIntegrator = (StaticIntegrator*)OPS_HarmonicSteadyState();
}
//else if (strcmp(argv[1],"HarmonicSteadyState") == 0 || strcmp(argv[1],"HarmonicSS") == 0) {
// theStaticIntegrator = (StaticIntegrator*)OPS_HarmonicSteadyState();
// }

else if (strcmp(argv[1],"ArcLength") == 0) {
double arcLength;
Expand Down

0 comments on commit 7775d65

Please sign in to comment.