/* GRChombo * Copyright 2012 The GRChombo collaboration. * Please refer to LICENSE in GRChombo's root directory. */ // Chombo includes #include "parstream.H" //Gives us pout() // System includes #include // Our general includes #include "CosmoAMR.hpp" #include "DefaultLevelFactory.hpp" #include "GRParmParse.hpp" #include "MultiLevelTask.hpp" #include "SetupFunctions.hpp" #include "SimulationParameters.hpp" // Problem specific includes: #include "PBHCosmoLevel.hpp" // Chombo namespace #include "UsingNamespace.H" int runGRChombo(int argc, char *argv[]) { // Load the parameter file and construct the SimulationParameter class // To add more parameters edit the SimulationParameters file. char *in_file = argv[1]; GRParmParse pp(argc - 2, argv + 2, NULL, in_file); SimulationParameters sim_params(pp); if (sim_params.just_check_params) return 0; // The line below selects the problem that is simulated // (To simulate a different problem, define a new child of AMRLevel // and an associated LevelFactory) CosmoAMR cosmo_amr; DefaultLevelFactory pbh_level_fact(cosmo_amr, sim_params); setupAMRObject(cosmo_amr, pbh_level_fact); if (sim_params.use_subcycling == 0) { pout() << "PBHCosmo: time subcycling OFF" << std::endl; cosmo_amr.useSubcyclingInTime(false); } if (sim_params.fixed_dt > 0.) { pout() << "PBHCosmo: fixed dt = " << sim_params.fixed_dt << " on all levels" << std::endl; cosmo_amr.fixedDt(sim_params.fixed_dt); } // call this after amr object setup so grids known // and need it to stay in scope throughout run AMRInterpolator> interpolator( cosmo_amr, sim_params.origin, sim_params.dx, sim_params.boundary_params, sim_params.verbosity); cosmo_amr.set_interpolator(&interpolator); #ifdef USE_AHFINDER if (sim_params.AH_activate) { AHSurfaceGeometry sph(sim_params.center); cosmo_amr.m_ah_finder.add_ah(sph, sim_params.AH_initial_guess, sim_params.AH_params); } #endif using Clock = std::chrono::steady_clock; using Minutes = std::chrono::duration>; std::chrono::time_point start_time = Clock::now(); // Add a scheduler to call specificPostTimeStep on every AMRLevel at t=0 auto task = [](GRAMRLevel *level) { if (level->time() == 0.) level->specificPostTimeStep(); }; MultiLevelTaskPtr<> call_task(task); call_task.execute(cosmo_amr); // Engage! Run the evolution cosmo_amr.run(sim_params.stop_time, sim_params.max_steps); auto now = Clock::now(); auto duration = std::chrono::duration_cast(now - start_time); pout() << "Total simulation time (mins): " << duration.count() << ".\n"; cosmo_amr.conclude(); CH_TIMER_REPORT(); // Report results when running with Chombo timers. return 0; } int main(int argc, char *argv[]) { mainSetup(argc, argv); int status = runGRChombo(argc, argv); if (status == 0) pout() << "GRChombo finished." << std::endl; else pout() << "GRChombo failed with return code " << status << std::endl; mainFinalize(); return status; }