Skip to content

File atm_coupling.cpp

File List > components > emulator_comps > eatm > src > impl > atm_coupling.cpp

Go to the documentation of this file

#include "atm_coupling.hpp"

namespace emulator {
namespace impl {

void AtmCouplingIndices::initialize(CouplingFieldsBase &fields) {
  // Export indices (a2x)
  Sa_z = fields.get_export_index("Sa_z");
  Sa_u = fields.get_export_index("Sa_u");
  Sa_v = fields.get_export_index("Sa_v");
  Sa_tbot = fields.get_export_index("Sa_tbot");
  Sa_ptem = fields.get_export_index("Sa_ptem");
  Sa_shum = fields.get_export_index("Sa_shum");
  Sa_dens = fields.get_export_index("Sa_dens");
  Sa_pbot = fields.get_export_index("Sa_pbot");
  Sa_pslv = fields.get_export_index("Sa_pslv");
  Faxa_lwdn = fields.get_export_index("Faxa_lwdn");
  Faxa_rainc = fields.get_export_index("Faxa_rainc");
  Faxa_rainl = fields.get_export_index("Faxa_rainl");
  Faxa_snowc = fields.get_export_index("Faxa_snowc");
  Faxa_snowl = fields.get_export_index("Faxa_snowl");
  Faxa_swndr = fields.get_export_index("Faxa_swndr");
  Faxa_swvdr = fields.get_export_index("Faxa_swvdr");
  Faxa_swndf = fields.get_export_index("Faxa_swndf");
  Faxa_swvdf = fields.get_export_index("Faxa_swvdf");
  Faxa_swnet = fields.get_export_index("Faxa_swnet");

  // Import indices (x2a)
  Sx_t = fields.get_import_index("Sx_t");
  So_t = fields.get_import_index("So_t");
  Faxx_sen = fields.get_import_index("Faxx_sen");
  Faxx_lat = fields.get_import_index("Faxx_lat");
  Faxx_taux = fields.get_import_index("Faxx_taux");
  Faxx_tauy = fields.get_import_index("Faxx_tauy");
  Faxx_lwup = fields.get_import_index("Faxx_lwup");
  Faxx_evap = fields.get_import_index("Faxx_evap");
  Sx_avsdr = fields.get_import_index("Sx_avsdr");
  Sx_anidr = fields.get_import_index("Sx_anidr");
  Sx_avsdf = fields.get_import_index("Sx_avsdf");
  Sx_anidf = fields.get_import_index("Sx_anidf");
  Sl_snowh = fields.get_import_index("Sl_snowh");
  Si_snowh = fields.get_import_index("Si_snowh");
  Sx_tref = fields.get_import_index("Sx_tref");
  Sx_qref = fields.get_import_index("Sx_qref");
  Sx_u10 = fields.get_import_index("Sx_u10");
  Sf_ifrac = fields.get_import_index("Sf_ifrac");
  Sf_ofrac = fields.get_import_index("Sf_ofrac");
  Sf_lfrac = fields.get_import_index("Sf_lfrac");
}

void import_atm_fields(const double *import_data, int ncols, int nfields,
                       const AtmCouplingIndices &idx, AtmFieldManager &fields) {
  for (int i = 0; i < ncols; ++i) {
    if (idx.Sx_t >= 0)
      fields.ts[i] = import_data[i * nfields + idx.Sx_t];
    if (idx.So_t >= 0)
      fields.sst[i] = import_data[i * nfields + idx.So_t];
    if (idx.Faxx_sen >= 0)
      fields.shf[i] = import_data[i * nfields + idx.Faxx_sen];
    if (idx.Faxx_lat >= 0)
      fields.lhf[i] = import_data[i * nfields + idx.Faxx_lat];
    if (idx.Faxx_taux >= 0)
      fields.wsx[i] = import_data[i * nfields + idx.Faxx_taux];
    if (idx.Faxx_tauy >= 0)
      fields.wsy[i] = import_data[i * nfields + idx.Faxx_tauy];
    if (idx.Faxx_lwup >= 0)
      fields.lwup[i] = import_data[i * nfields + idx.Faxx_lwup];
    if (idx.Sx_avsdr >= 0)
      fields.asdir[i] = import_data[i * nfields + idx.Sx_avsdr];
    if (idx.Sx_anidr >= 0)
      fields.aldir[i] = import_data[i * nfields + idx.Sx_anidr];
    if (idx.Sx_avsdf >= 0)
      fields.asdif[i] = import_data[i * nfields + idx.Sx_avsdf];
    if (idx.Sx_anidf >= 0)
      fields.aldif[i] = import_data[i * nfields + idx.Sx_anidf];
    if (idx.Sl_snowh >= 0)
      fields.snowhland[i] = import_data[i * nfields + idx.Sl_snowh];
    if (idx.Si_snowh >= 0)
      fields.snowhice[i] = import_data[i * nfields + idx.Si_snowh];
    if (idx.Sf_ifrac >= 0)
      fields.icefrac[i] = import_data[i * nfields + idx.Sf_ifrac];
    if (idx.Sf_ofrac >= 0)
      fields.ocnfrac[i] = import_data[i * nfields + idx.Sf_ofrac];
    if (idx.Sf_lfrac >= 0)
      fields.lndfrac[i] = import_data[i * nfields + idx.Sf_lfrac];
  }
}

void export_atm_fields(double *export_data, int ncols, int nfields,
                       const AtmCouplingIndices &idx,
                       const AtmFieldManager &fields) {
  for (int i = 0; i < ncols; ++i) {
    if (idx.Sa_z >= 0)
      export_data[i * nfields + idx.Sa_z] = fields.zbot[i];
    if (idx.Sa_u >= 0)
      export_data[i * nfields + idx.Sa_u] = fields.ubot[i];
    if (idx.Sa_v >= 0)
      export_data[i * nfields + idx.Sa_v] = fields.vbot[i];
    if (idx.Sa_tbot >= 0)
      export_data[i * nfields + idx.Sa_tbot] = fields.tbot[i];
    if (idx.Sa_ptem >= 0)
      export_data[i * nfields + idx.Sa_ptem] = fields.ptem[i];
    if (idx.Sa_shum >= 0)
      export_data[i * nfields + idx.Sa_shum] = fields.shum[i];
    if (idx.Sa_dens >= 0)
      export_data[i * nfields + idx.Sa_dens] = fields.dens[i];
    if (idx.Sa_pbot >= 0)
      export_data[i * nfields + idx.Sa_pbot] = fields.pbot[i];
    if (idx.Sa_pslv >= 0)
      export_data[i * nfields + idx.Sa_pslv] = fields.pslv[i];
    if (idx.Faxa_lwdn >= 0)
      export_data[i * nfields + idx.Faxa_lwdn] = fields.lwdn[i];
    if (idx.Faxa_rainc >= 0)
      export_data[i * nfields + idx.Faxa_rainc] = fields.rainc[i];
    if (idx.Faxa_rainl >= 0)
      export_data[i * nfields + idx.Faxa_rainl] = fields.rainl[i];
    if (idx.Faxa_snowc >= 0)
      export_data[i * nfields + idx.Faxa_snowc] = fields.snowc[i];
    if (idx.Faxa_snowl >= 0)
      export_data[i * nfields + idx.Faxa_snowl] = fields.snowl[i];
    if (idx.Faxa_swndr >= 0)
      export_data[i * nfields + idx.Faxa_swndr] = fields.swndr[i];
    if (idx.Faxa_swvdr >= 0)
      export_data[i * nfields + idx.Faxa_swvdr] = fields.swvdr[i];
    if (idx.Faxa_swndf >= 0)
      export_data[i * nfields + idx.Faxa_swndf] = fields.swndf[i];
    if (idx.Faxa_swvdf >= 0)
      export_data[i * nfields + idx.Faxa_swvdf] = fields.swvdf[i];
    if (idx.Faxa_swnet >= 0)
      export_data[i * nfields + idx.Faxa_swnet] = fields.swnet[i];
  }
}

} // namespace impl
} // namespace emulator