Skip to content

Commit eb7019d

Browse files
committed
Merge branch 'master' of github.com:UG4/plugin_ConvectionDiffusion
2 parents 8e6e078 + 57cc900 commit eb7019d

File tree

6 files changed

+200
-44
lines changed

6 files changed

+200
-44
lines changed

CMakeLists.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,3 +64,17 @@ else(buildEmbeddedPlugins)
6464
add_library(${pluginName} SHARED ${SOURCES})
6565
target_link_libraries (${pluginName} ug4)
6666
endif(buildEmbeddedPlugins)
67+
68+
69+
70+
71+
################################################################################
72+
# Python binding
73+
################################################################################
74+
if(USE_PYBIND11)
75+
SET(myPluginSources convection_diffusion_pybind.cpp)
76+
SET(myLibraries ${pluginName} ug4)
77+
# First argument must match module name in PYBIND11_MODULE call
78+
ug4pybind_add_module(pyconvectiondiffusion ${myPluginSources} ${myLibraries})
79+
target_link_libraries (pyconvectiondiffusion PRIVATE ${pluginName}) # TODO: should be part of ug4pybind_add_module
80+
endif(USE_PYBIND11)

convection_diffusion_base.cpp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,33 @@ gradient() {return m_exGrad;}
440440
// Constructor
441441
////////////////////////////////////////////////////////////////////////////////
442442

443+
template<typename TDomain>
444+
void ConvectionDiffusionBase<TDomain>::
445+
init_imports()
446+
{
447+
// register imports
448+
this->register_import(m_imDiffusion);
449+
this->register_import(m_imVelocity);
450+
this->register_import(m_imFlux);
451+
this->register_import(m_imReactionRate);
452+
this->register_import(m_imReaction);
453+
this->register_import(m_imReactionRateExpl);
454+
this->register_import(m_imReactionExpl);
455+
this->register_import(m_imSourceExpl);
456+
this->register_import(m_imSource);
457+
this->register_import(m_imVectorSource);
458+
this->register_import(m_imMassScale);
459+
this->register_import(m_imMass);
460+
461+
m_imMassScale.set_mass_part();
462+
m_imMass.set_mass_part();
463+
m_imSource.set_rhs_part();
464+
m_imVectorSource.set_rhs_part();
465+
m_imSourceExpl.set_expl_part();
466+
m_imReactionExpl.set_expl_part();
467+
m_imReactionRateExpl.set_expl_part();
468+
}
469+
443470
template<typename TDomain>
444471
ConvectionDiffusionBase<TDomain>::
445472
ConvectionDiffusionBase(const char* functions, const char* subsets)
@@ -451,28 +478,8 @@ ConvectionDiffusionBase(const char* functions, const char* subsets)
451478
if(this->num_fct() != 1)
452479
UG_THROW("Wrong number of functions: The ElemDisc 'ConvectionDiffusion'"
453480
" needs exactly "<<1<<" symbolic function.");
454-
455-
// register imports
456-
this->register_import(m_imDiffusion);
457-
this->register_import(m_imVelocity);
458-
this->register_import(m_imFlux);
459-
this->register_import(m_imReactionRate);
460-
this->register_import(m_imReaction);
461-
this->register_import(m_imReactionRateExpl);
462-
this->register_import(m_imReactionExpl);
463-
this->register_import(m_imSourceExpl);
464-
this->register_import(m_imSource);
465-
this->register_import(m_imVectorSource);
466-
this->register_import(m_imMassScale);
467-
this->register_import(m_imMass);
468-
469-
m_imMassScale.set_mass_part();
470-
m_imMass.set_mass_part();
471-
m_imSource.set_rhs_part();
472-
m_imVectorSource.set_rhs_part();
473-
m_imSourceExpl.set_expl_part();
474-
m_imReactionExpl.set_expl_part();
475-
m_imReactionRateExpl.set_expl_part();
481+
// init all imports
482+
init_imports();
476483

477484
// default value for mass scale
478485
set_mass_scale(1.0);

