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 #include <HardeningMaterial.h>
00033 #include <Vector.h>
00034 #include <Channel.h>
00035 #include <Matrix.h>
00036 #include <Information.h>
00037 #include <Parameter.h>
00038
00039 #include <math.h>
00040 #include <float.h>
00041
00042 HardeningMaterial::HardeningMaterial(int tag, double e, double s,
00043 double hi, double hk, double n)
00044 :UniaxialMaterial(tag,MAT_TAG_Hardening),
00045 E(e), sigmaY(s), Hiso(hi), Hkin(hk), eta(n)
00046 {
00047
00048 parameterID = 0;
00049 SHVs = 0;
00050
00051
00052
00053 this->revertToStart();
00054 }
00055
00056 HardeningMaterial::HardeningMaterial()
00057 :UniaxialMaterial(0,MAT_TAG_Hardening),
00058 E(0.0), sigmaY(0.0), Hiso(0.0), Hkin(0.0), eta(0.0)
00059 {
00060
00061 parameterID = 0;
00062 SHVs = 0;
00063
00064
00065
00066 this->revertToStart();
00067 }
00068
00069 HardeningMaterial::~HardeningMaterial()
00070 {
00071
00072 if (SHVs != 0)
00073 delete SHVs;
00074
00075 }
00076
00077 int
00078 HardeningMaterial::setTrialStrain (double strain, double strainRate)
00079 {
00080
00081 if (fabs(Tstrain-strain) < DBL_EPSILON)
00082 return 0;
00083
00084
00085 Tstrain = strain;
00086
00087
00088 Tstress = E * (Tstrain-CplasticStrain);
00089
00090
00091 double xsi = Tstress - CbackStress;
00092
00093
00094 double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00095
00096
00097 if (f <= -DBL_EPSILON * E) {
00098
00099
00100 Ttangent = E;
00101 }
00102
00103
00104 else {
00105 double etadt = 0.0;
00106
00107 if (eta != 0.0 || ops_Dt != 0)
00108 etadt = eta/ops_Dt;
00109
00110
00111 double dGamma = f / (E+Hiso+Hkin+etadt);
00112
00113
00114 int sign = (xsi < 0) ? -1 : 1;
00115
00116
00117 Tstress -= dGamma*E*sign;
00118
00119
00120 TplasticStrain = CplasticStrain + dGamma*sign;
00121
00122
00123 TbackStress = CbackStress + dGamma*Hkin*sign;
00124
00125
00126 Thardening = Chardening + dGamma;
00127
00128
00129 Ttangent = E*(Hkin+Hiso+etadt) / (E+Hkin+Hiso+etadt);
00130 }
00131
00132 return 0;
00133 }
00134
00135 double
00136 HardeningMaterial::getStress(void)
00137 {
00138 return Tstress;
00139 }
00140
00141 double
00142 HardeningMaterial::getTangent(void)
00143 {
00144 return Ttangent;
00145 }
00146
00147 double
00148 HardeningMaterial::getStrain(void)
00149 {
00150 return Tstrain;
00151 }
00152
00153 int
00154 HardeningMaterial::commitState(void)
00155 {
00156
00157 CplasticStrain = TplasticStrain;
00158 CbackStress = TbackStress;
00159 Chardening = Thardening;
00160
00161 return 0;
00162 }
00163
00164 int
00165 HardeningMaterial::revertToLastCommit(void)
00166 {
00167 return 0;
00168 }
00169
00170 int
00171 HardeningMaterial::revertToStart(void)
00172 {
00173
00174 CplasticStrain = 0.0;
00175 CbackStress = 0.0;
00176 Chardening = 0.0;
00177
00178
00179 TplasticStrain = 0.0;
00180 TbackStress = 0.0;
00181 Thardening = 0.0;
00182
00183
00184 Tstrain = 0.0;
00185 Tstress = 0.0;
00186 Ttangent = E;
00187
00188
00189 if (SHVs != 0)
00190 SHVs->Zero();
00191
00192
00193 return 0;
00194 }
00195
00196 UniaxialMaterial *
00197 HardeningMaterial::getCopy(void)
00198 {
00199 HardeningMaterial *theCopy =
00200 new HardeningMaterial(this->getTag(), E, sigmaY, Hiso, Hkin, eta);
00201
00202
00203 theCopy->CplasticStrain = CplasticStrain;
00204 theCopy->CbackStress = CbackStress;
00205 theCopy->Chardening = Chardening;
00206
00207
00208 theCopy->TplasticStrain = TplasticStrain;
00209 theCopy->TbackStress = TbackStress;
00210 theCopy->Thardening = Thardening;
00211
00212
00213 theCopy->Tstrain = Tstrain;
00214 theCopy->Tstress = Tstress;
00215 theCopy->Ttangent = Ttangent;
00216
00217 return theCopy;
00218 }
00219
00220 int
00221 HardeningMaterial::sendSelf(int cTag, Channel &theChannel)
00222 {
00223 int res = 0;
00224
00225 static Vector data(12);
00226
00227 data(0) = this->getTag();
00228 data(1) = E;
00229 data(2) = sigmaY;
00230 data(3) = Hiso;
00231 data(4) = Hkin;
00232 data(5) = eta;
00233 data(6) = CplasticStrain;
00234 data(7) = CbackStress;
00235 data(8) = Chardening;
00236 data(9) = Tstrain;
00237 data(10) = Tstress;
00238 data(11) = Ttangent;
00239
00240 res = theChannel.sendVector(this->getDbTag(), cTag, data);
00241 if (res < 0)
00242 opserr << "HardeningMaterial::sendSelf() - failed to send data\n";
00243
00244 return res;
00245 }
00246
00247 int
00248 HardeningMaterial::recvSelf(int cTag, Channel &theChannel,
00249 FEM_ObjectBroker &theBroker)
00250 {
00251 int res = 0;
00252
00253 static Vector data(12);
00254 res = theChannel.recvVector(this->getDbTag(), cTag, data);
00255
00256 if (res < 0) {
00257 opserr << "HardeningMaterial::recvSelf() - failed to receive data\n";
00258 E = 0;
00259 this->setTag(0);
00260 }
00261 else {
00262 this->setTag((int)data(0));
00263 E = data(1);
00264 sigmaY = data(2);
00265 Hiso = data(3);
00266 Hkin = data(4);
00267 eta = data(5);
00268 CplasticStrain = data(6);
00269 CbackStress = data(7);
00270 Chardening = data(8);
00271 Tstrain = data(9);
00272 Tstress = data(10);
00273 Ttangent = data(11);
00274 }
00275
00276 return res;
00277 }
00278
00279 void
00280 HardeningMaterial::Print(OPS_Stream &s, int flag)
00281 {
00282 s << "HardeningMaterial, tag: " << this->getTag() << endln;
00283 s << " E: " << E << endln;
00284 s << " sigmaY: " << sigmaY << endln;
00285 s << " Hiso: " << Hiso << endln;
00286 s << " Hkin: " << Hkin << endln;
00287 s << " eta: " << eta << endln;
00288 }
00289
00290
00291
00292 int
00293 HardeningMaterial::setParameter(const char **argv, int argc, Parameter ¶m)
00294 {
00295 if (argc < 1)
00296 return -1;
00297
00298 if (strcmp(argv[0],"sigmaY") == 0 || strcmp(argv[0],"fy") == 0)
00299 return param.addObject(1, this);
00300
00301 if (strcmp(argv[0],"E") == 0)
00302 return param.addObject(2, this);
00303
00304 if (strcmp(argv[0],"H_kin") == 0)
00305 return param.addObject(3, this);
00306
00307 if (strcmp(argv[0],"H_iso") == 0)
00308 return param.addObject(4, this);
00309
00310 else
00311 opserr << "WARNING: Could not set parameter in HardeningMaterial. " << endln;
00312 return -1;
00313 }
00314
00315 int
00316 HardeningMaterial::updateParameter(int parameterID, Information &info)
00317 {
00318 switch (parameterID) {
00319 case -1:
00320 return -1;
00321 case 1:
00322 this->sigmaY = info.theDouble;
00323 break;
00324 case 2:
00325 this->E = info.theDouble;
00326 break;
00327 case 3:
00328 this->Hkin = info.theDouble;
00329 break;
00330 case 4:
00331 this->Hiso = info.theDouble;
00332 break;
00333 default:
00334 return -1;
00335 }
00336
00337 return 0;
00338 }
00339
00340
00341
00342 int
00343 HardeningMaterial::activateParameter(int passedParameterID)
00344 {
00345 parameterID = passedParameterID;
00346
00347 return 0;
00348 }
00349
00350
00351
00352
00353 double
00354 HardeningMaterial::getStressSensitivity(int gradNumber, bool conditional)
00355 {
00356
00357
00358 double SigmaYSensitivity = 0.0;
00359 double ESensitivity = 0.0;
00360 double HkinSensitivity = 0.0;
00361 double HisoSensitivity = 0.0;
00362
00363 if (parameterID == 1) {
00364 SigmaYSensitivity = 1.0;
00365 }
00366 else if (parameterID == 2) {
00367 ESensitivity = 1.0;
00368 }
00369 else if (parameterID == 3) {
00370 HkinSensitivity = 1.0;
00371 }
00372 else if (parameterID == 4) {
00373 HisoSensitivity = 1.0;
00374 }
00375 else {
00376
00377 }
00378
00379
00380 double CplasticStrainSensitivity = 0.0;
00381 double CbackStressSensitivity = 0.0;
00382 double ChardeningSensitivity = 0.0;
00383 if (SHVs != 0) {
00384 CplasticStrainSensitivity = (*SHVs)(0,(gradNumber-1));
00385 CbackStressSensitivity = (*SHVs)(1,(gradNumber-1));
00386 ChardeningSensitivity = (*SHVs)(2,(gradNumber-1));
00387 }
00388
00389
00390 double Tstress = E * (Tstrain-CplasticStrain);
00391
00392
00393 double xsi = Tstress - CbackStress;
00394
00395
00396 double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00397
00398 double sensitivity;
00399
00400
00401 if (f <= -DBL_EPSILON * E) {
00402
00403
00404 sensitivity = ESensitivity*(Tstrain-CplasticStrain)-E*CplasticStrainSensitivity;
00405
00406 }
00407
00408
00409 else {
00410
00411 double TstressSensitivity = ESensitivity*(Tstrain-CplasticStrain)-E*CplasticStrainSensitivity;
00412
00413 int sign = (xsi < 0) ? -1 : 1;
00414
00415 double dGamma = f / (E+Hiso+Hkin);
00416
00417 double fSensitivity = (TstressSensitivity-CbackStressSensitivity)*sign
00418 - SigmaYSensitivity - HisoSensitivity*Chardening - Hiso*ChardeningSensitivity;
00419
00420 double dGammaSensitivity =
00421 (fSensitivity*(E+Hkin+Hiso)-f*(ESensitivity+HkinSensitivity+HisoSensitivity))
00422 /((E+Hkin+Hiso)*(E+Hkin+Hiso));
00423
00424 sensitivity = (TstressSensitivity-dGammaSensitivity*E*sign-dGamma*ESensitivity*sign);
00425 }
00426
00427 return sensitivity;
00428 }
00429
00430
00431
00432 double
00433 HardeningMaterial::getInitialTangentSensitivity(int gradNumber)
00434 {
00435
00436 if (parameterID == 2) {
00437 return 1.0;
00438 }
00439 else {
00440 return 0.0;
00441 }
00442 }
00443
00444
00445 int
00446 HardeningMaterial::commitSensitivity(double TstrainSensitivity, int gradNumber, int numGrads)
00447 {
00448 if (SHVs == 0) {
00449 SHVs = new Matrix(3,numGrads);
00450 }
00451
00452
00453 double SigmaYSensitivity = 0.0;
00454 double ESensitivity = 0.0;
00455 double HkinSensitivity = 0.0;
00456 double HisoSensitivity = 0.0;
00457
00458 if (parameterID == 1) {
00459 SigmaYSensitivity = 1.0;
00460 }
00461 else if (parameterID == 2) {
00462 ESensitivity = 1.0;
00463 }
00464 else if (parameterID == 3) {
00465 HkinSensitivity = 1.0;
00466 }
00467 else if (parameterID == 4) {
00468 HisoSensitivity = 1.0;
00469 }
00470 else {
00471
00472 }
00473
00474
00475 double CplasticStrainSensitivity= (*SHVs)(0,(gradNumber-1));
00476 double CbackStressSensitivity = (*SHVs)(1,(gradNumber-1));
00477 double ChardeningSensitivity = (*SHVs)(2,(gradNumber-1));
00478
00479
00480 double Tstress = E * (Tstrain-CplasticStrain);
00481
00482
00483 double xsi = Tstress - CbackStress;
00484
00485
00486 double f = fabs(xsi) - (sigmaY + Hiso*Chardening);
00487
00488
00489 if (f <= -DBL_EPSILON * E) {
00490
00491
00492 }
00493
00494
00495 else {
00496
00497 double TstressSensitivity = ESensitivity*(Tstrain-CplasticStrain)
00498 + E*(TstrainSensitivity-CplasticStrainSensitivity);
00499
00500 int sign = (xsi < 0) ? -1 : 1;
00501
00502 double dGamma = f / (E+Hiso+Hkin);
00503
00504 double fSensitivity = (TstressSensitivity-CbackStressSensitivity)*sign
00505 - SigmaYSensitivity - HisoSensitivity*Chardening - Hiso*ChardeningSensitivity;
00506
00507 double dGammaSensitivity =
00508 (fSensitivity*(E+Hkin+Hiso)-f*(ESensitivity+HkinSensitivity+HisoSensitivity))
00509 /((E+Hkin+Hiso)*(E+Hkin+Hiso));
00510
00511 (*SHVs)(0,(gradNumber-1)) += dGammaSensitivity*sign;
00512 (*SHVs)(1,(gradNumber-1)) += dGammaSensitivity*Hkin*sign + dGamma*HkinSensitivity*sign;
00513 (*SHVs)(2,(gradNumber-1)) += dGammaSensitivity;
00514
00515 }
00516
00517 return 0;
00518 }
00519
00520