Skip to content

Commit

Permalink
Add test case that shows syntax
Browse files Browse the repository at this point in the history
  • Loading branch information
psakievich committed Jul 23, 2023
1 parent 85de5ea commit f0cd11e
Show file tree
Hide file tree
Showing 8 changed files with 383 additions and 72 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
.DS_Store
spack*
compile_commands.json
.cache
38 changes: 24 additions & 14 deletions app/exawind/exawind.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@ int main(int argc, char** argv)
#endif
std::ofstream out;

const auto nalu_node = node["nalu_wind_inp"];
YAML::Node nalu_node = node["nalu_wind_inp"];
// make sure it is a list for now
assert(nalu_node.IsSequence);
assert(nalu_node.IsSequence());
const int num_nwsolvers = nalu_node.size();
if (num_nwind_ranks < num_nwsolvers) {
throw std::runtime_error(
Expand Down Expand Up @@ -184,28 +184,29 @@ int main(int argc, char** argv)
? node["nonlinear_iterations"].as<int>()
: 1;

const auto yaml_replace_all = node["nalu_replace_all"];
const YAML::Node yaml_replace_all = node["nalu_replace_all"];
for (int i = 0; i < num_nwsolvers; i++) {
if (nalu_comms.at(i) != MPI_COMM_NULL) {
YAML::Node yaml_replace_instance;
std::string nalu_inpfile, logfile;
if (nalu_node[i].IsMap()) {
yaml_replace_instance = nalu_node["replace"];
nalu_inpfile = nalu_node["input_file"].as<std::string>();
YAML::Node this_instance = nalu_node[i];
if (this_instance.IsMap()) {
yaml_replace_instance = this_instance["replace"];
nalu_inpfile = this_instance["base_input_file"].as<std::string>();
// deal with the logfile name
if (nalu_node["logfile"]) {
logfile = nalu_node["logfile"].as<std::string>();
if (this_instance["logfile"]) {
logfile = this_instance["logfile"].as<std::string>();
} else {
logfile = exawind::NaluWind::logfile_from_input_file_name(
nalu_inpfile, i);
logfile = exawind::NaluWind::change_file_name_suffix(
nalu_inpfile, ".log", i);
}
} else {
nalu_inpfile = nalu_node[i].as<std::string>();
logfile = exawind::NaluWind::logfile_from_input_file_name(
nalu_inpfile);
nalu_inpfile = this_instance.as<std::string>();
logfile = exawind::NaluWind::change_file_name_suffix(
nalu_inpfile, ".log");
}

auto nalu_yaml = YAML::Load(nalu_inpfile);
YAML::Node nalu_yaml = YAML::LoadFile(nalu_inpfile);
// replace in order so instance can overwrite all
if (yaml_replace_all) {
YEDIT::find_and_replace(nalu_yaml, yaml_replace_all);
Expand All @@ -214,6 +215,15 @@ int main(int argc, char** argv)
YEDIT::find_and_replace(nalu_yaml, yaml_replace_instance);
}

if (this_instance["write_final_yaml_to_disk"]) {
auto new_ifile_name =
exawind::NaluWind::change_file_name_suffix(
logfile, ".yaml");
std::ofstream fout(new_ifile_name);
fout << nalu_yaml;
fout.close();
}

sim.register_solver<exawind::NaluWind>(
i + 1, nalu_comms.at(i), nalu_yaml, logfile, nalu_vars);
}
Expand Down
7 changes: 3 additions & 4 deletions src/NaluWind.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,15 @@ class NaluWind : public ExawindSolver
static void initialize();
static void finalize();
static std::string
logfile_from_input_file_name(std::string inpfile, int index = -1)
change_file_name_suffix(std::string inpfile, std::string suffix, int index = -1)
{
int extloc = inpfile.rfind(".");
std::string logfile = inpfile;
std::string tail = ".log";
if (index >= 0) {
tail = "_" + std::to_string(index) + tail;
suffix = "_" + std::to_string(index) + suffix;
}
if (extloc != std::string::npos) {
logfile = inpfile.substr(0, extloc) + tail;
logfile = inpfile.substr(0, extloc) + suffix;
}
return logfile;
}
Expand Down
117 changes: 63 additions & 54 deletions src/yaml-editor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,74 +2,83 @@
#include <stdexcept>
#include <iostream>

namespace YEDIT{
namespace YEDIT {

class YamlNodeMatchException : public std::exception{
class YamlNodeMatchException : public std::exception
{
public:
YamlNodeMatchException(std::string currentNode, std::string accumulatedPath = ""):
std::exception(), graphPath_(currentNode + ":" + accumulatedPath)
{
}
const char* what() const noexcept override{
return graphPath_.c_str();
}
YamlNodeMatchException(
std::string currentNode, std::string accumulatedPath = "")
: std::exception()
{
std::string extra =
accumulatedPath.empty() ? "" : ":" + accumulatedPath;
graphPath_ = currentNode + extra;
}
const char* what() const noexcept override { return graphPath_.c_str(); }

private:
std::string graphPath_;
std::string graphPath_;
};

namespace{
void impl_find_and_replace(YAML::Node src, YAML::Node key){
switch (key.Type()){
namespace {
void impl_find_and_replace(YAML::Node src, YAML::Node key)
{
switch (key.Type()) {
case YAML::NodeType::Map:
for(auto n : key){
std::string k = static_cast<std::string>(n.first.Scalar());
try{
impl_find_and_replace(src[k], key[k]);
}
catch(YamlNodeMatchException& e)
{
throw YamlNodeMatchException(k, std::string(e.what()));
for (auto n : key) {
std::string k = static_cast<std::string>(n.first.Scalar());
try {
impl_find_and_replace(src[k], key[k]);
} catch (YamlNodeMatchException& e) {
throw YamlNodeMatchException(k, std::string(e.what()));
}
}
}
break;
break;
case YAML::NodeType::Sequence:
for(int i=0; i<key.size(); ++i){
impl_find_and_replace(src[i], key[i]);
}
break;
case YAML::NodeType::Scalar:
{
if(src.Type() != key.Type()){
// we have a invalid path in the key
throw YamlNodeMatchException("");
}
src = key;
break;
}
for (int i = 0; i < key.size(); ++i) {
try {
impl_find_and_replace(src[i], key[i]);
} catch (YamlNodeMatchException& e) {
throw YamlNodeMatchException(
"[" + std::to_string(i) + "]", std::string(e.what()));
}
}
break;
case YAML::NodeType::Scalar: {
if (src.Type() != key.Type()) {
// we have a invalid path in the key
throw YamlNodeMatchException(key.as<std::string>());
}
src = key;
break;
}
default:
break;
}
}
break;
}
}
} // namespace

void find_and_replace(YAML::Node src, YAML::Node key){
try{
impl_find_and_replace(src, key);
}
catch(YamlNodeMatchException& e){
auto failingPath = static_cast<std::string>(e.what());
std::string message = "\nFailure trying to replace YAML\nFailing Graph:\n\t";
message+=failingPath+"\n";
message+="Please double check and make sure this matches the source YAML";
throw std::runtime_error(message);
}
void find_and_replace(YAML::Node src, YAML::Node key)
{
try {
impl_find_and_replace(src, key);
} catch (YamlNodeMatchException& e) {
auto failingPath = static_cast<std::string>(e.what());
std::string message =
"\nFailure trying to replace YAML\nFailing Graph:\n\t";
message += failingPath + "\n";
message +=
"Please double check and make sure this matches the source YAML";
throw std::runtime_error(message);
}
}

//case 1: it's a map
// case 1: it's a map
//- pass the contents of the map recursively
//case 2: it's a list
// case 2: it's a list
//- pass the contents of the list recursively
//case 3: it's a scalar
// case 3: it's a scalar
//- replace value

}
} // namespace YEDIT
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,4 @@ add_test_r(nalu-nalu-cylinder)
add_test_r(amr-nalu-cylinder)
add_test_r(nalu-nalu-cylinder-motion)
add_test_r(amr-nalu-cylinder-motion)
add_test_r(hybrid-multi-cylinder)
62 changes: 62 additions & 0 deletions test/test_files/hybrid-multi-cylinder/cylinder-amr.inp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#
# SIMULATION STOP #
#.......................................#
time.stop_time = 22000.0 # Max (#
tim.max_step = -1
time.fixed_dt = 0.15
time.cfl = 1.0
time.plot_interval = 10
time.checkpoint_interval = -10
io.plot_file = out/plt
io.check_file = out/chk
# PHYSICS #
#.......................................#
incflo.gravity = 0. 0. 0.0 # Gravitational force (3D)

incflo.use_godunov = 1
incflo.do_initial_proj = 0
incflo.initial_iterations = 0
transport.viscosity = 0.005
turbulence.model = Laminar


incflo.physics = FreeStream
incflo.velocity = 1.0 0.0 0.0
incflo.density = 1.0

amr.n_cell = 160 56 4 # Grid cells at coarsest AMRlevel
amr.max_level = 0 # Max AMR level in hierarchy
amr.blocking_factor_z = 4
amr.blocking_factor_x = 8
amr.blocking_factor_y = 8
amr.max_grid_size_z = 4
amr.max_grid_size_x = 16
amr.max_grid_size_y = 16

geometry.prob_lo = -15 -5.0 -0.375 # Lo corner coordinates
geometry.prob_hi = 7.5 5.0 0.375 # Hi corner coordinates
geometry.is_periodic = 0 0 1 # Periodicity x y z (0/1)


# Boundary conditions
xlo.type = "mass_inflow"
xlo.velocity = 1.0 0.0 0.0
xlo.density = 1.0
xhi.type = "pressure_outflow"
xhi.pressure = 0.0
ylo.type = "slip_wall"
yhi.type = "slip_wall"
#zlo.type = "slip_wall"
#zhi.type = "slip_wall"

incflo.verbose = 0 # incflo_level
amrex.fpe_trap_invalid = 0 # Trap NaNs
amrex.throw_exception = 1
amrex.signal_handling = 0

mac_proj.verbose = 0
nodal_proj.verbose = 0
nodal_proj.mg_rtol = 1.0e-6
nodal_proj.mg_atol = 1.0e-10
nodal_proj.num_pre_smooth = 10
nodal_proj.num_post_smooth = 10
Loading

0 comments on commit f0cd11e

Please sign in to comment.