File emulator_atm_interface.cpp
File List > components > emulator_comps > eatm > src > emulator_atm_interface.cpp
Go to the documentation of this file
#include "../../common/src/emulator_comp.hpp"
#include "../../common/src/emulator_context.hpp"
#include "emulator_atm.hpp"
namespace {
emulator::EmulatorAtm &get_atm_emulator_nonconst() {
auto &ctx = emulator::EmulatorContext::singleton();
return ctx.getNonConst<emulator::EmulatorAtm>();
}
const emulator::EmulatorAtm &get_atm_emulator() {
const auto &ctx = emulator::EmulatorContext::singleton();
return ctx.get<emulator::EmulatorAtm>();
}
} // anonymous namespace
extern "C" {
// ===========================================================================
// Atmosphere Emulator C Interface (callable from Fortran)
// ===========================================================================
void emulator_atm_create_instance(const MPI_Fint f_comm, const int comp_id,
const char *input_file, const char *log_file,
const int run_type, const int start_ymd,
const int start_tod) {
MPI_Comm c_comm = MPI_Comm_f2c(f_comm);
auto &ctx = emulator::EmulatorContext::singleton();
auto &atm = ctx.create<emulator::EmulatorAtm>();
atm.create_instance(c_comm, comp_id, input_file, run_type, start_ymd,
start_tod);
atm.set_log_file(log_file ? log_file : "");
}
void emulator_atm_set_grid_data(const int nx, const int ny,
const int num_local_cols,
const int num_global_cols, const int *col_gids,
const double *lat, const double *lon,
const double *area) {
auto &atm = get_atm_emulator_nonconst();
atm.set_grid_data(nx, ny, num_local_cols, num_global_cols, col_gids, lat, lon,
area);
}
void emulator_atm_init_coupling_indices(const char *export_fields,
const char *import_fields) {
auto &atm = get_atm_emulator_nonconst();
std::string exp_str = export_fields ? export_fields : "";
std::string imp_str = import_fields ? import_fields : "";
atm.init_coupling_indices(exp_str, imp_str);
}
void emulator_atm_setup_coupling(double *import_data, double *export_data,
const int num_imports, const int num_exports,
const int field_size) {
auto &atm = get_atm_emulator_nonconst();
atm.setup_coupling(import_data, export_data, num_imports, num_exports,
field_size);
}
void emulator_atm_init() {
auto &atm = get_atm_emulator_nonconst();
atm.initialize();
}
void emulator_atm_run(const int dt) {
auto &atm = get_atm_emulator_nonconst();
atm.run(dt);
}
void emulator_atm_finalize() {
auto &atm = get_atm_emulator_nonconst();
atm.finalize();
emulator::cleanup_emulator_context();
}
int emulator_atm_get_num_local_cols() {
const auto &atm = get_atm_emulator();
return atm.get_num_local_cols();
}
int emulator_atm_get_num_global_cols() {
const auto &atm = get_atm_emulator();
return atm.get_num_global_cols();
}
int emulator_atm_get_nx() {
const auto &atm = get_atm_emulator();
return atm.get_nx();
}
int emulator_atm_get_ny() {
const auto &atm = get_atm_emulator();
return atm.get_ny();
}
void emulator_atm_get_local_cols_gids(int *gids) {
const auto &atm = get_atm_emulator();
atm.get_local_col_gids(gids);
}
void emulator_atm_get_cols_latlon(double *lat, double *lon) {
const auto &atm = get_atm_emulator();
atm.get_cols_latlon(lat, lon);
}
void emulator_atm_get_cols_area(double *area) {
const auto &atm = get_atm_emulator();
atm.get_cols_area(area);
}
} // extern "C"