diff --git a/includeCXX/sfx-esm.h b/includeCXX/sfx-esm.h index 546db2482c85578c1cf15b816811d2996b106bb2..e02d115dcb4743b0590f6c9d05e7367b6cf15154 100644 --- a/includeCXX/sfx-esm.h +++ b/includeCXX/sfx-esm.h @@ -4,85 +4,47 @@ #include "sfx-data.h" template<typename T, MemType memIn, MemType memOut, MemType RunMem > -class FluxEsmBase : public ModelBase<T, memIn, memOut, RunMem> -{ -public: - using ModelBase<T, memIn, memOut, RunMem>::res_sfx; - using ModelBase<T, memIn, memOut, RunMem>::sfx; - using ModelBase<T, memIn, memOut, RunMem>::meteo; - using ModelBase<T, memIn, memOut, RunMem>::grid_size; - using ModelBase<T, memIn, memOut, RunMem>::ifAllocated; - using ModelBase<T, memIn, memOut, RunMem>::allocated_size; - - sfx_surface_param surface; - sfx_phys_constants phys; - sfx_esm_param_C model; - sfx_esm_numericsType_C numerics; - - FluxEsmBase(sfxDataVecTypeC* sfx, - meteoDataVecTypeC* meteo, - const sfx_esm_param_C model, - const sfx_surface_param surface, - const sfx_esm_numericsType_C numerics, - const sfx_phys_constants phys, - const int grid_size); - ~FluxEsmBase(); -}; - -template<typename T, MemType memIn, MemType memOut, MemType RunMem > -class FluxEsm : public FluxEsmBase<T, memIn, memOut, RunMem> +class FluxEsm : public ModelBase<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> +class FluxEsm<T, memIn, memOut, MemType::CPU> : public ModelBase<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>::surface; - using FluxEsmBase<T, memIn, memOut, MemType::CPU>::phys; - 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; - using FluxEsmBase<T, memIn, memOut, MemType::CPU>::model; - using FluxEsmBase<T, memIn, memOut, MemType::CPU>::numerics; + 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 sfx_esm_param_C model, + 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, - const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::CPU>(sfx, meteo, model, - surface, numerics, phys, grid_size) {} - ~FluxEsm() = default; - void compute_flux(); + const sfx_phys_constants phys); }; #ifdef INCLUDE_CUDA template<typename T, MemType memIn, MemType memOut > -class FluxEsm<T, memIn, memOut, MemType::GPU> : public FluxEsmBase<T, memIn, memOut, MemType::GPU> +class FluxEsm<T, memIn, memOut, MemType::GPU> : public ModelBase<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>::surface; - using FluxEsmBase<T, memIn, memOut, MemType::GPU>::phys; - 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; - using FluxEsmBase<T, memIn, memOut, MemType::GPU>::model; - using FluxEsmBase<T, memIn, memOut, MemType::GPU>::numerics; + 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 sfx_esm_param_C model, + 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, - const int grid_size) : FluxEsmBase<T, memIn, memOut, MemType::GPU>(sfx, meteo, model, - surface, numerics, phys, grid_size) {} - ~FluxEsm() = default; - void compute_flux(); + const sfx_phys_constants phys); }; #endif \ No newline at end of file diff --git a/srcCU/sfx-esm.cu b/srcCU/sfx-esm.cu index 67444d72161a309265d4b70062d99f369e301ecd..1653f483f89682b9ee6db58a30ba6694e88bf854 100644 --- a/srcCU/sfx-esm.cu +++ b/srcCU/sfx-esm.cu @@ -119,7 +119,10 @@ __global__ void sfx_kernel::compute_flux(sfxDataVecTypeC sfx, } template<typename T, MemType memIn, MemType memOut > -void FluxEsm<T, memIn, memOut, MemType::GPU>::compute_flux() +void FluxEsm<T, memIn, memOut, MemType::GPU>::compute_flux(const sfx_esm_param_C model, + const sfx_surface_param surface, + const sfx_esm_numericsType_C numerics, + const sfx_phys_constants phys) { const int BlockCount = int(ceil(float(grid_size) / 1024.0)); dim3 cuBlock = dim3(1024, 1, 1); @@ -145,14 +148,6 @@ void FluxEsm<T, memIn, memOut, MemType::GPU>::compute_flux() } } -template class FluxEsmBase<float, MemType::GPU, MemType::GPU, MemType::GPU>; -template class FluxEsmBase<float, MemType::GPU, MemType::GPU, MemType::CPU>; -template class FluxEsmBase<float, MemType::GPU, MemType::CPU, MemType::GPU>; -template class FluxEsmBase<float, MemType::CPU, MemType::GPU, MemType::GPU>; -template class FluxEsmBase<float, MemType::CPU, MemType::CPU, MemType::GPU>; -template class FluxEsmBase<float, MemType::CPU, MemType::GPU, MemType::CPU>; -template class FluxEsmBase<float, MemType::GPU, MemType::CPU, MemType::CPU>; - template class FluxEsm<float, MemType::GPU, MemType::GPU, MemType::GPU>; template class FluxEsm<float, MemType::GPU, MemType::GPU, MemType::CPU>; template class FluxEsm<float, MemType::GPU, MemType::CPU, MemType::GPU>; diff --git a/srcCXX/cxx-sfx-model-compute-flux.cpp b/srcCXX/cxx-sfx-model-compute-flux.cpp index 40873cd31661d001f858b14603d8387810523231..9b4cf92e326a3d17511f62c06c1b43d6287c2b2b 100644 --- a/srcCXX/cxx-sfx-model-compute-flux.cpp +++ b/srcCXX/cxx-sfx-model-compute-flux.cpp @@ -15,11 +15,11 @@ void esm_compute_flux (sfxDataVecTypeC* sfx, 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(); + static FluxEsm<float, MemType::CPU, MemType::CPU, MemType::GPU> F(sfx, meteo, grid_size); + F.compute_flux(*model_param, *surface_param, *numerics, *constants); #else - static FluxEsm<float, MemType::CPU, MemType::CPU, MemType::CPU> F(sfx, meteo, *model_param, *surface_param, *numerics, *constants, grid_size); - F.compute_flux(); + static FluxEsm<float, MemType::CPU, MemType::CPU, MemType::CPU> F(sfx, meteo, grid_size); + F.compute_flux(*model_param, *surface_param, *numerics, *constants); #endif } diff --git a/srcCXX/sfx-esm.cpp b/srcCXX/sfx-esm.cpp index 5635c05a80a2e6f6bedcabe3114ed64637141904..4da197ad50c721418d8c5cdcd829f1be591be547 100644 --- a/srcCXX/sfx-esm.cpp +++ b/srcCXX/sfx-esm.cpp @@ -10,26 +10,11 @@ #include "sfx-surface.cuh" #include "sfx-model-compute-subfunc.cuh" -template<typename T, MemType memIn, MemType memOut, MemType RunMem > -FluxEsmBase<T, memIn, memOut, RunMem>::FluxEsmBase(sfxDataVecTypeC* sfx_in, - meteoDataVecTypeC* meteo_in, - const sfx_esm_param_C model_param_in, - const sfx_surface_param surface_param_in, - const sfx_esm_numericsType_C numerics_in, - const sfx_phys_constants phys_constants_in, - const int grid_size_in) : ModelBase<T, memIn, memOut, RunMem>(sfx_in, meteo_in, grid_size_in) -{ - surface = surface_param_in; - phys = phys_constants_in; - model = model_param_in; - numerics = numerics_in; -} - -template<typename T, MemType memIn, MemType memOut, MemType RunMem > -FluxEsmBase<T, memIn, memOut, RunMem>::~FluxEsmBase() {} - template<typename T, MemType memIn, MemType memOut > -void FluxEsm<T, memIn, memOut, MemType::CPU>::compute_flux() +void FluxEsm<T, memIn, memOut, MemType::CPU>::compute_flux(const sfx_esm_param_C model, + const sfx_surface_param surface, + const sfx_esm_numericsType_C numerics, + const sfx_phys_constants phys) { T h, U, dT, Tsemi, dQ, z0_m; T Re, z0_t, B, h0_m, h0_t, u_dyn0, zeta, Rib, zeta_conv_lim, Rib_conv_lim, f_m_conv_lim, f_h_conv_lim, psi_m, psi_h, phi_m, phi_h, Km, Pr_t_inv, Cm, Ct; @@ -138,17 +123,8 @@ void FluxEsm<T, memIn, memOut, MemType::CPU>::compute_flux() } template class FluxEsm<float, MemType::CPU, MemType::CPU, MemType::CPU>; -template class FluxEsmBase<float, MemType::CPU, MemType::CPU, MemType::CPU>; #ifdef INCLUDE_CUDA - template class FluxEsmBase<float, MemType::GPU, MemType::GPU, MemType::GPU>; - template class FluxEsmBase<float, MemType::GPU, MemType::GPU, MemType::CPU>; - template class FluxEsmBase<float, MemType::GPU, MemType::CPU, MemType::GPU>; - template class FluxEsmBase<float, MemType::CPU, MemType::GPU, MemType::GPU>; - template class FluxEsmBase<float, MemType::CPU, MemType::CPU, MemType::GPU>; - template class FluxEsmBase<float, MemType::CPU, MemType::GPU, MemType::CPU>; - template class FluxEsmBase<float, MemType::GPU, MemType::CPU, MemType::CPU>; - template class FluxEsm<float, MemType::GPU, MemType::GPU, MemType::GPU>; template class FluxEsm<float, MemType::GPU, MemType::GPU, MemType::CPU>; template class FluxEsm<float, MemType::GPU, MemType::CPU, MemType::GPU>;