diff --git a/Exec/science/fully_convective_star/GNUmakefile b/Exec/science/fully_convective_star/GNUmakefile index 8cf5109f6..1db8394f3 100644 --- a/Exec/science/fully_convective_star/GNUmakefile +++ b/Exec/science/fully_convective_star/GNUmakefile @@ -13,7 +13,6 @@ PROFILE = FALSE # TRUE overrides TINY_PROFILE # define the location of the MAESTROEX home directory MAESTROEX_HOME := ../../.. - # Set the EOS, conductivity, and network directories # We first check if these exist in $(MAESTROEX_HOME)/Microphysics/(EOS/conductivity/networks) # If not we use the version in $(MICROPHYSICS_HOME)/Microphysics/(EOS/conductivity/networks) diff --git a/Exec/science/fully_convective_star/Make.package b/Exec/science/fully_convective_star/Make.package index e69de29bb..6cd5123b2 100644 --- a/Exec/science/fully_convective_star/Make.package +++ b/Exec/science/fully_convective_star/Make.package @@ -0,0 +1 @@ +CEXE_sources += Problem.cpp \ No newline at end of file diff --git a/Exec/science/fully_convective_star/Problem.H b/Exec/science/fully_convective_star/Problem.H new file mode 100644 index 000000000..31cf717d8 --- /dev/null +++ b/Exec/science/fully_convective_star/Problem.H @@ -0,0 +1,15 @@ +// Preprocessor macros we need. + +#ifndef DO_PROBLEM_POST_INIT +#define DO_PROBLEM_POST_INIT +#endif + +// #ifndef DO_PROBLEM_POST_RESTART +// #define DO_PROBLEM_POST_RESTART +// #endif + +#ifndef DO_PROBLEM_POST_TIMESTEP +#define DO_PROBLEM_POST_TIMESTEP +#endif + +// Problem analytics. diff --git a/Exec/science/fully_convective_star/Problem.cpp b/Exec/science/fully_convective_star/Problem.cpp index 43dd06f72..a0e1b7c26 100644 --- a/Exec/science/fully_convective_star/Problem.cpp +++ b/Exec/science/fully_convective_star/Problem.cpp @@ -1,42 +1,443 @@ #include "Maestro.H" +using namespace amrex; + +#ifdef DO_PROBLEM_POST_INIT + +void Maestro::ProblemPostInit() { + BL_PROFILE_VAR("Maestro::ProblemPostInit()", ProblemPostInit); + + // initialize radial diagnostic + // 0: convective velocity + // 1: meridional circulation (radial) + postfile_data.resize(base_geom.max_radial_level + 1, base_geom.nr_fine, + NumPost); + postfile_data.setVal(0.); + + // initialize multifab diagnostics + + // need single-level finest grid for whole domain + const Box& domain0 = geom[0].Domain(); + auto dom0_lo = domain0.loVect(); + auto dom0_hi = domain0.hiVect(); + IntVect ncell(0, 1, 0); + ncell[0] = (dom0_hi[0] + 1) * (finest_level + 1) / 2 - 1; + ncell[2] = (dom0_hi[2] + 1) * (finest_level + 1) - 1; + + IntVect domLo(AMREX_D_DECL(dom0_lo[0], dom0_lo[1], dom0_lo[2])); + IntVect domHi(AMREX_D_DECL(ncell[0], ncell[1], ncell[2])); + Box domain(domLo, domHi); + + // we only need half x-z plane because theta is between (0,pi) + auto prob_lo = geom[0].ProbLo(); + auto prob_hi = geom[0].ProbHi(); + const auto dx = geom[finest_level].CellSizeArray(); + + Real probLo[] = {prob_lo[0] + (prob_hi[0] - prob_lo[0]) / 2.0, prob_lo[1], + prob_lo[2]}; + Real probHi[] = {prob_hi[0], prob_lo[1] + 2.0 * dx[1], prob_hi[2]}; + RealBox real_box(probLo, probHi); + + // get max_grid_size + ParmParse pp("amr"); + int max_grid_size; + pp.get("max_grid_size", max_grid_size); + + // make BoxArray and Geometry for single-level finest grid + // previously declared in Maestro.H + baFine.define(domain); + baFine.maxSize(max_grid_size); + dmFine.define(baFine); + geomFine.define(domain, &real_box); + + // define multifab velocities on new single-level grid + postfile_mf.resize(1); + postfile_mf[0].define(baFine, dmFine, 2, 0); + postfile_mf[0].setVal(0.); + + Vector rad_vel(finest_level + 1); + Vector ang_vel(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + rad_vel[lev].define(grids[lev], dmap[lev], 1, 0); + ang_vel[lev].define(grids[lev], dmap[lev], 1, 0); + } + BaseState convect_vel(base_geom.max_radial_level + 1, + base_geom.nr_fine); + Vector circ_vel(1); + circ_vel[0].define(baFine, dmFine, 2, 0); + + // initialize diagnostics + if (restart_file.empty()) { + // compute diagnostics for initial state + // make radial and theta-component velocity + MakeVelrth(uold, w0_cart, rad_vel, ang_vel); + + // make convection velocity + MakeConvectionVel(rad_vel, convect_vel, postfile_data, 0, t_new); + + // make meridional circulation + MakeMeridionalCirculation(rad_vel, ang_vel, circ_vel, postfile_mf, + t_new); + + } else { + // if restarting from checkpoint + Print() << "Initializing postprocessing diagnostics from checkpoint " + << restart_file << std::endl; + + std::string line, word; + + // read in cell-centered basestate + std::string File(restart_file + "/PostCC"); + Vector fileCharPtr; + ParallelDescriptor::ReadAndBcastFile(File, fileCharPtr); + std::string fileCharPtrString(fileCharPtr.dataPtr()); + std::istringstream is(fileCharPtrString, std::istringstream::in); + + for (int i = 0; + i < (base_geom.max_radial_level + 1) * base_geom.nr_fine; ++i) { + std::getline(is, line); + std::istringstream lis(line); + + // NumPost components in postfile_data + for (int ncomp = 0; ncomp < NumPost; ++ncomp) { + lis >> word; + postfile_data.array()(ncomp + 2 * i) = std::stod(word); + } + } + + // read in the multifab data + VisMF::Read(postfile_mf[0], + amrex::MultiFabFileFullPrefix(0, restart_file, + "PostTimestep_", "diag")); + + // compute diagnostics output + // set updated values to zero to get old values at t_old + for (int lev = 0; lev <= finest_level; ++lev) { + rad_vel[lev].setVal(0.); + ang_vel[lev].setVal(0.); + } + + // make convection velocity + MakeConvectionVel(rad_vel, convect_vel, postfile_data, 0, t_old); + + // make meridional circulation + MakeMeridionalCirculation(rad_vel, ang_vel, circ_vel, postfile_mf, + t_old); + } + + if (restart_file.empty()) { + // wrote a plotfile + if (plot_int > 0 || plot_deltat > 0) { + std::string plotfilename = plot_base_name + "0000000"; + + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); + + // write out the cell-centered diagnostics + if (ParallelDescriptor::IOProcessor()) { + for (int lev = 0; lev <= base_geom.max_radial_level; ++lev) { + std::ofstream PostFile; + PostFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), + io_buffer.size()); + std::string PostFileName(plotfilename + "/PostTimestep_"); + std::string levStr = std::to_string(lev); + PostFileName.append(levStr); + PostFile.open(PostFileName.c_str(), + std::ofstream::out | std::ofstream::trunc | + std::ofstream::binary); + if (!PostFile.good()) { + amrex::FileOpenFailed(PostFileName); + } + + PostFile.precision(17); + + PostFile << "r_cc convection_vel \n"; + + for (int i = 0; i < base_geom.nr(lev); ++i) { + PostFile << base_geom.r_cc_loc(lev, i) << " " + << convect_vel.array()(lev, i) << "\n"; + } + } + } + + // write out the planar-averaged diagnostics + std::string PostFileName(plotfilename + "/PostTimestep"); + WriteSingleLevelPlotfile(PostFileName, circ_vel[0], + {"vel_radial", "vel_theta"}, geomFine, 0, + 0); + } + + // wrote a checkpoint file + if (chk_int > 0 || chk_deltat > 0) { + // checkpoint file name, e.g., chk00010 + const std::string& checkpointname = + amrex::Concatenate(check_base_name, 0, 7); + + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); + + // write out the cell-centered base state + if (ParallelDescriptor::IOProcessor()) { + std::ofstream PostCCFile; + PostCCFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), + io_buffer.size()); + std::string PostCCFileName(checkpointname + "/PostCC"); + PostCCFile.open(PostCCFileName.c_str(), + std::ofstream::out | std::ofstream::trunc | + std::ofstream::binary); + if (!PostCCFile.good()) { + amrex::FileOpenFailed(PostCCFileName); + } + + PostCCFile.precision(17); + + for (int i = 0; + i < (base_geom.max_radial_level + 1) * base_geom.nr_fine; + ++i) { + // NumPost components in postfile_data + for (int ncomp = 0; ncomp < NumPost; ++ncomp) { + PostCCFile << postfile_data.array()(ncomp + 2 * i) + << " "; + } + PostCCFile << "\n"; + } + } + + // write the MultiFab data + amrex::UtilCreateCleanDirectory(checkpointname + "/PostTimestep_0", + true); + VisMF::Write(postfile_mf[0], + amrex::MultiFabFileFullPrefix( + 0, checkpointname, "PostTimestep_", "diag")); + } + } +} + +#endif + #ifdef DO_PROBLEM_POST_TIMESTEP -using namespace amrex; +void Maestro::ProblemPostTimestep() { + // timer for profiling + BL_PROFILE_VAR("Maestro::ProblemPostInit()", ProblemPostInit); + + // compute diagnostics after every time step + // make radial and theta-component velocity + Vector rad_vel(finest_level + 1); + Vector ang_vel(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + rad_vel[lev].define(grids[lev], dmap[lev], 1, 0); + ang_vel[lev].define(grids[lev], dmap[lev], 1, 0); + } + MakeVelrth(unew, w0_cart, rad_vel, ang_vel); + + // make convection velocity + BaseState convect_vel(base_geom.max_radial_level + 1, + base_geom.nr_fine); + MakeConvectionVel(rad_vel, convect_vel, postfile_data, 0, t_new); -void Maestro::problem_post_timestep() { - static const std::string script_name = "post_to_slack.sh"; + // make meridional circulation + Vector circ_vel(1); + circ_vel[0].define(baFine, dmFine, 2, 0); + MakeMeridionalCirculation(rad_vel, ang_vel, circ_vel, postfile_mf, t_new); + // wrote a plotfile if ((plot_int > 0 && istep % plot_int == 0) || (plot_deltat > 0 && std::fmod(t_new, plot_deltat) < dt) || - (istep == max_step) || (t_old >= stop_time)) { - // wrote a plotfile + ((plot_int > 0 || plot_deltat > 0) && + (istep == max_step || t_old >= stop_time))) { std::string plotfilename = plot_base_name; PlotFileName(istep, &plotfilename); - // std::string command = "bash " + script_name + " " + std::to_string(t_new) + " " + std::to_string(istep) + " " + plotfilename + " &"; - // std::system(command.c_str()); + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); - Print() << "Output file " << plotfilename << " at time " - << std::to_string(t_new) << " and step " - << std::to_string(istep) << std::endl; + // write out the cell-centered diagnostics + if (ParallelDescriptor::IOProcessor()) { + for (int lev = 0; lev <= base_geom.max_radial_level; ++lev) { + std::ofstream PostFile; + PostFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), + io_buffer.size()); + std::string PostFileName(plotfilename + "/PostTimestep_"); + std::string levStr = std::to_string(lev); + PostFileName.append(levStr); + PostFile.open(PostFileName.c_str(), std::ofstream::out | + std::ofstream::trunc | + std::ofstream::binary); + if (!PostFile.good()) { + amrex::FileOpenFailed(PostFileName); + } - } else if ((small_plot_int > 0 && istep % small_plot_int == 0) || - (small_plot_deltat > 0 && - std::fmod(t_new, small_plot_deltat) < dt) || - (istep == max_step) || (t_old >= stop_time)) { - // wrote a small plotfile - std::string plotfilename = small_plot_base_name; - PlotFileName(istep, &plotfilename); + PostFile.precision(17); + + PostFile << "r_cc convection_vel \n"; + + for (int i = 0; i < base_geom.nr(lev); ++i) { + PostFile << base_geom.r_cc_loc(lev, i) << " " + << convect_vel.array()(lev, i) << "\n"; + } + } + } + + // write out the planar-averaged diagnostics + std::string PostFileName(plotfilename + "/PostTimestep"); + WriteSingleLevelPlotfile(PostFileName, circ_vel[0], + {"vel_radial", "vel_theta"}, geomFine, 0, 0); + } + + // wrote a checkpoint file + if ((chk_int > 0 && istep % chk_int == 0) || + (chk_deltat > 0 && std::fmod(t_new, chk_deltat) < dt) || + ((chk_int > 0 || chk_deltat > 0) && + (istep == max_step || t_old >= stop_time))) { + // checkpoint file name, e.g., chk00010 + const std::string& checkpointname = + amrex::Concatenate(check_base_name, istep, 7); + + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); - // std::string command = "bash " + script_name + " " + std::to_string(t_new) + " " + std::to_string(istep) + " " + plotfilename + " &"; - // - // std::system(command.c_str()); + // write out the cell-centered base state + if (ParallelDescriptor::IOProcessor()) { + std::ofstream PostCCFile; + PostCCFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), + io_buffer.size()); + std::string PostCCFileName(checkpointname + "/PostCC"); + PostCCFile.open(PostCCFileName.c_str(), std::ofstream::out | + std::ofstream::trunc | + std::ofstream::binary); + if (!PostCCFile.good()) { + amrex::FileOpenFailed(PostCCFileName); + } - Print() << "Output file " << plotfilename << " at time " - << std::to_string(t_new) << " and step " - << std::to_string(istep) << std::endl; + PostCCFile.precision(17); + + for (int i = 0; + i < (base_geom.max_radial_level + 1) * base_geom.nr_fine; + ++i) { + // NumPost components in postfile_data + for (int ncomp = 0; ncomp < NumPost; ++ncomp) { + PostCCFile << postfile_data.array()(ncomp + 2 * i) << " "; + } + PostCCFile << "\n"; + } + } + + // write the MultiFab data + amrex::UtilCreateCleanDirectory(checkpointname + "/PostTimestep_0", + true); + VisMF::Write(postfile_mf[0], + amrex::MultiFabFileFullPrefix(0, checkpointname, + "PostTimestep_", "diag")); } } #endif + +void Maestro::MakeConvectionVel(const Vector& velr, + BaseState& vel_conv, + BaseState& totsum, const int comp, + const Real t_interval) { + // timer for profiling + BL_PROFILE_VAR("Maestro::MakeConvectionVel()", MakeConvectionVel); + + Vector vel2(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + vel2[lev].define(grids[lev], dmap[lev], 1, 0); + } + + for (int lev = 0; lev <= finest_level; ++lev) { +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(velr[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 velr_arr = velr[lev].array(mfi); + const Array4 vel2_arr = vel2[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + vel2_arr(i, j, k) = 0.0; + + // square radial vel + vel2_arr(i, j, k) = velr_arr(i, j, k) * velr_arr(i, j, k); + }); + } + } + + // average down and fill ghost cells + AverageDown(vel2, 0, 1); + // FillPatch(t0, vel2, vel2, vel2, 0, 0, 1, 0, bcs_f); + + // radial average of square of radial vel + Average(vel2, vel_conv, 0); + + // add vel^2 to total sum and compute convection vel + auto vel_conv_arr = vel_conv.array(); + auto totsum_arr = totsum.array(); + + for (auto r = 0; r < base_geom.nr_fine; ++r) { + // Zero the velocity if it is a negative value. + // Note that the Average() subroutine can cause some interpolation + // values near the center of star to be negative. + // This should not affect values located further from the center. + if (vel_conv_arr(0, r) < 0) { + vel_conv_arr(0, r) = 0.0; + } + + if (t_new - dt >= diag_skip_time) { + totsum_arr(0, r, comp) += dt * vel_conv_arr(0, r); + } else if (t_new >= diag_skip_time) { + totsum_arr(0, r, comp) += + (t_new - diag_skip_time) * vel_conv_arr(0, r); + } else { + // do nothing + } + + // root-mean-squared radial velocity + vel_conv_arr(0, r) = + std::sqrt(totsum_arr(0, r, comp) / (t_interval - diag_skip_time)); + } +} + +void Maestro::MakeMeridionalCirculation(const Vector& velr, + const Vector& velth, + Vector& vel_circ, + Vector& sum_circ, + const Real t_interval) { + // timer for profiling + BL_PROFILE_VAR("Maestro::MakeMeridionalCirculation()", + MakeMeridionalCirculation); + + vel_circ[0].setVal(0.); + + // average to 2D r-theta (x-z) plane + Average2d(velr, vel_circ, 0, 0, {geomFine.Domain()}); + Average2d(velth, vel_circ, 1, 0, {geomFine.Domain()}); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(vel_circ[0], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 circvel_arr = vel_circ[0].array(mfi); + const Array4 circsum_arr = sum_circ[0].array(mfi); + const auto dt_loc = dt; + const auto tnew_loc = t_new; + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + for (int n = 0; n < 2; ++n) { + if (tnew_loc - dt_loc >= diag_skip_time) { + circsum_arr(i, j, k, n) += dt_loc * circvel_arr(i, j, k, n); + } else if (tnew_loc >= diag_skip_time) { + circsum_arr(i, j, k, n) += + (tnew_loc - diag_skip_time) * circvel_arr(i, j, k, n); + } else { + // do nothing + } + + circvel_arr(i, j, k, n) = + circsum_arr(i, j, k, n) / (t_interval - diag_skip_time); + } + }); + } +} diff --git a/Exec/science/rotating_star/GNUmakefile b/Exec/science/rotating_star/GNUmakefile index 23908e520..2747549e9 100644 --- a/Exec/science/rotating_star/GNUmakefile +++ b/Exec/science/rotating_star/GNUmakefile @@ -27,5 +27,3 @@ Blocs := . PROBIN_PARAMETER_DIRS := . include $(MAESTROEX_HOME)/Exec/Make.Maestro - -USE_ROTATION=FALSE diff --git a/Exec/science/rotating_star/Make.package b/Exec/science/rotating_star/Make.package index e69de29bb..6cd5123b2 100644 --- a/Exec/science/rotating_star/Make.package +++ b/Exec/science/rotating_star/Make.package @@ -0,0 +1 @@ +CEXE_sources += Problem.cpp \ No newline at end of file diff --git a/Exec/science/rotating_star/Problem.H b/Exec/science/rotating_star/Problem.H new file mode 100644 index 000000000..a34a39086 --- /dev/null +++ b/Exec/science/rotating_star/Problem.H @@ -0,0 +1,15 @@ +// Preprocessor macros we need. + +// #ifndef DO_PROBLEM_POST_INIT +// #define DO_PROBLEM_POST_INIT +// #endif + +// #ifndef DO_PROBLEM_POST_RESTART +// #define DO_PROBLEM_POST_RESTART +// #endif + +#ifndef DO_PROBLEM_POST_TIMESTEP +#define DO_PROBLEM_POST_TIMESTEP +#endif + +// Problem analytics. diff --git a/Exec/science/rotating_star/Problem.cpp b/Exec/science/rotating_star/Problem.cpp index 43dd06f72..69cc2940d 100644 --- a/Exec/science/rotating_star/Problem.cpp +++ b/Exec/science/rotating_star/Problem.cpp @@ -4,7 +4,7 @@ using namespace amrex; -void Maestro::problem_post_timestep() { +void Maestro::ProblemPostTimestep() { static const std::string script_name = "post_to_slack.sh"; if ((plot_int > 0 && istep % plot_int == 0) || diff --git a/Source/Maestro.H b/Source/Maestro.H index c72dc433f..8566149bb 100644 --- a/Source/Maestro.H +++ b/Source/Maestro.H @@ -26,6 +26,7 @@ using namespace maestro; #include #include +#include #include /// Define Real vector types for CUDA-compatability. If `AMREX_USE_CUDA`, then @@ -330,6 +331,9 @@ class Maestro : public amrex::AmrCore { void Average(const amrex::Vector& phi, BaseState& phibar, int comp); + void Average2d(const amrex::Vector& phi, + amrex::Vector& phibar, int barcomp, + int comp, const amrex::Vector& bardomain); // end MaestroAverage.cpp functions //////////// @@ -1367,6 +1371,12 @@ class Maestro : public amrex::AmrCore { amrex::Vector& rad_vel, amrex::Vector& circ_vel); + /// Calculate the radial and theta-dir components of the velocity + void MakeVelrth(const amrex::Vector& vel, + const amrex::Vector& w0rcart, + amrex::Vector& rad_vel, + amrex::Vector& theta_vel); + /// Calculate the adiabatic excess void MakeAdExcess(const amrex::Vector& state, amrex::Vector& ad_excess); @@ -1888,6 +1898,36 @@ class Maestro : public amrex::AmrCore { #endif //////////////////////// + //////////////////////// + // Problem.cpp functions + //////////////////////// + + /// Problem-specific outputs +#ifdef DO_PROBLEM_POST_TIMESTEP + void ProblemPostTimestep(); +#endif + +#ifdef DO_PROBLEM_POST_RESTART + void ProblemPostRestart(); +#endif + +#ifdef DO_PROBLEM_POST_INIT + void ProblemPostInit(); +#endif + + void MakeConvectionVel(const amrex::Vector& velr, + BaseState& vel_conv, + BaseState& totsum, const int comp, + const amrex::Real t_interval); + + void MakeMeridionalCirculation(const amrex::Vector& velr, + const amrex::Vector& velth, + amrex::Vector& vel_circ, + amrex::Vector& sum_circ, + const amrex::Real t_interval); + + //////////////////////// + /* private data members */ @@ -2038,6 +2078,17 @@ class Maestro : public amrex::AmrCore { amrex::Vector diagfile2_data; amrex::Vector diagfile3_data; + // post problem file array +#ifdef DO_PROBLEM_POST_INIT + const int NumPost = 2; + BaseState postfile_data; + amrex::Vector postfile_mf; + + amrex::BoxArray baFine; + amrex::DistributionMapping dmFine; + amrex::Geometry geomFine; +#endif + // problem information amrex::GpuArray center; diff --git a/Source/MaestroAverage.cpp b/Source/MaestroAverage.cpp index c6b88e5cc..a96dabcf2 100644 --- a/Source/MaestroAverage.cpp +++ b/Source/MaestroAverage.cpp @@ -457,3 +457,124 @@ void Maestro::Average(const Vector& phi, BaseState& phibar, Gpu::synchronize(); } } + +// Given a multifab of data (phi), average down to quantity on a plane, phibar. +// Assume spherical case, and averaging is done in the psi direction, +// resulting in averages on an x-z plane cutting through the north and south poles. + +void Maestro::Average2d(const Vector& phi, Vector& phibar, + int barcomp, int comp, const Vector& bardomain) { + // timer for profiling + BL_PROFILE_VAR("Maestro::Average2d()", Average2d); + + // construct a 2D array at finest level for phi to be mapped onto + Box domain = bardomain[0]; + const int xlen = domain.hiVect()[0] + 1; + const int ylen = domain.hiVect()[2] + 1; + + BaseState phisum_s(xlen, ylen); + auto phisum = phisum_s.array(); + phisum_s.setVal(0.0); + BaseState ncell_s(xlen, ylen); + auto ncell = ncell_s.array(); + ncell_s.setVal(0); + + const auto& center_p = center; + + const auto dxFine = geom[finest_level].CellSizeArray(); + + // loop is over the existing levels (up to finest_level) + for (int lev = finest_level; lev >= 0; --lev) { + // Get the grid size of the domain + const auto dx = geom[lev].CellSizeArray(); + const auto prob_lo = geom[lev].ProbLoArray(); + + // get references to the MultiFabs at level lev + const MultiFab& phi_mf = phi[lev]; + + // create mask assuming refinement ratio = 2 + int finelev = lev + 1; + if (lev == finest_level) finelev = finest_level; + + const BoxArray& fba = phi[finelev].boxArray(); + const iMultiFab& mask = makeFineMask(phi_mf, fba, IntVect(2)); + + // Loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(phi_mf, TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tilebox = mfi.tilebox(); + + const Array4 mask_arr = mask.array(mfi); + const Array4 phi_arr = phi[lev].array(mfi, comp); + + bool use_mask = !(lev == finest_level); + + AMREX_PARALLEL_FOR_3D(tilebox, i, j, k, { + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + + // make sure the cell isn't covered by finer cells + bool cell_valid = true; + if (use_mask) { + if (mask_arr(i, j, k) == 1) cell_valid = false; + } + + if (cell_valid) { + // compute distance to center + Real radius = sqrt(x * x + y * y + z * z); + + // compute distances in mapped coordinates + Real xp = sqrt(x * x + y * y); + Real yp = center_p[2] + z; + + // figure out which (i,j) index this point maps into + // TODO: could give smoother results if coarse grid data is + // mapped into multiple fine grids + int index_i = int(round(xp / dxFine[0] - 0.5)); + int index_j = int(round(yp / dxFine[2] - 0.5)); + + // TODO: currently does not take data in domain corners + if (index_i < xlen and index_j < ylen) { + amrex::HostDevice::Atomic::Add( + &(phisum(index_i, index_j)), phi_arr(i, j, k)); + amrex::HostDevice::Atomic::Add( + &(ncell(index_i, index_j)), 1); + } + } + }); + } + } + + // reduction over boxes to get sum + ParallelDescriptor::ReduceRealSum(phisum.dataPtr(), xlen * ylen); + ParallelDescriptor::ReduceIntSum(ncell.dataPtr(), xlen * ylen); + + // normalize phisum so it actually stores the averages + for (auto i = 0; i < xlen; ++i) { + for (auto k = 0; k < ylen; ++k) { + if (ncell(i, k) != 0) { + phisum(i, k) /= Real(ncell(i, k)); + } + } + } + + // Put average array into 2D MultiFab + // Loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(phibar[0], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tilebox = mfi.tilebox(); + const Array4 phibar_arr = phibar[0].array(mfi, barcomp); + + AMREX_PARALLEL_FOR_3D(tilebox, i, j, k, { + phibar_arr(i, j, k) = 0.0; + if (j == 0) phibar_arr(i, j, k) = phisum(i, k); + }); + } +} diff --git a/Source/MaestroEvolve.cpp b/Source/MaestroEvolve.cpp index 4c552dc5f..ad5f69cbe 100644 --- a/Source/MaestroEvolve.cpp +++ b/Source/MaestroEvolve.cpp @@ -186,6 +186,17 @@ void Maestro::Evolve() { WriteDiagFile(diag_index); } +#ifdef DO_PROBLEM_POST_TIMESTEP + + // Provide a hook for the user to do things after all of + // the normal updates have been applied. The user is + // responsible for any actions after this point, like + // doing a computeTemp call if they change the state data. + + ProblemPostTimestep(); + +#endif + // move new state into old state by swapping pointers for (int lev = 0; lev <= finest_level; ++lev) { std::swap(sold[lev], snew[lev]); diff --git a/Source/MaestroForce.cpp b/Source/MaestroForce.cpp index b50d41dd7..a2efe0f9c 100644 --- a/Source/MaestroForce.cpp +++ b/Source/MaestroForce.cpp @@ -160,8 +160,8 @@ void Maestro::MakeVelForce( const auto omega_loc = omega; #endif - ParallelFor(tileBox, [=] AMREX_GPU_DEVICE(int i, int j, - int k) noexcept { + amrex::ParallelFor(tileBox, [=] AMREX_GPU_DEVICE( + int i, int j, int k) noexcept { #ifdef ROTATION const Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0]; const Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1]; diff --git a/Source/MaestroInit.cpp b/Source/MaestroInit.cpp index ab81fbe59..c47684a35 100644 --- a/Source/MaestroInit.cpp +++ b/Source/MaestroInit.cpp @@ -31,7 +31,6 @@ void Maestro::Init() { WritePlotFile(plotInitData, t_old, 0, rho0_old, rhoh0_old, p0_old, gamma1bar_old, uold, sold, S_cc_old); - } else if (small_plot_int > 0 || small_plot_deltat > 0) { // Need to fill normal vector to compute velrc in plotfile if (spherical) { @@ -43,6 +42,7 @@ void Maestro::Init() { WriteSmallPlotFile(plotInitData, t_old, 0, rho0_old, rhoh0_old, p0_old, gamma1bar_old, uold, sold, S_cc_old); } + } else { Print() << "Initializing from checkpoint " << restart_file << std::endl; @@ -235,6 +235,10 @@ void Maestro::Init() { DiagFile(0, t_old, rho0_old, p0_old, uold, sold, index_dummy); } } + +#ifdef DO_PROBLEM_POST_INIT + ProblemPostInit(); +#endif } // fill in multifab and base state data diff --git a/Source/MaestroMakeBeta0.cpp b/Source/MaestroMakeBeta0.cpp index 45b5f938f..7b6eb3309 100644 --- a/Source/MaestroMakeBeta0.cpp +++ b/Source/MaestroMakeBeta0.cpp @@ -138,7 +138,8 @@ void Maestro::MakeBeta0(BaseState& beta0_s, const BaseState& rho0_s, Real integral = 0.0; - if (nu == 0.0 || mu == 0.0 || + if (amrex::Math::abs(nu) == 0. || + amrex::Math::abs(mu) == 0. || (nu * gamma1bar(n, r) - mu * p0(n, r)) == 0.0 || ((gamma1bar(n, r) + 0.5 * mu * drp) / (gamma1bar(n, r) - 0.5 * mu * drm)) <= 0.0 || diff --git a/Source/MaestroPlot.cpp b/Source/MaestroPlot.cpp index cfb669684..926629692 100644 --- a/Source/MaestroPlot.cpp +++ b/Source/MaestroPlot.cpp @@ -1451,6 +1451,69 @@ void Maestro::MakeVelrc(const Vector& vel, FillPatch(t_old, circ_vel, circ_vel, circ_vel, 0, 0, 1, 0, bcs_f); } +void Maestro::MakeVelrth(const Vector& vel, + const Vector& w0rcart, + Vector& rad_vel, + Vector& theta_vel) { + // timer for profiling + BL_PROFILE_VAR("Maestro::MakeVelrth()", MakeVelrth); + + const auto& center_p = center; + + for (int lev = 0; lev <= finest_level; ++lev) { + const auto dx = geom[lev].CellSizeArray(); + const auto prob_lo = geom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 vel_arr = vel[lev].array(mfi); + const Array4 radvel_arr = rad_vel[lev].array(mfi); + const Array4 thetavel_arr = theta_vel[lev].array(mfi); + const Array4 w0rcart_arr = w0rcart[lev].array(mfi); + const Array4 normal_arr = normal[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + thetavel_arr(i, j, k) = 0.0; + radvel_arr(i, j, k) = 0.0; + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + radvel_arr(i, j, k) += + vel_arr(i, j, k, n) * normal_arr(i, j, k, n); + } + + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real inv_radius = 1.0 / sqrt(x * x + y * y + z * z); + Real inv_xy = 1.0 / sqrt(x * x + y * y); + + Real theta_dir[3]; + theta_dir[0] = x * inv_radius * z * inv_xy; + theta_dir[1] = y * inv_radius * z * inv_xy; + theta_dir[2] = -inv_radius / inv_xy; + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + thetavel_arr(i, j, k) += vel_arr(i, j, k, n) * theta_dir[n]; + } + + // add base state vel to get full radial velocity + radvel_arr(i, j, k) += w0rcart_arr(i, j, k); + }); + } + } + + // average down and fill ghost cells + AverageDown(rad_vel, 0, 1); + FillPatch(t_old, rad_vel, rad_vel, rad_vel, 0, 0, 1, 0, bcs_f); + AverageDown(theta_vel, 0, 1); + FillPatch(t_old, theta_vel, theta_vel, theta_vel, 0, 0, 1, 0, bcs_f); +} + void Maestro::MakeAdExcess(const Vector& state, Vector& ad_excess) { // timer for profiling diff --git a/Source/Make.package b/Source/Make.package index b385aa4a1..baca97b6f 100644 --- a/Source/Make.package +++ b/Source/Make.package @@ -68,3 +68,4 @@ CEXE_headers += MaestroPlot.H CEXE_headers += MaestroUtil.H CEXE_headers += PhysBCFunctMaestro.H CEXE_headers += state_indices.H + diff --git a/Source/Problem.H b/Source/Problem.H new file mode 100644 index 000000000..5877f89df --- /dev/null +++ b/Source/Problem.H @@ -0,0 +1,13 @@ +// Preprocessor macros we want to use. + +// #ifndef DO_PROBLEM_POST_INIT +// #define DO_PROBLEM_POST_INIT +// #endif + +// #ifndef DO_PROBLEM_POST_RESTART +// #define DO_PROBLEM_POST_RESTART +// #endif + +// #ifndef DO_PROBLEM_POST_TIMESTEP +// #define DO_PROBLEM_POST_TIMESTEP +// #endif diff --git a/Source/param/_cpp_parameters b/Source/param/_cpp_parameters index 13502a5a7..f09bd2666 100644 --- a/Source/param/_cpp_parameters +++ b/Source/param/_cpp_parameters @@ -583,6 +583,11 @@ reset_checkpoint_time Real -1.e200 # and you set it to value greater than this default value. reset_checkpoint_step int -1 +# problem-dependent setting to control when you want to skip certain diagnostics +# can be useful when you are computing integrated quantities over time and +# want to ignore the data for some period of time while convection sets up +diag_skip_time Real 0. + #----------------------------------------------------------------------------- # category: particles diff --git a/Util/postprocess/Average.cpp b/Util/postprocess/Average.cpp new file mode 100644 index 000000000..52c2db059 --- /dev/null +++ b/Util/postprocess/Average.cpp @@ -0,0 +1,417 @@ +#include +#include + +using namespace amrex; + +AMREX_GPU_DEVICE +Real QuadInterp(const Real x, const Real x0, const Real x1, const Real x2, + const Real y0, const Real y1, const Real y2, bool limit); + +// Given a multifab of data (phi), average down to a base state quantity, phibar. +// Assume we are spherical, and the averaging is done at constant radius. + +void Postprocess::Average(const Vector& phi, BaseState& phibar, + int comp) { + // timer for profiling + BL_PROFILE_VAR("Postprocessing::Average()", PAverage); + + const auto nr_irreg = base_geom.nr_irreg; + + phibar.setVal(0.0); + + // spherical case with even base state spacing + + // For spherical, we construct a 1D array at each level, phisum, that has space + // allocated for every possible radius that a cell-center at each level can + // map into. The radial locations have been precomputed and stored in radii. + BaseState phisum_s(finest_level + 1, nr_irreg + 2); + auto phisum = phisum_s.array(); + phisum_s.setVal(0.0); + BaseState radii_s(finest_level + 1, nr_irreg + 3); + auto radii = radii_s.array(); + BaseState ncell_s(finest_level + 1, nr_irreg + 2); + auto ncell = ncell_s.array(); + ncell_s.setVal(0); + + const auto& center_p = center; + + const int fine_lev = finest_level + 1; + + // radii contains every possible distance that a cell-center at the finest + // level can map into + for (int lev = 0; lev <= finest_level; ++lev) { + // Get the index space of the domain + const auto dx = pgeom[lev].CellSizeArray(); + + AMREX_PARALLEL_FOR_1D(nr_irreg + 1, r, { + radii(lev, r + 1) = std::sqrt(0.75 + 2.0 * Real(r)) * dx[0]; + }); + Gpu::synchronize(); + + radii(lev, nr_irreg + 2) = 1.e99; + radii(lev, 0) = 0.0; + } + + // loop is over the existing levels (up to finest_level) + for (int lev = finest_level; lev >= 0; --lev) { + // Get the grid size of the domain + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + + // get references to the MultiFabs at level lev + const MultiFab& phi_mf = phi[lev]; + + // create mask assuming refinement ratio = 2 + int finelev = lev + 1; + if (lev == finest_level) finelev = finest_level; + + const BoxArray& fba = phi[finelev].boxArray(); + const iMultiFab& mask = makeFineMask(phi_mf, fba, IntVect(2)); + + // Loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(phi_mf, TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tilebox = mfi.tilebox(); + + const Array4 mask_arr = mask.array(mfi); + const Array4 phi_arr = phi[lev].array(mfi, comp); + + bool use_mask = !(lev == fine_lev - 1); + + AMREX_PARALLEL_FOR_3D(tilebox, i, j, k, { + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + + // make sure the cell isn't covered by finer cells + bool cell_valid = true; + if (use_mask) { + if (mask_arr(i, j, k) == 1) cell_valid = false; + } + + if (cell_valid) { + // compute distance to center + Real radius = sqrt(x * x + y * y + z * z); + + // figure out which radii index this point maps into + int index = int(round( + ((radius / dx[0]) * (radius / dx[0]) - 0.75) / 2.0)); + + // due to roundoff error, need to ensure that we are in the proper radial bin + if (index < nr_irreg) { + if (fabs(radius - radii(lev, index + 1)) > + fabs(radius - radii(lev, index + 2))) { + index++; + } + } + + amrex::HostDevice::Atomic::Add(&(phisum(lev, index + 1)), + phi_arr(i, j, k)); + amrex::HostDevice::Atomic::Add(&(ncell(lev, index + 1)), 1); + } + }); + } + } + + // reduction over boxes to get sum + ParallelDescriptor::ReduceRealSum(phisum.dataPtr(), + (finest_level + 1) * (nr_irreg + 2)); + ParallelDescriptor::ReduceIntSum(ncell.dataPtr(), + (finest_level + 1) * (nr_irreg + 2)); + + // normalize phisum so it actually stores the average at a radius + for (auto n = 0; n <= finest_level; ++n) { + for (auto r = 0; r <= nr_irreg; ++r) { + if (ncell(n, r + 1) != 0) { + phisum(n, r + 1) /= Real(ncell(n, r + 1)); + } + } + } + + BaseState which_lev_s(base_geom.nr_fine); + auto which_lev = which_lev_s.array(); + BaseState max_rcoord_s(fine_lev); + auto max_rcoord = max_rcoord_s.array(); + + // compute center point for the finest level + phisum(finest_level, 0) = (11.0 / 8.0) * phisum(finest_level, 1) - + (3.0 / 8.0) * phisum(finest_level, 2); + ncell(finest_level, 0) = 1; + + // choose which level to interpolate from + const auto dr0 = base_geom.dr(0); + const auto nrf = base_geom.nr_fine; + + AMREX_PARALLEL_FOR_1D(nrf, r, { + Real radius = (Real(r) + 0.5) * dr0; + // Vector rcoord_p(fine_lev, 0); + int rcoord_p[fine_lev]; + + // initialize + for (int& coord : rcoord_p) { + coord = 0.0; + } + + // for each level, find the closest coordinate + for (auto n = 0; n < fine_lev; ++n) { + for (auto j = rcoord_p[n]; j <= nr_irreg; ++j) { + if (fabs(radius - radii(n, j + 1)) < + fabs(radius - radii(n, j + 2))) { + rcoord_p[n] = j; + break; + } + } + } + + // make sure closest coordinate is in bounds + for (auto n = 0; n < fine_lev - 1; ++n) { + rcoord_p[n] = amrex::max(rcoord_p[n], 1); + } + for (auto n = 0; n < fine_lev; ++n) { + rcoord_p[n] = amrex::min(rcoord_p[n], nr_irreg - 1); + } + + // choose the level with the largest min over the ncell interpolation points + which_lev(r) = 0; + + int min_all = + amrex::min(ncell(0, rcoord_p[0]), ncell(0, rcoord_p[0] + 1), + ncell(0, rcoord_p[0] + 2)); + + for (auto n = 1; n < fine_lev; ++n) { + int min_lev = + amrex::min(ncell(n, rcoord_p[n]), ncell(n, rcoord_p[n] + 1), + ncell(n, rcoord_p[n] + 2)); + + if (min_lev > min_all) { + min_all = min_lev; + which_lev(r) = n; + } + } + + // if the min hit count at all levels is zero, we expand the search + // to find the closest instance of where the hitcount becomes nonzero + int j = 1; + while (min_all == 0) { + j++; + for (auto n = 0; n < fine_lev; ++n) { + int min_lev = amrex::max( + ncell(n, amrex::max(1, rcoord_p[n] - j) + 1), + ncell(n, amrex::min(rcoord_p[n] + j, nr_irreg - 1) + 1)); + if (min_lev != 0) { + which_lev(r) = n; + min_all = min_lev; + break; + } + } + } + }); + Gpu::synchronize(); + + // squish the list at each level down to exclude points with no contribution + for (auto n = 0; n <= finest_level; ++n) { + int j = 0; + for (auto r = 0; r <= nr_irreg; ++r) { + while (ncell(n, j + 1) == 0) { + j++; + if (j > nr_irreg) { + break; + } + } + if (j > nr_irreg) { + for (auto i = r; i <= nr_irreg; ++i) { + phisum(n, i + 1) = 1.e99; + } + for (auto i = r; i <= nr_irreg + 1; ++i) { + radii(n, i + 1) = 1.e99; + } + max_rcoord(n) = r - 1; + break; + } + phisum(n, r + 1) = phisum(n, j + 1); + radii(n, r + 1) = radii(n, j + 1); + ncell(n, r + 1) = ncell(n, j + 1); + j++; + if (j > nr_irreg) { + max_rcoord(n) = r; + break; + } + } + } + + // compute phibar + const Real drdxfac_loc = drdxfac; + auto phibar_arr = phibar.array(); + + AMREX_PARALLEL_FOR_1D(nrf, r, { + Real radius = (Real(r) + 0.5) * dr0; + int stencil_coord = 0; + + // find the closest coordinate + for (auto j = stencil_coord; j <= max_rcoord(which_lev(r)); ++j) { + if (fabs(radius - radii(which_lev(r), j + 1)) < + fabs(radius - radii(which_lev(r), j + 2))) { + stencil_coord = j; + break; + } + } + + // make sure the interpolation points will be in bounds + if (which_lev(r) != fine_lev - 1) { + stencil_coord = amrex::max(stencil_coord, 1); + } + stencil_coord = amrex::min(stencil_coord, max_rcoord(which_lev(r)) - 1); + + bool limit = (r <= nrf - 1 - drdxfac_loc * pow(2.0, (fine_lev - 2))); + + phibar_arr(0, r) = + QuadInterp(radius, radii(which_lev(r), stencil_coord), + radii(which_lev(r), stencil_coord + 1), + radii(which_lev(r), stencil_coord + 2), + phisum(which_lev(r), stencil_coord), + phisum(which_lev(r), stencil_coord + 1), + phisum(which_lev(r), stencil_coord + 2), limit); + }); + Gpu::synchronize(); +} + +AMREX_GPU_DEVICE +Real QuadInterp(const Real x, const Real x0, const Real x1, const Real x2, + const Real y0, const Real y1, const Real y2, bool limit) { + Real y = y0 + (y1 - y0) / (x1 - x0) * (x - x0) + + ((y2 - y1) / (x2 - x1) - (y1 - y0) / (x1 - x0)) / (x2 - x0) * + (x - x0) * (x - x1); + + if (limit) { + if (y > max(y0, max(y1, y2))) y = max(y0, max(y1, y2)); + if (y < min(y0, min(y1, y2))) y = min(y0, min(y1, y2)); + } + + return y; +} + +// Given a multifab of data (phi), average down to quantity on a plane, phibar. +// Assume spherical case, and averaging is done in the psi direction, +// resulting in averages on an x-z plane cutting through the north and south poles. + +void Postprocess::Average2d(const Vector& phi, + Vector& phibar, int barcomp, + const Vector& bardomain, int comp) { + // timer for profiling + BL_PROFILE_VAR("Postprocessing::Average2d()", PAverage2d); + + // construct a 2D array at finest level for phi to be mapped onto + Box domain = bardomain[0]; + const int xlen = domain.hiVect()[0] + 1; + const int ylen = domain.hiVect()[2] + 1; + // Print() << "HACK: " << xlen << ", " << ylen << std::endl; + + BaseState phisum_s(xlen, ylen); + auto phisum = phisum_s.array(); + phisum_s.setVal(0.0); + BaseState ncell_s(xlen, ylen); + auto ncell = ncell_s.array(); + ncell_s.setVal(0); + + const auto& center_p = center; + + const auto dxFine = pgeom[finest_level].CellSizeArray(); + + // loop is over the existing levels (up to finest_level) + for (int lev = finest_level; lev >= 0; --lev) { + // Get the grid size of the domain + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + + // get references to the MultiFabs at level lev + const MultiFab& phi_mf = phi[lev]; + + // create mask assuming refinement ratio = 2 + int finelev = lev + 1; + if (lev == finest_level) finelev = finest_level; + + const BoxArray& fba = phi[finelev].boxArray(); + const iMultiFab& mask = makeFineMask(phi_mf, fba, IntVect(2)); + + // Loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(phi_mf, TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tilebox = mfi.tilebox(); + + const Array4 mask_arr = mask.array(mfi); + const Array4 phi_arr = phi[lev].array(mfi, comp); + + bool use_mask = !(lev == finest_level); + + AMREX_PARALLEL_FOR_3D(tilebox, i, j, k, { + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + + // make sure the cell isn't covered by finer cells + bool cell_valid = true; + if (use_mask) { + if (mask_arr(i, j, k) == 1) cell_valid = false; + } + + if (cell_valid) { + // compute distance to center + Real radius = sqrt(x * x + y * y + z * z); + + // compute distances in mapped coordinates + Real xp = sqrt(x * x + y * y); + Real yp = center_p[2] + z; + + // figure out which (i,j) index this point maps into + // TODO: could give smoother results if coarse grid data is + // mapped into multiple fine grids + int index_i = int(round(xp / dxFine[0] - 0.5)); + int index_j = int(round(yp / dxFine[2] - 0.5)); + + // TODO: currently does not take data in domain corners + if (index_i < xlen and index_j < ylen) { + amrex::HostDevice::Atomic::Add( + &(phisum(index_i, index_j)), phi_arr(i, j, k)); + amrex::HostDevice::Atomic::Add( + &(ncell(index_i, index_j)), 1); + } + } + }); + } + } + + // reduction over boxes to get sum + ParallelDescriptor::ReduceRealSum(phisum.dataPtr(), xlen * ylen); + ParallelDescriptor::ReduceIntSum(ncell.dataPtr(), xlen * ylen); + + // normalize phisum so it actually stores the averages + for (auto i = 0; i < xlen; ++i) { + for (auto k = 0; k < ylen; ++k) { + if (ncell(i, k) != 0) { + phisum(i, k) /= Real(ncell(i, k)); + } + } + } + + // Put average array into 2D MultiFab + // Loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(phibar[0], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tilebox = mfi.tilebox(); + const Array4 phibar_arr = phibar[0].array(mfi, barcomp); + + AMREX_PARALLEL_FOR_3D(tilebox, i, j, k, { + phibar_arr(i, j, k) = 0.0; + if (j == 0) phibar_arr(i, j, k) = phisum(i, k); + }); + } +} diff --git a/Util/postprocess/Fill3dData.cpp b/Util/postprocess/Fill3dData.cpp new file mode 100644 index 000000000..3acab8219 --- /dev/null +++ b/Util/postprocess/Fill3dData.cpp @@ -0,0 +1,110 @@ +/* + A collection of routines for mapping 1D arrays onto multi-D cartesian MultiFabs + */ + +#include +#include "AMReX_MultiFabUtil.H" + +using namespace amrex; + +void Postprocess::PutDataOnFaces( + const Vector& s_cc, + Vector >& face, + const bool harmonic_avg) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::PutDataOnFaces()", PutDataOnFaces); + + for (int lev = 0; lev <= finest_level; ++lev) { + // need one cell-centered MF for the MFIter + const MultiFab& scc_mf = s_cc[lev]; + + // loop over boxes (make sure mfi takes a cell-centered multifab as an argument) +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(scc_mf, TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& xbx = mfi.nodaltilebox(0); + const Box& ybx = mfi.nodaltilebox(1); +#if (AMREX_SPACEDIM == 3) + const Box& zbx = mfi.nodaltilebox(2); +#endif + + const Array4 scc = s_cc[lev].array(mfi); + const Array4 facex = face[lev][0].array(mfi); + const Array4 facey = face[lev][1].array(mfi); +#if (AMREX_SPACEDIM == 3) + const Array4 facez = face[lev][2].array(mfi); +#endif + + if (harmonic_avg) { + AMREX_PARALLEL_FOR_3D(xbx, i, j, k, { + Real denom = scc(i, j, k) + scc(i - 1, j, k); + Real prod = scc(i, j, k) * scc(i - 1, j, k); + + if (denom != 0.0) { + facex(i, j, k) = 2.0 * prod / denom; + } else { + facex(i, j, k) = 0.5 * denom; + } + }); + + AMREX_PARALLEL_FOR_3D(ybx, i, j, k, { + Real denom = scc(i, j, k) + scc(i, j - 1, k); + Real prod = scc(i, j, k) * scc(i, j - 1, k); + + if (denom != 0.0) { + facey(i, j, k) = 2.0 * prod / denom; + } else { + facey(i, j, k) = 0.5 * denom; + } + }); +#if (AMREX_SPACEDIM == 3) + AMREX_PARALLEL_FOR_3D(zbx, i, j, k, { + Real denom = scc(i, j, k) + scc(i, j, k - 1); + Real prod = scc(i, j, k) * scc(i, j, k - 1); + + if (denom != 0.0) { + facez(i, j, k) = 2.0 * prod / denom; + } else { + facez(i, j, k) = 0.5 * denom; + } + }); +#endif + } else { + AMREX_PARALLEL_FOR_3D(xbx, i, j, k, { + facex(i, j, k) = 0.5 * (scc(i, j, k) + scc(i - 1, j, k)); + }); + AMREX_PARALLEL_FOR_3D(ybx, i, j, k, { + facey(i, j, k) = 0.5 * (scc(i, j, k) + scc(i, j - 1, k)); + }); +#if (AMREX_SPACEDIM == 3) + AMREX_PARALLEL_FOR_3D(zbx, i, j, k, { + facez(i, j, k) = 0.5 * (scc(i, j, k) + scc(i, j, k - 1)); + }); +#endif + } + } + } + + // Make sure that the fine edges average down onto the coarse edges (edge_restriction) + AverageDownFaces(face); +} + +void Postprocess::AverageDownFaces( + Vector >& edge) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::AverageDownFaces()", AverageDownFaces); + + for (int lev = finest_level - 1; lev >= 0; --lev) { + Vector edge_f(AMREX_SPACEDIM); + Vector edge_c(AMREX_SPACEDIM); + + for (int dir = 0; dir < AMREX_SPACEDIM; ++dir) { + edge_f[dir] = &(edge[lev + 1][dir]); + edge_c[dir] = &(edge[lev][dir]); + } + + amrex::average_down_faces(edge_f, edge_c, IntVect(2)); + } +} diff --git a/Util/postprocess/GNUmakefile b/Util/postprocess/GNUmakefile new file mode 100644 index 000000000..d45af0a76 --- /dev/null +++ b/Util/postprocess/GNUmakefile @@ -0,0 +1,30 @@ +PRECISION = DOUBLE +PROFILE = FALSE +DEBUG = FALSE +DIM = 3 + +COMP = gnu + +USE_MPI = TRUE +USE_OMP = FALSE + +USE_REACT = TRUE + +# programs to be compiled +ALL: radial_$(DIM)d.ex + +Bpack := ./Make.package +Blocs := . + +MAESTROEX_HOME := ../.. + +EOS_DIR := gamma_law_general +CONDUCTIVITY_DIR := constant +NETWORK_DIR := general_null +NETWORK_INPUTS := H_He.net + +include $(MAESTROEX_HOME)/Exec/Make.Maestro + +radial_$(DIM)d.ex: $(objForExecs) + @echo Linking $@ ... + $(SILENT) $(PRELINK) $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(LDFLAGS) -o $@ $^ $(libraries) diff --git a/Util/postprocess/InputFile.cpp b/Util/postprocess/InputFile.cpp new file mode 100644 index 000000000..d4b67cb45 --- /dev/null +++ b/Util/postprocess/InputFile.cpp @@ -0,0 +1,118 @@ +#include +#include + +using namespace amrex; + +// ------------------------------------------ +// Read input parameters from job info file +// ------------------------------------------ + +// Gets the variable ``varname`` from the ``job_info`` file and returns as a +// string +std::string Postprocess::GetVarFromJobInfo(const std::string pltfile, + const std::string& varname) { + std::string filename = pltfile + "/job_info"; + std::regex re("(?:[ \\t]*)" + varname + "\\s*=\\s*(.*)\\s*\\n"); + //std::regex re(varname + " = ([^ ]*)\\n"); + + std::smatch m; + + std::ifstream jobfile(filename); + if (jobfile.is_open()) { + std::stringstream buf; + buf << jobfile.rdbuf(); + std::string file_contents = buf.str(); + + if (std::regex_search(file_contents, m, re)) { + return m[1]; + } else { + Print() << "Unable to find " << varname << " in job_info file!" + << std::endl; + } + } else { + Print() << "Could not open job_info file!" << std::endl; + } + + return ""; +} + +// Get drdxfac from the job info file +int Postprocess::GetdrdxFac(const std::string pltfile) { + auto drdxfac_str = GetVarFromJobInfo(pltfile, "maestro.drdxfac"); + // Print() << "drdxfac_str = " << drdxfac_str << std::endl; + + if (drdxfac_str == "") { + return 5; + } + + // retrieve first number + std::istringstream iss{drdxfac_str}; + int drdxfac; + std::string s; + if (std::getline(iss, s, ' ')) drdxfac = stoi(s); + + return drdxfac; +} + +// Get octant from the job info file +bool Postprocess::GetOctant(const std::string pltfile) { + auto octant_str = GetVarFromJobInfo(pltfile, "maestro.octant"); + + if (octant_str == "true") + return true; + else + // Print() << "octant_str = " << octant_str << std::endl; + return false; +} + +// Get gamma from the job info file +Real Postprocess::GetGamma(const std::string pltfile) { + auto gamma_str = GetVarFromJobInfo(pltfile, "eos_gamma"); + // Print() << "gamma_str = " << gamma_str << std::endl; + + // retrieve first number + std::istringstream iss{gamma_str}; + Real gamma; + std::string s; + if (std::getline(iss, s, ' ')) gamma = stod(s); + + return gamma; +} + +// Get rotation frequency from the job info file +Real Postprocess::GetRotationFreq(const std::string pltfile) { + auto rotationfreq_str = + GetVarFromJobInfo(pltfile, "maestro.rotational_frequency"); + // Print() << "rotationfreq_str = " << rotationfreq_str << std::endl; + + // retrieve first number + std::istringstream iss{rotationfreq_str}; + Real freq0; + std::string s; + if (std::getline(iss, s, ' ')) freq0 = stod(s); + + return freq0; +} + +// Get time step of plot file +int Postprocess::GetTimeStep(const std::string plotfilename, + const std::string basefilename) { + int base = basefilename.length(); + std::string timestep_str = plotfilename.substr(base, 7); + + return stoi(timestep_str); +} + +// Get max grid size from the job info file +int Postprocess::GetMaxGridSize(const std::string pltfile) { + auto maxgridsize_str = GetVarFromJobInfo(pltfile, "amr.max_grid_size"); + // Print() << "maxgridsize_str = " << maxgridsize_str << std::endl; + + // retrieve first number + std::istringstream iss{maxgridsize_str}; + int max_grid_size; + std::string s; + if (std::getline(iss, s, ' ')) max_grid_size = stoi(s); + + return max_grid_size; +} diff --git a/Util/postprocess/Make.package b/Util/postprocess/Make.package new file mode 100644 index 000000000..fdba61441 --- /dev/null +++ b/Util/postprocess/Make.package @@ -0,0 +1,8 @@ +CEXE_headers += Postprocess.H +CEXE_sources += Postprocess.cpp +CEXE_sources += Radial.cpp +CEXE_sources += Slice.cpp +CEXE_sources += Average.cpp +CEXE_sources += Fill3dData.cpp +CEXE_sources += InputFile.cpp +CEXE_sources += test.cpp \ No newline at end of file diff --git a/Util/postprocess/Postprocess.H b/Util/postprocess/Postprocess.H new file mode 100644 index 000000000..d653a561f --- /dev/null +++ b/Util/postprocess/Postprocess.H @@ -0,0 +1,180 @@ +#include +#include + +class Postprocess { + public: + /* public member functions */ + + /// constructor + Postprocess(); + + /// destructor + virtual ~Postprocess(); + + /// initialize simulation by reading in plot file + void init(); + + /// write out diagnostics + void diag(); + + // ---------------------------- + // InputFile.cpp functions + // ---------------------------- + + // Read parameters from job info file + std::string GetVarFromJobInfo(const std::string pltfile, + const std::string& varname); + + int GetdrdxFac(const std::string pltfile); + + bool GetOctant(const std::string pltfile); + + amrex::Real GetGamma(const std::string pltfile); + + amrex::Real GetRotationFreq(const std::string pltfile); + + int GetTimeStep(const std::string plotfile, const std::string basefile); + + int GetMaxGridSize(const std::string pltfile); + + // ---------------------------- + // in Radial.cpp + // ---------------------------- + + // write radial plotfile to disk + void WriteRadialFile(const BaseState& rho0_in, + const BaseState& p0_in, + const amrex::Vector& u_in, + const amrex::Vector& w0_in); + + // write additional diagnostics from model file + void WriteModelDiagFile(const std::string& plotfilename); + + // read radial file from disk + void ReadBaseCCFile(BaseState& r_in, + BaseState& rho0_in, + BaseState& p0_in); + + // read input model file from disk + void ReadModelFile(const std::string& plotfilename, + BaseState& r_in, + BaseState& rho0_in, + BaseState& p0_in); + + // postprocessing subroutines + void MakeRadialNFreq(const BaseState& p0_s, + const BaseState& rho0_s, + BaseState& freq0, + BaseState& entropy_s, + BaseState& grav_s); + + void MakeRadialGrav(const BaseState& rho0_in, + BaseState& grav, + const BaseStateArray& r_cc_loc); + + void MakeConvectionVel(const amrex::Vector& velr, + BaseState& vel_conv); + + void MakeRadialRotationRatio(const BaseState& s0_in, + const amrex::Vector& omega, + BaseState& ratio_omega); + + void MakeVelrc(const amrex::Vector& vel, + const amrex::Vector& w0rcart, + amrex::Vector& rad_vel, + amrex::Vector& circ_vel); + + void MakeRotationRate(const amrex::Vector& vel, + const amrex::Vector& w0cart, + amrex::Vector& omega); + + void MakeLatShear(const amrex::Vector& omega_in, + BaseState& shear, + const BaseStateArray& r_cc_loc); + + void MakeLatShearAvg(const amrex::Vector& omega_in, + BaseState& shear); + + // ---------------------------- + // Slice.cpp functions + // ---------------------------- + + // write 2d slice plotfile to disk + void Write2dSliceFile(const amrex::Vector& rho_in, + const amrex::Vector& p_in, + const amrex::Vector& u_in, + const amrex::Vector& w0_in, + const int deltat = 0, const int nfiles = 0); + + void PlotFileName(const int timestep, std::string* basefilename, + std::string* plotfilename); + + void MakeMeridionalCirculation( + const amrex::Vector& vel, + const amrex::Vector& w0rcart, + amrex::Vector& radii_vel, + const amrex::Vector& domFine); + + void MakeBaroclinity(const amrex::Vector& rho_s, + const amrex::Vector& p_s, + amrex::Vector& baroclinity, + const amrex::Vector& domFine); + + // ---------------------------- + // Average.cpp functions + // ---------------------------- + + // compute radially-averaged values + void Average(const amrex::Vector& phi, + BaseState& phibar, int comp); + + // compute averaged value onto r-theta (x-z) plane + void Average2d(const amrex::Vector& phi, + amrex::Vector& phibar, int barcomp, + const amrex::Vector& bardomain, int comp); + + // ---------------------------- + // Fill3dData.cpp functions + // ---------------------------- + + void PutDataOnFaces( + const amrex::Vector& s_cc, + amrex::Vector >& face, + const bool harmonic_avg); + + void AverageDownFaces( + amrex::Vector >& edge); + + // ---------------------------- + // test.cpp functions + // ---------------------------- + + // write plot file for exact solution test case + void test(); + + void WriteTestJobInfo(const std::string& dir, const std::string& base, + const int maxgridsize); + + /* private data members */ + + // these are defined in `Postprocess.cpp` + static amrex::IntVect nodal_flag; + static amrex::IntVect nodal_flag_x; + static amrex::IntVect nodal_flag_y; + static amrex::IntVect nodal_flag_z; + + // plotfile name + std::string iFile; + + // input parameters + std::string imFile; + std::string deltat, numfiles; + + // geometry data + int finest_level = 0; + BaseStateGeometry base_geom; + amrex::Vector grid; + amrex::Vector dmap; + amrex::Vector pgeom; + amrex::GpuArray center; +}; diff --git a/Util/postprocess/Postprocess.cpp b/Util/postprocess/Postprocess.cpp new file mode 100644 index 000000000..b5ac53c77 --- /dev/null +++ b/Util/postprocess/Postprocess.cpp @@ -0,0 +1,159 @@ +#include +#include +#include + +using namespace amrex; + +// helper IntVects used to define face/nodal MultiFabs +#if (AMREX_SPACEDIM == 2) +IntVect Postprocess::nodal_flag(1, 1); +IntVect Postprocess::nodal_flag_x(1, 0); +IntVect Postprocess::nodal_flag_y(0, 1); +#elif (AMREX_SPACEDIM == 3) +IntVect Postprocess::nodal_flag(1, 1, 1); +IntVect Postprocess::nodal_flag_x(1, 0, 0); +IntVect Postprocess::nodal_flag_y(0, 1, 0); +IntVect Postprocess::nodal_flag_z(0, 0, 1); +#endif + +// constructor +Postprocess::Postprocess() = default; +// destructor +Postprocess::~Postprocess() = default; + +// initialize data +void Postprocess::init() { + // read in parameters from inputs file + ParmParse pp; + pp.query("infile", iFile); + if (iFile.empty()) { + Print() << "WARNING: Plotfile was not specified!\n"; + Print() << "Running exact solution test problem" << std::endl; + test(); + iFile = "test_plt0000000"; + } else { + // initialize species + maestro_network_init(); + } + + // optional parameters + pp.query("modelfile", imFile); + pp.query("dt", deltat); + pp.query("nfiles", numfiles); + + // read input grid + amrex::PlotFileData pltfile(iFile); + finest_level = pltfile.finestLevel(); + const auto probLo = pltfile.probLo(); + const auto probHi = pltfile.probHi(); + + grid.resize(finest_level + 1); + dmap.resize(finest_level + 1); + pgeom.resize(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + grid[lev] = pltfile.boxArray(lev); + dmap[lev] = pltfile.DistributionMap(lev); + + Box domain = pltfile.probDomain(lev); + RealBox real_box(probLo, probHi); + pgeom[lev].define(domain, &real_box); + } + + // setup geometry + const auto domainBoxFine = pltfile.probDomain(finest_level); + const auto dxFine = pltfile.cellSize(finest_level); + + // assume spherical + int drdxfac = GetdrdxFac(iFile); + bool octant = GetOctant(iFile); + base_geom.max_radial_level = 0; + base_geom.dr_fine = dxFine[0] / drdxfac; + int domhi = domainBoxFine.bigEnd(0) + 1; + + // assume constant dr + if (!octant) { + base_geom.nr_irreg = int( + round((3 * (domhi / 2 - 0.5) * (domhi / 2 - 0.5) - 0.75) / 2.0)); + } else { + base_geom.nr_irreg = + int(round((3 * (domhi - 0.5) * (domhi - 0.5) - 0.75) / 2.0)); + } + + double lenx, leny, lenz, max_dist; + if (octant) { + lenx = probHi[0] - probLo[0]; + leny = probHi[1] - probLo[1]; + lenz = probHi[2] - probLo[2]; + } else { + lenx = 0.5 * (probHi[0] - probLo[0]); + leny = 0.5 * (probHi[1] - probLo[1]); + lenz = 0.5 * (probHi[2] - probLo[2]); + } + max_dist = sqrt(lenx * lenx + leny * leny + lenz * lenz); + base_geom.nr_fine = int(max_dist / base_geom.dr_fine) + 1; + + base_geom.Init(base_geom.max_radial_level, base_geom.nr_fine, + base_geom.dr_fine, base_geom.nr_irreg, pgeom, finest_level, + center); +} + +// write diagnostics +void Postprocess::diag() { + amrex::PlotFileData pltfile(iFile); + + // read input MultiFabs + Vector rho_mf(finest_level + 1); + Vector p0_mf(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + rho_mf[lev] = pltfile.get(lev, "rho"); + p0_mf[lev] = pltfile.get(lev, "p0"); + } + + Vector u_mf(finest_level + 1); + Vector w0_mf(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + u_mf[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + w0_mf[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + } + + // velocities + for (int i = 0; i < AMREX_SPACEDIM; ++i) { + std::string x = "vel"; + std::string w = "w0"; + x += (120 + i); + w += (120 + i); + + for (int lev = 0; lev <= finest_level; ++lev) { + MultiFab::Copy(u_mf[lev], pltfile.get(lev, x), 0, i, 1, 0); + MultiFab::Copy(w0_mf[lev], pltfile.get(lev, w), 0, i, 1, 0); + } + } + + // Radial states + BaseState rho0(base_geom.max_radial_level + 1, base_geom.nr_fine); + BaseState p0(base_geom.max_radial_level + 1, base_geom.nr_fine); + + Average(rho_mf, rho0, 0); + Average(p0_mf, p0, 0); + + // Write radial output file + Print() << "Writing radial diag file" << std::endl; + WriteRadialFile(rho0, p0, u_mf, w0_mf); + + // Write 2D slice output file + if (deltat.empty() || numfiles.empty()) { + Print() << "Writing 2D slice file for single plot file" << std::endl; + Write2dSliceFile(rho_mf, p0_mf, u_mf, w0_mf); + } else { + Print() << "Writing 2D slice file for " << stoi(numfiles) + 1 + << " plot files" << std::endl; + Write2dSliceFile(rho_mf, p0_mf, u_mf, w0_mf, stoi(deltat), + stoi(numfiles)); + } + + // Write diag file for initial model if specified + if (!imFile.empty()) { + Print() << "Writing diag file for initial model" << std::endl; + WriteModelDiagFile(imFile); + } +} diff --git a/Util/postprocess/README.md b/Util/postprocess/README.md new file mode 100644 index 000000000..7b22e9fd4 --- /dev/null +++ b/Util/postprocess/README.md @@ -0,0 +1,70 @@ +# Rotating fully convective star diagnostics + +Process a fully convective star problem to produce a set of diagnostic measures +including: + +- **Convection speed**: The root-mean-squared radial velocity + + + +- **Ratio of mean rotation rates to surface rotation**: + + + +Note that the denominator is currently set at the surface, but it does not strictly need to be at the surface; it just needs to be at a fixed radius. + +- **Meridional circulation**: There are two components, radial and polar circulation + +, + + + +where and are the radial and polar velocities. +The instantaneous circulation components are computed by neglecting the time-averaging terms. + +- **Baroclinity**: Averaged over the azimuthal angle + +. + + +- **Latitudinal shear**: Expressed as the projection of the rotation profile onto the (*l=2*,*m=0*) spherical harmonic, averaged over the surface. This can be computed in Cartesian coordinates + + + +using a normalized Gaussian kernel + + + +with kernel width + + + +where *L* is the half length of the problem domain. +Here, + + + +- **Brünt-Väisälä frequency**: + + + +where is the acceleration due to gravity and *s* is a dimensionless entropy. + + +## Building & running + +The n-dimensional diagnostic can be built by executing `make DIM=n`. This will +produce the executable `radial_nd.exe`. Note that `DIM=3` is default setting and +the only one that is currently supported. To run, the executable must be provided +with the name of the plotfile to be analyzed: +``` +./radial_3d.exe infile=plotfile_name +``` + +Additional arguments are as follows: + +- **model file diagnostics**: extra argument `modelfile=modelfile_name` needs to be provided +- **exact solution test problem**: if `plotfile_name` is not provided, the code will write and evaluate a test problem with an exact solution. +- **time-averaged values**: two extra arguments need to be provided + 1. `dt=timesteps_between_plotfiles`, which is an integer value + 2. `nfiles=num_plotfiles` indicates the number of *additional* plotfiles needed, excluding the `infile` plotfile. diff --git a/Util/postprocess/Radial.cpp b/Util/postprocess/Radial.cpp new file mode 100644 index 000000000..a3ab7f234 --- /dev/null +++ b/Util/postprocess/Radial.cpp @@ -0,0 +1,717 @@ +#include +#include +#include "AMReX_PlotFileUtil.H" + +using namespace amrex; + +// --------------------------------- +// Write 1D radial diagnostics +// --------------------------------- +void Postprocess::WriteRadialFile(const BaseState& rho0_in, + const BaseState& p0_in, + const Vector& u_in, + const Vector& w0_in) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::WriteRadialFile()", WriteRadialFile); + + // MakeVelrc + Vector rad_vel(finest_level + 1); + Vector circ_vel(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + rad_vel[lev].define(u_in[lev].boxArray(), u_in[lev].DistributionMap(), + 1, 0); + circ_vel[lev].define(u_in[lev].boxArray(), u_in[lev].DistributionMap(), + 1, 0); + } + MakeVelrc(u_in, w0_in, rad_vel, circ_vel); + + // MakeConvectionVel + BaseState convect_vel(base_geom.max_radial_level + 1, + base_geom.nr_fine); + MakeConvectionVel(rad_vel, convect_vel); + + // MakeRotationRate + Vector omega(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + omega[lev].define(u_in[lev].boxArray(), u_in[lev].DistributionMap(), 1, + 0); + } + MakeRotationRate(u_in, w0_in, omega); + + // MakeRadialRotationRatio + BaseState ratio_omega(base_geom.max_radial_level + 1, + base_geom.nr_fine); + MakeRadialRotationRatio(p0_in, omega, ratio_omega); + + // MakeLatitudinalShear + BaseState latshear(base_geom.max_radial_level + 1, base_geom.nr_fine); + MakeLatShear(omega, latshear, base_geom.r_cc_loc); + //MakeLatShearAvg(omega, latshear); + + // MakeRadialNFreq + BaseState Nfreq(base_geom.max_radial_level + 1, base_geom.nr_fine); + BaseState s0(base_geom.max_radial_level + 1, base_geom.nr_fine); + BaseState grav0(base_geom.max_radial_level + 1, base_geom.nr_fine); + MakeRadialNFreq(p0_in, rho0_in, Nfreq, s0, grav0); + + std::string radialfilename = "radial_" + iFile; + + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); + + // write out the radial cell-centered diagnostics + if (ParallelDescriptor::IOProcessor()) { + for (int lev = 0; lev <= base_geom.max_radial_level; ++lev) { + std::ofstream RadialFile; + RadialFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), + io_buffer.size()); + RadialFile.open(radialfilename.c_str(), std::ofstream::out | + std::ofstream::trunc | + std::ofstream::binary); + if (!RadialFile.good()) { + amrex::FileOpenFailed(radialfilename); + } + + RadialFile.precision(12); + + RadialFile << "r_cc " + << "rho0 " + << "p0 " + << "convect_vel " + << "omega_ratio " + << "lat_shear " + << "|N|\n"; + + for (int i = 0; i < base_geom.nr(lev); ++i) { + RadialFile << std::left << std::setw(18) + << base_geom.r_cc_loc(lev, i) << " " << std::setw(18) + << rho0_in.array()(lev, i) << " " << std::setw(18) + << p0_in.array()(lev, i) << " " << std::setw(18) + << convect_vel.array()(lev, i) << " " + << std::setw(18) << ratio_omega.array()(lev, i) + << " " << std::setw(18) << latshear.array()(lev, i) + << " " << std::setw(18) << Nfreq.array()(lev, i) + << "\n"; + } + } + } +} + +// write additional diagnostics from model file +void Postprocess::WriteModelDiagFile(const std::string& plotfilename) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::WriteModelDiagFile()", WriteModelDiagFile); + + // Read from model file + BaseState r_cc, rho0, p0; + ReadModelFile(plotfilename, r_cc, rho0, p0); + + int npts = rho0.length(); + + // make dimensionless entropy + BaseState s0(1, npts); + const auto rho0_arr = rho0.const_array(); + const auto p0_arr = p0.const_array(); + auto entropy = s0.array(); + Real gamma = 5.0 / 3.0; + for (auto r = 0; r < npts; ++r) { + entropy(0, r) = 1.0 / (gamma - 1.0) * + (log(p0_arr(0, r)) - gamma * log(rho0_arr(0, r))); + } + + // make gravity + BaseState grav0(1, npts); + MakeRadialGrav(rho0, grav0, r_cc.array()); + + // make B-V frequency + BaseState Nfreq(1, npts); + const auto r_cc_loc = r_cc.const_array(); + const auto grav = grav0.const_array(); + auto freq = Nfreq.array(); + for (auto r = 0; r < npts; ++r) { + if (r == 0) { + freq(0, r) = -(gamma - 1.0) / gamma * grav(0, r) * + (entropy(0, r + 1) - entropy(0, r)) / + (r_cc_loc(0, r + 1) - r_cc_loc(0, r)); + } else if (p0_arr(0, r) > 1.e12) { + freq(0, r) = -(gamma - 1.0) / gamma * grav(0, r) * + (entropy(0, r + 1) - entropy(0, r - 1)) / + (r_cc_loc(0, r + 1) - r_cc_loc(0, r - 1)); + } else { + freq(0, r) = 0.0; + } + freq(0, r) = std::sqrt(fabs(freq(0, r))); + } + + std::string diagfilename = "diag_" + plotfilename; + + VisMF::IO_Buffer io_buffer(VisMF::IO_Buffer_Size); + + // write out the cell-centered diagnostics + if (ParallelDescriptor::IOProcessor()) { + std::ofstream DiagFile; + DiagFile.rdbuf()->pubsetbuf(io_buffer.dataPtr(), io_buffer.size()); + DiagFile.open(diagfilename.c_str(), std::ofstream::out | + std::ofstream::trunc | + std::ofstream::binary); + if (!DiagFile.good()) { + amrex::FileOpenFailed(diagfilename); + } + + DiagFile.precision(17); + + DiagFile << "r_cc rho0 p0 s0 grav0 |N| \n"; + + for (int i = 0; i < npts; ++i) { + DiagFile << r_cc.array()(0, i) << " " << rho0.array()(0, i) << " " + << p0.array()(0, i) << " " << s0.array()(0, i) << " " + << grav0.array()(0, i) << " " << Nfreq.array()(0, i) + << "\n"; + } + } +} + +// read BaseCC file from plotfile directory +void Postprocess::ReadBaseCCFile(BaseState& r_s, BaseState& rho0_s, + BaseState& p0_s) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::ReadBaseCCFile()", ReadBaseCCFile); + + auto r = r_s.array(); + auto rho0 = rho0_s.array(); + auto p0 = p0_s.array(); + BaseState rhoh0_s(base_geom.max_radial_level + 1, base_geom.nr_fine); + + // read BaseCC + std::string line, word; + std::string File(iFile + "/BaseCC_0"); + Vector fileCharPtr; + ParallelDescriptor::ReadAndBcastFile(File, fileCharPtr); + std::string fileCharPtrString(fileCharPtr.dataPtr()); + std::istringstream is(fileCharPtrString, std::istringstream::in); + + // read in cell-centered base state + std::getline(is, line); // header line + for (int i = 0; i < (base_geom.max_radial_level + 1) * base_geom.nr_fine; + ++i) { + std::getline(is, line); + std::istringstream lis(line); + lis >> word; + r(i) = std::stod(word); + lis >> word; + rho0(i) = std::stod(word); + lis >> word; + rhoh0_s.array()(i) = std::stod(word); + lis >> word; + p0(i) = std::stod(word); + lis >> word; + // gamma1bar isn't needed for now + } +} + +// read input model file from disk +void Postprocess::ReadModelFile(const std::string& plotfilename, + BaseState& r_s, BaseState& rho0_s, + BaseState& p0_s) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::ReadModelFile()", ReadModelFile); + + // read model file + std::string line, word; + std::string File(plotfilename); + Vector fileCharPtr; + ParallelDescriptor::ReadAndBcastFile(File, fileCharPtr); + std::string fileCharPtrString(fileCharPtr.dataPtr()); + std::istringstream is(fileCharPtrString, std::istringstream::in); + + // read in headers + // get npts, num vars + int npts, nvars, temp; + for (int i = 0; i < 2; ++i) { + std::getline(is, line); + std::istringstream lis(line); + while (lis) { + lis >> word; + if (std::stringstream(word) >> temp) { + if (i == 0) + npts = temp; + else if (i == 1) + nvars = temp; + } + } + } + // skip rest of headers + for (int i = 0; i < nvars; ++i) std::getline(is, line); + + // read in data + BaseState temp0_s(1, npts); + r_s.resize(1, npts); + rho0_s.resize(1, npts); + p0_s.resize(1, npts); + auto r = r_s.array(); + auto rho0 = rho0_s.array(); + auto p0 = p0_s.array(); + + for (int i = 0; i < npts; ++i) { + std::getline(is, line); + std::istringstream lis(line); + lis >> word; + r(0, i) = std::stod(word); + lis >> word; + rho0(0, i) = std::stod(word); + lis >> word; + temp0_s.array()(0, i) = std::stod(word); + lis >> word; + p0(0, i) = std::stod(word); + // species not needed + } +} + +void Postprocess::MakeRadialNFreq(const BaseState& p0_s, + const BaseState& rho0_s, + BaseState& freq0, + BaseState& entropy_s, + BaseState& grav_s) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeRadialNFreq()", MakeRadialNFreq); + + //BaseState entropy_s(1, base_geom.nr_fine); + //BaseState grav_s(1, base_geom.nr_fine); + + // compute gravity + // analogous to Maestro::MakeGravCell(grav_s,rho0_s); + MakeRadialGrav(rho0_s, grav_s, base_geom.r_cc_loc); + + const auto& r_cc_loc = base_geom.r_cc_loc; + const auto rho0 = rho0_s.const_array(); + const auto p0 = p0_s.const_array(); + const auto grav = grav_s.const_array(); + auto entropy = entropy_s.array(); + Real gamma = GetGamma(iFile); + + // dimensionless entropy = 1/(gam - 1)*( log(p) - gamma*log(rho) ) + for (auto r = 0; r < base_geom.nr_fine; ++r) { + entropy(0, r) = + 1.0 / (gamma - 1.0) * (log(p0(0, r)) - gamma * log(rho0(0, r))); + } + + // B-V freq = -(gam -1)/gam * g * grad(entropy) + auto freq = freq0.array(); + for (auto r = 0; r < base_geom.nr_fine; ++r) { + if (r == 0) { + freq(0, r) = -(gamma - 1.0) / gamma * grav(0, r) * + (entropy(0, r + 1) - entropy(0, r)) / + (r_cc_loc(0, r + 1) - r_cc_loc(0, r)); + } else if (p0(0, r) > 1.e12) { + freq(0, r) = -(gamma - 1.0) / gamma * grav(0, r) * + (entropy(0, r + 1) - entropy(0, r - 1)) / + (r_cc_loc(0, r + 1) - r_cc_loc(0, r - 1)); + } else { + freq(0, r) = 0.0; + } + freq(0, r) = std::sqrt(fabs(freq(0, r))); + } +} + +void Postprocess::MakeRadialGrav(const BaseState& rho0_in, + BaseState& grav, + const BaseStateArray& r_cc_loc) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeRadialGrav()", MakeRadialGrav); + + auto grav_arr = grav.array(); + const auto rho0 = rho0_in.const_array(); + const auto nr_fine = r_cc_loc.length(); + + // assume spherical + BaseState m_state(1, nr_fine); + auto m = m_state.array(); + + m(0, 0) = 4.0 / 3.0 * M_PI * rho0(0, 0) * r_cc_loc(0, 0) * r_cc_loc(0, 0) * + r_cc_loc(0, 0); + grav_arr(0, 0) = -C::Gconst * m(0, 0) / (r_cc_loc(0, 0) * r_cc_loc(0, 0)); + + for (auto r = 1; r < nr_fine; ++r) { + // the mass is defined at the cell-centers, so to compute + // the mass at the current center, we need to add the + // contribution of the upper half of the zone below us and + // the lower half of the current zone. + + // don't add any contributions from outside the star -- + // i.e. rho < base_cutoff_density + + // assume constant radial spacing, dr + Real r_edge_loc = (r_cc_loc(0, r - 1) + r_cc_loc(0, r)) / 2.0; + + Real term1 = 0.0; + if (rho0(0, r - 1) > base_cutoff_density) { + term1 = 4.0 / 3.0 * M_PI * rho0(0, r - 1) * + (r_edge_loc - r_cc_loc(0, r - 1)) * + (r_edge_loc * r_edge_loc + r_edge_loc * r_cc_loc(0, r - 1) + + r_cc_loc(0, r - 1) * r_cc_loc(0, r - 1)); + } + + Real term2 = 0.0; + if (rho0(0, r) > base_cutoff_density) { + term2 = 4.0 / 3.0 * M_PI * rho0(0, r) * + (r_cc_loc(0, r) - r_edge_loc) * + (r_cc_loc(0, r) * r_cc_loc(0, r) + + r_cc_loc(0, r) * r_edge_loc + r_edge_loc * r_edge_loc); + } + + m(0, r) = m(0, r - 1) + term1 + term2; + + grav_arr(0, r) = + -C::Gconst * m(0, r) / (r_cc_loc(0, r) * r_cc_loc(0, r)); + } +} + +void Postprocess::MakeConvectionVel(const Vector& velr, + BaseState& vel_conv) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeConvectionVel()", MakeConvectionVel); + + Vector vel2(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + vel2[lev].define(velr[lev].boxArray(), velr[lev].DistributionMap(), 1, + 0); + } + + for (int lev = 0; lev <= finest_level; ++lev) { +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(velr[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 velr_arr = velr[lev].array(mfi); + const Array4 vel2_arr = vel2[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + vel2_arr(i, j, k) = 0.0; + + // square radial vel + vel2_arr(i, j, k) = velr_arr(i, j, k) * velr_arr(i, j, k); + }); + } + } + + // average down and fill ghost cells + // AverageDown(vel2, 0, 1); + // FillPatch(t0, vel2, vel2, vel2, 0, 0, 1, 0, bcs_f); + + // radial average of square of radial vel + Average(vel2, vel_conv, 0); + + // root-mean-squared radial velocity + auto vel_conv_arr = vel_conv.array(); + + for (auto r = 0; r < base_geom.nr_fine; ++r) { + vel_conv_arr(0, r) = std::sqrt(vel_conv_arr(0, r)); + } +} + +void Postprocess::MakeRadialRotationRatio(const BaseState& s0_in, + const Vector& omega, + BaseState& ratio_omega) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::RadialRotationRatio()", + MakeRadialRotationRatio); + + // radial average of rotation rate + Average(omega, ratio_omega, 0); + + // find radius of surface + int r_coord_surface = base_geom.nr_fine - 1; + const auto s0 = s0_in.const_array(); + for (auto r = 0; r < base_geom.nr_fine - 1; ++r) { + if (s0(0, r) == s0(0, r + 1)) { + r_coord_surface = r; + break; + } + } + + // divide by rotation rate at surface + auto ratio_omega_arr = ratio_omega.array(); + + for (auto r = 0; r < base_geom.nr_fine; ++r) { + if (r < r_coord_surface) + ratio_omega_arr(0, r) /= ratio_omega_arr(0, r_coord_surface); + else + ratio_omega_arr(0, r) = 1.0; + } +} + +void Postprocess::MakeVelrc(const Vector& vel, + const Vector& w0rcart, + Vector& rad_vel, + Vector& circ_vel) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeVelrc()", MakeVelrc); + + const auto& center_p = center; + + for (int lev = 0; lev <= finest_level; ++lev) { + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 vel_arr = vel[lev].array(mfi); + const Array4 radvel_arr = rad_vel[lev].array(mfi); + const Array4 circvel_arr = circ_vel[lev].array(mfi); + const Array4 w0rcart_arr = w0rcart[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + circvel_arr(i, j, k) = 0.0; + radvel_arr(i, j, k) = 0.0; + + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real inv_radius = 1.0 / sqrt(x * x + y * y + z * z); + + Vector normal(3); + normal[0] = x * inv_radius; + normal[1] = y * inv_radius; + normal[2] = z * inv_radius; + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + radvel_arr(i, j, k) += vel_arr(i, j, k, n) * normal[n]; + } + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + Real circ_comp = + vel_arr(i, j, k, n) - radvel_arr(i, j, k) * normal[n]; + circvel_arr(i, j, k) += circ_comp * circ_comp; + } + + circvel_arr(i, j, k) = sqrt(circvel_arr(i, j, k)); + + // add base state vel to get full radial velocity + radvel_arr(i, j, k) += w0rcart_arr(i, j, k); + }); + } + } + + // average down and fill ghost cells + // AverageDown(rad_vel, 0, 1); + // FillPatch(t0, rad_vel, rad_vel, rad_vel, 0, 0, 1, 0, bcs_f); + // AverageDown(circ_vel, 0, 1); + // FillPatch(t0, circ_vel, circ_vel, circ_vel, 0, 0, 1, 0, bcs_f); +} + +void Postprocess::MakeRotationRate(const Vector& vel, + const Vector& w0cart, + Vector& omega) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeRotationRate()", MakeRotationRate); + + auto omega0 = GetRotationFreq(iFile); + const auto& center_p = center; + + for (int lev = 0; lev <= finest_level; ++lev) { + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 vel_arr = vel[lev].array(mfi); + const Array4 w0cart_arr = w0cart[lev].array(mfi); + const Array4 omega_arr = omega[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + omega_arr(i, j, k) = 0; + + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real inv_radius = 1.0 / sqrt(x * x + y * y + z * z); + Real inv_rsin = 1.0 / sqrt(x * x + y * y); + + Real phi_x = -y * inv_radius * inv_rsin; + Real phi_y = x * inv_radius * inv_rsin; + + omega_arr(i, j, k) = + phi_x * (vel_arr(i, j, k, 0) + w0cart_arr(i, j, k)) + + phi_y * (vel_arr(i, j, k, 1) + w0cart_arr(i, j, k)); + + // add constant rotation to get full rotation + omega_arr(i, j, k) += omega0; + }); + } + } + + // average down and fill ghost cells + // AverageDown(omega, 0, 1); + // FillPatch(t0, omega, omega, omega, 0, 0, 1, 0, bcs_f); +} + +void Postprocess::MakeLatShear(const Vector& omega_in, + BaseState& shear, + const BaseStateArray& r_cc_loc) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeLatShear()", MakeLatShear); + + // Vector shear_cart(finest_level+1); + // for (int lev = 0; lev <= finest_level; ++lev) { + // shear_cart[lev].define(grid[lev], dmap[lev], 1, 0); + // } + + auto shear_arr = shear.array(); + const auto nr_fine = r_cc_loc.length(); + const auto& center_p = center; + + const Real maxfac = 0.5; + Real dx_fine; + const auto probLo = pgeom[0].ProbLoArray(); + const auto probHi = pgeom[0].ProbHiArray(); + Real halfdom = + 0.5 * amrex::min(probHi[0] - probLo[0], probHi[1] - probLo[1]); +#if AMREX_SPACEDIM == 3 + halfdom = amrex::min(halfdom, 0.5 * (probHi[2] - probLo[2])); +#endif + + for (int r = 0; r < nr_fine; ++r) { + Real rr = r_cc_loc(0, r); + Real totkernel = 0.0; + shear_arr(0, r) = 0.0; + + for (int lev = finest_level; lev >= 0; --lev) { + // Get grid size of domain + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + + // create mask assuming refinement ratio = 2 + int finelev = lev + 1; + if (lev == finest_level) { + finelev = finest_level; + dx_fine = dx[0]; + } + + const BoxArray& fba = omega_in[finelev].boxArray(); + const iMultiFab& mask = + makeFineMask(omega_in[lev], fba, IntVect(2)); + +#ifdef _OPENMP +#pragma omp parallel if (!system::regtest_reduction) +#endif + for (MFIter mfi(omega_in[lev], TilingIfNotGPU()); mfi.isValid(); + ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 mask_arr = mask.array(mfi); + const Array4 omega_arr = omega_in[lev].array(mfi); + + bool use_mask = !(lev == finest_level); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real radius = std::sqrt(x * x + y * y + z * z); + + // make sure the cell isn't covered by finer cells + bool cell_valid = true; + if (use_mask) { + if (mask_arr(i, j, k) == 1) { + cell_valid = false; + } + } + + if (cell_valid) { + // Y_{2,0} spherical harmonic + Real Y20 = 0.25 * std::sqrt(5.0 / M_PI) * + (2 * z * z - x * x - y * y) / + (radius * radius); + + // normalized Gaussian + Real width = amrex::min(maxfac, rr / halfdom) * + dx_fine * dx_fine; + Real kernel = + std::exp(-(radius - rr) * (radius - rr) / width) / + std::sqrt(M_PI * width); + + amrex::HostDevice::Atomic::Add( + &(shear_arr(0, r)), + omega_arr(i, j, k) * Y20 * kernel); + amrex::HostDevice::Atomic::Add(&totkernel, kernel); + } + }); + } + } + + // reduction over boxes to get sum + ParallelDescriptor::ReduceRealSum(&(shear_arr(0, r)), 1); + ParallelDescriptor::ReduceRealSum(&totkernel, 1); + + // normalize shear so it actually stores the average at radius r + if (totkernel != 0.0) { + shear_arr(0, r) /= totkernel; + } + } +} + +void Postprocess::MakeLatShearAvg(const Vector& omega_in, + BaseState& shear) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeLatShearAvg()", MakeLatShearAvg); + + Vector omegaY(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + omegaY[lev].define(omega_in[lev].boxArray(), + omega_in[lev].DistributionMap(), 1, 0); + } + + const auto& center_p = center; + + for (int lev = 0; lev <= finest_level; ++lev) { + // Get grid size of domain + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(omega_in[lev], TilingIfNotGPU()); mfi.isValid(); + ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 omega_arr = omega_in[lev].array(mfi); + const Array4 omegaY_arr = omegaY[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real radius = std::sqrt(x * x + y * y + z * z); + + // Y_{2,0} spherical harmonic + Real Y20 = 0.25 * std::sqrt(5.0 / M_PI) * + (2 * z * z - x * x - y * y) / (radius * radius); + + // square radial vel + omegaY_arr(i, j, k) = omega_arr(i, j, k) * Y20; + }); + } + } + + // average down and fill ghost cells + // AverageDown(omegaY, 0, 1); + // FillPatch(t0, omegaY, omegaY, omegaY, 0, 0, 1, 0, bcs_f); + + // radial average of omega*Y20 + Average(omegaY, shear, 0); +} diff --git a/Util/postprocess/Slice.cpp b/Util/postprocess/Slice.cpp new file mode 100644 index 000000000..754124de0 --- /dev/null +++ b/Util/postprocess/Slice.cpp @@ -0,0 +1,424 @@ +#include +#include +#include "AMReX_PlotFileUtil.H" + +using namespace amrex; + +// ------------------------------------------ +// Write 2D r-theta slice diagnostics +// ------------------------------------------ +void Postprocess::Write2dSliceFile(const Vector& rho_in, + const Vector& p_in, + const Vector& u_in, + const Vector& w0_in, + const int deltat, const int nfiles) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::Write2dSliceFile()", Write2dSliceFile); + + // need single-level finest grid for whole domain + // TODO: domain size should be larger than simply half x-z slice + // since its diagonal plane has the largest area + const Box& domain0 = pgeom[0].Domain(); + auto dom0_lo = domain0.loVect(); + auto dom0_hi = domain0.hiVect(); + IntVect ncell(0, 1, 0); + ncell[0] = (dom0_hi[0] + 1) * (finest_level + 1) / 2 - 1; + ncell[2] = (dom0_hi[2] + 1) * (finest_level + 1) - 1; + + IntVect domLo(AMREX_D_DECL(dom0_lo[0], dom0_lo[1], dom0_lo[2])); + IntVect domHi(AMREX_D_DECL(ncell[0], ncell[1], ncell[2])); + Box domain(domLo, domHi); + + // we only need half x-z plane because theta is between (0,pi) + auto prob_lo = pgeom[0].ProbLo(); + auto prob_hi = pgeom[0].ProbHi(); + const auto dx = pgeom[finest_level].CellSizeArray(); + + Real probLo[] = {prob_lo[0] + (prob_hi[0] - prob_lo[0]) / 2.0, prob_lo[1], + prob_lo[2]}; + Real probHi[] = {prob_hi[0], prob_lo[1] + 2.0 * dx[1], prob_hi[2]}; + RealBox real_box(probLo, probHi); + + // make BoxArray and Geometry + int max_grid_size = GetMaxGridSize(iFile); + BoxArray ba(domain); + ba.maxSize(max_grid_size); + DistributionMapping dm(ba); + Geometry geomFine(domain, &real_box); + + // MakeMeridionalCirculation + // define velocities on new single-level grid + Vector meridion_vel(1); + meridion_vel[0].define(ba, dm, 2, 0); + meridion_vel[0].setVal(0.); + MakeMeridionalCirculation(u_in, w0_in, meridion_vel, {domain}); + + // MakeBaroclinity + Vector baroclinity(1); + baroclinity[0].define(ba, dm, 1, 0); + baroclinity[0].setVal(0.); + MakeBaroclinity(rho_in, p_in, baroclinity, {domain}); + + // time-averaged circulation need multiple files + if (deltat > 0 && nfiles > 0) { + amrex::PlotFileData pltfile(iFile); + + // read in base file name to get time step + std::string basefilename = + GetVarFromJobInfo(iFile, "maestro.plot_base_name"); + int tn = GetTimeStep(iFile, basefilename); + // Print() << "basefilename = " << basefilename << ", timestep = " << tn << std::endl; + + // save initial time + Real t0 = pltfile.time(); + + // save old parameters and outputs + Vector u_old(finest_level + 1); + Vector w0_old(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + u_old[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + w0_old[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + + MultiFab::Copy(u_old[lev], u_in[lev], 0, 0, AMREX_SPACEDIM, 0); + MultiFab::Copy(w0_old[lev], w0_in[lev], 0, 0, AMREX_SPACEDIM, 0); + } + + int ncomp = meridion_vel[0].nComp(); + Vector meridion_vel_old(1); + meridion_vel_old[0].define(meridion_vel[0].boxArray(), + meridion_vel[0].DistributionMap(), ncomp, 0); + MultiFab::Copy(meridion_vel_old[0], meridion_vel[0], 0, 0, ncomp, 0); + meridion_vel[0].setVal(0.0); + Real t_old = t0; + + // new plotfile name and time + std::string plotfilename_new = basefilename; + Real t_new; + + // define new velocities + Vector u_new(finest_level + 1); + Vector w0_new(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + u_new[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + w0_new[lev].define(grid[lev], dmap[lev], AMREX_SPACEDIM, 0); + } + + for (int n = 0; n < nfiles; ++n) { + // update timestep and plotfile name + tn += deltat; + PlotFileName(tn, &basefilename, &plotfilename_new); + + // open file + amrex::PlotFileData pltfile_new(plotfilename_new); + + // get new time + t_new = pltfile_new.time(); + + // read in new velocities + for (int i = 0; i < AMREX_SPACEDIM; ++i) { + std::string x = "vel"; + std::string w = "w0"; + x += (120 + i); + w += (120 + i); + + for (int lev = 0; lev <= finest_level; ++lev) { + MultiFab::Copy(u_new[lev], pltfile_new.get(lev, x), 0, i, 1, + 0); + MultiFab::Copy(w0_new[lev], pltfile_new.get(lev, w), 0, i, + 1, 0); + } + } + + // MakeMeridionalCirculation + Vector meridion_vel_new(1); + MakeMeridionalCirculation(u_new, w0_new, meridion_vel_new, + {domain}); + + // vel = vel + dt/2 * (vel_old + vel_new) + Real dt = t_new - t_old; + MultiFab::Add(meridion_vel_old[0], meridion_vel_new[0], 0, 0, ncomp, + 0); + MultiFab::Saxpy(meridion_vel[0], 0.5 * dt, meridion_vel_old[0], 0, + 0, ncomp, 0); + + // set old states to new states values + for (int lev = 0; lev <= finest_level; ++lev) { + MultiFab::Copy(u_old[lev], u_new[lev], 0, 0, AMREX_SPACEDIM, 0); + MultiFab::Copy(w0_old[lev], w0_new[lev], 0, 0, AMREX_SPACEDIM, + 0); + } + MultiFab::Copy(meridion_vel_old[0], meridion_vel_new[0], 0, 0, + ncomp, 0); + t_old = t_new; + } + + // divide vel by total time elapsed + const Real ttot = t_new - t0; + int lev = 0; + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(meridion_vel[lev], TilingIfNotGPU()); mfi.isValid(); + ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 vel_arr = meridion_vel[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, + { vel_arr(i, j, k) /= ttot; }); + } + } + + // headers for plotfile data + int nPlot = 3; + Vector varnames(nPlot); + varnames[0] = "vel_radial"; + varnames[1] = "vel_theta"; + varnames[2] = "baroclinity"; + + // multifab to hold plotfile data + Vector plot_mf(1); + plot_mf[0].define(ba, dm, nPlot, 0); + int dest_comp = 0; + MultiFab::Copy(plot_mf[0], meridion_vel[0], 0, dest_comp, 2, 0); + dest_comp += 2; + MultiFab::Copy(plot_mf[0], baroclinity[0], 0, dest_comp, 1, 0); + + // write to disk + std::string slicefilename = "slice_" + iFile; + + WriteSingleLevelPlotfile(slicefilename, plot_mf[0], varnames, geomFine, 0, + 0); +} + +// get plotfile name +void Postprocess::PlotFileName(const int timestep, std::string* basefilename, + std::string* plotfilename) { + *plotfilename = Concatenate(*basefilename, timestep, 7); +} + +void Postprocess::MakeMeridionalCirculation(const Vector& vel, + const Vector& w0rcart, + Vector& circ_vel, + const Vector& domFine) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeMeridionalCirculation()", + MakeMeridionalCirculation); + + // make circulation velocities + Vector rad_vel(finest_level + 1); + Vector ang_vel(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + rad_vel[lev].define(vel[lev].boxArray(), vel[lev].DistributionMap(), 1, + 0); + ang_vel[lev].define(vel[lev].boxArray(), vel[lev].DistributionMap(), 1, + 0); + } + + const auto& center_p = center; + + for (int lev = finest_level; lev <= finest_level; ++lev) { + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(vel[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 vel_arr = vel[lev].array(mfi); + const Array4 radvel_arr = rad_vel[lev].array(mfi); + const Array4 angvel_arr = ang_vel[lev].array(mfi); + const Array4 w0rcart_arr = w0rcart[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + radvel_arr(i, j, k) = 0.0; + angvel_arr(i, j, k) = 0.0; + + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real inv_radius = 1.0 / sqrt(x * x + y * y + z * z); + Real inv_xy = 1.0 / sqrt(x * x + y * y); + + Vector normal(3); + normal[0] = x * inv_radius; + normal[1] = y * inv_radius; + normal[2] = z * inv_radius; + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + radvel_arr(i, j, k) += vel_arr(i, j, k, n) * normal[n]; + } + + Vector theta_dir(3); + theta_dir[0] = x * inv_radius * z * inv_xy; + theta_dir[1] = y * inv_radius * z * inv_xy; + theta_dir[2] = -inv_radius / inv_xy; + + for (auto n = 0; n < AMREX_SPACEDIM; ++n) { + angvel_arr(i, j, k) += vel_arr(i, j, k, n) * theta_dir[n]; + } + + // add base state vel to get full radial velocity + radvel_arr(i, j, k) += w0rcart_arr(i, j, k); + }); + } + } + + // average to 2D r-theta (x-z) plane + Average2d(rad_vel, circ_vel, 0, domFine, 0); + Average2d(ang_vel, circ_vel, 1, domFine, 0); +} + +void Postprocess::MakeBaroclinity(const Vector& rho_in, + const Vector& p_in, + Vector& baroclinity, + const Vector& domFine) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::MakeBaroclinity()", MakeBaroclinity); + + Real gamma = GetGamma(iFile); + + // compute entropy and log(p) + Vector entropy(finest_level + 1); + Vector logp(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + entropy[lev].define(rho_in[lev].boxArray(), + rho_in[lev].DistributionMap(), 1, 0); + logp[lev].define(p_in[lev].boxArray(), p_in[lev].DistributionMap(), 1, + 0); + } + + for (int lev = finest_level; lev <= finest_level; ++lev) { +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(rho_in[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 rho_arr = rho_in[lev].array(mfi); + const Array4 p_arr = p_in[lev].array(mfi); + const Array4 entropy_arr = entropy[lev].array(mfi); + const Array4 logp_arr = logp[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + logp_arr(i, j, k) = log(p_arr(i, j, k)); + + // dimensionless entropy = 1/(gam - 1)*( log(p) - gamma*log(rho) ) + entropy_arr(i, j, k) = + 1.0 / (gamma - 1.0) * + (logp_arr(i, j, k) - gamma * log(rho_arr(i, j, k))); + }); + } + } + + // want gradients of entropy and log(p) + // so we need to compute entropy and pressure on cell faces + Vector > face_s(finest_level + 1); + Vector > face_p(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + AMREX_D_TERM( + face_s[lev][0].define(convert(rho_in[lev].boxArray(), nodal_flag_x), + rho_in[lev].DistributionMap(), 1, 0); + , + face_s[lev][1].define(convert(rho_in[lev].boxArray(), nodal_flag_y), + rho_in[lev].DistributionMap(), 1, 0); + , + face_s[lev][2].define(convert(rho_in[lev].boxArray(), nodal_flag_z), + rho_in[lev].DistributionMap(), 1, 0);); + AMREX_D_TERM( + face_p[lev][0].define(convert(p_in[lev].boxArray(), nodal_flag_x), + p_in[lev].DistributionMap(), 1, 0); + , face_p[lev][1].define(convert(p_in[lev].boxArray(), nodal_flag_y), + p_in[lev].DistributionMap(), 1, 0); + , face_p[lev][2].define(convert(p_in[lev].boxArray(), nodal_flag_z), + p_in[lev].DistributionMap(), 1, 0);); + } + + // average face-centered entropy and pressure + PutDataOnFaces(entropy, face_s, true); + PutDataOnFaces(logp, face_p, true); + + // create multi-level multifab for baroclinity + Vector baro_mf(finest_level + 1); + for (int lev = 0; lev <= finest_level; ++lev) { + baro_mf[lev].define(rho_in[lev].boxArray(), + rho_in[lev].DistributionMap(), 1, 0); + } + + const auto& center_p = center; + + for (int lev = finest_level; lev <= finest_level; ++lev) { + const auto dx = pgeom[lev].CellSizeArray(); + const auto prob_lo = pgeom[lev].ProbLoArray(); + +#ifdef _OPENMP +#pragma omp parallel +#endif + for (MFIter mfi(baro_mf[lev], TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 logpx_arr = face_p[lev][0].array(mfi); + const Array4 logpy_arr = face_p[lev][1].array(mfi); + const Array4 logpz_arr = face_p[lev][2].array(mfi); + const Array4 sx_arr = face_s[lev][0].array(mfi); + const Array4 sy_arr = face_s[lev][1].array(mfi); + const Array4 sz_arr = face_s[lev][2].array(mfi); + const Array4 rho_arr = rho_in[lev].array(mfi); + const Array4 baro_arr = baro_mf[lev].array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + baro_arr(i, j, k) = 0.0; + + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real inv_xy = 1.0 / sqrt(x * x + y * y); + + Vector gradlogp(3); + gradlogp[0] = + (logpx_arr(i + 1, j, k) - logpx_arr(i, j, k)) / dx[0]; + gradlogp[1] = + (logpy_arr(i, j + 1, k) - logpy_arr(i, j, k)) / dx[1]; + gradlogp[2] = + (logpz_arr(i, j, k + 1) - logpz_arr(i, j, k)) / dx[2]; + + Vector grads(3); + grads[0] = (sx_arr(i + 1, j, k) - sx_arr(i, j, k)) / dx[0]; + grads[1] = (sy_arr(i, j + 1, k) - sy_arr(i, j, k)) / dx[1]; + grads[2] = (sz_arr(i, j, k + 1) - sz_arr(i, j, k)) / dx[2]; + + Real normgp = 0.0; + Real normgs = 0.0; + for (int n = 0; n < AMREX_SPACEDIM; ++n) { + normgp += gradlogp[n] * gradlogp[n]; + normgs += grads[n] * grads[n]; + } + normgp = std::sqrt(normgp); + normgs = std::sqrt(normgs); + + // compute baroclinity + if (normgp > 0.0 && normgs > 0.0 && + rho_arr(i, j, k) > base_cutoff_density) { + baro_arr(i, j, k) = -(y * inv_xy * + (gradlogp[1] * grads[2] - + gradlogp[2] * grads[1]) + + x * inv_xy * + (gradlogp[0] * grads[2] - + gradlogp[2] * grads[0])) / + (normgp * normgs); + } + }); + } + } + // debug + // VisMF::Write(baro_mf[0],"a_baro"); + + // average to 2D r-theta (x-z) plane + Average2d(baro_mf, baroclinity, 0, domFine, 0); +} diff --git a/Util/postprocess/convective_M_0.30.hse.1024 b/Util/postprocess/convective_M_0.30.hse.1024 new file mode 100644 index 000000000..b5008f398 --- /dev/null +++ b/Util/postprocess/convective_M_0.30.hse.1024 @@ -0,0 +1,1031 @@ +# npts = 1024 +# num of variables = 5 +# density +# temperature +# pressure +# hydrogen-1 +# helium-4 + 34179687.50000000 283.9825466902229 11000000.00000000 0.4220577315293137E+18 0.7000000000000000 0.3000000000000000 + 102539062.5000000 283.9400130360680 10998901.61823631 0.4219523802114217E+18 0.7000000000000000 0.3000000000000000 + 170898437.5000000 283.8549632458339 10996705.14259868 0.4217417525169965E+18 0.7000000000000000 0.3000000000000000 + 239257812.5000000 283.7274330510148 10993411.16700257 0.4214259999929951E+18 0.7000000000000000 0.3000000000000000 + 307617187.5000000 283.5574759285889 10989020.57966682 0.4210053495164237E+18 0.7000000000000000 0.3000000000000000 + 375976562.5000000 283.3451631053849 10983534.56376748 0.4204801031308141E+18 0.7000000000000000 0.3000000000000000 + 444335937.5000000 283.0905835144154 10976954.59703040 0.4198506377061537E+18 0.7000000000000000 0.3000000000000000 + 512695312.5000000 282.7938437335678 10969282.45104662 0.4191174044980189E+18 0.7000000000000000 0.3000000000000000 + 581054687.5000000 282.4550679105137 10960520.19040895 0.4182809286160563E+18 0.7000000000000000 0.3000000000000000 + 649414062.5000000 282.0743976747584 10950670.17169234 0.4173418084047886E+18 0.7000000000000000 0.3000000000000000 + 717773437.5000000 281.6519920371796 10939735.04228507 0.4163007147384131E+18 0.7000000000000000 0.3000000000000000 + 786132812.5000000 281.1880272772487 10927717.73907451 0.4151583902309984E+18 0.7000000000000000 0.3000000000000000 + 854492187.5000000 280.6826968180983 10914621.48698896 0.4139156483634950E+18 0.7000000000000000 0.3000000000000000 + 922851562.5000000 280.1362110895797 10900449.79739751 0.4125733725290565E+18 0.7000000000000000 0.3000000000000000 + 991210937.5000000 279.5487973794694 10885206.46636911 0.4111325149982837E+18 0.7000000000000000 0.3000000000000000 + 1059570312.500000 278.9206996729787 10868895.57279269 0.4095940958061202E+18 0.7000000000000000 0.3000000000000000 + 1127929687.500000 278.2521784807457 10851521.47635933 0.4079592015622500E+18 0.7000000000000000 0.3000000000000000 + 1196289062.500000 277.5435106554852 10833088.81540856 0.4062289841869656E+18 0.7000000000000000 0.3000000000000000 + 1264648437.500000 276.7949891974915 10813602.50464015 0.4044046595745919E+18 0.7000000000000000 0.3000000000000000 + 1333007812.500000 276.0069230491995 10793067.73269328 0.4024875061866644E+18 0.7000000000000000 0.3000000000000000 + 1401367187.500000 275.1796368790159 10771489.95959500 0.4004788635771640E+18 0.7000000000000000 0.3000000000000000 + 1469726562.500000 274.3134708546466 10748874.91407970 0.3983801308522186E+18 0.7000000000000000 0.3000000000000000 + 1538085937.500000 273.4087804061554 10725228.59078199 0.3961927650667743E+18 0.7000000000000000 0.3000000000000000 + 1606445312.500000 272.4659359789998 10700557.24730476 0.3939182795608375E+18 0.7000000000000000 0.3000000000000000 + 1674804687.500000 271.4853227772963 10674867.40116491 0.3915582422379692E+18 0.7000000000000000 0.3000000000000000 + 1743164062.500000 270.4673404975811 10648165.82661900 0.3891142737888010E+18 0.7000000000000000 0.3000000000000000 + 1811523437.500000 269.4124030533403 10620459.55137095 0.3865880458624119E+18 0.7000000000000000 0.3000000000000000 + 1879882812.500000 268.3209382905857 10591755.85316480 0.3839812791884810E+18 0.7000000000000000 0.3000000000000000 + 1948242187.500000 267.1933876947725 10562062.25626450 0.3812957416531859E+18 0.7000000000000000 0.3000000000000000 + 2016601562.500000 266.0302060893508 10531386.52782374 0.3785332463318848E+18 0.7000000000000000 0.3000000000000000 + 2084960937.500000 264.8318613262576 10499736.67414841 0.3756956494816604E+18 0.7000000000000000 0.3000000000000000 + 2153320312.500000 263.5988339686604 10467120.93685444 0.3727848484968575E+18 0.7000000000000000 0.3000000000000000 + 2221679687.500000 262.3316169662698 10433547.78892388 0.3698027798307782E+18 0.7000000000000000 0.3000000000000000 + 2290039062.500000 261.0307153235472 10399025.93066207 0.3667514168867342E+18 0.7000000000000000 0.3000000000000000 + 2358398437.500000 259.6966457611312 10363564.28555907 0.3636327678816804E+18 0.7000000000000000 0.3000000000000000 + 2426757812.500000 258.3299363708260 10327171.99605802 0.3604488736856705E+18 0.7000000000000000 0.3000000000000000 + 2495117187.500000 256.9311262644838 10289858.41923388 0.3572018056403935E+18 0.7000000000000000 0.3000000000000000 + 2563476562.500000 255.5007652171273 10251633.12238545 0.3538936633600501E+18 0.7000000000000000 0.3000000000000000 + 2631835937.500000 254.0394133046619 10212505.87854393 0.3505265725178325E+18 0.7000000000000000 0.3000000000000000 + 2700195312.500000 252.5476405365235 10172486.66190123 0.3471026826212625E+18 0.7000000000000000 0.3000000000000000 + 2768554687.500000 251.0260264836209 10131585.64316132 0.3436241647796314E+18 0.7000000000000000 0.3000000000000000 + 2836914062.500000 249.4751599019250 10089813.18481790 0.3400932094667656E+18 0.7000000000000000 0.3000000000000000 + 2905273437.500000 247.8956383520638 10047179.83636179 0.3365120242823185E+18 0.7000000000000000 0.3000000000000000 + 2973632812.500000 246.2880678152838 10003696.32942133 0.3328828317147573E+18 0.7000000000000000 0.3000000000000000 + 3041992187.500000 244.6530623061367 9959373.572839256 0.3292078669091786E+18 0.7000000000000000 0.3000000000000000 + 3110351562.500000 242.9912434822544 9914222.647689538 0.3254893754430441E+18 0.7000000000000000 0.3000000000000000 + 3178710937.500000 241.3032402515711 9868254.802237485 0.3217296111128805E+18 0.7000000000000000 0.3000000000000000 + 3247070312.500000 239.5896883773568 9821481.446846727 0.3179308337349347E+18 0.7000000000000000 0.3000000000000000 + 3315429687.500000 237.8512300814199 9773914.148836486 0.3140953069627195E+18 0.7000000000000000 0.3000000000000000 + 3383789062.500000 236.0885136458379 9725564.627292728 0.3102252961243199E+18 0.7000000000000000 0.3000000000000000 + 3452148437.500000 234.3021930135768 9676444.747836547 0.3063230660822664E+18 0.7000000000000000 0.3000000000000000 + 3520507812.500000 232.4929273883508 9626566.517353479 0.3023908791187045E+18 0.7000000000000000 0.3000000000000000 + 3588867187.500000 230.6613808340777 9575942.078687150 0.2984309928485217E+18 0.7000000000000000 0.3000000000000000 + 3657226562.500000 228.8082218742797 9524583.705300817 0.2944456581630039E+18 0.7000000000000000 0.3000000000000000 + 3725585937.500000 226.9341230917767 9472503.795910275 0.2904371172065169E+18 0.7000000000000000 0.3000000000000000 + 3793945312.500000 225.0397607290147 9419714.869091718 0.2864076013886176E+18 0.7000000000000000 0.3000000000000000 + 3862304687.500000 223.1258142893697 9366229.557867967 0.2823593294339084E+18 0.7000000000000000 0.3000000000000000 + 3930664062.500000 221.1929661397616 9312060.604276566 0.2782945054718570E+18 0.7000000000000000 0.3000000000000000 + 3999023437.500000 219.2419011149063 9257220.853923315 0.2742153171687035E+18 0.7000000000000000 0.3000000000000000 + 4067382812.500000 217.2733061235370 9201723.250524439 0.2701239339034811E+18 0.7000000000000000 0.3000000000000000 + 4135742187.500000 215.2878697569055 9145580.830441158 0.2660225049900716E+18 0.7000000000000000 0.3000000000000000 + 4204101562.500000 213.2862818998860 9088806.717209715 0.2619131579471165E+18 0.7000000000000000 0.3000000000000000 + 4272460937.500000 211.2692333449839 9031414.116070498 0.2577979968174943E+18 0.7000000000000000 0.3000000000000000 + 4340820312.500000 209.2374154095525 8973416.308499409 0.2536791005389737E+18 0.7000000000000000 0.3000000000000000 + 4409179687.500000 207.1915195565134 8914826.646744926 0.2495585213675376E+18 0.7000000000000000 0.3000000000000000 + 4477539062.500000 205.1322370188671 8855658.548374001 0.2454382833547672E+18 0.7000000000000000 0.3000000000000000 + 4545898437.500000 203.0602584282757 8795925.490830105 0.2413203808805645E+18 0.7000000000000000 0.3000000000000000 + 4614257812.500000 200.9762734479892 8735641.006006600 0.2372067772423791E+18 0.7000000000000000 0.3000000000000000 + 4682617187.500000 198.8809704103840 8674818.674838496 0.2330994033019959E+18 0.7000000000000000 0.3000000000000000 + 4750976562.500000 196.7750359593678 8613472.121915845 0.2290001561908278E+18 0.7000000000000000 0.3000000000000000 + 4819335937.500000 194.6591546979032 8551615.010121631 0.2249108980745464E+18 0.7000000000000000 0.3000000000000000 + 4887695312.500000 192.5340088408907 8489261.035297301 0.2208334549777748E+18 0.7000000000000000 0.3000000000000000 + 4956054687.500000 190.4002778736422 8426423.920938823 0.2167696156694531E+18 0.7000000000000000 0.3000000000000000 + 5024414062.500000 188.2586382161726 8363117.412926139 0.2127211306093824E+18 0.7000000000000000 0.3000000000000000 + 5092773437.500000 186.1097628935227 8299355.274288833 0.2086897109563406E+18 0.7000000000000000 0.3000000000000000 + 5161132812.500000 183.9543212123198 8235151.280010876 0.2046770276380602E+18 0.7000000000000000 0.3000000000000000 + 5229492187.500000 181.7929784437755 8170519.211877035 0.2006847104832508E+18 0.7000000000000000 0.3000000000000000 + 5297851562.500000 179.6263955133075 8105472.853363682 0.1967143474157459E+18 0.7000000000000000 0.3000000000000000 + 5366210937.500000 177.4552286969663 8040025.984576503 0.1927674837107526E+18 0.7000000000000000 0.3000000000000000 + 5434570312.500000 175.2801293248355 7974192.377237717 0.1888456213130814E+18 0.7000000000000000 0.3000000000000000 + 5502929687.500000 173.1017434915662 7907985.789725198 0.1849502182171382E+18 0.7000000000000000 0.3000000000000000 + 5571289062.500000 170.9207117742000 7841419.962165836 0.1810826879083633E+18 0.7000000000000000 0.3000000000000000 + 5639648437.500000 168.7376689574175 7774508.611585577 0.1772443988657107E+18 0.7000000000000000 0.3000000000000000 + 5708007812.500000 166.5532437663504 7707265.427118223 0.1734366741246713E+18 0.7000000000000000 0.3000000000000000 + 5776367187.500000 164.3680586070760 7639704.065275276 0.1696607909002561E+18 0.7000000000000000 0.3000000000000000 + 5844726562.500000 162.1827293149104 7571838.145278867 0.1659179802692705E+18 0.7000000000000000 0.3000000000000000 + 5913085937.500000 159.9978649106035 7503681.244459802 0.1622094269111322E+18 0.7000000000000000 0.3000000000000000 + 5981445312.500000 157.8140673645322 7435246.893722663 0.1585362689064038E+18 0.7000000000000000 0.3000000000000000 + 6049804687.500000 155.6319313689766 7366548.573079807 0.1548995975921396E+18 0.7000000000000000 0.3000000000000000 + 6118164062.500000 153.4520441185556 7297599.707256131 0.1513004574730724E+18 0.7000000000000000 0.3000000000000000 + 6186523437.500000 151.2749850988902 7228413.661366240 0.1477398461875993E+18 0.7000000000000000 0.3000000000000000 + 6254882812.500000 149.1013258835526 7159003.736665668 0.1442187145274595E+18 0.7000000000000000 0.3000000000000000 + 6323242187.500000 146.9316299393504 7089383.166377744 0.1407379665099394E+18 0.7000000000000000 0.3000000000000000 + 6391601562.500000 144.7664524399856 7019565.111597600 0.1372984595013767E+18 0.7000000000000000 0.3000000000000000 + 6459960937.500000 142.6063400881231 6949562.657274603 0.1339010043906880E+18 0.7000000000000000 0.3000000000000000 + 6528320312.500000 140.4518309458880 6879388.808274725 0.1305463658115891E+18 0.7000000000000000 0.3000000000000000 + 6596679687.500000 138.3034542738094 6809056.485523941 0.1272352624121324E+18 0.7000000000000000 0.3000000000000000 + 6665039062.500000 136.1617303782173 6738578.522233877 0.1239683671701432E+18 0.7000000000000000 0.3000000000000000 + 6733398437.500000 134.0271704670884 6667967.660210836 0.1207463077530949E+18 0.7000000000000000 0.3000000000000000 + 6801757812.500000 131.9002765143340 6597236.546249161 0.1175696669209304E+18 0.7000000000000000 0.3000000000000000 + 6870117187.500000 129.7815411325119 6526397.728609864 0.1144389829703022E+18 0.7000000000000000 0.3000000000000000 + 6938476562.500000 127.6714474539357 6455463.653585458 0.1113547502186755E+18 0.7000000000000000 0.3000000000000000 + 7006835937.500000 125.5704690201519 6384446.662151665 0.1083174195267142E+18 0.7000000000000000 0.3000000000000000 + 7075195312.500000 123.4790696797428 6313358.986706780 0.1053273988573480E+18 0.7000000000000000 0.3000000000000000 + 7143554687.500000 121.3977034944105 6242212.747899296 0.1023850538698989E+18 0.7000000000000000 0.3000000000000000 + 7211914062.500000 119.3268146532874 6171019.951544322 0.9949070854763299E+17 0.7000000000000000 0.3000000000000000 + 7280273437.500000 117.2668373954142 6099792.485629299 0.9664464585708933E+17 0.7000000000000000 0.3000000000000000 + 7348632812.500000 115.2181959403189 6028542.117409412 0.9384710843753245E+17 0.7000000000000000 0.3000000000000000 + 7416992187.500000 113.1813044266246 5957280.490593024 0.9109829931886678E+17 0.7000000000000000 0.3000000000000000 + 7485351562.500000 111.1565668586084 5886019.122617357 0.8839838266635171E+17 0.7000000000000000 0.3000000000000000 + 7553710937.500000 109.1443770606268 5814769.402014701 0.8574748455045594E+17 0.7000000000000000 0.3000000000000000 + 7622070312.500000 107.1451186393205 5743542.585869136 0.8314569374019410E+17 0.7000000000000000 0.3000000000000000 + 7690429687.500000 105.1591649535025 5672349.797363921 0.8059306251829555E+17 0.7000000000000000 0.3000000000000000 + 7758789062.500000 103.1868790916319 5601202.023419475 0.7808960751656470E+17 0.7000000000000000 0.3000000000000000 + 7827148437.500000 101.2286138567706 5530110.112421857 0.7563531056980445E+17 0.7000000000000000 0.3000000000000000 + 7895507812.500000 99.28471175891254 5459084.772041648 0.7323011958668963E+17 0.7000000000000000 0.3000000000000000 + 7963867187.500000 97.35550501457840 5388136.567142889 0.7087394943599402E+17 0.7000000000000000 0.3000000000000000 + 8032226562.500000 95.44131555355563 5317275.917781950 0.6856668284659413E+17 0.7000000000000000 0.3000000000000000 + 8100585937.500000 93.54245503266846 5246513.097295842 0.6630817131969549E+17 0.7000000000000000 0.3000000000000000 + 8168945312.500000 91.65922485645480 5175858.230479624 0.6409823605175027E+17 0.7000000000000000 0.3000000000000000 + 8237304687.500000 89.79191620462474 5105321.291852458 0.6193666886656154E+17 0.7000000000000000 0.3000000000000000 + 8305664062.500000 87.94081006617478 5034912.104011698 0.5982323315509702E+17 0.7000000000000000 0.3000000000000000 + 8374023437.500000 86.10617728002666 4964640.336074527 0.5775766482156516E+17 0.7000000000000000 0.3000000000000000 + 8442382812.500000 84.28827858206094 4894515.502206406 0.5573967323433732E+17 0.7000000000000000 0.3000000000000000 + 8510742187.500000 82.48736465841078 4824546.960235688 0.5376894218033267E+17 0.7000000000000000 0.3000000000000000 + 8579101562.500000 80.70367620488247 4754743.910353629 0.5184513082151706E+17 0.7000000000000000 0.3000000000000000 + 8647460937.500000 78.93744399236657 4685115.393898990 0.4996787465220207E+17 0.7000000000000000 0.3000000000000000 + 8715820312.500000 77.18888893810420 4615670.292226356 0.4813678645586794E+17 0.7000000000000000 0.3000000000000000 + 8784179687.500000 75.45822218267143 4546417.325657287 0.4635145726027112E+17 0.7000000000000000 0.3000000000000000 + 8852539062.500000 73.74564517254551 4477365.052513330 0.4461145728963691E+17 0.7000000000000000 0.3000000000000000 + 8920898437.500000 72.05134974811702 4408521.868229871 0.4291633691277646E+17 0.7000000000000000 0.3000000000000000 + 8989257812.500000 70.37551823701176 4339896.004549825 0.4126562758600857E+17 0.7000000000000000 0.3000000000000000 + 9057617187.500000 68.71832355258852 4271495.528796012 0.3965884278980748E+17 0.7000000000000000 0.3000000000000000 + 9125976562.500000 67.07992929747984 4203328.343221102 0.3809547895813946E+17 0.7000000000000000 0.3000000000000000 + 9194335937.500000 65.46048987204377 4135402.184433964 0.3657501639949330E+17 0.7000000000000000 0.3000000000000000 + 9262695312.500000 63.86015058759842 4067724.622901160 0.3509692020865198E+17 0.7000000000000000 0.3000000000000000 + 9331054687.500000 62.27904778431251 4000303.062522345 0.3366064116829580E+17 0.7000000000000000 0.3000000000000000 + 9399414062.500000 60.71730895362860 3933144.740278263 0.3226561663956956E+17 0.7000000000000000 0.3000000000000000 + 9467773437.500000 59.17505286509930 3866256.725950000 0.3091127144078973E+17 0.7000000000000000 0.3000000000000000 + 9536132812.500000 57.65238969752070 3799645.921908097 0.2959701871351011E+17 0.7000000000000000 0.3000000000000000 + 9604492187.500000 56.14942117425156 3733319.062970136 0.2832226077520724E+17 0.7000000000000000 0.3000000000000000 + 9672851562.500000 54.66624070261196 3667282.716325341 0.2708638995788919E+17 0.7000000000000000 0.3000000000000000 + 9741210937.500000 53.20293351726113 3601543.281524679 0.2588878943197381E+17 0.7000000000000000 0.3000000000000000 + 9809570312.500000 51.75957682745974 3536106.990534988 0.2472883401482400E+17 0.7000000000000000 0.3000000000000000 + 9877929687.500000 50.33623996812896 3470979.907855551 0.2360589096336916E+17 0.7000000000000000 0.3000000000000000 + 9946289062.500000 48.93298455462720 3406167.930695521 0.2251932075028284E+17 0.7000000000000000 0.3000000000000000 + 10014648437.50000 47.54986464117196 3341676.789210619 0.2146847782322648E+17 0.7000000000000000 0.3000000000000000 + 10083007812.50000 46.18692688284549 3277512.046797404 0.2045271134670938E+17 0.7000000000000000 0.3000000000000000 + 10151367187.50000 44.84421070113169 3213679.100443447 0.1947136592615316E+17 0.7000000000000000 0.3000000000000000 + 10219726562.50000 43.52174845294308 3150183.181131740 0.1852378231378766E+17 0.7000000000000000 0.3000000000000000 + 10288085937.50000 42.21956560311013 3087029.354297480 0.1760929809604192E+17 0.7000000000000000 0.3000000000000000 + 10356445312.50000 40.93768090031686 3024222.520335561 0.1672724836213074E+17 0.7000000000000000 0.3000000000000000 + 10424804687.50000 39.67610655648323 2961767.415156878 0.1587696635357211E+17 0.7000000000000000 0.3000000000000000 + 10493164062.50000 38.43484842961040 2899668.610791597 0.1505778409440552E+17 0.7000000000000000 0.3000000000000000 + 10561523437.50000 37.21390621012365 2837930.516037513 0.1426903300191426E+17 0.7000000000000000 0.3000000000000000 + 10629882812.50000 36.01327361076712 2776557.377151548 0.1351004447768695E+17 0.7000000000000000 0.3000000000000000 + 10698242187.50000 34.83293856012794 2715553.278582411 0.1278015047888452E+17 0.7000000000000000 0.3000000000000000 + 10766601562.50000 33.67288339989133 2654922.143742372 0.1207868406960860E+17 0.7000000000000000 0.3000000000000000 + 10834960937.50000 32.53308508595604 2594667.735816107 0.1140497995229571E+17 0.7000000000000000 0.3000000000000000 + 10903320312.50000 31.41351539357045 2534793.658604457 0.1075837497908873E+17 0.7000000000000000 0.3000000000000000 + 10971679687.50000 30.31414112668424 2475303.357400904 0.1013820864316294E+17 0.7000000000000000 0.3000000000000000 + 11040039062.50000 29.23492433174886 2416200.119898512 9543823550008146. 0.7000000000000000 0.3000000000000000 + 11108398437.50000 28.17582251624367 2357487.077124990 8974565868691311. 0.7000000000000000 0.3000000000000000 + 11176757812.50000 27.13678887225425 2299167.204403440 8429785763145093. 0.7000000000000000 0.3000000000000000 + 11245117187.50000 26.11777250548377 2241243.322336281 7908837803547599. 0.7000000000000000 0.3000000000000000 + 11313476562.50000 25.11871867014240 2183718.097809702 7411081357876272. 0.7000000000000000 0.3000000000000000 + 11381835937.50000 24.13956901023072 2126594.045015877 6935880963734995. 0.7000000000000000 0.3000000000000000 + 11450195312.50000 23.18026180781535 2069873.526490032 6482606680567592. 0.7000000000000000 0.3000000000000000 + 11518554687.50000 22.24073223898856 2013558.754159268 6050634422383016. 0.7000000000000000 0.3000000000000000 + 11586914062.50000 21.32091263831164 1957651.790399843 5639346271127430. 0.7000000000000000 0.3000000000000000 + 11655273437.50000 20.42073277266638 1902154.549099364 5248130770845932. 0.7000000000000000 0.3000000000000000 + 11723632812.50000 19.54012012558251 1847068.796720089 4876383202781743. 0.7000000000000000 0.3000000000000000 + 11791992187.50000 18.67900019327758 1792396.153359140 4523505841562918. 0.7000000000000000 0.3000000000000000 + 11860351562.50000 17.83729679384023 1738138.093801048 4188908192625808. 0.7000000000000000 0.3000000000000000 + 11928710937.50000 17.01493239121787 1684295.948557561 3872007211020384. 0.7000000000000000 0.3000000000000000 + 11997070312.50000 16.21182843593899 1630870.904889002 3572227501734430. 0.7000000000000000 0.3000000000000000 + 12065429687.50000 15.42790572481980 1577864.007800748 3289001501661432. 0.7000000000000000 0.3000000000000000 + 12133789062.50000 14.66308478228338 1525276.161007463 3021769643319642. 0.7000000000000000 0.3000000000000000 + 12202148437.50000 13.91728626637203 1473108.127856564 2769980500407018. 0.7000000000000000 0.3000000000000000 + 12270507812.50000 13.19043140307580 1421360.532200983 2533090915247186. 0.7000000000000000 0.3000000000000000 + 12338867187.50000 12.48244245325484 1370033.859209414 2310566108144352. 0.7000000000000000 0.3000000000000000 + 12407226562.50000 11.79324321722655 1319128.456099956 2101879768618648. 0.7000000000000000 0.3000000000000000 + 12475585937.50000 11.12275958305717 1268644.532780028 1906514128435913. 0.7000000000000000 0.3000000000000000 + 12543945312.50000 10.47092012578662 1218582.162371510 1723960016275132. 0.7000000000000000 0.3000000000000000 + 12612304687.50000 9.837656766285058 1168941.281594957 1553716893789694. 0.7000000000000000 0.3000000000000000 + 12680664062.50000 9.222905500270079 1119721.690979864 1395292872711565. 0.7000000000000000 0.3000000000000000 + 12749023437.50000 8.626607210308645 1070923.054858768 1248204712515447. 0.7000000000000000 0.3000000000000000 + 12817382812.50000 8.048708576531522 1022544.901090415 1111977797996798. 0.7000000000000000 0.3000000000000000 + 12885742187.50000 7.489163105491419 974586.6204399625 986146095914606.1 0.7000000000000000 0.3000000000000000 + 12954101562.50000 6.947932301365642 927047.4655199042 870252089596136.5 0.7000000000000000 0.3000000000000000 + 13022460937.50000 6.424987009908623 879926.5491609785 763846690081295.6 0.7000000000000000 0.3000000000000000 + 13090820312.50000 5.920308973719177 833222.8420325645 666489121978495.9 0.7000000000000000 0.3000000000000000 + 13159179687.50000 5.433892648248055 786935.1692588377 577746781683767.1 0.7000000000000000 0.3000000000000000 + 13227539062.50000 4.965747342615041 741062.2056672062 497195064941055.4 0.7000000000000000 0.3000000000000000 + 13295898437.50000 4.515899769333718 695602.4691375227 424417159838406.4 0.7000000000000000 0.3000000000000000 + 13364257812.50000 4.084397114870193 650554.3112572840 359003800161583.1 0.7000000000000000 0.3000000000000000 + 13432617187.50000 3.671310782303960 605915.9040649947 300552972445370.0 0.7000000000000000 0.3000000000000000 + 13500976562.50000 3.276741014065993 561685.2209646024 248669567895955.7 0.7000000000000000 0.3000000000000000 + 13569335937.50000 2.900822686257285 517860.0087009014 202964967333044.9 0.7000000000000000 0.3000000000000000 + 13637695312.50000 2.543732692133514 474437.7451763924 163056542988733.1 0.7000000000000000 0.3000000000000000 + 13706054687.50000 2.205699528028618 431415.5740051412 128567054705860.7 0.7000000000000000 0.3000000000000000 + 13774414062.50000 1.887016008567047 388790.1991993378 99123908634467.75 0.7000000000000000 0.3000000000000000 + 13842773437.50000 1.588056559476287 346557.7080872066 74358231896454.41 0.7000000000000000 0.3000000000000000 + 13911132812.50000 1.309301442065402 304713.2572530699 53903693164704.98 0.7000000000000000 0.3000000000000000 + 13979492187.50000 1.051371920499818 263250.4777934767 37394959543089.59 0.7000000000000000 0.3000000000000000 + 14047851562.50000 0.8150836116050131 222160.2520983275 24465609881788.45 0.7000000000000000 0.3000000000000000 + 14116210937.50000 0.6015320578865383 181427.9125658630 14745191150620.36 0.7000000000000000 0.3000000000000000 + 14184570312.50000 0.4122403825073742 141025.8113838347 7854827740056.808 0.7000000000000000 0.3000000000000000 + 14252929687.50000 0.2494407413660469 100888.8514430544 3400150121556.842 0.7000000000000000 0.3000000000000000 + 14321289062.50000 0.1166920668670388 60798.44525831612 958564478899.3911 0.7000000000000000 0.3000000000000000 + 14389648437.50000 0.2045670054059830E-01 19043.87449222994 52635460153.59263 0.7000000000000000 0.3000000000000000 + 14458007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14526367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14594726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14663085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14731445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14799804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14868164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 14936523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15004882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15073242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15141601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15209960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15278320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15346679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15415039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15483398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15551757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15620117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15688476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15756835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15825195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15893554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 15961914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16030273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16098632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16166992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16235351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16303710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16372070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16440429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16508789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16577148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16645507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16713867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16782226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16850585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16918945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 16987304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17055664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17124023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17192382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17260742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17329101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17397460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17465820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17534179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17602539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17670898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17739257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17807617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17875976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 17944335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18012695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18081054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18149414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18217773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18286132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18354492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18422851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18491210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18559570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18627929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18696289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18764648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18833007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18901367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 18969726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19038085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19106445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19174804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19243164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19311523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19379882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19448242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19516601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19584960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19653320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19721679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19790039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19858398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19926757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 19995117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20063476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20131835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20200195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20268554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20336914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20405273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20473632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20541992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20610351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20678710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20747070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20815429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20883789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 20952148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21020507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21088867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21157226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21225585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21293945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21362304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21430664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21499023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21567382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21635742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21704101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21772460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21840820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21909179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 21977539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22045898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22114257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22182617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22250976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22319335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22387695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22456054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22524414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22592773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22661132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22729492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22797851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22866210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 22934570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23002929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23071289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23139648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23208007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23276367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23344726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23413085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23481445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23549804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23618164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23686523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23754882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23823242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23891601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 23959960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24028320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24096679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24165039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24233398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24301757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24370117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24438476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24506835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24575195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24643554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24711914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24780273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24848632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24916992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 24985351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25053710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25122070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25190429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25258789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25327148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25395507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25463867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25532226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25600585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25668945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25737304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25805664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25874023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 25942382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26010742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26079101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26147460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26215820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26284179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26352539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26420898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26489257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26557617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26625976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26694335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26762695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26831054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26899414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 26967773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27036132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27104492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27172851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27241210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27309570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27377929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27446289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27514648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27583007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27651367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27719726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27788085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27856445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27924804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 27993164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28061523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28129882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28198242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28266601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28334960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28403320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28471679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28540039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28608398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28676757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28745117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28813476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28881835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 28950195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29018554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29086914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29155273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29223632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29291992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29360351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29428710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29497070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29565429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29633789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29702148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29770507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29838867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29907226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 29975585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30043945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30112304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30180664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30249023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30317382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30385742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30454101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30522460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30590820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30659179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30727539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30795898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30864257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 30932617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31000976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31069335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31137695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31206054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31274414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31342773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31411132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31479492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31547851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31616210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31684570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31752929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31821289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31889648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 31958007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32026367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32094726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32163085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32231445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32299804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32368164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32436523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32504882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32573242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32641601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32709960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32778320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32846679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32915039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 32983398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33051757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33120117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33188476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33256835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33325195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33393554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33461914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33530273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33598632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33666992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33735351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33803710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33872070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 33940429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34008789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34077148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34145507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34213867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34282226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34350585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34418945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34487304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34555664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34624023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34692382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34760742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34829101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34897460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 34965820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35034179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35102539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35170898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35239257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35307617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35375976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35444335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35512695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35581054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35649414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35717773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35786132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35854492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35922851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 35991210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36059570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36127929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36196289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36264648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36333007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36401367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36469726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36538085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36606445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36674804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36743164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36811523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36879882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 36948242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37016601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37084960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37153320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37221679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37290039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37358398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37426757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37495117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37563476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37631835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37700195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37768554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37836914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37905273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 37973632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38041992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38110351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38178710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38247070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38315429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38383789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38452148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38520507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38588867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38657226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38725585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38793945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38862304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38930664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 38999023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39067382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39135742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39204101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39272460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39340820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39409179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39477539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39545898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39614257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39682617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39750976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39819335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39887695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 39956054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40024414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40092773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40161132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40229492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40297851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40366210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40434570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40502929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40571289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40639648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40708007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40776367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40844726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40913085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 40981445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41049804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41118164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41186523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41254882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41323242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41391601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41459960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41528320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41596679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41665039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41733398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41801757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41870117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 41938476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42006835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42075195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42143554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42211914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42280273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42348632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42416992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42485351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42553710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42622070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42690429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42758789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42827148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42895507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 42963867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43032226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43100585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43168945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43237304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43305664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43374023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43442382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43510742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43579101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43647460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43715820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43784179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43852539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43920898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 43989257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44057617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44125976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44194335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44262695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44331054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44399414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44467773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44536132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44604492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44672851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44741210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44809570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44877929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 44946289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45014648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45083007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45151367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45219726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45288085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45356445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45424804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45493164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45561523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45629882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45698242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45766601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45834960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45903320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 45971679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46040039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46108398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46176757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46245117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46313476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46381835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46450195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46518554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46586914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46655273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46723632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46791992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46860351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46928710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 46997070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47065429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47133789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47202148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47270507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47338867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47407226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47475585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47543945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47612304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47680664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47749023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47817382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47885742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 47954101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48022460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48090820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48159179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48227539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48295898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48364257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48432617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48500976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48569335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48637695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48706054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48774414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48842773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48911132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 48979492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49047851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49116210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49184570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49252929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49321289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49389648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49458007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49526367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49594726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49663085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49731445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49799804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49868164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 49936523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50004882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50073242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50141601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50209960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50278320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50346679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50415039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50483398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50551757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50620117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50688476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50756835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50825195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50893554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 50961914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51030273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51098632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51166992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51235351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51303710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51372070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51440429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51508789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51577148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51645507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51713867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51782226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51850585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51918945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 51987304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52055664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52124023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52192382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52260742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52329101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52397460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52465820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52534179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52602539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52670898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52739257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52807617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52875976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 52944335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53012695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53081054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53149414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53217773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53286132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53354492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53422851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53491210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53559570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53627929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53696289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53764648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53833007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53901367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 53969726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54038085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54106445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54174804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54243164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54311523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54379882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54448242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54516601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54584960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54653320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54721679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54790039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54858398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54926757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 54995117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55063476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55131835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55200195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55268554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55336914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55405273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55473632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55541992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55610351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55678710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55747070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55815429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55883789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 55952148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56020507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56088867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56157226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56225585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56293945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56362304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56430664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56499023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56567382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56635742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56704101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56772460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56840820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56909179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 56977539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57045898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57114257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57182617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57250976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57319335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57387695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57456054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57524414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57592773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57661132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57729492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57797851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57866210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 57934570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58002929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58071289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58139648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58208007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58276367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58344726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58413085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58481445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58549804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58618164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58686523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58754882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58823242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58891601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 58959960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59028320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59096679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59165039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59233398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59301757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59370117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59438476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59506835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59575195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59643554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59711914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59780273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59848632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59916992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 59985351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60053710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60122070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60190429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60258789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60327148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60395507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60463867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60532226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60600585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60668945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60737304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60805664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60874023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 60942382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61010742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61079101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61147460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61215820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61284179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61352539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61420898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61489257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61557617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61625976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61694335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61762695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61831054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61899414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 61967773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62036132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62104492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62172851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62241210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62309570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62377929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62446289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62514648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62583007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62651367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62719726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62788085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62856445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62924804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 62993164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63061523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63129882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63198242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63266601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63334960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63403320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63471679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63540039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63608398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63676757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63745117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63813476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63881835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 63950195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64018554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64086914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64155273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64223632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64291992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64360351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64428710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64497070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64565429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64633789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64702148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64770507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64838867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64907226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 64975585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65043945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65112304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65180664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65249023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65317382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65385742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65454101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65522460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65590820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65659179687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65727539062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65795898437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65864257812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 65932617187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66000976562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66069335937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66137695312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66206054687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66274414062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66342773437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66411132812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66479492187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66547851562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66616210937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66684570312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66752929687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66821289062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66889648437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 66958007812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67026367187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67094726562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67163085937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67231445312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67299804687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67368164062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67436523437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67504882812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67573242187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67641601562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67709960937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67778320312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67846679687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67915039062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 67983398437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68051757812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68120117187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68188476562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68256835937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68325195312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68393554687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68461914062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68530273437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68598632812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68666992187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68735351562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68803710937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68872070312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 68940429687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69008789062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69077148437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69145507812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69213867187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69282226562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69350585937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69418945312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69487304687.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69555664062.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69624023437.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69692382812.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69760742187.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69829101562.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69897460937.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 + 69965820312.50000 0.1000000000000000E-04 1000.000000000000 1351100.098638705 0.7000000000000000 0.3000000000000000 diff --git a/Util/postprocess/main.cpp b/Util/postprocess/main.cpp new file mode 100644 index 000000000..8e1255c32 --- /dev/null +++ b/Util/postprocess/main.cpp @@ -0,0 +1,41 @@ +// +// Process a plotfile to produce diagnostics for rotational problems. +// +#include +#include + +#include +#include "AMReX_ParmParse.H" +#include "AMReX_PlotFileUtil.H" + +using namespace amrex; + +std::string inputs_name = ""; + +int main(int argc, char* argv[]) { + amrex::Initialize(argc, argv); + + // timer for profiling + BL_PROFILE_VAR("main()", pmain); + + // wallclock time + const Real strt_total = ParallelDescriptor::second(); + + Postprocess postproc; + + postproc.init(); + + postproc.diag(); + + // wallclock time + Real end_total = ParallelDescriptor::second() - strt_total; + + // print wallclock time + ParallelDescriptor::ReduceRealMax(end_total, + ParallelDescriptor::IOProcessorNumber()); + Print() << "Total Time: " << end_total << '\n'; + + BL_PROFILE_VAR_STOP(pmain); + + amrex::Finalize(); +} diff --git a/Util/postprocess/test.cpp b/Util/postprocess/test.cpp new file mode 100644 index 000000000..9c7148733 --- /dev/null +++ b/Util/postprocess/test.cpp @@ -0,0 +1,273 @@ +#include +#include +#include +#include "AMReX_PlotFileUtil.H" + +using namespace amrex; + +// --------------------------------- +// Write 1D radial diagnostics +// --------------------------------- +void Postprocess::test() { + // exact-solution problem to test subroutines that compute + // diagnostics dependent on velocity only; + + // make BoxArray and Geometry + int n_cell = 128; + int max_grid_size = 32; + BoxArray ba; + Geometry tgeom; + { + IntVect dom_lo(AMREX_D_DECL(0, 0, 0)); + IntVect dom_hi(AMREX_D_DECL(n_cell - 1, n_cell - 1, n_cell - 1)); + Box domain(dom_lo, dom_hi); + + ba.define(domain); + ba.maxSize(max_grid_size); + + // define physical box, [0, 200] in each direction + RealBox real_box({AMREX_D_DECL(0.0_rt, 0.0_rt, 0.0_rt)}, + {AMREX_D_DECL(200.0_rt, 200.0_rt, 200.0_rt)}); + + tgeom.define(domain, &real_box); + } + DistributionMapping dm(ba); + + // define density and pressure + MultiFab rho0(ba, dm, 1, 0); + MultiFab p0(ba, dm, 1, 0); + rho0.setVal(1.); + p0.setVal(1.); + + // define species + maestro_network_init(); + MultiFab rhoX(ba, dm, NumSpec, 0); + rhoX.setVal(0.); + + // define velocities + MultiFab u_mf(ba, dm, AMREX_SPACEDIM, 0); + MultiFab w0_mf(ba, dm, AMREX_SPACEDIM, 0); + w0_mf.setVal(0.); + + Vector center_p(3); + center_p[0] = 100.0; + center_p[1] = 100.0; + center_p[2] = 100.0; + + const auto dx = tgeom.CellSizeArray(); + const auto prob_lo = tgeom.ProbLoArray(); + + for (MFIter mfi(u_mf, TilingIfNotGPU()); mfi.isValid(); ++mfi) { + // Get the index space of the valid region + const Box& tileBox = mfi.tilebox(); + + const Array4 rhoX_arr = rhoX.array(mfi); + const Array4 vel_arr = u_mf.array(mfi); + + AMREX_PARALLEL_FOR_3D(tileBox, i, j, k, { + // first species: rhoX = 1 + rhoX_arr(i, j, k, 0) = 1.0; + + // initialize velocity + Real x = prob_lo[0] + (Real(i) + 0.5) * dx[0] - center_p[0]; + Real y = prob_lo[1] + (Real(j) + 0.5) * dx[1] - center_p[1]; + Real z = prob_lo[2] + (Real(k) + 0.5) * dx[2] - center_p[2]; + Real radius = std::sqrt(x * x + y * y + z * z); + + Vector norm(3); + norm[0] = x / radius; + norm[1] = y / radius; + norm[2] = z / radius; + + // v_r = 1/r if r < 50 + // v_r = 50*(50/r) if r >= 50 + if (radius < 50.0) { + for (int dim = 0; dim < AMREX_SPACEDIM; ++dim) { + vel_arr(i, j, k, dim) = radius * norm[dim]; + } + } else { + for (int dim = 0; dim < AMREX_SPACEDIM; ++dim) { + vel_arr(i, j, k, dim) = 50.0 * 50.0 / radius * norm[dim]; + } + } + }); + } + + // put all variables into a single multifab + MultiFab s0(ba, dm, 2 + NumSpec + 2 * AMREX_SPACEDIM, 0); + MultiFab::Copy(s0, rho0, 0, 0, 1, 0); + MultiFab::Copy(s0, p0, 0, 1, 1, 0); + MultiFab::Copy(s0, rhoX, 0, 2, NumSpec, 0); + MultiFab::Copy(s0, u_mf, 0, 2 + NumSpec, AMREX_SPACEDIM, 0); + MultiFab::Copy(s0, w0_mf, 0, 2 + NumSpec + AMREX_SPACEDIM, AMREX_SPACEDIM, + 0); + + // variable names for plotfile + Vector varnames(2 + NumSpec + 2 * AMREX_SPACEDIM); + int cnt = 0; + varnames[cnt++] = "rho"; + varnames[cnt++] = "p0"; + + for (int i = 0; i < NumSpec; i++) { + int len = 20; + Vector int_spec_names(len); + // + // This call return the actual length of each string in "len" + // + get_spec_names(int_spec_names.dataPtr(), &i, &len); + auto* spec_name = new char[len + 1]; + for (int j = 0; j < len; j++) { + spec_name[j] = int_spec_names[j]; + } + spec_name[len] = '\0'; + std::string spec_string = "rhoX("; + spec_string += spec_name; + spec_string += ')'; + + varnames[cnt++] = spec_string; + delete[] spec_name; + } + + // add velocities + for (int i = 0; i < AMREX_SPACEDIM; ++i) { + std::string x = "vel"; + x += (120 + i); + varnames[cnt++] = x; + } + + for (int i = 0; i < AMREX_SPACEDIM; ++i) { + std::string x = "w0"; + x += (120 + i); + varnames[cnt++] = x; + } + + // write plotfile + Print() << "Writing exact solution plotfile" << std::endl; + + std::string basefilename = "test_plt"; + std::string testfilename = basefilename + "0000000"; + + WriteSingleLevelPlotfile(testfilename, s0, varnames, tgeom, 0, 0); + + WriteTestJobInfo(testfilename, basefilename, max_grid_size); +} + +void Postprocess::WriteTestJobInfo(const std::string& dir, + const std::string& base, + const int maxgridsize) { + // timer for profiling + BL_PROFILE_VAR("Postprocess::WritePartJobInfo()", WritePartJobInfo); + + if (ParallelDescriptor::IOProcessor()) { + // job_info file with details about the run + std::ofstream jobInfoFile; + std::string FullPathJobInfoFile = dir; + + std::string PrettyLine = std::string(78, '=') + "\n"; + std::string OtherLine = std::string(78, '-') + "\n"; + std::string SkipSpace = std::string(8, ' '); + + FullPathJobInfoFile += "/job_info"; + jobInfoFile.open(FullPathJobInfoFile.c_str(), std::ios::out); + + // job information + jobInfoFile << PrettyLine; + jobInfoFile << " MAESTROeX Job Information\n"; + jobInfoFile << PrettyLine; + + // // grid information + // jobInfoFile << PrettyLine; + // jobInfoFile << " Grid Information\n"; + // jobInfoFile << PrettyLine; + + // for (int i = 0; i <= finest_level; i++) { + // jobInfoFile << " level: " << i << "\n"; + // jobInfoFile << " number of boxes = " << grids[i].size() << "\n"; + // jobInfoFile << " maximum zones = "; + // for (int n = 0; n < BL_SPACEDIM; n++) { + // jobInfoFile << geom_in[i].Domain().length(n) << " "; + // } + // jobInfoFile << "\n\n"; + // } + + // jobInfoFile << " Boundary conditions\n"; + // Vector lo_bc_out(BL_SPACEDIM), hi_bc_out(BL_SPACEDIM); + // ParmParse pp("maestro"); + // pp.getarr("lo_bc", lo_bc_out, 0, BL_SPACEDIM); + // pp.getarr("hi_bc", hi_bc_out, 0, BL_SPACEDIM); + + // // these names correspond to the integer flags setup in the + // // Castro_setup.cpp + // const char* names_bc[] = {"interior", "inflow", "outflow", + // "symmetry", "slipwall", "noslipwall"}; + + // jobInfoFile << " -x: " << names_bc[lo_bc_out[0]] << "\n"; + // jobInfoFile << " +x: " << names_bc[hi_bc_out[0]] << "\n"; + // if (BL_SPACEDIM >= 2) { + // jobInfoFile << " -y: " << names_bc[lo_bc_out[1]] << "\n"; + // jobInfoFile << " +y: " << names_bc[hi_bc_out[1]] << "\n"; + // } + // if (BL_SPACEDIM == 3) { + // jobInfoFile << " -z: " << names_bc[lo_bc_out[2]] << "\n"; + // jobInfoFile << " +z: " << names_bc[hi_bc_out[2]] << "\n"; + // } + + // jobInfoFile << "\n\n"; + + // // species info + // Real Aion = 0.0; + // Real Zion = 0.0; + + // int mlen = 20; + + // jobInfoFile << PrettyLine; + // jobInfoFile << " Species Information\n"; + // jobInfoFile << PrettyLine; + + // jobInfoFile << std::setw(6) << "index" << SkipSpace + // << std::setw(mlen + 1) << "name" << SkipSpace + // << std::setw(7) << "A" << SkipSpace << std::setw(7) << "Z" + // << "\n"; + // jobInfoFile << OtherLine; + + // for (int i = 0; i < NumSpec; i++) { + // int len = mlen; + // Vector int_spec_names(len); + // // + // // This call return the actual length of each string in "len" + // // + // get_spec_names(int_spec_names.dataPtr(), &i, &len); + // auto* spec_name = new char[len + 1]; + // for (int j = 0; j < len; j++) { + // spec_name[j] = int_spec_names[j]; + // } + // spec_name[len] = '\0'; + + // // get A and Z + // get_spec_az(&i, &Aion, &Zion); + + // jobInfoFile << std::setw(6) << i << SkipSpace << std::setw(mlen + 1) + // << std::setfill(' ') << spec_name << SkipSpace + // << std::setw(7) << Aion << SkipSpace << std::setw(7) + // << Zion << "\n"; + // delete[] spec_name; + // } + // jobInfoFile << "\n\n"; + + // runtime parameters + jobInfoFile << PrettyLine; + jobInfoFile << " Inputs File Parameters\n"; + jobInfoFile << PrettyLine; + + ParmParse::dumpTable(jobInfoFile, true); + + jobInfoFile << "eos_gamma = 1.666666667\n"; + jobInfoFile << "amr.max_grid_size = " << maxgridsize << "\n"; + jobInfoFile << "maestro.plot_base_name = " << base << "\n"; + jobInfoFile << "maestro.drdxfac = 5\n"; + jobInfoFile << "maestro.octant = false\n"; + jobInfoFile << "maestro.rotational_frequency = 1.e-6\n"; + + jobInfoFile.close(); + } +}