00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <stdlib.h>
00040 #include <Concrete02.h>
00041 #include <OPS_Globals.h>
00042 #include <float.h>
00043 #include <Channel.h>
00044
00045 Concrete02::Concrete02(int tag, double _fc, double _epsc0, double _fcu,
00046 double _epscu, double _rat, double _ft, double _Ets):
00047 UniaxialMaterial(tag, MAT_TAG_Concrete02),
00048 fc(_fc), epsc0(_epsc0), fcu(_fcu), epscu(_epscu), rat(_rat), ft(_ft), Ets(_Ets)
00049 {
00050 ecminP = 0.0;
00051 deptP = 0.0;
00052
00053 eP = 2.0*fc/epsc0;
00054 epsP = 0.0;
00055 sigP = 0.0;
00056 eps = 0.0;
00057 sig = 0.0;
00058 e = 2.0*fc/epsc0;
00059 }
00060
00061 Concrete02::Concrete02(void):
00062 UniaxialMaterial(0, MAT_TAG_Concrete02)
00063 {
00064
00065 }
00066
00067 Concrete02::~Concrete02(void)
00068 {
00069
00070 }
00071
00072 UniaxialMaterial*
00073 Concrete02::getCopy(void)
00074 {
00075 Concrete02 *theCopy = new Concrete02(this->getTag(), fc, epsc0, fcu, epscu, rat, ft, Ets);
00076
00077 return theCopy;
00078 }
00079
00080 double
00081 Concrete02::getInitialTangent(void)
00082 {
00083 return 2.0*fc/epsc0;
00084 }
00085
00086 int
00087 Concrete02::setTrialStrain(double trialStrain, double strainRate)
00088 {
00089 double ec0 = fc * 2. / epsc0;
00090
00091
00092
00093 ecmin = ecminP;
00094 dept = deptP;
00095
00096
00097
00098 eps = trialStrain;
00099 double deps = eps - epsP;
00100
00101
00102
00103
00104 if (eps < ecmin) {
00105 this->Compr_Envlp(eps, sig, e);
00106 ecmin = eps;
00107 } else {;
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 double epsr = (fcu - rat * ec0 * epscu) / (ec0 * (1.0 - rat));
00119 double sigmr = ec0 * epsr;
00120
00121
00122
00123
00124 double sigmm;
00125 double dumy;
00126 this->Compr_Envlp(ecmin, sigmm, dumy);
00127
00128
00129
00130
00131
00132 double er = (sigmm - sigmr) / (ecmin - epsr);
00133 double ept = ecmin - sigmm / er;
00134
00135 if (eps <= ept) {
00136 double sigmin = sigmm + er * (eps - ecmin);
00137 double sigmax = er * .5f * (eps - ept);
00138 sig = sigP + ec0 * deps;
00139 e = ec0;
00140 if (sig <= sigmin) {
00141 sig = sigmin;
00142 e = er;
00143 }
00144 if (sig >= sigmax) {
00145 sig = sigmax;
00146 e = 0.5 * er;
00147 }
00148 } else {
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159 double epn = ept + dept;
00160 double sicn;
00161 if (eps <= epn) {
00162 this->Tens_Envlp(dept, sicn, e);
00163 if (dept != 0.0) {
00164 e = sicn / dept;
00165 } else {
00166 e = ec0;
00167 }
00168 sig = e * (eps - ept);
00169 } else {
00170
00171
00172
00173
00174 double epstmp = eps - ept;
00175 this->Tens_Envlp(epstmp, sig, e);
00176 dept = eps - ept;
00177 }
00178 }
00179 }
00180
00181 return 0;
00182 }
00183
00184
00185
00186 double
00187 Concrete02::getStrain(void)
00188 {
00189 return eps;
00190 }
00191
00192 double
00193 Concrete02::getStress(void)
00194 {
00195 return sig;
00196 }
00197
00198 double
00199 Concrete02::getTangent(void)
00200 {
00201 return e;
00202 }
00203
00204 int
00205 Concrete02::commitState(void)
00206 {
00207 ecminP = ecmin;
00208 deptP = dept;
00209
00210 eP = e;
00211 sigP = sig;
00212 epsP = eps;
00213 return 0;
00214 }
00215
00216 int
00217 Concrete02::revertToLastCommit(void)
00218 {
00219 ecmin = ecminP;;
00220 dept = deptP;
00221
00222 e = eP;
00223 sig = sigP;
00224 eps = epsP;
00225 return 0;
00226 }
00227
00228 int
00229 Concrete02::revertToStart(void)
00230 {
00231 ecminP = 0.0;
00232 deptP = 0.0;
00233
00234 eP = 2.0*fc/epsc0;
00235 epsP = 0.0;
00236 sigP = 0.0;
00237 eps = 0.0;
00238 sig = 0.0;
00239 e = 2.0*fc/epsc0;
00240
00241 return 0;
00242 }
00243
00244 int
00245 Concrete02::sendSelf(int commitTag, Channel &theChannel)
00246 {
00247 static Vector data(13);
00248 data(0) =fc;
00249 data(1) =epsc0;
00250 data(2) =fcu;
00251 data(3) =epscu;
00252 data(4) =rat;
00253 data(5) =ft;
00254 data(6) =Ets;
00255 data(7) =ecminP;
00256 data(8) =deptP;
00257 data(9) =epsP;
00258 data(10) =sigP;
00259 data(11) =eP;
00260 data(12) = this->getTag();
00261
00262 if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00263 opserr << "Concrete02::sendSelf() - failed to sendSelf\n";
00264 return -1;
00265 }
00266 return 0;
00267 }
00268
00269 int
00270 Concrete02::recvSelf(int commitTag, Channel &theChannel,
00271 FEM_ObjectBroker &theBroker)
00272 {
00273
00274 static Vector data(13);
00275
00276 if (theChannel.sendVector(this->getDbTag(), commitTag, data) < 0) {
00277 opserr << "Concrete02::recvSelf() - failed to recvSelf\n";
00278 return -1;
00279 }
00280
00281 fc = data(0);
00282 epsc0 = data(1);
00283 fcu = data(2);
00284 epscu = data(3);
00285 rat = data(4);
00286 ft = data(5);
00287 Ets = data(6);
00288 ecminP = data(7);
00289 deptP = data(8);
00290 epsP = data(9);
00291 sigP = data(10);
00292 eP = data(11);
00293 this->setTag(data(12));
00294
00295 e = eP;
00296 sig = sigP;
00297 eps = epsP;
00298
00299 return 0;
00300 }
00301
00302 void
00303 Concrete02::Print(OPS_Stream &s, int flag)
00304 {
00305 s << "Concrete02:(strain, stress, tangent) " << eps << " " << sig << " " << e << endln;
00306 }
00307
00308
00309 void
00310 Concrete02::Tens_Envlp (double epsc, double &sigc, double &Ect)
00311 {
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325 double Ec0 = 2.0*fc/epsc0;
00326
00327 double eps0 = ft/Ec0;
00328 double epsu = ft*(1.0/Ets+1.0/Ec0);
00329 if (epsc<=eps0) {
00330 sigc = epsc*Ec0;
00331 Ect = Ec0;
00332 } else {
00333 if (epsc<=epsu) {
00334 Ect = -Ets;
00335 sigc = ft-Ets*(epsc-eps0);
00336 } else {
00337
00338 Ect = 1.0e-10;
00339 sigc = 0.0;
00340 }
00341 }
00342 return;
00343 }
00344
00345
00346 void
00347 Concrete02::Compr_Envlp (double epsc, double &sigc, double &Ect)
00348 {
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 double Ec0 = 2.0*fc/epsc0;
00365
00366 double ratLocal = epsc/epsc0;
00367 if (epsc>=epsc0) {
00368 sigc = fc*ratLocal*(2.0-ratLocal);
00369 Ect = Ec0*(1.0-ratLocal);
00370 } else {
00371
00372
00373 if (epsc>epscu) {
00374 sigc = (fcu-fc)*(epsc-epsc0)/(epscu-epsc0)+fc;
00375 Ect = (fcu-fc)/(epscu-epsc0);
00376 } else {
00377
00378
00379
00380 sigc = fcu;
00381 Ect = 1.0e-10;
00382
00383 }
00384 }
00385 return;
00386 }