00001
00002
00003
00004
00005
00006
00007 #include "Teuchos_TestForException.hpp"
00008 #include "Phalanx_DataLayout.hpp"
00009
00010 #include "Intrepid_FunctionSpaceTools.hpp"
00011
00012 namespace LCM {
00013
00014
00015 template<typename EvalT, typename Traits>
00016 PisdWdF<EvalT, Traits>::
00017 PisdWdF(const Teuchos::ParameterList& p) :
00018 defgrad (p.get<std::string> ("DefGrad Name"),
00019 p.get<Teuchos::RCP<PHX::DataLayout> >("QP Tensor Data Layout") ),
00020 elasticModulus (p.get<std::string> ("Elastic Modulus Name"),
00021 p.get<Teuchos::RCP<PHX::DataLayout> >("QP Scalar Data Layout") ),
00022 poissonsRatio (p.get<std::string> ("Poissons Ratio Name"),
00023 p.get<Teuchos::RCP<PHX::DataLayout> >("QP Scalar Data Layout") ),
00024 P (p.get<std::string> ("Stress Name"),
00025 p.get<Teuchos::RCP<PHX::DataLayout> >("QP Tensor Data Layout") )
00026 {
00027
00028 Teuchos::RCP<PHX::DataLayout> tensor_dl =
00029 p.get< Teuchos::RCP<PHX::DataLayout> >("QP Tensor Data Layout");
00030 std::vector<PHX::DataLayout::size_type> dims;
00031 tensor_dl->dimensions(dims);
00032 numQPs = dims[1];
00033 numDims = dims[2];
00034
00035 this->addDependentField(defgrad);
00036 this->addDependentField(elasticModulus);
00037 this->addDependentField(poissonsRatio);
00038
00039 this->addEvaluatedField(P);
00040
00041 this->setName("P by AD of dWdF"+PHX::TypeString<EvalT>::value);
00042 }
00043
00044
00045 template<typename EvalT, typename Traits>
00046 void PisdWdF<EvalT, Traits>::
00047 postRegistrationSetup(typename Traits::SetupData d,
00048 PHX::FieldManager<Traits>& fm)
00049 {
00050 this->utils.setFieldData(P,fm);
00051 this->utils.setFieldData(defgrad,fm);
00052 this->utils.setFieldData(elasticModulus,fm);
00053 this->utils.setFieldData(poissonsRatio,fm);
00054 }
00055
00056
00057 template<typename EvalT, typename Traits>
00058 void PisdWdF<EvalT, Traits>::
00059 evaluateFields(typename Traits::EvalData workset)
00060 {
00061 ScalarT kappa;
00062 ScalarT mu;
00063
00064
00065 Intrepid::FieldContainer<EnergyFadType> F(1,numDims,numDims);
00066
00067
00068 for (std::size_t i=0; i < numDims; ++i)
00069 {
00070 for (std::size_t j=0; j < numDims; ++j)
00071 {
00072 F(0,i,j) = EnergyFadType(numDims*numDims, 0.0);
00073 F(0,i,j).fastAccessDx(i*numDims + j) = 1.0;
00074 }
00075 }
00076
00077 for (std::size_t cell=0; cell < workset.numCells; ++cell) {
00078 for (std::size_t qp=0; qp < numQPs; ++qp) {
00079 kappa = elasticModulus(cell,qp) / ( 3. * ( 1. - 2. * poissonsRatio(cell,qp) ) );
00080 mu = elasticModulus(cell,qp) / ( 2. * ( 1. + poissonsRatio(cell,qp) ) );
00081
00082
00083 for (std::size_t i=0; i < numDims; ++i)
00084 for (std::size_t j=0; j < numDims; ++j)
00085 F(0,i,j).val() = defgrad(cell, qp, i, j);
00086
00087
00088 EnergyFadType W = computeEnergy(kappa, mu, F);
00089
00090
00091 for (std::size_t i=0; i < numDims; ++i)
00092 for (std::size_t j=0; j < numDims; ++j)
00093 P(cell, qp, i, j) = W.fastAccessDx(i*numDims + j);
00094
00095 }
00096 }
00097 }
00098
00099
00100
00101 template<typename EvalT, typename Traits>
00102 typename PisdWdF<EvalT, Traits>::EnergyFadType
00103 PisdWdF<EvalT, Traits>::computeEnergy(ScalarT& kappa, ScalarT& mu, Intrepid::FieldContainer<EnergyFadType>& F)
00104 {
00105
00106 Intrepid::FieldContainer<EnergyFadType> Jvec(1);
00107 Intrepid::RealSpaceTools<EnergyFadType>::det(Jvec, F);
00108 EnergyFadType& J = Jvec(0);
00109 EnergyFadType Jm23 = std::pow(J, -2./3.);
00110 EnergyFadType trace = 0.0;
00111
00112 for (std::size_t i=0; i < numDims; ++i)
00113 for (std::size_t j=0; j < numDims; ++j)
00114 trace += F(0,i,j) * F(0,i,j);
00115
00116 EnergyFadType kappa_div_2 = EnergyFadType(0.5 * kappa);
00117 EnergyFadType mu_div_2 = EnergyFadType(0.5 * mu);
00118
00119 return ( kappa_div_2 * ( 0.5 * ( J * J - 1.0 ) - std::log(J) )
00120 + mu_div_2 * ( Jm23 * trace - 3.0 ));
00121 }
00122
00123 }