$extrastylesheet
dg_fem_context.h
Go to the documentation of this file.
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