Ignore:
Timestamp:
2019-07-01T12:10:15+02:00 (15 months ago)
Author:
mathiot
Message:

ENHANCE-03_domcfg : add management of closed seas in domain cfg by flood filling and lat/lon seed instead of i/j box definition (ticket #2143)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/ENHANCE-03_domcfg/src/domngb.F90

    r10727 r11201  
    1111   !!---------------------------------------------------------------------- 
    1212   USE dom_oce        ! ocean space and time domain 
     13   USE phycst 
    1314   ! 
    1415   USE in_out_manager ! I/O manager 
     
    1819   PRIVATE 
    1920 
    20    PUBLIC   dom_ngb   ! routine called in iom.F90 module 
     21   PUBLIC   dom_ngb   ! routine called in iom.F90 and domclo.F90 module 
     22   PUBLIC   dist 
    2123 
    2224   !!---------------------------------------------------------------------- 
     
    2729CONTAINS 
    2830 
    29    SUBROUTINE dom_ngb( plon, plat, kii, kjj, cdgrid, kkk ) 
     31   SUBROUTINE dom_ngb( plon, plat, kii, kjj, rdist, cdgrid, kkk ) 
    3032      !!---------------------------------------------------------------------- 
    3133      !!                    ***  ROUTINE dom_ngb  *** 
     
    3739      !!---------------------------------------------------------------------- 
    3840      REAL(wp)        , INTENT(in   ) ::   plon, plat   ! longitude,latitude of the point 
     41      REAL(wp)        , INTENT(  out) ::   rdist        ! distance between the located point and the source 
    3942      INTEGER         , INTENT(  out) ::   kii, kjj     ! i-,j-index of the closes grid point 
    4043      INTEGER         , INTENT(in   ), OPTIONAL :: kkk  ! k-index of the mask level used 
     
    4346      INTEGER :: ik         ! working level 
    4447      INTEGER , DIMENSION(2) ::   iloc 
    45       REAL(wp)               ::   zlon, zmini 
    4648      REAL(wp), DIMENSION(jpi,jpj) ::   zglam, zgphi, zmask, zdist 
    4749      !!-------------------------------------------------------------------- 
     
    5759      END SELECT 
    5860 
    59       zlon       = MOD( plon       + 720., 360. )                                     ! plon between    0 and 360 
    60       zglam(:,:) = MOD( zglam(:,:) + 720., 360. )                                     ! glam between    0 and 360 
    61       IF( zlon > 270. )   zlon = zlon - 360.                                          ! zlon between  -90 and 270 
    62       IF( zlon <  90. )   WHERE( zglam(:,:) > 180. ) zglam(:,:) = zglam(:,:) - 360.   ! glam between -180 and 180 
    63       zglam(:,:) = zglam(:,:) - zlon 
    64  
    65       zgphi(:,:) = zgphi(:,:) - plat 
    66       zdist(:,:) = zglam(:,:) * zglam(:,:) + zgphi(:,:) * zgphi(:,:) 
     61      zdist = dist(plon, plat, zglam, zgphi) 
    6762       
    6863      IF( lk_mpp ) THEN   
    69          CALL mpp_minloc( 'domngb', zdist(:,:), zmask, zmini, iloc) 
     64         CALL mpp_minloc( 'domngb', zdist(:,:), zmask, rdist, iloc) 
    7065         kii = iloc(1) ; kjj = iloc(2) 
    7166      ELSE 
    7267         iloc(:) = MINLOC( zdist(:,:), mask = zmask(:,:) == 1.e0 ) 
     68         rdist = MINVAL( zdist(:,:) ) 
    7369         kii = iloc(1) + nimpp - 1 
    7470         kjj = iloc(2) + njmpp - 1 
     
    7773   END SUBROUTINE dom_ngb 
    7874 
     75   FUNCTION dist(plonsrc, platsrc, plontrg, plattrg) 
     76      REAL(wp), INTENT(in) :: plonsrc, platsrc                     ! lat/lon of the source point 
     77      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: plontrg, plattrg ! lat/lon of the target (2d in this case) 
     78 
     79      REAL(wp) :: zxs, zys, zzs 
     80      REAL(wp), DIMENSION(jpi,jpj) :: zxt, zyt, zzt 
     81 
     82      REAL(wp), DIMENSION(jpi,jpj) :: dist ! distance between src and trg 
     83 
     84      zxs = COS( rad * platsrc ) * COS( rad * plonsrc ) 
     85      zys = COS( rad * platsrc ) * SIN( rad * plonsrc ) 
     86      zzs = SIN( rad * platsrc ) 
     87 
     88      zxt = COS( rad * plattrg ) * COS( rad * plontrg ) 
     89      zyt = COS( rad * plattrg ) * SIN( rad * plontrg ) 
     90      zzt = SIN( rad * plattrg ) 
     91 
     92      dist(:,:) = ( zxs - zxt(:,:) )**2   & 
     93         &      + ( zys - zyt(:,:) )**2   & 
     94         &      + ( zzs - zzt(:,:) )**2 
     95 
     96      dist = ra * SQRT( dist ) 
     97 
     98   END FUNCTION dist 
     99 
    79100   !!====================================================================== 
    80101END MODULE domngb 
Note: See TracChangeset for help on using the changeset viewer.