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
00080 c_matrix<double,2,2> E = 0.5*(C_transformed - mIdentity);
00081
00082 double Q = 0;
00083 for (unsigned M=0; M<2; M++)
00084 {
00085 for (unsigned N=0; N<2; N++)
00086 {
00087 Q += mB[M][N]*E(M,N)*E(M,N);
00088 }
00089 }
00090
00091 double multiplier = mA*exp(Q)/2;
00092 rDTdE.Zero();
00093
00094 for (unsigned M=0; M<2; M++)
00095 {
00096 for (unsigned N=0; N<2; N++)
00097 {
00098 rT(M,N) = multiplier*mB[M][N]*E(M,N) - pressure*invC_transformed(M,N);
00099
00100 if (computeDTdE)
00101 {
00102 for (unsigned P=0; P<2; P++)
00103 {
00104 for (unsigned Q=0; Q<2; Q++)
00105 {
00106 rDTdE(M,N,P,Q) = multiplier * mB[M][N] * (M==P)*(N==Q)
00107 + 2*multiplier*mB[M][N]*mB[P][Q]*E(M,N)*E(P,Q)
00108 + 2*pressure*invC_transformed(M,P)*invC_transformed(Q,N);
00109 }
00110 }
00111 }
00112 }
00113 }
00114
00115
00116 this->TransformStressAndStressDerivative(rT, rDTdE, computeDTdE);
00117 }
00118
00119 double SchmidCostaExponentialLaw2d::GetA()
00120 {
00121 return mA;
00122 }
00123
00124 std::vector<std::vector<double> > SchmidCostaExponentialLaw2d::GetB()
00125 {
00126 return mB;
00127 }
00128
00129 double SchmidCostaExponentialLaw2d::GetZeroStrainPressure()
00130 {
00131 return 0.0;
00132 }