00001
00002
00004
00005 #include "BkStressLimSurface2D.h"
00006 #include <YieldSurface_BC.h>
00007 #include <math.h>
00008
00009 #define evolDebug 0
00011 // Construction/Destruction
00013
00014 BkStressLimSurface2D::BkStressLimSurface2D(int tag, int classTag, double min_iso_factor,
00015 double iso_ratio, double kin_ratio, YieldSurface_BC &lim_surface,
00016 PlasticHardeningMaterial &kinX,
00017 PlasticHardeningMaterial &kinY,
00018 PlasticHardeningMaterial &isoXPos,
00019 PlasticHardeningMaterial &isoXNeg,
00020 PlasticHardeningMaterial &isoYPos,
00021 PlasticHardeningMaterial &isoYNeg,
00022 int restype, double res_Fact, double app_Fact, double dir
00023 )
00024 :YS_Evolution2D(tag, classTag, min_iso_factor, iso_ratio, kin_ratio),
00025 defPosX(true), defPosY(true), resAlgo(restype),
00026 resFactor(res_Fact), appFactor(app_Fact), direction(dir), direction_orig(dir)
00027 {
00028 if (dir < -1.0 )
00029 {
00030 opserr << "WARNING: BkStressLimSurface2D() - Dir should be between -1 and +1\n";
00031 opserr << "Set to variable \n";
00032 direction_orig = 10;
00033 }
00034
00035 if(direction_orig > 1)
00036 direction = 0.0;
00037
00038 kinMatX = kinX.getCopy();
00039 kinMatY = kinY.getCopy();
00040 isoMatXPos = isoXPos.getCopy();
00041 isoMatXNeg = isoXNeg.getCopy();
00042 isoMatYPos = isoYPos.getCopy();
00043 isoMatYNeg = isoYNeg.getCopy();
00044
00045
00046
00047
00048 limSurface = lim_surface.getCopy();
00049 limSurface->setTransformation(0, 1, 1, 1);
00050 }
00051
00052 BkStressLimSurface2D::~BkStressLimSurface2D()
00053 {
00054 if (kinMatX != 0)
00055 delete kinMatX;
00056
00057 if (kinMatY != 0)
00058 delete kinMatY;
00059
00060 if (isoMatXPos != 0)
00061 delete isoMatXPos;
00062
00063 if (isoMatXNeg != 0)
00064 delete isoMatXNeg;
00065
00066 if (isoMatYPos != 0)
00067 delete isoMatYPos;
00068
00069 if (isoMatYNeg != 0)
00070 delete isoMatYNeg;
00071
00072 if (limSurface != 0)
00073 delete limSurface;
00074 }
00075
00076 void BkStressLimSurface2D::setResidual(double res)
00077 {
00078 kinMatX->setResidual(res);
00079 kinMatY->setResidual(res);
00080 }
00081
00082
00083 int BkStressLimSurface2D::commitState()
00084 {
00085 this->YS_Evolution2D::commitState();
00086
00087 int res = kinMatX->commitState();
00088 res += kinMatY->commitState();
00089 res += isoMatXPos->commitState();
00090 res += isoMatXNeg->commitState();
00091 res += isoMatYPos->commitState();
00092 res += isoMatYNeg->commitState();
00093
00094 return res;
00095 }
00096
00097 int BkStressLimSurface2D::revertToLastCommit(void)
00098 {
00099 this->YS_Evolution2D::revertToLastCommit();
00100
00101 kinMatX->revertToLastCommit();
00102 kinMatY->revertToLastCommit();
00103 isoMatXPos->revertToLastCommit();
00104 isoMatXNeg->revertToLastCommit();
00105 isoMatYPos->revertToLastCommit();
00106 isoMatYNeg->revertToLastCommit();
00107
00108 return 0;
00109 }
00110
00111
00112 void BkStressLimSurface2D::setTrialPlasticStrains(double lamda, const Vector &f, const Vector &g)
00113 {
00114
00115
00116
00117
00118 double epx = lamda*g(0);
00119 double epy = lamda*g(1);
00120
00121
00122
00123
00124
00125 if(epx > 0)
00126 defPosX = true;
00127 else
00128 defPosX = false;
00129
00130 if(epy > 0)
00131 defPosY = true;
00132 else
00133 defPosY = false;
00134
00135 isoMatXPos->setTrialIncrValue(epx);
00136 isoMatXNeg->setTrialIncrValue(-1*epx);
00137 isoMatYPos->setTrialIncrValue(epy);
00138 isoMatYNeg->setTrialIncrValue(-1*epy);
00140
00141 double x0 = translate_hist(0);
00142 double y0 = translate_hist(1);
00143 double fx = f(0);
00144 double fy = f(1);
00145
00146 limSurface->hModel->toOriginalCoord(x0, y0);
00147 double drift = limSurface->getDrift(x0, y0);
00148
00149 if(direction_orig > 1)
00150 direction = fabs(y0);
00151
00152 if(fabs(y0) >= 0.80)
00153 direction = 1.0;
00154
00155 int resType = resAlgo;
00156
00157 double dR = fabs(drift);
00158
00159 switch (resType)
00160 {
00161 case 1:
00162 {
00163 if(drift >= 0.0)
00164 {
00165 if(sign(g(0)) != sign(translate_hist(0)))
00166 dR = 1.5 + drift;
00167 else
00168 dR = 0.0;
00169 }
00170 else
00171 {
00172
00173
00174
00175
00176
00177 if(sign(g(0)) != sign(translate_hist(0)))
00178 {
00179
00180 dR = fabs(limSurface->getDrift(0.0, y0))*2 - fabs(drift);
00181
00182
00183
00184
00185
00186
00187 }
00188 }
00189
00190 break;
00191 }
00192
00193 case 2:
00194 {
00195 if(drift >= 0.0)
00196 dR = 0.0;
00197 else
00198 {
00199
00200
00201 if(sign(g(0)) != sign(translate_hist(0)))
00202 dR = fabs(limSurface->getDrift(0.0, y0))*2 - fabs(drift);
00203 }
00204
00205 break;
00206 }
00207
00208 case 3:
00209 {
00210 if(drift >= 0.0)
00211 dR = 0.0;
00212 break;
00213 }
00214
00215 case 4:
00216 {
00217 if(drift >= 0.0)
00218 {
00219 if(sign(g(0)) == sign(translate_hist(0)))
00220 dR = 0.0;
00221 }
00222
00223
00224
00225
00226
00227
00228 break;
00229 }
00230
00231 default:
00232 {
00233 opserr << "WARNING - Unknown residual algo\n";
00234 opserr << *this;
00235 if(drift >= 0.0)
00236 dR = 0.0;
00237 }
00238
00239 }
00240
00241 double sfactor = 1.0;
00242
00243 resHardening = false;
00244 resApproach = false;
00245 if(drift >= 0.0)
00246 {
00247 if(sign(g(0)) == sign(translate_hist(0)))
00248 {
00249 resHardening = true;
00250 if(resType > 1)
00251 sfactor = resFactor;
00252 }
00253 else
00254 {
00255 resApproach = true;
00256 if(resType > 1)
00257 sfactor = appFactor;
00258
00259 }
00260
00261
00262 }
00263
00264
00265 kinMatX->setTrialValue(dR, sfactor);
00266 kinMatY->setTrialValue(dR, sfactor);
00267 }
00268
00269 const Vector &BkStressLimSurface2D::getEquiPlasticStiffness()
00270 {
00271 double kp_kin_x = kinMatX->getTrialPlasticStiffness();
00272 double kp_kin_y = kinMatY->getTrialPlasticStiffness();
00273 double kp_iso_x = isoMatXPos->getTrialPlasticStiffness();
00274 double kp_iso_y = isoMatYPos->getTrialPlasticStiffness();
00275
00276 if(!defPosX)
00277 kp_iso_x = isoMatXNeg->getTrialPlasticStiffness();
00278 if(!defPosY)
00279 kp_iso_y = isoMatYNeg->getTrialPlasticStiffness();
00280
00281
00282
00283
00284 v2(0) =isotropicRatio*kp_iso_x + kinematicRatio*kp_kin_x;
00285 v2(1) =isotropicRatio*kp_iso_y + kinematicRatio*kp_kin_y;
00286
00287 if(isotropicFactor(0) <=minIsoFactor)
00288 v2(0) = 0;
00289
00290 if(isotropicFactor(1) <=minIsoFactor)
00291 v2(1) = 0;
00292
00293
00294 return v2;
00295 }
00296
00297 double BkStressLimSurface2D::getTrialPlasticStrains(int dir)
00298 {
00299 if(dir == 0 && defPosX)
00300 return isoMatXPos->getTrialValue();
00301 else if(dir == 0 && !defPosX)
00302 return isoMatXNeg->getTrialValue();
00303 else if (dir == 1 && defPosY)
00304 return isoMatYPos->getTrialValue();
00305 else if (dir == 1 && !defPosY)
00306 return isoMatYNeg->getTrialValue();
00307 else
00308 opserr << "BkStressLimSurface2D::getTrialPlasticStrains(double dir) - incorrect dir||condition \n";
00309 return 0;
00310 }
00311
00312 double BkStressLimSurface2D::getCommitPlasticStrains(int dir)
00313 {
00314 opserr << "WARNING: BkStressLimSurface2D::getCommitPlasticStrains(.) "
00315 << " not yet implemented" << endln;
00316 return this->getTrialPlasticStrains(dir);
00317 }
00318
00319
00320 double BkStressLimSurface2D::getIsoPlasticStiffness(int dir)
00321 {
00322 if(dir == 0 && defPosX)
00323 return isoMatXPos->getTrialPlasticStiffness();
00324 else if(dir == 0 && !defPosX)
00325 return isoMatXNeg->getTrialPlasticStiffness();
00326 else if (dir == 1 && defPosY)
00327 return isoMatYPos->getTrialPlasticStiffness();
00328 else if (dir == 1 && !defPosY)
00329 return isoMatYNeg->getTrialPlasticStiffness();
00330 else
00331 opserr << "BkStressLimSurface2D::getIsoPlasticStiffness(double dir) - incorrect dir/condition \n";
00332 return 0;
00333 }
00334
00335 double BkStressLimSurface2D::getKinPlasticStiffness(int dir)
00336 {
00337 if(dir == 0)
00338 return kinMatX->getTrialPlasticStiffness();
00339 else if (dir == 1)
00340 return kinMatY->getTrialPlasticStiffness();
00341 else
00342 opserr << "BkStressLimSurface2D::getKinPlasticStiffness(double dir) - incorrect dir\n";
00343 return 0;
00344
00345 }
00346
00347 Vector& BkStressLimSurface2D::getEvolDirection(Vector &f_new)
00348 {
00349
00350
00351
00352
00353 v2(0) = 0.0;
00354 if(direction >= 0)
00355 v2(1) = direction*f_new(1);
00356 else
00357 v2(1) = direction*translate_init(1);
00358 return v2;
00359 }
00360
00361 int BkStressLimSurface2D::displaySelf(Renderer &theViewer, int displayMode, float fact)
00362 {
00363
00364 limSurface->displaySelf(theViewer, limSurface->SurfOnly, fact);
00365 return 0;
00366 }
00367
00368 void BkStressLimSurface2D::Print(OPS_Stream &s, int flag)
00369 {
00370 s << "BkStressLimSurface2D \n";
00371 s << "iso_Ratio = " << isotropicRatio << "\n";
00372 s << "isotropicFactor_hist = " << isotropicFactor_hist;
00373 s << "translateX = " << translate(0) << ",\ttranslateY = " << translate(1) << "\n";
00374 s << "\n";
00375
00376 }
00377