00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #ifndef elnp_Elastic_CPP
00043 #define elnp_Elastic_CPP
00044
00045 #include "elnp_Elastic.h"
00046
00047
00048
00049 elnp_Elastic::elnp_Elastic(int kappa_in,
00050 int v_in,
00051 int K_c_in,
00052 int e0_in,
00053 const stresstensor& initialStress,
00054 const straintensor& initialStrain)
00055 : ElasticState(initialStress, initialStrain),
00056 kappa_index(kappa_in),
00057 v_index(v_in),
00058 K_c_index(K_c_in),
00059 e0_index(e0_in)
00060 {
00061
00062 }
00063
00064
00065 ElasticState* elnp_Elastic::newObj()
00066 {
00067 ElasticState * Els = new elnp_Elastic(this->kappa_index,
00068 this->v_index,
00069 this->K_c_index,
00070 this->e0_index,
00071 this->Stress,
00072 this->Strain);
00073 return Els;
00074 }
00075
00076
00077 const BJtensor& elnp_Elastic::getElasticStiffness(const MaterialParameter &MaterialParameter_in) const
00078 {
00079
00080 BJtensor I2("I", 2, def_dim_2);
00081
00082 BJtensor I_ijkl = I2("ij")*I2("kl");
00083 I_ijkl.null_indices();
00084 BJtensor I_ikjl = I_ijkl.transpose0110();
00085 BJtensor I_iljk = I_ijkl.transpose0111();
00086 BJtensor I4s = (I_ikjl+I_iljk)*0.5;
00087
00088 double kappa = getkappa(MaterialParameter_in);
00089 double v = getv(MaterialParameter_in);
00090 if (v >= 0.5 || v < -1.0) {
00091 opserr << "Warning!! elnp_Elastic: Invalid Possoin's ratio. " << endln;
00092 exit (1);
00093 }
00094 double Kc = getK_c(MaterialParameter_in);
00095 double e0 = gete0(MaterialParameter_in);
00096
00097 double p = this->getStress().p_hydrostatic();
00098 double epsilon_v = this->getStrain().Iinvariant1();
00099 double e = e0 + (1 + e0) *epsilon_v;
00100 double Kk = (1.0 + e) *p /kappa;
00101
00102 double K = (Kk > Kc) ? Kk : Kc ;
00103 double G = K *1.5*(1.0-2.0*v)/(1.0+v);
00104
00105
00106
00107
00108
00109 ElasticState::ElasticStiffness = I_ijkl *(K - 2.0*G/3.0) + I4s *(2.0*G);
00110
00111 return ElasticState::ElasticStiffness;
00112 }
00113
00114
00115 double elnp_Elastic::getkappa(const MaterialParameter &MaterialParameter_in) const
00116 {
00117 if ( kappa_index > MaterialParameter_in.getNum_Material_Parameter() || kappa_index < 2) {
00118 opserr << "elnp_Elastic: Invalid Input. " << endln;
00119 exit (1);
00120 }
00121 else
00122 return MaterialParameter_in.getMaterial_Parameter(kappa_index - 1);
00123 }
00124
00125
00126 double elnp_Elastic::getv(const MaterialParameter &MaterialParameter_in) const
00127 {
00128 if ( v_index > MaterialParameter_in.getNum_Material_Parameter() || v_index < 2) {
00129 opserr << "elnp_Elastic: Invalid Input. " << endln;
00130 exit (1);
00131 }
00132 else
00133 return MaterialParameter_in.getMaterial_Parameter(v_index - 1);
00134 }
00135
00136
00137 double elnp_Elastic::getK_c(const MaterialParameter &MaterialParameter_in) const
00138 {
00139 if ( K_c_index > MaterialParameter_in.getNum_Material_Parameter() || K_c_index < 2) {
00140 opserr << "elnp_Elastic: Invalid Input. " << endln;
00141 exit (1);
00142 }
00143 else
00144 return MaterialParameter_in.getMaterial_Parameter(K_c_index - 1);
00145 }
00146
00147
00148 double elnp_Elastic::gete0(const MaterialParameter &MaterialParameter_in) const
00149 {
00150 if ( e0_index > MaterialParameter_in.getNum_Material_Parameter() || e0_index < 2) {
00151 opserr << "elnp_Elastic: Invalid Input. " << endln;
00152 exit (1);
00153 }
00154 else
00155 return MaterialParameter_in.getMaterial_Parameter(e0_index - 1);
00156 }
00157
00158 #endif