diff --git a/src/MNH/adv_boundaries.f90 b/src/MNH/adv_boundaries.f90 index 764aa3c30e5cd522e7b63aebcf2a3bcb3052877e..fbbcf5786acf4ccab26b688ff1fe3a9dc6b854ea 100644 --- a/src/MNH/adv_boundaries.f90 +++ b/src/MNH/adv_boundaries.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -168,10 +168,11 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELDI ! !* 0.2 declarations of local variables ! -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IKE ! indice K End in z direction -INTEGER :: IIU, IJU ! Index End in X and Y directions -INTEGER :: IIB,IIE,IJB,IJE ! interior domaine bound +INTEGER :: IKB ! indice K Beginning in z direction +INTEGER :: IKE ! indice K End in z direction +INTEGER :: IIU, IJU ! Index End in X and Y directions +INTEGER :: IIB,IIE,IJB,IJE ! interior domaine bound +LOGICAL :: GNORTH, GSOUTH, GWEST, GEAST ! !------------------------------------------------------------------------------- IF (SIZE(PFIELD)==0) RETURN @@ -188,6 +189,11 @@ IKB = 1 + JPVEXT IKE = SIZE(PFIELD,3) - JPVEXT IIU=SIZE(PFIELD,1) IJU=SIZE(PFIELD,2) + +GWEST = ( HLBCX(1) == 'OPEN' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) == 'OPEN' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) == 'OPEN' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) == 'OPEN' .AND. LNORTH_ll() ) ! ! !$acc kernels @@ -211,16 +217,16 @@ IJU=SIZE(PFIELD,2) !* 3. LATERAL BC FILLING ! --------------------------- ! - IF (HLBCX(1)=='OPEN' .AND. LWEST_ll()) THEN + IF ( GWEST ) THEN PFIELD(:IIB-1,:,:) = PFIELDI(:IIB-1,:,:) END IF - IF (HLBCX(2)=='OPEN' .AND. LEAST_ll()) THEN + IF ( GEAST ) THEN PFIELD(IIE+1:,:,:) = PFIELDI(IIE+1:,:,:) END IF - IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN PFIELD(:,:IJB-1,:) = PFIELDI(:,:IJB-1,:) END IF - IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll()) THEN + IF ( GNORTH ) THEN PFIELD(:,IJE+1:,:) = PFIELDI(:,IJE+1:,:) END IF !$acc end kernels @@ -229,16 +235,16 @@ IJU=SIZE(PFIELD,2) !Not enough? !$acc update self(PFIELD(:,:,IKB-1)) !$acc update self(PFIELD(:,:,IKE+1)) - IF (HLBCX(1)=='OPEN' .AND. LWEST_ll()) THEN + IF ( GWEST ) THEN !$acc update self(PFIELD(1,:,:)) END IF - IF (HLBCX(2)=='OPEN' .AND. LEAST_ll()) THEN + IF ( GEAST ) THEN !$acc update self(PFIELD(IIU,:,:)) END IF - IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN !$acc update self(PFIELD(:,1,:)) END IF - IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll()) THEN + IF ( GNORTH ) THEN !$acc update self(PFIELD(:,IJU,:)) END IF #else @@ -284,11 +290,12 @@ CHARACTER(LEN=1), INTENT(IN) :: HFIELD ! Field type ! !* 0.2 declarations of local variables ! -INTEGER :: IKB ! indice K Beginning in z direction -INTEGER :: IKE ! indice K End in z direction -INTEGER :: IIU, IJU ! Index End in X and Y directions -INTEGER :: IIB,IIE,IJB,IJE ! interior domaine bound -INTEGER :: IFLAG ! Variable to workaround a performance problem with PGI compiler (at least 16.4) +INTEGER :: IKB ! indice K Beginning in z direction +INTEGER :: IKE ! indice K End in z direction +INTEGER :: IIU, IJU ! Index End in X and Y directions +INTEGER :: IIB,IIE,IJB,IJE ! interior domaine bound +INTEGER :: IFLAG ! Variable to workaround a performance problem with PGI compiler (at least 16.4) +LOGICAL :: GNORTH, GSOUTH, GWEST, GEAST ! !------------------------------------------------------------------------------- IF (SIZE(PFIELD)==0) RETURN @@ -305,8 +312,12 @@ IKB = 1 + JPVEXT IKE = SIZE(PFIELD,3) - JPVEXT IIU=SIZE(PFIELD,1) IJU=SIZE(PFIELD,2) -! -! + +GWEST = ( HLBCX(1) == 'OPEN' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) == 'OPEN' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) == 'OPEN' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) == 'OPEN' .AND. LNORTH_ll() ) + SELECT CASE (HFIELD) CASE ('U') IFLAG = 1 @@ -343,20 +354,20 @@ END SELECT !* 3. LATERAL BC FILLING ! --------------------------- ! - IF (HLBCX(1)=='OPEN' .AND. LWEST_ll()) THEN + IF ( GWEST ) THEN PFIELD(:IIB-1,:,:) = PFIELDI(:IIB-1,:,:) IF (IFLAG==1) & !HFIELD=='U' PFIELD(:IIB,:,:) = PFIELDI(:IIB,:,:) END IF - IF (HLBCX(2)=='OPEN' .AND. LEAST_ll()) THEN + IF ( GEAST ) THEN PFIELD(IIE+1:,:,:) = PFIELDI(IIE+1:,:,:) END IF - IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN PFIELD(:,:IJB-1,:) = PFIELDI(:,:IJB-1,:) IF (IFLAG==2) & !HFIELD=='V' PFIELD(:,:IJB,:) = PFIELDI(:,:IJB,:) END IF - IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll()) THEN + IF ( GNORTH ) THEN PFIELD(:,IJE+1,:) = PFIELDI(:,IJE+1,:) END IF ! @@ -370,16 +381,16 @@ END SELECT !add also if hfield =u or v !$acc update self(PFIELD(:,:,IKB-1)) !$acc update self(PFIELD(:,:,IKE+1)) - IF (HLBCX(1)=='OPEN' .AND. LWEST_ll()) THEN + IF ( GWEST ) THEN !$acc update self(PFIELD(1,:,:)) END IF - IF (HLBCX(2)=='OPEN' .AND. LEAST_ll()) THEN + IF ( GEAST ) THEN !$acc update self(PFIELD(IIU,:,:)) END IF - IF (HLBCY(1)=='OPEN' .AND. LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN !$acc update self(PFIELD(:,1,:)) END IF - IF (HLBCY(2)=='OPEN' .AND. LNORTH_ll()) THEN + IF ( GNORTH ) THEN !$acc update self(PFIELD(:,IJU,:)) END IF #else diff --git a/src/MNH/advec_weno_k_2_aux.f90 b/src/MNH/advec_weno_k_2_aux.f90 index bff1ae2d720d538e877154a2cd16dd0068ed5609..7947229dc69db8025abcfb0993551e6e7e58cd79 100644 --- a/src/MNH/advec_weno_k_2_aux.f90 +++ b/src/MNH/advec_weno_k_2_aux.f90 @@ -298,6 +298,8 @@ INTEGER :: IIE,IJE ! End useful area in x,y,z directions INTEGER:: IW,IE,IWF,IEF ! Coordinate of third order diffusion area ! INTEGER:: ILUOUT,IRESP ! for prints +LOGICAL :: GWEST, GEAST +LOGICAL :: GCYCL ! ! intermediate reconstruction fluxes for positive wind case ! @@ -356,6 +358,17 @@ END IF IF ( HLBCX(1) == 'CYCL' ) call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_WENO_K_2_UX', 'OpenACC: CYCL not yet tested' ) #endif +GWEST = LWEST_ll() +GEAST = LEAST_ll() + +IF ( HLBCX(1) == 'CYCL' ) THEN ! X direction LBC type: (1) for left side + GCYCL = .TRUE. +ELSE IF ( ANY( HLBCX(1) == [ 'OPEN','WALL','NEST' ] ) ) THEN + GCYCL = .FALSE. +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'ADVEC_WENO_K_2_UX', 'invalid value (' // HLBCX(1) // ') for HLBCX(1)' ) +END IF + !$acc kernels PR(:,:,:) = 0.0 ! @@ -374,11 +387,11 @@ ZOMN2 = 0.0 ! !------------------------------------------------------------------------------- ! -SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side +CYCL: IF ( GCYCL ) THEN ! !* 1.1 CYCLIC CASE IN THE X DIRECTION: ! -CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) +! In that case one must have HLBCX(1) == HLBCX(2) IW=IIB IE=IIE ! @@ -456,17 +469,17 @@ CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) (ZOMP2/(ZOMP1+ZOMP2) * ZFPOS2 + & (ZOMP1/(ZOMP1+ZOMP2) * ZFPOS1)) * (0.5+SIGN(0.5,PRUCT)) ! +ELSE CYCL ! HLBCX(1) == ('OPEN','WALL','NEST') ! ! OPEN, WALL, NEST CASE IN THE X DIRECTION ! -CASE ('OPEN','WALL','NEST') ! IW=IIB IE=IIE ! ! USE A FIRST ORDER UPSTREAM SCHEME AT THE PHYSICAL BORDER ! - IF(LWEST_ll()) THEN + IF( GWEST ) THEN PR(IW-1,:,:) = PSRC(IW-1,:,:) * (0.5+SIGN(0.5,PRUCT(IW-1,:,:))) + PSRC(IW,:,:) * (0.5-SIGN(0.5,PRUCT(IW-1,:,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -510,7 +523,7 @@ CASE ('OPEN','WALL','NEST') ! ENDIF ! - IF(LEAST_ll()) THEN + IF( GEAST ) THEN PR(IE,:,:) = PSRC(IE,:,:) * (0.5+SIGN(0.5,PRUCT(IE,:,:))) + PSRC(IE+1,:,:) * (0.5-SIGN(0.5,PRUCT(IE,:,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -593,7 +606,7 @@ CASE ('OPEN','WALL','NEST') (ZOMP2(IW:IE-1,:,:)/(ZOMP1(IW:IE-1,:,:)+ZOMP2(IW:IE-1,:,:)) * ZFPOS2(IW:IE-1,:,:) + & (ZOMP1(IW:IE-1,:,:)/(ZOMP1(IW:IE-1,:,:)+ZOMP2(IW:IE-1,:,:)) * ZFPOS1(IW:IE-1,:,:))) * (0.5+SIGN(0.5,PRUCT(IW:IE-1,:,:))) ! -END SELECT +END IF CYCL ! PR = PR * PRUCT !$acc end kernels @@ -680,6 +693,8 @@ INTEGER :: IIE,IJE ! End useful area in x,y,z directions INTEGER:: IW,IE ! Coordinate of third order diffusion area ! INTEGER:: ILUOUT,IRESP ! for prints +LOGICAL :: GWEST, GEAST +LOGICAL :: GCYCL ! ! intermediate reconstruction fluxes for positive wind case ! @@ -739,6 +754,17 @@ END IF IF ( HLBCX(1) == 'CYCL' ) call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_WENO_K_2_MX', 'OpenACC: CYCL not yet tested' ) #endif +GWEST = LWEST_ll() +GEAST = LEAST_ll() + +IF ( HLBCX(1) == 'CYCL' ) THEN ! X direction LBC type: (1) for left side + GCYCL = .TRUE. +ELSE IF ( ANY( HLBCX(1) == [ 'OPEN','WALL','NEST' ] ) ) THEN + GCYCL = .FALSE. +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'ADVEC_WENO_K_2_MX', 'invalid value (' // HLBCX(1) // ') for HLBCX(1)' ) +END IF + !$acc kernels PR(:,:,:) = 0.0 ! @@ -757,11 +783,11 @@ ZOMN2 = 0.0 ! !------------------------------------------------------------------------------ ! -SELECT CASE ( HLBCX(1) ) ! X direction LBC type: (1) for left side +CYCL: IF ( GCYCL ) THEN ! !* 1.1 CYCLIC CASE IN THE X DIRECTION: ! -CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) +! In that case one must have HLBCX(1) == HLBCX(2) IW=IIB IE=IIE ! @@ -840,17 +866,17 @@ CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) (ZOMN2/(ZOMN1+ZOMN2) * ZFNEG2 + & (ZOMN1/(ZOMN1+ZOMN2) * ZFNEG1)) * (0.5-SIGN(0.5,PRUCT )) ! +ELSE CYCL ! HLBCX(1) == ('OPEN','WALL','NEST') ! ! OPEN, WALL, NEST CASE IN THE X DIRECTION ! -CASE ('OPEN','WALL','NEST') ! IW=IIB IE=IIE ! ! USE A FIRST ORDER UPSTREAM SCHEME AT THE PHYSICAL BORDER ! - IF(LWEST_ll()) THEN + IF( GWEST ) THEN PR(IW,:,:) = PSRC(IW-1,:,:) * (0.5+SIGN(0.5,PRUCT(IW,:,:))) + PSRC(IW,:,:) * (0.5-SIGN(0.5,PRUCT(IW,:,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -894,7 +920,7 @@ CASE ('OPEN','WALL','NEST') ! ENDIF ! - IF(LEAST_ll()) THEN + IF( GEAST ) THEN PR(IE+1,:,:) = PSRC(IE,:,:) * (0.5+SIGN(0.5,PRUCT(IE+1,:,:))) + PSRC(IE+1,:,:) * (0.5-SIGN(0.5,PRUCT(IE+1,:,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -977,7 +1003,7 @@ CASE ('OPEN','WALL','NEST') (ZOMN2(IW+1:IE,:,:)/(ZOMN1(IW+1:IE,:,:)+ZOMN2(IW+1:IE,:,:)) * ZFNEG2(IW+1:IE,:,:) + & (ZOMN1(IW+1:IE,:,:)/(ZOMN1(IW+1:IE,:,:)+ZOMN2(IW+1:IE,:,:)) * ZFNEG1(IW+1:IE,:,:))) * (0.5-SIGN(0.5,PRUCT(IW+1:IE,:,:))) ! -END SELECT +END IF CYCL ! PR = PR * PRUCT !$acc end kernels @@ -1065,6 +1091,8 @@ INTEGER :: IIE,IJE ! End useful area in x,y,z directions INTEGER:: IS,IN ! Coordinate of third order diffusion area ! INTEGER:: ILUOUT,IRESP ! for prints +LOGICAL :: GNORTH, GSOUTH +LOGICAL :: GCYCL ! ! intermediate reconstruction fluxes for positive wind case ! @@ -1124,6 +1152,17 @@ END IF IF ( HLBCY(1) == 'CYCL' ) call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_WENO_K_2_MY', 'OpenACC: CYCL not yet tested' ) #endif +GNORTH = LNORTH_ll() +GSOUTH = LSOUTH_ll() + +IF ( HLBCY(1) == 'CYCL' ) THEN ! Y direction LBC type: (1) for left side + GCYCL = .TRUE. +ELSE IF ( ANY( HLBCY(1) == [ 'OPEN','WALL','NEST' ] ) ) THEN + GCYCL = .FALSE. +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'ADVEC_WENO_K_2_MY', 'invalid value (' // HLBCY(1) // ') for HLBCY(1)' ) +END IF + !$acc kernels PR(:,:,:) = 0.0 ! @@ -1142,11 +1181,11 @@ ZOMN2 = 0.0 ! !------------------------------------------------------------------------------- ! -SELECT CASE ( HLBCY(1) ) ! +CYCL: IF ( GCYCL ) THEN ! !* 1.1 CYCLIC CASE IN THE Y DIRECTION: ! -CASE ('CYCL') ! In that case one must have HLBCY(1) == HLBCY(2) +! In that case one must have HLBCY(1) == HLBCY(2) IS=IJB IN=IJE ! @@ -1223,17 +1262,17 @@ CASE ('CYCL') ! In that case one must have HLBCY(1) == HLBCY(2) (ZOMN2/(ZOMN1+ZOMN2) * ZFNEG2 + & (ZOMN1/(ZOMN1+ZOMN2) * ZFNEG1)) * (0.5-SIGN(0.5,PRVCT)) ! +ELSE CYCL ! HLBCY(1) == ('OPEN','WALL','NEST') ! ! OPEN, WALL, NEST CASE IN THE Y DIRECTION ! -CASE ('OPEN','WALL','NEST') ! IS=IJB IN=IJE ! ! USE A FIRST ORDER UPSTREAM SCHEME AT THE PHYSICAL BORDER ! - IF(LSOUTH_ll()) THEN + IF( GSOUTH ) THEN PR(:,IS,:) = PSRC(:,IS-1,:) * (0.5+SIGN(0.5,PRVCT(:,IS,:))) + PSRC(:,IS,:) * (0.5-SIGN(0.5,PRVCT(:,IS,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -1277,7 +1316,7 @@ CASE ('OPEN','WALL','NEST') ! ENDIF ! - IF(LNORTH_ll()) THEN + IF( GNORTH ) THEN PR(:,IN+1,:) = PSRC(:,IN,:) * (0.5+SIGN(0.5,PRVCT(:,IN+1,:))) + PSRC(:,IN+1,:) * (0.5-SIGN(0.5,PRVCT(:,IN+1,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -1360,7 +1399,7 @@ CASE ('OPEN','WALL','NEST') (ZOMN2(:,IS+1:IN,:)/(ZOMN1(:,IS+1:IN,:)+ZOMN2(:,IS+1:IN,:)) * ZFNEG2(:,IS+1:IN,:) + & (ZOMN1(:,IS+1:IN,:)/(ZOMN1(:,IS+1:IN,:)+ZOMN2(:,IS+1:IN,:)) * ZFNEG1(:,IS+1:IN,:))) * (0.5-SIGN(0.5,PRVCT(:,IS+1:IN,:))) ! -END SELECT +END IF CYCL ! PR = PR * PRVCT !$acc end kernels @@ -1444,6 +1483,8 @@ INTEGER :: IIE,IJE ! End useful area in x,y,z directions INTEGER:: IS,IN ! Coordinate of third order diffusion area ! INTEGER:: ILUOUT,IRESP ! for prints +LOGICAL :: GNORTH, GSOUTH +LOGICAL :: GCYCL ! ! intermediate reconstruction fluxes for positive wind case ! @@ -1503,6 +1544,17 @@ END IF IF ( HLBCY(1) == 'CYCL' ) call Print_msg( NVERB_WARNING, 'GEN', 'ADVEC_WENO_K_2_VY', 'OpenACC: CYCL not yet tested' ) #endif +GNORTH = LNORTH_ll() +GSOUTH = LSOUTH_ll() + +IF ( HLBCY(1) == 'CYCL' ) THEN ! Y direction LBC type: (1) for left side + GCYCL = .TRUE. +ELSE IF ( ANY( HLBCY(1) == [ 'OPEN','WALL','NEST' ] ) ) THEN + GCYCL = .FALSE. +ELSE + call Print_msg( NVERB_FATAL, 'GEN', 'ADVEC_WENO_K_2_VY', 'invalid value (' // HLBCY(1) // ') for HLBCY(1)' ) +END IF + !$acc kernels PR(:,:,:) = 0.0 ! @@ -1521,11 +1573,11 @@ ZOMN2 = 0.0 ! !------------------------------------------------------------------------------- ! -SELECT CASE ( HLBCY(1) ) ! Y direction LBC type: (1) for left side +CYCL: IF ( GCYCL ) THEN ! !* 1.1 CYCLIC CASE IN THE Y DIRECTION: ! -CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) +! In that case one must have HLBCX(1) == HLBCX(2) IS=IJB IN=IJE ! @@ -1599,17 +1651,17 @@ CASE ('CYCL') ! In that case one must have HLBCX(1) == HLBCX(2) (ZOMN2/(ZOMN1+ZOMN2) * ZFNEG2 + & (ZOMN1/(ZOMN1+ZOMN2) * ZFNEG1)) * (0.5-SIGN(0.5,PRVCT)) ! +ELSE CYCL ! HLBCY(1) == ('OPEN','WALL','NEST') ! ! OPEN, WALL, NEST CASE IN THE Y DIRECTION ! -CASE ('OPEN','WALL','NEST') ! IS=IJB IN=IJE ! ! USE A FIRST ORDER UPSTREAM SCHEME AT THE PHYSICAL BORDER ! - IF(LSOUTH_ll()) THEN + IF( GSOUTH ) THEN PR(:,IS-1,:) = PSRC(:,IS-1,:) * (0.5+SIGN(0.5,PRVCT(:,IS-1,:))) + PSRC(:,IS,:) * (0.5-SIGN(0.5,PRVCT(:,IS-1,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -1653,7 +1705,7 @@ CASE ('OPEN','WALL','NEST') ! ENDIF ! - IF(LNORTH_ll()) THEN + IF( GNORTH ) THEN PR(:,IN,:) = PSRC(:,IN,:) * (0.5+SIGN(0.5,PRVCT(:,IN,:))) + PSRC(:,IN+1,:) * (0.5-SIGN(0.5,PRVCT(:,IN,:))) ! !!$ ELSEIF (NHALO == 1) THEN @@ -1736,7 +1788,7 @@ CASE ('OPEN','WALL','NEST') (ZOMN2(:,IS:IN-1,:)/(ZOMN1(:,IS:IN-1,:)+ZOMN2(:,IS:IN-1,:)) * ZFNEG2(:,IS:IN-1,:) + & (ZOMN1(:,IS:IN-1,:)/(ZOMN1(:,IS:IN-1,:)+ZOMN2(:,IS:IN-1,:)) * ZFNEG1(:,IS:IN-1,:))) * (0.5-SIGN(0.5,PRVCT(:,IS:IN-1,:))) ! -END SELECT +END IF CYCL ! PR = PR * PRVCT !$acc end kernels diff --git a/src/MNH/contrav.f90 b/src/MNH/contrav.f90 index 99cfde5f47679858d6dc242b10ba602478179428..d5bec7557d2c9e929e2c780ebe2b9ea077ac818c 100644 --- a/src/MNH/contrav.f90 +++ b/src/MNH/contrav.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 1994-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -568,7 +568,9 @@ real :: ZTMP1, ZTMP2 ! Intermediate work variable REAL, DIMENSION(:,:), ALLOCATABLE :: ZU_EAST, ZV_NORTH, ZDZX_EAST, ZDZY_NORTH TYPE(LIST_ll), POINTER :: TZFIELD_U, TZFIELD_V, TZFIELD_DZX, TZFIELD_DZY TYPE(HALO2LIST_ll), POINTER :: TZHALO2_U, TZHALO2_V, TZHALO2_DZX, TZHALO2_DZY - +! +LOGICAL :: GWEST,GEAST,GSOUTH,GNORTH +! !$acc data present( PRUT, PRVT, PRWT, PDXX, PDYY, PDZZ, PDZX, PDZY, PRUCT, PRVCT, PRWCT, Z1, Z2 ) IF ( PRESENT(ODATA_ON_DEVICE) ) THEN @@ -597,6 +599,11 @@ IIU= SIZE(PDXX,1) IJU= SIZE(PDXX,2) IKU= SIZE(PDXX,3) ! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) +! CALL GET_INDICE_ll( IIB,IJB,IIE,IJE) ! IKB=1+JPVEXT @@ -714,19 +721,19 @@ IF (KADV_ORDER == 2 ) THEN ELSE IF (KADV_ORDER == 4 ) THEN ! !!$ IF (NHALO == 1) THEN - IF ( LWEST_ll() .AND. HLBCX(1)/='CYCL' ) THEN + IF ( GWEST ) THEN IW=IIB+2 -1 ELSE IW=IIB+1 -1 END IF IE=IIE-1 !!$ ELSE -!!$ IF (LWEST_ll()) THEN +!!$ IF ( GWEST ) THEN !!$ IW=IIB+1 !!$ ELSE !!$ IW=IIB !!$ END IF -!!$ IF (LEAST_ll() .AND. HLBCX(2)/='CYCL' ) THEN +!!$ IF ( GEAST ) THEN !!$ IE=IIE-1 !!$ ELSE !!$ IE=IIE @@ -734,19 +741,19 @@ ELSE IF (KADV_ORDER == 4 ) THEN !!$ END IF ! !!$ IF(NHALO == 1) THEN - IF ( LSOUTH_ll() .AND. HLBCY(1)/='CYCL' ) THEN + IF ( GSOUTH ) THEN IS=IJB+2 -1 ELSE IS=IJB+1 -1 END IF IN=IJE-1 !!$ ELSE -!!$ IF (LSOUTH_ll()) THEN +!!$ IF ( GSOUTH ) THEN !!$ IS=IJB+1 !!$ ELSE !!$ IS=IJB !!$ END IF -!!$ IF (LNORTH_ll() .AND. HLBCY(2)/='CYCL' ) THEN +!!$ IF ( GNORTH ) THEN !!$ IN=IJE-1 !!$ ELSE !!$ IN=IJE @@ -818,24 +825,24 @@ ELSE IF (KADV_ORDER == 4 ) THEN ! !* 3.3 non-CYCLIC CASE IN THE X DIRECTION: 2nd order case ! - IF (HLBCX(1)/='CYCL' .AND. LWEST_ll()) THEN + IF ( GWEST ) THEN Z1(IIB, :, IKB:IKE+1 ) = ( PRUCT(IIB, :, IKB:IKE+1 ) + PRUCT(IIB, :, IKB-1:IKE ) ) * PDZX(IIB, :, IKB:IKE+1 ) * 0.25 & + ( PRUCT(IIB+1, :, IKB:IKE+1 ) + PRUCT(IIB+1, :, IKB-1:IKE ) ) * PDZX(IIB+1, :, IKB:IKE+1 ) * 0.25 END IF ! - IF (HLBCX(2)/='CYCL' .AND. LEAST_ll()) THEN + IF ( GEAST ) THEN Z1(IIE, :, IKB:IKE+1 ) = ( PRUCT(IIE, :, IKB:IKE+1 ) + PRUCT(IIE, :, IKB-1:IKE ) ) * PDZX(IIE, :, IKB:IKE+1 ) * 0.25 & + ( PRUCT(IIE+1, :, IKB:IKE+1 ) + PRUCT(IIE+1, :, IKB-1:IKE ) ) * PDZX(IIE+1, :, IKB:IKE+1 ) * 0.25 END IF ! !* 3.4 non-CYCLIC CASE IN THE Y DIRECTION: 2nd order case ! - IF (HLBCY(1)/='CYCL' .AND. LSOUTH_ll()) THEN + IF ( GSOUTH ) THEN Z2(:, IJB, IKB:IKE+1 ) = ( PRVCT(:, IJB, IKB:IKE+1 ) + PRVCT(:, IJB, IKB-1:IKE ) ) * PDZY(:, IJB, IKB:IKE+1 ) * 0.25 & + ( PRVCT(:, IJB+1, IKB:IKE+1 ) + PRVCT(:, IJB+1, IKB-1:IKE ) ) * PDZY(:, IJB+1, IKB:IKE+1 ) * 0.25 END IF ! - IF (HLBCY(2)/='CYCL' .AND. LNORTH_ll()) THEN + IF ( GNORTH ) THEN Z2(:, IJE, IKB:IKE+1 ) = ( PRVCT(:, IJE, IKB:IKE+1 ) + PRVCT(:, IJE, IKB-1:IKE ) ) * PDZY(:, IJE, IKB:IKE+1 ) * 0.25 & + ( PRVCT(:, IJE+1, IKB:IKE+1 ) + PRVCT(:, IJE+1, IKB-1:IKE ) ) * PDZY(:, IJE+1, IKB:IKE+1 ) * 0.25 END IF diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index d92cf49253ab29e2191c1acdbe1dd46dcb1794bd..9cba44767c60395aa6440284da266bce92d7574b 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -646,10 +646,10 @@ IKU=SIZE(PZZ,3) ! IKL = 1 ! -GWEST = LWEST_ll() -GEAST = LEAST_ll() -GSOUTH = LSOUTH_ll() -GNORTH = LNORTH_ll() +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) ! IF (HCLOUD == 'C2R2' .OR. HCLOUD == 'KHKO') THEN ISVBEG = NSV_C2R2BEG @@ -705,10 +705,10 @@ END DO ! ! complete the physical boundaries to avoid some computations ! -IF(GWEST .AND. HLBCX(1) /= 'CYCL') PRT(:IIB-1,:,:,2:) = 0.0 -IF(GEAST .AND. HLBCX(2) /= 'CYCL') PRT(IIE+1:,:,:,2:) = 0.0 -IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PRT(:,:IJB-1,:,2:) = 0.0 -IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PRT(:,IJE+1:,:,2:) = 0.0 +IF(GWEST ) PRT(:IIB-1,:,:,2:) = 0.0 +IF(GEAST ) PRT(IIE+1:,:,:,2:) = 0.0 +IF(GSOUTH ) PRT(:,:IJB-1,:,2:) = 0.0 +IF(GNORTH ) PRT(:,IJE+1:,:,2:) = 0.0 ! IF (HCLOUD=='C2R2' .OR. HCLOUD=='C3R5' .OR. HCLOUD=='KHKO' .OR. HCLOUD=='LIMA') THEN DO JI=1,JPHEXT @@ -720,10 +720,10 @@ END DO ! ! complete the physical boundaries to avoid some computations ! - IF(GWEST .AND. HLBCX(1) /= 'CYCL') PSVT(:IIB-1, :, :, ISVBEG:ISVEND) = 0.0 - IF(GEAST .AND. HLBCX(2) /= 'CYCL') PSVT(IIE+1:, :, :, ISVBEG:ISVEND) = 0.0 - IF(GSOUTH .AND. HLBCY(1) /= 'CYCL') PSVT(:, :IJB-1, :, ISVBEG:ISVEND) = 0.0 - IF(GNORTH .AND. HLBCY(2) /= 'CYCL') PSVT(:, IJE+1:, :, ISVBEG:ISVEND) = 0.0 + IF(GWEST ) PSVT(:IIB-1, :, :, ISVBEG:ISVEND) = 0.0 + IF(GEAST ) PSVT(IIE+1:, :, :, ISVBEG:ISVEND) = 0.0 + IF(GSOUTH ) PSVT(:, :IJB-1, :, ISVBEG:ISVEND) = 0.0 + IF(GNORTH ) PSVT(:, IJE+1:, :, ISVBEG:ISVEND) = 0.0 ENDIF ! ! complete the vertical boundaries diff --git a/src/MNH/update_lm.f90 b/src/MNH/update_lm.f90 index a94f7c09ad3e473d49dee9bc2d56b818d68a7e2b..2c06c9cc50d03f427aa28d223fbe7177468b8049 100644 --- a/src/MNH/update_lm.f90 +++ b/src/MNH/update_lm.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -86,6 +86,7 @@ INTEGER :: IIE ! last physical index in x direction INTEGER :: IJE ! last physical index in y direction INTEGER :: JI ! loop index ! +LOGICAL :: GNORTH, GSOUTH, GWEST, GEAST TYPE(LIST_ll), POINTER :: TZLM_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine ! @@ -104,6 +105,11 @@ end if CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) NULLIFY(TZLM_ll) ! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) + !------------------------------------------------------------------------------- ! !* 2. UPDATE HALOs : @@ -125,21 +131,21 @@ NULLIFY(TZLM_ll) ! --------------------------------------- ! !$acc kernels -IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN +IF ( GWEST ) THEN PLM (IIB-1,:,:) = PLM (IIB,:,:) PLEPS(IIB-1,:,:) = PLEPS(IIB,:,:) END IF -IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN +IF ( GEAST ) THEN PLM (IIE+1,:,:) = PLM (IIE,:,:) PLEPS(IIE+1,:,:) = PLEPS(IIE,:,:) END IF -IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN +IF ( GSOUTH ) THEN DO JI=1,SIZE(PLM,1) PLM (JI,IJB-1,:) = PLM (JI,IJB,:) PLEPS(JI,IJB-1,:) = PLEPS(JI,IJB,:) END DO END IF -IF ( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN +IF ( GNORTH ) THEN DO JI=1,SIZE(PLM,1) PLM (JI,IJE+1,:) = PLM (JI,IJE,:) PLEPS(JI,IJE+1,:) = PLEPS(JI,IJE,:) diff --git a/src/ZSOLVER/update_lm.f90 b/src/ZSOLVER/update_lm.f90 index 18c03a1443cb785c3186f505ee027b8dc31b00b5..c8908734a4367db28a6f0e4c2bb62eb620e3df67 100644 --- a/src/ZSOLVER/update_lm.f90 +++ b/src/ZSOLVER/update_lm.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2006-2019 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. @@ -90,6 +90,7 @@ INTEGER :: IIE ! last physical index in x direction INTEGER :: IJE ! last physical index in y direction INTEGER :: JI ! loop index ! +LOGICAL :: GNORTH, GSOUTH, GWEST, GEAST TYPE(LIST_ll), POINTER :: TZLM_ll ! list of fields to exchange INTEGER :: IINFO_ll ! return code of parallel routine ! @@ -110,6 +111,11 @@ CALL GET_INDICE_ll (IIB,IJB,IIE,IJE) NULLIFY(TZLM_ll) #endif ! +GWEST = ( HLBCX(1) /= 'CYCL' .AND. LWEST_ll() ) +GEAST = ( HLBCX(2) /= 'CYCL' .AND. LEAST_ll() ) +GSOUTH = ( HLBCY(1) /= 'CYCL' .AND. LSOUTH_ll() ) +GNORTH = ( HLBCY(2) /= 'CYCL' .AND. LNORTH_ll() ) + !------------------------------------------------------------------------------- ! !* 2. UPDATE HALOs : @@ -137,33 +143,33 @@ CALL GET_HALO_DDC( PLEPS, HNAME='UPDATE_LM::PLEPS' ) ! --------------------------------------- ! -IF ( HLBCX(1) /= "CYCL" .AND. LWEST_ll()) THEN +IF ( GWEST ) THEN !$acc kernels async PLM (IIB-1,:,:) = PLM (IIB,:,:) PLEPS(IIB-1,:,:) = PLEPS(IIB,:,:) !$acc end kernels END IF -IF ( HLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN +IF ( GEAST ) THEN !$acc kernels async PLM (IIE+1,:,:) = PLM (IIE,:,:) PLEPS(IIE+1,:,:) = PLEPS(IIE,:,:) !$acc end kernels END IF -IF ( HLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN - !$acc kernels async - DO JI=1,SIZE(PLM,1) - PLM (JI,IJB-1,:) = PLM (JI,IJB,:) - PLEPS(JI,IJB-1,:) = PLEPS(JI,IJB,:) - END DO - !$acc end kernels +IF ( GSOUTH ) THEN + !$acc kernels async + DO JI=1,SIZE(PLM,1) + PLM (JI,IJB-1,:) = PLM (JI,IJB,:) + PLEPS(JI,IJB-1,:) = PLEPS(JI,IJB,:) + END DO + !$acc end kernels END IF -IF ( HLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN - !$acc kernels async - DO JI=1,SIZE(PLM,1) - PLM (JI,IJE+1,:) = PLM (JI,IJE,:) - PLEPS(JI,IJE+1,:) = PLEPS(JI,IJE,:) - END DO - !$acc end kernels +IF ( GNORTH ) THEN + !$acc kernels async + DO JI=1,SIZE(PLM,1) + PLM (JI,IJE+1,:) = PLM (JI,IJE,:) + PLEPS(JI,IJE+1,:) = PLEPS(JI,IJE,:) + END DO + !$acc end kernels END IF !$acc wait