$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_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/fem_function_base.h" 00032 #include "libmesh/libmesh_common.h" 00033 #include "libmesh/parallel_object.h" 00034 #include "libmesh/qoi_set.h" 00035 #include "libmesh/reference_counted_object.h" 00036 #include "libmesh/system_norm.h" // for implicit conversion 00037 #include "libmesh/tensor_value.h" // For point_hessian 00038 #include "libmesh/variable.h" 00039 00040 // C++ includes 00041 #include <cstddef> 00042 #include <set> 00043 #include <vector> 00044 00045 namespace libMesh 00046 { 00047 00048 // Forward Declarations 00049 class System; 00050 class EquationSystems; 00051 class MeshBase; 00052 class Xdr; 00053 class DofMap; 00054 template <typename Output> class FunctionBase; 00055 class Parameters; 00056 class ParameterVector; 00057 class Point; 00058 class SensitivityData; 00059 template <typename T> class NumericVector; 00060 template <typename T> class VectorValue; 00061 typedef VectorValue<Number> NumberVectorValue; 00062 typedef NumberVectorValue Gradient; 00063 class SystemSubset; 00064 00077 // ------------------------------------------------------------ 00078 // System class definition 00079 class System : public ReferenceCountedObject<System>, 00080 public ParallelObject 00081 { 00082 public: 00083 00088 System (EquationSystems& es, 00089 const std::string& name, 00090 const unsigned int number); 00091 00098 class Initialization 00099 { 00100 public: 00104 virtual ~Initialization () {} 00105 00111 virtual void initialize () = 0; 00112 }; 00113 00114 00115 00122 class Assembly 00123 { 00124 public: 00128 virtual ~Assembly () {} 00129 00135 virtual void assemble () = 0; 00136 }; 00137 00138 00139 00146 class Constraint 00147 { 00148 public: 00152 virtual ~Constraint () {} 00153 00159 virtual void constrain () = 0; 00160 }; 00161 00162 00163 00170 class QOI 00171 { 00172 public: 00176 virtual ~QOI () {} 00177 00183 virtual void qoi (const QoISet& qoi_indices) = 0; 00184 }; 00185 00186 00187 00194 class QOIDerivative 00195 { 00196 public: 00200 virtual ~QOIDerivative () {} 00201 00207 virtual void qoi_derivative (const QoISet& qoi_indices, 00208 bool include_liftfunc, 00209 bool apply_constraints) = 0; 00210 }; 00211 00212 00213 00217 virtual ~System (); 00218 00222 typedef System sys_type; 00223 00227 sys_type & system () { return *this; } 00228 00233 virtual void clear (); 00234 00239 void init (); 00240 00247 virtual void reinit (); 00248 00252 virtual void reinit_constraints (); 00253 00257 bool is_initialized(); 00258 00263 virtual void update (); 00264 00271 virtual void assemble (); 00272 00277 virtual void assemble_qoi 00278 (const QoISet &qoi_indices = QoISet()); 00279 00284 virtual void assemble_qoi_derivative 00285 (const QoISet &qoi_indices = QoISet(), 00286 bool include_liftfunc = true, 00287 bool apply_constraints = true); 00288 00300 virtual void assemble_residual_derivatives (const ParameterVector& parameters); 00301 00307 virtual void restrict_solve_to (const SystemSubset* subset, 00308 const SubsetSolveMode subset_solve_mode=SUBSET_ZERO); 00309 00313 virtual void solve () {} 00314 00324 virtual std::pair<unsigned int, Real> 00325 sensitivity_solve (const ParameterVector& parameters); 00326 00337 virtual std::pair<unsigned int, Real> 00338 weighted_sensitivity_solve (const ParameterVector& parameters, 00339 const ParameterVector& weights); 00340 00351 virtual std::pair<unsigned int, Real> 00352 adjoint_solve (const QoISet& qoi_indices = QoISet()); 00353 00368 virtual std::pair<unsigned int, Real> 00369 weighted_sensitivity_adjoint_solve (const ParameterVector& parameters, 00370 const ParameterVector& weights, 00371 const QoISet& qoi_indices = QoISet()); 00375 bool is_adjoint_already_solved() const 00376 { return adjoint_already_solved;} 00377 00381 void set_adjoint_already_solved(bool setting) 00382 { adjoint_already_solved = setting;} 00383 00384 00402 virtual void qoi_parameter_sensitivity (const QoISet& qoi_indices, 00403 const ParameterVector& parameters, 00404 SensitivityData& sensitivities); 00405 00411 virtual void adjoint_qoi_parameter_sensitivity (const QoISet& qoi_indices, 00412 const ParameterVector& parameters, 00413 SensitivityData& sensitivities); 00414 00420 virtual void forward_qoi_parameter_sensitivity (const QoISet& qoi_indices, 00421 const ParameterVector& parameters, 00422 SensitivityData& sensitivities); 00423 00434 virtual void qoi_parameter_hessian(const QoISet& qoi_indices, 00435 const ParameterVector& parameters, 00436 SensitivityData& hessian); 00437 00450 virtual void qoi_parameter_hessian_vector_product(const QoISet& qoi_indices, 00451 const ParameterVector& parameters, 00452 const ParameterVector& vector, 00453 SensitivityData& product); 00454 00460 virtual bool compare (const System& other_system, 00461 const Real threshold, 00462 const bool verbose) const; 00463 00467 const std::string & name () const; 00468 00474 virtual std::string system_type () const { return "Basic"; } 00475 00485 void project_solution (FunctionBase<Number> *f, 00486 FunctionBase<Gradient> *g = NULL) const; 00487 00497 void project_solution (FEMFunctionBase<Number> *f, 00498 FEMFunctionBase<Gradient> *g = NULL) const; 00499 00507 void project_solution (Number fptr(const Point& p, 00508 const Parameters& parameters, 00509 const std::string& sys_name, 00510 const std::string& unknown_name), 00511 Gradient gptr(const Point& p, 00512 const Parameters& parameters, 00513 const std::string& sys_name, 00514 const std::string& unknown_name), 00515 const Parameters& parameters) const; 00516 00530 void project_vector (NumericVector<Number>& new_vector, 00531 FunctionBase<Number> *f, 00532 FunctionBase<Gradient> *g = NULL, 00533 int is_adjoint = -1) const; 00534 00548 void project_vector (NumericVector<Number>& new_vector, 00549 FEMFunctionBase<Number> *f, 00550 FEMFunctionBase<Gradient> *g = NULL, 00551 int is_adjoint = -1) const; 00552 00564 void project_vector (Number fptr(const Point& p, 00565 const Parameters& parameters, 00566 const std::string& sys_name, 00567 const std::string& unknown_name), 00568 Gradient gptr(const Point& p, 00569 const Parameters& parameters, 00570 const std::string& sys_name, 00571 const std::string& unknown_name), 00572 const Parameters& parameters, 00573 NumericVector<Number>& new_vector, 00574 int is_adjoint = -1) const; 00575 00590 void boundary_project_solution (const std::set<boundary_id_type> &b, 00591 const std::vector<unsigned int> &variables, 00592 FunctionBase<Number> *f, 00593 FunctionBase<Gradient> *g = NULL); 00594 00607 void boundary_project_solution (const std::set<boundary_id_type> &b, 00608 const std::vector<unsigned int> &variables, 00609 Number fptr(const Point& p, 00610 const Parameters& parameters, 00611 const std::string& sys_name, 00612 const std::string& unknown_name), 00613 Gradient gptr(const Point& p, 00614 const Parameters& parameters, 00615 const std::string& sys_name, 00616 const std::string& unknown_name), 00617 const Parameters& parameters); 00618 00636 void boundary_project_vector (const std::set<boundary_id_type> &b, 00637 const std::vector<unsigned int> &variables, 00638 NumericVector<Number>& new_vector, 00639 FunctionBase<Number> *f, 00640 FunctionBase<Gradient> *g = NULL, 00641 int is_adjoint = -1) const; 00642 00658 void boundary_project_vector (const std::set<boundary_id_type> &b, 00659 const std::vector<unsigned int> &variables, 00660 Number fptr(const Point& p, 00661 const Parameters& parameters, 00662 const std::string& sys_name, 00663 const std::string& unknown_name), 00664 Gradient gptr(const Point& p, 00665 const Parameters& parameters, 00666 const std::string& sys_name, 00667 const std::string& unknown_name), 00668 const Parameters& parameters, 00669 NumericVector<Number>& new_vector, 00670 int is_adjoint = -1) const; 00671 00675 unsigned int number () const; 00676 00682 void update_global_solution (std::vector<Number>& global_soln) const; 00683 00689 void update_global_solution (std::vector<Number>& global_soln, 00690 const processor_id_type dest_proc) const; 00691 00695 const MeshBase & get_mesh() const; 00696 00700 MeshBase & get_mesh(); 00701 00705 const DofMap & get_dof_map() const; 00706 00710 DofMap & get_dof_map(); 00711 00715 const EquationSystems & get_equation_systems() const { return _equation_systems; } 00716 00720 EquationSystems & get_equation_systems() { return _equation_systems; } 00721 00726 bool active () const; 00727 00731 void activate (); 00732 00736 void deactivate (); 00737 00746 void set_basic_system_only (); 00747 00751 typedef std::map<std::string, NumericVector<Number>* >::iterator vectors_iterator; 00752 typedef std::map<std::string, NumericVector<Number>* >::const_iterator const_vectors_iterator; 00753 00757 vectors_iterator vectors_begin (); 00758 00762 const_vectors_iterator vectors_begin () const; 00763 00767 vectors_iterator vectors_end (); 00768 00772 const_vectors_iterator vectors_end () const; 00773 00783 NumericVector<Number> & add_vector (const std::string& vec_name, 00784 const bool projections=true, 00785 const ParallelType type = PARALLEL); 00786 00790 void remove_vector(const std::string& vec_name); 00791 00797 bool& project_solution_on_reinit (void) 00798 { return _solution_projection; } 00799 00804 bool have_vector (const std::string& vec_name) const; 00805 00810 const NumericVector<Number> * request_vector (const std::string& vec_name) const; 00811 00816 NumericVector<Number> * request_vector (const std::string& vec_name); 00817 00823 const NumericVector<Number> * request_vector (const unsigned int vec_num) const; 00824 00830 NumericVector<Number> * request_vector (const unsigned int vec_num); 00831 00837 const NumericVector<Number> & get_vector (const std::string& vec_name) const; 00838 00844 NumericVector<Number> & get_vector (const std::string& vec_name); 00845 00851 const NumericVector<Number> & get_vector (const unsigned int vec_num) const; 00852 00858 NumericVector<Number> & get_vector (const unsigned int vec_num); 00859 00864 const std::string & vector_name (const unsigned int vec_num) const; 00865 00869 const std::string & vector_name (const NumericVector<Number> & vec_reference) const; 00870 00881 void set_vector_as_adjoint (const std::string &vec_name, int qoi_num); 00882 00888 int vector_is_adjoint (const std::string &vec_name) const; 00889 00895 void set_vector_preservation (const std::string &vec_name, bool preserve); 00896 00902 bool vector_preservation (const std::string &vec_name) const; 00903 00909 NumericVector<Number> & add_adjoint_solution(unsigned int i=0); 00910 00915 NumericVector<Number> & get_adjoint_solution(unsigned int i=0); 00916 00921 const NumericVector<Number> & get_adjoint_solution(unsigned int i=0) const; 00922 00928 NumericVector<Number> & add_sensitivity_solution(unsigned int i=0); 00929 00934 NumericVector<Number> & get_sensitivity_solution(unsigned int i=0); 00935 00940 const NumericVector<Number> & get_sensitivity_solution(unsigned int i=0) const; 00941 00948 NumericVector<Number> & add_weighted_sensitivity_adjoint_solution(unsigned int i=0); 00949 00955 NumericVector<Number> & get_weighted_sensitivity_adjoint_solution(unsigned int i=0); 00956 00962 const NumericVector<Number> & get_weighted_sensitivity_adjoint_solution(unsigned int i=0) const; 00963 00969 NumericVector<Number> & add_weighted_sensitivity_solution(); 00970 00975 NumericVector<Number> & get_weighted_sensitivity_solution(); 00976 00981 const NumericVector<Number> & get_weighted_sensitivity_solution() const; 00982 00988 NumericVector<Number> & add_adjoint_rhs(unsigned int i=0); 00989 00996 NumericVector<Number> & get_adjoint_rhs(unsigned int i=0); 00997 01002 const NumericVector<Number> & get_adjoint_rhs(unsigned int i=0) const; 01003 01009 NumericVector<Number> & add_sensitivity_rhs(unsigned int i=0); 01010 01020 NumericVector<Number> & get_sensitivity_rhs(unsigned int i=0); 01021 01026 const NumericVector<Number> & get_sensitivity_rhs(unsigned int i=0) const; 01027 01033 unsigned int n_vectors () const; 01034 01041 virtual unsigned int n_matrices () const; 01042 01046 unsigned int n_vars() const; 01047 01051 unsigned int n_variable_groups() const; 01052 01058 unsigned int n_components() const; 01059 01063 dof_id_type n_dofs() const; 01064 01069 dof_id_type n_active_dofs() const; 01070 01075 dof_id_type n_constrained_dofs() const; 01076 01081 dof_id_type n_local_constrained_dofs() const; 01082 01087 dof_id_type n_local_dofs() const; 01088 01093 unsigned int add_variable (const std::string& var, 01094 const FEType& type, 01095 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01096 01102 unsigned int add_variable (const std::string& var, 01103 const Order order = FIRST, 01104 const FEFamily = LAGRANGE, 01105 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01106 01111 unsigned int add_variables (const std::vector<std::string> &vars, 01112 const FEType& type, 01113 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01114 01120 unsigned int add_variables (const std::vector<std::string> &vars, 01121 const Order order = FIRST, 01122 const FEFamily = LAGRANGE, 01123 const std::set<subdomain_id_type> * const active_subdomains = NULL); 01124 01128 const Variable & variable (unsigned int var) const; 01129 01133 const VariableGroup & variable_group (unsigned int vg) const; 01134 01138 bool has_variable(const std::string& var) const; 01139 01143 const std::string & variable_name(const unsigned int i) const; 01144 01149 unsigned short int variable_number (const std::string& var) const; 01150 01155 void get_all_variable_numbers(std::vector<unsigned int>& all_variable_numbers) const; 01156 01167 unsigned int variable_scalar_number (const std::string& var, 01168 unsigned int component) const; 01169 01180 unsigned int variable_scalar_number (unsigned int var_num, 01181 unsigned int component) const; 01182 01183 01187 const FEType & variable_type (const unsigned int i) const; 01188 01192 const FEType & variable_type (const std::string& var) const; 01193 01198 bool identify_variable_groups () const; 01199 01203 void identify_variable_groups (const bool); 01204 01209 Real calculate_norm(const NumericVector<Number>& v, 01210 unsigned int var, 01211 FEMNormType norm_type) const; 01212 01217 Real calculate_norm(const NumericVector<Number>& v, 01218 const SystemNorm &norm) const; 01219 01223 void read_header (Xdr& io, 01224 const std::string &version, 01225 const bool read_header=true, 01226 const bool read_additional_data=true, 01227 const bool read_legacy_format=false); 01228 01232 void read_legacy_data (Xdr& io, 01233 const bool read_additional_data=true); 01234 01239 template <typename ValType> 01240 void read_serialized_data (Xdr& io, 01241 const bool read_additional_data=true); 01248 void read_serialized_data (Xdr& io, 01249 const bool read_additional_data=true) 01250 { read_serialized_data<Number>(io, read_additional_data); } 01251 01257 template <typename InValType> 01258 std::size_t read_serialized_vectors (Xdr &io, 01259 const std::vector<NumericVector<Number>*> &vectors) const; 01260 01268 std::size_t read_serialized_vectors (Xdr &io, 01269 const std::vector<NumericVector<Number>*> &vectors) const 01270 { return read_serialized_vectors<Number>(io, vectors); } 01271 01278 template <typename InValType> 01279 void read_parallel_data (Xdr &io, 01280 const bool read_additional_data); 01281 01290 void read_parallel_data (Xdr &io, 01291 const bool read_additional_data) 01292 { read_parallel_data<Number>(io, read_additional_data); } 01293 01297 void write_header (Xdr& io, 01298 const std::string &version, 01299 const bool write_additional_data) const; 01300 01305 void write_serialized_data (Xdr& io, 01306 const bool write_additional_data = true) const; 01307 01313 std::size_t write_serialized_vectors (Xdr &io, 01314 const std::vector<const NumericVector<Number>*> &vectors) const; 01315 01322 void write_parallel_data (Xdr &io, 01323 const bool write_additional_data) const; 01324 01329 std::string get_info () const; 01330 01334 void attach_init_function (void fptr(EquationSystems& es, 01335 const std::string& name)); 01336 01341 void attach_init_object (Initialization& init); 01342 01347 void attach_assemble_function (void fptr(EquationSystems& es, 01348 const std::string& name)); 01349 01354 void attach_assemble_object (Assembly& assemble); 01355 01359 void attach_constraint_function (void fptr(EquationSystems& es, 01360 const std::string& name)); 01361 01365 void attach_constraint_object (Constraint& constrain); 01366 01371 void attach_QOI_function (void fptr(EquationSystems& es, 01372 const std::string& name, 01373 const QoISet& qoi_indices)); 01374 01379 void attach_QOI_object (QOI& qoi); 01380 01386 void attach_QOI_derivative (void fptr(EquationSystems& es, 01387 const std::string& name, 01388 const QoISet& qoi_indices, 01389 bool include_liftfunc, 01390 bool apply_constraints)); 01391 01397 void attach_QOI_derivative_object (QOIDerivative& qoi_derivative); 01398 01403 virtual void user_initialization (); 01404 01409 virtual void user_assembly (); 01410 01415 virtual void user_constrain (); 01416 01421 virtual void user_QOI (const QoISet& qoi_indices); 01422 01427 virtual void user_QOI_derivative 01428 (const QoISet &qoi_indices = QoISet(), 01429 bool include_liftfunc = true, 01430 bool apply_constraints = true); 01431 01437 virtual void re_update (); 01438 01442 virtual void restrict_vectors (); 01443 01447 virtual void prolong_vectors (); 01448 01468 bool assemble_before_solve; 01469 01474 virtual void disable_cache (); 01475 01485 bool use_fixed_solution; 01486 01500 int extra_quadrature_order; 01501 01502 01503 //-------------------------------------------------- 01504 // The solution and solution access members 01505 01510 Number current_solution (const dof_id_type global_dof_number) const; 01511 01515 UniquePtr<NumericVector<Number> > solution; 01516 01527 UniquePtr<NumericVector<Number> > current_local_solution; 01528 01538 Real time; 01539 01546 std::vector<Number> qoi; 01547 01568 Number point_value(unsigned int var, const Point &p, 01569 const bool insist_on_success = true) const; 01570 01578 Number point_value(unsigned int var, const Point &p, const Elem &e) const; 01579 01584 Gradient point_gradient(unsigned int var, const Point &p, 01585 const bool insist_on_success = true) const; 01586 01591 Gradient point_gradient(unsigned int var, const Point &p, const Elem &e) const; 01592 01597 Tensor point_hessian(unsigned int var, const Point &p, 01598 const bool insist_on_success = true) const; 01599 01605 Tensor point_hessian(unsigned int var, const Point &p, const Elem &e) const; 01606 01611 void local_dof_indices (const unsigned int var, 01612 std::set<dof_id_type> & var_indices) const; 01613 01618 void zero_variable (NumericVector<Number>& v, unsigned int var_num) const; 01619 01620 protected: 01621 01627 virtual void init_data (); 01628 01636 void project_vector (NumericVector<Number>&, 01637 int is_adjoint = -1) const; 01638 01647 void project_vector (const NumericVector<Number>&, 01648 NumericVector<Number>&, 01649 int is_adjoint = -1) const; 01650 01651 private: 01658 System (const System&); 01659 01666 System& operator=(const System&); 01667 01672 Real discrete_var_norm (const NumericVector<Number>& v, 01673 unsigned int var, 01674 FEMNormType norm_type) const; 01675 01682 template <typename iterator_type, typename InValType> 01683 std::size_t read_serialized_blocked_dof_objects (const dof_id_type n_objects, 01684 const iterator_type begin, 01685 const iterator_type end, 01686 const InValType dummy, 01687 Xdr &io, 01688 const std::vector<NumericVector<Number>*> &vecs, 01689 const unsigned int var_to_read=libMesh::invalid_uint) const; 01690 01697 unsigned int read_SCALAR_dofs (const unsigned int var, 01698 Xdr &io, 01699 NumericVector<Number> &vec) const; 01700 01707 template <typename InValType> 01708 numeric_index_type read_serialized_vector (Xdr& io, 01709 NumericVector<Number> &vec); 01710 01719 numeric_index_type read_serialized_vector (Xdr& io, 01720 NumericVector<Number> &vec) 01721 { return read_serialized_vector<Number>(io, vec); } 01722 01729 template <typename iterator_type> 01730 std::size_t write_serialized_blocked_dof_objects (const std::vector<const NumericVector<Number>*> &vecs, 01731 const dof_id_type n_objects, 01732 const iterator_type begin, 01733 const iterator_type end, 01734 Xdr &io, 01735 const unsigned int var_to_write=libMesh::invalid_uint) const; 01736 01742 unsigned int write_SCALAR_dofs (const NumericVector<Number> &vec, 01743 const unsigned int var, 01744 Xdr &io) const; 01745 01752 dof_id_type write_serialized_vector (Xdr& io, 01753 const NumericVector<Number> &vec) const; 01754 01758 void (* _init_system_function) (EquationSystems& es, 01759 const std::string& name); 01760 01764 Initialization * _init_system_object; 01765 01769 void (* _assemble_system_function) (EquationSystems& es, 01770 const std::string& name); 01771 01775 Assembly * _assemble_system_object; 01776 01780 void (* _constrain_system_function) (EquationSystems& es, 01781 const std::string& name); 01782 01786 Constraint * _constrain_system_object; 01787 01791 void (* _qoi_evaluate_function) (EquationSystems& es, 01792 const std::string& name, 01793 const QoISet& qoi_indices); 01794 01798 QOI *_qoi_evaluate_object; 01799 01803 void (* _qoi_evaluate_derivative_function) (EquationSystems& es, 01804 const std::string& name, 01805 const QoISet& qoi_indices, 01806 bool include_liftfunc, 01807 bool apply_constraints); 01808 01812 QOIDerivative *_qoi_evaluate_derivative_object; 01813 01818 UniquePtr<DofMap> _dof_map; 01819 01824 EquationSystems& _equation_systems; 01825 01830 MeshBase& _mesh; 01831 01835 const std::string _sys_name; 01836 01840 const unsigned int _sys_number; 01841 01845 std::vector<Variable> _variables; 01846 01850 std::vector<VariableGroup> _variable_groups; 01851 01856 std::map<std::string, unsigned short int> _variable_numbers; 01857 01861 bool _active; 01862 01869 std::map<std::string, NumericVector<Number>* > _vectors; 01870 01875 std::map<std::string, bool> _vector_projections; 01876 01881 std::map<std::string, int> _vector_is_adjoint; 01882 01886 std::map<std::string, ParallelType> _vector_types; 01887 01893 bool _solution_projection; 01894 01899 bool _basic_system_only; 01900 01905 bool _is_initialized; 01906 01911 bool _identify_variable_groups; 01912 01918 bool _additional_data_written; 01919 01930 std::vector<unsigned int> _written_var_indices; 01931 01937 bool adjoint_already_solved; 01938 }; 01939 01940 01941 01942 // ------------------------------------------------------------ 01943 // System inline methods 01944 inline 01945 const std::string & System::name() const 01946 { 01947 return _sys_name; 01948 } 01949 01950 01951 01952 inline 01953 unsigned int System::number() const 01954 { 01955 return _sys_number; 01956 } 01957 01958 01959 01960 inline 01961 const MeshBase & System::get_mesh() const 01962 { 01963 return _mesh; 01964 } 01965 01966 01967 01968 inline 01969 MeshBase & System::get_mesh() 01970 { 01971 return _mesh; 01972 } 01973 01974 01975 01976 inline 01977 const DofMap & System::get_dof_map() const 01978 { 01979 return *_dof_map; 01980 } 01981 01982 01983 01984 inline 01985 DofMap & System::get_dof_map() 01986 { 01987 return *_dof_map; 01988 } 01989 01990 01991 01992 inline 01993 bool System::active() const 01994 { 01995 return _active; 01996 } 01997 01998 01999 02000 inline 02001 void System::activate () 02002 { 02003 _active = true; 02004 } 02005 02006 02007 02008 inline 02009 void System::deactivate () 02010 { 02011 _active = false; 02012 } 02013 02014 02015 02016 inline 02017 bool System::is_initialized () 02018 { 02019 return _is_initialized; 02020 } 02021 02022 02023 02024 inline 02025 void System::set_basic_system_only () 02026 { 02027 _basic_system_only = true; 02028 } 02029 02030 02031 02032 inline 02033 unsigned int System::n_vars() const 02034 { 02035 return cast_int<unsigned int>(_variables.size()); 02036 } 02037 02038 02039 02040 inline 02041 unsigned int System::n_variable_groups() const 02042 { 02043 return cast_int<unsigned int>(_variable_groups.size()); 02044 } 02045 02046 02047 02048 inline 02049 unsigned int System::n_components() const 02050 { 02051 if (_variables.empty()) 02052 return 0; 02053 02054 const Variable& last = _variables.back(); 02055 return last.first_scalar_number() + last.n_components(); 02056 } 02057 02058 02059 02060 inline 02061 const Variable & System::variable (const unsigned int i) const 02062 { 02063 libmesh_assert_less (i, _variables.size()); 02064 02065 return _variables[i]; 02066 } 02067 02068 02069 02070 inline 02071 const VariableGroup & System::variable_group (const unsigned int vg) const 02072 { 02073 libmesh_assert_less (vg, _variable_groups.size()); 02074 02075 return _variable_groups[vg]; 02076 } 02077 02078 02079 02080 inline 02081 const std::string & System::variable_name (const unsigned int i) const 02082 { 02083 libmesh_assert_less (i, _variables.size()); 02084 02085 return _variables[i].name(); 02086 } 02087 02088 02089 02090 inline 02091 unsigned int 02092 System::variable_scalar_number (const std::string& var, 02093 unsigned int component) const 02094 { 02095 return variable_scalar_number(this->variable_number(var), component); 02096 } 02097 02098 02099 02100 inline 02101 unsigned int 02102 System::variable_scalar_number (unsigned int var_num, 02103 unsigned int component) const 02104 { 02105 return _variables[var_num].first_scalar_number() + component; 02106 } 02107 02108 02109 02110 inline 02111 const FEType & System::variable_type (const unsigned int i) const 02112 { 02113 libmesh_assert_less (i, _variables.size()); 02114 02115 return _variables[i].type(); 02116 } 02117 02118 02119 02120 inline 02121 const FEType & System::variable_type (const std::string& var) const 02122 { 02123 return _variables[this->variable_number(var)].type(); 02124 } 02125 02126 02127 02128 inline 02129 bool System::identify_variable_groups () const 02130 { 02131 return _identify_variable_groups; 02132 } 02133 02134 02135 02136 inline 02137 void System::identify_variable_groups (const bool ivg) 02138 { 02139 _identify_variable_groups = ivg; 02140 } 02141 02142 02143 02144 inline 02145 dof_id_type System::n_active_dofs() const 02146 { 02147 return this->n_dofs() - this->n_constrained_dofs(); 02148 } 02149 02150 02151 02152 inline 02153 bool System::have_vector (const std::string& vec_name) const 02154 { 02155 return (_vectors.count(vec_name)); 02156 } 02157 02158 02159 02160 inline 02161 unsigned int System::n_vectors () const 02162 { 02163 return cast_int<unsigned int>(_vectors.size()); 02164 } 02165 02166 inline 02167 unsigned int System::n_matrices () const 02168 { 02169 return 0; 02170 } 02171 02172 inline 02173 System::vectors_iterator System::vectors_begin () 02174 { 02175 return _vectors.begin(); 02176 } 02177 02178 inline 02179 System::const_vectors_iterator System::vectors_begin () const 02180 { 02181 return _vectors.begin(); 02182 } 02183 02184 inline 02185 System::vectors_iterator System::vectors_end () 02186 { 02187 return _vectors.end(); 02188 } 02189 02190 inline 02191 System::const_vectors_iterator System::vectors_end () const 02192 { 02193 return _vectors.end(); 02194 } 02195 02196 inline 02197 void System::assemble_residual_derivatives (const ParameterVector&) 02198 { 02199 libmesh_not_implemented(); 02200 } 02201 02202 inline 02203 void System::disable_cache () { assemble_before_solve = true; } 02204 02205 inline 02206 std::pair<unsigned int, Real> 02207 System::sensitivity_solve (const ParameterVector&) 02208 { 02209 libmesh_not_implemented(); 02210 } 02211 02212 inline 02213 std::pair<unsigned int, Real> 02214 System::weighted_sensitivity_solve (const ParameterVector&, 02215 const ParameterVector&) 02216 { 02217 libmesh_not_implemented(); 02218 } 02219 02220 inline 02221 std::pair<unsigned int, Real> 02222 System::adjoint_solve (const QoISet&) 02223 { 02224 libmesh_not_implemented(); 02225 } 02226 02227 inline 02228 std::pair<unsigned int, Real> 02229 System::weighted_sensitivity_adjoint_solve (const ParameterVector&, 02230 const ParameterVector&, 02231 const QoISet&) 02232 { 02233 libmesh_not_implemented(); 02234 } 02235 02236 inline 02237 void 02238 System::adjoint_qoi_parameter_sensitivity (const QoISet&, 02239 const ParameterVector&, 02240 SensitivityData&) 02241 { 02242 libmesh_not_implemented(); 02243 } 02244 02245 inline 02246 void 02247 System::forward_qoi_parameter_sensitivity (const QoISet&, 02248 const ParameterVector&, 02249 SensitivityData&) 02250 { 02251 libmesh_not_implemented(); 02252 } 02253 02254 inline 02255 void 02256 System::qoi_parameter_hessian(const QoISet&, 02257 const ParameterVector&, 02258 SensitivityData&) 02259 { 02260 libmesh_not_implemented(); 02261 } 02262 02263 inline 02264 void 02265 System::qoi_parameter_hessian_vector_product(const QoISet&, 02266 const ParameterVector&, 02267 const ParameterVector&, 02268 SensitivityData&) 02269 { 02270 libmesh_not_implemented(); 02271 } 02272 02273 02274 } // namespace libMesh 02275 02276 #endif // LIBMESH_SYSTEM_H