convection_diffusion_base.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ class ConvectionDiffusionBase
8888
public:
8989
/// Constructor
9090
ConvectionDiffusionBase(const char* functions, const char* subsets);
91-
91+
protected:
92+
void init_imports();
93+
public:
9294
/// sets the diffusion tensor
9395
/**
9496
* This method sets the Diffusion tensor used in computations. If no

convection_diffusion_plugin.cpp

Lines changed: 58 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
#include "fv/convection_diffusion_fv.h"
4646
#include "fractfv1/convection_diffusion_fractfv1.h"
4747

48+
#include "convection_diffusion_plugin.h"
49+
4850
using namespace std;
4951
using namespace ug::bridge;
5052

@@ -74,8 +76,8 @@ struct Functionality
7476
* @param reg registry
7577
* @param parentGroup group for sorting of functionality
7678
*/
77-
template <typename TDomain>
78-
static void Domain(Registry& reg, string grp)
79+
template <typename TDomain, typename TRegistry=ug::bridge::Registry>
80+
static void Domain(TRegistry& reg, string grp)
7981
{
8082
static const int dim = TDomain::dim;
8183
string suffix = GetDomainSuffix<TDomain>();
@@ -86,7 +88,7 @@ static void Domain(Registry& reg, string grp)
8688
typedef ConvectionDiffusionBase<TDomain> T;
8789
typedef IElemDisc<TDomain> TBase;
8890
string name = string("ConvectionDiffusionBase").append(suffix);
89-
reg.add_class_<T, TBase >(name, grp)
91+
reg.template add_class_<T, TBase >(name, grp)
9092
.add_method("set_diffusion", static_cast<void (T::*)(SmartPtr<CplUserData<MathMatrix<dim, dim>, dim> >)>(&T::set_diffusion), "", "Diffusion")
9193
.add_method("set_diffusion", static_cast<void (T::*)(number)>(&T::set_diffusion), "", "Diagonal Diffusion")
9294
#ifdef UG_FOR_LUA
@@ -182,7 +184,7 @@ static void Domain(Registry& reg, string grp)
182184
typedef ConvectionDiffusionFV1<TDomain> T;
183185
typedef ConvectionDiffusionBase<TDomain> TBase;
184186
string name = string("ConvectionDiffusionFV1").append(suffix);
185-
reg.add_class_<T, TBase >(name, grp)
187+
reg.template add_class_<T, TBase >(name, grp)
186188
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
187189
.add_method("set_condensed_FV", &T::set_condensed_FV, "", "[De-]Activates the condensed FV scvf ip's")
188190
.add_method("set_upwind", &T::set_upwind, "", "Sets the upwind type for the convective terms")
@@ -197,7 +199,7 @@ static void Domain(Registry& reg, string grp)
197199
typedef ConvectionDiffusionFE<TDomain> T;
198200
typedef ConvectionDiffusionBase<TDomain> TBase;
199201
string name = string("ConvectionDiffusionFE").append(suffix);
200-
reg.add_class_<T, TBase >(name, grp)
202+
reg.template add_class_<T, TBase >(name, grp)
201203
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
202204
.add_method("set_quad_order", &T::set_quad_order)
203205
.set_construct_as_smart_pointer(true);
@@ -209,7 +211,7 @@ static void Domain(Registry& reg, string grp)
209211
typedef ConvectionDiffusionStabFE<TDomain> T;
210212
typedef IElemDisc<TDomain> TBase;
211213
string name = string("ConvectionDiffusionStabFE").append(suffix);
212-
reg.add_class_<T, TBase >(name, grp)
214+
reg.template add_class_<T, TBase >(name, grp)
213215
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
214216
.template add_constructor<void (*)(const char*,const char*,number)>("Function(s)#Subset(s)#stabilization")
215217
.template add_constructor<void (*)(const char*,const char*,number,number)>("Function(s)#Subset(s)#stabilization")
@@ -224,7 +226,7 @@ static void Domain(Registry& reg, string grp)
224226
typedef ConvectionDiffusionFVCR<TDomain> T;
225227
typedef ConvectionDiffusionBase<TDomain> TBase;
226228
string name = string("ConvectionDiffusionFVCR").append(suffix);
227-
reg.add_class_<T, TBase >(name, grp)
229+
reg.template add_class_<T, TBase >(name, grp)
228230
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
229231
.add_method("set_upwind", &T::set_upwind)
230232
.set_construct_as_smart_pointer(true);
@@ -236,16 +238,16 @@ static void Domain(Registry& reg, string grp)
236238
typedef ConvectionDiffusionFV<TDomain> T;
237239
typedef ConvectionDiffusionBase<TDomain> TBase;
238240
string name = string("ConvectionDiffusionFV").append(suffix);
239-
reg.add_class_<T, TBase >(name, grp)
241+
reg.template add_class_<T, TBase >(name, grp)
240242
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
241243
.add_method("set_quad_order", &T::set_quad_order)
242244
.set_construct_as_smart_pointer(true);
243245
reg.add_class_to_group(name, "ConvectionDiffusionFV", tag);
244246
}
245247
}
246248

