void AbstractContinuumMechanicsSolver<DIM>::RemovePressureDummyValuesThroughLinearInterpolation() { assert(mProblemDimension==DIM+1); // For quadratic triangles, node 3 is between nodes 1 and 2, node 4 is between 0 and 2, etc unsigned internal_nodes_2d[3] = {3,4,5}; unsigned neighbouring_vertices_2d[3][2] = { {1,2}, {2,0}, {0,1} }; // ordering for quadratic tetrahedra unsigned internal_nodes_3d[6] = {4,5,6,7,8,9}; unsigned neighbouring_vertices_3d[6][2] = { {0,1}, {1,2}, {0,2}, {0,3}, {1,3}, {2,3} }; unsigned num_internal_nodes_per_element = DIM==2 ? 3 : 6; // loop over elements, then loop over edges. for (typename AbstractTetrahedralMesh<DIM,DIM>::ElementIterator iter = mrQuadMesh.GetElementIteratorBegin(); iter != mrQuadMesh.GetElementIteratorEnd(); ++iter) { for(unsigned i=0; i<num_internal_nodes_per_element; i++) { unsigned global_index; double left_val; double right_val; if(DIM==2) { global_index = iter->GetNodeGlobalIndex( internal_nodes_2d[i] ); unsigned vertex_0_global_index =iter->GetNodeGlobalIndex( neighbouring_vertices_2d[i][0] ); unsigned vertex_1_global_index =iter->GetNodeGlobalIndex( neighbouring_vertices_2d[i][1] ); left_val = mCurrentSolution[mProblemDimension*vertex_0_global_index + DIM]; right_val = mCurrentSolution[mProblemDimension*vertex_1_global_index + DIM]; } else { global_index = iter->GetNodeGlobalIndex( internal_nodes_3d[i] ); unsigned vertex_0_global_index =iter->GetNodeGlobalIndex( neighbouring_vertices_3d[i][0] ); unsigned vertex_1_global_index =iter->GetNodeGlobalIndex( neighbouring_vertices_3d[i][1] ); left_val = mCurrentSolution[mProblemDimension*vertex_0_global_index + DIM]; right_val = mCurrentSolution[mProblemDimension*vertex_1_global_index + DIM]; } // this line assumes the internal node is midway between the two vertices mCurrentSolution[mProblemDimension*global_index + DIM] = 0.5 * (left_val + right_val); } } }