$extrastylesheet
system.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_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