$extrastylesheet
00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2014 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner 00003 00004 // This library is free software; you can redistribute it and/or 00005 // modify it under the terms of the GNU Lesser General Public 00006 // License as published by the Free Software Foundation; either 00007 // version 2.1 of the License, or (at your option) any later version. 00008 00009 // This library is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 // Lesser General Public License for more details. 00013 00014 // You should have received a copy of the GNU Lesser General Public 00015 // License along with this library; if not, write to the Free Software 00016 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00017 00018 00019 00020 #ifndef LIBMESH_DG_FEM_CONTEXT_H 00021 #define LIBMESH_DG_FEM_CONTEXT_H 00022 00023 // Local Includes 00024 #include "libmesh/fem_context.h" 00025 00026 00027 namespace libMesh 00028 { 00029 00036 // ------------------------------------------------------------ 00037 // DGFEMContext class definition 00038 00039 class DGFEMContext : public FEMContext 00040 { 00041 public: 00042 00046 explicit 00047 DGFEMContext (const System &sys); 00048 00052 virtual ~DGFEMContext (); 00053 00059 virtual void side_fe_reinit (); 00060 00066 void neighbor_side_fe_reinit (); 00067 00071 const std::vector<dof_id_type>& get_neighbor_dof_indices() const 00072 { return _neighbor_dof_indices; } 00073 00078 const std::vector<dof_id_type>& get_neighbor_dof_indices( unsigned int var ) const 00079 { return _neighbor_dof_indices_var[var]; } 00080 00084 const DenseVector<Number>& get_neighbor_residual() const 00085 { return _neighbor_residual; } 00086 00090 DenseVector<Number>& get_neighbor_residual() 00091 { return _neighbor_residual; } 00092 00097 const DenseSubVector<Number>& get_neighbor_residual( unsigned int var ) const 00098 { return *(_neighbor_subresiduals[var]); } 00099 00104 DenseSubVector<Number>& get_neighbor_residual( unsigned int var ) 00105 { return *(_neighbor_subresiduals[var]); } 00106 00110 const DenseMatrix<Number>& get_elem_elem_jacobian() const 00111 { return _elem_elem_jacobian; } 00112 00116 DenseMatrix<Number>& get_elem_elem_jacobian() 00117 { return _elem_elem_jacobian; } 00118 00123 const DenseSubMatrix<Number>& get_elem_elem_jacobian( unsigned int var1, unsigned int var2 ) const 00124 { return *(_elem_elem_subjacobians[var1][var2]); } 00125 00130 DenseSubMatrix<Number>& get_elem_elem_jacobian( unsigned int var1, unsigned int var2 ) 00131 { return *(_elem_elem_subjacobians[var1][var2]); } 00132 00136 const DenseMatrix<Number>& get_elem_neighbor_jacobian() const 00137 { return _elem_neighbor_jacobian; } 00138 00142 DenseMatrix<Number>& get_elem_neighbor_jacobian() 00143 { return _elem_neighbor_jacobian; } 00144 00149 const DenseSubMatrix<Number>& get_elem_neighbor_jacobian( unsigned int var1, unsigned int var2 ) const 00150 { return *(_elem_neighbor_subjacobians[var1][var2]); } 00151 00156 DenseSubMatrix<Number>& get_elem_neighbor_jacobian( unsigned int var1, unsigned int var2 ) 00157 { return *(_elem_neighbor_subjacobians[var1][var2]); } 00158 00162 const DenseMatrix<Number>& get_neighbor_elem_jacobian() const 00163 { return _neighbor_elem_jacobian; } 00164 00168 DenseMatrix<Number>& get_neighbor_elem_jacobian() 00169 { return _neighbor_elem_jacobian; } 00170 00175 const DenseSubMatrix<Number>& get_neighbor_elem_jacobian( unsigned int var1, unsigned int var2 ) const 00176 { return *(_neighbor_elem_subjacobians[var1][var2]); } 00177 00182 DenseSubMatrix<Number>& get_neighbor_elem_jacobian( unsigned int var1, unsigned int var2 ) 00183 { return *(_neighbor_elem_subjacobians[var1][var2]); } 00184 00188 const DenseMatrix<Number>& get_neighbor_neighbor_jacobian() const 00189 { return _neighbor_neighbor_jacobian; } 00190 00194 DenseMatrix<Number>& get_neighbor_neighbor_jacobian() 00195 { return _neighbor_neighbor_jacobian; } 00196 00201 const DenseSubMatrix<Number>& get_neighbor_neighbor_jacobian( unsigned int var1, unsigned int var2 ) const 00202 { return *(_neighbor_neighbor_subjacobians[var1][var2]); } 00203 00208 DenseSubMatrix<Number>& get_neighbor_neighbor_jacobian( unsigned int var1, unsigned int var2 ) 00209 { return *(_neighbor_neighbor_subjacobians[var1][var2]); } 00210 00219 void set_neighbor(const Elem& neighbor) 00220 { _neighbor = &neighbor; } 00221 00225 const Elem& get_neighbor() const 00226 { return *_neighbor; } 00227 00231 bool dg_terms_are_active() const 00232 { return _dg_terms_active; } 00233 00237 template<typename OutputShape> 00238 void get_neighbor_side_fe( unsigned int var, FEGenericBase<OutputShape> *& fe ) const; 00239 00240 private: 00241 00245 const Elem *_neighbor; 00246 00250 DenseVector<Number> _neighbor_residual; 00251 00256 DenseMatrix<Number> _elem_elem_jacobian; 00257 DenseMatrix<Number> _elem_neighbor_jacobian; 00258 DenseMatrix<Number> _neighbor_elem_jacobian; 00259 DenseMatrix<Number> _neighbor_neighbor_jacobian; 00260 00264 std::vector<DenseSubVector<Number> *> _neighbor_subresiduals; 00265 std::vector<std::vector<DenseSubMatrix<Number> *> > _elem_elem_subjacobians; 00266 std::vector<std::vector<DenseSubMatrix<Number> *> > _elem_neighbor_subjacobians; 00267 std::vector<std::vector<DenseSubMatrix<Number> *> > _neighbor_elem_subjacobians; 00268 std::vector<std::vector<DenseSubMatrix<Number> *> > _neighbor_neighbor_subjacobians; 00269 00273 std::vector<dof_id_type> _neighbor_dof_indices; 00274 std::vector<std::vector<dof_id_type> > _neighbor_dof_indices_var; 00275 00283 std::map<FEType, FEAbstract *> _neighbor_side_fe; 00284 00289 std::vector<FEAbstract *> _neighbor_side_fe_var; 00290 00295 bool _dg_terms_active; 00296 }; 00297 00298 template<typename OutputShape> 00299 inline 00300 void DGFEMContext::get_neighbor_side_fe( unsigned int var, FEGenericBase<OutputShape> *& fe ) const 00301 { 00302 libmesh_assert_less ( var, _neighbor_side_fe_var.size() ); 00303 fe = cast_ptr<FEGenericBase<OutputShape>*>( _neighbor_side_fe_var[var] ); 00304 } 00305 00306 } // namespace libMesh 00307 00308 #endif // LIBMESH_FEM_CONTEXT_H