00001
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
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
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
00119
00120 PlasticHardeningMaterial *theMat = new MultiLinearKp(getTag(), spd, kp);
00121 return theMat;
00122 }
00123