system.h
Go to the documentation of this file.00001 // The libMesh Finite Element Library. 00002 // Copyright (C) 2002-2012 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_SYSTEM_H 00021 #define LIBMESH_SYSTEM_H 00022 00023 // Local Includes 00024 #include "libmesh/auto_ptr.h" 00025 #include "libmesh/elem_range.h" 00026 #include "libmesh/enum_norm_type.h" 00027 #include "libmesh/enum_xdr_mode.h" 00028 #include "libmesh/enum_subset_solve_mode.h" 00029 #include "libmesh/enum_parallel_type.h" 00030 #include "libmesh/fe_type.h" 00031 #include "libmesh/libmesh_common.h" 00032 #include "libmesh/tensor_value.h" // For point_hessian 00033 #include "libmesh/qoi_set.h" 00034 #include "libmesh/reference_counted_object.h" 00035 #include "libmesh/variable.h" 00036 #include "libmesh/fem_function_base.h" 00037 00038 // C++ includes 00039 #include <cstddef> 00040 #include <set> 00041 #include <vector> 00042 00043 namespace libMesh 00044 { 00045 00046 // Forward Declarations 00047 class System; 00048 class SystemNorm; 00049 class EquationSystems; 00050 class MeshBase; 00051 class Xdr; 00052 class DofMap; 00053 template <typename Output> class FunctionBase; 00054 class Parameters; 00055 class ParameterVector; 00056 class Point; 00057 class SensitivityData; 00058 template <typename T> class NumericVector; 00059 template <typename T> class VectorValue; 00060 typedef VectorValue<Number> NumberVectorValue; 00061 typedef NumberVectorValue Gradient; 00062 class SystemSubset; 00063 00076 // ------------------------------------------------------------ 00077 // System class definition 00078 class System : public ReferenceCountedObject<System> 00079 { 00080 public: 00081 00086 System (EquationSystems& es, 00087 const std::string& name, 00088 const unsigned int number); 00089 00096 class Initialization 00097 { 00098 public: 00102 virtual ~Initialization () {} 00103 00109 virtual void initialize () = 0; 00110 }; 00111 00112 00113 00120 class Assembly 00121 { 00122 public: 00126 virtual ~Assembly () {} 00127 00133 virtual void assemble () = 0; 00134 }; 00135 00136 00137 00144 class Constraint 00145 { 00146 public: 00150 virtual ~Constraint () {} 00151 00157 virtual void constrain () = 0; 00158 }; 00159 00160 00161 00168 class QOI 00169 { 00170 public: 00174 virtual ~QOI () {} 00175 00181 virtual void qoi (const QoISet& qoi_indices) = 0; 00182 }; 00183 00184 00185 00192 class QOIDerivative 00193 { 00194 public: 00198 virtual ~QOIDerivative () {} 00199 00205 virtual void qoi_derivative (const QoISet& qoi_indices) = 0; 00206 }; 00207 00208 00209 00213 virtual ~System (); 00214 00218 typedef System sys_type; 00219 00223 sys_type & system () { return *this; } 00224 00229 virtual void clear (); 00230 00235 void init (); 00236 00243 virtual void reinit (); 00244 00249 virtual void update (); 00250 00257 virtual void assemble (); 00258 00263 virtual void assemble_qoi 00264 (const QoISet &qoi_indices = QoISet()); 00265 00270 virtual void assemble_qoi_derivative 00271 (const QoISet &qoi_indices = QoISet()); 00272 00284 virtual void assemble_residual_derivatives (const ParameterVector& parameters); 00285 00291 virtual void restrict_solve_to (const SystemSubset* subset, 00292 const SubsetSolveMode subset_solve_mode=SUBSET_ZERO); 00293 00297 virtual void solve () {} 00298 00308 virtual std::pair<unsigned int, Real> 00309 sensitivity_solve (const ParameterVector& parameters); 00310 00321 virtual std::pair<unsigned int, Real> 00322 weighted_sensitivity_solve (const ParameterVector& parameters, 00323 const ParameterVector& weights); 00324 00335 virtual std::pair<unsigned int, Real> 00336 adjoint_solve (const QoISet& qoi_indices = QoISet()); 00337 00352 virtual std::pair<unsigned int, Real> 00353 weighted_sensitivity_adjoint_solve (const ParameterVector& parameters, 00354 const ParameterVector& weights, 00355 const QoISet& qoi_indices = QoISet()); 00359 bool is_adjoint_already_solved() const 00360 { return adjoint_already_solved;} 00361 00365 void set_adjoint_already_solved(bool setting) 00366 { adjoint_already_solved = setting;} 00367 00368 00386 virtual void qoi_parameter_sensitivity (const QoISet& qoi_indices, 00387 const ParameterVector& parameters, 00388 SensitivityData& sensitivities); 00389 00395 virtual void adjoint_qoi_parameter_sensitivity (const QoISet& qoi_indices, 00396 const ParameterVector& parameters, 00397 SensitivityData& sensitivities); 00398 00404 virtual void forward_qoi_parameter_sensitivity (const QoISet& qoi_indices, 00405 const ParameterVector& parameters, 00406 SensitivityData& sensitivities); 00407 00418 virtual void qoi_parameter_hessian(const QoISet& qoi_indices, 00419 const ParameterVector& parameters, 00420 SensitivityData& hessian); 00421 00434 virtual void qoi_parameter_hessian_vector_product(const QoISet& qoi_indices, 00435 const ParameterVector& parameters, 00436 const ParameterVector& vector, 00437 SensitivityData& product); 00438 00444 virtual bool compare (const System& other_system, 00445 const Real threshold, 00446 const bool verbose) const; 00447 00451 const std::string & name () const; 00452 00458 virtual std::string system_type () const { return "Basic"; } 00459 00469 void project_solution (FunctionBase<Number> *f, 00470 FunctionBase<Gradient> *g = NULL) const; 00471 00481 void project_solution (FEMFunctionBase<Number> *f, 00482 FEMFunctionBase<Gradient> *g = NULL) const; 00483 00491 void project_solution (Number fptr(const Point& p, 00492 const Parameters& parameters, 00493 const std::string& sys_name, 00494 const std::string& unknown_name), 00495 Gradient gptr(const Point& p, 00496 const Parameters& parameters, 00497 const std::string& sys_name, 00498 const std::string& unknown_name), 00499 const Parameters& parameters) const; 00500 00511 void project_vector (NumericVector<Number>& new_vector, 00512 FunctionBase<Number> *f, 00513 FunctionBase<Gradient> *g = NULL) const; 00514 00525 void project_vector (NumericVector<Number>& new_vector, 00526 FEMFunctionBase<Number> *f, 00527 FEMFunctionBase<Gradient> *g = NULL) const; 00528 00537 void project_vector (Number fptr(const Point& p, 00538 const Parameters& parameters, 00539 const std::string& sys_name, 00540 const std::string& unknown_name), 00541 Gradient gptr(const Point& p, 00542 const Parameters& parameters, 00543 const std::string& sys_name, 00544 const std::string& unknown_name), 00545 const Parameters& parameters, 00546 NumericVector<Number>& new_vector) const; 00547 00562 void boundary_project_solution (const std::set<boundary_id_type> &b, 00563 const std::vector<unsigned int> &variables, 00564 FunctionBase<Number> *f, 00565 FunctionBase<Gradient> *g = NULL); 00566 00579 void boundary_project_solution (const std::set<boundary_id_type> &b, 00580 const std::vector<unsigned int> &variables, 00581 Number fptr(const Point& p, 00582 const Parameters& parameters, 00583 const std::string& sys_name, 00584 const std::string& unknown_name), 00585 Gradient gptr(const Point& p, 00586 const Parameters& parameters, 00587 const std::string& sys_name, 00588 const std::string& unknown_name), 00589 const Parameters& parameters); 00590 00605 void boundary_project_vector (const std::set<boundary_id_type> &b, 00606 const std::vector<unsigned int> &variables, 00607 NumericVector<Number>& new_vector, 00608 FunctionBase<Number> *f, 00609 FunctionBase<Gradient> *g = NULL) const; 00610 00623 void boundary_project_vector (const std::set<boundary_id_type> &b, 00624 const std::vector<unsigned int> &variables, 00625 Number fptr(const Point& p, 00626 const Parameters& parameters, 00627 const std::string& sys_name, 00628 const std::string& unknown_name), 00629 Gradient gptr(const Point& p, 00630 const Parameters& parameters, 00631 const std::string& sys_name, 00632 const std::string& unknown_name), 00633 const Parameters& parameters, 00634 NumericVector<Number>& new_vector) const; 00635 00639 unsigned int number () const; 00640 00646 void update_global_solution (std::vector<Number>& global_soln) const; 00647 00653 void update_global_solution (std::vector<Number>& global_soln, 00654 const unsigned int dest_proc) const; 00655 00659 const MeshBase & get_mesh() const; 00660 00664 MeshBase & get_mesh(); 00665 00669 const DofMap & get_dof_map() const; 00670 00674 DofMap & get_dof_map(); 00675 00679 const EquationSystems & get_equation_systems() const { return _equation_systems; } 00680 00684 EquationSystems & get_equation_systems() { return _equation_systems; } 00685 00690 bool active () const; 00691 00695 void activate (); 00696 00700 void deactivate (); 00701 00710 void set_basic_system_only (); 00711 00715 typedef std::map<std::string, NumericVector<Number>* >::iterator vectors_iterator; 00716 typedef std::map<std::string, NumericVector<Number>* >::const_iterator const_vectors_iterator; 00717 00721 vectors_iterator vectors_begin (); 00722 00726 const_vectors_iterator vectors_begin () const; 00727 00731 vectors_iterator vectors_end (); 00732 00736 const_vectors_iterator vectors_end () const; 00737 00747 NumericVector<Number> & add_vector (const std::string& vec_name, 00748 const bool projections=true, 00749 const ParallelType type = PARALLEL); 00750 00754 void remove_vector(const std::string& vec_name); 00755 00761 bool& project_solution_on_reinit (void) 00762 { return _solution_projection; } 00763 00768 bool have_vector (const std::string& vec_name) const; 00769 00774 const NumericVector<Number> * request_vector (const std::string& vec_name) const; 00775 00780 NumericVector<Number> * request_vector (const std::string& vec_name); 00781 00787 const NumericVector<Number> * request_vector (const unsigned int vec_num) const; 00788 00794 NumericVector<Number> * request_vector (const unsigned int vec_num); 00795 00801 const NumericVector<Number> & get_vector (const std::string& vec_name) const; 00802 00808 NumericVector<Number> & get_vector (const std::string& vec_name); 00809 00815 const NumericVector<Number> & get_vector (const unsigned int vec_num) const; 00816 00822 NumericVector<Number> & get_vector (const unsigned int vec_num); 00823 00828 const std::string & vector_name (const unsigned int vec_num) const; 00829 00833 const std::string & vector_name (const NumericVector<Number> & vec_reference) const; 00834 00840 void set_vector_preservation (const std::string &vec_name, bool preserve); 00841 00847 bool vector_preservation (const std::string &vec_name) const; 00848 00854 NumericVector<Number> & add_adjoint_solution(unsigned int i=0); 00855 00860 NumericVector<Number> & get_adjoint_solution(unsigned int i=0); 00861 00866 const NumericVector<Number> & get_adjoint_solution(unsigned int i=0) const; 00867 00873 NumericVector<Number> & add_sensitivity_solution(unsigned int i=0); 00874 00879 NumericVector<Number> & get_sensitivity_solution(unsigned int i=0); 00880 00885 const NumericVector<Number> & get_sensitivity_solution(unsigned int i=0) const; 00886 00893 NumericVector<Number> & add_weighted_sensitivity_adjoint_solution(unsigned int i=0); 00894 00900 NumericVector<Number> & get_weighted_sensitivity_adjoint_solution(unsigned int i=0); 00901 00907 const NumericVector<Number> & get_weighted_sensitivity_adjoint_solution(unsigned int i=0) const; 00908 00914 NumericVector<Number> & add_weighted_sensitivity_solution(); 00915 00920 NumericVector<Number> & get_weighted_sensitivity_solution(); 00921 00926 const NumericVector<Number> & get_weighted_sensitivity_solution() const; 00927 00933 NumericVector<Number> & add_adjoint_rhs(unsigned int i=0); 00934 00941 NumericVector<Number> & get_adjoint_rhs(unsigned int i=0); 00942 00947 const NumericVector<Number> & get_adjoint_rhs(unsigned int i=0) const; 00948 00954 NumericVector<Number> & add_sensitivity_rhs(unsigned int i=0); 00955 00965 NumericVector<Number> & get_sensitivity_rhs(unsigned int i=0); 00966 00971 const NumericVector<Number> & get_sensitivity_rhs(unsigned int i=0) const; 00972 00978 unsigned int n_vectors () const; 00979 00986 virtual unsigned int n_matrices () const; 00987 00991 unsigned int n_vars() const; 00992 00996 unsigned int n_variable_groups() const; 00997 01003 unsigned int n_components() const; 01004 01008 dof_id_type n_dofs() const; 01009 01014 dof_id_type n_active_dofs() const; 01015 01020 dof_id_type n_constrained_dofs() const; 01021 01026 dof_id_type n_local_constrained_dofs() const; 01027 01032 dof_id_type n_local_dofs() const; 01033 01038 unsigned int add_variable (const std::string& var, 01039 const FEType& type, 01040 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01041 01047 unsigned int add_variable (const std::string& var, 01048 const Order order = FIRST, 01049 const FEFamily = LAGRANGE, 01050 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01051 01056 unsigned int add_variables (const std::vector<std::string> &vars, 01057 const FEType& type, 01058 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01059 01065 unsigned int add_variables (const std::vector<std::string> &vars, 01066 const Order order = FIRST, 01067 const FEFamily = LAGRANGE, 01068 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01069 01073 const Variable & variable (unsigned int var) const; 01074 01078 const VariableGroup & variable_group (unsigned int vg) const; 01079 01083 bool has_variable(const std::string& var) const; 01084 01088 const std::string & variable_name(const unsigned int i) const; 01089 01094 unsigned short int variable_number (const std::string& var) const; 01095 01100 void get_all_variable_numbers(std::vector<unsigned int>& all_variable_numbers) const; 01101 01112 unsigned int variable_scalar_number (const std::string& var, 01113 unsigned int component) const; 01114 01125 unsigned int variable_scalar_number (unsigned int var_num, 01126 unsigned int component) const; 01127 01128 01132 const FEType & variable_type (const unsigned int i) const; 01133 01137 const FEType & variable_type (const std::string& var) const; 01138 01143 bool identify_variable_groups () const; 01144 01148 void identify_variable_groups (const bool); 01149 01154 Real calculate_norm(const NumericVector<Number>& v, 01155 unsigned int var = 0, 01156 FEMNormType norm_type = L2) const; 01157 01162 Real calculate_norm(const NumericVector<Number>& v, 01163 const SystemNorm &norm) const; 01164 01168 void read_header (Xdr& io, 01169 const std::string &version, 01170 const bool read_header=true, 01171 const bool read_additional_data=true, 01172 const bool read_legacy_format=false); 01173 01177 void read_legacy_data (Xdr& io, 01178 const bool read_additional_data=true); 01179 01184 void read_serialized_data (Xdr& io, 01185 const bool read_additional_data=true); 01186 01192 dof_id_type read_serialized_vectors (Xdr &io, 01193 const std::vector<NumericVector<Number>*> &vectors) const; 01200 void read_parallel_data (Xdr &io, 01201 const bool read_additional_data); 01205 void write_header (Xdr& io, 01206 const std::string &version, 01207 const bool write_additional_data) const; 01208 01213 void write_serialized_data (Xdr& io, 01214 const bool write_additional_data = true) const; 01215 01221 dof_id_type write_serialized_vectors (Xdr &io, 01222 const std::vector<const NumericVector<Number>*> &vectors) const; 01223 01230 void write_parallel_data (Xdr &io, 01231 const bool write_additional_data) const; 01232 01237 std::string get_info () const; 01238 01242 void attach_init_function (void fptr(EquationSystems& es, 01243 const std::string& name)); 01244 01249 void attach_init_object (Initialization& init); 01250 01255 void attach_assemble_function (void fptr(EquationSystems& es, 01256 const std::string& name)); 01257 01262 void attach_assemble_object (Assembly& assemble); 01263 01267 void attach_constraint_function (void fptr(EquationSystems& es, 01268 const std::string& name)); 01269 01273 void attach_constraint_object (Constraint& constrain); 01274 01279 void attach_QOI_function (void fptr(EquationSystems& es, 01280 const std::string& name, 01281 const QoISet& qoi_indices)); 01282 01287 void attach_QOI_object (QOI& qoi); 01288 01294 void attach_QOI_derivative (void fptr(EquationSystems& es, 01295 const std::string& name, 01296 const QoISet& qoi_indices)); 01297 01303 void attach_QOI_derivative_object (QOIDerivative& qoi_derivative); 01304 01309 virtual void user_initialization (); 01310 01315 virtual void user_assembly (); 01316 01321 virtual void user_constrain (); 01322 01327 virtual void user_QOI (const QoISet& qoi_indices); 01328 01333 virtual void user_QOI_derivative (const QoISet& qoi_indices); 01334 01340 virtual void re_update (); 01341 01345 virtual void restrict_vectors (); 01346 01350 virtual void prolong_vectors (); 01351 01371 bool assemble_before_solve; 01372 01377 virtual void disable_cache (); 01378 01388 bool use_fixed_solution; 01389 01403 int extra_quadrature_order; 01404 01405 01406 //-------------------------------------------------- 01407 // The solution and solution access members 01408 01413 Number current_solution (const dof_id_type global_dof_number) const; 01414 01418 AutoPtr<NumericVector<Number> > solution; 01419 01430 AutoPtr<NumericVector<Number> > current_local_solution; 01431 01441 Real time; 01442 01449 std::vector<Number> qoi; 01450 01471 Number point_value(unsigned int var, const Point &p, 01472 const bool insist_on_success = true) const; 01473 01481 Number point_value(unsigned int var, const Point &p, const Elem &e) const; 01482 01487 Gradient point_gradient(unsigned int var, const Point &p, 01488 const bool insist_on_success = true) const; 01489 01494 Gradient point_gradient(unsigned int var, const Point &p, const Elem &e) const; 01495 01500 Tensor point_hessian(unsigned int var, const Point &p, 01501 const bool insist_on_success = true) const; 01502 01508 Tensor point_hessian(unsigned int var, const Point &p, const Elem &e) const; 01509 01514 void local_dof_indices (const unsigned int var, 01515 std::set<dof_id_type> & var_indices) const; 01516 01521 void zero_variable (NumericVector<Number>& v, unsigned int var_num) const; 01522 01523 protected: 01524 01530 virtual void init_data (); 01531 01536 void project_vector (NumericVector<Number>&) const; 01537 01543 void project_vector (const NumericVector<Number>&, 01544 NumericVector<Number>&) const; 01545 01546 private: 01553 System (const System&); 01554 01561 System& operator=(const System&); 01562 01567 Real discrete_var_norm (const NumericVector<Number>& v, 01568 unsigned int var, 01569 FEMNormType norm_type) const; 01570 01577 template <typename iterator_type> 01578 dof_id_type read_serialized_blocked_dof_objects (const dof_id_type n_objects, 01579 const iterator_type begin, 01580 const iterator_type end, 01581 Xdr &io, 01582 const std::vector<NumericVector<Number>*> &vecs, 01583 const unsigned int var_to_read=libMesh::invalid_uint) const; 01584 01591 unsigned int read_SCALAR_dofs (const unsigned int var, 01592 Xdr &io, 01593 NumericVector<Number> &vec) const; 01594 01601 numeric_index_type read_serialized_vector (Xdr& io, 01602 NumericVector<Number> &vec); 01603 01610 template <typename iterator_type> 01611 dof_id_type write_serialized_blocked_dof_objects (const std::vector<const NumericVector<Number>*> &vecs, 01612 const dof_id_type n_objects, 01613 const iterator_type begin, 01614 const iterator_type end, 01615 Xdr &io, 01616 const unsigned int var_to_write=libMesh::invalid_uint) const; 01617 01623 unsigned int write_SCALAR_dofs (const NumericVector<Number> &vec, 01624 const unsigned int var, 01625 Xdr &io) const; 01626 01633 dof_id_type write_serialized_vector (Xdr& io, 01634 const NumericVector<Number> &vec) const; 01635 01639 void (* _init_system_function) (EquationSystems& es, 01640 const std::string& name); 01641 01645 Initialization * _init_system_object; 01646 01650 void (* _assemble_system_function) (EquationSystems& es, 01651 const std::string& name); 01652 01656 Assembly * _assemble_system_object; 01657 01661 void (* _constrain_system_function) (EquationSystems& es, 01662 const std::string& name); 01663 01667 Constraint * _constrain_system_object; 01668 01672 void (* _qoi_evaluate_function) (EquationSystems& es, 01673 const std::string& name, 01674 const QoISet& qoi_indices); 01675 01679 QOI *_qoi_evaluate_object; 01680 01684 void (* _qoi_evaluate_derivative_function) (EquationSystems& es, 01685 const std::string& name, 01686 const QoISet& qoi_indices); 01687 01691 QOIDerivative *_qoi_evaluate_derivative_object; 01692 01697 AutoPtr<DofMap> _dof_map; 01698 01703 EquationSystems& _equation_systems; 01704 01709 MeshBase& _mesh; 01710 01714 const std::string _sys_name; 01715 01719 const unsigned int _sys_number; 01720 01724 std::vector<Variable> _variables; 01725 01729 std::vector<VariableGroup> _variable_groups; 01730 01735 std::map<std::string, unsigned short int> _variable_numbers; 01736 01740 bool _active; 01741 01748 std::map<std::string, NumericVector<Number>* > _vectors; 01749 01754 std::map<std::string, bool> _vector_projections; 01755 01759 std::map<std::string, ParallelType> _vector_types; 01760 01766 bool _solution_projection; 01767 01772 bool _basic_system_only; 01773 01778 bool _can_add_vectors; 01779 01784 bool _identify_variable_groups; 01785 01791 bool _additional_data_written; 01792 01803 std::vector<unsigned int> _written_var_indices; 01804 01810 bool adjoint_already_solved; 01811 }; 01812 01813 01814 01815 // ------------------------------------------------------------ 01816 // System inline methods 01817 inline 01818 const std::string & System::name() const 01819 { 01820 return _sys_name; 01821 } 01822 01823 01824 01825 inline 01826 unsigned int System::number() const 01827 { 01828 return _sys_number; 01829 } 01830 01831 01832 01833 inline 01834 const MeshBase & System::get_mesh() const 01835 { 01836 return _mesh; 01837 } 01838 01839 01840 01841 inline 01842 MeshBase & System::get_mesh() 01843 { 01844 return _mesh; 01845 } 01846 01847 01848 01849 inline 01850 const DofMap & System::get_dof_map() const 01851 { 01852 return *_dof_map; 01853 } 01854 01855 01856 01857 inline 01858 DofMap & System::get_dof_map() 01859 { 01860 return *_dof_map; 01861 } 01862 01863 01864 01865 inline 01866 bool System::active() const 01867 { 01868 return _active; 01869 } 01870 01871 01872 01873 inline 01874 void System::activate () 01875 { 01876 _active = true; 01877 } 01878 01879 01880 01881 inline 01882 void System::deactivate () 01883 { 01884 _active = false; 01885 } 01886 01887 01888 01889 inline 01890 void System::set_basic_system_only () 01891 { 01892 _basic_system_only = true; 01893 } 01894 01895 01896 01897 inline 01898 unsigned int System::n_vars() const 01899 { 01900 return libmesh_cast_int<unsigned int>(_variables.size()); 01901 } 01902 01903 01904 01905 inline 01906 unsigned int System::n_variable_groups() const 01907 { 01908 return libmesh_cast_int<unsigned int>(_variable_groups.size()); 01909 } 01910 01911 01912 01913 inline 01914 unsigned int System::n_components() const 01915 { 01916 if (_variables.empty()) 01917 return 0; 01918 01919 const Variable& last = _variables.back(); 01920 return last.first_scalar_number() + last.n_components(); 01921 } 01922 01923 01924 01925 inline 01926 const Variable & System::variable (const unsigned int i) const 01927 { 01928 libmesh_assert_less (i, _variables.size()); 01929 01930 return _variables[i]; 01931 } 01932 01933 01934 01935 inline 01936 const VariableGroup & System::variable_group (const unsigned int vg) const 01937 { 01938 libmesh_assert_less (vg, _variable_groups.size()); 01939 01940 return _variable_groups[vg]; 01941 } 01942 01943 01944 01945 inline 01946 const std::string & System::variable_name (const unsigned int i) const 01947 { 01948 libmesh_assert_less (i, _variables.size()); 01949 01950 return _variables[i].name(); 01951 } 01952 01953 01954 01955 inline 01956 unsigned int 01957 System::variable_scalar_number (const std::string& var, 01958 unsigned int component) const 01959 { 01960 return variable_scalar_number(this->variable_number(var), component); 01961 } 01962 01963 01964 01965 inline 01966 unsigned int 01967 System::variable_scalar_number (unsigned int var_num, 01968 unsigned int component) const 01969 { 01970 return _variables[var_num].first_scalar_number() + component; 01971 } 01972 01973 01974 01975 inline 01976 const FEType & System::variable_type (const unsigned int i) const 01977 { 01978 libmesh_assert_less (i, _variables.size()); 01979 01980 return _variables[i].type(); 01981 } 01982 01983 01984 01985 inline 01986 const FEType & System::variable_type (const std::string& var) const 01987 { 01988 return _variables[this->variable_number(var)].type(); 01989 } 01990 01991 01992 01993 inline 01994 bool System::identify_variable_groups () const 01995 { 01996 return _identify_variable_groups; 01997 } 01998 01999 02000 02001 inline 02002 void System::identify_variable_groups (const bool ivg) 02003 { 02004 _identify_variable_groups = ivg; 02005 } 02006 02007 02008 02009 inline 02010 dof_id_type System::n_active_dofs() const 02011 { 02012 return this->n_dofs() - this->n_constrained_dofs(); 02013 } 02014 02015 02016 02017 inline 02018 bool System::have_vector (const std::string& vec_name) const 02019 { 02020 return (_vectors.count(vec_name)); 02021 } 02022 02023 02024 02025 inline 02026 unsigned int System::n_vectors () const 02027 { 02028 return libmesh_cast_int<unsigned int>(_vectors.size()); 02029 } 02030 02031 inline 02032 unsigned int System::n_matrices () const 02033 { 02034 return 0; 02035 } 02036 02037 inline 02038 System::vectors_iterator System::vectors_begin () 02039 { 02040 return _vectors.begin(); 02041 } 02042 02043 inline 02044 System::const_vectors_iterator System::vectors_begin () const 02045 { 02046 return _vectors.begin(); 02047 } 02048 02049 inline 02050 System::vectors_iterator System::vectors_end () 02051 { 02052 return _vectors.end(); 02053 } 02054 02055 inline 02056 System::const_vectors_iterator System::vectors_end () const 02057 { 02058 return _vectors.end(); 02059 } 02060 02061 inline 02062 void System::assemble_residual_derivatives (const ParameterVector&) 02063 { 02064 libmesh_not_implemented(); 02065 } 02066 02067 inline 02068 void System::disable_cache () { assemble_before_solve = true; } 02069 02070 inline 02071 std::pair<unsigned int, Real> 02072 System::sensitivity_solve (const ParameterVector&) 02073 { 02074 libmesh_not_implemented(); 02075 } 02076 02077 inline 02078 std::pair<unsigned int, Real> 02079 System::weighted_sensitivity_solve (const ParameterVector&, 02080 const ParameterVector&) 02081 { 02082 libmesh_not_implemented(); 02083 } 02084 02085 inline 02086 std::pair<unsigned int, Real> 02087 System::adjoint_solve (const QoISet&) 02088 { 02089 libmesh_not_implemented(); 02090 } 02091 02092 inline 02093 std::pair<unsigned int, Real> 02094 System::weighted_sensitivity_adjoint_solve (const ParameterVector&, 02095 const ParameterVector&, 02096 const QoISet&) 02097 { 02098 libmesh_not_implemented(); 02099 } 02100 02101 inline 02102 void 02103 System::adjoint_qoi_parameter_sensitivity (const QoISet&, 02104 const ParameterVector&, 02105 SensitivityData&) 02106 { 02107 libmesh_not_implemented(); 02108 } 02109 02110 inline 02111 void 02112 System::forward_qoi_parameter_sensitivity (const QoISet&, 02113 const ParameterVector&, 02114 SensitivityData&) 02115 { 02116 libmesh_not_implemented(); 02117 } 02118 02119 inline 02120 void 02121 System::qoi_parameter_hessian(const QoISet&, 02122 const ParameterVector&, 02123 SensitivityData&) 02124 { 02125 libmesh_not_implemented(); 02126 } 02127 02128 inline 02129 void 02130 System::qoi_parameter_hessian_vector_product(const QoISet&, 02131 const ParameterVector&, 02132 const ParameterVector&, 02133 SensitivityData&) 02134 { 02135 libmesh_not_implemented(); 02136 } 02137 02138 02139 } // namespace libMesh 02140 02141 #endif // LIBMESH_SYSTEM_H
Site Created By: libMesh Developers
Last modified: February 05 2013 19:54:48 UTC
Hosted By: