https://mooseframework.inl.gov
AppFactory.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
12 #include <vector>
13 
14 #include "MooseApp.h"
15 #include "Capabilities.h"
16 
17 #ifdef MOOSE_UNIT_TEST
18 #include "gtest/gtest.h"
19 class GTEST_TEST_CLASS_NAME_(AppFactoryTest, manageAppParams);
20 class GTEST_TEST_CLASS_NAME_(AppFactoryTest, appCopyConstructParams);
21 #endif
22 
23 // Forward declarations
24 class InputParameters;
25 
29 #define registerApp(name) AppFactory::instance().reg<name>(#name)
30 
34 using MooseAppPtr = std::shared_ptr<MooseApp>;
35 
40 {
41  virtual MooseAppPtr build(const InputParameters & params) = 0;
42  virtual InputParameters buildParameters() = 0;
43  virtual ~AppFactoryBuildInfoBase() = default;
44 
45  std::size_t _app_creation_count = 0;
46 };
47 template <typename T>
49 {
50  virtual MooseAppPtr build(const InputParameters & params) override
51  {
52  return std::make_shared<T>(params);
53  }
54  virtual InputParameters buildParameters() override { return T::validParams(); }
55 };
56 
57 using AppFactoryBuildInfoMap = std::map<std::string, std::unique_ptr<AppFactoryBuildInfoBase>>;
58 
63 {
64 public:
69  static AppFactory & instance();
70 
71  virtual ~AppFactory();
72 
79  static MooseAppPtr createAppShared(int argc, char ** argv, std::unique_ptr<Parser> parser);
80 
85  static MooseAppPtr createAppShared(const std::string & default_app_type,
86  int argc,
87  char ** argv,
88  MPI_Comm comm_word = MPI_COMM_WORLD);
89 
94  template <typename T>
95  void reg(const std::string & name);
96 
102  InputParameters getValidParams(const std::string & name);
103 
112  const InputParameters & getAppParams(const InputParameters & params) const;
113 
119  {
120  friend class MooseApp;
121 #ifdef MOOSE_UNIT_TEST
122  FRIEND_TEST(::AppFactoryTest, manageAppParams);
123 #endif
126  };
127 
133  void clearAppParams(const InputParameters & params, const ClearAppParamsKey);
134 
142  MooseAppPtr createShared(const std::string & app_type,
143  const std::string & name,
145  MPI_Comm COMM_WORLD_IN);
146 
150  const auto & registeredObjects() const { return _name_to_build_info; }
151 
155  bool isRegistered(const std::string & app_name) const
156  {
157  return _name_to_build_info.count(app_name);
158  }
159 
163  std::size_t createdAppCount(const std::string & app_type) const;
164 
170 
172  AppFactory(AppFactory const &) = delete;
173  Registry & operator=(AppFactory const &) = delete;
174 
175  AppFactory(AppFactory &&) = delete;
176  Registry & operator=(AppFactory &&) = delete;
178 
179 protected:
181 
182 private:
183  // Private constructor for singleton pattern
185 
192 
204  std::size_t getAppParamsID(const InputParameters & params) const;
205 
206 #ifdef MOOSE_UNIT_TEST
207  FRIEND_TEST(::AppFactoryTest, manageAppParams);
208  FRIEND_TEST(::AppFactoryTest, appCopyConstructParams);
209 #endif
210 
212  std::map<std::size_t, std::unique_ptr<InputParameters>> _input_parameters;
213 };
214 
215 template <typename T>
216 void
217 AppFactory::reg(const std::string & name)
218 {
219  if (isRegistered(name))
220  return;
221 
222  _name_to_build_info[name] = std::make_unique<AppFactoryBuildInfo<T>>();
224  name, true, "MOOSE application " + name + " is available.");
225 }
bool isRegistered(const std::string &app_name) const
Returns a Boolean indicating whether an application type has been registered.
Definition: AppFactory.h:155
std::string name(const ElemQuality q)
MooseAppPtr createShared(const std::string &app_type, const std::string &name, InputParameters parameters, MPI_Comm COMM_WORLD_IN)
Build an application object (must be registered)
Definition: AppFactory.C:127
virtual MooseAppPtr build(const InputParameters &params)=0
const InputParameters & storeAppParams(InputParameters &params)
Stores the given parameters within _input_parameters for app construction.
Definition: AppFactory.C:179
const InputParameters & getAppParams(const InputParameters &params) const
Definition: AppFactory.C:40
class GTEST_TEST_CLASS_NAME_(AppFactoryTest, manageAppParams)
Base class for MOOSE-based applications.
Definition: MooseApp.h:96
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
const InputParameters & parameters()
Get the parameters of the object.
Definition: MooseApp.h:161
virtual const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:57
InputParameters validParams()
static InputParameters validParams()
virtual ~AppFactory()
Definition: AppFactory.C:28
std::shared_ptr< MooseApp > MooseAppPtr
alias to wrap shared pointer type
Definition: AppFactory.h:34
const auto & registeredObjects() const
Returns a reference to the map from names to AppFactoryBuildInfo pointers.
Definition: AppFactory.h:150
Generic AppFactory class for building Application objects.
Definition: AppFactory.h:62
void clearAppParams(const InputParameters &params, const ClearAppParamsKey)
Clears the stored parameters for the given application parameteres.
Definition: AppFactory.C:49
AppFactoryBuildInfoMap _name_to_build_info
Definition: AppFactory.h:180
virtual InputParameters buildParameters()=0
ClearAppParamsKey(const ClearAppParamsKey &)
Definition: AppFactory.h:125
std::size_t createdAppCount(const std::string &app_type) const
Definition: AppFactory.C:168
FRIEND_TEST(::AppFactoryTest, manageAppParams)
std::size_t _app_creation_count
Definition: AppFactory.h:45
std::map< std::size_t, std::unique_ptr< InputParameters > > _input_parameters
Storage of input parameters used in applications (ID (from getAppParamsID()) -> params) ...
Definition: AppFactory.h:212
FRIEND_TEST(::AppFactoryTest, manageAppParams)
void reg(const std::string &name)
Register a new object.
Definition: AppFactory.h:217
static MooseAppPtr createAppShared(int argc, char **argv, std::unique_ptr< Parser > parser)
Helper function for creating a MooseApp from command-line arguments and a Parser. ...
Definition: AppFactory.C:60
static AppFactory & instance()
Get the instance of the AppFactory.
Definition: AppFactory.C:18
static Capabilities & getCapabilityRegistry()
Definition: Capabilities.C:22
std::size_t getAppParamsID(const InputParameters &params) const
Get the ID for the InputParameters associated with an application, used in storing them in _input_par...
Definition: AppFactory.C:193
virtual InputParameters buildParameters() override
Definition: AppFactory.h:54
const AppFactoryBuildInfoMap & registeredObjectBuildInfos() const
Returns the map of object name to a function pointer for building said object&#39;s input parameters...
Definition: AppFactory.h:169
virtual MooseAppPtr build(const InputParameters &params) override
Definition: AppFactory.h:50
Registry & operator=(AppFactory const &)=delete
Class that is used as a parameter to clearAppParams() that allows only MooseApp to call clearAppParam...
Definition: AppFactory.h:118
InputParameters getValidParams(const std::string &name)
Get valid parameters for the object.
Definition: AppFactory.C:31
std::map< std::string, std::unique_ptr< AppFactoryBuildInfoBase > > AppFactoryBuildInfoMap
Definition: AppFactory.h:57
The registry is used as a global singleton to collect information on all available MooseObject and Ac...
Definition: Registry.h:161
Polymorphic data structure with parameter and object build access.
Definition: AppFactory.h:39
void add(const std::string &capability, CapabilityUtils::Type value, const std::string &doc)
register a new capability
Definition: Capabilities.C:33
virtual ~AppFactoryBuildInfoBase()=default