Skip to content

Commit 4a783de

Browse files
authored
Merge pull request #169 from Pressio/burgers2d_outflow
Adds non-periodic ("outflow") case for 2D Burgers'
2 parents 10d5a75 + 0f7bff7 commit 4a783de

22 files changed

+3974
-217
lines changed

.github/workflows/test-all.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,11 @@ jobs:
4646

4747
- name: Install packages
4848
run: |
49+
echo "deb http://security.ubuntu.com/ubuntu focal-security main" | sudo tee /etc/apt/sources.list.d/focal-security.list
4950
sudo apt-get update
51+
sudo apt-get install libssl1.1
5052
sudo apt-get install -y --install-suggests $APT_PACKAGES
53+
sudo rm /etc/apt/sources.list.d/focal-security.list
5154
5255
- name: Install CMake
5356
run: |
@@ -93,7 +96,7 @@ jobs:
9396
-DCMAKE_BUILD_TYPE:STRING=${{ matrix.config.mode }} \
9497
-DPRESSIODEMOAPPS_ENABLE_TESTS:BOOL=ON \
9598
-DPRESSIODEMOAPPS_ENABLE_BINDINGS:BOOL=OFF \
96-
-DCMAKE_CXX_FLAGS="-Wall -Werror" \
99+
-DCMAKE_CXX_FLAGS="-Wall -Wno-unused-but-set-variable -Werror" \
97100
-B $BUILD_DIR -S $DEMOAPPS_HOME
98101
99102
# NOTE: -j2 caused g++ crash (out of memory)

docs/source/burgers_2d_periodic.rst

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,12 @@ C++ synopsis
5959

6060
const auto meshObj = pda::load_cellcentered_uniform_mesh_eigen("path-to-mesh");
6161

62+
const auto probId = pda::AdvectionDiffusion2d::BurgersPeriodic;
6263
const auto inviscidScheme = pda::InviscidFluxReconstruction::FirstOrder; // or Weno3, Weno5
6364
const auto viscousScheme = pda::ViscousFluxReconstruction::FirstOrder; // must be FirstOrder
6465

6566
// A. constructor for problem using default values
6667
{
67-
const auto probId = pda::AdvectionDiffusion2d::BurgersPeriodic;
6868
auto problem = pda::create_problem_eigen(meshObj, probId, inviscidScheme, viscousScheme);
6969
}
7070

@@ -76,9 +76,9 @@ C++ synopsis
7676
const auto D = /* something */;
7777
const auto x0 = /* something */;
7878
const auto y0 = /* something */;
79-
auto problem = pda::create_periodic_burgers_2d_problem_eigen(meshObj, inviscidScheme,
80-
viscousScheme, alpha,
81-
delta, D, x0, y0)
79+
auto problem = pda::create_problem_eigen(meshObj, probId, inviscidScheme,
80+
viscousScheme, alpha,
81+
delta, D, x0, y0)
8282
}
8383
}
8484
@@ -91,11 +91,11 @@ Python synopsis
9191
9292
meshObj = pda.load_cellcentered_uniform_mesh("path-to-mesh")
9393
94+
probId = pda.AdvectionDiffusion2d.BurgersPeriodic
9495
inviscidScheme = pda.InviscidFluxReconstruction.FirstOrder; # or Weno3, Weno5
9596
viscousScheme = pda.ViscousFluxReconstruction.FirstOrder; # must be FirstOrder
9697
9798
# A. constructor for problem using default values
98-
probId = pda.AdvectionDiffusion2d.BurgersPeriodic
9999
problem = pda.create_problem(meshObj, probId, inviscidScheme, viscousScheme)
100100
101101
# B. setting custom coefficients
@@ -104,9 +104,9 @@ Python synopsis
104104
D = # something
105105
x0 = # something
106106
y0 = # something
107-
problem = pda.create_periodic_burgers_2d_problem(meshObj, inviscidScheme,
108-
viscousScheme, alpha,
109-
delta, D, x0, y0)
107+
problem = pda.create_burgers_2d_problem(meshObj, probId, inviscidScheme,
108+
viscousScheme, alpha,
109+
delta, D, x0, y0)
110110
111111
112112
Sample Plot