247-
template <int dim>
248-
static void Dimension(Registry& reg, string grp)
249+
template <int dim, typename TRegistry=ug::bridge::Registry>
250+
static void Dimension(TRegistry& reg, string grp)
249251
{
250252
string dimSuffix = GetDimensionSuffix<dim>();
251253
string dimTag = GetDimensionTag<dim>();
@@ -257,7 +259,7 @@ static void Dimension(Registry& reg, string grp)
257259
typedef typename T::line_sss_type TLineSSS;
258260

259261
string point_name = string("CDPointSourcesSink").append(dimSuffix);
260-
reg.add_class_<TPointSSS>(point_name, grp)
262+
reg.template add_class_<TPointSSS>(point_name, grp)
261263
.template add_constructor<void (*) (const std::vector<number>&)> ()
262264
.add_method ("set", static_cast<void (TPointSSS::*) (number)> (&TPointSSS::set))
263265
.add_method ("set", static_cast<void (TPointSSS::*) (typename TPointSSS::user_data_type)> (&TPointSSS::set))
@@ -268,15 +270,15 @@ static void Dimension(Registry& reg, string grp)
268270
reg.add_class_to_group(point_name, "CDPointSourcesSink", dimTag);
269271

270272
string line_name = string("CDLineSourcesSink").append(dimSuffix);
271-
reg.add_class_<TLineSSS>(line_name, grp)
273+
reg.template add_class_<TLineSSS>(line_name, grp)
272274
.template add_constructor<void (*) (const std::vector<number>&, const std::vector<number>&)> ()
273275
.add_method ("set", static_cast<void (TLineSSS::*) (number)> (&TLineSSS::set))
274276
.add_method ("set", static_cast<void (TLineSSS::*) (LuaFunctionHandle)> (&TLineSSS::set))
275277
.set_construct_as_smart_pointer(true);
276278
reg.add_class_to_group(line_name, "CDLineSourcesSink", dimTag);
277279

278280
string name = string("CDSingularSourcesAndSinks").append(dimSuffix);
279-
reg.add_class_<T>(name, grp)
281+
reg.template add_class_<T>(name, grp)
280282
.add_constructor()
281283
.add_method ("add_point", static_cast<void (T::*) (SmartPtr<TPointSSS>)> (&T::add_point))
282284
.add_method ("add_line", static_cast<void (T::*) (SmartPtr<TLineSSS>)> (&T::add_line))
@@ -304,8 +306,8 @@ struct Functionality2d3d
304306
* @param reg registry
305307
* @param parentGroup group for sorting of functionality
306308
*/
307-
template <typename TDomain>
308-
static void Domain(Registry& reg, string grp)
309+
template <typename TDomain, typename TRegistry=ug::bridge::Registry>
310+
static void Domain(TRegistry& reg, string grp)
309311
{
310312
static const int dim = TDomain::dim;
311313
string suffix = GetDomainSuffix<TDomain>();
@@ -316,7 +318,7 @@ static void Domain(Registry& reg, string grp)
316318
typedef ConvectionDiffusionFractFV1<TDomain> T;
317319
typedef ConvectionDiffusionBase<TDomain> TBase;
318320
string name = string("ConvectionDiffusionFractFV1").append(suffix);
319-
reg.add_class_<T, TBase >(name, grp)
321+
reg.template add_class_<T, TBase >(name, grp)
320322
.template add_constructor<void (*)(const char*,const char*)>("Function(s)#Subset(s)")
321323
.add_method("set_fract_manager", static_cast<void (T::*)(SmartPtr<DegeneratedLayerManager<dim> >)>(&T::set_fract_manager), "Sets the fracture manager", "Deg. fracture manager")
322324
.add_method("set_upwind", &T::set_upwind)
@@ -351,11 +353,13 @@ static void Domain(Registry& reg, string grp)
351353
} // end namespace ConvectionDiffusionPlugin
352354

353355

354-
/**
355-
* This function is called when the plugin is loaded.
356-
*/
357-
extern "C" void
358-
InitUGPlugin_ConvectionDiffusion(Registry* reg, string grp)
356+
357+
#ifndef UG_USE_PYBIND11
358+
359+
360+
//! This function is called when the plugin is loaded.
361+
extern "C"
362+
void InitUGPlugin_ConvectionDiffusion(ug::bridge::Registry* reg, string grp)
359363
{
360364
grp.append("/SpatialDisc/ElemDisc");
361365
typedef ConvectionDiffusionPlugin::Functionality Functionality;
@@ -369,4 +373,37 @@ InitUGPlugin_ConvectionDiffusion(Registry* reg, string grp)
369373
UG_REGISTRY_CATCH_THROW(grp);
370374
}
371375

376+
#else // UG_USE_PYBIND11
377+
378+
template <typename TRegistry=ug::bridge::Registry>
379+
void InitUGPlugin_ConvectionDiffusion_(TRegistry* reg, string grp)
380+
{
381+
grp.append("/SpatialDisc/ElemDisc");
382+
typedef ConvectionDiffusionPlugin::Functionality Functionality;
383+
typedef ConvectionDiffusionPlugin::Functionality2d3d Functionality2d3d;
384+
385+
try{
386+
RegisterDimensionDependent<Functionality>(*reg,grp);
387+
RegisterDomainDependent<Functionality, TRegistry>(*reg,grp);
388+
RegisterDomain2d3dDependent<Functionality2d3d, TRegistry>(*reg,grp);
389+
}
390+
UG_REGISTRY_CATCH_THROW(grp);
391+
}
392+
393+
394+
//! This function is called when the plugin is loaded.
395+
extern "C" void
396+
InitUGPlugin_ConvectionDiffusion(ug::bridge::Registry* reg, string grp)
397+
{ InitUGPlugin_ConvectionDiffusion_(reg, grp); }
398+
399+
#ifdef UG_USE_PYBIND11
400+
namespace ConvectionDiffusionPlugin{
401+
402+
void Init(ug::pybind::Registry* reg, string grp)
403+
{ InitUGPlugin_ConvectionDiffusion_<ug::pybind::Registry>(reg, grp); }
404+
}
405+
#endif
406+
407+
#endif // UG_USE_PYBIND11
408+
372409
}// namespace ug

