#include <stdlib.h>
#include <stdio.h>
#include "cxx-sfx-model-compute-flux.h"
#include "sfx-esm.h"
#include "sfx-sheba.h"
#include <vector>

// -------------------------------------------------------------------------- //
void esm_compute_flux (sfxDataVecTypeC* sfx,
                           meteoDataVecTypeC* meteo,
                           const sfx_esm_param_C* model_param, 
                           const sfx_surface_param* surface_param,
                           const sfx_esm_numericsType_C* numerics,
                           const sfx_phys_constants* constants,
                           const int grid_size)
{
#ifdef INCLUDE_CUDA
    static FluxEsm<float, MemType::CPU, MemType::CPU, MemType::GPU> F(sfx, meteo, *model_param, *surface_param, *numerics, *constants, grid_size);
    F.compute_flux();
#else
    static FluxEsm<float, MemType::CPU, MemType::CPU, MemType::CPU> F(sfx, meteo, *model_param, *surface_param, *numerics, *constants, grid_size);
    F.compute_flux();
#endif
}

void sheba_compute_flux (sfxDataVecTypeC* sfx,
                           meteoDataVecTypeC* meteo,
                           const sfx_sheba_param_C* model_param, 
                           const sfx_surface_param* surface_param,
                           const sfx_sheba_numericsType_C* numerics,
                           const sfx_phys_constants* constants,
                           const int grid_size)
{
#ifdef INCLUDE_CUDA
    static FluxSheba<float, MemType::CPU, MemType::CPU, MemType::GPU> F(sfx, meteo, *model_param, *surface_param, *numerics, *constants, grid_size);
    F.compute_flux();
#else
    static FluxSheba<float, MemType::CPU, MemType::CPU, MemType::CPU> F(sfx, meteo, *model_param, *surface_param, *numerics, *constants, grid_size);
    F.compute_flux();
#endif
}