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 #ifndef DM04_YF_CPP
00040 #define DM04_YF_CPP
00041
00042 #include "DM04_YF.h"
00043
00044 stresstensor DM04_YF::DM04st;
00045
00046
00047 DM04_YF::DM04_YF(int m_which_in, int index_m_in,
00048 int alpha_which_in, int index_alpha_in)
00049 : m_which(m_which_in), index_m(index_m_in),
00050 alpha_which(alpha_which_in), index_alpha(index_alpha_in)
00051 {
00052
00053 }
00054
00055
00056 DM04_YF::~DM04_YF()
00057 {
00058
00059 }
00060
00061
00062 YieldFunction* DM04_YF::newObj()
00063 {
00064 YieldFunction *new_YF = new DM04_YF(m_which, index_m,
00065 alpha_which, index_alpha);
00066
00067 return new_YF;
00068 }
00069
00070
00071 double DM04_YF::YieldFunctionValue( const stresstensor& Stre,
00072 const MaterialParameter &MaterialParameter_in ) const
00073 {
00074
00075
00076 double p = Stre.p_hydrostatic();
00077
00078 double m = getm(MaterialParameter_in);
00079 stresstensor alpha = getalpha(MaterialParameter_in);
00080
00081 stresstensor s_bar = Stre.deviator() - (alpha * p);
00082 double temp1 = ( s_bar("ij") * s_bar("ij") ).trace();
00083
00084 return temp1 - (2.0/3.0)*m*m*p*p - 1.0e-6;
00085 }
00086
00087
00088 const stresstensor& DM04_YF::StressDerivative(const stresstensor& Stre,
00089 const MaterialParameter &MaterialParameter_in) const
00090 {
00091 BJtensor KroneckerI("I", 2, def_dim_2);
00092
00093 double p = Stre.p_hydrostatic();
00094
00095 double m = getm(MaterialParameter_in);
00096 stresstensor alpha = getalpha(MaterialParameter_in);
00097
00098 stresstensor s_bar = Stre.deviator() - (alpha * p);
00099
00100 double s_bar_alpha = (s_bar("ij")*alpha("ij")).trace();
00101
00102 DM04st = s_bar + ( KroneckerI * ( s_bar_alpha/3.0 + (4.0/9.0)*m*m*p ));
00103
00104 return DM04st;
00105 }
00106
00107
00108 const stresstensor& DM04_YF::InTensorDerivative(const stresstensor& Stre,
00109 const MaterialParameter &MaterialParameter_in,
00110 int which) const
00111 {
00112 if (which == index_alpha) {
00113
00114 stresstensor alpha = getalpha(MaterialParameter_in);
00115
00116 double p = Stre.p_hydrostatic();
00117 stresstensor s_bar = Stre.deviator() - (alpha *p);
00118
00119 DM04_YF::DM04st = s_bar *(-p);
00120 }
00121 else {
00122 opserr << "DM04_YF: Invalid Input. " << endln;
00123 exit (1);
00124 }
00125
00126 return DM04_YF::DM04st;
00127 }
00128
00129
00130 int DM04_YF::getNumInternalScalar() const
00131 {
00132 return 0;
00133 }
00134
00135
00136 int DM04_YF::getNumInternalTensor() const
00137 {
00138 return 1;
00139 }
00140
00141
00142 int DM04_YF::getYieldFunctionRank() const
00143 {
00144 return 1;
00145 }
00146
00147
00148 double DM04_YF::getm(const MaterialParameter &MaterialParameter_in) const
00149 {
00150
00151 double m = 0.0;
00152 if ( m_which == 0 && index_m <= MaterialParameter_in.getNum_Material_Parameter() && index_m > 0 ) {
00153 m = MaterialParameter_in.getMaterial_Parameter(index_m-1);
00154 if (m <= 0.0) {
00155 opserr << "DM04_YF: Invalid Input, m <= 0.0. " << endln;
00156 exit (1);
00157 }
00158 return m;
00159 }
00160 else {
00161 opserr << "Warning!! DM04_YF: Invalid Input. " << endln;
00162 exit (1);
00163 }
00164 }
00165
00166
00167 const stresstensor& DM04_YF::getalpha(const MaterialParameter &MaterialParameter_in) const
00168 {
00169
00170 if ( alpha_which == 2 && index_alpha <= MaterialParameter_in.getNum_Internal_Tensor() && index_alpha > 0 ) {
00171 DM04_YF::DM04st = MaterialParameter_in.getInternal_Tensor(index_alpha-1);
00172 return DM04_YF::DM04st;
00173 }
00174 else {
00175 opserr << "Warning!! DM04_YF: Invalid Input. " << endln;
00176 exit (1);
00177 }
00178 }
00179
00180 #endif
00181