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 #ifndef NONLINEARELASTICITYASSEMBLER_HPP_
00029 #define NONLINEARELASTICITYASSEMBLER_HPP_
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 #include "AbstractNonlinearElasticityAssembler.hpp"
00046
00047
00048 #include "QuadraticMesh.hpp"
00049 #include "GaussianQuadratureRule.hpp"
00050
00061 template<size_t DIM>
00062 class NonlinearElasticityAssembler : public AbstractNonlinearElasticityAssembler<DIM>
00063 {
00064 friend class TestNonlinearElasticityAssembler;
00065
00066 protected:
00067 static const size_t NUM_VERTICES_PER_ELEMENT = DIM+1;
00068 static const size_t NUM_NODES_PER_ELEMENT = (DIM+1)*(DIM+2)/2;
00069 static const size_t STENCIL_SIZE = DIM*NUM_NODES_PER_ELEMENT + NUM_VERTICES_PER_ELEMENT;
00070 static const size_t NUM_NODES_PER_BOUNDARY_ELEMENT = DIM*(DIM+1)/2;
00071 static const size_t BOUNDARY_STENCIL_SIZE = DIM*NUM_NODES_PER_BOUNDARY_ELEMENT + DIM;
00072
00077 QuadraticMesh<DIM>* mpQuadMesh;
00078
00079
00081 std::vector<BoundaryElement<DIM-1,DIM>*> mBoundaryElements;
00082
00083 GaussianQuadratureRule<DIM>* mpQuadratureRule;
00084 GaussianQuadratureRule<DIM-1>* mpBoundaryQuadratureRule;
00085
00091 virtual void AssembleOnElement(Element<DIM, DIM>& rElement,
00092 c_matrix<double, STENCIL_SIZE, STENCIL_SIZE >& rAElem,
00093 c_matrix<double, STENCIL_SIZE, STENCIL_SIZE >& rAElemPrecond,
00094 c_vector<double, STENCIL_SIZE>& rBElem,
00095 bool assembleResidual,
00096 bool assembleJacobian);
00097
00103 virtual void AssembleOnBoundaryElement(BoundaryElement<DIM-1,DIM>& rBoundaryElement,
00104 c_matrix<double,BOUNDARY_STENCIL_SIZE,BOUNDARY_STENCIL_SIZE>& rAelem,
00105 c_vector<double,BOUNDARY_STENCIL_SIZE>& rBelem,
00106 c_vector<double,DIM>& rTraction,
00107 bool assembleResidual,
00108 bool assembleJacobian);
00109
00126 void FormInitialGuess();
00127
00134 void AssembleSystem(bool assembleResidual, bool assembleJacobian);
00135
00136
00137 void Initialise(std::vector<c_vector<double,DIM> >* pFixedNodeLocations);
00138
00139 public:
00145 NonlinearElasticityAssembler(QuadraticMesh<DIM>* pQuadMesh,
00146 AbstractIncompressibleMaterialLaw<DIM>* pMaterialLaw,
00147 c_vector<double,DIM> bodyForce,
00148 double density,
00149 std::string outputDirectory,
00150 std::vector<unsigned>& fixedNodes,
00151 std::vector<c_vector<double,DIM> >* pFixedNodeLocations = NULL);
00152
00154 NonlinearElasticityAssembler(QuadraticMesh<DIM>* pQuadMesh,
00155 std::vector<AbstractIncompressibleMaterialLaw<DIM>*>& rMaterialLaws,
00156 c_vector<double,DIM> bodyForce,
00157 double density,
00158 std::string outputDirectory,
00159 std::vector<unsigned>& fixedNodes,
00160 std::vector<c_vector<double,DIM> >* pFixedNodeLocations = NULL);
00161
00163 ~NonlinearElasticityAssembler();
00164
00170 void SetSurfaceTractionBoundaryConditions(std::vector<BoundaryElement<DIM-1,DIM>*>& rBoundaryElements,
00171 std::vector<c_vector<double,DIM> >& rSurfaceTractions);
00172
00177 void SetFunctionalTractionBoundaryCondition(std::vector<BoundaryElement<DIM-1,DIM>*> rBoundaryElements,
00178 c_vector<double,DIM> (*pFunction)(c_vector<double,DIM>&));
00179
00180 std::vector<double>& rGetPressures();
00181
00185 std::vector<c_vector<double,DIM> >& rGetDeformedPosition();
00186 };
00187
00188 #endif