• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

PisdWdF_Def.hpp

Go to the documentation of this file.
00001 //*****************************************************************//
00002 //    Albany 2.0:  Copyright 2012 Sandia Corporation               //
00003 //    This Software is released under the BSD license detailed     //
00004 //    in the file "license.txt" in the top-level Albany directory  //
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   // Pull out numQPs and numDims from a Layout
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   // Leading dimension of 1 added so we can use Intrepid::det
00065   Intrepid::FieldContainer<EnergyFadType> F(1,numDims,numDims);
00066 
00067   // Allocate F ( = defgrad of derivative types) and seed with identity derivs
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); // 0.0 will be overwriten below
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       // Fill F with defgrad for value. Derivs already seeded with identity.
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       // Call energy funtional (can make a library of these)
00088       EnergyFadType W = computeEnergy(kappa, mu, F);
00089 
00090       // Extract stress from derivs of energy
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   // array of length 1 so Intrepid::det can be called.
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 } // LCM

Generated on Wed Mar 26 2014 18:36:43 for Albany: a Trilinos-based PDE code by  doxygen 1.7.1