From 092738e1c7bace7706a96b476553c65efbc4bc37 Mon Sep 17 00:00:00 2001 From: Ahmad Nawab Date: Thu, 8 Feb 2024 15:44:01 +0000 Subject: [PATCH 1/4] ecWAM: bug fix for nemo single-precision builds --- src/ecwam/CMakeLists.txt | 10 +++++----- src/ecwam/yowfield_mod.F90 | 35 +++++++++++++---------------------- src/ecwam/yowfield_mod.fypp | 8 ++++---- 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/ecwam/CMakeLists.txt b/src/ecwam/CMakeLists.txt index 598ead592..df00cdb23 100644 --- a/src/ecwam/CMakeLists.txt +++ b/src/ecwam/CMakeLists.txt @@ -356,17 +356,17 @@ list( APPEND ecwam_srcs z0wave.F90 ) -# check for mixed precision build -set(MIXED_PRECISION 0) -if(${HAVE_SINGLE_PRECISION} AND NOT ${PNAME}_OCEANMODEL_HAVE_SINGLE_PRECISION) - set(MIXED_PRECISION 1) +# check for nemo single-precision +set(WAM_NEMO_SINGLE 0) +if( ${PNAME}_OCEANMODEL_HAVE_SINGLE_PRECISION ) + set(WAM_NEMO_SINGLE 1) endif() if( HAVE_GEN_DERIV_TYPES ) list( APPEND ecwam_srcs ${CMAKE_CURRENT_BINARY_DIR}/yowfield_mod.F90) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yowfield_mod.F90 - COMMAND ${FYPP} -m io -m yaml -m os -DMIXED_PRECISION=${MIXED_PRECISION} ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp > yowfield_mod.F90 + COMMAND ${FYPP} -m io -m yaml -m os -DWAM_NEMO_SINGLE=${WAM_NEMO_SINGLE} ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp > yowfield_mod.F90 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp VERBATIM) else() diff --git a/src/ecwam/yowfield_mod.F90 b/src/ecwam/yowfield_mod.F90 index 7cbd368af..864f8f770 100644 --- a/src/ecwam/yowfield_mod.F90 +++ b/src/ecwam/yowfield_mod.F90 @@ -1,16 +1,7 @@ -! (C) Copyright 1989- ECMWF. -! -! This software is licensed under the terms of the Apache Licence Version 2.0 -! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. -! In applying this licence, ECMWF does not waive the privileges and immunities -! granted to it by virtue of its status as an intergovernmental organisation -! nor does it submit to any jurisdiction. -! - MODULE YOWFIELD_MOD USE PARKIND_WAVE, ONLY : JWRB, JWIM, JWRO - USE FIELD_MODULE, ONLY : FIELD_3RB, FIELD_2IM, FIELD_2RB, FIELD_3IM, FIELD_4RB, FIELD_4IM, FIELD_2RD + USE FIELD_MODULE, ONLY : FIELD_3RB, FIELD_2IM, FIELD_2RB, FIELD_3IM, FIELD_4RB, FIELD_4IM, FIELD_2RD, FIELD_2RM USE FIELD_FACTORY_MODULE, ONLY : FIELD_NEW, FIELD_DELETE IMPLICIT NONE @@ -121,17 +112,17 @@ MODULE YOWFIELD_MOD REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOVSTOKES=>NULL() REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOSTRN=>NULL() REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOWSWAVE=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NSWH=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NMWP=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NPHIEPS=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOPHIF=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NTAUOC=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOTAUX=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOTAUY=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOUSTOKES=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOVSTOKES=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOSTRN=>NULL() - CLASS(FIELD_2RD), POINTER :: F_NEMOWSWAVE=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NSWH=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NMWP=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NPHIEPS=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOPHIF=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NTAUOC=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOTAUX=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOTAUY=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOUSTOKES=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOVSTOKES=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOSTRN=>NULL() + CLASS(FIELD_2RM), POINTER :: F_NEMOWSWAVE=>NULL() CONTAINS PROCEDURE :: INIT => WAVE2OCEAN_FIELD_INIT PROCEDURE :: UPDATE_VIEW => WAVE2OCEAN_UPDATE_VIEW @@ -319,7 +310,7 @@ SUBROUTINE ENVIRONMENT_FINAL(SELF) ENDIF END SUBROUTINE ENVIRONMENT_FINAL - SUBROUTINE FORCING_FIELDS_FIELD_INIT(SELF, UWND, VWND, AIRD, WSTAR, CICOVER, CITHICK, LKFR, USTRA, VSTRA, UCUR, VCUR, & + SUBROUTINE FORCING_FIELDS_FIELD_INIT(SELF, UWND, VWND, AIRD, WSTAR, CICOVER, CITHICK, LKFR, USTRA, VSTRA, UCUR, VCUR,& & WSWAVE, WDWAVE, UFRIC, TAUW, TAUWDIR, Z0M, Z0B, CHRNCK, XLON, YLAT) CLASS(FORCING_FIELDS_FIELD), INTENT(INOUT) :: SELF REAL(KIND=JWRB), DIMENSION(:,:), INTENT(IN), OPTIONAL :: UWND diff --git a/src/ecwam/yowfield_mod.fypp b/src/ecwam/yowfield_mod.fypp index bcdb950ec..968c3e79b 100644 --- a/src/ecwam/yowfield_mod.fypp +++ b/src/ecwam/yowfield_mod.fypp @@ -16,7 +16,7 @@ MODULE YOWFIELD_MOD USE PARKIND_WAVE, ONLY : JWRB, JWIM, JWRO - USE FIELD_MODULE, ONLY : FIELD_3RB, FIELD_2IM, FIELD_2RB, FIELD_3IM, FIELD_4RB, FIELD_4IM, FIELD_2RD + USE FIELD_MODULE, ONLY : FIELD_3RB, FIELD_2IM, FIELD_2RB, FIELD_3IM, FIELD_4RB, FIELD_4IM, FIELD_2RD, FIELD_2RM USE FIELD_FACTORY_MODULE, ONLY : FIELD_NEW, FIELD_DELETE IMPLICIT NONE @@ -25,13 +25,13 @@ MODULE YOWFIELD_MOD #:for var, type, dim in objdef[obj] #{if type == 'real'}#REAL(KIND=JWRB)#{elif type == 'ocean'}#REAL(KIND=JWRO)#{else}#INTEGER(KIND=JWIM)#{endif}#, DIMENSION(${','.join(':' for _ in range(dim-1))}$), POINTER :: ${var.upper()}$=>NULL() #:endfor -#:if MIXED_PRECISION == 1 +#:if WAM_NEMO_SINGLE == 1 #:for var, type, dim in objdef[obj] - CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{elif type == 'ocean'}#RD#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() + CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{elif type == 'ocean'}#RM#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() #:endfor #:else #:for var, type, dim in objdef[obj] - CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() + CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{elif type == 'ocean'}#RD#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() #:endfor #:endif CONTAINS From 80d256be4517f08dbbe2fa3242280a3e0e9364b2 Mon Sep 17 00:00:00 2001 From: Ahmad Nawab Date: Thu, 8 Feb 2024 18:05:46 +0000 Subject: [PATCH 2/4] ecWAM: restore accidentally removed copyright header --- src/ecwam/yowfield_mod.F90 | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/ecwam/yowfield_mod.F90 b/src/ecwam/yowfield_mod.F90 index 864f8f770..6375c5ab5 100644 --- a/src/ecwam/yowfield_mod.F90 +++ b/src/ecwam/yowfield_mod.F90 @@ -1,3 +1,12 @@ +! (C) Copyright 1989- ECMWF. +! +! This software is licensed under the terms of the Apache Licence Version 2.0 +! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0. +! In applying this licence, ECMWF does not waive the privileges and immunities +! granted to it by virtue of its status as an intergovernmental organisation +! nor does it submit to any jurisdiction. +! + MODULE YOWFIELD_MOD USE PARKIND_WAVE, ONLY : JWRB, JWIM, JWRO From 9b8ea07efe5b4b857d9d68af79906b4db66adbd4 Mon Sep 17 00:00:00 2001 From: Ahmad Nawab Date: Thu, 8 Feb 2024 18:18:21 +0000 Subject: [PATCH 3/4] ecWAM: add ifdef to pre-expanded yowfield_mod.F90 --- src/ecwam/yowfield_mod.F90 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/ecwam/yowfield_mod.F90 b/src/ecwam/yowfield_mod.F90 index 6375c5ab5..f18ce1a71 100644 --- a/src/ecwam/yowfield_mod.F90 +++ b/src/ecwam/yowfield_mod.F90 @@ -121,6 +121,7 @@ MODULE YOWFIELD_MOD REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOVSTOKES=>NULL() REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOSTRN=>NULL() REAL(KIND=JWRO), DIMENSION(:), POINTER :: NEMOWSWAVE=>NULL() +#ifdef PARKIND1_SINGLE_NEMO CLASS(FIELD_2RM), POINTER :: F_NSWH=>NULL() CLASS(FIELD_2RM), POINTER :: F_NMWP=>NULL() CLASS(FIELD_2RM), POINTER :: F_NPHIEPS=>NULL() @@ -132,6 +133,19 @@ MODULE YOWFIELD_MOD CLASS(FIELD_2RM), POINTER :: F_NEMOVSTOKES=>NULL() CLASS(FIELD_2RM), POINTER :: F_NEMOSTRN=>NULL() CLASS(FIELD_2RM), POINTER :: F_NEMOWSWAVE=>NULL() +#else + CLASS(FIELD_2RD), POINTER :: F_NSWH=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NMWP=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NPHIEPS=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOPHIF=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NTAUOC=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOTAUX=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOTAUY=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOUSTOKES=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOVSTOKES=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOSTRN=>NULL() + CLASS(FIELD_2RD), POINTER :: F_NEMOWSWAVE=>NULL() +#endif CONTAINS PROCEDURE :: INIT => WAVE2OCEAN_FIELD_INIT PROCEDURE :: UPDATE_VIEW => WAVE2OCEAN_UPDATE_VIEW From 07cc270ddae4047bc49746134ebde12d518806e9 Mon Sep 17 00:00:00 2001 From: Ahmad Nawab Date: Tue, 27 Feb 2024 15:58:23 +0000 Subject: [PATCH 4/4] Harmonise preproc flags related to NEMO prec --- src/ecwam/CMakeLists.txt | 8 +------- src/ecwam/yowfield_mod.fypp | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/ecwam/CMakeLists.txt b/src/ecwam/CMakeLists.txt index df00cdb23..9f2ce99e3 100644 --- a/src/ecwam/CMakeLists.txt +++ b/src/ecwam/CMakeLists.txt @@ -356,17 +356,11 @@ list( APPEND ecwam_srcs z0wave.F90 ) -# check for nemo single-precision -set(WAM_NEMO_SINGLE 0) -if( ${PNAME}_OCEANMODEL_HAVE_SINGLE_PRECISION ) - set(WAM_NEMO_SINGLE 1) -endif() - if( HAVE_GEN_DERIV_TYPES ) list( APPEND ecwam_srcs ${CMAKE_CURRENT_BINARY_DIR}/yowfield_mod.F90) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/yowfield_mod.F90 - COMMAND ${FYPP} -m io -m yaml -m os -DWAM_NEMO_SINGLE=${WAM_NEMO_SINGLE} ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp > yowfield_mod.F90 + COMMAND ${FYPP} -m io -m yaml -m os ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp > yowfield_mod.F90 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/yowfield_mod.fypp VERBATIM) else() diff --git a/src/ecwam/yowfield_mod.fypp b/src/ecwam/yowfield_mod.fypp index 968c3e79b..d12e70e7b 100644 --- a/src/ecwam/yowfield_mod.fypp +++ b/src/ecwam/yowfield_mod.fypp @@ -25,15 +25,15 @@ MODULE YOWFIELD_MOD #:for var, type, dim in objdef[obj] #{if type == 'real'}#REAL(KIND=JWRB)#{elif type == 'ocean'}#REAL(KIND=JWRO)#{else}#INTEGER(KIND=JWIM)#{endif}#, DIMENSION(${','.join(':' for _ in range(dim-1))}$), POINTER :: ${var.upper()}$=>NULL() #:endfor -#:if WAM_NEMO_SINGLE == 1 +#ifdef PARKIND1_SINGLE_NEMO #:for var, type, dim in objdef[obj] CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{elif type == 'ocean'}#RM#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() #:endfor -#:else +#else #:for var, type, dim in objdef[obj] CLASS(FIELD_${dim}$#{if type == 'int'}#IM#{elif type == 'ocean'}#RD#{else}#RB#{endif}#), POINTER :: F_${var.upper()}$=>NULL() #:endfor -#:endif +#endif CONTAINS PROCEDURE :: INIT => ${obj.upper()}$_FIELD_INIT PROCEDURE :: UPDATE_VIEW => ${obj.upper()}$_UPDATE_VIEW