#pragma once #include "sfx_template_parameters.h" #include "../includeC/sfx_data.h" // #include <cstddef> template<typename T, MemType memIn, MemType memOut, MemType RunMem > class FluxEsmBase { protected: struct sfxDataVecTypeC sfx; struct meteoDataVecTypeC meteo; struct sfx_esm_param model_param; struct sfx_surface_param surface_param; struct sfx_esm_numericsTypeC numerics; struct sfx_phys_constants phys_constants; struct sfxDataVecTypeC* res_sfx; int grid_size; bool ifAllocated; size_t allocated_size; public: FluxEsmBase() = default; FluxEsmBase(struct sfxDataVecTypeC* sfx, struct meteoDataVecTypeC* meteo, const struct sfx_esm_param model_param, const struct sfx_surface_param surface_param, const struct sfx_esm_numericsTypeC numerics, const struct sfx_phys_constants phys_constants, const int grid_size); ~FluxEsmBase(); }; template<typename T, MemType memIn, MemType memOut, MemType RunMem > class FluxEsm : public FluxEsmBase<T, memIn, memOut, RunMem> {}; template<typename T, MemType memIn, MemType memOut > class FluxEsm<T, memIn, memOut, MemType::CPU> : public FluxEsmBase<T, memIn, memOut, MemType::CPU> { using FluxEsmBase<T, memIn, memOut, MemType::CPU>::res_sfx; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::sfx; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::meteo; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::model_param; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::surface_param; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::numerics; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::phys_constants; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::grid_size; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::ifAllocated; using FluxEsmBase<T, memIn, memOut, MemType::CPU>::allocated_size; public: FluxEsm() = default; FluxEsm(struct sfxDataVecTypeC* sfx, struct meteoDataVecTypeC* meteo, const struct sfx_esm_param model_param, const struct sfx_surface_param surface_param, const struct sfx_esm_numericsTypeC numerics, const struct sfx_phys_constants phys_constants, const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::CPU>(sfx, meteo, model_param, surface_param, numerics, phys_constants, grid_size) {}; ~FluxEsm() = default; void compute_flux(); }; #ifdef INCLUDE_CUDA template<typename T, MemType memIn, MemType memOut > class FluxEsm<T, memIn, memOut, MemType::GPU> : public FluxEsmBase<T, memIn, memOut, MemType::GPU> { using FluxEsmBase<T, memIn, memOut, MemType::GPU>::res_sfx; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::sfx; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::meteo; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::model_param; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::surface_param; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::numerics; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::phys_constants; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::grid_size; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::ifAllocated; using FluxEsmBase<T, memIn, memOut, MemType::GPU>::allocated_size; public: FluxEsm() = default; FluxEsm(struct sfxDataVecTypeC* sfx, struct meteoDataVecTypeC* meteo, const struct sfx_esm_param model_param, const struct sfx_surface_param surface_param, const struct sfx_esm_numericsTypeC numerics, const struct sfx_phys_constants phys_constants, const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::GPU>(sfx, meteo, model_param, surface_param, numerics, phys_constants, grid_size) {}; ~FluxEsm() = default; void compute_flux(); }; #endif