SUBROUTINE lbc_nfd_nogather_/**/PRECISION( ptab, ptab2, cd_nat, psgn, khls ) !!---------------------------------------------------------------------- !! !! ** Purpose : lateral boundary condition : North fold treatment !! without allgather exchanges. !! !!---------------------------------------------------------------------- REAL(PRECISION), DIMENSION(:,:,:,:), INTENT(inout) :: ptab ! REAL(PRECISION), DIMENSION(:,:,:,:), INTENT(inout) :: ptab2 ! CHARACTER(len=1) , INTENT(in ) :: cd_nat ! nature of array grid-points REAL(PRECISION) , INTENT(in ) :: psgn ! sign used across the north fold boundary INTEGER , INTENT(in ) :: khls ! halo size, default = nn_hls ! INTEGER :: ji, jj, jk, jn, jl, jh ! dummy loop indices INTEGER :: ipk, ipl, ii, iij, ijj ! dimension of the input array INTEGER :: ijt, iju, ijta, ijua, jia, startloop, endloop LOGICAL :: l_fast_exchanges !!---------------------------------------------------------------------- ipk = SIZE(ptab,3) ipl = SIZE(ptab,4) ! ! 2nd dimension determines exchange speed l_fast_exchanges = SIZE(ptab2,2) == 1 ! IF( c_NFtype == 'T' ) THEN ! * North fold T-point pivot ! SELECT CASE ( cd_nat ) ! CASE ( 'T' , 'W' ) ! T-, W-point IF ( nimpp /= 1 ) THEN ; startloop = 1 ELSE ; startloop = 1 + khls ENDIF ! DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ji = startloop, jpi ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) END DO END DO END DO; END DO IF( nimpp == 1 ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ii = 0, khls-1 ptab(ii+1,ijj,jk,jl) = psgn * ptab(2*khls-ii+1,jpj-2*khls+jj-1,jk,jl) END DO END DO END DO; END DO ENDIF ! IF ( .NOT. l_fast_exchanges ) THEN IF( nimpp >= Ni0glo/2+2 ) THEN startloop = 1 ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN startloop = Ni0glo/2+2 - nimpp + khls ELSE startloop = jpi + 1 ENDIF IF( startloop <= jpi ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO ji = startloop, jpi ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 jia = ji + nimpp - 1 ijta = jpiglo - jia + 2 IF( ijta >= startloop+nimpp-1 .AND. ijta < jia ) THEN ptab(ji,jpj-khls,jk,jl) = psgn * ptab(ijta-nimpp+khls,jpj-khls,jk,jl) ELSE ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(ijt,khls+1,jk,jl) ENDIF END DO END DO; END DO ENDIF ENDIF CASE ( 'U' ) ! U-point IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ji = 1, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) END DO END DO END DO; END DO IF (nimpp .eq. 1) THEN DO jj = 1, khls ijj = jpj -jj +1 DO ii = 0, khls-1 ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls+jj-1,:,:) END DO END DO ENDIF IF((nimpp + jpi - 1) .eq. jpiglo) THEN DO jj = 1, khls ijj = jpj -jj +1 DO ii = 1, khls ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls+jj-1,:,:) END DO END DO ENDIF ! IF ( .NOT. l_fast_exchanges ) THEN IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF IF( nimpp >= Ni0glo/2+1 ) THEN startloop = khls ELSEIF( ( nimpp + jpi - 1 >= Ni0glo/2+1 ) .AND. ( nimpp < Ni0glo/2+1 ) ) THEN startloop = Ni0glo/2+1 - nimpp + khls ELSE startloop = endloop + 1 ENDIF IF( startloop <= endloop ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO ji = startloop, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 jia = ji + nimpp - 1 ijua = jpiglo - jia + 1 IF( ijua >= startloop+nimpp-1 .AND. ijua < jia ) THEN ptab(ji,jpj-khls,jk,jl) = psgn * ptab(ijua-nimpp+1,jpj-khls,jk,jl) ELSE ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(iju,khls+1,jk,jl) ENDIF END DO END DO; END DO ENDIF ENDIF ! CASE ( 'V' ) ! V-point IF( nimpp /= 1 ) THEN startloop = 1 ELSE startloop = 1 + khls ENDIF IF ( .NOT. l_fast_exchanges ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO jj = 2, khls+1 ijj = jpj -jj +1 DO ji = startloop, jpi ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) END DO END DO END DO; END DO ENDIF DO jl = 1, ipl; DO jk = 1, ipk DO ji = startloop, jpi ijt=jpiglo - ji - nimpp - nfimpp(isendto(1)) + 4 ptab(ji,jpj,jk,jl) = psgn * ptab2(ijt,1,jk,jl) END DO END DO; END DO IF (nimpp .eq. 1) THEN DO jj = 1, khls ijj = jpj-jj+1 DO ii = 0, khls-1 ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii+1,jpj-2*khls+jj-1,:,:) END DO END DO ENDIF CASE ( 'F' ) ! F-point IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF IF ( .NOT. l_fast_exchanges ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO jj = 2, khls+1 ijj = jpj -jj +1 DO ji = 1, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) END DO END DO END DO; END DO ENDIF DO jl = 1, ipl; DO jk = 1, ipk DO ji = 1, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,jpj,jk,jl) = psgn * ptab2(iju,1,jk,jl) END DO END DO; END DO IF (nimpp .eq. 1) THEN DO ii = 1, khls ptab(ii,jpj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls-1,:,:) END DO IF ( .NOT. l_fast_exchanges ) THEN DO jj = 1, khls ijj = jpj -jj DO ii = 0, khls-1 ptab(ii+1,ijj,:,:) = psgn * ptab(2*khls-ii,jpj-2*khls+jj-1,:,:) END DO END DO ENDIF ENDIF IF((nimpp + jpi - 1 ) .eq. jpiglo) THEN DO ii = 1, khls ptab(jpi-ii+1,jpj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls-1,:,:) END DO IF ( .NOT. l_fast_exchanges ) THEN DO jj = 1, khls ijj = jpj -jj DO ii = 1, khls ptab(jpi-ii+1,ijj,:,:) = psgn * ptab(jpi-2*khls+ii,jpj-2*khls+jj-1,:,:) END DO END DO ENDIF ENDIF ! END SELECT ! ENDIF ! c_NFtype == 'T' ! IF( c_NFtype == 'F' ) THEN ! * North fold F-point pivot ! SELECT CASE ( cd_nat ) CASE ( 'T' , 'W' ) ! T-, W-point DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj-jj+1 DO ji = 1, jpi ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) END DO END DO END DO; END DO ! CASE ( 'U' ) ! U-point IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj-jj+1 DO ji = 1, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 ptab(ji,ijj,jk,jl) = psgn * ptab2(iju,jj,jk,jl) END DO END DO END DO; END DO IF(nimpp + jpi - 1 .eq. jpiglo) THEN DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj-jj+1 DO ii = 1, khls iij = jpi-ii+1 ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*khls+ii-1,jpj-2*khls+jj,jk,jl) END DO END DO END DO; END DO ENDIF ! CASE ( 'V' ) ! V-point DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ji = 1, jpi ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,ijj,jk,jl) = psgn * ptab2(ijt,jj,jk,jl) END DO END DO END DO; END DO IF ( .NOT. l_fast_exchanges ) THEN IF( nimpp >= Ni0glo/2+2 ) THEN startloop = 1 ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN startloop = Ni0glo/2+2 - nimpp + khls ELSE startloop = jpi + 1 ENDIF IF( startloop <= jpi ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO ji = startloop, jpi ijt = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 3 ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(ijt,khls+1,jk,jl) END DO END DO; END DO ENDIF ENDIF ! CASE ( 'F' ) ! F-point IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ji = 1, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 ptab(ji,ijj ,jk,jl) = psgn * ptab2(iju,jj,jk,jl) END DO END DO END DO; END DO IF((nimpp + jpi - 1) .eq. jpiglo) THEN DO jl = 1, ipl; DO jk = 1, ipk DO jj = 1, khls ijj = jpj -jj +1 DO ii = 1, khls iij = jpi -ii+1 ptab(iij,ijj,jk,jl) = psgn * ptab(jpi-2*khls+ii-1,jpj-2*khls+jj-1,jk,jl) END DO END DO END DO; END DO ENDIF ! IF ( .NOT. l_fast_exchanges ) THEN IF( nimpp + jpi - 1 /= jpiglo ) THEN endloop = jpi ELSE endloop = jpi - khls ENDIF IF( nimpp >= Ni0glo/2+2 ) THEN startloop = 1 ELSEIF( nimpp+jpi-1 >= Ni0glo/2+2 .AND. nimpp < Ni0glo/2+2 ) THEN startloop = Ni0glo/2+2 - nimpp + khls ELSE startloop = endloop + 1 ENDIF IF( startloop <= endloop ) THEN DO jl = 1, ipl; DO jk = 1, ipk DO ji = startloop, endloop iju = jpiglo - ji - nimpp - nfimpp(isendto(1)) + 2 ptab(ji,jpj-khls,jk,jl) = psgn * ptab2(iju,khls+1,jk,jl) END DO END DO; END DO ENDIF ENDIF ! END SELECT ! ENDIF ! c_NFtype == 'F' ! END SUBROUTINE lbc_nfd_nogather_/**/PRECISION