00001
00002
00004
00005 #include "ElTawil2DUnSym.h"
00006 #include <math.h>
00007
00008 #define ELTAWIL2DUNSYM_CLASS_TAG -1
00009
00011
00013
00014 ElTawil2DUnSym::ElTawil2DUnSym
00015 (int tag, double xPosbal, double yPosbal,
00016 double xNegbal, double yNegbal,
00017 double ypos, double yneg,
00018 YS_Evolution &model,
00019 double cz_pos, double ty_pos,
00020 double cz_neg, double ty_neg)
00021
00022 :YieldSurface_BC2D(tag, ELTAWIL2DUNSYM_CLASS_TAG, 0, 0, model),
00023 xPosBal(xPosbal), yPosBal(yPosbal),
00024 xNegBal(xNegbal), yNegBal(yNegbal),
00025 yPosCap(ypos), yNegCap(yneg),
00026 yPosCap_orig(ypos), yNegCap_orig(yneg),
00027 czPos(cz_pos), tyPos(ty_pos), czNeg(cz_neg), tyNeg(ty_neg), qy(0.005)
00028 {
00029
00030
00031 if(yPosBal < 0 || yNegBal < 0)
00032 opserr << "WARNING - ElTawil2DUnSym() - yBalance < 0" << endln;
00033
00034
00035 yBal = yPosBal;
00036
00037 if(yNegBal < yBal)
00038 yBal = yNegBal;
00039
00040
00041
00042
00043
00044 capY = yPosCap;
00045
00046
00047 yPosCap -= yBal;
00048 yNegCap -= yBal;
00049
00050
00051
00052 yPosBal -= yBal;
00053 yNegBal -= yBal;
00054
00055
00056
00057
00058
00059
00060 double transY = yBal/capY;
00061 Vector t(2);
00062 t(0) = 0;
00063
00064 t(1) = transY;
00065
00066 hModel->setInitTranslation(t);
00067
00068 capX = xPosBal;
00069 if( fabs(xNegBal) > capX)
00070 capX = fabs(xNegBal);
00071
00072
00073 capX_orig = capX;
00074 capY_orig = capY;
00075 capXdim = capX;
00076 capYdim = capY;
00077
00078 }
00079
00080 ElTawil2DUnSym::~ElTawil2DUnSym()
00081 {
00082
00083 }
00084
00086
00088 void ElTawil2DUnSym::setExtent()
00089 {
00090
00091
00092
00093
00094 xPos = min_(xPosBal/capX,
00095 (xPosBal*(1 - pow( fabs(yPosBal/(yNegCap - yPosBal)) , tyPos)))/capX);
00096
00097 xNeg = max_(xNegBal/capX,
00098 (xNegBal*(1 - pow( fabs(yNegBal/(yNegCap - yNegBal)) , tyNeg)))/capX);
00099
00100 yPos = yPosCap/capY - qy;
00101 yNeg = yNegCap/capY + qy;
00102
00103 ytPos = yPos - 0.005;
00104 ytNeg = yNeg + 0.005;
00105
00106 double yVal1 = ytPos*capY - yPosBal;
00107 double yVal4 = ytNeg*capY - yPosBal;
00108 double yVal2 = ytPos*capY - yNegBal;
00109 double yVal3 = ytNeg*capY - yNegBal;
00110
00111
00112
00113
00114
00115
00116
00117
00118 double xt1 = xPosBal*(1 - pow((yVal1/(yPosCap - yPosBal)) , czPos));
00119 double xt4 = xPosBal*(1 - pow( fabs(yVal4/(yNegCap - yPosBal)) , tyPos));
00120 double xt2 = xNegBal*(1 - pow((yVal2/(yPosCap - yNegBal)) , czNeg));
00121 double xt3 = xNegBal*(1 - pow( fabs(yVal3/(yNegCap - yNegBal)) , tyNeg));
00122
00123
00124 xt1 = xt1/capX;
00125 xt2 = xt2/capX;
00126 xt3 = xt3/capX;
00127 xt4 = xt4/capX;
00128
00129
00130
00131
00132
00133
00134
00135 }
00136
00137
00138 void ElTawil2DUnSym::getGradient(double &gx, double &gy, double x, double y)
00139 {
00140
00141 double drift = getDrift(x, y);
00142 double loc = forceLocation(drift);
00143 double capx = capXdim;
00144 double capy = capYdim;
00145
00146
00147
00148 if(loc != 0)
00149 {
00150 opserr << "ERROR - ElTawil2D::getGradient(double &gx, double &gy, double x, double y)\n";
00151 opserr << "Force point not on yield surface, drift = " << drift << " loc = " << loc <<"\n";
00152 opserr << "\a";
00153 }
00154 else
00155 {
00156 double a = 10.277;
00157
00158
00159 if(y > ytPos)
00160 {
00161 gx = 2*a*x/capx;
00162 gy = 1;
00163 }
00164 else if(y < ytNeg)
00165 {
00166 gx = 2*a*x/capx;
00167 gy = -1;
00168 }
00169 else
00170 {
00171 double xVal = x*capx;
00172 double yVal = y*capy;
00173
00174 if(xVal >= 0 && yVal >= yPosBal)
00175 {
00176 gx = 1/xPosBal;
00177 gy = (1/pow( (yPosCap-yPosBal), czPos))*czPos*(pow(yVal-yPosBal,czPos-1));
00178 }
00179 else if(xVal >=0 && yVal < yPosBal)
00180 {
00181 gx = 1/xPosBal;
00182 gy = -1*(1/pow( fabs(yNegCap-yPosBal), tyPos))*tyPos*(pow(fabs(yVal-yPosBal),tyPos-1));
00183 }
00184 else if(xVal< 0 && yVal >= yNegBal)
00185 {
00186 gx = 1/xNegBal;
00187 gy = (1/pow( (yPosCap-yNegBal), czNeg))*czNeg*(pow(yVal-yNegBal,czNeg-1));
00188 }
00189 else if(xVal<0 && yVal < yNegBal)
00190 {
00191 gx = 1/xNegBal;
00192 gy = -1*(1/pow( fabs(yNegCap-yNegBal), tyNeg))*tyNeg*(pow(fabs(yVal-yNegBal),tyNeg-1));
00193 }
00194 else
00195 {
00196 opserr << "Eltawil2DUnsym - condition not possible" << endln;
00197 opserr << "\a";
00198 }
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 }
00210 }
00211
00212
00213
00214 }
00215
00216 double ElTawil2DUnSym::getSurfaceDrift(double x, double y)
00217 {
00218 double phi;
00219 double a = 5;
00220
00221 double capx = capX;
00222 double capy = capY;
00223
00224
00225
00226
00227 if(y > ytPos && fabs(x) < fabs(y*xt1/ytPos) )
00228 {
00229 phi = a*x*x + y + qy;
00230 }
00231 else if(y < ytNeg && fabs(x) < fabs(y*xt4/ytNeg))
00232 {
00233 phi = a*x*x - y + qy;
00234 }
00235 else
00236 {
00237 double xVal = x*capx;
00238 double yVal = y*capy;
00239
00240 if(xVal >=0 && yVal >= yPosBal)
00241 {
00242 phi = fabs(xVal/xPosBal) + pow((yVal - yPosBal)/(yPosCap - yPosBal), czPos);
00243 }
00244 else if(xVal >=0 && yVal < yPosBal)
00245 {
00246 phi = fabs(xVal/xPosBal) + pow(fabs((yVal - yPosBal)/(yNegCap - yPosBal)), tyPos);
00247 }
00248 else if(xVal < 0 && yVal >= yNegBal)
00249 {
00250 phi = fabs(xVal/xNegBal) + pow((yVal - yNegBal)/(yPosCap - yNegBal), czNeg);
00251 }
00252 else if(xVal < 0 && yVal < yNegBal)
00253 {
00254
00255 phi = fabs(xVal/xNegBal) + pow(fabs((yVal - yNegBal)/(yNegCap - yNegBal)), tyNeg);
00256 }
00257 else
00258 {
00259 opserr << "ElTawil2DUnSym::getSurfaceDrift(..) - cond not possible\n";
00260 opserr << "x=" << x << ", y=" << y << ", capx=" << capx << ", capy=" << capy << endln;
00261 opserr << "xVal = " << xVal << ", yVal = " << yVal << endln;
00262 opserr << "\a";
00263 }
00264
00265
00266
00267
00268
00269
00270 }
00271
00272 double drift = phi - 1;
00273 return drift;
00274 }
00275
00276
00277 void ElTawil2DUnSym::customizeInterpolate(double &xi, double &yi, double &xj, double &yj)
00278 {
00279 this->YieldSurface_BC2D::customizeInterpolate(xi, yi, xj, yj);
00280
00281
00282
00283
00284 if(yj >= ytPos && fabs(xj) <= fabs(yj*xt1/ytPos) )
00285 {
00286 xi = 0;
00287 yi = 0;
00288 }
00289 else if(yj <= ytNeg && fabs(xj) <= fabs(yj*xt4/ytNeg))
00290 {
00291 xi = 0;
00292 yi = 0;
00293 }
00294 else
00295 ;
00296
00297
00298 }
00299
00300
00301 YieldSurface_BC *ElTawil2DUnSym::getCopy(void)
00302 {
00303
00304
00305
00306
00307
00308 ElTawil2DUnSym *theCopy = new ElTawil2DUnSym(this->getTag(), xPosBal, yPosBal+yBal,
00309 xNegBal, yNegBal+yBal, yPosCap+yBal, yNegCap+yBal,
00310 *hModel, czPos, tyPos, czNeg, tyNeg);
00311
00312 return theCopy;
00313 }
00314
00315 int ElTawil2DUnSym::displaySelf(Renderer &theViewer, int displayMode, float fact)
00316 {
00317 this->YieldSurface_BC2D::displaySelf(theViewer, displayMode, fact);
00318 Vector pOld(3), pCurr(3);
00319 Vector rgb(3);
00320 rgb(0) = 0.1; rgb(1) = 0.5; rgb(2) = 0.5;
00321
00322
00323 if(displayMode == this->SurfOnly)
00324 {
00325 rgb(0) = 0.7; rgb(1) = 0.7; rgb(2) = 1.0;
00326
00327 }
00328
00329
00330
00331 double incr = fabs(0.33333333*yNegCap/capY);
00332
00333
00334 if(fact < 1) incr = fact;
00335
00336 double xOld = 0;
00337 double yOld = yNegCap/capY;
00338 hModel->toDeformedCoord(xOld, yOld);
00339
00340 double err = 0.01;
00341
00342 double yc;
00343 for(yc = yNegCap/capY; yc <= yPosCap/capY + err; yc = yc+incr)
00344
00345
00346 {
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364 double y = yc;
00365 if(y > yPosCap/capY)
00366 y = yPosCap/capY;
00367
00368 double yVal = y*capY;
00369 double xVal;
00370
00371 if(yVal < yPosBal)
00372 {
00373 xVal = xPosBal*(1 - pow( fabs((yVal- yPosBal)/(yNegCap - yPosBal)) , tyPos));
00374
00375 }
00376 else
00377 {
00378 xVal = xPosBal*(1 - pow( ((yVal - yPosBal)/(yPosCap - yPosBal)) , czPos));
00379 }
00380
00381 double x = xVal/capX;
00382
00383 if(displayMode==100)
00384 opserr << "(undeformed) x = " << x << ", y = " << y;
00385
00386 hModel->toDeformedCoord(x, y);
00387 if(displayMode==100)
00388 opserr << " (deformed) x = " << x << ", y = " << y << endln;
00389
00390 pCurr(0) = x;
00391 pCurr(1) = y;
00392 pOld(0) = xOld;
00393 pOld(1) = yOld;
00394
00395
00396 theViewer.drawLine(pOld, pCurr, rgb, rgb);
00397 xOld = x;
00398 yOld = y;
00399 }
00400
00401 xOld = 0;
00402 yOld = yNegCap/capY;
00403 hModel->toDeformedCoord(xOld, yOld);
00404
00405
00406
00407
00408
00409 for(yc = yNegCap/capY; yc <= yPosCap/capY + err; yc = yc+incr)
00410
00411 {
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 double y = yc;
00427 if(y > yPosCap/capY)
00428 y = yPosCap/capY;
00429
00430 double yVal = y*capY;
00431 double xVal;
00432
00433 if(yVal < yNegBal)
00434 {
00435 xVal = xNegBal*(1 - pow( fabs((yVal-yNegBal)/(yNegCap-yNegBal)) , tyNeg));
00436 }
00437 else
00438 {
00439 xVal = xNegBal*(1 - pow( ((yVal-yNegBal)/(yPosCap - yNegBal)) , czNeg));
00440 }
00441
00442 double x = xVal/capX;
00443
00444 if(displayMode==100)
00445 opserr << "(undeformed) x = " << x << ", y = " << y;
00446
00447 hModel->toDeformedCoord(x, y);
00448 if(displayMode==100)
00449 opserr << " (deformed) x = " << x << ", y = " << y << endln;
00450
00451 pCurr(0) = x;
00452 pCurr(1) = y;
00453 pOld(0) = xOld;
00454 pOld(1) = yOld;
00455
00456
00457 theViewer.drawLine(pOld, pCurr, rgb, rgb);
00458 xOld = x;
00459 yOld = y;
00460 }
00461
00462
00463 return 0;
00464 }
00465
00466 void ElTawil2DUnSym::Print(OPS_Stream &s, int flag)
00467 {
00468 s << "\nYield Surface No: " << this->getTag() << " type: ElTawil2DUnSym\n";
00469 }
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584