Changeset 9012
- Timestamp:
- 2017-12-13T14:57:33+01:00 (5 years ago)
- Location:
- branches/2017/dev_CNRS_2017/NEMOGCM
- Files:
-
- 1 added
- 1 deleted
- 22 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/NST_SRC/agrif_user.F90
r8882 r9012 28 28 jpiglo = nbcellsx + 2 + 2*nbghostcells 29 29 jpjglo = nbcellsy + 2 + 2*nbghostcells 30 jpi = ( jpiglo-2* jpreci + (jpni-1+0) ) / jpni + 2*jpreci31 jpj = ( jpjglo-2* jprecj + (jpnj-1+0) ) / jpnj + 2*jprecj30 jpi = ( jpiglo-2*nn_hls + (jpni-1+0) ) / jpni + 2*nn_hls 31 jpj = ( jpjglo-2*nn_hls + (jpnj-1+0) ) / jpnj + 2*nn_hls 32 32 ! JC: change to allow for different vertical levels 33 33 ! jpk is already set -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OFF_SRC/nemogcm.F90
r8882 r9012 149 149 !! ** Purpose : initialization of the nemo model in off-line mode 150 150 !!---------------------------------------------------------------------- 151 INTEGER :: ji ! dummy loop indices 152 INTEGER :: ilocal_comm ! local integer 153 INTEGER :: ios, inum 151 INTEGER :: ji ! dummy loop indices 152 INTEGER :: ilocal_comm ! local integer 153 INTEGER :: ios, inum ! local integers 154 INTEGER :: iiarea, ijarea ! local integers 155 INTEGER :: iirest, ijrest ! local integers 154 156 REAL(wp) :: ziglo, zjglo, zkglo, zperio ! local scalars 155 157 CHARACTER(len=120), DIMENSION(30) :: cltxt, cltxt2, clnam … … 197 199 CALL usr_def_nam( cltxt2, clnam, cn_cfg, nn_cfg, jpiglo, jpjglo, jpkglo, jperio ) 198 200 ENDIF 199 jpk = jpkglo200 201 ! 201 202 ! … … 245 246 END IF 246 247 247 ! Calculate domain dimensions given calculated jpni and jpnj 248 ! This used to be done in par_oce.F90 when they were parameters rather 249 ! than variables 250 jpi = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 251 jpj = ( jpjglo-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 248 iiarea = 1 + MOD( narea - 1 , jpni ) 249 ijarea = 1 + ( narea - 1 ) / jpni 250 iirest = 1 + MOD( jpiglo - 2*nn_hls - 1 , jpni ) 251 ijrest = 1 + MOD( jpjglo - 2*nn_hls - 1 , jpnj ) 252 #if defined key_nemocice_decomp 253 jpi = ( nx_global+2-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 254 jpj = ( ny_global+2-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 255 jpimax = jpi 256 jpjmax = jpj 257 IF( iiarea == jpni ) jpi = jpiglo - (jpni - 1) * (jpi - 2*nn_hls) 258 IF( ijarea == jpnj ) jpj = jpjglo - (jpnj - 1) * (jpj - 2*nn_hls) 259 #else 260 jpi = ( jpiglo -2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 261 jpj = ( jpjglo -2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 262 jpimax = jpi 263 jpjmax = jpj 264 IF( iiarea > iirest ) jpi = jpi - 1 265 IF( ijarea > ijrest ) jpj = jpj - 1 266 #endif 267 268 jpk = jpkglo ! third dim 269 252 270 jpim1 = jpi-1 ! inner domain indices 253 271 jpjm1 = jpj-1 ! " " 254 jpkm1 = jpk-1! " "272 jpkm1 = MAX( 1, jpk-1 ) ! " " 255 273 jpij = jpi*jpj ! jpi x j 256 274 … … 285 303 286 304 ! ! Domain decomposition 287 IF( jpni*jpnj == jpnij ) THEN ; CALL mpp_init ! standard cutting out 288 ELSE ; CALL mpp_init2 ! eliminate land processors 289 ENDIF 305 CALL mpp_init 290 306 ! 291 307 IF( ln_timing ) CALL timing_init -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/CRS/crsdom.F90
r7646 r9012 1895 1895 jpjglo_crsm1 = jpjglo_crs - 1 1896 1896 1897 jpi_crs = ( jpiglo_crs - 2 * jpreci + (jpni-1) ) / jpni + 2 * jpreci1898 jpj_crs = ( jpjglo_crsm1 - 2 * jprecj + (jpnj-1) ) / jpnj + 2 * jprecj1897 jpi_crs = ( jpiglo_crs - 2 * nn_hls + (jpni-1) ) / jpni + 2 * nn_hls 1898 jpj_crs = ( jpjglo_crsm1 - 2 * nn_hls + (jpnj-1) ) / jpnj + 2 * nn_hls 1899 1899 1900 1900 IF( noso < 0 ) jpj_crs = jpj_crs + 1 ! add a local band on southern processors … … 1940 1940 CASE ( -1 ) 1941 1941 IF( MOD( jpjglo - njmppt(jn), nn_facty) > 0 ) nlejt_crs(jn) = nlejt_crs(jn) + 1 1942 nlcjt_crs(jn) = nlejt_crs(jn) + jprecj1942 nlcjt_crs(jn) = nlejt_crs(jn) + nn_hls 1943 1943 nldjt_crs(jn) = nldjt(jn) 1944 1944 … … 1947 1947 nldjt_crs(jn) = nldjt(jn) 1948 1948 IF( nldjt(jn) == 1 ) nlejt_crs(jn) = nlejt_crs(jn) + 1 1949 nlejt_crs(jn) = nlejt_crs(jn) + jprecj1950 nlcjt_crs(jn) = nlejt_crs(jn) + jprecj1949 nlejt_crs(jn) = nlejt_crs(jn) + nn_hls 1950 nlcjt_crs(jn) = nlejt_crs(jn) + nn_hls 1951 1951 1952 1952 CASE ( 1, 2 ) 1953 1953 1954 nlejt_crs(jn) = nlejt_crs(jn) + jprecj1954 nlejt_crs(jn) = nlejt_crs(jn) + nn_hls 1955 1955 nlcjt_crs(jn) = nlejt_crs(jn) 1956 1956 nldjt_crs(jn) = nldjt(jn) … … 1990 1990 SELECT CASE( ibonit(jn) ) 1991 1991 CASE ( -1 ) 1992 nleit_crs(jn) = nleit_crs(jn) + jpreci1993 nlcit_crs(jn) = nleit_crs(jn) + jpreci1992 nleit_crs(jn) = nleit_crs(jn) + nn_hls 1993 nlcit_crs(jn) = nleit_crs(jn) + nn_hls 1994 1994 nldit_crs(jn) = nldit(jn) 1995 1995 1996 1996 CASE ( 0 ) 1997 nleit_crs(jn) = nleit_crs(jn) + jpreci1998 nlcit_crs(jn) = nleit_crs(jn) + jpreci1997 nleit_crs(jn) = nleit_crs(jn) + nn_hls 1998 nlcit_crs(jn) = nleit_crs(jn) + nn_hls 1999 1999 nldit_crs(jn) = nldit(jn) 2000 2000 2001 2001 CASE ( 1, 2 ) 2002 2002 IF( MOD( jpiglo - nimppt(jn), nn_factx) > 0 ) nleit_crs(jn) = nleit_crs(jn) + 1 2003 nleit_crs(jn) = nleit_crs(jn) + jpreci2003 nleit_crs(jn) = nleit_crs(jn) + nn_hls 2004 2004 nlcit_crs(jn) = nleit_crs(jn) 2005 2005 nldit_crs(jn) = nldit(jn) -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/CRS/crsdomwri.F90
r6140 r9012 133 133 134 134 tmask_i_crs(:,:) = tmask_crs(:,:,1) 135 iif = jpreci136 iil = nlci_crs - jpreci+ 1137 ijf = jpreci138 ijl = nlcj_crs - jprecj+ 1135 iif = nn_hls 136 iil = nlci_crs - nn_hls + 1 137 ijf = nn_hls 138 ijl = nlcj_crs - nn_hls + 1 139 139 140 140 tmask_i_crs( 1:iif , : ) = 0._wp -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r8882 r9012 90 90 INTEGER, PUBLIC :: noea, nowe !: index of the local neighboring processors in 91 91 INTEGER, PUBLIC :: noso, nono !: east, west, south and north directions 92 INTEGER, PUBLIC :: npne, npnw !: index of north east and north west processor93 INTEGER, PUBLIC :: npse, npsw !: index of south east and south west processor94 INTEGER, PUBLIC :: nbne, nbnw !: logical of north east & north west processor95 INTEGER, PUBLIC :: nbse, nbsw !: logical of south east & south west processor96 92 INTEGER, PUBLIC :: nidom !: ??? 97 93 -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90
r8970 r9012 96 96 WRITE(numout,cform) ' ' ,' jpij : ', jpij 97 97 WRITE(numout,*) ' mpp local domain info (mpp):' 98 WRITE(numout,*) ' jpni : ', jpni, ' jpreci : ', jpreci99 WRITE(numout,*) ' jpnj : ', jpnj, ' jprecj : ', jprecj98 WRITE(numout,*) ' jpni : ', jpni, ' nn_hls : ', nn_hls 99 WRITE(numout,*) ' jpnj : ', jpnj, ' nn_hls : ', nn_hls 100 100 WRITE(numout,*) ' jpnij : ', jpnij 101 101 WRITE(numout,*) ' lateral boundary of the Global domain : jperio = ', jperio -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90
r8882 r9012 211 211 ! -------------------- 212 212 ! 213 iif = jpreci ; iil = nlci - jpreci+ 1214 ijf = jprecj ; ijl = nlcj - jprecj+ 1213 iif = nn_hls ; iil = nlci - nn_hls + 1 214 ijf = nn_hls ; ijl = nlcj - nn_hls + 1 215 215 ! 216 216 ! ! halo mask : 0 on the halo and 1 elsewhere -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/IOM/prtctl.F90
r5025 r9012 441 441 442 442 #if defined key_nemocice_decomp 443 ijpi = ( nx_global+2-2* jpreci + (isplt-1) ) / isplt + 2*jpreci444 ijpj = ( ny_global+2-2* jprecj + (jsplt-1) ) / jsplt + 2*jprecj443 ijpi = ( nx_global+2-2*nn_hls + (isplt-1) ) / isplt + 2*nn_hls 444 ijpj = ( ny_global+2-2*nn_hls + (jsplt-1) ) / jsplt + 2*nn_hls 445 445 #else 446 ijpi = ( jpiglo-2* jpreci + (isplt-1) ) / isplt + 2*jpreci447 ijpj = ( jpjglo-2* jprecj + (jsplt-1) ) / jsplt + 2*jprecj446 ijpi = ( jpiglo-2*nn_hls + (isplt-1) ) / isplt + 2*nn_hls 447 ijpj = ( jpjglo-2*nn_hls + (jsplt-1) ) / jsplt + 2*nn_hls 448 448 #endif 449 449 450 450 451 nrecil = 2 * jpreci452 nrecjl = 2 * jprecj451 nrecil = 2 * nn_hls 452 nrecjl = 2 * nn_hls 453 453 irestil = MOD( jpiglo - nrecil , isplt ) 454 454 irestjl = MOD( jpjglo - nrecjl , jsplt ) … … 563 563 ibonitl(jn) = nbondil 564 564 565 nldil = 1 + jpreci566 nleil = nlcil - jpreci565 nldil = 1 + nn_hls 566 nleil = nlcil - nn_hls 567 567 IF( nbondil == -1 .OR. nbondil == 2 ) nldil = 1 568 568 IF( nbondil == 1 .OR. nbondil == 2 ) nleil = nlcil 569 nldjl = 1 + jprecj570 nlejl = nlcjl - jprecj569 nldjl = 1 + nn_hls 570 nlejl = nlcjl - nn_hls 571 571 IF( nbondjl == -1 .OR. nbondjl == 2 ) nldjl = 1 572 572 IF( nbondjl == 1 .OR. nbondjl == 2 ) nlejl = nlcjl -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lbc_lnk_generic.h90
r8882 r9012 3 3 # define SGN_IN(k) psgn(k) 4 4 # define F_SIZE(ptab) kfld 5 # define OPT_K(k) ,ipf 5 6 # if defined DIM_2d 6 7 # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_2D) , INTENT(inout) :: ptab(f) … … 26 27 # define SGN_IN(k) psgn 27 28 # define F_SIZE(ptab) 1 29 # define OPT_K(k) 28 30 # if defined DIM_2d 29 31 # define ARRAY_IN(i,j,k,l,f) ptab(i,j) … … 100 102 ELSEIF( ll_nfd ) THEN !* north fold 101 103 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:, 1 ,:,:,jf) = zland ! south except F-point 102 CALL lbc_nfd( ptab, NAT_IN(:), SGN_IN(:) ) ! north fold treatment104 CALL lbc_nfd( ptab, NAT_IN(:), SGN_IN(:) OPT_K(:) ) ! north fold treatment 103 105 ELSE !* closed 104 106 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:, 1 ,:,:,jf) = zland ! south except F-point … … 119 121 #undef L_SIZE 120 122 #undef F_SIZE 123 #undef OPT_K -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lbc_nfd_generic.h90
r8882 r9012 44 44 #endif 45 45 46 #if defined MULTI 46 47 SUBROUTINE ROUTINE_NFD( ptab, cd_nat, psgn, kfld ) 48 INTEGER , INTENT(in ) :: kfld ! number of pt3d arrays 49 #else 50 SUBROUTINE ROUTINE_NFD( ptab, cd_nat, psgn ) 51 #endif 47 52 ARRAY_TYPE(:,:,:,:,:) ! array or pointer of arrays on which the boundary condition is applied 48 53 CHARACTER(len=1) , INTENT(in ) :: NAT_IN(:) ! nature of array grid-points 49 54 REAL(wp) , INTENT(in ) :: SGN_IN(:) ! sign used across the north fold boundary 50 INTEGER, OPTIONAL, INTENT(in ) :: kfld ! number of pt3d arrays51 55 ! 52 56 INTEGER :: ji, jj, jk, jl, jh, jf ! dummy loop indices -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90
r8882 r9012 21 21 !!---------------------------------------------------------------------- 22 22 !! lbc_lnk : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp 23 !! lbc_lnk_e : generic interface for mpp_lnk_2d_e routine defined in lib_mpp24 23 !! lbc_bdy_lnk : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp 25 24 !!---------------------------------------------------------------------- … … 42 41 END INTERFACE 43 42 ! 44 INTERFACE lbc_lnk_e45 MODULE PROCEDURE mpp_lnk_2d_e46 END INTERFACE47 !48 43 INTERFACE lbc_lnk_icb 49 44 MODULE PROCEDURE mpp_lnk_2d_icb … … 52 47 PUBLIC lbc_lnk ! ocean/ice lateral boundary conditions 53 48 PUBLIC lbc_lnk_multi ! modified ocean/ice lateral boundary conditions 54 PUBLIC lbc_lnk_e ! extended ocean/ice lateral boundary conditions55 49 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions 56 50 PUBLIC lbc_lnk_icb ! iceberg lateral boundary conditions … … 95 89 END INTERFACE 96 90 ! 97 INTERFACE lbc_lnk_e98 MODULE PROCEDURE lbc_lnk_2d_e99 END INTERFACE100 !101 91 INTERFACE lbc_bdy_lnk 102 92 MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d … … 104 94 ! 105 95 INTERFACE lbc_lnk_icb 106 MODULE PROCEDURE lbc_lnk_2d_ e96 MODULE PROCEDURE lbc_lnk_2d_icb 107 97 END INTERFACE 108 98 109 99 PUBLIC lbc_lnk ! ocean/ice lateral boundary conditions 110 PUBLIC lbc_lnk_e ! extended ocean/ice lateral boundary conditions111 100 PUBLIC lbc_lnk_multi ! modified ocean/ice lateral boundary conditions 112 101 PUBLIC lbc_bdy_lnk ! ocean lateral BDY boundary conditions … … 270 259 271 260 272 !!gm This routine should be remove with an optional halos size added in orgument of generic routines273 274 SUBROUTINE lbc_lnk_2d_ e( pt2d, cd_type, psgn, ki, kj )261 !!gm This routine should be removed with an optional halos size added in argument of generic routines 262 263 SUBROUTINE lbc_lnk_2d_icb( pt2d, cd_type, psgn, ki, kj ) 275 264 !!---------------------------------------------------------------------- 276 265 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt2d ! 2D array on which the lbc is applied … … 280 269 !!---------------------------------------------------------------------- 281 270 CALL lbc_lnk_2d( pt2d, cd_type, psgn ) 282 END SUBROUTINE lbc_lnk_2d_ e271 END SUBROUTINE lbc_lnk_2d_icb 283 272 !!gm end 284 273 -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90
r8882 r9012 27 27 MODULE PROCEDURE lbc_nfd_2d , lbc_nfd_3d , lbc_nfd_4d 28 28 MODULE PROCEDURE lbc_nfd_2d_ptr, lbc_nfd_3d_ptr, lbc_nfd_4d_ptr 29 MODULE PROCEDURE lbc_nfd_2d_ext 29 30 END INTERFACE 30 31 ! … … 84 85 # undef ROUTINE_NFD 85 86 # undef MULTI 87 # undef DIM_2d 88 ! 89 ! !== 2D array with extra haloes ==! 90 ! 91 # define DIM_2d 92 # define ROUTINE_NFD lbc_nfd_2d_ext 93 # include "lbc_nfd_ext_generic.h90" 94 # undef ROUTINE_NFD 86 95 # undef DIM_2d 87 96 ! … … 156 165 157 166 158 !!gm CAUTION HERE optional pr2dj not implemented in generic case159 !!gm furthermore, in the _org routine it is OK only for T-point pivot !!160 161 162 SUBROUTINE lbc_nfd_2d_org( pt2d, cd_nat, psgn, pr2dj )163 !!----------------------------------------------------------------------164 !! *** routine lbc_nfd_2d ***165 !!166 !! ** Purpose : 2D lateral boundary condition : North fold treatment167 !! without processor exchanges.168 !!169 !! ** Method :170 !!171 !! ** Action : pt2d with updated values along the north fold172 !!----------------------------------------------------------------------173 REAL(wp), DIMENSION(:,:), INTENT(inout) :: pt2d ! 2D array on which the boundary condition is applied174 CHARACTER(len=1) , INTENT(in ) :: cd_nat ! nature of pt2d grid-point175 REAL(wp) , INTENT(in ) :: psgn ! sign used across north fold176 INTEGER , OPTIONAL , INTENT(in ) :: pr2dj ! number of additional halos177 !178 INTEGER :: ji, jl, ipr2dj179 INTEGER :: ijt, iju, ijpj, ijpjm1180 !!----------------------------------------------------------------------181 182 SELECT CASE ( jpni )183 CASE ( 1 ) ; ijpj = nlcj ! 1 proc only along the i-direction184 CASE DEFAULT ; ijpj = 4 ! several proc along the i-direction185 END SELECT186 !187 IF( PRESENT(pr2dj) ) THEN ! use of additional halos188 ipr2dj = pr2dj189 IF( jpni > 1 ) ijpj = ijpj + ipr2dj190 ELSE191 ipr2dj = 0192 ENDIF193 !194 ijpjm1 = ijpj-1195 196 197 SELECT CASE ( npolj )198 !199 CASE ( 3, 4 ) ! * North fold T-point pivot200 !201 SELECT CASE ( cd_nat )202 !203 CASE ( 'T' , 'W' ) ! T- , W-points204 DO jl = 0, ipr2dj205 DO ji = 2, jpiglo206 ijt=jpiglo-ji+2207 pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-2-jl)208 END DO209 END DO210 pt2d(1,ijpj) = psgn * pt2d(3,ijpj-2)211 DO ji = jpiglo/2+1, jpiglo212 ijt=jpiglo-ji+2213 pt2d(ji,ijpj-1) = psgn * pt2d(ijt,ijpj-1)214 END DO215 CASE ( 'U' ) ! U-point216 DO jl = 0, ipr2dj217 DO ji = 1, jpiglo-1218 iju = jpiglo-ji+1219 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-2-jl)220 END DO221 END DO222 pt2d( 1 ,ijpj ) = psgn * pt2d( 2 ,ijpj-2)223 pt2d(jpiglo,ijpj ) = psgn * pt2d(jpiglo-1,ijpj-2)224 pt2d(1 ,ijpj-1) = psgn * pt2d(jpiglo ,ijpj-1)225 DO ji = jpiglo/2, jpiglo-1226 iju = jpiglo-ji+1227 pt2d(ji,ijpjm1) = psgn * pt2d(iju,ijpjm1)228 END DO229 CASE ( 'V' ) ! V-point230 DO jl = -1, ipr2dj231 DO ji = 2, jpiglo232 ijt = jpiglo-ji+2233 pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-3-jl)234 END DO235 END DO236 pt2d( 1 ,ijpj) = psgn * pt2d( 3 ,ijpj-3)237 CASE ( 'F' ) ! F-point238 DO jl = -1, ipr2dj239 DO ji = 1, jpiglo-1240 iju = jpiglo-ji+1241 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-3-jl)242 END DO243 END DO244 pt2d( 1 ,ijpj) = psgn * pt2d( 2 ,ijpj-3)245 pt2d(jpiglo,ijpj) = psgn * pt2d(jpiglo-1,ijpj-3)246 pt2d(jpiglo,ijpj-1) = psgn * pt2d(jpiglo-1,ijpj-2)247 pt2d( 1 ,ijpj-1) = psgn * pt2d( 2 ,ijpj-2)248 CASE ( 'I' ) ! ice U-V point (I-point)249 DO jl = 0, ipr2dj250 pt2d(2,ijpj+jl) = psgn * pt2d(3,ijpj-1+jl)251 DO ji = 3, jpiglo252 iju = jpiglo - ji + 3253 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)254 END DO255 END DO256 END SELECT257 !258 CASE ( 5, 6 ) ! * North fold F-point pivot259 !260 SELECT CASE ( cd_nat )261 CASE ( 'T' , 'W' ) ! T-, W-point262 DO jl = 0, ipr2dj263 DO ji = 1, jpiglo264 ijt = jpiglo-ji+1265 pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-1-jl)266 END DO267 END DO268 CASE ( 'U' ) ! U-point269 DO jl = 0, ipr2dj270 DO ji = 1, jpiglo-1271 iju = jpiglo-ji272 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-1-jl)273 END DO274 END DO275 pt2d(jpiglo,ijpj) = psgn * pt2d(1,ijpj-1)276 CASE ( 'V' ) ! V-point277 DO jl = 0, ipr2dj278 DO ji = 1, jpiglo279 ijt = jpiglo-ji+1280 pt2d(ji,ijpj+jl) = psgn * pt2d(ijt,ijpj-2-jl)281 END DO282 END DO283 DO ji = jpiglo/2+1, jpiglo284 ijt = jpiglo-ji+1285 pt2d(ji,ijpjm1) = psgn * pt2d(ijt,ijpjm1)286 END DO287 CASE ( 'F' ) ! F-point288 DO jl = 0, ipr2dj289 DO ji = 1, jpiglo-1290 iju = jpiglo-ji291 pt2d(ji,ijpj+jl) = psgn * pt2d(iju,ijpj-2-jl)292 END DO293 END DO294 pt2d(jpiglo,ijpj) = psgn * pt2d(1,ijpj-2)295 DO ji = jpiglo/2+1, jpiglo-1296 iju = jpiglo-ji297 pt2d(ji,ijpjm1) = psgn * pt2d(iju,ijpjm1)298 END DO299 CASE ( 'I' ) ! ice U-V point (I-point)300 pt2d( 2 ,ijpj:ijpj+ipr2dj) = 0._wp301 DO jl = 0, ipr2dj302 DO ji = 2 , jpiglo-1303 ijt = jpiglo - ji + 2304 pt2d(ji,ijpj+jl)= 0.5 * ( pt2d(ji,ijpj-1-jl) + psgn * pt2d(ijt,ijpj-1-jl) )305 END DO306 END DO307 END SELECT308 !309 CASE DEFAULT ! * closed : the code probably never go through310 !311 SELECT CASE ( cd_nat)312 CASE ( 'T' , 'U' , 'V' , 'W' ) ! T-, U-, V-, W-points313 pt2d(:, 1:1-ipr2dj ) = 0._wp314 pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp315 CASE ( 'F' ) ! F-point316 pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp317 CASE ( 'I' ) ! ice U-V point318 pt2d(:, 1:1-ipr2dj ) = 0._wp319 pt2d(:,ijpj:ijpj+ipr2dj) = 0._wp320 END SELECT321 !322 END SELECT323 !324 END SUBROUTINE lbc_nfd_2d_org325 326 167 !!====================================================================== 327 168 END MODULE lbcnfd -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90
r8882 r9012 41 41 !! mynode : indentify the processor unit 42 42 !! mpp_lnk : interface (defined in lbclnk) for message passing of 2d or 3d arrays (mpp_lnk_2d, mpp_lnk_3d) 43 !! mpp_lnk_e : interface (defined in lbclnk) for message passing of 2d array with extra halo (mpp_lnk_2d_e)44 43 !! mpp_lnk_icb : interface for message passing of 2d arrays with extra halo for icebergs (mpp_lnk_2d_icb) 45 44 !! mpprecv : … … 55 54 !! mppstop : 56 55 !! mpp_ini_north : initialisation of north fold 57 !!gm !! mpp_lbc_north : north fold processors gathering 58 !! mpp_lbc_north_e : variant of mpp_lbc_north for extra outer halo 59 !! mpp_lbc_north_icb : variant of mpp_lbc_north for extra outer halo with icebergs 56 !! mpp_lbc_north_icb : alternative to mpp_nfd for extra outer halo with icebergs 60 57 !!---------------------------------------------------------------------- 61 58 USE dom_oce ! ocean space and time domain … … 75 72 PUBLIC mpp_lnk_2d , mpp_lnk_3d , mpp_lnk_4d 76 73 PUBLIC mpp_lnk_2d_ptr, mpp_lnk_3d_ptr, mpp_lnk_4d_ptr 77 PUBLIC mpp_lnk_2d_e78 74 ! 79 75 !!gm this should be useless … … 84 80 PUBLIC ctl_stop, ctl_warn, get_unit, ctl_opn, ctl_nam 85 81 PUBLIC mynode, mppstop, mppsync, mpp_comm_free 86 PUBLIC mpp_ini_north , mpp_lbc_north_e87 !!gm PUBLIC mpp_ini_north, mpp_lbc_north, mpp_lbc_north_e 88 PUBLIC mpp_lbc_north_icb , mpp_lnk_2d_icb82 PUBLIC mpp_ini_north 83 PUBLIC mpp_lnk_2d_icb 84 PUBLIC mpp_lbc_north_icb 89 85 PUBLIC mpp_min, mpp_max, mpp_sum, mpp_minloc, mpp_maxloc 90 86 PUBLIC mpp_max_multiple 91 !!gm PUBLIC mpp_lnk_2d_992 !!gm PUBLIC mpp_lnk_sum_3d, mpp_lnk_sum_2d93 87 PUBLIC mppscatter, mppgather 94 88 PUBLIC mpp_ini_ice, mpp_ini_znl … … 112 106 & mppsum_realdd, mppsum_a_realdd 113 107 END INTERFACE 114 !!gm INTERFACE mpp_lbc_north115 !!gm MODULE PROCEDURE mpp_lbc_north_3d, mpp_lbc_north_2d116 !!gm END INTERFACE117 108 INTERFACE mpp_minloc 118 109 MODULE PROCEDURE mpp_minloc2d ,mpp_minloc3d … … 145 136 146 137 ! variables used in case of sea-ice 147 INTEGER, PUBLIC :: ncomm_ice !: communicator made by the processors with sea-ice (public so that it can be freed in icethd)138 INTEGER, PUBLIC :: ncomm_ice !: communicator made by the processors with sea-ice (public so that it can be freed in limthd) 148 139 INTEGER :: ngrp_iworld ! group ID for the world processors (for rheology) 149 140 INTEGER :: ngrp_ice ! group ID for the ice processors (for rheology) … … 454 445 # include "mpp_bdy_generic.h90" 455 446 # undef ROUTINE_BDY 456 # define MULTI457 # define ROUTINE_BDY mpp_lnk_bdy_2d_ptr458 # include "mpp_bdy_generic.h90"459 # undef ROUTINE_BDY460 # undef MULTI461 447 # undef DIM_2d 462 448 ! … … 467 453 # include "mpp_bdy_generic.h90" 468 454 # undef ROUTINE_BDY 469 # define MULTI470 # define ROUTINE_BDY mpp_lnk_bdy_3d_ptr471 # include "mpp_bdy_generic.h90"472 # undef ROUTINE_BDY473 # undef MULTI474 455 # undef DIM_3d 475 456 ! … … 480 461 !!# include "mpp_bdy_generic.h90" 481 462 !!# undef ROUTINE_BDY 482 !!# define MULTI483 !!# define ROUTINE_BDY mpp_lnk_bdy_4d_ptr484 !!# include "mpp_bdy_generic.h90"485 !!# undef ROUTINE_BDY486 !!# undef MULTI487 463 !!# undef DIM_4d 488 464 … … 492 468 493 469 494 !! mpp_lnk_2d_e utilisé dans ICB495 496 497 470 !! mpp_lnk_sum_2d et 3D ====>>>>>> à virer du code !!!! 498 471 … … 500 473 !!---------------------------------------------------------------------- 501 474 502 503 SUBROUTINE mpp_lnk_2d_e( pt2d, cd_type, psgn, jpri, jprj )504 !!----------------------------------------------------------------------505 !! *** routine mpp_lnk_2d_e ***506 !!507 !! ** Purpose : Message passing manadgement for 2d array (with halo)508 !!509 !! ** Method : Use mppsend and mpprecv function for passing mask510 !! between processors following neighboring subdomains.511 !! domain parameters512 !! nlci : first dimension of the local subdomain513 !! nlcj : second dimension of the local subdomain514 !! jpri : number of rows for extra outer halo515 !! jprj : number of columns for extra outer halo516 !! nbondi : mark for "east-west local boundary"517 !! nbondj : mark for "north-south local boundary"518 !! noea : number for local neighboring processors519 !! nowe : number for local neighboring processors520 !! noso : number for local neighboring processors521 !! nono : number for local neighboring processors522 !!523 !!----------------------------------------------------------------------524 INTEGER , INTENT(in ) :: jpri525 INTEGER , INTENT(in ) :: jprj526 REAL(wp), DIMENSION(1-jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) :: pt2d ! 2D array with extra halo527 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of ptab array grid-points528 ! ! = T , U , V , F , W and I points529 REAL(wp) , INTENT(in ) :: psgn ! =-1 the sign change across the530 !! ! north boundary, = 1. otherwise531 INTEGER :: jl ! dummy loop indices532 INTEGER :: imigr, iihom, ijhom ! temporary integers533 INTEGER :: ipreci, iprecj ! temporary integers534 INTEGER :: ml_req1, ml_req2, ml_err ! for key_mpi_isend535 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend536 !!537 REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dns538 REAL(wp), DIMENSION(1-jpri:jpi+jpri,jprecj+jprj,2) :: r2dsn539 REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dwe540 REAL(wp), DIMENSION(1-jprj:jpj+jprj,jpreci+jpri,2) :: r2dew541 !!----------------------------------------------------------------------542 543 ipreci = jpreci + jpri ! take into account outer extra 2D overlap area544 iprecj = jprecj + jprj545 546 547 ! 1. standard boundary treatment (CAUTION: the order matters Here !!!! )548 ! ------------------------------549 ! !== North-South boundaries550 ! !* cyclic551 IF( nbondj == 2 .AND. jperio == 7 ) THEN552 pt2d(:, 1-jprj: 1 ) = pt2d ( :, jpjm1-jprj:jpjm1 )553 pt2d(:, jpj :jpj+jprj) = pt2d ( :, 2 :2+jprj)554 ELSE !* closed555 IF( .NOT. cd_type == 'F' ) pt2d(:, 1-jprj : jprecj ) = 0._wp ! south except at F-point556 pt2d(:,nlcj-jprecj+1:jpj+jprj) = 0._wp ! north557 ENDIF558 ! !== East-West boundaries559 ! !* Cyclic east-west560 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN561 pt2d(1-jpri: 1 ,:) = pt2d(jpim1-jpri: jpim1 ,:) ! east562 pt2d( jpi :jpi+jpri,:) = pt2d( 2 :2+jpri,:) ! west563 ELSE !* closed564 IF( .NOT. cd_type == 'F' ) pt2d( 1-jpri :jpreci ,:) = 0._wp ! south except at F-point565 pt2d(nlci-jpreci+1:jpi+jpri,:) = 0._wp ! north566 ENDIF567 !568 ! north fold treatment569 ! --------------------570 IF( npolj /= 0 ) THEN571 !572 SELECT CASE ( jpni )573 !!gm ERROR CASE ( 1 ) ; CALL lbc_nfd ( pt2d(1:jpi,1:jpj+jprj), cd_type, psgn, pr2dj=jprj )574 !!gm ERROR CASE DEFAULT ; CALL mpp_lbc_north_e( pt2d , cd_type, psgn )575 END SELECT576 !577 ENDIF578 579 ! 2. East and west directions exchange580 ! ------------------------------------581 ! we play with the neigbours AND the row number because of the periodicity582 !583 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions584 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case)585 iihom = nlci-nreci-jpri586 DO jl = 1, ipreci587 r2dew(:,jl,1) = pt2d(jpreci+jl,:)588 r2dwe(:,jl,1) = pt2d(iihom +jl,:)589 END DO590 END SELECT591 !592 ! ! Migrations593 imigr = ipreci * ( jpj + 2*jprj)594 !595 SELECT CASE ( nbondi )596 CASE ( -1 )597 CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req1 )598 CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea )599 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)600 CASE ( 0 )601 CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 )602 CALL mppsend( 2, r2dwe(1-jprj,1,1), imigr, noea, ml_req2 )603 CALL mpprecv( 1, r2dew(1-jprj,1,2), imigr, noea )604 CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe )605 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)606 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)607 CASE ( 1 )608 CALL mppsend( 1, r2dew(1-jprj,1,1), imigr, nowe, ml_req1 )609 CALL mpprecv( 2, r2dwe(1-jprj,1,2), imigr, nowe )610 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)611 END SELECT612 !613 ! ! Write Dirichlet lateral conditions614 iihom = nlci - jpreci615 !616 SELECT CASE ( nbondi )617 CASE ( -1 )618 DO jl = 1, ipreci619 pt2d(iihom+jl,:) = r2dew(:,jl,2)620 END DO621 CASE ( 0 )622 DO jl = 1, ipreci623 pt2d(jl-jpri,:) = r2dwe(:,jl,2)624 pt2d( iihom+jl,:) = r2dew(:,jl,2)625 END DO626 CASE ( 1 )627 DO jl = 1, ipreci628 pt2d(jl-jpri,:) = r2dwe(:,jl,2)629 END DO630 END SELECT631 632 ! 3. North and south directions633 ! -----------------------------634 ! always closed : we play only with the neigbours635 !636 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions637 ijhom = nlcj-nrecj-jprj638 DO jl = 1, iprecj639 r2dsn(:,jl,1) = pt2d(:,ijhom +jl)640 r2dns(:,jl,1) = pt2d(:,jprecj+jl)641 END DO642 ENDIF643 !644 ! ! Migrations645 imigr = iprecj * ( jpi + 2*jpri )646 !647 SELECT CASE ( nbondj )648 CASE ( -1 )649 CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req1 )650 CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono )651 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)652 CASE ( 0 )653 CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 )654 CALL mppsend( 4, r2dsn(1-jpri,1,1), imigr, nono, ml_req2 )655 CALL mpprecv( 3, r2dns(1-jpri,1,2), imigr, nono )656 CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso )657 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)658 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err)659 CASE ( 1 )660 CALL mppsend( 3, r2dns(1-jpri,1,1), imigr, noso, ml_req1 )661 CALL mpprecv( 4, r2dsn(1-jpri,1,2), imigr, noso )662 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err)663 END SELECT664 !665 ! ! Write Dirichlet lateral conditions666 ijhom = nlcj - jprecj667 !668 SELECT CASE ( nbondj )669 CASE ( -1 )670 DO jl = 1, iprecj671 pt2d(:,ijhom+jl) = r2dns(:,jl,2)672 END DO673 CASE ( 0 )674 DO jl = 1, iprecj675 pt2d(:,jl-jprj) = r2dsn(:,jl,2)676 pt2d(:,ijhom+jl ) = r2dns(:,jl,2)677 END DO678 CASE ( 1 )679 DO jl = 1, iprecj680 pt2d(:,jl-jprj) = r2dsn(:,jl,2)681 END DO682 END SELECT683 !684 END SUBROUTINE mpp_lnk_2d_e685 475 686 476 … … 1458 1248 1459 1249 1460 SUBROUTINE mpp_lbc_north_e( pt2d, cd_type, psgn)1461 !!---------------------------------------------------------------------1462 !! *** routine mpp_lbc_north_2d ***1463 !!1464 !! ** Purpose : Ensure proper north fold horizontal bondary condition1465 !! in mpp configuration in case of jpn1 > 1 and for 2d1466 !! array with outer extra halo1467 !!1468 !! ** Method : North fold condition and mpp with more than one proc1469 !! in i-direction require a specific treatment. We gather1470 !! the 4+2*jpr2dj northern lines of the global domain on 11471 !! processor and apply lbc north-fold on this sub array.1472 !! Then we scatter the north fold array back to the processors.1473 !!1474 !!----------------------------------------------------------------------1475 REAL(wp), DIMENSION(1-jpr2di:jpi+jpr2di,1-jpr2dj:jpj+jpr2dj), INTENT(inout) :: pt2d ! 2D array with extra halo1476 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of pt3d grid-points1477 REAL(wp) , INTENT(in ) :: psgn ! sign used across the north fold1478 !1479 INTEGER :: ji, jj, jr1480 INTEGER :: ierr, itaille, ildi, ilei, iilb1481 INTEGER :: ijpj, ij, iproc1482 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: ztab_e, znorthloc_e1483 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: znorthgloio_e1484 !!----------------------------------------------------------------------1485 !1486 ALLOCATE( ztab_e(jpiglo,4+2*jpr2dj), znorthloc_e(jpi,4+2*jpr2dj), znorthgloio_e(jpi,4+2*jpr2dj,jpni) )1487 !1488 ijpj=41489 ztab_e(:,:) = 0._wp1490 1491 ij = 01492 ! put in znorthloc_e the last 4 jlines of pt2d1493 DO jj = nlcj - ijpj + 1 - jpr2dj, nlcj +jpr2dj1494 ij = ij + 11495 DO ji = 1, jpi1496 znorthloc_e(ji,ij) = pt2d(ji,jj)1497 END DO1498 END DO1499 !1500 itaille = jpi * ( ijpj + 2 * jpr2dj )1501 CALL MPI_ALLGATHER( znorthloc_e(1,1) , itaille, MPI_DOUBLE_PRECISION, &1502 & znorthgloio_e(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr )1503 !1504 DO jr = 1, ndim_rank_north ! recover the global north array1505 iproc = nrank_north(jr) + 11506 ildi = nldit (iproc)1507 ilei = nleit (iproc)1508 iilb = nimppt(iproc)1509 DO jj = 1, ijpj+2*jpr2dj1510 DO ji = ildi, ilei1511 ztab_e(ji+iilb-1,jj) = znorthgloio_e(ji,jj,jr)1512 END DO1513 END DO1514 END DO1515 1516 ! 2. North-Fold boundary conditions1517 ! ----------------------------------1518 !!gm ERROR CALL lbc_nfd( ztab_e(:,:), cd_type, psgn, pr2dj = jpr2dj )1519 1520 ij = jpr2dj1521 !! Scatter back to pt2d1522 DO jj = nlcj - ijpj + 1 , nlcj +jpr2dj1523 ij = ij +11524 DO ji= 1, nlci1525 pt2d(ji,jj) = ztab_e(ji+nimpp-1,ij)1526 END DO1527 END DO1528 !1529 DEALLOCATE( ztab_e, znorthloc_e, znorthgloio_e )1530 !1531 END SUBROUTINE mpp_lbc_north_e1532 1533 1534 1250 SUBROUTINE mpi_init_opa( ldtxt, ksft, code ) 1535 1251 !!--------------------------------------------------------------------- … … 1623 1339 1624 1340 1625 SUBROUTINE mpp_lbc_north_icb( pt2d, cd_type, psgn, pr2dj)1341 SUBROUTINE mpp_lbc_north_icb( pt2d, cd_type, psgn, kextj) 1626 1342 !!--------------------------------------------------------------------- 1627 1343 !! *** routine mpp_lbc_north_icb *** … … 1633 1349 !! ** Method : North fold condition and mpp with more than one proc 1634 1350 !! in i-direction require a specific treatment. We gather 1635 !! the 4+ 2*jpr2dj northern lines of the global domain on 11351 !! the 4+kextj northern lines of the global domain on 1 1636 1352 !! processor and apply lbc north-fold on this sub array. 1637 1353 !! Then we scatter the north fold array back to the processors. 1638 !! This version accounts for an extra halo with icebergs. 1354 !! This routine accounts for an extra halo with icebergs 1355 !! and assumes ghost rows and columns have been suppressed. 1639 1356 !! 1640 1357 !!---------------------------------------------------------------------- … … 1644 1361 REAL(wp) , INTENT(in ) :: psgn ! = -1. the sign change across the 1645 1362 !! ! north fold, = 1. otherwise 1646 INTEGER , OPTIONAL , INTENT(in ) :: pr2dj1363 INTEGER , INTENT(in ) :: kextj ! Extra halo width at north fold 1647 1364 ! 1648 1365 INTEGER :: ji, jj, jr 1649 1366 INTEGER :: ierr, itaille, ildi, ilei, iilb 1650 INTEGER :: i jpj, ij, iproc, ipr2dj1367 INTEGER :: ipj, ij, iproc 1651 1368 ! 1652 1369 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: ztab_e, znorthloc_e … … 1654 1371 !!---------------------------------------------------------------------- 1655 1372 ! 1656 ijpj=4 1657 IF( PRESENT(pr2dj) ) THEN ! use of additional halos 1658 ipr2dj = pr2dj 1659 ELSE 1660 ipr2dj = 0 1661 ENDIF 1662 ALLOCATE( ztab_e(jpiglo,4+2*ipr2dj), znorthloc_e(jpi,4+2*ipr2dj), znorthgloio_e(jpi,4+2*ipr2dj,jpni) ) 1663 ! 1664 ztab_e(:,:) = 0._wp 1373 ipj=4 1374 ALLOCATE( ztab_e(jpiglo,ipj+kextj), znorthloc_e( jpimax,ipj+kextj), & 1375 & znorthgloio_e(jpimax,ipj+kextj,jpni) ) 1376 ! 1377 ztab_e(:,:) = 0._wp 1378 znorthloc_e(:,:) = 0._wp 1665 1379 ! 1666 1380 ij = 0 1667 ! put in znorthloc_e the last 4 jlines of pt2d1668 DO jj = nlcj - ijpj + 1 - ipr2dj, nlcj +ipr2dj1381 ! put the last ipj+kextj lines of pt2d into znorthloc_e 1382 DO jj = jpj - ipj + 1, jpj + kextj 1669 1383 ij = ij + 1 1670 DO ji = 1, jpi 1671 znorthloc_e(ji,ij)=pt2d(ji,jj) 1672 END DO 1384 znorthloc_e(1:jpi,ij)=pt2d(1:jpi,jj) 1673 1385 END DO 1674 1386 ! 1675 itaille = jpi * ( ijpj + 2 * ipr2dj )1387 itaille = jpimax * ( ipj + kextj ) 1676 1388 CALL MPI_ALLGATHER( znorthloc_e(1,1) , itaille, MPI_DOUBLE_PRECISION, & 1677 1389 & znorthgloio_e(1,1,1), itaille, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) … … 1682 1394 ilei = nleit (iproc) 1683 1395 iilb = nimppt(iproc) 1684 DO jj = 1, i jpj+2*ipr2dj1396 DO jj = 1, ipj+kextj 1685 1397 DO ji = ildi, ilei 1686 1398 ztab_e(ji+iilb-1,jj) = znorthgloio_e(ji,jj,jr) … … 1691 1403 ! 2. North-Fold boundary conditions 1692 1404 ! ---------------------------------- 1693 !!gm ERROR CALL lbc_nfd( ztab_e(:,:), cd_type, psgn, pr2dj = ipr2dj )1694 1695 ij = ipr2dj1405 CALL lbc_nfd( ztab_e(:,:), cd_type, psgn, kextj ) 1406 1407 ij = 0 1696 1408 !! Scatter back to pt2d 1697 DO jj = nlcj - ijpj + 1 , nlcj +ipr2dj1409 DO jj = jpj - ipj + 1 , jpj + kextj 1698 1410 ij = ij +1 1699 DO ji= 1, nlci1411 DO ji= 1, jpi 1700 1412 pt2d(ji,jj) = ztab_e(ji+nimpp-1,ij) 1701 1413 END DO … … 1707 1419 1708 1420 1709 SUBROUTINE mpp_lnk_2d_icb( pt2d, cd_type, psgn, jpri, jprj )1421 SUBROUTINE mpp_lnk_2d_icb( pt2d, cd_type, psgn, kexti, kextj ) 1710 1422 !!---------------------------------------------------------------------- 1711 1423 !! *** routine mpp_lnk_2d_icb *** 1712 1424 !! 1713 !! ** Purpose : Message passing manadgement for 2d array (with extra halo and icebergs) 1425 !! ** Purpose : Message passing management for 2d array (with extra halo for icebergs) 1426 !! This routine receives a (1-kexti:jpi+kexti,1-kexti:jpj+kextj) 1427 !! array (usually (0:jpi+1, 0:jpj+1)) from lbc_lnk_icb calls. 1714 1428 !! 1715 1429 !! ** Method : Use mppsend and mpprecv function for passing mask 1716 1430 !! between processors following neighboring subdomains. 1717 1431 !! domain parameters 1718 !! nlci: first dimension of the local subdomain1719 !! nlcj: second dimension of the local subdomain1720 !! jpri : number of rows for extra outer halo1721 !! jprj : number of columns for extra outer halo1432 !! jpi : first dimension of the local subdomain 1433 !! jpj : second dimension of the local subdomain 1434 !! kexti : number of columns for extra outer halo 1435 !! kextj : number of rows for extra outer halo 1722 1436 !! nbondi : mark for "east-west local boundary" 1723 1437 !! nbondj : mark for "north-south local boundary" … … 1727 1441 !! nono : number for local neighboring processors 1728 1442 !!---------------------------------------------------------------------- 1729 REAL(wp), DIMENSION(1- jpri:jpi+jpri,1-jprj:jpj+jprj), INTENT(inout) :: pt2d ! 2D array with extra halo1730 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of ptab array grid-points1731 REAL(wp) , INTENT(in ) :: psgn ! sign used across the north fold1732 INTEGER , INTENT(in ) :: jpri1733 INTEGER , INTENT(in ) :: jprj1443 REAL(wp), DIMENSION(1-kexti:jpi+kexti,1-kextj:jpj+kextj), INTENT(inout) :: pt2d ! 2D array with extra halo 1444 CHARACTER(len=1) , INTENT(in ) :: cd_type ! nature of ptab array grid-points 1445 REAL(wp) , INTENT(in ) :: psgn ! sign used across the north fold 1446 INTEGER , INTENT(in ) :: kexti ! extra i-halo width 1447 INTEGER , INTENT(in ) :: kextj ! extra j-halo width 1734 1448 ! 1735 1449 INTEGER :: jl ! dummy loop indices … … 1739 1453 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ml_stat ! for key_mpi_isend 1740 1454 !! 1741 REAL(wp), DIMENSION(1- jpri:jpi+jpri,jprecj+jprj,2) :: r2dns, r2dsn1742 REAL(wp), DIMENSION(1- jprj:jpj+jprj,jpreci+jpri,2) :: r2dwe, r2dew1743 !!---------------------------------------------------------------------- 1744 1745 ipreci = jpreci + jpri ! take into account outer extra 2D overlap area1746 iprecj = jprecj + jprj1455 REAL(wp), DIMENSION(1-kexti:jpi+kexti,nn_hls+kextj,2) :: r2dns, r2dsn 1456 REAL(wp), DIMENSION(1-kextj:jpj+kextj,nn_hls+kexti,2) :: r2dwe, r2dew 1457 !!---------------------------------------------------------------------- 1458 1459 ipreci = nn_hls + kexti ! take into account outer extra 2D overlap area 1460 iprecj = nn_hls + kextj 1747 1461 1748 1462 … … 1754 1468 ! !* Cyclic east-west 1755 1469 IF( nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) ) THEN 1756 pt2d(1- jpri: 1 ,:) = pt2d(jpim1-jpri: jpim1 ,:) ! east1757 pt2d( jpi :jpi+ jpri,:) = pt2d( 2 :2+jpri,:) ! west1470 pt2d(1-kexti: 1 ,:) = pt2d(jpim1-kexti: jpim1 ,:) ! east 1471 pt2d( jpi :jpi+kexti,:) = pt2d( 2 :2+kexti,:) ! west 1758 1472 ! 1759 1473 ELSE !* closed 1760 IF( .NOT. cd_type == 'F' ) pt2d( 1- jpri :jpreci,:) = 0._wp ! south except at F-point1761 pt2d( nlci-jpreci+1:jpi+jpri,:) = 0._wp ! north1474 IF( .NOT. cd_type == 'F' ) pt2d( 1-kexti :nn_hls ,:) = 0._wp ! south except at F-point 1475 pt2d(jpi-nn_hls+1:jpi+kexti,:) = 0._wp ! north 1762 1476 ENDIF 1763 1477 ! … … 1768 1482 ! 1769 1483 SELECT CASE ( jpni ) 1770 !!gm ERROR CASE ( 1 ) ; CALL lbc_nfd ( pt2d(1:jpi,1:jpj+jprj), cd_type, psgn, pr2dj=jprj )1771 !!gm ERROR CASE DEFAULT ; CALL mpp_lbc_north_icb( pt2d(1:jpi,1:jpj+jprj) , cd_type, psgn , pr2dj=jprj)1484 CASE ( 1 ) ; CALL lbc_nfd ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj ) 1485 CASE DEFAULT ; CALL mpp_lbc_north_icb( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj ) 1772 1486 END SELECT 1773 1487 ! … … 1780 1494 SELECT CASE ( nbondi ) ! Read Dirichlet lateral conditions 1781 1495 CASE ( -1, 0, 1 ) ! all exept 2 (i.e. close case) 1782 iihom = nlci-nreci-jpri1496 iihom = jpi-nreci-kexti 1783 1497 DO jl = 1, ipreci 1784 r2dew(:,jl,1) = pt2d( jpreci+jl,:)1498 r2dew(:,jl,1) = pt2d(nn_hls+jl,:) 1785 1499 r2dwe(:,jl,1) = pt2d(iihom +jl,:) 1786 1500 END DO … … 1788 1502 ! 1789 1503 ! ! Migrations 1790 imigr = ipreci * ( jpj + 2* jprj)1504 imigr = ipreci * ( jpj + 2*kextj ) 1791 1505 ! 1792 1506 SELECT CASE ( nbondi ) 1793 1507 CASE ( -1 ) 1794 CALL mppsend( 2, r2dwe(1- jprj,1,1), imigr, noea, ml_req1 )1795 CALL mpprecv( 1, r2dew(1- jprj,1,2), imigr, noea )1508 CALL mppsend( 2, r2dwe(1-kextj,1,1), imigr, noea, ml_req1 ) 1509 CALL mpprecv( 1, r2dew(1-kextj,1,2), imigr, noea ) 1796 1510 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1797 1511 CASE ( 0 ) 1798 CALL mppsend( 1, r2dew(1- jprj,1,1), imigr, nowe, ml_req1 )1799 CALL mppsend( 2, r2dwe(1- jprj,1,1), imigr, noea, ml_req2 )1800 CALL mpprecv( 1, r2dew(1- jprj,1,2), imigr, noea )1801 CALL mpprecv( 2, r2dwe(1- jprj,1,2), imigr, nowe )1512 CALL mppsend( 1, r2dew(1-kextj,1,1), imigr, nowe, ml_req1 ) 1513 CALL mppsend( 2, r2dwe(1-kextj,1,1), imigr, noea, ml_req2 ) 1514 CALL mpprecv( 1, r2dew(1-kextj,1,2), imigr, noea ) 1515 CALL mpprecv( 2, r2dwe(1-kextj,1,2), imigr, nowe ) 1802 1516 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1803 1517 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1804 1518 CASE ( 1 ) 1805 CALL mppsend( 1, r2dew(1- jprj,1,1), imigr, nowe, ml_req1 )1806 CALL mpprecv( 2, r2dwe(1- jprj,1,2), imigr, nowe )1519 CALL mppsend( 1, r2dew(1-kextj,1,1), imigr, nowe, ml_req1 ) 1520 CALL mpprecv( 2, r2dwe(1-kextj,1,2), imigr, nowe ) 1807 1521 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1808 1522 END SELECT 1809 1523 ! 1810 1524 ! ! Write Dirichlet lateral conditions 1811 iihom = nlci - jpreci1525 iihom = jpi - nn_hls 1812 1526 ! 1813 1527 SELECT CASE ( nbondi ) … … 1818 1532 CASE ( 0 ) 1819 1533 DO jl = 1, ipreci 1820 pt2d(jl- jpri,:) = r2dwe(:,jl,2)1821 pt2d( 1534 pt2d(jl-kexti,:) = r2dwe(:,jl,2) 1535 pt2d(iihom+jl,:) = r2dew(:,jl,2) 1822 1536 END DO 1823 1537 CASE ( 1 ) 1824 1538 DO jl = 1, ipreci 1825 pt2d(jl- jpri,:) = r2dwe(:,jl,2)1539 pt2d(jl-kexti,:) = r2dwe(:,jl,2) 1826 1540 END DO 1827 1541 END SELECT … … 1833 1547 ! 1834 1548 IF( nbondj /= 2 ) THEN ! Read Dirichlet lateral conditions 1835 ijhom = nlcj-nrecj-jprj1549 ijhom = jpj-nrecj-kextj 1836 1550 DO jl = 1, iprecj 1837 1551 r2dsn(:,jl,1) = pt2d(:,ijhom +jl) 1838 r2dns(:,jl,1) = pt2d(:, jprecj+jl)1552 r2dns(:,jl,1) = pt2d(:,nn_hls+jl) 1839 1553 END DO 1840 1554 ENDIF 1841 1555 ! 1842 1556 ! ! Migrations 1843 imigr = iprecj * ( jpi + 2* jpri )1557 imigr = iprecj * ( jpi + 2*kexti ) 1844 1558 ! 1845 1559 SELECT CASE ( nbondj ) 1846 1560 CASE ( -1 ) 1847 CALL mppsend( 4, r2dsn(1- jpri,1,1), imigr, nono, ml_req1 )1848 CALL mpprecv( 3, r2dns(1- jpri,1,2), imigr, nono )1561 CALL mppsend( 4, r2dsn(1-kexti,1,1), imigr, nono, ml_req1 ) 1562 CALL mpprecv( 3, r2dns(1-kexti,1,2), imigr, nono ) 1849 1563 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1850 1564 CASE ( 0 ) 1851 CALL mppsend( 3, r2dns(1- jpri,1,1), imigr, noso, ml_req1 )1852 CALL mppsend( 4, r2dsn(1- jpri,1,1), imigr, nono, ml_req2 )1853 CALL mpprecv( 3, r2dns(1- jpri,1,2), imigr, nono )1854 CALL mpprecv( 4, r2dsn(1- jpri,1,2), imigr, noso )1565 CALL mppsend( 3, r2dns(1-kexti,1,1), imigr, noso, ml_req1 ) 1566 CALL mppsend( 4, r2dsn(1-kexti,1,1), imigr, nono, ml_req2 ) 1567 CALL mpprecv( 3, r2dns(1-kexti,1,2), imigr, nono ) 1568 CALL mpprecv( 4, r2dsn(1-kexti,1,2), imigr, noso ) 1855 1569 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1856 1570 IF(l_isend) CALL mpi_wait(ml_req2,ml_stat,ml_err) 1857 1571 CASE ( 1 ) 1858 CALL mppsend( 3, r2dns(1- jpri,1,1), imigr, noso, ml_req1 )1859 CALL mpprecv( 4, r2dsn(1- jpri,1,2), imigr, noso )1572 CALL mppsend( 3, r2dns(1-kexti,1,1), imigr, noso, ml_req1 ) 1573 CALL mpprecv( 4, r2dsn(1-kexti,1,2), imigr, noso ) 1860 1574 IF(l_isend) CALL mpi_wait(ml_req1,ml_stat,ml_err) 1861 1575 END SELECT 1862 1576 ! 1863 1577 ! ! Write Dirichlet lateral conditions 1864 ijhom = nlcj - jprecj1578 ijhom = jpj - nn_hls 1865 1579 ! 1866 1580 SELECT CASE ( nbondj ) … … 1871 1585 CASE ( 0 ) 1872 1586 DO jl = 1, iprecj 1873 pt2d(:,jl- jprj) = r2dsn(:,jl,2)1874 pt2d(:,ijhom+jl 1587 pt2d(:,jl-kextj) = r2dsn(:,jl,2) 1588 pt2d(:,ijhom+jl) = r2dns(:,jl,2) 1875 1589 END DO 1876 1590 CASE ( 1 ) 1877 1591 DO jl = 1, iprecj 1878 pt2d(:,jl- jprj) = r2dsn(:,jl,2)1592 pt2d(:,jl-kextj) = r2dsn(:,jl,2) 1879 1593 END DO 1880 1594 END SELECT -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/mpp_bdy_generic.h90
r8882 r9012 1 #if defined MULTI2 # define NAT_IN(k) cd_nat(k)3 # define SGN_IN(k) psgn(k)4 # define IBD_IN(k) kb_bdy(k)5 # define F_SIZE(ptab) kfld6 # if defined DIM_2d7 # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_2D) , INTENT(inout) :: ptab(f)8 # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt2d(i,j)9 # define K_SIZE(ptab) 110 # define L_SIZE(ptab) 111 # endif12 # if defined DIM_3d13 # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_3D) , INTENT(inout) :: ptab(f)14 # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt3d(i,j,k)15 # define K_SIZE(ptab) SIZE(ptab(1)%pt3d,3)16 # define L_SIZE(ptab) 117 # endif18 # if defined DIM_4d19 # define ARRAY_TYPE(i,j,k,l,f) TYPE(PTR_4D) , INTENT(inout) :: ptab(f)20 # define ARRAY_IN(i,j,k,l,f) ptab(f)%pt4d(i,j,k,l)21 # define K_SIZE(ptab) SIZE(ptab(1)%pt4d,3)22 # define L_SIZE(ptab) SIZE(ptab(1)%pt4d,4)23 # endif24 #else25 1 # define ARRAY_TYPE(i,j,k,l,f) REAL(wp) , INTENT(inout) :: ARRAY_IN(i,j,k,l,f) 26 2 # define NAT_IN(k) cd_nat … … 28 4 # define IBD_IN(k) kb_bdy 29 5 # define F_SIZE(ptab) 1 6 # define OPT_K(k) 30 7 # if defined DIM_2d 31 8 # define ARRAY_IN(i,j,k,l,f) ptab(i,j) … … 43 20 # define L_SIZE(ptab) SIZE(ptab,4) 44 21 # endif 45 #endif 46 47 #if defined MULTI 48 SUBROUTINE ROUTINE_BDY( ptab, cd_nat, psgn, kfld, kb_bdy ) 49 INTEGER , INTENT(in ) :: kfld ! number of pt3d arrays 50 #else 22 51 23 SUBROUTINE ROUTINE_BDY( ptab, cd_nat, psgn , kb_bdy ) 52 #endif53 24 !!---------------------------------------------------------------------- 54 25 !! *** routine mpp_lnk_bdy_3d *** … … 91 62 ipf = F_SIZE(ptab) ! 5th - use in "multi" case (array of pointers) 92 63 ! 93 ALLOCATE( zt3ns(jpi, jprecj,ipk,ipl,ipf,2), zt3sn(jpi,jprecj,ipk,ipl,ipf,2), &94 & zt3ew(jpj, jpreci,ipk,ipl,ipf,2), zt3we(jpj,jpreci,ipk,ipl,ipf,2) )64 ALLOCATE( zt3ns(jpi,nn_hls,ipk,ipl,ipf,2), zt3sn(jpi,nn_hls,ipk,ipl,ipf,2), & 65 & zt3ew(jpj,nn_hls,ipk,ipl,ipf,2), zt3we(jpj,nn_hls,ipk,ipl,ipf,2) ) 95 66 96 67 zland = 0._wp … … 109 80 ARRAY_IN(jpi,:,:,:,jf) = ARRAY_IN( 2 ,:,:,:,jf) 110 81 ELSE !* Closed 111 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN( 1 : jpreci,:,:,:,jf) = zland ! east except F-point112 ARRAY_IN(nlci- jpreci+1:jpi ,:,:,:,jf) = zland ! west82 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN( 1 :nn_hls,:,:,:,jf) = zland ! east except F-point 83 ARRAY_IN(nlci-nn_hls+1:jpi ,:,:,:,jf) = zland ! west 113 84 ENDIF 114 85 ELSEIF(nbondi == -1) THEN ! subdomain to the east only 115 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(1: jpreci,:,:,:,jf) = zland ! south except F-point86 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(1:nn_hls,:,:,:,jf) = zland ! south except F-point 116 87 ! 117 88 ELSEIF(nbondi == 1) THEN ! subdomain to the west only 118 ARRAY_IN(nlci- jpreci+1:jpi,:,:,:,jf) = zland ! north89 ARRAY_IN(nlci-nn_hls+1:jpi,:,:,:,jf) = zland ! north 119 90 ENDIF 120 91 ! ! North-South boundaries 121 92 ! 122 93 IF (nbondj == 2 .OR. nbondj == -1) THEN !* closed 123 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:,1: jprecj,:,:,jf) = zland ! south except F-point94 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:,1:nn_hls,:,:,jf) = zland ! south except F-point 124 95 ELSEIF (nbondj == 2 .OR. nbondj == 1) THEN 125 ARRAY_IN(:,nlcj- jprecj+1:jpj,:,:,jf) = zland ! north96 ARRAY_IN(:,nlcj-nn_hls+1:jpj,:,:,jf) = zland ! north 126 97 ENDIF 127 98 END DO … … 138 109 DO jl = 1, ipl 139 110 DO jk = 1, ipk 140 DO jh = 1, jpreci141 zt3ew(:,jh,jk,jl,jf,1) = ARRAY_IN( jpreci+jh,:,jk,jl,jf)111 DO jh = 1, nn_hls 112 zt3ew(:,jh,jk,jl,jf,1) = ARRAY_IN(nn_hls+jh,:,jk,jl,jf) 142 113 zt3we(:,jh,jk,jl,jf,1) = ARRAY_IN(iihom +jh,:,jk,jl,jf) 143 114 END DO … … 147 118 ! 148 119 ! ! Migrations 149 !!gm imigr = jpreci* jpj * ipk * ipl * ipf150 imigr = jpreci* jpj * ipk * ipl120 !!gm imigr = nn_hls * jpj * ipk * ipl * ipf 121 imigr = nn_hls * jpj * ipk * ipl 151 122 ! 152 123 SELECT CASE ( nbondi_bdy(IBD_IN(jf)) ) … … 169 140 ! 170 141 ! ! Write Dirichlet lateral conditions 171 iihom = nlci- jpreci142 iihom = nlci-nn_hls 172 143 ! 173 144 ! … … 176 147 DO jl = 1, ipl 177 148 DO jk = 1, ipk 178 DO jh = 1, jpreci149 DO jh = 1, nn_hls 179 150 ARRAY_IN(iihom+jh,:,jk,jl,jf) = zt3ew(:,jh,jk,jl,jf,2) 180 151 END DO … … 184 155 DO jl = 1, ipl 185 156 DO jk = 1, ipk 186 DO jh = 1, jpreci157 DO jh = 1, nn_hls 187 158 ARRAY_IN(jh ,:,jk,jl,jf) = zt3we(:,jh,jk,jl,jf,2) 188 159 ARRAY_IN(iihom+jh,:,jk,jl,jf) = zt3ew(:,jh,jk,jl,jf,2) … … 193 164 DO jl = 1, ipl 194 165 DO jk = 1, ipk 195 DO jh = 1, jpreci166 DO jh = 1, nn_hls 196 167 ARRAY_IN(jh ,:,jk,jl,jf) = zt3we(:,jh,jk,jl,jf,2) 197 168 END DO … … 211 182 DO jl = 1, ipl 212 183 DO jk = 1, ipk 213 DO jh = 1, jprecj184 DO jh = 1, nn_hls 214 185 zt3sn(:,jh,jk,jl,jf,1) = ARRAY_IN(:,ijhom +jh,jk,jl,jf) 215 zt3ns(:,jh,jk,jl,jf,1) = ARRAY_IN(:, jprecj+jh,jk,jl,jf)186 zt3ns(:,jh,jk,jl,jf,1) = ARRAY_IN(:,nn_hls+jh,jk,jl,jf) 216 187 END DO 217 188 END DO … … 220 191 ! 221 192 ! ! Migrations 222 !!gm imigr = jprecj* jpi * ipk * ipl * ipf223 imigr = jprecj* jpi * ipk * ipl193 !!gm imigr = nn_hls * jpi * ipk * ipl * ipf 194 imigr = nn_hls * jpi * ipk * ipl 224 195 ! 225 196 SELECT CASE ( nbondj_bdy(IBD_IN(jf)) ) … … 242 213 ! 243 214 ! ! Write Dirichlet lateral conditions 244 ijhom = nlcj- jprecj215 ijhom = nlcj-nn_hls 245 216 ! 246 217 SELECT CASE ( nbondj_bdy_b(IBD_IN(jf)) ) … … 248 219 DO jl = 1, ipl 249 220 DO jk = 1, ipk 250 DO jh = 1, jprecj221 DO jh = 1, nn_hls 251 222 ARRAY_IN(:,ijhom+jh,jk,jl,jf) = zt3ns(:,jh,jk,jl,jf,2) 252 223 END DO … … 256 227 DO jl = 1, ipl 257 228 DO jk = 1, ipk 258 DO jh = 1, jprecj229 DO jh = 1, nn_hls 259 230 ARRAY_IN(:, jh,jk,jl,jf) = zt3sn(:,jh,jk,jl,jf,2) 260 231 ARRAY_IN(:,ijhom+jh,jk,jl,jf) = zt3ns(:,jh,jk,jl,jf,2) … … 265 236 DO jl = 1, ipl 266 237 DO jk = 1, ipk 267 DO jh = 1, jprecj238 DO jh = 1, nn_hls 268 239 ARRAY_IN(:,jh,jk,jl,jf) = zt3sn(:,jh,jk,jl,jf,2) 269 240 END DO … … 279 250 ! 280 251 SELECT CASE ( jpni ) 281 CASE ( 1 ) ; CALL lbc_nfd( ptab, NAT_IN(:), SGN_IN(:) ) ! only 1 northern proc, no mpp282 CASE DEFAULT ; CALL mpp_nfd( ptab, NAT_IN(:), SGN_IN(:) ) ! for all northern procs.252 CASE ( 1 ) ; CALL lbc_nfd( ptab, NAT_IN(:), SGN_IN(:) OPT_K(:) ) ! only 1 northern proc, no mpp 253 CASE DEFAULT ; CALL mpp_nfd( ptab, NAT_IN(:), SGN_IN(:) OPT_K(:) ) ! for all northern procs. 283 254 END SELECT 284 255 ! … … 297 268 #undef L_SIZE 298 269 #undef F_SIZE 270 #undef OPT_K -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/mpp_lnk_generic.h90
r8882 r9012 72 72 ipf = F_SIZE(ptab) ! 5th - use in "multi" case (array of pointers) 73 73 ! 74 ALLOCATE( zt3ns(jpi, jprecj,ipk,ipl,ipf,2), zt3sn(jpi,jprecj,ipk,ipl,ipf,2), &75 & zt3ew(jpj, jpreci,ipk,ipl,ipf,2), zt3we(jpj,jpreci,ipk,ipl,ipf,2) )74 ALLOCATE( zt3ns(jpi,nn_hls,ipk,ipl,ipf,2), zt3sn(jpi,nn_hls,ipk,ipl,ipf,2), & 75 & zt3ew(jpj,nn_hls,ipk,ipl,ipf,2), zt3we(jpj,nn_hls,ipk,ipl,ipf,2) ) 76 76 ! 77 77 ll_Iperio = nbondi == 2 .AND. (nperio == 1 .OR. nperio == 4 .OR. nperio == 6) … … 116 116 ARRAY_IN(jpi,:,:,:,jf) = ARRAY_IN( 2 ,:,:,:,jf) 117 117 ELSE !* closed 118 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN( 1 : jpreci,:,:,:,jf) = zland ! east except F-point119 ARRAY_IN(nlci- jpreci+1:jpi ,:,:,:,jf) = zland ! west118 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN( 1 :nn_hls,:,:,:,jf) = zland ! east except F-point 119 ARRAY_IN(nlci-nn_hls+1:jpi ,:,:,:,jf) = zland ! west 120 120 ENDIF 121 121 ! ! North-South boundaries … … 124 124 ARRAY_IN(:,jpj,:,:,jf) = ARRAY_IN(:, 2 ,:,:,jf) 125 125 ELSE !* closed 126 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:, 1 : jprecj,:,:,jf) = zland ! south except F-point127 ARRAY_IN(:,nlcj- jprecj+1:jpj ,:,:,jf) = zland ! north126 IF( .NOT. NAT_IN(jf) == 'F' ) ARRAY_IN(:, 1 :nn_hls,:,:,jf) = zland ! south except F-point 127 ARRAY_IN(:,nlcj-nn_hls+1:jpj ,:,:,jf) = zland ! north 128 128 ENDIF 129 129 END DO … … 142 142 DO jl = 1, ipl 143 143 DO jk = 1, ipk 144 DO jh = 1, jpreci145 zt3ew(:,jh,jk,jl,jf,1) = ARRAY_IN( jpreci+jh,:,jk,jl,jf)144 DO jh = 1, nn_hls 145 zt3ew(:,jh,jk,jl,jf,1) = ARRAY_IN(nn_hls+jh,:,jk,jl,jf) 146 146 zt3we(:,jh,jk,jl,jf,1) = ARRAY_IN(iihom +jh,:,jk,jl,jf) 147 147 END DO … … 152 152 ! 153 153 ! ! Migrations 154 imigr = jpreci* jpj * ipk * ipl * ipf154 imigr = nn_hls * jpj * ipk * ipl * ipf 155 155 ! 156 156 SELECT CASE ( nbondi ) … … 173 173 ! 174 174 ! ! Write Dirichlet lateral conditions 175 iihom = nlci- jpreci175 iihom = nlci-nn_hls 176 176 ! 177 177 SELECT CASE ( nbondi ) … … 180 180 DO jl = 1, ipl 181 181 DO jk = 1, ipk 182 DO jh = 1, jpreci182 DO jh = 1, nn_hls 183 183 ARRAY_IN(iihom+jh,:,jk,jl,jf) = zt3ew(:,jh,jk,jl,jf,2) 184 184 END DO … … 190 190 DO jl = 1, ipl 191 191 DO jk = 1, ipk 192 DO jh = 1, jpreci192 DO jh = 1, nn_hls 193 193 ARRAY_IN(jh ,:,jk,jl,jf) = zt3we(:,jh,jk,jl,jf,2) 194 194 ARRAY_IN(iihom+jh,:,jk,jl,jf) = zt3ew(:,jh,jk,jl,jf,2) … … 201 201 DO jl = 1, ipl 202 202 DO jk = 1, ipk 203 DO jh = 1, jpreci203 DO jh = 1, nn_hls 204 204 ARRAY_IN(jh ,:,jk,jl,jf) = zt3we(:,jh,jk,jl,jf,2) 205 205 END DO … … 218 218 DO jl = 1, ipl 219 219 DO jk = 1, ipk 220 DO jh = 1, jprecj220 DO jh = 1, nn_hls 221 221 zt3sn(:,jh,jk,jl,jf,1) = ARRAY_IN(:,ijhom +jh,jk,jl,jf) 222 zt3ns(:,jh,jk,jl,jf,1) = ARRAY_IN(:, jprecj+jh,jk,jl,jf)222 zt3ns(:,jh,jk,jl,jf,1) = ARRAY_IN(:,nn_hls+jh,jk,jl,jf) 223 223 END DO 224 224 END DO … … 228 228 ! 229 229 ! ! Migrations 230 imigr = jprecj* jpi * ipk * ipl * ipf230 imigr = nn_hls * jpi * ipk * ipl * ipf 231 231 ! 232 232 SELECT CASE ( nbondj ) … … 249 249 ! 250 250 ! ! Write Dirichlet lateral conditions 251 ijhom = nlcj- jprecj251 ijhom = nlcj-nn_hls 252 252 ! 253 253 SELECT CASE ( nbondj ) … … 256 256 DO jl = 1, ipl 257 257 DO jk = 1, ipk 258 DO jh = 1, jprecj258 DO jh = 1, nn_hls 259 259 ARRAY_IN(:,ijhom+jh,jk,jl,jf) = zt3ns(:,jh,jk,jl,jf,2) 260 260 END DO … … 266 266 DO jl = 1, ipl 267 267 DO jk = 1, ipk 268 DO jh = 1, jprecj268 DO jh = 1, nn_hls 269 269 ARRAY_IN(:, jh,jk,jl,jf) = zt3sn(:,jh,jk,jl,jf,2) 270 270 ARRAY_IN(:,ijhom+jh,jk,jl,jf) = zt3ns(:,jh,jk,jl,jf,2) … … 277 277 DO jl = 1, ipl 278 278 DO jk = 1, ipk 279 DO jh = 1, jprecj279 DO jh = 1, nn_hls 280 280 ARRAY_IN(:,jh,jk,jl,jf) = zt3sn(:,jh,jk,jl,jf,2) 281 281 END DO -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/mpp_nfd_generic.h90
r8882 r9012 73 73 ipj = 4 ! 2nd dimension of message transfers (last j-lines) 74 74 ! 75 ALLOCATE( znorthloc(jpi ,4,ipk,ipl,ipf) )75 ALLOCATE( znorthloc(jpimax,4,ipk,ipl,ipf) ) 76 76 ! 77 77 znorthloc(:,:,:,:,:) = 0._wp … … 82 82 DO jj = nlcj - ipj +1, nlcj 83 83 ij = jj - nlcj + ipj 84 znorthloc( :,ij,jk,jl,jf) = ARRAY_IN(:,jj,jk,jl,jf)84 znorthloc(1:jpi,ij,jk,jl,jf) = ARRAY_IN(1:jpi,jj,jk,jl,jf) 85 85 END DO 86 86 END DO … … 89 89 ! 90 90 ! 91 itaille = jpi * ipj * ipk * ipl * ipf91 itaille = jpimax * ipj * ipk * ipl * ipf 92 92 ! 93 93 IF( l_north_nogather ) THEN !== ???? ==! … … 177 177 ELSE !== ???? ==! 178 178 ALLOCATE( ztab (jpiglo,4,ipk,ipl,ipf ) ) 179 ALLOCATE( znorthgloio(jpi 179 ALLOCATE( znorthgloio(jpimax,4,ipk,ipl,ipf,jpni) ) 180 180 ! 181 181 CALL MPI_ALLGATHER( znorthloc , itaille, MPI_DOUBLE_PRECISION, & … … 222 222 ENDIF 223 223 ! 224 ! The ztab array has been either:225 ! a. Fully populated by the mpi_allgather operation or226 ! b. Had the active points for this domain and northern neighbours populated227 ! by peer to peer exchanges228 ! Either way the array may be folded by lbc_nfd and the result for the span of229 ! this domain will be identical.230 !231 224 DEALLOCATE( znorthloc ) 232 225 ! -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90
r7646 r9012 1 1 MODULE mppini 2 !!====================================================================== ========2 !!====================================================================== 3 3 !! *** MODULE mppini *** 4 4 !! Ocean initialization : distributed memory computing initialization 5 !!============================================================================== 6 7 !!---------------------------------------------------------------------- 8 !! mpp_init : Lay out the global domain over processors 9 !! mpp_init2 : Lay out the global domain over processors 10 !! with land processor elimination 11 !! mpp_init_ioispl: IOIPSL initialization in mpp 12 !!---------------------------------------------------------------------- 13 USE dom_oce ! ocean space and time domain 14 USE in_out_manager ! I/O Manager 15 USE lib_mpp ! distribued memory computing library 16 USE ioipsl 5 !!====================================================================== 6 !! History : 6.0 ! 1994-11 (M. Guyon) Original code 7 !! OPA 7.0 ! 1995-04 (J. Escobar, M. Imbard) 8 !! 8.0 ! 1998-05 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI versions 9 !! NEMO 1.0 ! 2004-01 (G. Madec, J.M Molines) F90 : free form , north fold jpni > 1 10 !! 4.0 ! 2016-06 (G. Madec) use domain configuration file instead of bathymetry file 11 !! 4.0 ! 2017-06 (J.M. Molines, T. Lovato) merge of mppini and mppini_2 12 !!---------------------------------------------------------------------- 13 14 !!---------------------------------------------------------------------- 15 !! mpp_init : Lay out the global domain over processors with/without land processor elimination 16 !! mpp_init_mask : 17 !! mpp_init_ioipsl: IOIPSL initialization in mpp 18 !!---------------------------------------------------------------------- 19 USE dom_oce ! ocean space and time domain 20 USE bdy_oce ! open BounDarY 21 ! 22 USE lib_mpp ! distribued memory computing library 23 USE iom ! nemo I/O library 24 USE ioipsl ! I/O IPSL library 25 USE in_out_manager ! I/O Manager 17 26 18 27 IMPLICIT NONE … … 20 29 21 30 PUBLIC mpp_init ! called by opa.F90 22 PUBLIC mpp_init2 ! called by opa.F90 23 24 !!---------------------------------------------------------------------- 25 !! NEMO/OPA 3.3 , NEMO Consortium (2010) 31 32 !!---------------------------------------------------------------------- 33 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 26 34 !! $Id$ 27 35 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 41 49 !! 42 50 !! ** Method : Shared memory computing, set the local processor 43 !! variables to the value of the global domain 44 !! 45 !! History : 46 !! 9.0 ! 04-01 (G. Madec, J.M. Molines) F90 : free form, north fold jpni >1 47 !!---------------------------------------------------------------------- 48 49 ! No mpp computation 50 nimpp = 1 51 !! variables to the value of the global domain 52 !!---------------------------------------------------------------------- 53 ! 54 nimpp = 1 ! 51 55 njmpp = 1 52 56 nlci = jpi … … 61 65 nidom = FLIO_DOM_NONE 62 66 npolj = jperio 63 67 ! 64 68 IF(lwp) THEN 65 69 WRITE(numout,*) 66 WRITE(numout,*) 'mpp_init(2) : NO massively parallel processing' 67 WRITE(numout,*) '~~~~~~~~~~~ ' 68 WRITE(numout,*) ' nperio = ', nperio 69 WRITE(numout,*) ' npolj = ', npolj 70 WRITE(numout,*) ' nimpp = ', nimpp 71 WRITE(numout,*) ' njmpp = ', njmpp 72 ENDIF 73 74 IF( jpni /= 1 .OR. jpnj /= 1 .OR. jpnij /= 1 ) & 75 CALL ctl_stop( 'equality jpni = jpnj = jpnij = 1 is not satisfied', & 76 & 'the domain is lay out for distributed memory computing! ' ) 77 78 IF( jperio == 7 ) CALL ctl_stop( ' jperio = 7 needs distributed memory computing ', & 79 & ' with 1 process. Add key_mpp_mpi in the list of active cpp keys ' ) 70 WRITE(numout,*) 'mpp_init : NO massively parallel processing' 71 WRITE(numout,*) '~~~~~~~~ ' 72 WRITE(numout,*) ' nperio = ', nperio, ' nimpp = ', nimpp 73 WRITE(numout,*) ' npolj = ', npolj , ' njmpp = ', njmpp 74 ENDIF 75 ! 76 IF( jpni /= 1 .OR. jpnj /= 1 .OR. jpnij /= 1 ) & 77 CALL ctl_stop( 'mpp_init: equality jpni = jpnj = jpnij = 1 is not satisfied', & 78 & 'the domain is lay out for distributed memory computing!' ) 79 ! 80 IF( jperio == 7 ) CALL ctl_stop( 'mpp_init: jperio = 7 needs distributed memory computing ', & 81 & 'with 1 process. Add key_mpp_mpi in the list of active cpp keys ' ) 82 ! 80 83 END SUBROUTINE mpp_init 81 84 82 83 SUBROUTINE mpp_init284 CALL mpp_init ! same routine as mpp_init85 END SUBROUTINE mpp_init286 87 85 #else 88 86 !!---------------------------------------------------------------------- 89 !! 'key_mpp_mpi' ORMPI massively parallel processing87 !! 'key_mpp_mpi' MPI massively parallel processing 90 88 !!---------------------------------------------------------------------- 91 89 … … 95 93 !! 96 94 !! ** Purpose : Lay out the global domain over processors. 95 !! If land processors are to be eliminated, this program requires the 96 !! presence of the domain configuration file. Land processors elimination 97 !! is performed if jpni x jpnj /= jpnij. In this case, using the MPP_PREP 98 !! preprocessing tool, help for defining the best cutting out. 97 99 !! 98 100 !! ** Method : Global domain is distributed in smaller local domains. … … 103 105 !! nperio local periodic condition 104 106 !! 105 !! ** Action 107 !! ** Action : - set domain parameters 106 108 !! nimpp : longitudinal index 107 109 !! njmpp : latitudinal index … … 117 119 !! noso : number for local neighboring processor 118 120 !! nono : number for local neighboring processor 119 !! 120 !! History : 121 !! ! 94-11 (M. Guyon) Original code 122 !! ! 95-04 (J. Escobar, M. Imbard) 123 !! ! 98-02 (M. Guyon) FETI method 124 !! ! 98-05 (M. Imbard, J. Escobar, L. Colombet ) SHMEM and MPI versions 125 !! 8.5 ! 02-08 (G. Madec) F90 : free form 126 !! 3.4 ! 11-11 (C. Harris) decomposition changes for running with CICE 127 !!---------------------------------------------------------------------- 128 INTEGER :: ji, jj, jn ! dummy loop indices 129 INTEGER :: ii, ij, ifreq, il1, il2 ! local integers 130 INTEGER :: iresti, irestj, ijm1, imil, inum ! - - 131 REAL(wp) :: zidom, zjdom ! local scalars 132 INTEGER, DIMENSION(jpni,jpnj) :: iimppt, ijmppt, ilcit, ilcjt ! local workspace 133 !!---------------------------------------------------------------------- 134 135 IF(lwp) WRITE(numout,*) 136 IF(lwp) WRITE(numout,*) 'mpp_init : Message Passing MPI' 137 IF(lwp) WRITE(numout,*) '~~~~~~~~' 138 139 121 !!---------------------------------------------------------------------- 122 INTEGER :: ji, jj, jn, jproc, jarea ! dummy loop indices 123 INTEGER :: inum ! local logical unit 124 INTEGER :: idir, ifreq, icont, isurf ! local integers 125 INTEGER :: ii, il1, ili, imil ! - - 126 INTEGER :: ij, il2, ilj, ijm1 ! - - 127 INTEGER :: iino, ijno, iiso, ijso ! - - 128 INTEGER :: iiea, ijea, iiwe, ijwe ! - - 129 INTEGER :: iresti, irestj, iproc ! - - 130 INTEGER, DIMENSION(jpnij) :: iin, ii_nono, ii_noea ! 1D workspace 131 INTEGER, DIMENSION(jpnij) :: ijn, ii_noso, ii_nowe ! - - 132 INTEGER, DIMENSION(jpni,jpnj) :: iimppt, ilci, ibondi, ipproc ! 2D workspace 133 INTEGER, DIMENSION(jpni,jpnj) :: ijmppt, ilcj, ibondj, ipolj ! - - 134 INTEGER, DIMENSION(jpni,jpnj) :: ilei, ildi, iono, ioea ! - - 135 INTEGER, DIMENSION(jpni,jpnj) :: ilej, ildj, ioso, iowe ! - - 136 INTEGER, DIMENSION(jpiglo,jpjglo) :: imask ! 2D golbal domain workspace 137 REAL(wp) :: zidom, zjdom ! local scalars 138 !!---------------------------------------------------------------------- 139 ! 140 IF ( jpni * jpnj == jpnij ) THEN ! regular domain lay out over processors 141 imask(:,:) = 1 142 ELSEIF ( jpni*jpnj > jpnij ) THEN ! remove land-only processor (i.e. where imask(:,:)=0) 143 CALL mpp_init_mask( imask ) 144 ELSE ! error 145 CALL ctl_stop( 'mpp_init: jpnij > jpni x jpnj. Check namelist setting!' ) 146 ENDIF 147 ! 140 148 ! 1. Dimension arrays for subdomains 141 149 ! ----------------------------------- 142 ! Computation of local domain sizes ilci t() ilcjt()150 ! Computation of local domain sizes ilci() ilcj() 143 151 ! These dimensions depend on global sizes jpni,jpnj and jpiglo,jpjglo 144 ! The subdomains are squares leeser than or equal to the global 145 ! dimensions divided by the number of processors minus the overlap 146 ! array (cf. par_oce.F90). 147 148 nreci = 2 * jpreci 149 nrecj = 2 * jprecj 150 iresti = MOD( jpiglo - nreci , jpni ) 151 irestj = MOD( jpjglo - nrecj , jpnj ) 152 153 IF( iresti == 0 ) iresti = jpni 154 152 ! The subdomains are squares lesser than or equal to the global 153 ! dimensions divided by the number of processors minus the overlap array. 154 ! 155 nreci = 2 * nn_hls 156 nrecj = 2 * nn_hls 157 iresti = 1 + MOD( jpiglo - nreci -1 , jpni ) 158 irestj = 1 + MOD( jpjglo - nrecj -1 , jpnj ) 159 ! 160 ! Need to use jpimax and jpjmax here since jpi and jpj have already been 161 ! shrunk to local sizes in nemogcm 155 162 #if defined key_nemocice_decomp 156 ! In order to match CICE the size of domains in NEMO has to be changed 157 ! The last line of blocks (west) will have fewer points 158 159 DO jj = 1, jpnj 160 DO ji=1, jpni-1 161 ilcit(ji,jj) = jpi 162 END DO 163 ilcit(jpni,jj) = jpiglo - (jpni - 1) * (jpi - nreci) 164 END DO 165 163 ! Change padding to be consistent with CICE 164 ilci(1:jpni-1 ,:) = jpimax 165 ilci(jpni ,:) = jpiglo - (jpni - 1) * (jpimax - nreci) 166 ! 167 ilcj(:, 1:jpnj-1) = jpjmax 168 ilcj(:, jpnj) = jpjglo - (jpnj - 1) * (jpjmax - nrecj) 166 169 #else 167 168 DO jj = 1, jpnj 169 DO ji = 1, iresti 170 ilcit(ji,jj) = jpi 171 END DO 172 DO ji = iresti+1, jpni 173 ilcit(ji,jj) = jpi -1 174 END DO 175 END DO 176 170 ilci(1:iresti ,:) = jpimax 171 ilci(iresti+1:jpni ,:) = jpimax-1 172 173 ilcj(:, 1:irestj) = jpjmax 174 ilcj(:, irestj+1:jpnj) = jpjmax-1 177 175 #endif 178 nfilcit(:,:) = ilcit(:,:) 179 IF( irestj == 0 ) irestj = jpnj 180 181 #if defined key_nemocice_decomp 182 ! Same change to domains in North-South direction as in East-West. 183 DO ji=1,jpni 184 DO jj=1,jpnj-1 185 ilcjt(ji,jj) = jpj 186 END DO 187 ilcjt(ji,jpnj) = jpjglo - (jpnj - 1) * (jpj - nrecj) 188 END DO 189 190 #else 191 192 DO ji = 1, jpni 193 DO jj = 1, irestj 194 ilcjt(ji,jj) = jpj 195 END DO 196 DO jj = irestj+1, jpnj 197 ilcjt(ji,jj) = jpj -1 198 END DO 199 END DO 200 201 #endif 176 ! 177 nfilcit(:,:) = ilci(:,:) 178 ! 179 zidom = nreci + sum(ilci(:,1) - nreci ) 180 zjdom = nrecj + sum(ilcj(1,:) - nrecj ) 181 ! 182 IF(lwp) THEN 183 WRITE(numout,*) 184 WRITE(numout,*) 'mpp_init : MPI Message Passing MPI - domain lay out over processors' 185 WRITE(numout,*) '~~~~~~~~ ' 186 WRITE(numout,*) ' defines mpp subdomains' 187 WRITE(numout,*) ' iresti = ', iresti, ' jpni = ', jpni 188 WRITE(numout,*) ' irestj = ', irestj, ' jpnj = ', jpnj 189 WRITE(numout,*) 190 WRITE(numout,*) ' sum ilci(i,1) = ', zidom, ' jpiglo = ', jpiglo 191 WRITE(numout,*) ' sum ilcj(1,j) = ', zjdom, ' jpjglo = ', jpjglo 192 ENDIF 202 193 203 194 ! 2. Index arrays for subdomains 204 195 ! ------------------------------- 205 206 i imppt(:,:) =1207 i jmppt(:,:) =1208 196 iimppt(:,:) = 1 197 ijmppt(:,:) = 1 198 ipproc(:,:) = -1 199 ! 209 200 IF( jpni > 1 ) THEN 210 201 DO jj = 1, jpnj 211 202 DO ji = 2, jpni 212 iimppt(ji,jj) = iimppt(ji-1,jj) + ilci t(ji-1,jj) - nreci203 iimppt(ji,jj) = iimppt(ji-1,jj) + ilci(ji-1,jj) - nreci 213 204 END DO 214 205 END DO 215 206 ENDIF 216 nfiimpp(:,:) =iimppt(:,:)217 218 IF( jpnj > 1 ) 207 nfiimpp(:,:) = iimppt(:,:) 208 ! 209 IF( jpnj > 1 )THEN 219 210 DO jj = 2, jpnj 220 211 DO ji = 1, jpni 221 ijmppt(ji,jj) = ijmppt(ji,jj-1) +ilcjt(ji,jj-1)-nrecj212 ijmppt(ji,jj) = ijmppt(ji,jj-1) + ilcj(ji,jj-1) - nrecj 222 213 END DO 223 214 END DO 224 215 ENDIF 225 226 ! 3. Subdomain description 227 ! ------------------------ 228 229 DO jn = 1, jpnij 230 ii = 1 + MOD( jn-1, jpni ) 231 ij = 1 + (jn-1) / jpni 232 nfipproc(ii,ij) = jn - 1 233 nimppt(jn) = iimppt(ii,ij) 234 njmppt(jn) = ijmppt(ii,ij) 235 nlcit (jn) = ilcit (ii,ij) 236 nlci = nlcit (jn) 237 nlcjt (jn) = ilcjt (ii,ij) 238 nlcj = nlcjt (jn) 239 nbondj = -1 ! general case 240 IF( jn > jpni ) nbondj = 0 ! first row of processor 241 IF( jn > (jpnj-1)*jpni ) nbondj = 1 ! last row of processor 242 IF( jpnj == 1 ) nbondj = 2 ! one processor only in j-direction 243 ibonjt(jn) = nbondj 244 245 nbondi = 0 ! 246 IF( MOD( jn, jpni ) == 1 ) nbondi = -1 ! 247 IF( MOD( jn, jpni ) == 0 ) nbondi = 1 ! 248 IF( jpni == 1 ) nbondi = 2 ! one processor only in i-direction 249 ibonit(jn) = nbondi 250 251 nldi = 1 + jpreci 252 nlei = nlci - jpreci 253 IF( nbondi == -1 .OR. nbondi == 2 ) nldi = 1 254 IF( nbondi == 1 .OR. nbondi == 2 ) nlei = nlci 255 nldj = 1 + jprecj 256 nlej = nlcj - jprecj 257 IF( nbondj == -1 .OR. nbondj == 2 ) nldj = 1 258 IF( nbondj == 1 .OR. nbondj == 2 ) nlej = nlcj 259 nldit(jn) = nldi 260 nleit(jn) = nlei 261 nldjt(jn) = nldj 262 nlejt(jn) = nlej 216 217 ! 3. Subdomain description in the Regular Case 218 ! -------------------------------------------- 219 nperio = 0 220 icont = -1 221 DO jarea = 1, jpni*jpnj 222 ii = 1 + MOD(jarea-1,jpni) 223 ij = 1 + (jarea-1)/jpni 224 ili = ilci(ii,ij) 225 ilj = ilcj(ii,ij) 226 ibondj(ii,ij) = -1 227 IF( jarea > jpni ) ibondj(ii,ij) = 0 228 IF( jarea > (jpnj-1)*jpni ) ibondj(ii,ij) = 1 229 IF( jpnj == 1 ) ibondj(ii,ij) = 2 230 ibondi(ii,ij) = 0 231 IF( MOD(jarea,jpni) == 1 ) ibondi(ii,ij) = -1 232 IF( MOD(jarea,jpni) == 0 ) ibondi(ii,ij) = 1 233 IF( jpni == 1 ) ibondi(ii,ij) = 2 234 235 ! Subdomain neighbors 236 iproc = jarea - 1 237 ioso(ii,ij) = iproc - jpni 238 iowe(ii,ij) = iproc - 1 239 ioea(ii,ij) = iproc + 1 240 iono(ii,ij) = iproc + jpni 241 ildi(ii,ij) = 1 + nn_hls 242 ilei(ii,ij) = ili - nn_hls 243 244 IF( ibondi(ii,ij) == -1 .OR. ibondi(ii,ij) == 2 ) ildi(ii,ij) = 1 245 IF( ibondi(ii,ij) == 1 .OR. ibondi(ii,ij) == 2 ) ilei(ii,ij) = ili 246 ildj(ii,ij) = 1 + nn_hls 247 ilej(ii,ij) = ilj - nn_hls 248 IF( ibondj(ii,ij) == -1 .OR. ibondj(ii,ij) == 2 ) ildj(ii,ij) = 1 249 IF( ibondj(ii,ij) == 1 .OR. ibondj(ii,ij) == 2 ) ilej(ii,ij) = ilj 250 251 ! warning ii*ij (zone) /= nproc (processors)! 252 253 IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN 254 IF( jpni == 1 )THEN 255 ibondi(ii,ij) = 2 256 nperio = 1 257 ELSE 258 ibondi(ii,ij) = 0 259 ENDIF 260 IF( MOD(jarea,jpni) == 0 ) THEN 261 ioea(ii,ij) = iproc - (jpni-1) 262 ENDIF 263 IF( MOD(jarea,jpni) == 1 ) THEN 264 iowe(ii,ij) = iproc + jpni - 1 265 ENDIF 266 ENDIF 267 ipolj(ii,ij) = 0 268 IF( jperio == 3 .OR. jperio == 4 ) THEN 269 ijm1 = jpni*(jpnj-1) 270 imil = ijm1+(jpni+1)/2 271 IF( jarea > ijm1 ) ipolj(ii,ij) = 3 272 IF( MOD(jpni,2) == 1 .AND. jarea == imil ) ipolj(ii,ij) = 4 273 IF( ipolj(ii,ij) == 3 ) iono(ii,ij) = jpni*jpnj-jarea+ijm1 ! MPI rank of northern neighbour 274 ENDIF 275 IF( jperio == 5 .OR. jperio == 6 ) THEN 276 ijm1 = jpni*(jpnj-1) 277 imil = ijm1+(jpni+1)/2 278 IF( jarea > ijm1) ipolj(ii,ij) = 5 279 IF( MOD(jpni,2) == 1 .AND. jarea == imil ) ipolj(ii,ij) = 6 280 IF( ipolj(ii,ij) == 5) iono(ii,ij) = jpni*jpnj-jarea+ijm1 ! MPI rank of northern neighbour 281 ENDIF 282 ! 283 ! Check wet points over the entire domain to preserve the MPI communication stencil 284 isurf = 0 285 DO jj = 1, ilj 286 DO ji = 1, ili 287 IF( imask(ji+iimppt(ii,ij)-1, jj+ijmppt(ii,ij)-1) == 1) isurf = isurf+1 288 END DO 289 END DO 290 ! 291 IF( isurf /= 0 ) THEN 292 icont = icont + 1 293 ipproc(ii,ij) = icont 294 iin(icont+1) = ii 295 ijn(icont+1) = ij 296 ENDIF 263 297 END DO 298 ! 299 nfipproc(:,:) = ipproc(:,:) 300 301 ! Check potential error 302 IF( icont+1 /= jpnij ) THEN 303 WRITE(ctmp1,*) ' jpni =',jpni,' jpnj =',jpnj 304 WRITE(ctmp2,*) ' jpnij =',jpnij, '< jpni x jpnj' 305 WRITE(ctmp3,*) ' ***********, mpp_init2 finds jpnij=',icont+1 306 CALL ctl_stop( 'mpp_init: Eliminate land processors algorithm', '', ctmp1, ctmp2, '', ctmp3 ) 307 ENDIF 264 308 265 309 ! 4. Subdomain print 266 310 ! ------------------ 267 268 IF(lwp) WRITE(numout,*)269 IF(lwp) WRITE(numout,*) ' defines mpp subdomains'270 IF(lwp) WRITE(numout,*) ' jpni=', jpni, ' iresti=', iresti271 IF(lwp) WRITE(numout,*) ' jpnj=', jpnj, ' irestj=', irestj272 zidom = nreci273 DO ji = 1, jpni274 zidom = zidom + ilcit(ji,1) - nreci275 END DO276 IF(lwp) WRITE(numout,*)277 IF(lwp) WRITE(numout,*)' sum ilcit(i,1)=', zidom, ' jpiglo=', jpiglo278 279 zjdom = nrecj280 DO jj = 1, jpnj281 zjdom = zjdom + ilcjt(1,jj) - nrecj282 END DO283 IF(lwp) WRITE(numout,*)' sum ilcit(1,j)=', zjdom, ' jpjglo=', jpjglo284 285 311 IF(lwp) THEN 286 312 ifreq = 4 287 il1 313 il1 = 1 288 314 DO jn = 1, (jpni-1)/ifreq+1 289 il2 = MIN( jpni, il1+ifreq-1)315 il2 = MIN(jpni,il1+ifreq-1) 290 316 WRITE(numout,*) 291 WRITE(numout,9 200) ('***',ji =il1,il2-1)317 WRITE(numout,9400) ('***',ji=il1,il2-1) 292 318 DO jj = jpnj, 1, -1 293 WRITE(numout,9 203) (' ',ji =il1,il2-1)294 WRITE(numout,9 202) jj, ( ilcit(ji,jj),ilcjt(ji,jj),ji = il1,il2)295 WRITE(numout,9 204) (nfipproc(ji,jj),ji=il1,il2)296 WRITE(numout,9 203) (' ',ji =il1,il2-1)297 WRITE(numout,9 200) ('***',ji =il1,il2-1)319 WRITE(numout,9403) (' ',ji=il1,il2-1) 320 WRITE(numout,9402) jj, (ilci(ji,jj),ilcj(ji,jj),ji=il1,il2) 321 WRITE(numout,9404) (ipproc(ji,jj),ji=il1,il2) 322 WRITE(numout,9403) (' ',ji=il1,il2-1) 323 WRITE(numout,9400) ('***',ji=il1,il2-1) 298 324 END DO 299 WRITE(numout,9 201) (ji,ji =il1,il2)325 WRITE(numout,9401) (ji,ji=il1,il2) 300 326 il1 = il1+ifreq 301 327 END DO 302 9200 FORMAT(' ***',20('*************',a3)) 303 9203 FORMAT(' * ',20(' * ',a3)) 304 9201 FORMAT(' ',20(' ',i3,' ')) 305 9202 FORMAT(' ',i3,' * ',20(i3,' x',i3,' * ')) 306 9204 FORMAT(' * ',20(' ',i3,' * ')) 307 ENDIF 308 309 ! 5. From global to local 310 ! ----------------------- 311 312 nperio = 0 313 IF( jperio == 2 .AND. nbondj == -1 ) nperio = 2 314 315 316 ! 6. Subdomain neighbours 328 9400 FORMAT(' ***',20('*************',a3)) 329 9403 FORMAT(' * ',20(' * ',a3)) 330 9401 FORMAT(' ',20(' ',i3,' ')) 331 9402 FORMAT(' ',i3,' * ',20(i3,' x',i3,' * ')) 332 9404 FORMAT(' * ',20(' ',i3,' * ')) 333 ENDIF 334 335 ! 5. neighbour treatment 317 336 ! ---------------------- 318 319 nproc = narea - 1 320 noso = nproc - jpni 321 nowe = nproc - 1 322 noea = nproc + 1 323 nono = nproc + jpni 324 ! great neighbours 325 npnw = nono - 1 326 npne = nono + 1 327 npsw = noso - 1 328 npse = noso + 1 329 nbsw = 1 330 nbnw = 1 331 IF( MOD( nproc, jpni ) == 0 ) THEN 332 nbsw = 0 333 nbnw = 0 334 ENDIF 335 nbse = 1 336 nbne = 1 337 IF( MOD( nproc, jpni ) == jpni-1 ) THEN 338 nbse = 0 339 nbne = 0 340 ENDIF 341 IF(nproc < jpni) THEN 342 nbsw = 0 343 nbse = 0 344 ENDIF 345 IF( nproc >= (jpnj-1)*jpni ) THEN 346 nbnw = 0 347 nbne = 0 348 ENDIF 349 nlcj = nlcjt(narea) 350 nlci = nlcit(narea) 351 nldi = nldit(narea) 352 nlei = nleit(narea) 353 nldj = nldjt(narea) 354 nlej = nlejt(narea) 355 nbondi = ibonit(narea) 356 nbondj = ibonjt(narea) 357 nimpp = nimppt(narea) 358 njmpp = njmppt(narea) 359 360 ! Save processor layout in layout.dat file 361 IF(lwp) THEN 337 DO jarea = 1, jpni*jpnj 338 iproc = jarea-1 339 ii = 1 + MOD( jarea-1 , jpni ) 340 ij = 1 + (jarea-1) / jpni 341 IF ( ipproc(ii,ij) == -1 .AND. 0 <= iono(ii,ij) .AND. iono(ii,ij) <= jpni*jpnj-1 ) THEN 342 iino = 1 + MOD( iono(ii,ij) , jpni ) 343 ijno = 1 + iono(ii,ij) / jpni 344 ! Need to reverse the logical direction of communication 345 ! for northern neighbours of northern row processors (north-fold) 346 ! i.e. need to check that the northern neighbour only communicates 347 ! to the SOUTH (or not at all) if this area is land-only (#1057) 348 idir = 1 349 IF( ij == jpnj .AND. ijno == jpnj ) idir = -1 350 IF( ibondj(iino,ijno) == idir ) ibondj(iino,ijno) = 2 351 IF( ibondj(iino,ijno) == 0 ) ibondj(iino,ijno) = -idir 352 ENDIF 353 IF( ipproc(ii,ij) == -1 .AND. 0 <= ioso(ii,ij) .AND. ioso(ii,ij) <= jpni*jpnj-1 ) THEN 354 iiso = 1 + MOD( ioso(ii,ij) , jpni ) 355 ijso = 1 + ioso(ii,ij) / jpni 356 IF( ibondj(iiso,ijso) == -1 ) ibondj(iiso,ijso) = 2 357 IF( ibondj(iiso,ijso) == 0 ) ibondj(iiso,ijso) = 1 358 ENDIF 359 IF( ipproc(ii,ij) == -1 .AND. 0 <= ioea(ii,ij) .AND. ioea(ii,ij) <= jpni*jpnj-1 ) THEN 360 iiea = 1 + MOD( ioea(ii,ij) , jpni ) 361 ijea = 1 + ioea(ii,ij) / jpni 362 IF( ibondi(iiea,ijea) == 1 ) ibondi(iiea,ijea) = 2 363 IF( ibondi(iiea,ijea) == 0 ) ibondi(iiea,ijea) = -1 364 ENDIF 365 IF( ipproc(ii,ij) == -1 .AND. 0 <= iowe(ii,ij) .AND. iowe(ii,ij) <= jpni*jpnj-1) THEN 366 iiwe = 1 + MOD( iowe(ii,ij) , jpni ) 367 ijwe = 1 + iowe(ii,ij) / jpni 368 IF( ibondi(iiwe,ijwe) == -1 ) ibondi(iiwe,ijwe) = 2 369 IF( ibondi(iiwe,ijwe) == 0 ) ibondi(iiwe,ijwe) = 1 370 ENDIF 371 END DO 372 373 ! just to save nono etc for all proc 374 ii_noso(:) = -1 375 ii_nono(:) = -1 376 ii_noea(:) = -1 377 ii_nowe(:) = -1 378 nproc = narea-1 379 DO jarea = 1, jpnij 380 ii = iin(jarea) 381 ij = ijn(jarea) 382 IF( 0 <= ioso(ii,ij) .AND. ioso(ii,ij) <= (jpni*jpnj-1) ) THEN 383 iiso = 1 + MOD( ioso(ii,ij) , jpni ) 384 ijso = 1 + ioso(ii,ij) / jpni 385 noso = ipproc(iiso,ijso) 386 ii_noso(jarea)= noso 387 ENDIF 388 IF( 0 <= iowe(ii,ij) .AND. iowe(ii,ij) <= (jpni*jpnj-1) ) THEN 389 iiwe = 1 + MOD( iowe(ii,ij) , jpni ) 390 ijwe = 1 + iowe(ii,ij) / jpni 391 nowe = ipproc(iiwe,ijwe) 392 ii_nowe(jarea)= nowe 393 ENDIF 394 IF( 0 <= ioea(ii,ij) .AND. ioea(ii,ij) <= (jpni*jpnj-1) ) THEN 395 iiea = 1 + MOD( ioea(ii,ij) , jpni ) 396 ijea = 1 + ioea(ii,ij) / jpni 397 noea = ipproc(iiea,ijea) 398 ii_noea(jarea)= noea 399 ENDIF 400 IF( 0 <= iono(ii,ij) .AND. iono(ii,ij) <= (jpni*jpnj-1) ) THEN 401 iino = 1 + MOD( iono(ii,ij) , jpni ) 402 ijno = 1 + iono(ii,ij) / jpni 403 nono = ipproc(iino,ijno) 404 ii_nono(jarea)= nono 405 ENDIF 406 END DO 407 408 ! 6. Change processor name 409 ! ------------------------ 410 nproc = narea-1 411 ii = iin(narea) 412 ij = ijn(narea) 413 ! 414 ! set default neighbours 415 noso = ii_noso(narea) 416 nowe = ii_nowe(narea) 417 noea = ii_noea(narea) 418 nono = ii_nono(narea) 419 nlcj = ilcj(ii,ij) 420 nlci = ilci(ii,ij) 421 nldi = ildi(ii,ij) 422 nlei = ilei(ii,ij) 423 nldj = ildj(ii,ij) 424 nlej = ilej(ii,ij) 425 nbondi = ibondi(ii,ij) 426 nbondj = ibondj(ii,ij) 427 nimpp = iimppt(ii,ij) 428 njmpp = ijmppt(ii,ij) 429 DO jproc = 1, jpnij 430 ii = iin(jproc) 431 ij = ijn(jproc) 432 nimppt(jproc) = iimppt(ii,ij) 433 njmppt(jproc) = ijmppt(ii,ij) 434 nlcjt(jproc) = ilcj(ii,ij) 435 nlcit(jproc) = ilci(ii,ij) 436 nldit(jproc) = ildi(ii,ij) 437 nleit(jproc) = ilei(ii,ij) 438 nldjt(jproc) = ildj(ii,ij) 439 nlejt(jproc) = ilej(ii,ij) 440 END DO 441 442 ! Save processor layout in ascii file 443 IF (lwp) THEN 362 444 CALL ctl_opn( inum, 'layout.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea ) 363 WRITE(inum,'(a)') ' jpnij jpi jpj jpk jpiglo jpjglo' 364 WRITE(inum,'(6i8)') jpnij,jpi,jpj,jpk,jpiglo,jpjglo 365 WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimpp njmpp' 366 ! 367 DO jn = 1, jpnij 368 WRITE(inum,'(9i5)') jn, nlcit(jn), nlcjt(jn), & 369 & nldit(jn), nldjt(jn), & 370 & nleit(jn), nlejt(jn), & 371 & nimppt(jn), njmppt(jn) 445 WRITE(inum,'(a)') ' jpnij jpimax jpjmax jpk jpiglo jpjglo'//& 446 & ' ( local: narea jpi jpj)' 447 WRITE(inum,'(6i8,a,3i8,a)') jpnij,jpimax,jpjmax,jpk,jpiglo,jpjglo,& 448 & ' ( local: ',narea,jpi,jpj,' )' 449 WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimp njmp nono noso nowe noea nbondi nbondj ' 450 451 DO jproc = 1, jpnij 452 ii = iin(jproc) 453 ij = ijn(jproc) 454 WRITE(inum,'(15i5)') jproc-1, nlcit (jproc), nlcjt (jproc), & 455 & nldit (jproc), nldjt (jproc), & 456 & nleit (jproc), nlejt (jproc), & 457 & nimppt (jproc), njmppt (jproc), & 458 & ii_nono(jproc), ii_noso(jproc), & 459 & ii_nowe(jproc), ii_noea(jproc), & 460 & ibondi (ii,ij), ibondj (ii,ij) 372 461 END DO 373 462 CLOSE(inum) 374 463 END IF 375 464 376 ! w a r n i n g narea (zone) /= nproc (processors)! 377 378 IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7 ) THEN 379 IF( jpni == 1 )THEN 380 nbondi = 2 381 nperio = 1 382 ELSE 383 nbondi = 0 384 ENDIF 385 IF( MOD( narea, jpni ) == 0 ) THEN 386 noea = nproc-(jpni-1) 387 npne = npne-jpni 388 npse = npse-jpni 389 ENDIF 390 IF( MOD( narea, jpni ) == 1 ) THEN 391 nowe = nproc+(jpni-1) 392 npnw = npnw+jpni 393 npsw = npsw+jpni 394 ENDIF 395 nbsw = 1 396 nbnw = 1 397 nbse = 1 398 nbne = 1 399 IF( nproc < jpni ) THEN 400 nbsw = 0 401 nbse = 0 402 ENDIF 403 IF( nproc >= (jpnj-1)*jpni ) THEN 404 nbnw = 0 405 nbne = 0 406 ENDIF 407 ENDIF 465 ! ! north fold parameter 466 ! Defined npolj, either 0, 3 , 4 , 5 , 6 467 ! In this case the important thing is that npolj /= 0 468 ! Because if we go through these line it is because jpni >1 and thus 469 ! we must use lbcnorthmpp, which tests only npolj =0 or npolj /= 0 408 470 npolj = 0 471 ij = ijn(narea) 409 472 IF( jperio == 3 .OR. jperio == 4 ) THEN 410 ijm1 = jpni*(jpnj-1) 411 imil = ijm1+(jpni+1)/2 412 IF( narea > ijm1 ) npolj = 3 413 IF( MOD(jpni,2) == 1 .AND. narea == imil ) npolj = 4 414 IF( npolj == 3 ) nono = jpni*jpnj-narea+ijm1 473 IF( ij == jpnj ) npolj = 3 415 474 ENDIF 416 475 IF( jperio == 5 .OR. jperio == 6 ) THEN 417 ijm1 = jpni*(jpnj-1) 418 imil = ijm1+(jpni+1)/2 419 IF( narea > ijm1) npolj = 5 420 IF( MOD(jpni,2) == 1 .AND. narea == imil ) npolj = 6 421 IF( npolj == 5 ) nono = jpni*jpnj-narea+ijm1 422 ENDIF 423 424 ! Periodicity : no corner if nbondi = 2 and nperio != 1 425 476 IF( ij == jpnj ) npolj = 5 477 ENDIF 478 ! 426 479 IF(lwp) THEN 427 WRITE(numout,*) ' nproc = ', nproc428 WRITE(numout,*) ' nowe = ', nowe , ' noea = ', noea429 WRITE(numout,*) ' nono = ', nono , ' noso = ', noso430 WRITE(numout,*) ' nbondi = ', nbondi, ' nbondj = ', nbondj431 WRITE(numout,*) ' npolj = ', npolj432 WRITE(numout,*) ' nperio = ', nperio433 WRITE(numout,*) ' nlci = ', nlci , ' nlcj = ', nlcj434 WRITE(numout,*) ' nimpp = ', nimpp , ' njmpp = ', njmpp435 WRITE(numout,*) ' nreci = ', nreci , ' npse = ', npse436 WRITE(numout,*) ' nrecj = ', nrecj , ' npsw = ', npsw437 WRITE(numout,*) ' jpreci = ', jpreci, ' npne = ', npne438 WRITE(numout,*) ' jprecj = ', jprecj, ' npnw = ', npnw439 480 WRITE(numout,*) 440 ENDIF 441 442 IF( jperio == 7 .AND. ( jpni /= 1 .OR. jpnj /= 1 ) ) & 443 & CALL ctl_stop( ' mpp_init: error jperio = 7 works only with jpni = jpnj = 1' ) 444 IF( nperio == 1 .AND. jpni /= 1 ) CALL ctl_stop( ' mpp_init: error on cyclicity' ) 445 446 ! Prepare mpp north fold 447 481 WRITE(numout,*) ' nproc = ', nproc 482 WRITE(numout,*) ' nowe = ', nowe , ' noea = ', noea 483 WRITE(numout,*) ' nono = ', nono , ' noso = ', noso 484 WRITE(numout,*) ' nbondi = ', nbondi 485 WRITE(numout,*) ' nbondj = ', nbondj 486 WRITE(numout,*) ' npolj = ', npolj 487 WRITE(numout,*) ' nperio = ', nperio 488 WRITE(numout,*) ' nlci = ', nlci 489 WRITE(numout,*) ' nlcj = ', nlcj 490 WRITE(numout,*) ' nimpp = ', nimpp 491 WRITE(numout,*) ' njmpp = ', njmpp 492 WRITE(numout,*) ' nreci = ', nreci 493 WRITE(numout,*) ' nrecj = ', nrecj 494 WRITE(numout,*) ' nn_hls = ', nn_hls 495 ENDIF 496 497 IF( nperio == 1 .AND. jpni /= 1 ) CALL ctl_stop( 'mpp_init: error on cyclicity' ) 498 499 ! ! Prepare mpp north fold 448 500 IF( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN 449 501 CALL mpp_ini_north 450 502 IF(lwp) WRITE(numout,*) ' mpp_init : North fold boundary prepared for jpni >1' 451 503 ENDIF 452 453 ! Prepare NetCDF output file (if necessary) 454 CALL mpp_init_ioipsl 455 456 END SUBROUTINE mpp_init 457 458 # include "mppini_2.h90" 504 ! 505 CALL mpp_init_ioipsl ! Prepare NetCDF output file (if necessary) 506 ! 507 END SUBROUTINE mpp_init 508 509 510 SUBROUTINE mpp_init_mask( kmask ) 511 !!---------------------------------------------------------------------- 512 !! *** ROUTINE mpp_init_mask *** 513 !! 514 !! ** Purpose : Read relevant bathymetric information in a global array 515 !! in order to provide a land/sea mask used for the elimination 516 !! of land domains, in an mpp computation. 517 !! 518 !! ** Method : Read the namelist ln_zco and ln_isfcav in namelist namzgr 519 !! in order to choose the correct bathymetric information 520 !! (file and variables) 521 !!---------------------------------------------------------------------- 522 INTEGER, DIMENSION(jpiglo,jpjglo), INTENT(out) :: kmask ! global domain 523 524 INTEGER :: inum !: logical unit for configuration file 525 INTEGER :: ios !: iostat error flag 526 INTEGER :: ijstartrow ! temporary integers 527 REAL(wp), DIMENSION(jpiglo,jpjglo) :: zbot, zbdy ! global workspace 528 REAL(wp) :: zidom , zjdom ! local scalars 529 NAMELIST/nambdy/ ln_bdy, nb_bdy, ln_coords_file, cn_coords_file, & 530 & ln_mask_file, cn_mask_file, cn_dyn2d, nn_dyn2d_dta, & 531 & cn_dyn3d, nn_dyn3d_dta, cn_tra, nn_tra_dta, & 532 & ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, rn_time_dmp_out, & 533 & cn_ice_lim, nn_ice_lim_dta, & 534 & rn_ice_tem, rn_ice_sal, rn_ice_age, & 535 & ln_vol, nn_volctl, nn_rimwidth, nb_jpk_bdy 536 !!---------------------------------------------------------------------- 537 ! 0. initialisation 538 ! ----------------- 539 CALL iom_open( cn_domcfg, inum ) 540 ! 541 ! ocean bottom level 542 CALL iom_get( inum, jpdom_unknown, 'bottom_level' , zbot , lrowattr=ln_use_jattr ) ! nb of ocean T-points 543 ! 544 CALL iom_close( inum ) 545 ! 546 ! 2D ocean mask (=1 if at least one level of the water column is ocean, =0 otherwise) 547 WHERE( zbot(:,:) > 0 ) ; kmask(:,:) = 1 548 ELSEWHERE ; kmask(:,:) = 0 549 END WHERE 550 551 ! Adjust kmask with bdy_msk if it exists 552 553 REWIND( numnam_ref ) ! Namelist nambdy in reference namelist : BDY 554 READ ( numnam_ref, nambdy, IOSTAT = ios, ERR = 903) 555 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist (mppini)', lwp ) 556 557 REWIND( numnam_cfg ) ! Namelist nambdy in configuration namelist : BDY 558 READ ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 904 ) 559 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist (mppini)', lwp ) 560 561 IF( ln_bdy .AND. ln_mask_file ) THEN 562 CALL iom_open( cn_mask_file, inum ) 563 CALL iom_get ( inum, jpdom_unknown, 'bdy_msk', zbdy ) 564 CALL iom_close( inum ) 565 WHERE ( zbdy(:,:) <= 0. ) kmask = 0 566 ENDIF 567 ! 568 END SUBROUTINE mpp_init_mask 569 459 570 460 571 SUBROUTINE mpp_init_ioipsl -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/nemogcm.F90
r8974 r9012 235 235 INTEGER :: ji ! dummy loop indices 236 236 INTEGER :: ios, ilocal_comm ! local integer 237 INTEGER :: iiarea, ijarea ! local integers 238 INTEGER :: iirest, ijrest ! local integers 237 239 CHARACTER(len=120), DIMENSION(30) :: cltxt, cltxt2, clnam 238 240 ! … … 278 280 ENDIF 279 281 ! 280 jpk = jpkglo281 !282 #if defined key_agrif283 IF( .NOT. Agrif_Root() ) THEN ! AGRIF children: specific setting (cf. agrif_user.F90)284 jpiglo = nbcellsx + 2 + 2*nbghostcells285 jpjglo = nbcellsy + 2 + 2*nbghostcells286 jpi = ( jpiglo-2*jpreci + (jpni-1+0) ) / jpni + 2*jpreci287 jpj = ( jpjglo-2*jprecj + (jpnj-1+0) ) / jpnj + 2*jprecj288 nperio = 0289 jperio = 0290 ln_use_jattr = .false.291 ENDIF292 #endif293 282 ! 294 283 ! !--------------------------------------------! … … 349 338 #endif 350 339 ENDIF 340 ! 341 #if defined key_agrif 342 IF( .NOT. Agrif_Root() ) THEN ! AGRIF children: specific setting (cf. agrif_user.F90) 343 jpiglo = nbcellsx + 2 + 2*nbghostcells 344 jpjglo = nbcellsy + 2 + 2*nbghostcells 345 jpi = ( jpiglo-2*nn_hls + (jpni-1+0) ) / jpni + 2*nn_hls 346 jpj = ( jpjglo-2*nn_hls + (jpnj-1+0) ) / jpnj + 2*nn_hls 347 jpimax = jpi 348 jpjmax = jpj 349 nperio = 0 350 jperio = 0 351 ln_use_jattr = .false. 352 ENDIF 353 #endif 351 354 352 355 IF( Agrif_Root() ) THEN ! AGRIF mother: specific setting from jpni and jpnj 356 iiarea = 1 + MOD( narea - 1 , jpni ) 357 ijarea = 1 + ( narea - 1 ) / jpni 358 iirest = 1 + MOD( jpiglo - 2*nn_hls - 1 , jpni ) 359 ijrest = 1 + MOD( jpjglo - 2*nn_hls - 1 , jpnj ) 353 360 #if defined key_nemocice_decomp 354 jpi = ( nx_global+2-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 355 jpj = ( ny_global+2-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 361 jpi = ( nx_global+2-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 362 jpj = ( ny_global+2-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 363 jpimax = jpi 364 jpjmax = jpj 365 IF( iiarea == jpni ) jpi = jpiglo - (jpni - 1) * (jpi - 2*nn_hls) 366 IF( ijarea == jpnj ) jpj = jpjglo - (jpnj - 1) * (jpj - 2*nn_hls) 356 367 #else 357 jpi = ( jpiglo -2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 358 jpj = ( jpjglo -2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 359 #endif 360 ENDIF 361 362 !!gm ??? why here it has already been done in line 301 ! 368 jpi = ( jpiglo -2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 369 jpj = ( jpjglo -2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 370 jpimax = jpi 371 jpjmax = jpj 372 IF( iiarea > iirest ) jpi = jpi - 1 373 IF( ijarea > ijrest ) jpj = jpj - 1 374 #endif 375 ENDIF 376 363 377 jpk = jpkglo ! third dim 364 !!gm end365 378 366 379 #if defined key_agrif … … 409 422 410 423 ! ! Domain decomposition 411 IF( jpni*jpnj == jpnij ) THEN ; CALL mpp_init ! standard cutting out 412 ELSE ; CALL mpp_init2 ! eliminate land processors 413 ENDIF 424 CALL mpp_init 425 IF( ln_nnogather ) CALL nemo_northcomms! northfold neighbour lists (must be done after the masks are defined) 414 426 ! 415 427 IF( ln_timing ) CALL timing_init … … 422 434 CALL dom_init ! Domain 423 435 IF( ln_crs ) CALL crs_init ! coarsened grid: domain initialization 424 IF( ln_nnogather )CALL nemo_northcomms! northfold neighbour lists (must be done after the masks are defined)436 !IF( ln_nnogather ) CALL nemo_northcomms! northfold neighbour lists (must be done after the masks are defined) 425 437 IF( ln_ctl ) CALL prt_ctl_init ! Print control 426 438 -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/par_oce.F90
r7646 r9012 54 54 55 55 ! local domain size !!! * local computational domain * 56 INTEGER, PUBLIC :: jpi ! = ( jpiglo-2* jpreci + (jpni-1) ) / jpni + 2*jpreci!: first dimension57 INTEGER, PUBLIC :: jpj ! = ( jpjglo-2* jprecj + (jpnj-1) ) / jpnj + 2*jprecj!: second dimension56 INTEGER, PUBLIC :: jpi ! = ( jpiglo-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls !: first dimension 57 INTEGER, PUBLIC :: jpj ! = ( jpjglo-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls !: second dimension 58 58 INTEGER, PUBLIC :: jpk ! = jpkglo 59 59 INTEGER, PUBLIC :: jpim1 ! = jpi-1 !: inner domain indices … … 61 61 INTEGER, PUBLIC :: jpkm1 ! = jpk-1 !: - - - 62 62 INTEGER, PUBLIC :: jpij ! = jpi*jpj !: jpi x jpj 63 INTEGER, PUBLIC :: jpimax! = maximum jpi across all areas 64 INTEGER, PUBLIC :: jpjmax! = maximum jpj across all areas 63 65 64 66 !!--------------------------------------------------------------------- … … 78 80 INTEGER, PUBLIC, PARAMETER :: jpr2di = 0 !: number of columns for extra outer halo 79 81 INTEGER, PUBLIC, PARAMETER :: jpr2dj = 0 !: number of rows for extra outer halo 80 INTEGER, PUBLIC, PARAMETER :: jpreci = 1 !: number of columns for overlap 81 INTEGER, PUBLIC, PARAMETER :: jprecj = 1 !: number of rows for overlap 82 INTEGER, PUBLIC, PARAMETER :: nn_hls = 1 !: halo width (applies to both rows and columns) 82 83 83 84 !!---------------------------------------------------------------------- -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/SAO_SRC/nemogcm.F90
r8882 r9012 93 93 INTEGER :: ji ! dummy loop indices 94 94 INTEGER :: ios, ilocal_comm ! local integer 95 INTEGER :: iiarea, ijarea ! local integers 96 INTEGER :: iirest, ijrest ! local integers 95 97 CHARACTER(len=120), DIMENSION(30) :: cltxt, cltxt2, clnam 96 98 ! … … 209 211 #endif 210 212 ENDIF 213 ! 214 #if defined key_agrif 215 IF( .NOT. Agrif_Root() ) THEN ! AGRIF children: specific setting (cf. agrif_user.F90) 216 jpiglo = nbcellsx + 2 + 2*nbghostcells 217 jpjglo = nbcellsy + 2 + 2*nbghostcells 218 jpi = ( jpiglo-2*nn_hls + (jpni-1+0) ) / jpni + 2*nn_hls 219 jpj = ( jpjglo-2*nn_hls + (jpnj-1+0) ) / jpnj + 2*nn_hls 220 jpimax = jpi 221 jpjmax = jpj 222 nperio = 0 223 jperio = 0 224 ln_use_jattr = .false. 225 ENDIF 226 #endif 211 227 212 228 IF( Agrif_Root() ) THEN ! AGRIF mother: specific setting from jpni and jpnj 229 iiarea = 1 + MOD( narea - 1 , jpni ) 230 ijarea = 1 + ( narea - 1 ) / jpni 231 iirest = 1 + MOD( jpiglo - 2*nn_hls - 1 , jpni ) 232 ijrest = 1 + MOD( jpjglo - 2*nn_hls - 1 , jpnj ) 213 233 #if defined key_nemocice_decomp 214 jpi = ( nx_global+2-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 215 jpj = ( ny_global+2-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 234 jpi = ( nx_global+2-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 235 jpj = ( ny_global+2-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 236 jpimax = jpi 237 jpjmax = jpj 238 IF( iiarea == jpni ) jpi = jpiglo - (jpni - 1) * (jpi - 2*nn_hls) 239 IF( ijarea == jpnj ) jpj = jpjglo - (jpnj - 1) * (jpj - 2*nn_hls) 216 240 #else 217 jpi = ( jpiglo -2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 218 jpj = ( jpjglo -2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 219 #endif 220 ENDIF 221 222 !!gm ??? why here it has already been done in line 301 ! 241 jpi = ( jpiglo -2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 242 jpj = ( jpjglo -2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 243 jpimax = jpi 244 jpjmax = jpj 245 IF( iiarea > iirest ) jpi = jpi - 1 246 IF( ijarea > ijrest ) jpj = jpj - 1 247 #endif 248 ENDIF 249 223 250 jpk = jpkglo ! third dim 224 !!gm end 251 252 #if defined key_agrif 253 ! simple trick to use same vertical grid as parent but different number of levels: 254 ! Save maximum number of levels in jpkglo, then define all vertical grids with this number. 255 ! Suppress once vertical online interpolation is ok 256 IF(.NOT.Agrif_Root()) jpkglo = Agrif_Parent( jpkglo ) 257 #endif 225 258 jpim1 = jpi-1 ! inner domain indices 226 259 jpjm1 = jpj-1 ! " " 227 jpkm1 = jpk-1! " "260 jpkm1 = MAX( 1, jpk-1 ) ! " " 228 261 jpij = jpi*jpj ! jpi x j 229 262 … … 261 294 CALL nemo_ctl ! Control prints & Benchmark 262 295 263 ! ! Domain decomposition 264 IF( jpni*jpnj == jpnij ) THEN ; CALL mpp_init ! standard cutting out 265 ELSE ; CALL mpp_init2 ! eliminate land processors 266 ENDIF 296 ! ! Domain decomposition 297 CALL mpp_init 267 298 ! 268 299 IF( ln_timing ) CALL timing_init ! timing by routine … … 384 415 ! 385 416 IF( numstp /= -1 ) CLOSE( numstp ) ! time-step file 386 IF( num sol /= -1 ) CLOSE( numsol ) ! solverfile417 IF( numrun /= -1 ) CLOSE( numrun ) ! run statistics file 387 418 IF( numnam_ref /= -1 ) CLOSE( numnam_ref ) ! oce reference namelist 388 419 IF( numnam_cfg /= -1 ) CLOSE( numnam_cfg ) ! oce configuration namelist -
branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/SAS_SRC/nemogcm.F90
r8885 r9012 163 163 INTEGER :: ilocal_comm ! local integer 164 164 INTEGER :: ios, inum ! - - 165 INTEGER :: iiarea, ijarea ! local integers 166 INTEGER :: iirest, ijrest ! local integers 165 167 CHARACTER(len=120), DIMENSION(30) :: cltxt, cltxt2, clnam 166 168 CHARACTER(len=80) :: clname … … 216 218 ENDIF 217 219 ! 218 jpk = jpkglo219 !220 #if defined key_agrif221 IF( .NOT. Agrif_Root() ) THEN ! AGRIF children: specific setting (cf. agrif_user.F90)222 jpiglo = nbcellsx + 2 + 2*nbghostcells223 jpjglo = nbcellsy + 2 + 2*nbghostcells224 jpi = ( jpiglo-2*jpreci + (jpni-1+0) ) / jpni + 2*jpreci225 jpj = ( jpjglo-2*jprecj + (jpnj-1+0) ) / jpnj + 2*jprecj226 nperio = 0227 jperio = 0228 ln_use_jattr = .false.229 ENDIF230 #endif231 220 ! 232 221 ! !--------------------------------------------! … … 285 274 #endif 286 275 ENDIF 276 ! 277 #if defined key_agrif 278 IF( .NOT. Agrif_Root() ) THEN ! AGRIF children: specific setting (cf. agrif_user.F90) 279 jpiglo = nbcellsx + 2 + 2*nbghostcells 280 jpjglo = nbcellsy + 2 + 2*nbghostcells 281 jpi = ( jpiglo-2*nn_hls + (jpni-1+0) ) / jpni + 2*nn_hls 282 jpj = ( jpjglo-2*nn_hls + (jpnj-1+0) ) / jpnj + 2*nn_hls 283 jpimax = jpi 284 jpjmax = jpj 285 nperio = 0 286 jperio = 0 287 ln_use_jattr = .false. 288 ENDIF 289 #endif 287 290 288 291 IF( Agrif_Root() ) THEN ! AGRIF mother: specific setting from jpni and jpnj 292 iiarea = 1 + MOD( narea - 1 , jpni ) 293 ijarea = 1 + ( narea - 1 ) / jpni 294 iirest = 1 + MOD( jpiglo - 2*nn_hls - 1 , jpni ) 295 ijrest = 1 + MOD( jpjglo - 2*nn_hls - 1 , jpnj ) 289 296 #if defined key_nemocice_decomp 290 jpi = ( nx_global+2-2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 291 jpj = ( ny_global+2-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 297 jpi = ( nx_global+2-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 298 jpj = ( ny_global+2-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 299 jpimax = jpi 300 jpjmax = jpj 301 IF( iiarea == jpni ) jpi = jpiglo - (jpni - 1) * (jpi - 2*nn_hls) 302 IF( ijarea == jpnj ) jpj = jpjglo - (jpnj - 1) * (jpj - 2*nn_hls) 292 303 #else 293 jpi = ( jpiglo -2*jpreci + (jpni-1) ) / jpni + 2*jpreci ! first dim. 294 jpj = ( jpjglo -2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj ! second dim. 295 #endif 296 ENDIF 304 jpi = ( jpiglo -2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls ! first dim. 305 jpj = ( jpjglo -2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls ! second dim. 306 jpimax = jpi 307 jpjmax = jpj 308 IF( iiarea > iirest ) jpi = jpi - 1 309 IF( ijarea > ijrest ) jpj = jpj - 1 310 #endif 311 ENDIF 312 313 jpk = jpkglo ! third dim 297 314 298 315 #if defined key_agrif … … 345 362 346 363 ! ! Domain decomposition 347 IF( jpni*jpnj == jpnij ) THEN ; CALL mpp_init ! standard cutting out 348 ELSE ; CALL mpp_init2 ! eliminate land processors 349 ENDIF 364 CALL mpp_init 350 365 ! 351 366 IF( ln_timing ) CALL timing_init -
branches/2017/dev_CNRS_2017/NEMOGCM/SETTE/sette_rpt.sh
r8896 r9012 22 22 nam=$2 23 23 pass=$3 24 24 25 # 25 26 if [ -d $vdir/$nam ]; then … … 336 337 mach=`grep "COMPILER=" ./sette.sh | sed -e 's/COMPILER=//'` 337 338 NEMO_VALID=`grep "NEMO_VALIDATION_DIR=" ./param.cfg | sed -e 's/NEMO_VALIDATION_DIR=//'` 338 # Directory to run the tests 339 SETTE_DIR=$(cd $(dirname "$0"); pwd) 340 MAIN_DIR=$(dirname $SETTE_DIR) 341 CONFIG_DIR0=${MAIN_DIR}/CONFIG 342 TOOLS_DIR=${MAIN_DIR}/TOOLS 343 COMPIL_DIR=${TOOLS_DIR}/COMPILE 344 NPROC=32 345 346 SAS_RESTART_DIR=${CONFIG_DIR0}/SAS_ST 339 NEMO_VALID=`eval "echo $NEMO_VALID"` 347 340 # 348 341 if [ ! -d $NEMO_VALID ]; then … … 350 343 exit 351 344 fi 345 # 346 # Directory to run the tests 347 SETTE_DIR=$(cd $(dirname "$0"); pwd) 348 MAIN_DIR=$(dirname $SETTE_DIR) 349 CONFIG_DIR0=${MAIN_DIR}/CONFIG 350 TOOLS_DIR=${MAIN_DIR}/TOOLS 351 COMPIL_DIR=${TOOLS_DIR}/COMPILE 352 NPROC=32 353 SAS_RESTART_DIR=${CONFIG_DIR0}/SAS_ST 352 354 # 353 355 # Show current revision tag and branch name
Note: See TracChangeset
for help on using the changeset viewer.