Changeset 11048 for NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdyini.F90
- Timestamp:
- 2019-05-23T18:36:06+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/BDY/bdyini.F90
r11044 r11048 37 37 INTEGER, PARAMETER :: jp_nseg = 100 ! 38 38 INTEGER, PARAMETER :: nrimmax = 20 ! maximum rimwidth in structured 39 INTEGER :: nde = 1 ! domain extended in the halo to deal with bondaries 39 40 ! open boundary data files 40 41 ! Straight open boundary segment parameters: … … 144 145 INTEGER :: iw_b(4), ie_b(4), is_b(4), in_b(4) ! Arrays for neighbours coordinates 145 146 REAL(wp), TARGET, DIMENSION(jpi,jpj) :: zfmask ! temporary fmask array excluding coastal boundary condition (shlat) 147 REAL(wp) , DIMENSION(jpi,jpj) :: ztmp 146 148 LOGICAL :: llnobdy, llsobdy, lleabdy, llwebdy ! local logicals 147 149 !! … … 798 800 ! is = mjg(1) + 1 ! if monotasking and no zoom, is=2 799 801 ! in = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1 800 iwe = mig(1) - 1 + 2 801 ies = mig(1) + nlci-1 - 1 ! if monotasking and no zoom, ie=jpim1802 iso = mjg(1) - 1 + 2 ! if monotasking and no zoom, is=2803 ino = mjg(1) + nlcj-1 - 1 ! if monotasking and no zoom, in=jpjm1802 iwe = mig(1) - 1 + 2 - nde ! if monotasking and no zoom, iw=2 803 ies = mig(1) + nlci-1 - 1 + nde ! if monotasking and no zoom, ie=jpim1 804 iso = mjg(1) - 1 + 2 -nde ! if monotasking and no zoom, is=2 805 ino = mjg(1) + nlcj-1 - 1 + nde ! if monotasking and no zoom, in=jpjm1 804 806 805 807 ALLOCATE( nbondi_bdy(nb_bdy)) … … 1173 1175 CALL lbc_lnk_multi( 'bdyini', bdyumask, 'U', 1. , bdyvmask, 'V', 1., bdytmask, 'T', 1. ) 1174 1176 DO ib_bdy = 1, nb_bdy ! Indices and directions of rim velocity components 1175 1176 idx_bdy(ib_bdy)%flagu(:,:) = 0._wp1177 idx_bdy(ib_bdy)%flagv(:,:) = 0._wp1178 1177 icount = 0 1179 1178 … … 1190 1189 END SELECT 1191 1190 icount = 0 1191 ztmp(:,:) = 0._wp 1192 1192 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1193 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1194 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1195 zefl = pmask(nbi+i_offset-1,nbj) 1196 zwfl = pmask(nbi+i_offset,nbj) 1193 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1194 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1195 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE 1196 zefl = pmask(ii+i_offset-1,ij) 1197 zwfl = pmask(ii+i_offset ,ij) 1197 1198 ! This error check only works if you are using the bdyXmask arrays 1198 IF( i_offset == 1 .and. zefl + zwfl == 2 ) THEN1199 IF( i_offset == 1 .and. zefl + zwfl == 2. ) THEN 1199 1200 icount = icount + 1 1200 IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig( nbi),mjg(nbj)1201 IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij) 1201 1202 ELSE 1202 idx_bdy(ib_bdy)%flagu(ib,igrd) = -zefl + zwfl1203 ztmp(ii,ij) = -zefl + zwfl 1203 1204 ENDIF 1204 1205 END DO … … 1209 1210 CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 1210 1211 ENDIF 1212 CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. ) 1213 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1214 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1215 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1216 idx_bdy(ib_bdy)%flagu(ib,igrd) = ztmp(ii,ij) 1217 END DO 1211 1218 END DO 1212 1219 … … 1223 1230 END SELECT 1224 1231 icount = 0 1232 ztmp(:,:) = 0._wp 1225 1233 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1226 nbi => idx_bdy(ib_bdy)%nbi(ib,igrd) 1227 nbj => idx_bdy(ib_bdy)%nbj(ib,igrd) 1228 znfl = pmask(nbi,nbj+j_offset-1) 1229 zsfl = pmask(nbi,nbj+j_offset ) 1234 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1235 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1236 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE 1237 znfl = pmask(ii,ij+j_offset-1) 1238 zsfl = pmask(ii,ij+j_offset ) 1230 1239 ! This error check only works if you are using the bdyXmask arrays 1231 IF( j_offset == 1 .and. znfl + zsfl == 2 ) THEN1232 IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig( nbi),mjg(nbj)1240 IF( j_offset == 1 .and. znfl + zsfl == 2. ) THEN 1241 IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij) 1233 1242 icount = icount + 1 1234 1243 ELSE 1235 idx_bdy(ib_bdy)%flagv(ib,igrd) = -znfl + zsfl1244 ztmp(ii,ij) = -znfl + zsfl 1236 1245 END IF 1237 1246 END DO … … 1241 1250 WRITE(ctmp2,*) ' ========== ' 1242 1251 CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 1243 ENDIF 1252 ENDIF 1253 CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. ) 1254 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1255 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1256 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1257 idx_bdy(ib_bdy)%flagv(ib,igrd) = ztmp(ii,ij) 1258 END DO 1244 1259 END DO 1245 1260 ! … … 1257 1272 CASE( 3 ) ; pmask => bdyvmask 1258 1273 END SELECT 1274 ztmp(:,:) = 0._wp 1259 1275 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1260 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1261 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1276 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1277 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1278 IF( ii == 1 .OR. ii == jpi .OR. ij == 1 .OR. ij == jpj ) CYCLE 1262 1279 llnobdy = pmask(ii ,ij+1) == 1. 1263 1280 llsobdy = pmask(ii ,ij-1) == 1. … … 1268 1285 ! ! ! _____ ! _____ 1269 1286 ! 1 | o ! 2 o | ! 3 | x ! 4 x | 1270 ! |_x_ _ ! _ _x_| ! | o ! o | 1271 IF( pmask(ii+1,ij+1) == 1. ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 11272 IF( pmask(ii-1,ij+1) == 1. ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 21273 IF( pmask(ii+1,ij-1) == 1. ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 31274 IF( pmask(ii-1,ij-1) == 1. ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 41287 ! |_x_ _ ! _ _x_| ! | o ! o | 1288 IF( pmask(ii+1,ij+1) == 1. ) ztmp(ii,ij) = 1 1289 IF( pmask(ii-1,ij+1) == 1. ) ztmp(ii,ij) = 2 1290 IF( pmask(ii+1,ij-1) == 1. ) ztmp(ii,ij) = 3 1291 IF( pmask(ii-1,ij-1) == 1. ) ztmp(ii,ij) = 4 1275 1292 END IF 1276 1293 IF( inbdy == 1 ) THEN ! middle of linear bdy 1277 idx_bdy(ib_bdy)%ntreat(ib,igrd) = 0 ! regular treatment with flags1294 ztmp(ii,ij) = 0 ! regular treatment with flags 1278 1295 END IF 1279 1296 IF( inbdy == 2 ) THEN ! exterior of a corner … … 1281 1298 ! 5 ____x o ! 6 o x___ ! 7 x o ! 8 o x 1282 1299 ! | ! | ! o ! o 1283 IF( llnobdy .AND. lleabdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 51284 IF( llnobdy .AND. llwebdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 61285 IF( llsobdy .AND. lleabdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 71286 IF( llsobdy .AND. llwebdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 81300 IF( llnobdy .AND. lleabdy ) ztmp(ii,ij) = 5 1301 IF( llnobdy .AND. llwebdy ) ztmp(ii,ij) = 6 1302 IF( llsobdy .AND. lleabdy ) ztmp(ii,ij) = 7 1303 IF( llsobdy .AND. llwebdy ) ztmp(ii,ij) = 8 1287 1304 END IF 1288 1305 IF( inbdy == 3 ) THEN ! 3 neighbours __ __ … … 1290 1307 ! 9 _| x o ! 10 o x |_ ! 11 o x o ! 12 o x o 1291 1308 ! | o ! o | ! o ! __|¨|__ 1292 IF( llnobdy .AND. lleabdy .AND. llsobdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 91293 IF( llnobdy .AND. llwebdy .AND. llsobdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 101294 IF( llwebdy .AND. llsobdy .AND. lleabdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 111295 IF( llwebdy .AND. llnobdy .AND. lleabdy ) idx_bdy(ib_bdy)%ntreat(ib,igrd) = 121309 IF( llnobdy .AND. lleabdy .AND. llsobdy ) ztmp(ii,ij) = 9 1310 IF( llnobdy .AND. llwebdy .AND. llsobdy ) ztmp(ii,ij) = 10 1311 IF( llwebdy .AND. llsobdy .AND. lleabdy ) ztmp(ii,ij) = 11 1312 IF( llwebdy .AND. llnobdy .AND. lleabdy ) ztmp(ii,ij) = 12 1296 1313 END IF 1297 1314 IF( inbdy == 4 ) THEN … … 1301 1318 CALL ctl_stop( ' ', ctmp1, ctmp2, ' ' ) 1302 1319 END IF 1320 END DO 1321 CALL lbc_lnk( 'bdyini', ztmp, 'T', 1. ) 1322 DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd) 1323 ii = idx_bdy(ib_bdy)%nbi(ib,igrd) 1324 ij = idx_bdy(ib_bdy)%nbj(ib,igrd) 1325 idx_bdy(ib_bdy)%ntreat(ib,igrd) = ztmp(ii,ij) 1303 1326 END DO 1304 1327 END DO
Note: See TracChangeset
for help on using the changeset viewer.