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