Skip to content

File emulator_diagnostics.cpp

File List > common > src > emulator_diagnostics.cpp

Go to the documentation of this file

#include "emulator_diagnostics.hpp"
#include <algorithm>
#include <cctype>

namespace emulator {

namespace {
// Helper to convert string to lowercase
std::string to_lower(const std::string &s) {
  std::string result = s;
  std::transform(result.begin(), result.end(), result.begin(),
                 [](unsigned char c) { return std::tolower(c); });
  return result;
}
} // namespace

FrequencyUnit str_to_freq_unit(const std::string &s) {
  std::string lower = to_lower(s);

  if (lower == "nsteps" || lower == "nstep") {
    return FrequencyUnit::NSTEPS;
  } else if (lower == "nsecs" || lower == "nseconds" || lower == "nsecond") {
    return FrequencyUnit::NSECS;
  } else if (lower == "nmins" || lower == "nminutes" || lower == "nminute") {
    return FrequencyUnit::NMINS;
  } else if (lower == "nhours" || lower == "nhour") {
    return FrequencyUnit::NHOURS;
  } else if (lower == "ndays" || lower == "nday") {
    return FrequencyUnit::NDAYS;
  } else if (lower == "nmonths" || lower == "nmonth") {
    return FrequencyUnit::NMONTHS;
  } else if (lower == "nyears" || lower == "nyear") {
    return FrequencyUnit::NYEARS;
  } else if (lower == "none" || lower == "never") {
    return FrequencyUnit::NONE;
  }

  return FrequencyUnit::NONE;
}

std::string freq_unit_to_str(FrequencyUnit u) {
  switch (u) {
  case FrequencyUnit::NSTEPS:
    return "nsteps";
  case FrequencyUnit::NSECS:
    return "nsecs";
  case FrequencyUnit::NMINS:
    return "nmins";
  case FrequencyUnit::NHOURS:
    return "nhours";
  case FrequencyUnit::NDAYS:
    return "ndays";
  case FrequencyUnit::NMONTHS:
    return "nmonths";
  case FrequencyUnit::NYEARS:
    return "nyears";
  case FrequencyUnit::NONE:
  default:
    return "none";
  }
}

OutputAvgType str_to_avg_type(const std::string &s) {
  std::string lower = to_lower(s);

  if (lower == "instant" || lower == "instantaneous") {
    return OutputAvgType::INSTANT;
  } else if (lower == "average" || lower == "avg" || lower == "mean") {
    return OutputAvgType::AVERAGE;
  } else if (lower == "min" || lower == "minimum") {
    return OutputAvgType::MIN;
  } else if (lower == "max" || lower == "maximum") {
    return OutputAvgType::MAX;
  } else if (lower == "std" || lower == "stddev" || lower == "stdev") {
    return OutputAvgType::STD;
  } else if (lower == "sum" || lower == "total" || lower == "accumulated") {
    return OutputAvgType::SUM;
  }

  return OutputAvgType::INSTANT;
}

std::string avg_type_to_str(OutputAvgType t) {
  switch (t) {
  case OutputAvgType::INSTANT:
    return "instant";
  case OutputAvgType::AVERAGE:
    return "average";
  case OutputAvgType::MIN:
    return "min";
  case OutputAvgType::MAX:
    return "max";
  case OutputAvgType::STD:
    return "std";
  case OutputAvgType::SUM:
    return "sum";
  default:
    return "instant";
  }
}

OutputPrecision str_to_precision(const std::string &s) {
  std::string lower = to_lower(s);

  if (lower == "float64" || lower == "double" || lower == "f64") {
    return OutputPrecision::FLOAT64;
  }

  return OutputPrecision::FLOAT32;
}

std::string precision_to_str(OutputPrecision p) {
  switch (p) {
  case OutputPrecision::FLOAT64:
    return "float64";
  case OutputPrecision::FLOAT32:
  default:
    return "float32";
  }
}

std::string file_type_suffix(FileType t) {
  switch (t) {
  case FileType::RESTART:
    return ".atm.r.";
  case FileType::HISTORY_RESTART:
    return ".atm.rh.";
  case FileType::HISTORY:
  default:
    return ".atm.h.";
  }
}

} // namespace emulator