convection_diffusion_plugin.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Copyright (c) 2022: G-CSC, Goethe University Frankfurt
3+
* Author: Arne Naegel
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+
#pragma once
33+
34+
#include <string>
35+
#include "bridge/util.h"
36+
37+
#ifdef UG_USE_PYBIND11
38+
#include "bindings/pybind/ug_pybind.h"
39+
#endif
40+
41+
extern "C" void InitUGPlugin_ConvectionDiffusion(ug::bridge::Registry* reg, std::string grp);
42+
43+
#ifdef UG_USE_PYBIND11
44+
namespace ug {
45+
namespace ConvectionDiffusionPlugin{
46+
47+
void Init(ug::pybind::Registry* reg, std::string grp);
48+
}
49+
}
50+
#endif

convection_diffusion_pybind.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (c) 2022: G-CSC, Goethe University Frankfurt
3+
* Author: Arne Naegel
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+
#include "convection_diffusion_plugin.h"
34+
35+
#ifdef UG_USE_PYBIND11
36+
PYBIND11_MODULE(pyconvectiondiffusion, m)
37+
{
38+
m.doc() = "Convection diffusion module";
39+
m.attr("__name__") = "ug4py.convection_diffusion";
40+
41+
ug::pybind::Registry registry(m);
42+
std::string name("ConvDiff");
43+
44+
ug::ConvectionDiffusionPlugin::Init(&registry, name);
45+
}
46+
#endif

0 commit comments

Comments
 (0)