Skip to content

Commit c5fa7dc

Browse files
authored
Merge pull request #3 from pkestene/fix/mhd-cfl-bug
Fix cfl computation for MHD.
2 parents 5df3619 + b47d43e commit c5fa7dc

File tree

5 files changed

+50
-58
lines changed

5 files changed

+50
-58
lines changed

src/muscl/MHDRunFunctors2D.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class ComputeDtFunctor2D_MHD : public MHDBaseFunctor2D
2323

2424
// static method which does it all: create and execute functor
2525
static void
26-
apply(HydroParams params, DataArray2d Udata, real_t & invDt)
26+
apply(HydroParams params, DataArray2d Qdata, real_t & invDt)
2727
{
28-
ComputeDtFunctor2D_MHD functor(params, Udata);
28+
ComputeDtFunctor2D_MHD functor(params, Qdata);
2929
Kokkos::Max<real_t> reducer(invDt);
3030
Kokkos::parallel_reduce(
3131
"ComputeDtFunctor2D_MHD",

src/muscl/MHDRunFunctors3D.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class ComputeDtFunctor3D_MHD : public MHDBaseFunctor3D
2323

2424
// static method which does it all: create and execute functor
2525
static void
26-
apply(HydroParams params, DataArray3d Udata, real_t & invDt)
26+
apply(HydroParams params, DataArray3d Qdata, real_t & invDt)
2727
{
28-
ComputeDtFunctor3D_MHD functor(params, Udata);
28+
ComputeDtFunctor3D_MHD functor(params, Qdata);
2929
Kokkos::Max<real_t> reducer(invDt);
3030
Kokkos::parallel_reduce(Kokkos::MDRangePolicy<Kokkos::Rank<3>>(
3131
{ 0, 0, 0 }, { params.isize, params.jsize, params.ksize }),

src/muscl/SolverHydroMuscl.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
#include <cstdio>
33
#include <cstdbool>
44
#include <iostream> // for std::cout
5-
#include <sstream>
6-
#include <fstream>
7-
#include <algorithm>
85

96
#include "muscl/SolverHydroMuscl.h"
107
#include "shared/HydroParams.h"

src/muscl/SolverMHDMuscl.cpp

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -372,15 +372,9 @@ SolverMHDMuscl<3>::computeEmfAndUpdate(real_t dt, DataArray Udata)
372372
// ///////////////////////////////////////////
373373
template <>
374374
void
375-
SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt)
375+
SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out)
376376
{
377377

378-
real_t dtdx;
379-
real_t dtdy;
380-
381-
dtdx = dt / params.dx;
382-
dtdy = dt / params.dy;
383-
384378
// fill ghost cell in data_in
385379
timers[TIMER_BOUNDARIES]->start();
386380
make_boundaries(data_in);
@@ -396,17 +390,25 @@ SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
396390
// convert conservative variable into primitives ones for the entire domain
397391
convertToPrimitives(data_in);
398392

393+
// compute new dt
394+
timers[TIMER_DT]->start();
395+
compute_dt();
396+
timers[TIMER_DT]->stop();
397+
398+
const auto dtdx = m_dt / params.dx;
399+
const auto dtdy = m_dt / params.dy;
400+
399401
if (params.implementationVersion == 0)
400402
{
401403

402404
// trace computation: fill arrays qm_x, qm_y, qp_x, qp_y
403-
computeTrace(data_in, dt);
405+
computeTrace(data_in, m_dt);
404406

405407
// Compute flux via Riemann solver and update (time integration)
406-
computeFluxesAndStore(dt);
408+
computeFluxesAndStore(m_dt);
407409

408410
// Compute Emf
409-
computeEmfAndStore(dt);
411+
computeEmfAndStore(m_dt);
410412

411413
// actual update with fluxes
412414
UpdateFunctor2D_MHD::apply(params, data_out, Fluxes_x, Fluxes_y, dtdx, dtdy);
@@ -417,13 +419,13 @@ SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
417419
else if (params.implementationVersion == 1)
418420
{
419421
// trace computation: fill arrays qm_x, qm_y, qp_x, qp_y
420-
computeTrace(data_in, dt);
422+
computeTrace(data_in, m_dt);
421423

422424
// Compute flux via Riemann solver and update (time integration)
423-
computeFluxesAndUpdate(dt, data_out);
425+
computeFluxesAndUpdate(m_dt, data_out);
424426

425427
// Compute Emf and update magnetic field
426-
computeEmfAndUpdate(dt, data_out);
428+
computeEmfAndUpdate(m_dt, data_out);
427429
}
428430
else if (params.implementationVersion == 2)
429431
{
@@ -462,13 +464,9 @@ SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
462464
// ///////////////////////////////////////////
463465
template <>
464466
void
465-
SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt)
467+
SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out)
466468
{
467469

468-
const real_t dtdx = dt / params.dx;
469-
const real_t dtdy = dt / params.dy;
470-
const real_t dtdz = dt / params.dz;
471-
472470
// fill ghost cell in data_in
473471
timers[TIMER_BOUNDARIES]->start();
474472
make_boundaries(data_in);
@@ -484,6 +482,15 @@ SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
484482
// convert conservative variable into primitives ones for the entire domain
485483
convertToPrimitives(data_in);
486484

485+
// compute new dt
486+
timers[TIMER_DT]->start();
487+
compute_dt();
488+
timers[TIMER_DT]->stop();
489+
490+
const auto dtdx = m_dt / params.dx;
491+
const auto dtdy = m_dt / params.dy;
492+
const auto dtdz = m_dt / params.dz;
493+
487494
if (params.implementationVersion == 0)
488495
{
489496

@@ -494,13 +501,13 @@ SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
494501
computeMagSlopes(data_in);
495502

496503
// trace computation: fill arrays qm_x, qm_y, qm_z, qp_x, qp_y, qp_z
497-
computeTrace(data_in, dt);
504+
computeTrace(data_in, m_dt);
498505

499506
// Compute flux via Riemann solver and update (time integration)
500-
computeFluxesAndStore(dt);
507+
computeFluxesAndStore(m_dt);
501508

502509
// Compute Emf
503-
computeEmfAndStore(dt);
510+
computeEmfAndStore(m_dt);
504511

505512
// actual update with fluxes
506513
UpdateFunctor3D_MHD::apply(params, data_out, Fluxes_x, Fluxes_y, Fluxes_z, dtdx, dtdy, dtdz);
@@ -517,13 +524,13 @@ SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, r
517524
computeMagSlopes(data_in);
518525

519526
// trace computation: fill arrays qm_x, qm_y, qm_z, qp_x, qp_y, qp_z
520-
computeTrace(data_in, dt);
527+
computeTrace(data_in, m_dt);
521528

522529
// Compute flux via Riemann solver and update (time integration)
523-
computeFluxesAndUpdate(dt, data_out);
530+
computeFluxesAndUpdate(m_dt, data_out);
524531

525532
// Compute Emf and update magnetic field
526-
computeEmfAndUpdate(dt, data_out);
533+
computeEmfAndUpdate(m_dt, data_out);
527534
}
528535
else if (params.implementationVersion == 2)
529536
{

src/muscl/SolverMHDMuscl.h

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@
1010
#include <cstdio>
1111
#include <cstdbool>
1212
#include <iostream>
13-
#include <sstream>
14-
#include <fstream>
15-
#include <algorithm>
1613

1714
// shared
1815
#include "shared/SolverBase.h"
@@ -165,10 +162,10 @@ class SolverMHDMuscl : public ppkMHD::SolverBase
165162

166163
//! numerical scheme
167164
void
168-
godunov_unsplit(real_t dt);
165+
godunov_unsplit();
169166

170167
void
171-
godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt);
168+
godunov_unsplit_impl(DataArray data_in, DataArray data_out);
172169

173170
void
174171
convertToPrimitives(DataArray Udata);
@@ -398,6 +395,9 @@ SolverMHDMuscl<dim>::SolverMHDMuscl(HydroParams & params, ConfigMap & configMap)
398395
// copy U into U2
399396
Kokkos::deep_copy(U2, U);
400397

398+
// primitive variables are necessary for computing time step
399+
convertToPrimitives(U);
400+
401401
// compute initialize time step
402402
compute_dt();
403403

@@ -724,22 +724,15 @@ double
724724
SolverMHDMuscl<dim>::compute_dt_local()
725725
{
726726

727-
real_t dt;
728-
real_t invDt = ZERO_F;
729-
DataArray Udata;
730-
731-
// which array is the current one ?
732-
if (m_iteration % 2 == 0)
733-
Udata = U;
734-
else
735-
Udata = U2;
727+
real_t dt;
728+
real_t invDt = ZERO_F;
736729

737730
// alias to actual device functor
738731
using ComputeDtFunctor =
739732
typename std::conditional<dim == 2, ComputeDtFunctor2D_MHD, ComputeDtFunctor3D_MHD>::type;
740733

741734
// call device functor
742-
ComputeDtFunctor::apply(params, Udata, invDt);
735+
ComputeDtFunctor::apply(params, Q, invDt);
743736

744737
dt = params.settings.cfl / invDt;
745738

@@ -785,13 +778,8 @@ SolverMHDMuscl<dim>::next_iteration_impl()
785778
} // end output
786779
} // end enable output
787780

788-
// compute new dt
789-
timers[TIMER_DT]->start();
790-
compute_dt();
791-
timers[TIMER_DT]->stop();
792-
793781
// perform one step integration
794-
godunov_unsplit(m_dt);
782+
godunov_unsplit();
795783

796784
} // SolverMHDMuscl::next_iteration_impl
797785

@@ -802,16 +790,16 @@ SolverMHDMuscl<dim>::next_iteration_impl()
802790
// ///////////////////////////////////////////
803791
template <int dim>
804792
void
805-
SolverMHDMuscl<dim>::godunov_unsplit(real_t dt)
793+
SolverMHDMuscl<dim>::godunov_unsplit()
806794
{
807795

808796
if (m_iteration % 2 == 0)
809797
{
810-
godunov_unsplit_impl(U, U2, dt);
798+
godunov_unsplit_impl(U, U2);
811799
}
812800
else
813801
{
814-
godunov_unsplit_impl(U2, U, dt);
802+
godunov_unsplit_impl(U2, U);
815803
}
816804

817805
} // SolverMHDMuscl::godunov_unsplit
@@ -823,7 +811,7 @@ SolverMHDMuscl<dim>::godunov_unsplit(real_t dt)
823811
// ///////////////////////////////////////////
824812
template <int dim>
825813
void
826-
SolverMHDMuscl<dim>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt)
814+
SolverMHDMuscl<dim>::godunov_unsplit_impl(DataArray data_in, DataArray data_out)
827815
{
828816

829817
// 2d / 3d implementation are specialized
@@ -833,12 +821,12 @@ SolverMHDMuscl<dim>::godunov_unsplit_impl(DataArray data_in, DataArray data_out,
833821
// 2d
834822
template <>
835823
void
836-
SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt);
824+
SolverMHDMuscl<2>::godunov_unsplit_impl(DataArray data_in, DataArray data_out);
837825

838826
// 3d
839827
template <>
840828
void
841-
SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out, real_t dt);
829+
SolverMHDMuscl<3>::godunov_unsplit_impl(DataArray data_in, DataArray data_out);
842830

843831

844832
// =======================================================

0 commit comments

Comments
 (0)