Cantera  3.2.0
Loading...
Searching...
No Matches
ExtensionManager.h
Go to the documentation of this file.
1//! @file ExtensionManager.h
2
3#ifndef CT_EXTENSIONMANAGER_H
4#define CT_EXTENSIONMANAGER_H
5
6// This file is part of Cantera. See License.txt in the top-level directory or
7// at https://cantera.org/license.txt for license and copyright information.
8
10
11namespace Cantera
12{
13
15class Solution;
16
17//! A base class for managing the lifetime of an external object, such as a Python
18//! object used by a Delegator
19class ExternalHandle
20{
21public:
22 ExternalHandle() {}
23 ExternalHandle(const ExternalHandle&) = delete;
24 virtual ~ExternalHandle() = default;
25
26 //! Get the underlying external object
27 virtual void* get() {
28 throw NotImplementedError("ExternalHandle::get");
29 }
30};
31
32//! Base class for managing user-defined %Cantera extensions written in other languages
33//!
34//! @since New in %Cantera 3.0
36{
37public:
38 virtual ~ExtensionManager() = default;
39
40 //! Register ReactionRate defined in a user extension with ReactionRateFactory
41 //! @param extensionName
42 virtual void registerRateBuilders(const string& extensionName) {
43 throw NotImplementedError("ExtensionManager::registerRateBuilders");
44 };
45
46 //! Register a user-defined ReactionRate implementation with ReactionRateFactory
47 //! @param extensionName The name of the library/module containing the user-defined
48 //! rate. For example, the module name for rates implemented in Python.
49 //! @param className The name of the rate in the user's code. For example, the
50 //! Python class name
51 //! @param rateName The name used to construct a rate of this type using
52 //! the newReactionRate() function or from a YAML input file
53 virtual void registerRateBuilder(const string& extensionName,
54 const string& className, const string& rateName)
55 {
56 throw NotImplementedError("ExtensionManager::registerRateBuilder");
57 }
58
59 //! Register a user-defined ReactionData implementation
60 //! @param extensionName The name of the library/module containing the user-defined
61 //! type. For example, the module name for rates implemented in Python.
62 //! @param className The name of the data object in the user's code. For example,
63 //! the Python class name
64 //! @param rateName The name of the corresponding reaction rate type
65 virtual void registerRateDataBuilder(const string& extensionName,
66 const string& className, const string& rateName)
67 {
68 throw NotImplementedError("ExtensionManager::registerRateDataBuilder");
69 }
70
71 //! Create an object in an external language that wraps the specified ReactionData
72 //! object
73 //!
74 //! @param rateName The name of the reaction rate type, which corresponds to the
75 //! name used to register the wrapper generator using registerReactionDataLinker
76 //! @param data The ReactionData object to be wrapped
77 static void wrapReactionData(const string& rateName, ReactionDataDelegator& data);
78
79 //! Create an object in an external language that wraps the specified Solution
80 //! object.
81 //!
82 //! @param wrapperType A name specifying the wrapper type, which corresponds to
83 //! the name used to register the wrapper generator using registerSolutionLinker
84 //! @param soln The Solution object to be wrapped
85 static shared_ptr<ExternalHandle> wrapSolution(const string& wrapperType,
86 shared_ptr<Solution> soln);
87
88 //! Register a function that can be used to create wrappers for ReactionData objects
89 //! in an external language and link them to the corresponding C++ object
90 //!
91 //! @param rateName The name of the reaction rate type
92 //! @param wrapperName The name used for Solution wrappers to be used with this
93 //! object, corresponding to a type registered with registerSolutionLinker().
94 //! @param link Function that creates ReactionData wrapper and links it to the
95 //! provided C++ object
96 static void registerReactionDataLinker(const string& rateName,
97 const string& wrapperName, function<void(ReactionDataDelegator&)> link);
98
99 //! Register a function that can be used to create wrappers for Solution objects in
100 //! an external language and link it to the corresponding C++ objects
101 static void registerSolutionLinker(const string& wrapperName,
102 function<shared_ptr<ExternalHandle>(shared_ptr<Solution>)> link);
103
104 //! Get the Solution wrapper type corresponding to the specified user-defined
105 //! reaction rate type.
106 static string getSolutionWrapperType(const string& userType);
107
108protected:
109 //! Functions for wrapping and linking ReactionData objects
110 static map<string, function<void(ReactionDataDelegator&)>> s_ReactionData_linkers;
111
112 //! Functions for wrapping and linking Solution objects
113 static map<string,
114 function<shared_ptr<ExternalHandle>(shared_ptr<Solution>)>> s_Solution_linkers;
115
116 //! Mapping from user-defined rate types to Solution wrapper types
117 static map<string, string> s_userTypeToWrapperType;
118};
119
120}
121
122#endif
Base class for managing user-defined Cantera extensions written in other languages.
static void registerSolutionLinker(const string &wrapperName, function< shared_ptr< ExternalHandle >(shared_ptr< Solution >)> link)
Register a function that can be used to create wrappers for Solution objects in an external language ...
static void wrapReactionData(const string &rateName, ReactionDataDelegator &data)
Create an object in an external language that wraps the specified ReactionData object.
static map< string, string > s_userTypeToWrapperType
Mapping from user-defined rate types to Solution wrapper types.
virtual void registerRateBuilders(const string &extensionName)
Register ReactionRate defined in a user extension with ReactionRateFactory.
virtual void registerRateDataBuilder(const string &extensionName, const string &className, const string &rateName)
Register a user-defined ReactionData implementation.
virtual void registerRateBuilder(const string &extensionName, const string &className, const string &rateName)
Register a user-defined ReactionRate implementation with ReactionRateFactory.
static string getSolutionWrapperType(const string &userType)
Get the Solution wrapper type corresponding to the specified user-defined reaction rate type.
static void registerReactionDataLinker(const string &rateName, const string &wrapperName, function< void(ReactionDataDelegator &)> link)
Register a function that can be used to create wrappers for ReactionData objects in an external langu...
static map< string, function< shared_ptr< ExternalHandle >(shared_ptr< Solution >)> > s_Solution_linkers
Functions for wrapping and linking Solution objects.
static shared_ptr< ExternalHandle > wrapSolution(const string &wrapperType, shared_ptr< Solution > soln)
Create an object in an external language that wraps the specified Solution object.
static map< string, function< void(ReactionDataDelegator &)> > s_ReactionData_linkers
Functions for wrapping and linking ReactionData objects.
virtual void * get()
Get the underlying external object.
An error indicating that an unimplemented function has been called.
Delegate methods of the ReactionData class to external functions.
A container class for chemically-reacting solutions.
Definition Solution.h:44
Definitions for the classes that are thrown when Cantera experiences an error condition (also contain...
Namespace for the Cantera kernel.
Definition AnyMap.cpp:595