LCOV - code coverage report
Current view: top level - src/Integrator - Hydro.cpp (source / functions) Coverage Total Hit
Test: coverage_merged.info Lines: 81.3 % 402 327
Test Date: 2025-12-10 23:45:13 Functions: 66.7 % 24 16

            Line data    Source code
       1              : 
       2              : #include "Hydro.H"
       3              : #include "AMReX_MultiFab.H"
       4              : #include "IO/ParmParse.H"
       5              : #include "BC/Constant.H"
       6              : #include "BC/Expression.H"
       7              : #include "Numeric/Stencil.H"
       8              : #include "IC/Constant.H"
       9              : #include "IC/Laminate.H"
      10              : #include "IC/Expression.H"
      11              : #include "IC/BMP.H"
      12              : #include "IC/PNG.H"
      13              : #include "Solver/Local/Riemann/Roe.H"
      14              : #include "Solver/Local/Riemann/HLLE.H"
      15              : #include "Solver/Local/Riemann/HLLC.H"
      16              : 
      17              : #include "AMReX_TimeIntegrator.H"
      18              : 
      19              : #if AMREX_SPACEDIM == 2
      20              : 
      21              : namespace Integrator
      22              : {
      23              : 
      24            7 : Hydro::Hydro(IO::ParmParse& pp) : Hydro()
      25              : {
      26            7 :     pp_queryclass(*this);
      27            7 : }
      28              : 
      29              : void
      30            7 : Hydro::Parse(Hydro& value, IO::ParmParse& pp)
      31              : {
      32              :     BL_PROFILE("Integrator::Hydro::Hydro()");
      33              :     {
      34              :         // pp.query_default("r_refinement_criterion",     value.r_refinement_criterion    , 0.01);
      35              :         // energy-based refinement
      36              :         // pp.query_default("e_refinement_criterion",     value.e_refinement_criterion    , 0.01);
      37              :         // momentum-based refinement
      38              :         // pp.query_default("m_refinement_criterion",     value.m_refinement_criterion    , 0.01);
      39              : 
      40           21 :         pp.forbid("scheme","use integration.type instead");
      41              : 
      42              :         // eta-based refinement
      43           14 :         pp.query_default("eta_refinement_criterion",   value.eta_refinement_criterion  , 0.01);
      44              :         // vorticity-based refinement
      45           14 :         pp.query_default("omega_refinement_criterion", value.omega_refinement_criterion, 0.01);
      46              :         // velocity gradient-based refinement
      47           14 :         pp.query_default("gradu_refinement_criterion", value.gradu_refinement_criterion, 0.01);
      48              :         // pressure-based refinement
      49           14 :         pp.query_default("p_refinement_criterion", value.p_refinement_criterion, 1e100);
      50              :         // density-based refinement
      51           14 :         pp.query_default("rho_refinement_criterion", value.rho_refinement_criterion, 1e100);
      52              : 
      53           14 :         pp_query_required("gamma", value.gamma); // gamma for gamma law
      54           14 :         pp_query_required("cfl", value.cfl); // cfl condition
      55           14 :         pp_query_default("cfl_v", value.cfl_v,1E100); // cfl condition
      56           21 :         pp_query_required("mu", value.mu); // linear viscosity coefficient
      57           28 :         pp_forbid("Lfactor","replaced with mu");
      58              :         //pp_query_default("Lfactor", value.Lfactor,1.0); // (to be removed) test factor for viscous source
      59           21 :         pp_forbid("Pfactor","replaced with mu");
      60              :         //pp_query_default("Pfactor", value.Pfactor,1.0); // (to be removed) test factor for viscous source
      61           21 :         pp_query_default("pref", value.pref,1.0); // reference pressure for Roe solver
      62              : 
      63           28 :         pp_forbid("rho.bc","--> density.bc");
      64           28 :         pp_forbid("p.bc","--> pressure.bc");
      65           28 :         pp_forbid("v.bc", "--> velocity.bc");
      66           28 :         pp_forbid("pressure.bc","--> energy.bc");
      67           21 :         pp_forbid("velocity.bc","--> momentum.bc");
      68              : 
      69              :         // Boundary condition for density
      70           14 :         pp.select_default<BC::Constant,BC::Expression>("density.bc",value.density_bc,1);
      71              :         // Boundary condition for energy
      72           14 :         pp.select_default<BC::Constant,BC::Expression>("energy.bc",value.energy_bc,1);
      73              :         // Boundary condition for momentum
      74           14 :         pp.select_default<BC::Constant,BC::Expression>("momentum.bc",value.momentum_bc,2);
      75              :         // Boundary condition for phase field order parameter
      76           14 :         pp.select_default<BC::Constant,BC::Expression>("pf.eta.bc",value.eta_bc,1);
      77              : 
      78           14 :         pp_query_default("small",value.small,1E-8); // small regularization value
      79           14 :         pp_query_default("cutoff",value.cutoff,-1E100); // cutoff value
      80           21 :         pp_query_default("lagrange",value.lagrange,0.0); // lagrange no-penetration factor
      81              : 
      82           21 :         pp_forbid("roefix","--> solver.roe.entropy_fix"); // Roe solver entropy fix
      83              : 
      84              :     }
      85              :     // Register FabFields:
      86              :     {
      87            7 :         int nghost = 1;
      88              : 
      89           21 :         value.RegisterNewFab(value.eta_mf,     value.eta_bc, 1, nghost, "eta",     true, true);
      90           21 :         value.RegisterNewFab(value.eta_old_mf, value.eta_bc, 1, nghost, "eta_old", true, true);
      91           21 :         value.RegisterNewFab(value.etadot_mf,  value.eta_bc, 1, nghost, "etadot",  true, false);
      92              : 
      93           21 :         value.RegisterNewFab(value.density_mf,     value.density_bc, 1, nghost, "density",     true , true);
      94           21 :         value.RegisterNewFab(value.density_old_mf, value.density_bc, 1, nghost, "density_old", false, true);
      95              : 
      96           21 :         value.RegisterNewFab(value.energy_mf,     value.energy_bc, 1, nghost, "energy",      true ,true);
      97           21 :         value.RegisterNewFab(value.energy_old_mf, value.energy_bc, 1, nghost, "energy_old" , false, true);
      98              : 
      99           28 :         value.RegisterNewFab(value.momentum_mf,     value.momentum_bc, 2, nghost, "momentum",     true ,true, {"x","y"});
     100           21 :         value.RegisterNewFab(value.momentum_old_mf, value.momentum_bc, 2, nghost, "momentum_old", false, true);
     101              :  
     102           21 :         value.RegisterNewFab(value.pressure_mf,  &value.bc_nothing, 1, nghost, "pressure",  true, false);
     103           28 :         value.RegisterNewFab(value.velocity_mf,  &value.bc_nothing, 2, nghost, "velocity",  true, false,{"x","y"});
     104           21 :         value.RegisterNewFab(value.vorticity_mf, &value.bc_nothing, 1, nghost, "vorticity", true, false);
     105              : 
     106           21 :         value.RegisterNewFab(value.m0_mf,           &value.bc_nothing, 1, 0, "m0",  true, false);
     107           28 :         value.RegisterNewFab(value.u0_mf,           &value.bc_nothing, 2, 0, "u0",  true, false, {"x","y"});
     108           28 :         value.RegisterNewFab(value.q_mf,            &value.bc_nothing, 2, 0, "q",   true, false, {"x","y"});
     109              : 
     110           28 :         value.RegisterNewFab(value.solid.momentum_mf, &value.neumann_bc_D, 2, nghost, "solid.momentum", true, false, {"x","y"});
     111           21 :         value.RegisterNewFab(value.solid.density_mf,  &value.neumann_bc_1,  1, nghost, "solid.density", true, false);
     112           21 :         value.RegisterNewFab(value.solid.energy_mf,   &value.neumann_bc_1, 1, nghost, "solid.energy",   true, false);
     113              : 
     114           21 :         value.RegisterNewFab(value.Source_mf, &value.bc_nothing, 4, 0, "Source", true, false);
     115              :     }
     116              : 
     117           28 :     pp_forbid("Velocity.ic.type", "--> velocity.ic.type");
     118           28 :     pp_forbid("Pressure.ic", "--> pressure.ic");
     119           28 :     pp_forbid("SolidMomentum.ic", "--> solid.momentum.ic");
     120           28 :     pp_forbid("SolidDensity.ic.type", "--> solid.density.ic.type");
     121           28 :     pp_forbid("SolidEnergy.ic.type", "--> solid.energy.ic.type");
     122           28 :     pp_forbid("Density.ic.type", "--> density.ic.type");
     123           28 :     pp_forbid("rho_injected.ic.type","no longer using rho_injected use m0 instead");
     124           21 :     pp.forbid("mdot.ic.type", "replace mdot with u0");
     125              : 
     126              : 
     127              :     // ORDER PARAMETER
     128              : 
     129              :     // eta initial condition
     130           14 :     pp.select_default<IC::Constant,IC::Laminate,IC::Expression,IC::BMP,IC::PNG>("eta.ic",value.eta_ic,value.geom);
     131              : 
     132              :     // PRIMITIVE FIELD INITIAL CONDITIONS
     133              : 
     134              :     // velocity initial condition
     135           14 :     pp.select_default<IC::Constant,IC::Expression>("velocity.ic",value.velocity_ic,value.geom);
     136              :     // solid pressure initial condition
     137           14 :     pp.select_default<IC::Constant,IC::Expression>("pressure.ic",value.pressure_ic,value.geom);
     138              :     // density initial condition type
     139           14 :     pp.select_default<IC::Constant,IC::Expression>("density.ic",value.density_ic,value.geom);
     140              : 
     141              : 
     142              :     // SOLID FIELDS
     143              : 
     144              :     // solid momentum initial condition
     145           14 :     pp.select_default<IC::Constant,IC::Expression>("solid.momentum.ic",value.solid.momentum_ic,value.geom);
     146              :     // solid density initial condition
     147           14 :     pp.select_default<IC::Constant,IC::Expression>("solid.density.ic",value.solid.density_ic,value.geom);
     148              :     // solid energy initial condition
     149           14 :     pp.select_default<IC::Constant,IC::Expression>("solid.energy.ic",value.solid.energy_ic,value.geom);
     150              : 
     151              : 
     152              :     // DIFFUSE BOUNDARY SOURCES
     153              : 
     154              :     // diffuse boundary prescribed mass flux 
     155           14 :     pp.select_default<IC::Constant,IC::Expression>("m0.ic",value.ic_m0,value.geom);
     156              :     // diffuse boundary prescribed velocity
     157           14 :     pp.select_default<IC::Constant,IC::Expression>("u0.ic",value.ic_u0,value.geom);
     158              :     // diffuse boundary prescribed heat flux 
     159           14 :     pp.select_default<IC::Constant,IC::Expression>("q.ic",value.ic_q,value.geom);
     160              : 
     161              :     // Riemann solver
     162              :     pp.select_default<  Solver::Local::Riemann::Roe,
     163              :                         Solver::Local::Riemann::HLLE,
     164           21 :                         Solver::Local::Riemann::HLLC>("solver",value.riemannsolver);
     165              : 
     166              : 
     167              : 
     168              :     bool allow_unused;
     169              :     // Set this to true to allow unused inputs without error.
     170              :     // (Not recommended.)
     171            7 :     pp.query_default("allow_unused",allow_unused,false);
     172            7 :     if (!allow_unused && pp.AnyUnusedInputs(true, false))
     173              :     {
     174            0 :         Util::Warning(INFO,"The following inputs were specified but not used:");
     175            0 :         pp.AllUnusedInputs();
     176            0 :         Util::Exception(INFO,"Aborting. Specify 'allow_unused=True` to ignore this error.");
     177              :     }
     178            7 : }
     179              : 
     180              : 
     181            7 : void Hydro::Initialize(int lev)
     182              : {
     183              :     BL_PROFILE("Integrator::Hydro::Initialize");
     184              :  
     185            7 :     eta_ic           ->Initialize(lev, eta_mf,     0.0);
     186            7 :     eta_ic           ->Initialize(lev, eta_old_mf, 0.0);
     187            7 :     etadot_mf[lev]   ->setVal(0.0);
     188              : 
     189              :     //flux_mf[lev]   ->setVal(0.0);
     190              : 
     191            7 :     velocity_ic      ->Initialize(lev, velocity_mf, 0.0);
     192            7 :     pressure_ic      ->Initialize(lev, pressure_mf, 0.0);
     193            7 :     density_ic       ->Initialize(lev, density_mf, 0.0);
     194              : 
     195            7 :     density_ic       ->Initialize(lev, density_old_mf, 0.0);
     196              : 
     197              : 
     198            7 :     solid.density_ic ->Initialize(lev, solid.density_mf, 0.0);
     199            7 :     solid.momentum_ic->Initialize(lev, solid.momentum_mf, 0.0);
     200            7 :     solid.energy_ic  ->Initialize(lev, solid.energy_mf, 0.0);
     201              : 
     202            7 :     ic_m0            ->Initialize(lev, m0_mf, 0.0);
     203            7 :     ic_u0            ->Initialize(lev, u0_mf,    0.0);
     204            7 :     ic_q             ->Initialize(lev, q_mf,            0.0);
     205              : 
     206            7 :     Source_mf[lev]   ->setVal(0.0);
     207              : 
     208            7 :     Mix(lev);
     209            7 : }
     210              : 
     211            7 : void Hydro::Mix(int lev)
     212              : {
     213           14 :     for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
     214              :     {
     215            7 :         const amrex::Box& bx = mfi.growntilebox();
     216              : 
     217            7 :         Set::Patch<const Set::Scalar> eta       = eta_mf.Patch(lev,mfi);
     218              : 
     219            7 :         Set::Patch<const Set::Scalar> v         = velocity_mf.Patch(lev,mfi);
     220            7 :         Set::Patch<const Set::Scalar> p         = pressure_mf.Patch(lev,mfi);
     221            7 :         Set::Patch<Set::Scalar>       rho       = density_mf.Patch(lev,mfi);
     222            7 :         Set::Patch<Set::Scalar>       rho_old   = density_old_mf.Patch(lev,mfi);
     223            7 :         Set::Patch<Set::Scalar>       M         = momentum_mf.Patch(lev,mfi);
     224            7 :         Set::Patch<Set::Scalar>       M_old     = momentum_old_mf.Patch(lev,mfi);
     225            7 :         Set::Patch<Set::Scalar>       E         = energy_mf.Patch(lev,mfi);
     226            7 :         Set::Patch<Set::Scalar>       E_old     = energy_old_mf.Patch(lev,mfi);
     227            7 :         Set::Patch<const Set::Scalar> rho_solid = solid.density_mf.Patch(lev,mfi);
     228            7 :         Set::Patch<const Set::Scalar> M_solid   = solid.momentum_mf.Patch(lev,mfi);
     229            7 :         Set::Patch<const Set::Scalar> E_solid   = solid.energy_mf.Patch(lev,mfi);
     230              : 
     231              : 
     232            7 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     233              :         {  
     234        95820 :             rho(i, j, k) = eta(i, j, k) * rho(i, j, k) + (1.0 - eta(i, j, k)) * rho_solid(i, j, k);
     235        38328 :             rho_old(i, j, k) = rho(i, j, k);
     236              : 
     237       114984 :             M(i, j, k, 0) = (rho(i, j, k)*v(i, j, k, 0))*eta(i, j, k)  +  M_solid(i, j, k, 0)*(1.0-eta(i, j, k));
     238       114984 :             M(i, j, k, 1) = (rho(i, j, k)*v(i, j, k, 1))*eta(i, j, k)  +  M_solid(i, j, k, 1)*(1.0-eta(i, j, k));
     239        38328 :             M_old(i, j, k, 0) = M(i, j, k, 0);
     240        38328 :             M_old(i, j, k, 1) = M(i, j, k, 1);
     241              : 
     242        38328 :             E(i, j, k) =
     243       134148 :                 (0.5 * (v(i, j, k, 0) * v(i, j, k, 0) + v(i, j, k, 1) * v(i, j, k, 1)) * rho(i, j, k) + p(i, j, k) / (gamma - 1.0)) * eta(i, j, k) 
     244        19164 :                 + 
     245        57492 :                 E_solid(i, j, k) * (1.0 - eta(i, j, k));
     246        38328 :             E_old(i, j, k) = E(i, j, k);
     247        19164 :         });
     248            7 :     }
     249            7 :     c_max = 0.0;
     250            7 :     vx_max = 0.0;
     251            7 :     vy_max = 0.0;
     252            7 : }
     253              : 
     254         4650 : void Hydro::UpdateEta(int lev, Set::Scalar time)
     255              : {
     256         4650 :     eta_ic->Initialize(lev, eta_mf, time);
     257         4650 : }
     258              : 
     259         4650 : void Hydro::TimeStepBegin(Set::Scalar, int /*iter*/)
     260              : {
     261              : 
     262         4650 : }
     263              : 
     264         4650 : void Hydro::TimeStepComplete(Set::Scalar, int lev)
     265              : {
     266         4650 :     if (dynamictimestep.on)
     267            0 :         Integrator::DynamicTimestep_Update();
     268         4650 :     return;
     269              : 
     270              :     const Set::Scalar* DX = geom[lev].CellSize();
     271              : 
     272              :     amrex::ParallelDescriptor::ReduceRealMax(c_max);
     273              :     amrex::ParallelDescriptor::ReduceRealMax(vx_max);
     274              :     amrex::ParallelDescriptor::ReduceRealMax(vy_max);
     275              : 
     276              :     Set::Scalar new_timestep = cfl / ((c_max + vx_max) / DX[0] + (c_max + vy_max) / DX[1]);
     277              : 
     278              :     Util::Assert(INFO, TEST(AMREX_SPACEDIM == 2));
     279              : 
     280              :     SetTimestep(new_timestep);
     281              : }
     282              : 
     283         4650 : void Hydro::Advance(int lev, Set::Scalar time, Set::Scalar dt)
     284              : {
     285              : 
     286         4650 :     std::swap(eta_old_mf, eta_mf);
     287         4650 :     std::swap(density_old_mf[lev],  density_mf[lev]);
     288         4650 :     std::swap(momentum_old_mf[lev], momentum_mf[lev]);
     289         4650 :     std::swap(energy_old_mf[lev],   energy_mf[lev]);
     290              :     
     291              :     //
     292              :     // UPDATE ETA AND CALCULATE ETADOT
     293              :     //
     294              : 
     295         4650 :     UpdateEta(lev, time);
     296         9300 :     for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
     297              :     {
     298         4650 :         const amrex::Box& bx = mfi.growntilebox();
     299         4650 :         amrex::Array4<const Set::Scalar> const& eta_new = (*eta_mf[lev]).array(mfi);
     300         4650 :         amrex::Array4<const Set::Scalar> const& eta = (*eta_old_mf[lev]).array(mfi);
     301         4650 :         amrex::Array4<Set::Scalar>       const& etadot = (*etadot_mf[lev]).array(mfi);
     302         4650 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     303              :         {
     304     41203800 :             etadot(i, j, k) = (eta_new(i, j, k) - eta(i, j, k)) / dt;
     305     13734600 :         });
     306         4650 :     }
     307              : 
     308              : 
     309              :     //
     310              :     // DO TIME INTEGRATION (driving the RHS function)
     311              :     //
     312              : 
     313              :     // Organize references to the "new" solution
     314         4650 :     amrex::Vector<amrex::MultiFab> solution_new; 
     315         4650 :     solution_new.emplace_back(*density_mf[lev].get(),amrex::MakeType::make_alias,0,1);
     316         4650 :     solution_new.emplace_back(*momentum_mf[lev].get(),amrex::MakeType::make_alias,0,2);
     317         4650 :     solution_new.emplace_back(*energy_mf[lev].get(),amrex::MakeType::make_alias,0,1);
     318              : 
     319              :     // Organize references to the "old" solution
     320         4650 :     amrex::Vector<amrex::MultiFab> solution_old;
     321         4650 :     solution_old.emplace_back(*density_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
     322         4650 :     solution_old.emplace_back(*momentum_old_mf[lev].get(),amrex::MakeType::make_alias,0,2);
     323         4650 :     solution_old.emplace_back(*energy_old_mf[lev].get(),amrex::MakeType::make_alias,0,1);
     324              : 
     325              :     // Create the time integrator
     326         4650 :     amrex::TimeIntegrator timeintegrator(solution_new, time);
     327              : 
     328              :     // Set the time integrator RHS - in this case, just relay to our current RHS function
     329         4650 :     timeintegrator.set_rhs([&](amrex::Vector<amrex::MultiFab> & rhs_mf, amrex::Vector<amrex::MultiFab> & solution_mf, const Set::Scalar time)
     330              :     {
     331         5650 :         RHS(lev, time,
     332              :             rhs_mf[0], rhs_mf[1], rhs_mf[2],
     333         5650 :             solution_mf[0],solution_mf[1],solution_mf[2]);
     334         5650 :     });
     335              : 
     336              :     // Take care of filling boundaries during stages
     337         4650 :     timeintegrator.set_post_stage_action([&](amrex::Vector<amrex::MultiFab> & stage_mf, Set::Scalar time) 
     338              :     {
     339         1000 :         density_bc->FillBoundary(stage_mf[0],0,1,time,0);   
     340         1000 :         stage_mf[0].FillBoundary(true);
     341         1000 :         momentum_bc->FillBoundary(stage_mf[1],0,2,time,0);  
     342         1000 :         stage_mf[1].FillBoundary(true);
     343         1000 :         energy_bc->FillBoundary(stage_mf[2],0,1,time,0);    
     344         1000 :         stage_mf[2].FillBoundary(true);
     345         1000 :     });
     346              :     
     347              :     // Do the update
     348         4650 :     timeintegrator.advance(solution_old, solution_new, time, dt);
     349              : 
     350              : 
     351              :     //
     352              :     // APPLY CUTOFFS AND DO DYNAMIC TIMESTEP CALCULATION
     353              :     //
     354              : 
     355         4650 :     Set::Scalar dt_max = std::numeric_limits<Set::Scalar>::max();
     356         9300 :     for (amrex::MFIter mfi(*eta_mf[lev], false); mfi.isValid(); ++mfi)
     357              :     {
     358         4650 :         const amrex::Box& bx = mfi.validbox();
     359         4650 :         const Set::Scalar* DX = geom[lev].CellSize();
     360              :         
     361         4650 :         Set::Patch<const Set::Scalar> eta = eta_mf.Patch(lev,mfi);
     362         4650 :         Set::Patch<const Set::Scalar> rho_solid = solid.density_mf.Patch(lev,mfi);
     363         4650 :         Set::Patch<const Set::Scalar> M_solid   = solid.momentum_mf.Patch(lev,mfi);
     364         4650 :         Set::Patch<const Set::Scalar> E_solid   = solid.energy_mf.Patch(lev,mfi);
     365              : 
     366         4650 :         Set::Patch<Set::Scalar> rho_new       = density_mf.Patch(lev,mfi);
     367         4650 :         Set::Patch<Set::Scalar> E_new         = energy_mf.Patch(lev,mfi);
     368         4650 :         Set::Patch<Set::Scalar> M_new         = momentum_mf.Patch(lev,mfi);
     369              : 
     370         4650 :         Set::Patch<Set::Scalar> omega         = vorticity_mf.Patch(lev,mfi);
     371              :         
     372         4650 :         Set::Patch<Set::Scalar> u = velocity_mf.Patch(lev,mfi);
     373         4650 :         Set::Patch<Set::Scalar> Source = Source_mf.Patch(lev,mfi);
     374              : 
     375         4650 :         Set::Scalar *dt_max_handle = &dt_max;
     376              : 
     377         4650 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     378              :         {   
     379     18278400 :             if (eta(i,j,k) < cutoff)
     380              :             {
     381            0 :                 rho_new(i,j,k,0) = rho_solid(i,j,k,0);
     382            0 :                 M_new(i,j,k,0)   = M_solid(i,j,k,0);
     383            0 :                 M_new(i,j,k,1)   = M_solid(i,j,k,1);
     384            0 :                 E_new(i,j,k,0)   = E_solid(i,j,k,0);
     385              :             }
     386              : 
     387      9139200 :             Set::Matrix gradu        = Numeric::Gradient(u, i, j, k, DX);
     388     18278400 :             omega(i, j, k) = eta(i, j, k) * (gradu(1,0) - gradu(0,1));
     389              : 
     390      9139200 :             if (dynamictimestep.on)
     391              :             {
     392            0 :                 *dt_max_handle =                          std::fabs(cfl * DX[0] / (u(i,j,k,0)*eta(i,j,k) + small));
     393            0 :                 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl * DX[1] / (u(i,j,k,1)*eta(i,j,k) + small)));
     394            0 :                 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[0]*DX[0] / (Source(i,j,k,1)+small)));
     395            0 :                 *dt_max_handle = std::min(*dt_max_handle, std::fabs(cfl_v * DX[1]*DX[1] / (Source(i,j,k,2)+small)));
     396              :             }
     397      9139200 :         });
     398         4650 :     }
     399              : 
     400              : 
     401         4650 :     if (dynamictimestep.on)
     402              :     {
     403            0 :         this->DynamicTimestep_SyncTimeStep(lev,dt_max);
     404              :     }
     405              : 
     406         4650 : }//end Advance
     407              : 
     408              : 
     409         5650 : void Hydro::RHS(int lev, Set::Scalar /*time*/, 
     410              :                 amrex::MultiFab &rho_rhs_mf, 
     411              :                 amrex::MultiFab &M_rhs_mf, 
     412              :                 amrex::MultiFab &E_rhs_mf,
     413              :                 const amrex::MultiFab &rho_mf,
     414              :                 const amrex::MultiFab &M_mf,
     415              :                 const amrex::MultiFab &E_mf)
     416              : {
     417              : 
     418        11300 :     for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi)
     419              :     {
     420         5650 :         const amrex::Box& bx = mfi.growntilebox();
     421         5650 :         amrex::Array4<const Set::Scalar> const& eta = (*eta_old_mf[lev]).array(mfi);
     422              : 
     423         5650 :         Set::Patch<const Set::Scalar> rho       = rho_mf.array(mfi);  // density
     424         5650 :         Set::Patch<const Set::Scalar> M         = M_mf.array(mfi);    // momentum
     425         5650 :         Set::Patch<const Set::Scalar> E         = E_mf.array(mfi);    // total energy (internal energy + kinetic energy) per unit volume (E/rho = e + 0.5*v^2)
     426              : 
     427         5650 :         Set::Patch<const Set::Scalar> rho_solid = solid.density_mf.Patch(lev,mfi);
     428         5650 :         Set::Patch<const Set::Scalar> M_solid   = solid.momentum_mf.Patch(lev,mfi);
     429         5650 :         Set::Patch<const Set::Scalar> E_solid   = solid.energy_mf.Patch(lev,mfi);
     430              : 
     431         5650 :         Set::Patch<Set::Scalar>       v         = velocity_mf.Patch(lev,mfi);
     432         5650 :         Set::Patch<Set::Scalar>       p         = pressure_mf.Patch(lev,mfi);
     433              : 
     434         5650 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     435              :         {
     436              : 
     437     50455800 :             Set::Scalar etarho_fluid  = rho(i,j,k) - (1.-eta(i,j,k)) * rho_solid(i,j,k);
     438     50455800 :             Set::Scalar etaE_fluid    = E(i,j,k)   - (1.-eta(i,j,k)) * E_solid(i,j,k);
     439              : 
     440     33637200 :             Set::Vector etaM_fluid( M(i,j,k,0) - (1.-eta(i,j,k)) * M_solid(i,j,k,0),
     441     84093000 :                                     M(i,j,k,1) - (1.-eta(i,j,k)) * M_solid(i,j,k,1) );
     442              : 
     443              :             //THESE ARE FLUID VELOCITY AND PRESSURE
     444              : 
     445     16818600 :             v(i,j,k,0) = etaM_fluid(0) / (etarho_fluid + small);
     446     16818600 :             v(i,j,k,1) = etaM_fluid(1) / (etarho_fluid + small);
     447     50455800 :             p(i,j,k)   = (etaE_fluid / (eta(i, j, k) + small) - 0.5 * (etaM_fluid(0)*etaM_fluid(0) + etaM_fluid(1)*etaM_fluid(1)) / (etarho_fluid + small)) * ((gamma - 1.0) / (eta(i, j, k) + small))-pref;
     448     16818600 :         });
     449         5650 :     }
     450              : 
     451         5650 :     const Set::Scalar* DX = geom[lev].CellSize();
     452         5650 :     amrex::Box domain = geom[lev].Domain();
     453              : 
     454        11300 :     for (amrex::MFIter mfi(*eta_mf[lev], false); mfi.isValid(); ++mfi)
     455              :     {
     456         5650 :         const amrex::Box& bx = mfi.validbox();
     457              :         
     458              :         // Inputs
     459         5650 :         Set::Patch<const Set::Scalar> rho = rho_mf.array(mfi);
     460         5650 :         Set::Patch<const Set::Scalar> E   = E_mf.array(mfi);
     461         5650 :         Set::Patch<const Set::Scalar> M   = M_mf.array(mfi);
     462              : 
     463              :         // Outputs
     464         5650 :         Set::Patch<Set::Scalar> rho_rhs = rho_rhs_mf.array(mfi);
     465         5650 :         Set::Patch<Set::Scalar> M_rhs   = M_rhs_mf.array(mfi);
     466         5650 :         Set::Patch<Set::Scalar> E_rhs   = E_rhs_mf.array(mfi);
     467              : 
     468              : 
     469              :         // Set::Patch<Set::Scalar>       rho_new = density_mf.Patch(lev,mfi);
     470              :         // Set::Patch<Set::Scalar>       E_new   = energy_mf.Patch(lev,mfi);
     471              :         // Set::Patch<Set::Scalar>       M_new   = momentum_mf.Patch(lev,mfi);
     472              : 
     473         5650 :         Set::Patch<const Set::Scalar> rho_solid = solid.density_mf.Patch(lev,mfi);
     474         5650 :         Set::Patch<const Set::Scalar> M_solid   = solid.momentum_mf.Patch(lev,mfi);
     475         5650 :         Set::Patch<const Set::Scalar> E_solid   = solid.energy_mf.Patch(lev,mfi);
     476              : 
     477         5650 :         Set::Patch<Set::Scalar>       omega     = vorticity_mf.Patch(lev,mfi);
     478              : 
     479         5650 :         Set::Patch<const Set::Scalar> eta       = eta_old_mf.Patch(lev,mfi);
     480         5650 :         Set::Patch<const Set::Scalar> etadot    = etadot_mf.Patch(lev,mfi);
     481         5650 :         Set::Patch<const Set::Scalar> velocity  = velocity_mf.Patch(lev,mfi);
     482              : 
     483         5650 :         Set::Patch<const Set::Scalar> m0        = m0_mf.Patch(lev,mfi);
     484         5650 :         Set::Patch<const Set::Scalar> q         = q_mf.Patch(lev,mfi);
     485         5650 :         Set::Patch<const Set::Scalar> _u0       = u0_mf.Patch(lev,mfi);
     486              : 
     487         5650 :         amrex::Array4<Set::Scalar> const& Source = (*Source_mf[lev]).array(mfi);
     488              : 
     489         5650 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k)
     490              :         {   
     491     11187200 :             auto sten = Numeric::GetStencil(i, j, k, domain);
     492              : 
     493              :             //Diffuse Sources
     494     11187200 :             Set::Vector grad_eta     = Numeric::Gradient(eta, i, j, k, 0, DX);
     495     11187200 :             Set::Scalar grad_eta_mag = grad_eta.lpNorm<2>();
     496     11187200 :             Set::Matrix hess_eta     = Numeric::Hessian(eta, i, j, k, 0, DX);
     497              : 
     498     33561600 :             Set::Vector u            = Set::Vector(velocity(i, j, k, 0), velocity(i, j, k, 1));
     499     33561600 :             Set::Vector u0           = Set::Vector(_u0(i, j, k, 0), _u0(i, j, k, 1));
     500              : 
     501     11187200 :             Set::Matrix gradM        = Numeric::Gradient(M, i, j, k, DX);
     502     11187200 :             Set::Vector gradrho      = Numeric::Gradient(rho,i,j,k,0,DX);
     503     11187200 :             Set::Matrix hess_rho     = Numeric::Hessian(rho,i,j,k,0,DX,sten);
     504     22374400 :             Set::Matrix gradu        = (gradM - u*gradrho.transpose()) / rho(i,j,k);
     505              : 
     506     33561600 :             Set::Vector q0           = Set::Vector(q(i,j,k,0),q(i,j,k,1));
     507              : 
     508     11187200 :             Set::Scalar mdot0 = -m0(i,j,k) * grad_eta_mag;
     509     11187200 :             Set::Vector Pdot0 = Set::Vector::Zero(); 
     510     11187200 :             Set::Scalar qdot0 = q0.dot(grad_eta);
     511              : 
     512              :             // sten is necessary here because sometimes corner ghost
     513              :             // cells don't get filled
     514     11187200 :             Set::Matrix3 hess_M = Numeric::Hessian(M,i,j,k,DX);
     515     11187200 :             Set::Matrix3 hess_u = Set::Matrix3::Zero();
     516     33561600 :             for (int p = 0; p < 2; p++)
     517     67123200 :                 for (int q = 0; q < 2; q++)
     518    134246400 :                     for (int r = 0; r < 2; r++)
     519              :                     {
     520     89497600 :                         hess_u(r,p,q) =
     521     89497600 :                             (hess_M(r,p,q) - gradu(r,q)*gradrho(p) - gradu(r,p)*gradrho(q) - u(r)*hess_rho(p,q))
     522    178995200 :                             / rho(i,j,k);
     523              :                     }
     524              : 
     525     11187200 :             Set::Vector Ldot0 = Set::Vector::Zero();
     526     11187200 :             Set::Vector div_tau = Set::Vector::Zero();
     527     33561600 :             for (int p = 0; p<2; p++)
     528     67123200 :                 for (int q = 0; q<2; q++)
     529    134246400 :                     for (int r = 0; r<2; r++)
     530    268492800 :                         for (int s = 0; s<2; s++)
     531              :                         {
     532    178995200 :                             Set::Scalar Mpqrs = 0.0;
     533    178995200 :                             if (p==r && q==s) Mpqrs += 0.5 * mu;
     534              : 
     535    178995200 :                             Ldot0(p) += 0.5*Mpqrs * (u(r) - u0(r)) * hess_eta(q, s);
     536    357990400 :                             div_tau(p) += 2.0*Mpqrs * hess_u(r,s,q);
     537              :                         }
     538              :             
     539     11187200 :             Source(i,j, k, 0) = mdot0;
     540     11187200 :             Source(i,j, k, 1) = Pdot0(0) - Ldot0(0);
     541     11187200 :             Source(i,j, k, 2) = Pdot0(1) - Ldot0(1);
     542     11187200 :             Source(i,j, k, 3) = qdot0;// - Ldot0(0)*v(i,j,k,0) - Ldot0(1)*v(i,j,k,1);
     543              : 
     544              :             // Lagrange terms to enforce no-penetration
     545     11187200 :             Source(i,j,k,1) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(0);
     546     11187200 :             Source(i,j,k,2) -= lagrange*(u-u0).dot(grad_eta)*grad_eta(1);
     547              : 
     548              :             //Godunov flux
     549              :             //states of total fields
     550     11187200 :             const int X = 0, Y = 1;
     551     11187200 :             Solver::Local::Riemann::State state_xlo(rho, M, E, i-1, j, k, X);
     552     11187200 :             Solver::Local::Riemann::State state_x  (rho, M, E, i  , j, k, X); 
     553     11187200 :             Solver::Local::Riemann::State state_xhi(rho, M, E, i+1, j, k, X);
     554              : 
     555     11187200 :             Solver::Local::Riemann::State state_ylo(rho, M, E, i, j-1, k, Y);
     556     11187200 :             Solver::Local::Riemann::State state_y  (rho, M, E, i, j  , k, Y);
     557     11187200 :             Solver::Local::Riemann::State state_yhi(rho, M, E, i, j+1, k, Y);
     558              :             
     559              :             //states of solid fields
     560     11187200 :             Solver::Local::Riemann::State state_xlo_solid(rho_solid, M_solid, E_solid, i-1, j, k, X); 
     561     11187200 :             Solver::Local::Riemann::State state_x_solid  (rho_solid, M_solid, E_solid, i  , j, k, X); 
     562     11187200 :             Solver::Local::Riemann::State state_xhi_solid(rho_solid, M_solid, E_solid, i+1, j, k, X); 
     563              : 
     564     11187200 :             Solver::Local::Riemann::State state_ylo_solid(rho_solid, M_solid, E_solid, i, j-1, k, Y); 
     565     11187200 :             Solver::Local::Riemann::State state_y_solid  (rho_solid, M_solid, E_solid, i, j  , k, Y); 
     566     11187200 :             Solver::Local::Riemann::State state_yhi_solid(rho_solid, M_solid, E_solid, i, j+1, k, Y); 
     567              :             
     568     33561600 :             Solver::Local::Riemann::State state_xlo_fluid = (state_xlo - (1.0 - eta(i-1,j,k))*state_xlo_solid) / (eta(i-1,j,k) + small);
     569     33561600 :             Solver::Local::Riemann::State state_x_fluid   = (state_x   - (1.0 - eta(i,j,k)  )*state_x_solid  ) / (eta(i,j,k)   + small);
     570     33561600 :             Solver::Local::Riemann::State state_xhi_fluid = (state_xhi - (1.0 - eta(i+1,j,k))*state_xhi_solid) / (eta(i+1,j,k) + small);
     571              : 
     572     33561600 :             Solver::Local::Riemann::State state_ylo_fluid = (state_ylo - (1.0 - eta(i,j-1,k))*state_ylo_solid) / (eta(i,j-1,k) + small);
     573     33561600 :             Solver::Local::Riemann::State state_y_fluid =   (state_y   - (1.0 - eta(i,j,k)  )*state_y_solid  ) / (eta(i,j,k)   + small);
     574     33561600 :             Solver::Local::Riemann::State state_yhi_fluid = (state_yhi - (1.0 - eta(i,j+1,k))*state_yhi_solid) / (eta(i,j+1,k) + small);
     575              : 
     576     11187200 :             Solver::Local::Riemann::Flux flux_xlo, flux_ylo, flux_xhi, flux_yhi;
     577              : 
     578              :             try
     579              :             {
     580              :                 //lo interface fluxes
     581     22374400 :                 flux_xlo = riemannsolver->Solve(state_xlo_fluid, state_x_fluid, gamma, pref, small) * eta(i,j,k);
     582     22374400 :                 flux_ylo = riemannsolver->Solve(state_ylo_fluid, state_y_fluid, gamma, pref, small) * eta(i,j,k);
     583              : 
     584              :                 //hi interface fluxes
     585     22374400 :                 flux_xhi = riemannsolver->Solve(state_x_fluid, state_xhi_fluid, gamma, pref, small) * eta(i,j,k);
     586     22374400 :                 flux_yhi = riemannsolver->Solve(state_y_fluid, state_yhi_fluid, gamma, pref, small) * eta(i,j,k);
     587              :             }
     588            0 :             catch(...)
     589              :             {
     590            0 :                 Util::ParallelMessage(INFO,"lev=",lev);
     591            0 :                 Util::ParallelMessage(INFO,"i=",i,"j=",j);
     592            0 :                 Util::Abort(INFO);
     593            0 :             }
     594              : 
     595              : 
     596              :             Set::Scalar drhof_dt = 
     597     11187200 :                 (flux_xlo.mass - flux_xhi.mass) / DX[0] +
     598     11187200 :                 (flux_ylo.mass - flux_yhi.mass) / DX[1] +
     599     11187200 :                 Source(i, j, k, 0);
     600              : 
     601     22374400 :             rho_rhs(i,j,k) = 
     602              :                 // rho_new(i, j, k) = rho(i, j, k) + 
     603              :                 //(
     604     11187200 :                     drhof_dt +
     605              :                     // todo add drhos_dt term if want time-evolving rhos
     606     55936000 :                     etadot(i,j,k) * (rho(i,j,k) - rho_solid(i,j,k)) / (eta(i,j,k) + small)
     607              :                 // ) * dt;
     608              :                 ;
     609              : 
     610              : 
     611              :                 
     612              :             Set::Scalar dMxf_dt =
     613     11187200 :                 (flux_xlo.momentum_normal  - flux_xhi.momentum_normal ) / DX[0] +
     614     22374400 :                 (flux_ylo.momentum_tangent - flux_yhi.momentum_tangent) / DX[1] +
     615     11187200 :                 div_tau(0) * eta(i,j,k) +
     616     11187200 :                 Source(i, j, k, 1);
     617              : 
     618     22374400 :             M_rhs(i,j,k,0) = 
     619              :                 //M_new(i, j, k, 0) = M(i, j, k, 0) +
     620              :                 // ( 
     621     11187200 :                     dMxf_dt + 
     622              :                     // todo add dMs_dt term if want time-evolving Ms
     623     55936000 :                     etadot(i,j,k)*(M(i,j,k,0) - M_solid(i,j,k,0)) / (eta(i,j,k) + small)
     624              :                 // ) * dt;
     625              :                 ;
     626              : 
     627              :             Set::Scalar dMyf_dt =
     628     11187200 :                 (flux_xlo.momentum_tangent - flux_xhi.momentum_tangent) / DX[0] +
     629     22374400 :                 (flux_ylo.momentum_normal  - flux_yhi.momentum_normal ) / DX[1] +
     630     11187200 :                 div_tau(1) * eta(i,j,k) + 
     631     11187200 :                 Source(i, j, k, 2);
     632              :                 
     633     22374400 :             M_rhs(i,j,k,1) = 
     634              :                 //M_new(i, j, k, 1) = M(i, j, k, 1) +
     635              :                 //( 
     636     11187200 :                     dMyf_dt +
     637              :                     // todo add dMs_dt term if want time-evolving Ms
     638     55936000 :                     etadot(i,j,k)*(M(i,j,k,1) - M_solid(i,j,k,1)) / (eta(i,j,k)+small)
     639              :                 // )*dt;
     640              :                 ;
     641              : 
     642              :             Set::Scalar dEf_dt =
     643     11187200 :                 (flux_xlo.energy - flux_xhi.energy) / DX[0] +
     644     11187200 :                 (flux_ylo.energy - flux_yhi.energy) / DX[1] +
     645     11187200 :                 Source(i, j, k, 3);
     646              : 
     647     22374400 :             E_rhs(i,j,k) = 
     648              :             // E_new(i, j, k) = E(i, j, k) + 
     649              :             //     ( 
     650     11187200 :                     dEf_dt +
     651              :                     // todo add dEs_dt term if want time-evolving Es
     652     55936000 :                     etadot(i,j,k)*(E(i,j,k) - E_solid(i,j,k)) / (eta(i,j,k)+small)
     653              :                 // ) * dt;
     654              :                 ;
     655              :             
     656              : #ifdef AMREX_DEBUG
     657              :             if ((rho_rhs(i,j,k) != rho_rhs(i,j,k)) ||
     658              :                 (M_rhs(i,j,k,0) != M_rhs(i,j,k,0)) ||
     659              :                 (M_rhs(i,j,k,1) != M_rhs(i,j,k,1)) ||
     660              :                 (E_rhs(i,j,k) != E_rhs(i,j,k)))
     661              :             {
     662              :                 Util::ParallelMessage(INFO,"rho_rhs=",rho_rhs(i,j,k));
     663              :                 Util::ParallelMessage(INFO,"Mx_rhs=",M_rhs(i,j,k,0));
     664              :                 Util::ParallelMessage(INFO,"Mx_rhs=",M_rhs(i,j,k,1));
     665              :                 Util::ParallelMessage(INFO,"E_rhs=",E_rhs(i,j,k));
     666              : 
     667              :                 Util::ParallelMessage(INFO,"lev=",lev);
     668              :                 Util::ParallelMessage(INFO,"i=",i," j=",j);
     669              :                 Util::ParallelMessage(INFO,"drhof_dt ",drhof_dt); // dies
     670              :                 Util::ParallelMessage(INFO,"flux_xlo.mass ",flux_xlo.mass);
     671              :                 Util::ParallelMessage(INFO,"flux_xhi.mass ",flux_xhi.mass); // dies, depends on state_xx, state_xhi, state_x_solid, state_xhi_solid, gamma, eta, pref, small
     672              :                 Util::ParallelMessage(INFO,"flux_ylo.mass ",flux_ylo.mass);
     673              :                 Util::ParallelMessage(INFO,"flux_xhi.mass ",flux_yhi.mass);
     674              :                 Util::ParallelMessage(INFO,"eta ",eta(i,j,k));
     675              :                 Util::ParallelMessage(INFO,"etadot ",etadot(i,j,k));
     676              :                 Util::ParallelMessage(INFO,"Source ",Source(i,j,k,0));
     677              :                 Util::ParallelMessage(INFO,"state_x ",state_x); // <<<<
     678              :                 Util::ParallelMessage(INFO,"state_y ",state_y);
     679              :                 Util::ParallelMessage(INFO,"state_x_solid ",state_x_solid); // <<<<
     680              :                 Util::ParallelMessage(INFO,"state_y_solid ",state_y_solid);
     681              :                 Util::ParallelMessage(INFO,"state_xhi ",state_xhi); // <<<<
     682              :                 Util::ParallelMessage(INFO,"state_yhi ",state_yhi);
     683              :                 Util::ParallelMessage(INFO,"state_xhi_solid ",state_xhi_solid);
     684              :                 Util::ParallelMessage(INFO,"state_yhi_solids ",state_yhi_solid);
     685              :                 Util::ParallelMessage(INFO,"state_xlo ",state_xlo);
     686              :                 Util::ParallelMessage(INFO,"state_ylo ",state_ylo);
     687              :                 Util::ParallelMessage(INFO,"state_xlo_solid ",state_xlo_solid);
     688              :                 Util::ParallelMessage(INFO,"state_ylo_solid ",state_ylo_solid);
     689              : 
     690              :                 Util::ParallelMessage(INFO,"Mx_solid ",M_solid(i,j,k,0));
     691              :                 Util::ParallelMessage(INFO,"My_solid ",M_solid(i,j,k,1));
     692              :                 Util::ParallelMessage(INFO,"small ",small);
     693              :                 Util::ParallelMessage(INFO,"Mx ",M(i,j,k,0));
     694              :                 Util::ParallelMessage(INFO,"My ",M(i,j,k,1));
     695              :                 Util::ParallelMessage(INFO,"dMx/dt ",dMxf_dt);
     696              :                 Util::ParallelMessage(INFO,"dMy/dt ",dMyf_dt);
     697              : 
     698              : 
     699              :                 Util::Message(INFO,flux_xlo.momentum_tangent);
     700              :                 Util::Message(INFO,flux_xhi.momentum_tangent);
     701              :                 Util::Message(INFO,DX[0]);
     702              :                 Util::Message(INFO,flux_ylo.momentum_normal);
     703              :                 Util::Message(INFO,flux_yhi.momentum_normal);
     704              :                 Util::Message(INFO,DX[1]);
     705              :                 Util::Message(INFO,div_tau);
     706              :                 Util::Message(INFO,Source(i, j, k, 2));
     707              :                 
     708              :                 Util::Message(INFO,hess_eta);
     709              :                 Util::Message(INFO,velocity(i,j,k,0));
     710              :                 Util::Message(INFO,velocity(i,j,k,1));
     711              : 
     712              :                 Util::Exception(INFO);
     713              :             }
     714              : #endif
     715              : 
     716              : 
     717              : 
     718              :             // todo - may need to move this for higher order schemes...
     719     22374400 :             omega(i, j, k) = eta(i, j, k) * (gradu(1,0) - gradu(0,1));
     720     11187200 :         });
     721         5650 :     }
     722         5650 : }
     723              : 
     724            0 : void Hydro::Regrid(int lev, Set::Scalar /* time */)
     725              : {
     726              :     BL_PROFILE("Integrator::Hydro::Regrid");
     727            0 :     Source_mf[lev]->setVal(0.0);
     728            0 :     if (lev < finest_level) return;
     729              : 
     730            0 :     Util::Message(INFO, "Regridding on level", lev);
     731              : }//end regrid
     732              : 
     733              : //void Hydro::TagCellsForRefinement(int lev, amrex::TagBoxArray &a_tags, Set::Scalar time, int ngrow)
     734            0 : void Hydro::TagCellsForRefinement(int lev, amrex::TagBoxArray& a_tags, Set::Scalar, int)
     735              : {
     736              :     BL_PROFILE("Integrator::Flame::TagCellsForRefinement");
     737              : 
     738            0 :     const Set::Scalar* DX = geom[lev].CellSize();
     739            0 :     Set::Scalar dr = sqrt(AMREX_D_TERM(DX[0] * DX[0], +DX[1] * DX[1], +DX[2] * DX[2]));
     740              : 
     741              :     // Eta criterion for refinement
     742            0 :     for (amrex::MFIter mfi(*eta_mf[lev], true); mfi.isValid(); ++mfi) {
     743            0 :         const amrex::Box& bx = mfi.tilebox();
     744            0 :         amrex::Array4<char> const& tags = a_tags.array(mfi);
     745            0 :         amrex::Array4<const Set::Scalar> const& eta = (*eta_mf[lev]).array(mfi);
     746              : 
     747            0 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
     748            0 :             Set::Vector grad_eta = Numeric::Gradient(eta, i, j, k, 0, DX);
     749            0 :             if (grad_eta.lpNorm<2>() * dr * 2 > eta_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
     750            0 :         });
     751            0 :     }
     752              : 
     753              :     // Vorticity criterion for refinement
     754            0 :     for (amrex::MFIter mfi(*vorticity_mf[lev], true); mfi.isValid(); ++mfi) {
     755            0 :         const amrex::Box& bx = mfi.tilebox();
     756            0 :         amrex::Array4<char> const& tags = a_tags.array(mfi);
     757            0 :         amrex::Array4<const Set::Scalar> const& omega = (*vorticity_mf[lev]).array(mfi);
     758              : 
     759            0 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
     760            0 :             auto sten = Numeric::GetStencil(i, j, k, bx);
     761            0 :             Set::Vector grad_omega = Numeric::Gradient(omega, i, j, k, 0, DX, sten);
     762            0 :             if (grad_omega.lpNorm<2>() * dr * 2 > omega_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
     763            0 :         });
     764            0 :     }
     765              : 
     766              :     // Gradu criterion for refinement
     767            0 :     for (amrex::MFIter mfi(*velocity_mf[lev], true); mfi.isValid(); ++mfi) {
     768            0 :         const amrex::Box& bx = mfi.tilebox();
     769            0 :         amrex::Array4<char> const& tags = a_tags.array(mfi);
     770            0 :         amrex::Array4<const Set::Scalar> const& v = (*velocity_mf[lev]).array(mfi);
     771              : 
     772            0 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
     773            0 :             auto sten = Numeric::GetStencil(i, j, k, bx);
     774            0 :             Set::Matrix grad_u = Numeric::Gradient(v, i, j, k, DX, sten);
     775            0 :             if (grad_u.lpNorm<2>() * dr * 2 > gradu_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
     776            0 :         });
     777            0 :     }
     778              : 
     779              :     // Pressure criterion for refinement
     780            0 :     for (amrex::MFIter mfi(*pressure_mf[lev], true); mfi.isValid(); ++mfi) {
     781            0 :         const amrex::Box& bx = mfi.tilebox();
     782            0 :         amrex::Array4<char> const& tags = a_tags.array(mfi);
     783            0 :         amrex::Array4<const Set::Scalar> const& p = (*pressure_mf[lev]).array(mfi);
     784              : 
     785            0 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
     786            0 :             auto sten = Numeric::GetStencil(i, j, k, bx);
     787            0 :             Set::Vector grad_p = Numeric::Gradient(p, i, j, k, 0, DX, sten);
     788            0 :             if (grad_p.lpNorm<2>() * dr * 2 > p_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
     789            0 :         });
     790            0 :     }
     791              : 
     792              :     // Density criterion for refinement
     793            0 :     for (amrex::MFIter mfi(*density_mf[lev], true); mfi.isValid(); ++mfi) {
     794            0 :         const amrex::Box& bx = mfi.tilebox();
     795            0 :         amrex::Array4<char> const& tags = a_tags.array(mfi);
     796            0 :         amrex::Array4<const Set::Scalar> const& rho = (*density_mf[lev]).array(mfi);
     797              : 
     798            0 :         amrex::ParallelFor(bx, [=] AMREX_GPU_DEVICE(int i, int j, int k) {
     799            0 :             auto sten = Numeric::GetStencil(i, j, k, bx);
     800            0 :             Set::Vector grad_rho = Numeric::Gradient(rho, i, j, k, 0, DX, sten);
     801            0 :             if (grad_rho.lpNorm<2>() * dr * 2 > rho_refinement_criterion) tags(i, j, k) = amrex::TagBox::SET;
     802            0 :         });
     803            0 :     }
     804              : 
     805            0 : }
     806              : 
     807              : }
     808              : 
     809              : 
     810              : #endif
        

Generated by: LCOV version 2.0-1