5353#include " ./container_fncs/all.hpp"
5454#include " ./mesh.hpp"
5555#include " ./schemes_info.hpp"
56+ #include " ./impl/custom_bc_holder.hpp"
5657#include " ./adapter_cpp.hpp"
5758#include " ./adapter_py.hpp"
5859
@@ -62,7 +63,8 @@ namespace pressiodemoapps{
6263// enums identifying the problems
6364// ----------------------------------------------------------
6465enum class AdvectionDiffusion2d {
65- BurgersPeriodic
66+ BurgersPeriodic,
67+ BurgersOutflow
6668};
6769
6870}// end namespace pressiodemoapps
@@ -93,26 +95,17 @@ create_problem_eigen
9395{
9496
9597 using scalar_t = typename mesh_t ::scalar_t ;
96- if (problemEnum == ::pressiodemoapps::AdvectionDiffusion2d::BurgersPeriodic)
97- {
98- // default parameters
99- const auto icPulseMagnitude = static_cast <scalar_t >(0.5 );
100- const auto icSpread = static_cast <scalar_t >(0.15 );
101- const auto diffusion = static_cast <scalar_t >(0.00001 );
102- const auto icCenterX = static_cast <scalar_t >(0.0 );
103- const auto icCenterY = static_cast <scalar_t >(-0.2 );
104-
105- return RetType (impladvdiff2d::TagBurgersPeriodic{},
106- meshObj,
107- inviscidFluxRecEnum,
108- InviscidFluxScheme::Rusanov,
109- viscFluxRecEnum,
110- icPulseMagnitude, icSpread, diffusion,
111- icCenterX, icCenterY);
112- }
113- else {
114- throw std::runtime_error (" advection-diffusion2d: invalid problem enum" );
115- }
98+ auto defaultPhsParams = impladvdiff2d::defaultPhysicalParams<scalar_t >;
99+ const auto defaultICParams = (problemEnum == AdvectionDiffusion2d::BurgersPeriodic || problemEnum == AdvectionDiffusion2d::BurgersOutflow)
100+ ? impladvdiff2d::defaultInitCondParams<scalar_t > : std::vector<scalar_t >();
101+
102+ return RetType (meshObj,
103+ problemEnum,
104+ inviscidFluxRecEnum,
105+ InviscidFluxScheme::Rusanov,
106+ viscFluxRecEnum,
107+ defaultICParams,
108+ defaultPhsParams);
116109}
117110
118111// ----------------------------------------------------------
@@ -126,28 +119,147 @@ template<
126119RetType
127120#if defined PRESSIODEMOAPPS_ENABLE_BINDINGS
128121// bindings need unique naming or we get error associated with overloads
129- create_periodic_burgers_2d_problem_ov1_for_py
122+ create_burgers_2d_problem_ov1_for_py
130123#else
131- create_periodic_burgers_2d_problem_eigen
124+ create_problem_eigen
132125#endif
133126(const mesh_t & meshObj,
127+ AdvectionDiffusion2d problemEnum,
134128 InviscidFluxReconstruction inviscidFluxRecEnum,
135129 ViscousFluxReconstruction viscFluxRecEnum,
136- typename mesh_t ::scalar_t icPulseMagnitude,
137- typename mesh_t ::scalar_t icSpread,
138- typename mesh_t ::scalar_t diffusion,
139- typename mesh_t ::scalar_t icCenterX,
140- typename mesh_t ::scalar_t icCenterY)
130+ const std::unordered_map<std::string, typename mesh_t ::scalar_t > & userParams)
141131{
142132
143- return RetType (impladvdiff2d::TagBurgersPeriodic{},
144- meshObj,
133+ // only one IC for now
134+ int icFlag = 1 ;
135+
136+ using scalar_t = typename mesh_t ::scalar_t ;
137+ auto physParamsVec = impladvdiff2d::defaultPhysicalParams<scalar_t >;
138+ auto icParamsVec = impladvdiff2d::defaultInitCondParams<scalar_t >;
139+ impladvdiff2d::replace_params_from_map_if_present (physParamsVec, icParamsVec, problemEnum, icFlag, userParams);
140+
141+ return RetType (meshObj,
142+ problemEnum,
143+ inviscidFluxRecEnum,
144+ InviscidFluxScheme::Rusanov,
145+ viscFluxRecEnum,
146+ icParamsVec,
147+ physParamsVec);
148+ }
149+
150+ // repeat above with default viscous flux scheme and icFlag to fit other problems
151+ template <
152+ class mesh_t ,
153+ class RetType = PublicProblemEigenMixinCpp<impladvdiff2d::EigenApp<mesh_t >>
154+ >
155+ RetType
156+ create_problem_eigen (const mesh_t & meshObj,
157+ AdvectionDiffusion2d problemEnum,
158+ InviscidFluxReconstruction inviscidFluxRecEnum,
159+ int icFlag,
160+ const std::unordered_map<std::string, typename mesh_t ::scalar_t > & userParams)
161+ {
162+
163+ // defaults
164+ ViscousFluxReconstruction viscFluxRecEnum = ViscousFluxReconstruction::FirstOrder;
165+ icFlag = 1 ;
166+
167+ using scalar_t = typename mesh_t ::scalar_t ;
168+ auto physParamsVec = impladvdiff2d::defaultPhysicalParams<scalar_t >;
169+ auto icParamsVec = impladvdiff2d::defaultInitCondParams<scalar_t >;
170+ impladvdiff2d::replace_params_from_map_if_present (physParamsVec, icParamsVec, problemEnum, icFlag, userParams);
171+
172+ return RetType (meshObj,
173+ problemEnum,
145174 inviscidFluxRecEnum,
146175 InviscidFluxScheme::Rusanov,
147176 viscFluxRecEnum,
148- icPulseMagnitude, icSpread, diffusion ,
149- icCenterX, icCenterY );
177+ icParamsVec ,
178+ physParamsVec );
150179}
151180
181+ //
182+ // custom BCs
183+ //
184+
185+ #if !defined PRESSIODEMOAPPS_ENABLE_BINDINGS
186+ template <class mesh_t , class BCsFuncL , class BCsFuncF , class BCsFuncR , class BCsFuncB >
187+ auto create_problem_eigen (const mesh_t & meshObj,
188+ AdvectionDiffusion2d problemEnum,
189+ InviscidFluxReconstruction inviscidFluxRecEnum,
190+ BCsFuncL && BCsLeft,
191+ BCsFuncF && BCsFront,
192+ BCsFuncR && BCsRight,
193+ BCsFuncB && BCsBack,
194+ const int icFlag = 1 )
195+ {
196+
197+ // default viscous flux order
198+ // TODO: generalize
199+ ViscousFluxReconstruction viscFluxRecEnum = ViscousFluxReconstruction::FirstOrder;
200+
201+ using BCFunctorsHolderType = impl::CustomBCsHolder<BCsFuncL, BCsFuncF, BCsFuncR, BCsFuncB>;
202+ BCFunctorsHolderType bcFuncs (std::forward<BCsFuncL>(BCsLeft),
203+ std::forward<BCsFuncF>(BCsFront),
204+ std::forward<BCsFuncR>(BCsRight),
205+ std::forward<BCsFuncB>(BCsBack));
206+
207+ using scalar_t = typename mesh_t ::scalar_t ;
208+ const auto defaultPhsParams = impladvdiff2d::defaultPhysicalParams<scalar_t >;
209+ const auto defaultICParams = impladvdiff2d::defaultInitCondParams<scalar_t >;
210+
211+ using return_type = PublicProblemEigenMixinCpp<impladvdiff2d::EigenApp<mesh_t , BCFunctorsHolderType>>;
212+ return return_type (meshObj,
213+ problemEnum,
214+ inviscidFluxRecEnum,
215+ InviscidFluxScheme::Rusanov,
216+ viscFluxRecEnum,
217+ std::move (bcFuncs),
218+ defaultPhsParams,
219+ defaultICParams);
220+
221+ }
222+ #endif
223+
224+ #if !defined PRESSIODEMOAPPS_ENABLE_BINDINGS
225+ template <class mesh_t , class BCsFuncL , class BCsFuncF , class BCsFuncR , class BCsFuncB >
226+ auto create_problem_eigen (const mesh_t & meshObj,
227+ AdvectionDiffusion2d problemEnum,
228+ InviscidFluxReconstruction inviscidFluxRecEnum,
229+ BCsFuncL && BCsLeft,
230+ BCsFuncF && BCsFront,
231+ BCsFuncR && BCsRight,
232+ BCsFuncB && BCsBack,
233+ const int icFlag,
234+ const std::unordered_map<std::string, typename mesh_t ::scalar_t > & userParams)
235+ {
236+
237+ // default viscous flux order
238+ // TODO: generalize
239+ ViscousFluxReconstruction viscFluxRecEnum = ViscousFluxReconstruction::FirstOrder;
240+
241+ using BCFunctorsHolderType = impl::CustomBCsHolder<BCsFuncL, BCsFuncF, BCsFuncR, BCsFuncB>;
242+ BCFunctorsHolderType bcFuncs (std::forward<BCsFuncL>(BCsLeft),
243+ std::forward<BCsFuncF>(BCsFront),
244+ std::forward<BCsFuncR>(BCsRight),
245+ std::forward<BCsFuncB>(BCsBack));
246+
247+ using scalar_t = typename mesh_t ::scalar_t ;
248+ auto physParamsVec = impladvdiff2d::defaultPhysicalParams<scalar_t >;
249+ auto icParamsVec = impladvdiff2d::defaultInitCondParams<scalar_t >;
250+ impladvdiff2d::replace_params_from_map_if_present (physParamsVec, icParamsVec, problemEnum, icFlag, userParams);
251+
252+ using return_type = PublicProblemEigenMixinCpp<impladvdiff2d::EigenApp<mesh_t , BCFunctorsHolderType>>;
253+ return return_type (meshObj,
254+ problemEnum,
255+ inviscidFluxRecEnum,
256+ InviscidFluxScheme::Rusanov,
257+ viscFluxRecEnum,
258+ std::move (bcFuncs),
259+ icParamsVec,
260+ physParamsVec);
261+ }
262+ #endif
263+
152264} // end namespace pressiodemoapps
153265#endif
0 commit comments