MultiLinearKp.cpp

Go to the documentation of this file.
00001 // MultiLinearKp.cpp: implementation of the MultiLinearKp class.
00002 //
00004 
00005 #include "MultiLinearKp.h"
00006 #include <stdlib.h>
00007 
00008 #define MAT_TAG_MULTILINEAR -1
00009 #define DEBG 0
00011 // Construction/Destruction
00013 
00014 MultiLinearKp::MultiLinearKp(int tag, Vector &sum_plas_defo, Vector &kp)
00015 :PlasticHardeningMaterial(tag,MAT_TAG_MULTILINEAR),
00016 sumPlasDefo(sum_plas_defo.Size()+1), Kp(kp.Size()+1)
00017 {
00018         if(sumPlasDefo.Size() != Kp.Size())
00019         {
00020                 opserr << "ERROR MultiLinear() - incompatible vector sizes\n";
00021         }
00022 
00023         numPoints = sum_plas_defo.Size();
00024 
00025         for(int i=0; i < numPoints; i++)
00026         {
00027                 sumPlasDefo(i) =  sum_plas_defo(i);
00028                 if(sumPlasDefo(i) < 0)
00029                         opserr << "ERROR MultiLinear() -  sumPlasDefo < 0\n";
00030 
00031                 Kp(i) = kp(i);
00032         }
00033         if(sumPlasDefo(0) != 0)
00034                 opserr << "WARNING MultiLinear() -  sumPlasDefo(0) != 0\n";
00035 
00036         Kp(numPoints)          = Kp(numPoints -1);
00037         sumPlasDefo(numPoints) = sumPlasDefo(numPoints -1)*1000;
00038 
00039         //cout << *this;
00040 }
00041 
00042 MultiLinearKp::~MultiLinearKp()
00043 {
00044 
00045 }
00046 
00047 
00048 double MultiLinearKp::getTrialPlasticStiffness()
00049 {
00050 double K = 0;
00051 double sumDisp = val_trial;
00052 
00053         if( sumDisp > sumPlasDefo(numPoints-1))
00054         {
00055                 K = residual*Kp(numPoints-1);
00056                 
00057                 if(sFactor != 1.0)
00058                         K = Kp(0)*sFactor;
00059                 return K;
00060         }
00061                 
00062         for(int i=0; i< numPoints; i++)
00063         {
00064                 double x1 = sumPlasDefo(i);
00065                 double y1 = Kp(i);
00066                 double x2 = sumPlasDefo(i+1);
00067                 double y2 = Kp(i+1);
00068                 
00069                 if(sumDisp < x2 && sumDisp >= x1)
00070                 {
00071                         if (sumDisp == x1)
00072                                 return y1;
00073                                 
00074                         if(x2 == x1)
00075                         {
00076                                 opserr << "WARNING - MultiLinear::getTangent() x2 -x1 = 0 \n";
00077                                 return 0;
00078                         }
00079                         
00080                         double m = (y2 - y1)/(x2 -x1);
00081                     double b = y1 - m*x1;
00082                     K = m*sumDisp + b;
00083                         break;
00084                 }
00085         }
00086 
00087         if(sFactor != 1.0)
00088                 K = Kp(0)*sFactor;
00089         else
00090                 K = residual*K;
00091 
00092         // opserr << "K = " << K << ", sFactor = " << sFactor << endln; // opserr << "\a";
00093         return K;
00094 }
00095 
00096 
00097 void MultiLinearKp::Print(OPS_Stream &s, int flag)
00098 {
00099         this->PlasticHardeningMaterial::Print(s, flag);
00100         
00101         s << "+-MultiLinear" << endln;
00102         s << "    Kp = " << this->getTrialPlasticStiffness();
00103         s << "    SumPlasDefo Vector = " <<  sumPlasDefo;
00104         s << "    Kp Vector          = " <<  Kp << endln;
00105 }
00106 
00107 PlasticHardeningMaterial *MultiLinearKp::getCopy(void)
00108 {
00109         Vector spd(numPoints);
00110     Vector kp(numPoints);
00111 
00112     for(int i =0; i < numPoints; i++)
00113     {
00114         spd(i) =  sumPlasDefo(i);
00115         kp(i)  =  Kp(i);
00116     }
00117 
00118     // Don't want to pass the actual vectors or else the size will
00119     // keep on increasing by 1
00120         PlasticHardeningMaterial *theMat = new MultiLinearKp(getTag(), spd, kp);
00121     return theMat;
00122 }
00123 

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