$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_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