diff --git a/amr-wind/immersed_boundary/IB.cpp b/amr-wind/immersed_boundary/IB.cpp index a2bf830ad7..848ad6660c 100644 --- a/amr-wind/immersed_boundary/IB.cpp +++ b/amr-wind/immersed_boundary/IB.cpp @@ -3,6 +3,7 @@ #include "amr-wind/CFDSim.H" #include "amr-wind/core/FieldRepo.H" #include "amr-wind/core/MultiParser.H" +#include "amr-wind/utilities/io_utils.H" #include @@ -26,6 +27,9 @@ void IB::pre_init_actions() amrex::Vector labels; pp.getarr("labels", labels); + ioutils::assert_with_message( + ioutils::all_distinct(labels), + "Duplicates in " + identifier() + ".labels"); const int n_ibs = static_cast(labels.size()); diff --git a/amr-wind/utilities/ascent/ascent.cpp b/amr-wind/utilities/ascent/ascent.cpp index a43736c9ca..d533b881da 100644 --- a/amr-wind/utilities/ascent/ascent.cpp +++ b/amr-wind/utilities/ascent/ascent.cpp @@ -28,6 +28,8 @@ void AscentPostProcess::initialize() { amrex::ParmParse pp("ascent"); pp.getarr("fields", field_names); + ioutils::assert_with_message( + ioutils::all_distinct(field_names), "Duplicates in ascent.fields"); pp.query("output_frequency", m_out_freq); } diff --git a/amr-wind/utilities/averaging/TimeAveraging.cpp b/amr-wind/utilities/averaging/TimeAveraging.cpp index 4c1d35c753..3e326d3e66 100644 --- a/amr-wind/utilities/averaging/TimeAveraging.cpp +++ b/amr-wind/utilities/averaging/TimeAveraging.cpp @@ -2,6 +2,7 @@ #include "amr-wind/utilities/averaging/TimeAveraging.H" #include "amr-wind/utilities/averaging/ReAveraging.H" +#include "amr-wind/utilities/io_utils.H" #include "amr-wind/CFDSim.H" #include "AMReX_ParmParse.H" @@ -21,6 +22,9 @@ void TimeAveraging::pre_init_actions() { amrex::ParmParse pp(m_label); pp.getarr("labels", labels); + ioutils::assert_with_message( + ioutils::all_distinct(labels), + "Duplicates in " + m_label + ".labels"); pp.query("averaging_start_time", m_start_time); pp.query("averaging_stop_time", m_stop_time); pp.get("averaging_window", m_filter); @@ -34,17 +38,14 @@ void TimeAveraging::pre_init_actions() amrex::ParmParse pp1(pp_key); pp1.getarr("fields", fnames); + ioutils::assert_with_message( + ioutils::all_distinct(fnames), + "Duplicates in " + pp_key + ".fields"); pp1.get("averaging_type", avg_type); for (const auto& fname : fnames) { const std::string key = fname + "_" + avg_type; - // Guard against multiple registrations of the field - const auto found = m_registered.find(key); - if (found != m_registered.end()) { - continue; - } - // Create the averaging entity m_averages.emplace_back( FieldTimeAverage::create(avg_type, m_sim, fname)); diff --git a/amr-wind/utilities/io_utils.H b/amr-wind/utilities/io_utils.H index 89074ce80b..005716aa2c 100644 --- a/amr-wind/utilities/io_utils.H +++ b/amr-wind/utilities/io_utils.H @@ -5,6 +5,7 @@ #include #include #include +#include #include "AMReX_Vector.H" namespace amrex { @@ -59,6 +60,20 @@ inline void add_var_names( } } } + +template +inline bool all_distinct(const amrex::Vector& vec) +{ + std::unordered_set s(vec.begin(), vec.end()); + return static_cast(s.size()) == vec.size(); +} + +inline void assert_with_message(const bool val, const std::string& msg) +{ + if (!val) { + amrex::Abort(msg); + } +} } // namespace amr_wind::ioutils #endif /* IO_UTILS_H */ diff --git a/amr-wind/utilities/sampling/Sampling.cpp b/amr-wind/utilities/sampling/Sampling.cpp index aa7e37885c..622c352c8c 100644 --- a/amr-wind/utilities/sampling/Sampling.cpp +++ b/amr-wind/utilities/sampling/Sampling.cpp @@ -31,7 +31,13 @@ void Sampling::initialize() { amrex::ParmParse pp(m_label); pp.getarr("labels", labels); + ioutils::assert_with_message( + ioutils::all_distinct(labels), + "Duplicates in " + m_label + ".labels"); pp.getarr("fields", field_names); + ioutils::assert_with_message( + ioutils::all_distinct(field_names), + "Duplicates in " + m_label + ".fields"); pp.queryarr("derived_fields", derived_field_names); pp.query("output_frequency", m_out_freq); pp.query("output_format", m_out_fmt); diff --git a/amr-wind/wind_energy/actuator/Actuator.cpp b/amr-wind/wind_energy/actuator/Actuator.cpp index d09c664ed1..91109eadd3 100644 --- a/amr-wind/wind_energy/actuator/Actuator.cpp +++ b/amr-wind/wind_energy/actuator/Actuator.cpp @@ -3,6 +3,7 @@ #include "amr-wind/wind_energy/actuator/ActuatorContainer.H" #include "amr-wind/CFDSim.H" #include "amr-wind/core/FieldRepo.H" +#include "amr-wind/utilities/io_utils.H" #include #include @@ -23,6 +24,9 @@ void Actuator::pre_init_actions() amrex::Vector labels; pp.getarr("labels", labels); + ioutils::assert_with_message( + ioutils::all_distinct(labels), + "Duplicates in " + identifier() + ".labels"); const int nturbines = static_cast(labels.size()); @@ -306,4 +310,4 @@ T* Actuator::get_actuator(std::string& key) const amrex::Abort("Could not find actuator"); } -} // namespace amr_wind::actuator \ No newline at end of file +} // namespace amr_wind::actuator