NaturalNeumannSurfaceTermAssembler.hpp
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 #ifndef NATURALNEUMANNSURFACETERMASSEMBLER_HPP
00030 #define NATURALNEUMANNSURFACETERMASSEMBLER_HPP
00031
00032 #include "AbstractFeSurfaceIntegralAssembler.hpp"
00033
00034
00054 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00055 class NaturalNeumannSurfaceTermAssembler : public AbstractFeSurfaceIntegralAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>
00056 {
00057 protected:
00059 double mScaleFactor;
00060
00061
00076 virtual c_vector<double, PROBLEM_DIM*ELEMENT_DIM> ComputeVectorSurfaceTerm(
00077 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM>& rSurfaceElement,
00078 c_vector<double, ELEMENT_DIM>& rPhi,
00079 ChastePoint<SPACE_DIM>& rX);
00080
00081 public:
00089 NaturalNeumannSurfaceTermAssembler(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00090 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>* pBoundaryConditions,
00091 unsigned numQuadPoints = 2)
00092 : AbstractFeSurfaceIntegralAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>(pMesh, pBoundaryConditions, numQuadPoints),
00093 mScaleFactor(1.0)
00094 {
00095 }
00096
00101 void SetScaleFactor(double scaleFactor)
00102 {
00103 mScaleFactor = scaleFactor;
00104 }
00105 };
00106
00107
00108
00109 template <unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00110 c_vector<double, PROBLEM_DIM*ELEMENT_DIM> NaturalNeumannSurfaceTermAssembler<ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM>::ComputeVectorSurfaceTerm(
00111 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM>& rSurfaceElement,
00112 c_vector<double, ELEMENT_DIM>& rPhi,
00113 ChastePoint<SPACE_DIM>& rX)
00114 {
00115 c_vector<double, ELEMENT_DIM*PROBLEM_DIM> ret;
00116 c_vector<double, PROBLEM_DIM> neumann_bc_values;
00117
00118 for (unsigned i=0; i<ELEMENT_DIM; i++)
00119 {
00120 for(unsigned problem_dim = 0; problem_dim<PROBLEM_DIM; problem_dim++)
00121 {
00122 double neumann_bc_value = this->mpBoundaryConditions->GetNeumannBCValue(&rSurfaceElement, rX, problem_dim);
00123
00124 ret(PROBLEM_DIM*i + problem_dim) = mScaleFactor * rPhi(i) * neumann_bc_value;
00125 }
00126 }
00127
00128 return ret;
00129 }
00130
00131 #endif