#pragma once #include "sfx-template-parameters.h" #include "model-base.h" #include "sfx-data.h" template<typename T, MemType memIn, MemType memOut, MemType RunMem > class FluxEsm : public ModelBase<T, memIn, memOut, RunMem> {}; template<typename T, MemType memIn, MemType memOut > class FluxEsm<T, memIn, memOut, MemType::CPU> : public ModelBase<T, memIn, memOut, MemType::CPU> { using ModelBase<T, memIn, memOut, MemType::CPU>::res_sfx; using ModelBase<T, memIn, memOut, MemType::CPU>::sfx; using ModelBase<T, memIn, memOut, MemType::CPU>::meteo; using ModelBase<T, memIn, memOut, MemType::CPU>::grid_size; using ModelBase<T, memIn, memOut, MemType::CPU>::ifAllocated; using ModelBase<T, memIn, memOut, MemType::CPU>::allocated_size; public: FluxEsm(sfxDataVecTypeC* sfx, meteoDataVecTypeC* meteo, const int grid_size) : ModelBase<T, memIn, memOut, MemType::CPU>(sfx, meteo, grid_size) {} ~FluxEsm() = default; void compute_flux(const sfx_esm_param_C model, const sfx_surface_param surface, const sfx_esm_numericsType_C numerics, const sfx_phys_constants phys); }; #ifdef INCLUDE_CUDA template<typename T, MemType memIn, MemType memOut > class FluxEsm<T, memIn, memOut, MemType::GPU> : public ModelBase<T, memIn, memOut, MemType::GPU> { using ModelBase<T, memIn, memOut, MemType::GPU>::res_sfx; using ModelBase<T, memIn, memOut, MemType::GPU>::sfx; using ModelBase<T, memIn, memOut, MemType::GPU>::meteo; using ModelBase<T, memIn, memOut, MemType::GPU>::grid_size; using ModelBase<T, memIn, memOut, MemType::GPU>::ifAllocated; using ModelBase<T, memIn, memOut, MemType::GPU>::allocated_size; public: FluxEsm(sfxDataVecTypeC* sfx, meteoDataVecTypeC* meteo, const int grid_size) : ModelBase<T, memIn, memOut, MemType::GPU>(sfx, meteo, grid_size) {} ~FluxEsm() = default; void compute_flux(const sfx_esm_param_C model, const sfx_surface_param surface, const sfx_esm_numericsType_C numerics, const sfx_phys_constants phys); }; #endif