- Timestamp:
- 2017-12-13T14:57:33+01:00 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note: See TracChangeset
for help on using the changeset viewer.