Line data Source code
1 : /*
2 : * Copyright (c) 2012-2015: G-CSC, Goethe University Frankfurt
3 : * Author: Andreas Vogel
4 : *
5 : * This file is part of UG4.
6 : *
7 : * UG4 is free software: you can redistribute it and/or modify it under the
8 : * terms of the GNU Lesser General Public License version 3 (as published by the
9 : * Free Software Foundation) with the following additional attribution
10 : * requirements (according to LGPL/GPL v3 §7):
11 : *
12 : * (1) The following notice must be displayed in the Appropriate Legal Notices
13 : * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14 : *
15 : * (2) The following notice must be displayed at a prominent place in the
16 : * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17 : *
18 : * (3) The following bibliography is recommended for citation and must be
19 : * preserved in all covered files:
20 : * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21 : * parallel geometric multigrid solver on hierarchically distributed grids.
22 : * Computing and visualization in science 16, 4 (2013), 151-164"
23 : * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24 : * flexible software system for simulating pde based models on high performance
25 : * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26 : *
27 : * This program is distributed in the hope that it will be useful,
28 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
29 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30 : * GNU Lesser General Public License for more details.
31 : */
32 :
33 : /**
34 : * File for registration of ConvectionDiffusion routines.
35 : */
36 :
37 : #include "bridge/util.h"
38 : #include "bridge/util_domain_dependent.h"
39 : #include "convection_diffusion_base.h"
40 : #include "convection_diffusion_sss.h"
41 : #include "fv1/convection_diffusion_fv1.h"
42 : #include "fe/convection_diffusion_fe.h"
43 : #include "fe/convection_diffusion_stab_fe.h"
44 : #include "fvcr/convection_diffusion_fvcr.h"
45 : #include "fv/convection_diffusion_fv.h"
46 : #include "fractfv1/convection_diffusion_fractfv1.h"
47 :
48 : #include "convection_diffusion_plugin.h"
49 :
50 : using namespace std;
51 : using namespace ug::bridge;
52 :
53 : namespace ug{
54 : namespace ConvectionDiffusionPlugin{
55 :
56 : /**
57 : * \defgroup convection_diffusion Convection Diffusion
58 : * \ingroup plugins
59 : * This plugin provides the discretization of convection and diffusion problems.
60 : * \{
61 : */
62 :
63 : /**
64 : * Class exporting the functionality of the plugin. All functionality that is to
65 : * be used in scripts or visualization must be registered here.
66 : */
67 : struct Functionality
68 : {
69 :
70 : /**
71 : * Function called for the registration of Domain dependent parts
72 : * of the plugin. All Functions and Classes depending on the Domain
73 : * are to be placed here when registering. The method is called for all
74 : * available Domain types, based on the current build options.
75 : *
76 : * @param reg registry
77 : * @param parentGroup group for sorting of functionality
78 : */
79 : template <typename TDomain, typename TRegistry=ug::bridge::Registry>
80 3 : static void Domain(TRegistry& reg, string grp)
81 : {
82 : static const int dim = TDomain::dim;
83 : string suffix = GetDomainSuffix<TDomain>();
84 : string tag = GetDomainTag<TDomain>();
85 :
86 : // Convection Diffusion Base
87 : {
88 : typedef ConvectionDiffusionBase<TDomain> T;
89 : typedef IElemDisc<TDomain> TBase;
90 3 : string name = string("ConvectionDiffusionBase").append(suffix);
91 9 : reg.template add_class_<T, TBase >(name, grp)
92 6 : .add_method("set_diffusion", static_cast<void (T::*)(SmartPtr<CplUserData<MathMatrix<dim, dim>, dim> >)>(&T::set_diffusion), "", "Diffusion")
93 6 : .add_method("set_diffusion", static_cast<void (T::*)(number)>(&T::set_diffusion), "", "Diagonal Diffusion")
94 : #ifdef UG_FOR_LUA
95 6 : .add_method("set_diffusion", static_cast<void (T::*)(const char*)>(&T::set_diffusion), "", "Diffusion")
96 6 : .add_method("set_diffusion", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_diffusion), "", "Diffusion")
97 : #endif
98 :
99 6 : .add_method("set_velocity", static_cast<void (T::*)(SmartPtr<CplUserData<MathVector<dim>, dim> >)>(&T::set_velocity), "", "Velocity Field")
100 6 : .add_method("set_velocity", static_cast<void (T::*)(const std::vector<number>&)>(&T::set_velocity), "", "Velocity Field")
101 : #ifdef UG_FOR_LUA
102 6 : .add_method("set_velocity", static_cast<void (T::*)(const char*)>(&T::set_velocity), "", "Velocity Field")
103 6 : .add_method("set_velocity", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_velocity), "", "Velocity Field")
104 : #endif
105 :
106 6 : .add_method("set_flux", static_cast<void (T::*)(SmartPtr<CplUserData<MathVector<dim>, dim> >)>(&T::set_flux), "", "Flux")
107 6 : .add_method("set_flux", static_cast<void (T::*)(const std::vector<number>&)>(&T::set_flux), "", "Flux")
108 : #ifdef UG_FOR_LUA
109 6 : .add_method("set_flux", static_cast<void (T::*)(const char*)>(&T::set_flux), "", "Flux")
110 6 : .add_method("set_flux", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_flux), "", "Flux")
111 : #endif
112 :
113 6 : .add_method("set_reaction_rate", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_reaction_rate), "", "Reaction Rate")
114 6 : .add_method("set_reaction_rate", static_cast<void (T::*)(number)>(&T::set_reaction_rate), "", "Reaction Rate")
115 : #ifdef UG_FOR_LUA
116 6 : .add_method("set_reaction_rate", static_cast<void (T::*)(const char*)>(&T::set_reaction_rate), "", "Reaction Rate")
117 6 : .add_method("set_reaction_rate", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_reaction_rate), "", "Reaction Rate")
118 : #endif
119 :
120 6 : .add_method("set_reaction", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_reaction), "", "Reaction")
121 6 : .add_method("set_reaction", static_cast<void (T::*)(number)>(&T::set_reaction), "", "Reaction")
122 : #ifdef UG_FOR_LUA
123 6 : .add_method("set_reaction", static_cast<void (T::*)(const char*)>(&T::set_reaction), "", "Reaction")
124 6 : .add_method("set_reaction", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_reaction), "", "Reaction")
125 : #endif
126 :
127 6 : .add_method("set_reaction_rate_explicit", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_reaction_rate_explicit), "", "Reaction Rate Explicit")
128 6 : .add_method("set_reaction_rate_explicit", static_cast<void (T::*)(number)>(&T::set_reaction_rate_explicit), "", "Reaction Rate Explicit")
129 : #ifdef UG_FOR_LUA
130 6 : .add_method("set_reaction_rate_explicit", static_cast<void (T::*)(const char*)>(&T::set_reaction_rate_explicit), "", "Reaction Rate Explicit")
131 : #endif
132 :
133 6 : .add_method("set_reaction_explicit", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_reaction_explicit), "", "Reaction Explicit")
134 6 : .add_method("set_reaction_explicit", static_cast<void (T::*)(number)>(&T::set_reaction_explicit), "", "Reaction Explicit")
135 : #ifdef UG_FOR_LUA
136 6 : .add_method("set_reaction_explicit", static_cast<void (T::*)(const char*)>(&T::set_reaction_explicit), "", "Reaction Explicit")
137 : #endif
138 :
139 6 : .add_method("set_source_explicit", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_source_explicit), "", "Source Explicit")
140 6 : .add_method("set_source_explicit", static_cast<void (T::*)(number)>(&T::set_source_explicit), "", "Source Explicit")
141 : #ifdef UG_FOR_LUA
142 6 : .add_method("set_source_explicit", static_cast<void (T::*)(const char*)>(&T::set_source_explicit), "", "Source Explicit")
143 : #endif
144 :
145 6 : .add_method("set_source", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_source), "", "Source")
146 6 : .add_method("set_source", static_cast<void (T::*)(number)>(&T::set_source), "", "Source")
147 : #ifdef UG_FOR_LUA
148 6 : .add_method("set_source", static_cast<void (T::*)(const char*)>(&T::set_source), "", "Source")
149 6 : .add_method("set_source", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_source), "", "Source")
150 : #endif
151 :
152 6 : .add_method("set_vector_source", static_cast<void (T::*)(SmartPtr<CplUserData<MathVector<dim>, dim> >)>(&T::set_vector_source), "", "Vector Source")
153 : #ifdef UG_FOR_LUA
154 6 : .add_method("set_vector_source", static_cast<void (T::*)(const char*)>(&T::set_vector_source), "", "Vector Source")
155 6 : .add_method("set_vector_source", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_vector_source), "", "Vector Source")
156 : #endif
157 :
158 6 : .add_method("set_mass_scale", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_mass_scale), "", "Mass Scale")
159 6 : .add_method("set_mass_scale", static_cast<void (T::*)(number)>(&T::set_mass_scale), "", "Mass Scale")
160 : #ifdef UG_FOR_LUA
161 6 : .add_method("set_mass_scale", static_cast<void (T::*)(const char*)>(&T::set_mass_scale), "", "Mass Scale")
162 6 : .add_method("set_mass_scale", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_mass_scale), "", "Mass Scale")
163 : #endif
164 :
165 6 : .add_method("set_mass", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_mass), "", "Mass")
166 6 : .add_method("set_mass", static_cast<void (T::*)(number)>(&T::set_mass), "", "Mass")
167 : #ifdef UG_FOR_LUA
168 6 : .add_method("set_mass", static_cast<void (T::*)(const char*)>(&T::set_mass), "", "Mass")
169 6 : .add_method("set_mass", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_mass), "", "Mass")
170 : #endif
171 :
172 9 : .add_method("value", &T::value)
173 9 : .add_method("gradient", &T::gradient);
174 : /*
175 : .add_method("set_partial_velocity", &T::set_partial_velocity)
176 : .add_method("set_partial_flux", &T::set_partial_flux)
177 : .add_method("set_partial_mass", &T::set_partial_mass);
178 : */
179 9 : reg.add_class_to_group(name, "ConvectionDiffusionBase", tag);
180 : }
181 :
182 : // Convection Diffusion FV1
183 : {
184 : typedef ConvectionDiffusionFV1<TDomain> T;
185 : typedef ConvectionDiffusionBase<TDomain> TBase;
186 3 : string name = string("ConvectionDiffusionFV1").append(suffix);
187 9 : reg.template add_class_<T, TBase >(name, grp)
188 6 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
189 9 : .add_method("set_condensed_FV", &T::set_condensed_FV, "", "[De-]Activates the condensed FV scvf ip's")
190 12 : .add_method("set_upwind", &T::set_upwind, "", "Sets the upwind type for the convective terms")
191 12 : .add_method("set_singular_sources_and_sinks", &T::set_sss_manager, "", "Sets the singular sources and sinks manager")
192 9 : .add_method("singular_sources_and_sinks", &T::sss_manager, "", "Returns the singular sources and sinks manager")
193 3 : .set_construct_as_smart_pointer(true);
194 9 : reg.add_class_to_group(name, "ConvectionDiffusionFV1", tag);
195 : }
196 :
197 : // Convection Diffusion FE
198 : {
199 : typedef ConvectionDiffusionFE<TDomain> T;
200 : typedef ConvectionDiffusionBase<TDomain> TBase;
201 3 : string name = string("ConvectionDiffusionFE").append(suffix);
202 9 : reg.template add_class_<T, TBase >(name, grp)
203 6 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
204 6 : .add_method("set_quad_order", &T::set_quad_order)
205 3 : .set_construct_as_smart_pointer(true);
206 9 : reg.add_class_to_group(name, "ConvectionDiffusionFE", tag);
207 : }
208 :
209 : // Convection Diffusion (FE) stabilization
210 : {
211 : typedef ConvectionDiffusionStabFE<TDomain> T;
212 : typedef IElemDisc<TDomain> TBase;
213 3 : string name = string("ConvectionDiffusionStabFE").append(suffix);
214 9 : reg.template add_class_<T, TBase >(name, grp)
215 6 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
216 6 : .template add_constructor<void (*)(const char*,const char*,number)>("Function(s)#Subset(s)#stabilization")
217 6 : .template add_constructor<void (*)(const char*,const char*,number,number)>("Function(s)#Subset(s)#stabilization")
218 6 : .add_method("set_quad_order", &T::set_quad_order)
219 3 : .set_construct_as_smart_pointer(true);
220 9 : reg.add_class_to_group(name, "ConvectionDiffusionStabFE", tag);
221 : }
222 :
223 :
224 : // Convection Diffusion FVCR
225 : {
226 : typedef ConvectionDiffusionFVCR<TDomain> T;
227 : typedef ConvectionDiffusionBase<TDomain> TBase;
228 3 : string name = string("ConvectionDiffusionFVCR").append(suffix);
229 9 : reg.template add_class_<T, TBase >(name, grp)
230 6 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
231 6 : .add_method("set_upwind", &T::set_upwind)
232 3 : .set_construct_as_smart_pointer(true);
233 9 : reg.add_class_to_group(name, "ConvectionDiffusionFVCR", tag);
234 : }
235 :
236 : // Convection Diffusion FV
237 : {
238 : typedef ConvectionDiffusionFV<TDomain> T;
239 : typedef ConvectionDiffusionBase<TDomain> TBase;
240 3 : string name = string("ConvectionDiffusionFV").append(suffix);
241 9 : reg.template add_class_<T, TBase >(name, grp)
242 6 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
243 6 : .add_method("set_quad_order", &T::set_quad_order)
244 3 : .set_construct_as_smart_pointer(true);
245 9 : reg.add_class_to_group(name, "ConvectionDiffusionFV", tag);
246 : }
247 3 : }
248 :
249 : template <int dim, typename TRegistry=ug::bridge::Registry>
250 3 : static void Dimension(TRegistry& reg, string grp)
251 : {
252 3 : string dimSuffix = GetDimensionSuffix<dim>();
253 3 : string dimTag = GetDimensionTag<dim>();
254 :
255 : // singular sources and sinks
256 : {
257 : typedef CDSingularSourcesAndSinks<dim> T;
258 : typedef typename T::point_sss_type TPointSSS;
259 : typedef typename T::line_sss_type TLineSSS;
260 :
261 3 : string point_name = string("CDPointSourcesSink").append(dimSuffix);
262 9 : reg.template add_class_<TPointSSS>(point_name, grp)
263 6 : .template add_constructor<void (*) (const std::vector<number>&)> ()
264 9 : .add_method ("set", static_cast<void (TPointSSS::*) (number)> (&TPointSSS::set))
265 12 : .add_method ("set", static_cast<void (TPointSSS::*) (typename TPointSSS::user_data_type)> (&TPointSSS::set))
266 : #ifdef UG_FOR_LUA
267 9 : .add_method ("set", static_cast<void (TPointSSS::*) (LuaFunctionHandle)> (&TPointSSS::set))
268 : #endif
269 3 : .set_construct_as_smart_pointer(true);
270 9 : reg.add_class_to_group(point_name, "CDPointSourcesSink", dimTag);
271 :
272 3 : string line_name = string("CDLineSourcesSink").append(dimSuffix);
273 9 : reg.template add_class_<TLineSSS>(line_name, grp)
274 6 : .template add_constructor<void (*) (const std::vector<number>&, const std::vector<number>&)> ()
275 9 : .add_method ("set", static_cast<void (TLineSSS::*) (number)> (&TLineSSS::set))
276 : #ifdef UG_FOR_LUA
277 9 : .add_method ("set", static_cast<void (TLineSSS::*) (LuaFunctionHandle)> (&TLineSSS::set))
278 : #endif
279 3 : .set_construct_as_smart_pointer(true);
280 9 : reg.add_class_to_group(line_name, "CDLineSourcesSink", dimTag);
281 :
282 3 : string name = string("CDSingularSourcesAndSinks").append(dimSuffix);
283 9 : reg.template add_class_<T>(name, grp)
284 3 : .add_constructor()
285 9 : .add_method ("add_point", static_cast<void (T::*) (SmartPtr<TPointSSS>)> (&T::add_point))
286 9 : .add_method ("add_line", static_cast<void (T::*) (SmartPtr<TLineSSS>)> (&T::add_line))
287 3 : .set_construct_as_smart_pointer(true);
288 9 : reg.add_class_to_group(name, "CDSingularSourcesAndSinks", dimTag);
289 : }
290 3 : }
291 :
292 : }; // end Functionality
293 :
294 : /**
295 : * Class exporting the functionality of the plugin restricted to 2 and 3 spatial
296 : * dimensions. All functionality that is to be used in scripts or visualization
297 : * only in 2d and 3d must be registered here.
298 : */
299 : struct Functionality2d3d
300 : {
301 :
302 : /**
303 : * Function called for the registration of Domain dependent parts
304 : * of the plugin. All Functions and Classes depending on the Domain
305 : * are to be placed here when registering. The method is called for all
306 : * available Domain types, based on the current build options.
307 : *
308 : * @param reg registry
309 : * @param parentGroup group for sorting of functionality
310 : */
311 : template <typename TDomain, typename TRegistry=ug::bridge::Registry>
312 2 : static void Domain(TRegistry& reg, string grp)
313 : {
314 : static const int dim = TDomain::dim;
315 : string suffix = GetDomainSuffix<TDomain>();
316 : string tag = GetDomainTag<TDomain>();
317 :
318 : // Convection Diffusion FV1 for the low-dimensional fractures
319 : {
320 : typedef ConvectionDiffusionFractFV1<TDomain> T;
321 : typedef ConvectionDiffusionBase<TDomain> TBase;
322 2 : string name = string("ConvectionDiffusionFractFV1").append(suffix);
323 6 : reg.template add_class_<T, TBase >(name, grp)
324 4 : .template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
325 4 : .add_method("set_fract_manager", static_cast<void (T::*)(SmartPtr<DegeneratedLayerManager<dim> >)>(&T::set_fract_manager), "Sets the fracture manager", "Deg. fracture manager")
326 6 : .add_method("set_upwind", &T::set_upwind)
327 6 : .add_method("set_aperture", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_aperture), "", "Fract. aperture")
328 4 : .add_method("set_aperture", static_cast<void (T::*)(number)>(&T::set_aperture), "", "Fract. aperture")
329 : #ifdef UG_FOR_LUA
330 4 : .add_method("set_aperture", static_cast<void (T::*)(const char*)>(&T::set_aperture), "", "Fract. aperture")
331 4 : .add_method("set_aperture", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_aperture), "", "Fract. aperture")
332 : #endif
333 4 : .add_method("set_ortho_velocity", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_ortho_velocity), "", "Orthogonal Velocity Field")
334 4 : .add_method("set_ortho_velocity", static_cast<void (T::*)(number)>(&T::set_ortho_velocity), "", "Orthogonal Velocity Field")
335 : #ifdef UG_FOR_LUA
336 4 : .add_method("set_ortho_velocity", static_cast<void (T::*)(const char*)>(&T::set_ortho_velocity), "", "Orthogonal Velocity Field")
337 4 : .add_method("set_ortho_velocity", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_ortho_velocity), "", "Orthogonal Velocity Field")
338 : #endif
339 4 : .add_method("set_ortho_diffusion", static_cast<void (T::*)(SmartPtr<CplUserData<number, dim> >)>(&T::set_ortho_diffusion), "", "Orthogonal Diffusion")
340 4 : .add_method("set_ortho_diffusion", static_cast<void (T::*)(number)>(&T::set_ortho_diffusion), "", "Orthogonal Diffusion")
341 : #ifdef UG_FOR_LUA
342 4 : .add_method("set_ortho_diffusion", static_cast<void (T::*)(const char*)>(&T::set_ortho_diffusion), "", "Orthogonal Diffusion")
343 4 : .add_method("set_ortho_diffusion", static_cast<void (T::*)(LuaFunctionHandle)>(&T::set_ortho_diffusion), "", "Orthogonal Diffusion")
344 : #endif
345 6 : .add_method("set_singular_sources_and_sinks", &T::set_sss_manager, "", "Sets the singular sources and sinks manager")
346 6 : .add_method("singular_sources_and_sinks", &T::sss_manager, "", "Returns the singular sources and sinks manager")
347 2 : .set_construct_as_smart_pointer(true);
348 6 : reg.add_class_to_group(name, "ConvectionDiffusionFractFV1", tag);
349 : }
350 2 : }
351 :
352 : }; // end Functionality2d3d
353 :
354 : // end group convection_diffusion
355 : /// \}
356 :
357 : } // end namespace ConvectionDiffusionPlugin
358 :
359 :
360 :
361 : #ifndef UG_USE_PYBIND11
362 :
363 :
364 : //! This function is called when the plugin is loaded.
365 : extern "C"
366 1 : void InitUGPlugin_ConvectionDiffusion(ug::bridge::Registry* reg, string grp)
367 : {
368 1 : grp.append("/SpatialDisc/ElemDisc");
369 : typedef ConvectionDiffusionPlugin::Functionality Functionality;
370 : typedef ConvectionDiffusionPlugin::Functionality2d3d Functionality2d3d;
371 :
372 : try{
373 2 : RegisterDimensionDependent<Functionality>(*reg,grp);
374 2 : RegisterDomainDependent<Functionality>(*reg,grp);
375 1 : RegisterDomain2d3dDependent<Functionality2d3d>(*reg,grp);
376 : }
377 0 : UG_REGISTRY_CATCH_THROW(grp);
378 1 : }
379 :
380 : #else // UG_USE_PYBIND11
381 :
382 : template <typename TRegistry=ug::bridge::Registry>
383 : void InitUGPlugin_ConvectionDiffusion_(TRegistry* reg, string grp)
384 : {
385 : grp.append("/SpatialDisc/ElemDisc");
386 : typedef ConvectionDiffusionPlugin::Functionality Functionality;
387 : typedef ConvectionDiffusionPlugin::Functionality2d3d Functionality2d3d;
388 :
389 : try{
390 : RegisterDimensionDependent<Functionality>(*reg,grp);
391 : RegisterDomainDependent<Functionality, TRegistry>(*reg,grp);
392 : RegisterDomain2d3dDependent<Functionality2d3d, TRegistry>(*reg,grp);
393 : }
394 : UG_REGISTRY_CATCH_THROW(grp);
395 : }
396 :
397 :
398 : //! This function is called when the plugin is loaded.
399 : extern "C" void
400 : InitUGPlugin_ConvectionDiffusion(ug::bridge::Registry* reg, string grp)
401 : { InitUGPlugin_ConvectionDiffusion_(reg, grp); }
402 :
403 : #ifdef UG_USE_PYBIND11
404 : namespace ConvectionDiffusionPlugin{
405 :
406 : void Init(ug::pybind::Registry* reg, string grp)
407 : { InitUGPlugin_ConvectionDiffusion_<ug::pybind::Registry>(reg, grp); }
408 : }
409 : #endif
410 :
411 : #endif // UG_USE_PYBIND11
412 :
413 : }// namespace ug
|