Skip to content

File vert_slice_diagnostic.cpp

File List > common > src > diagnostics > vert_slice_diagnostic.cpp

Go to the documentation of this file

#include "vert_slice_diagnostic.hpp"

namespace emulator {

VertSliceDiagnostic::VertSliceDiagnostic(const std::string &field_name,
                                         int level_idx, int nlevs)
    : m_source_field(field_name), m_level_idx(level_idx), m_nlevs(nlevs) {
  m_name = field_name + "_at_lev" + std::to_string(level_idx);
}

void VertSliceDiagnostic::compute(const FieldDataProvider &fields,
                                  std::vector<double> &output) {
  const auto *field_data = fields.get_field(m_source_field);
  if (!field_data || field_data->empty()) {
    output.clear();
    return;
  }

  int ncols = fields.get_ncols();
  output.resize(ncols);

  // Check if source is 3D (stacked slices) or 2D
  int total_size = static_cast<int>(field_data->size());
  int detected_nlevs = total_size / ncols;

  if (detected_nlevs <= 1 || m_level_idx >= detected_nlevs) {
    // 2D field or invalid level - just copy the field
    for (int col = 0; col < ncols && col < total_size; ++col) {
      output[col] = (*field_data)[col];
    }
    return;
  }

  // Extract slice: assuming [nlevs, ncols] layout
  for (int col = 0; col < ncols; ++col) {
    int idx = m_level_idx * ncols + col;
    output[col] = (*field_data)[idx];
  }
}

} // namespace emulator