From e428de69707770ef184c7bfead20a2c10508e297 Mon Sep 17 00:00:00 2001 From: Lizzzka007 <gashchuk2011@mail.ru> Date: Mon, 23 Sep 2024 10:14:37 +0300 Subject: [PATCH] Remove pointers --- CMakeLists.txt | 4 ++-- srcF/sfx_data.f90 | 37 ++++++------------------------------- srcF/sfx_esm.f90 | 14 +++++++------- srcF/sfx_sheba.f90 | 11 ++++++----- 4 files changed, 21 insertions(+), 45 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 277b8a6..3af619e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -111,8 +111,8 @@ if(USE_CXX) includeCXX/sfx_sheba.h includeCXX/sfx_call_class_func.h ) - list(APPEND HEADERS_DIRS includeCU/) - list(APPEND HEADERS_DIRS includeCXX/) + list(APPEND HEADERS_DIRS includeCU/) + list(APPEND HEADERS_DIRS includeCXX/) endif(USE_CXX) if(INCLUDE_CUDA) diff --git a/srcF/sfx_data.f90 b/srcF/sfx_data.f90 index 1cdc8eb..e4386ec 100644 --- a/srcF/sfx_data.f90 +++ b/srcF/sfx_data.f90 @@ -40,21 +40,12 @@ module sfx_data !> @brief meteorological input for surface flux calculation !> &details using arrays as input type, public :: meteoDataVecType -#if defined(INCLUDE_CXX) - real, pointer, contiguous :: h(:) !< constant flux layer height [m] - real, pointer, contiguous :: U(:) !< abs(wind speed) at 'h' [m/s] - real, pointer, contiguous :: dT(:) !< difference between potential temperature at 'h' and at surface [K] - real, pointer, contiguous :: Tsemi(:) !< semi-sum of potential temperature at 'h' and at surface [K] - real, pointer, contiguous :: dQ(:) !< difference between humidity at 'h' and at surface [g/g] - real, pointer, contiguous :: z0_m(:) !< surface aerodynamic roughness (should be < 0 for water bodies surface) -#else real, allocatable :: h(:) !< constant flux layer height [m] real, allocatable :: U(:) !< abs(wind speed) at 'h' [m/s] real, allocatable :: dT(:) !< difference between potential temperature at 'h' and at surface [K] real, allocatable :: Tsemi(:) !< semi-sum of potential temperature at 'h' and at surface [K] real, allocatable :: dQ(:) !< difference between humidity at 'h' and at surface [g/g] real, allocatable :: z0_m(:) !< surface aerodynamic roughness (should be < 0 for water bodies surface) -#endif end type #if defined(INCLUDE_CXX) @@ -90,19 +81,7 @@ module sfx_data !> @brief surface flux output data !> &details using arrays as output type, public :: sfxDataVecType -#if defined(INCLUDE_CXX) - real, pointer, contiguous :: zeta(:) !< = z/L [n/d] - real, pointer, contiguous :: Rib(:) !< bulk Richardson number [n/d] - real, pointer, contiguous :: Re(:) !< Reynolds number [n/d] - real, pointer, contiguous :: B(:) !< = log(z0_m / z0_h) [n/d] - real, pointer, contiguous :: z0_m(:) !< aerodynamic roughness [m] - real, pointer, contiguous :: z0_t(:) !< thermal roughness [m] - real, pointer, contiguous :: Rib_conv_lim(:) !< Ri-bulk convection critical value [n/d] - real, pointer, contiguous :: Cm(:) !< transfer coefficient for momentum [n/d] - real, pointer, contiguous :: Ct(:) !< transfer coefficient for heat [n/d] - real, pointer, contiguous :: Km(:) !< eddy viscosity coeff. at h [m^2/s] - real, pointer, contiguous :: Pr_t_inv(:) !< inverse turbulent Prandtl number at h [n/d] -#else + real, allocatable :: zeta(:) !< = z/L [n/d] real, allocatable :: Rib(:) !< bulk Richardson number [n/d] real, allocatable :: Re(:) !< Reynolds number [n/d] @@ -114,7 +93,7 @@ module sfx_data real, allocatable :: Ct(:) !< transfer coefficient for heat [n/d] real, allocatable :: Km(:) !< eddy viscosity coeff. at h [m^2/s] real, allocatable :: Pr_t_inv(:) !< inverse turbulent Prandtl number at h [n/d] -#endif + end type #if defined(INCLUDE_CXX) @@ -222,10 +201,8 @@ contains subroutine set_meteo_vec_c(meteo, meteo_C) !> @brief allocate meteo data vector ! ---------------------------------------------------------------------------- - type (meteoDataVecType) , intent(in) :: meteo - type (meteoDataVecTypeC), pointer, intent(inout) :: meteo_C - - allocate(meteo_C) + type (meteoDataVecType), target :: meteo + type (meteoDataVecTypeC), intent(inout) :: meteo_C meteo_C%h = c_loc(meteo%h) meteo_C%U = c_loc(meteo%U) @@ -281,10 +258,8 @@ contains subroutine set_sfx_vec_c(sfx, sfx_C) !> @brief allocate surface fluxes data vector ! ---------------------------------------------------------------------------- - type (sfxDataVecType), intent(inout) :: sfx - type (sfxDataVecTypeC), pointer, intent(inout) :: sfx_C - - allocate(sfx_C) + type (sfxDataVecType), target :: sfx + type (sfxDataVecTypeC), intent(inout) :: sfx_C sfx_C%zeta = c_loc(sfx%zeta) sfx_C%Rib = c_loc(sfx%Rib) diff --git a/srcF/sfx_esm.f90 b/srcF/sfx_esm.f90 index 6747758..9b63b4f 100644 --- a/srcF/sfx_esm.f90 +++ b/srcF/sfx_esm.f90 @@ -12,7 +12,7 @@ module sfx_esm use sfx_surface use sfx_esm_param #if defined(INCLUDE_CXX) - use iso_c_binding, only: c_loc + use iso_c_binding, only: C_LOC, C_PTR use C_FUNC #endif ! -------------------------------------------------------------------------------- @@ -72,8 +72,9 @@ contains integer i ! ---------------------------------------------------------------------------- #if defined(INCLUDE_CXX) - type (meteoDataVecTypeC), pointer :: meteo_c !< meteorological data (input) - type (sfxDataVecTypeC), pointer :: sfx_c !< surface flux data (output) + type (meteoDataVecTypeC), target :: meteo_c !< meteorological data (input) + type (sfxDataVecTypeC), target :: sfx_c !< surface flux data (output) + type(C_PTR) :: meteo_c_ptr, sfx_c_ptr type (sfx_esm_param) :: model_param type (sfx_surface_param) :: surface_param type (sfx_esm_numericsTypeC) :: numerics_c @@ -90,11 +91,10 @@ contains call set_c_struct_sfx_surface_param_values(surface_param) call set_meteo_vec_c(meteo, meteo_c) call set_sfx_vec_c(sfx, sfx_c) + meteo_c_ptr = C_LOC(meteo_c) + sfx_c_ptr = C_LOC(sfx_c) - call get_surface_fluxes_esm(c_loc(sfx_c), c_loc(meteo_c), model_param, surface_param, numerics_c, phys_constants, n) - - deallocate(meteo_c) - deallocate(sfx_c) + call get_surface_fluxes_esm(sfx_c_ptr, meteo_c_ptr, model_param, surface_param, numerics_c, phys_constants, n) #else do i = 1, n #ifdef SFX_FORCE_DEPRECATED_ESM_CODE diff --git a/srcF/sfx_sheba.f90 b/srcF/sfx_sheba.f90 index ffa5ae3..7fe86c5 100644 --- a/srcF/sfx_sheba.f90 +++ b/srcF/sfx_sheba.f90 @@ -12,8 +12,8 @@ module sfx_sheba use sfx_surface use sfx_sheba_param -#if defined(INCLUDE_CUDA) || defined(INCLUDE_CXX) - use iso_c_binding, only: c_loc +#if defined(INCLUDE_CXX) + use iso_c_binding, only: C_LOC, C_PTR use C_FUNC #endif ! -------------------------------------------------------------------------------- @@ -74,6 +74,7 @@ contains #if defined(INCLUDE_CXX) type (meteoDataVecTypeC), pointer :: meteo_c !< meteorological data (input) type (sfxDataVecTypeC), pointer :: sfx_c !< surface flux data (output) + type(C_PTR) :: meteo_c_ptr, sfx_c_ptr type (sfx_sheba_param) :: model_param type (sfx_surface_param) :: surface_param type (sfx_sheba_numericsTypeC) :: numerics_c @@ -90,10 +91,10 @@ contains call set_meteo_vec_c(meteo, meteo_c) call set_sfx_vec_c(sfx, sfx_c) - call get_surface_fluxes_sheba(c_loc(sfx_c), c_loc(meteo_c), model_param, surface_param, numerics_c, phys_constants, n) + meteo_c_ptr = C_LOC(meteo_c) + sfx_c_ptr = C_LOC(sfx_c) - deallocate(meteo_c) - deallocate(sfx_c) + call get_surface_fluxes_sheba(sfx_c_ptr, meteo_c_ptr, model_param, surface_param, numerics_c, phys_constants, n) #else do i = 1, n meteo_cell = meteoDataType(& -- GitLab