diff --git a/include/openmc/finalize.h b/include/openmc/finalize.h index 5a8238841..f99201abe 100644 --- a/include/openmc/finalize.h +++ b/include/openmc/finalize.h @@ -3,8 +3,6 @@ namespace openmc { -extern "C" void openmc_free_bank(); - } // namespace openmc #endif // OPENMC_FINALIZE_H diff --git a/include/openmc/settings.h b/include/openmc/settings.h index 32eac43fb..aa9f9c056 100644 --- a/include/openmc/settings.h +++ b/include/openmc/settings.h @@ -68,7 +68,7 @@ extern "C" int32_t gen_per_batch; //!< number of generations per batch extern "C" int64_t n_particles; //!< number of particles per generation extern "C" int electron_treatment; //!< how to treat secondary electrons -extern "C" double energy_cutoff[4]; //!< Energy cutoff in [eV] for each particle type +extern "C" std::array energy_cutoff; //!< Energy cutoff in [eV] for each particle type extern "C" int legendre_to_tabular_points; //!< number of points to convert Legendres extern "C" int max_order; //!< Maximum Legendre order for multigroup data extern "C" int n_log_bins; //!< number of bins for logarithmic energy grid @@ -82,7 +82,7 @@ extern std::unordered_set statepoint_batch; //!< Batches when state should extern "C" int temperature_method; //!< method for choosing temperatures extern "C" double temperature_tolerance; //!< Tolerance in [K] on choosing temperatures extern "C" double temperature_default; //!< Default T in [K] -extern "C" double temperature_range[2]; //!< Min/max T in [K] over which to load xs +extern "C" std::array temperature_range; //!< Min/max T in [K] over which to load xs extern "C" int trace_batch; //!< Batch to trace particle on extern "C" int trace_gen; //!< Generation to trace particle on extern "C" int64_t trace_particle; //!< Particle ID to enable trace on diff --git a/src/api.F90 b/src/api.F90 index 3d757e138..67408b816 100644 --- a/src/api.F90 +++ b/src/api.F90 @@ -49,7 +49,6 @@ module openmc_api public :: openmc_filter_get_type public :: openmc_filter_set_id public :: openmc_filter_set_type - public :: openmc_finalize public :: openmc_find_cell public :: openmc_get_cell_index public :: openmc_get_keff @@ -96,89 +95,6 @@ module openmc_api contains -!=============================================================================== -! OPENMC_FINALIZE frees up memory by deallocating arrays and resetting global -! variables -!=============================================================================== - - function openmc_finalize() result(err) bind(C) - integer(C_INT) :: err - - interface - subroutine openmc_free_bank() bind(C) - end subroutine openmc_free_bank - end interface - - ! Clear results - err = openmc_reset() - - ! Reset global variables - assume_separate = .false. - check_overlaps = .false. - confidence_intervals = .false. - create_fission_neutrons = .true. - electron_treatment = ELECTRON_LED - energy_cutoff(:) = [ZERO, 1000.0_8, ZERO, ZERO] - energy_max(:) = [INFINITY, INFINITY] - energy_min(:) = [ZERO, ZERO] - entropy_on = .false. - gen_per_batch = 1 - index_entropy_mesh = -1 - index_ufs_mesh = -1 - keff = ONE - legendre_to_tabular = .true. - legendre_to_tabular_points = C_NONE - n_batch_interval = 1 - n_lost_particles = 0 - n_particles = -1 - n_tallies = 0 - output_summary = .true. - output_tallies = .true. - particle_restart_run = .false. - photon_transport = .false. - pred_batches = .false. - reduce_tallies = .true. - res_scat_on = .false. - res_scat_method = RES_SCAT_ARES - res_scat_energy_min = 0.01_8 - res_scat_energy_max = 1000.0_8 - restart_run = .false. - root_universe = -1 - run_CE = .true. - run_mode = -1 - dagmc = .false. - satisfy_triggers = .false. - call openmc_set_seed(DEFAULT_SEED) - source_latest = .false. - source_separate = .false. - source_write = .true. - survival_biasing = .false. - temperature_default = 293.6_8 - temperature_method = TEMPERATURE_NEAREST - temperature_multipole = .false. - temperature_range = [ZERO, ZERO] - temperature_tolerance = 10.0_8 - total_gen = 0 - trigger_on = .false. - ufs = .false. - urr_ptables_on = .true. - verbosity = 7 - weight_cutoff = 0.25_8 - weight_survive = ONE - write_all_tracks = .false. - write_initial_source = .false. - - ! Deallocate arrays - call free_memory() - - err = 0 -#ifdef OPENMC_MPI - ! Free all MPI types - call openmc_free_bank() -#endif - - end function openmc_finalize - !=============================================================================== ! OPENMC_FIND_CELL determines what cell contains a given point in space !=============================================================================== @@ -280,7 +196,7 @@ contains ! program !=============================================================================== - subroutine free_memory() + subroutine free_memory() bind(C) use cmfd_header use photon_header diff --git a/src/finalize.cpp b/src/finalize.cpp index 7f07ddac0..732335815 100644 --- a/src/finalize.cpp +++ b/src/finalize.cpp @@ -1,14 +1,89 @@ #include "openmc/finalize.h" +#include "openmc/capi.h" +#include "openmc/constants.h" +#include "openmc/geometry.h" #include "openmc/message_passing.h" +#include "openmc/nuclide.h" +#include "openmc/random_lcg.h" +#include "openmc/settings.h" +#include "openmc/simulation.h" -namespace openmc { +// Functions defined in Fortran +extern "C" void free_memory(); -void openmc_free_bank() +int openmc_finalize() { + using namespace openmc; + + // Clear results + openmc_reset(); + + // Reset global variables + settings::assume_separate = false; + settings::check_overlaps = false; + settings::confidence_intervals = false; + settings::create_fission_neutrons = true; + settings::electron_treatment = ELECTRON_LED; + settings::energy_cutoff = {0.0, 1000.0, 0.0, 0.0}; + settings::entropy_on = false; + settings::gen_per_batch = 1; + settings::index_entropy_mesh = -1; + settings::index_ufs_mesh = -1; + settings::legendre_to_tabular = true; + settings::legendre_to_tabular_points = -1; + settings::n_particles = -1; + settings::output_summary = true; + settings::output_tallies = true; + settings::particle_restart_run = false; + settings::photon_transport = false; + settings::reduce_tallies = true; + settings::res_scat_on = false; + settings::res_scat_method = RES_SCAT_ARES; + settings::res_scat_energy_min = 0.01; + settings::res_scat_energy_max = 1000.0; + settings::restart_run = false; + settings::run_CE = true; + settings::run_mode = -1; + settings::dagmc = false; + settings::source_latest = false; + settings::source_separate = false; + settings::source_write = true; + settings::survival_biasing = false; + settings::temperature_default = 293.6; + settings::temperature_method = TEMPERATURE_NEAREST; + settings::temperature_multipole = false; + settings::temperature_range = {0.0, 0.0}; + settings::temperature_tolerance = 10.0; + settings::trigger_on = false; + settings::trigger_predict = false; + settings::trigger_batch_interval = 1; + settings::ufs_on = false; + settings::urr_ptables_on = true; + settings::verbosity = 7; + settings::weight_cutoff = 0.25; + settings::weight_survive = 1.0; + settings::write_all_tracks = false; + settings::write_initial_source = false; + + simulation::keff = 1.0; + simulation::n_lost_particles = 0; + simulation::satisfy_triggers = false; + simulation::total_gen = 0; + + energy_max = {INFTY, INFTY}; + energy_min = {0.0, 0.0}; + n_tallies = 0; + openmc_root_universe = -1; + openmc_set_seed(DEFAULT_SEED); + + // Deallocate arrays + free_memory(); + + // Free all MPI types #ifdef OPENMC_MPI MPI_Type_free(&mpi::bank); #endif -} -} // namespace openmc + return 0; +} diff --git a/src/settings.cpp b/src/settings.cpp index ee1f21dd5..4137fdfe1 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -79,7 +79,7 @@ int32_t gen_per_batch {1}; int64_t n_particles {-1}; int electron_treatment {ELECTRON_TTB}; -double energy_cutoff[4] {0.0, 1000.0, 0.0, 0.0}; +std::array energy_cutoff {0.0, 1000.0, 0.0, 0.0}; int legendre_to_tabular_points {C_NONE}; int max_order {0}; int n_log_bins {8000}; @@ -93,7 +93,7 @@ std::unordered_set statepoint_batch; int temperature_method {TEMPERATURE_NEAREST}; double temperature_tolerance {10.0}; double temperature_default {293.6}; -double temperature_range[2] {0.0, 0.0}; +std::array temperature_range {0.0, 0.0}; int trace_batch; int trace_gen; int64_t trace_particle;