174 assert(this->mAssembleVector);
179 if (mpBoundaryConditions->AnyNonZeroNeumannConditions())
182 neumann_iterator = mpBoundaryConditions->BeginNeumann();
184 c_vector<double, PROBLEM_DIM*ELEMENT_DIM> b_surf_elem;
187 while (neumann_iterator != mpBoundaryConditions->
EndNeumann())
189 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM>& r_surf_element = *(neumann_iterator->first);
190 AssembleOnSurfaceElement(r_surf_element, b_surf_elem);
192 const size_t STENCIL_SIZE=PROBLEM_DIM*ELEMENT_DIM;
193 unsigned p_indices[STENCIL_SIZE];
195 PetscVecTools::AddMultipleValues<STENCIL_SIZE>(this->mVectorToAssemble, p_indices, b_surf_elem);
207 c_vector<double, PROBLEM_DIM*ELEMENT_DIM>& rBSurfElem)
209 c_vector<double, SPACE_DIM> weighted_direction;
210 double jacobian_determinant;
211 mpMesh->GetWeightedDirectionForBoundaryElement(rSurfaceElement.
GetIndex(), weighted_direction, jacobian_determinant);
216 c_vector<double, ELEMENT_DIM> phi;
219 for (
unsigned quad_index=0; quad_index<mpSurfaceQuadRule->GetNumQuadPoints(); quad_index++)
221 const ChastePoint<ELEMENT_DIM-1>& quad_point = mpSurfaceQuadRule->rGetQuadPoint(quad_index);
223 SurfaceBasisFunction::ComputeBasisFunctions(quad_point, phi);
232 this->ResetInterpolatedQuantities();
233 for (
unsigned i=0; i<rSurfaceElement.
GetNumNodes(); i++)
235 const c_vector<double, SPACE_DIM> node_loc = rSurfaceElement.
GetNode(i)->rGetLocation();
236 x.rGetLocation() += phi(i)*node_loc;
239 this->IncrementInterpolatedQuantities(phi(i), rSurfaceElement.
GetNode(i));
247 double wJ = jacobian_determinant * mpSurfaceQuadRule->GetWeight(quad_index);
249 noalias(rBSurfElem) += ComputeVectorSurfaceTerm(rSurfaceElement, phi, x) * wJ;