BkStressLimSurface2D.cpp

Go to the documentation of this file.
00001 //BkStressLimSurface2D
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         // don't really need a copy for kinMats /LimSurface because only getDrift() is used
00046         // even if the user reuses.. a separate copy will be created
00047         // that said ..
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 //      double epx = isotropicRatio*lamda*g(0);
00115 //      double epy = isotropicRatio*lamda*g(1);
00116 
00117         // set wrt absolute for easier calibration
00118         double epx = lamda*g(0);
00119         double epy = lamda*g(1);
00120 
00121 //      opserr << "epx = " << epx << ", epy = " << epy << endln;
00122 //      opserr << "gx  = " << g(0)  << ", gy  = " << g(1)  << endln;
00123 //      opserr << "\a";
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; // constP
00154         
00155 int resType = resAlgo;
00156         
00157         double dR = fabs(drift); // in-case outside    pinching starts late
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; // approx value = 2   metal case
00167                          else
00168                                 dR = 0.0;
00169                 }
00170                 else     // no pinching
00171                 {
00172                         //old limSurface->hModel->toOriginalCoord(fx, fy);
00173                         //old  dR = limSurface->interpolate(x0, y0, fx, fy);
00174 
00175 
00176                         // y0 range -1 to +1
00177                         if(sign(g(0)) != sign(translate_hist(0)))
00178                         {
00179                                   // dR = 2.0 + drift; // drift < 0
00180                                 dR = fabs(limSurface->getDrift(0.0, y0))*2 - fabs(drift);
00181 //          not required
00182 //                      else
00183 //                              dR = fabs(drift);
00184 
00185 //                      opserr << "!!drift 0, y0 = " << limSurface->getDrift(0.0, y0)
00186 //                           << ", drift = " << drift << endln;
00187                         }
00188                 }
00189 
00190                 break;
00191         } //case 1 - Metals
00192 
00193         case 2:
00194         {
00195                 if(drift >= 0.0)
00196                         dR = 0.0;
00197                 else     // pinching starts early
00198                 {
00199 //                      limSurface->hModel->toOriginalCoord(fx, fy);
00200 //                      dR = limSurface->interpolate(x0, y0, fx, fy);
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         }//case 2 - Pinching,  Kp =  Kp0 -> 0
00207 
00208         case 3:
00209         {
00210                 if(drift >= 0.0)
00211                         dR = 0.0;
00212                 break;
00213         }//case 3 - Pinching, Kp = 0 -> Kp0 -> 0
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 /*              else
00223                 {
00224                         if(sign(g(0)) != sign(translate_hist(0)))
00225                                 dR = 0.0;
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         } // switch - algo
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 //              opserr << "----- Drift > 0 --- ( " << sfactor << ")\n";
00262     }
00263     
00264         // absolute values - no need to have history 
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 //      opserr << *isoMatYPos;
00282 //      opserr << *isoMatXPos;
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         // -1 => Radial Evolution
00350         //  0 => From geometric center (~ normal)
00351         //  1 => Constant-P
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         

Generated on Mon Oct 23 15:05:23 2006 for OpenSees by doxygen 1.5.0