SchmidCostaExponentialLaw2d.cpp
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
00031
00032
00033
00034
00035
00036 #include "SchmidCostaExponentialLaw2d.hpp"
00037
00038 SchmidCostaExponentialLaw2d::SchmidCostaExponentialLaw2d()
00039 {
00040 mA = 0.221;
00041
00042
00043
00044 double bff = 42.5;
00045 double bfs = 11.0;
00046 double bss = 18.6;
00047
00048 mB.resize(2);
00049 mB[0].resize(2);
00050 mB[1].resize(2);
00051
00052 mB[0][0] = bff;
00053 mB[0][1] = bfs;
00054 mB[1][0] = bfs;
00055 mB[1][1] = bss;
00056
00057 for (unsigned M=0; M<2; M++)
00058 {
00059 for (unsigned N=0; N<2; N++)
00060 {
00061 mIdentity(M,N) = M==N ? 1.0 : 0.0;
00062 }
00063 }
00064 }
00065
00066 void SchmidCostaExponentialLaw2d::ComputeStressAndStressDerivative(c_matrix<double,2,2>& rC,
00067 c_matrix<double,2,2>& rInvC,
00068 double pressure,
00069 c_matrix<double,2,2>& rT,
00070 FourthOrderTensor<2,2,2,2>& rDTdE,
00071 bool computeDTdE)
00072 {
00073 static c_matrix<double,2,2> C_transformed;
00074 static c_matrix<double,2,2> invC_transformed;
00075
00076
00077
00078
00079
00080
00081
00082 ComputeTransformedDeformationTensor(rC, rInvC, C_transformed, invC_transformed);
00083
00084
00085
00086 c_matrix<double,2,2> E = 0.5*(C_transformed - mIdentity);
00087
00088 double QQ = 0;
00089 for (unsigned M=0; M<2; M++)
00090 {
00091 for (unsigned N=0; N<2; N++)
00092 {
00093 QQ += mB[M][N]*E(M,N)*E(M,N);
00094 }
00095 }
00096
00097 double multiplier = mA*exp(QQ)/2;
00098 rDTdE.Zero();
00099
00100 for (unsigned M=0; M<2; M++)
00101 {
00102 for (unsigned N=0; N<2; N++)
00103 {
00104 rT(M,N) = multiplier*mB[M][N]*E(M,N) - pressure*invC_transformed(M,N);
00105
00106 if (computeDTdE)
00107 {
00108 for (unsigned P=0; P<2; P++)
00109 {
00110 for (unsigned Q=0; Q<2; Q++)
00111 {
00112 rDTdE(M,N,P,Q) = multiplier * mB[M][N] * (M==P)*(N==Q)
00113 + 2*multiplier*mB[M][N]*mB[P][Q]*E(M,N)*E(P,Q)
00114 + 2*pressure*invC_transformed(M,P)*invC_transformed(Q,N);
00115 }
00116 }
00117 }
00118 }
00119 }
00120
00121
00122 this->TransformStressAndStressDerivative(rT, rDTdE, computeDTdE);
00123 }
00124
00125 double SchmidCostaExponentialLaw2d::GetA()
00126 {
00127 return mA;
00128 }
00129
00130 std::vector<std::vector<double> > SchmidCostaExponentialLaw2d::GetB()
00131 {
00132 return mB;
00133 }
00134
00135 double SchmidCostaExponentialLaw2d::GetZeroStrainPressure()
00136 {
00137 return 0.0;
00138 }