include/pressiodemoapps/advection_diffusion2d.hpp

Lines changed: 144 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
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
// ----------------------------------------------------------
6465
enum 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<
126119
RetType
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

include/pressiodemoapps/impl/advection_diffusion_2d_flux_mixin.hpp

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,10 @@ struct ComputeDirectionalFluxValues : Parent
9393
switch(m_fluxEnum)
9494
{
9595
case ::pressiodemoapps::InviscidFluxScheme::Rusanov:
96-
if (m_probEn == ::pressiodemoapps::AdvectionDiffusion2d::BurgersPeriodic)
97-
{
98-
burgers_rusanov_flux_2d<scalar_type>(m_fluxL, uMinusHalfNeg,
99-
uMinusHalfPos, m_normal);
100-
burgers_rusanov_flux_2d<scalar_type>(m_fluxR, uPlusHalfNeg,
101-
uPlusHalfPos, m_normal);
102-
}
96+
burgers_rusanov_flux_2d<scalar_type>(m_fluxL, uMinusHalfNeg,
97+
uMinusHalfPos, m_normal);
98+
burgers_rusanov_flux_2d<scalar_type>(m_fluxR, uPlusHalfNeg,
99+
uPlusHalfPos, m_normal);
103100
break;
104101
}
105102
}
@@ -154,15 +151,12 @@ struct ComputeDirectionalFluxJacobians : Parent
154151
{
155152

156153
case ::pressiodemoapps::InviscidFluxScheme::Rusanov:
157-
if (m_probEn == ::pressiodemoapps::AdvectionDiffusion2d::BurgersPeriodic)
158-
{
159-
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacLNeg, m_fluxJacLPos,
160-
uMinusHalfNeg, uMinusHalfPos,
161-
m_normal);
162-
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacRNeg, m_fluxJacRPos,
163-
uPlusHalfNeg, uPlusHalfPos,
164-
m_normal);
165-
}
154+
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacLNeg, m_fluxJacLPos,
155+
uMinusHalfNeg, uMinusHalfPos,
156+
m_normal);
157+
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacRNeg, m_fluxJacRPos,
158+
uPlusHalfNeg, uPlusHalfPos,
159+
m_normal);
166160
break;
167161
}
168162
}
@@ -223,18 +217,15 @@ struct ComputeDirectionalFluxValuesAndJacobians : Parent
223217
switch(m_fluxEnum)
224218
{
225219
case ::pressiodemoapps::InviscidFluxScheme::Rusanov:
226-
if (m_probEn == ::pressiodemoapps::AdvectionDiffusion2d::BurgersPeriodic)
227-
{
228-
burgers_rusanov_flux_2d<scalar_type>(m_fluxL, uMinusHalfNeg, uMinusHalfPos, m_normal);
229-
burgers_rusanov_flux_2d<scalar_type>(m_fluxR, uPlusHalfNeg, uPlusHalfPos, m_normal);
230-
231-
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacLNeg, m_fluxJacLPos,
232-
uMinusHalfNeg, uMinusHalfPos,
233-
m_normal);
234-
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacRNeg, m_fluxJacRPos,
235-
uPlusHalfNeg, uPlusHalfPos,
236-
m_normal);
237-
}
220+
burgers_rusanov_flux_2d<scalar_type>(m_fluxL, uMinusHalfNeg, uMinusHalfPos, m_normal);
221+
burgers_rusanov_flux_2d<scalar_type>(m_fluxR, uPlusHalfNeg, uPlusHalfPos, m_normal);
222+
223+
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacLNeg, m_fluxJacLPos,
224+
uMinusHalfNeg, uMinusHalfPos,
225+
m_normal);
226+
burgers_rusanov_flux_jacobian_2d<scalar_type>(m_fluxJacRNeg, m_fluxJacRPos,
227+
uPlusHalfNeg, uPlusHalfPos,
228+
m_normal);
238229
break;
239230
}
240231
}

0 commit comments

Comments
 (0)