$extrastylesheet
diff_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_DIFF_CONTEXT_H
00021 #define LIBMESH_DIFF_CONTEXT_H
00022 
00023 // Local Includes
00024 #include "libmesh/dense_matrix.h"
00025 #include "libmesh/dense_submatrix.h"
00026 #include "libmesh/dense_subvector.h"
00027 #include "libmesh/dense_vector.h"
00028 #include "libmesh/id_types.h"
00029 
00030 // C++ includes
00031 #include <cstddef>
00032 #include <map>
00033 #include <vector>
00034 
00035 namespace libMesh
00036 {
00037 
00038 // Forward declarations
00039 template <typename T> class NumericVector;
00040 class System;
00041 
00054 // ------------------------------------------------------------
00055 // DifferentiableSystem class definition
00056 
00057 class DiffContext
00058 {
00059 public:
00060 
00065   explicit
00066   DiffContext (const System &);
00067 
00071   virtual ~DiffContext ();
00072 
00078   virtual void elem_reinit(Real /* theta */) {}
00079 
00084   virtual void elem_side_reinit(Real /* theta */) {}
00085 
00090   virtual void elem_edge_reinit(Real /* theta */) {}
00091 
00096   virtual void nonlocal_reinit(Real /* theta */) {}
00097 
00101   unsigned int n_vars() const
00102   { return cast_int<unsigned int>(_dof_indices_var.size()); }
00103 
00107   const System& get_system() const
00108   { return _system; }
00109 
00113   const DenseVector<Number>& get_elem_solution() const
00114   { return _elem_solution; }
00115 
00119   DenseVector<Number>& get_elem_solution()
00120   { return _elem_solution; }
00121 
00126   const DenseSubVector<Number>& get_elem_solution( unsigned int var ) const
00127   {
00128     libmesh_assert_greater(_elem_subsolutions.size(), var);
00129     libmesh_assert(_elem_subsolutions[var]);
00130     return *(_elem_subsolutions[var]);
00131   }
00132 
00137   DenseSubVector<Number>& get_elem_solution( unsigned int var )
00138   {
00139     libmesh_assert_greater(_elem_subsolutions.size(), var);
00140     libmesh_assert(_elem_subsolutions[var]);
00141     return *(_elem_subsolutions[var]);
00142   }
00143 
00147   const DenseVector<Number>& get_elem_solution_rate() const
00148   { return _elem_solution_rate; }
00149 
00154   DenseVector<Number>& get_elem_solution_rate()
00155   { return _elem_solution_rate; }
00156 
00161   const DenseSubVector<Number>& get_elem_solution_rate( unsigned int var ) const
00162   {
00163     libmesh_assert_greater(_elem_subsolution_rates.size(), var);
00164     libmesh_assert(_elem_subsolution_rates[var]);
00165     return *(_elem_subsolution_rates[var]);
00166   }
00167 
00172   DenseSubVector<Number>& get_elem_solution_rate( unsigned int var )
00173   {
00174     libmesh_assert_greater(_elem_subsolution_rates.size(), var);
00175     libmesh_assert(_elem_subsolution_rates[var]);
00176     return *(_elem_subsolution_rates[var]);
00177   }
00178 
00179 
00183   const DenseVector<Number>& get_elem_fixed_solution() const
00184   { return _elem_fixed_solution; }
00185 
00189   DenseVector<Number>& get_elem_fixed_solution()
00190   { return _elem_fixed_solution; }
00191 
00196   const DenseSubVector<Number>& get_elem_fixed_solution( unsigned int var ) const
00197   {
00198     libmesh_assert_greater(_elem_fixed_subsolutions.size(), var);
00199     libmesh_assert(_elem_fixed_subsolutions[var]);
00200     return *(_elem_fixed_subsolutions[var]);
00201   }
00202 
00207   DenseSubVector<Number>& get_elem_fixed_solution( unsigned int var )
00208   {
00209     libmesh_assert_greater(_elem_fixed_subsolutions.size(), var);
00210     libmesh_assert(_elem_fixed_subsolutions[var]);
00211     return *(_elem_fixed_subsolutions[var]);
00212   }
00213 
00217   const DenseVector<Number>& get_elem_residual() const
00218   { return _elem_residual; }
00219 
00223   DenseVector<Number>& get_elem_residual()
00224   { return _elem_residual; }
00225 
00230   const DenseSubVector<Number>& get_elem_residual( unsigned int var ) const
00231   {
00232     libmesh_assert_greater(_elem_subresiduals.size(), var);
00233     libmesh_assert(_elem_subresiduals[var]);
00234     return *(_elem_subresiduals[var]);
00235   }
00236 
00241   DenseSubVector<Number>& get_elem_residual( unsigned int var )
00242   {
00243     libmesh_assert_greater(_elem_subresiduals.size(), var);
00244     libmesh_assert(_elem_subresiduals[var]);
00245     return *(_elem_subresiduals[var]);
00246   }
00247 
00251   const DenseMatrix<Number>& get_elem_jacobian() const
00252   { return _elem_jacobian; }
00253 
00257   DenseMatrix<Number>& get_elem_jacobian()
00258   { return _elem_jacobian; }
00259 
00264   const DenseSubMatrix<Number>& get_elem_jacobian( unsigned int var1, unsigned int var2 ) const
00265   {
00266     libmesh_assert_greater(_elem_subjacobians.size(), var1);
00267     libmesh_assert_greater(_elem_subjacobians[var1].size(), var2);
00268     libmesh_assert(_elem_subjacobians[var1][var2]);
00269     return *(_elem_subjacobians[var1][var2]);
00270   }
00271 
00276   DenseSubMatrix<Number>& get_elem_jacobian( unsigned int var1, unsigned int var2 )
00277   {
00278     libmesh_assert_greater(_elem_subjacobians.size(), var1);
00279     libmesh_assert_greater(_elem_subjacobians[var1].size(), var2);
00280     libmesh_assert(_elem_subjacobians[var1][var2]);
00281     return *(_elem_subjacobians[var1][var2]);
00282   }
00283 
00287   const std::vector<Number>& get_qois() const
00288   { return _elem_qoi; }
00289 
00293   std::vector<Number>& get_qois()
00294   { return _elem_qoi; }
00295 
00299   const std::vector<DenseVector<Number> > & get_qoi_derivatives() const
00300   { return _elem_qoi_derivative; }
00301 
00305   std::vector<DenseVector<Number> > & get_qoi_derivatives()
00306   { return _elem_qoi_derivative; }
00307 
00312   const DenseSubVector<Number>& get_qoi_derivatives( unsigned int qoi, unsigned int var ) const
00313   {
00314     libmesh_assert_greater(_elem_qoi_subderivatives.size(), qoi);
00315     libmesh_assert_greater(_elem_qoi_subderivatives[qoi].size(), var);
00316     libmesh_assert(_elem_qoi_subderivatives[qoi][var]);
00317     return *(_elem_qoi_subderivatives[qoi][var]);
00318   }
00319 
00324   DenseSubVector<Number>& get_qoi_derivatives( unsigned int qoi, unsigned int var )
00325   {
00326     libmesh_assert_greater(_elem_qoi_subderivatives.size(), qoi);
00327     libmesh_assert_greater(_elem_qoi_subderivatives[qoi].size(), var);
00328     libmesh_assert(_elem_qoi_subderivatives[qoi][var]);
00329     return *(_elem_qoi_subderivatives[qoi][var]);
00330   }
00331 
00335   const std::vector<dof_id_type>& get_dof_indices() const
00336   { return _dof_indices; }
00337 
00341   std::vector<dof_id_type>& get_dof_indices()
00342   { return _dof_indices; }
00343 
00348   const std::vector<dof_id_type>& get_dof_indices( unsigned int var ) const
00349   {
00350     libmesh_assert_greater(_dof_indices_var.size(), var);
00351     return _dof_indices_var[var];
00352   }
00353 
00358   std::vector<dof_id_type>& get_dof_indices( unsigned int var )
00359   {
00360     libmesh_assert_greater(_dof_indices_var.size(), var);
00361     return _dof_indices_var[var];
00362   }
00363 
00367   Real get_system_time() const
00368   { return system_time; }
00369 
00373   Real get_time() const
00374   { return time; }
00375 
00379   void set_time( Real time_in )
00380   { time = time_in; }
00381 
00388   Real get_elem_solution_derivative() const
00389   { return elem_solution_derivative; }
00390 
00397   Real get_elem_solution_rate_derivative() const
00398   { return elem_solution_rate_derivative; }
00399 
00406   Real get_fixed_solution_derivative() const
00407   { return fixed_solution_derivative; }
00408 
00413   bool is_adjoint() const
00414   { return _is_adjoint; }
00415 
00420   bool& is_adjoint()
00421   { return _is_adjoint; }
00422 
00428   Real time;
00429 
00437   const Real system_time;
00438 
00443   Real elem_solution_derivative;
00444 
00450   Real elem_solution_rate_derivative;
00451 
00457   Real fixed_solution_derivative;
00458 
00463   void set_deltat_pointer(Real* dt);
00464 
00469   Real get_deltat_value();
00470 
00475   void add_localized_vector (NumericVector<Number> & localized_vector, const System & sys);
00476 
00480   typedef std::map<const NumericVector<Number>*, std::pair<DenseVector<Number>, std::vector<DenseSubVector<Number>*> > >::iterator localized_vectors_iterator;
00481 
00486   DenseVector<Number> & get_localized_vector (const NumericVector<Number> & localized_vector);
00487 
00491   const DenseVector<Number> & get_localized_vector (const NumericVector<Number> & localized_vector) const;
00492 
00497   DenseSubVector<Number> & get_localized_subvector (const NumericVector<Number> & localized_vector, unsigned int var);
00498 
00502   const DenseSubVector<Number> & get_localized_subvector (const NumericVector<Number> & localized_vector, unsigned int var) const;
00503 
00504 protected:
00505 
00511   std::map<const NumericVector<Number>*, std::pair<DenseVector<Number>, std::vector<DenseSubVector<Number>*> > > _localized_vectors;
00512 
00517   DenseVector<Number> _elem_solution;
00518   std::vector<DenseSubVector<Number> *> _elem_subsolutions;
00519 
00524   DenseVector<Number> _elem_solution_rate;
00525   std::vector<DenseSubVector<Number> *> _elem_subsolution_rates;
00526 
00532   DenseVector<Number> _elem_fixed_solution;
00533   std::vector<DenseSubVector<Number> *> _elem_fixed_subsolutions;
00534 
00538   DenseVector<Number> _elem_residual;
00539 
00544   DenseMatrix<Number> _elem_jacobian;
00545 
00549   std::vector<Number> _elem_qoi;
00550 
00554   std::vector<DenseVector<Number> > _elem_qoi_derivative;
00555   std::vector<std::vector<DenseSubVector<Number> *> > _elem_qoi_subderivatives;
00556 
00560   std::vector<DenseSubVector<Number> *> _elem_subresiduals;
00561   std::vector<std::vector<DenseSubMatrix<Number> *> > _elem_subjacobians;
00562 
00566   std::vector<dof_id_type> _dof_indices;
00567   std::vector<std::vector<dof_id_type> > _dof_indices_var;
00568 
00569 private:
00570 
00582   Real* _deltat;
00583 
00587   const System& _system;
00588 
00592   bool _is_adjoint;
00593 
00594 };
00595 
00596 } // namespace libMesh
00597 
00598 
00599 #endif // LIBMESH_DIFF_CONTEXT_H