New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
domngb.F90 in branches/UKMO/dev_isf_remapping_UKESM_GO6package_r9314/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

source: branches/UKMO/dev_isf_remapping_UKESM_GO6package_r9314/NEMOGCM/NEMO/OPA_SRC/DOM/domngb.F90 @ 9513

Last change on this file since 9513 was 9513, checked in by mathiot, 6 years ago

Add option to detect and remove subglacial lake (do not affect closed sea option)

File size: 5.1 KB
Line 
1MODULE domngb
2   !!======================================================================
3   !!                       ***  MODULE  domngb  ***
4   !! Grid search:  find the closest grid point from a given on/lat position
5   !!======================================================================
6   !! History : 3.2  !  2009-11  (S. Masson)  Original code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   dom_ngb       : find the closest grid point from a given lon/lat position
11   !!----------------------------------------------------------------------
12   USE dom_oce        ! ocean space and time domain
13   USE in_out_manager ! I/O manager
14   USE lib_mpp        ! for mppsum
15   USE wrk_nemo       ! Memory allocation
16   USE timing         ! Timing
17
18   IMPLICIT NONE
19   PRIVATE
20
21   PUBLIC   dom_ngb   ! routine called in iom.F90 module
22
23   !!----------------------------------------------------------------------
24   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
25   !! $Id$
26   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
27   !!----------------------------------------------------------------------
28CONTAINS
29
30   SUBROUTINE dom_ngb( plon, plat, kii, kjj, cdgrid, lwet, kkk )
31      !!----------------------------------------------------------------------
32      !!                    ***  ROUTINE dom_ngb  ***
33      !!
34      !! ** Purpose :   find the closest wet grid point from a given lon/lat position
35      !!
36      !! ** Method  :   look for minimum distance in cylindrical projection
37      !!                -> not good if located at too high latitude...
38      !!----------------------------------------------------------------------
39      !
40      REAL(wp)        , INTENT(in   ) ::   plon, plat   ! longitude,latitude of the point
41      INTEGER         , INTENT(  out) ::   kii, kjj     ! i-,j-index of the closes grid point
42      INTEGER         , INTENT(in   ), OPTIONAL :: kkk  ! k-index of the mask level used
43      LOGICAL         , INTENT(in   ), OPTIONAL :: lwet ! logical to decide if we look for every where (false)
44                                                                !    or only over the wet point (true)
45      CHARACTER(len=1), INTENT(in   ) ::   cdgrid       ! grid name 'T', 'U', 'V', 'W'
46      !
47      INTEGER :: ik         ! working level
48      INTEGER , DIMENSION(2) ::   iloc
49      REAL(wp)               ::   zlon, zmini
50      REAL(wp), POINTER, DIMENSION(:,:) ::  zglam, zgphi, zmask, zdist
51      LOGICAL :: llwet      ! working logical
52      !!--------------------------------------------------------------------
53      !
54      IF( nn_timing == 1 )  CALL timing_start('dom_ngb')
55      !
56      CALL wrk_alloc( jpi, jpj, zglam, zgphi, zmask, zdist )
57      !
58      ! select lat/lon variable
59      SELECT CASE( cdgrid )
60         CASE( 'U' )  ; zglam(:,:) = glamu(:,:) ; zgphi(:,:) = gphiu(:,:)
61         CASE( 'V' )  ; zglam(:,:) = glamv(:,:) ; zgphi(:,:) = gphiv(:,:)
62         CASE( 'F' )  ; zglam(:,:) = glamf(:,:) ; zgphi(:,:) = gphif(:,:)
63         CASE DEFAULT ; zglam(:,:) = glamt(:,:) ; zgphi(:,:) = gphit(:,:)
64      END SELECT
65      !
66      ! select vertical level
67      ik   = 1
68      IF ( PRESENT(kkk) ) ik=kkk
69      !
70      ! select mask variable
71      zmask(:,:) = 0._wp
72      llwet = .TRUE.
73      IF ( PRESENT(lwet)) llwet=lwet 
74      IF (llwet) THEN
75         SELECT CASE( cdgrid )
76            CASE( 'U' )  ; zmask(nldi:nlei,nldj:nlej) = umask(nldi:nlei,nldj:nlej,ik)
77            CASE( 'V' )  ; zmask(nldi:nlei,nldj:nlej) = vmask(nldi:nlei,nldj:nlej,ik)
78            CASE( 'F' )  ; zmask(nldi:nlei,nldj:nlej) = fmask(nldi:nlei,nldj:nlej,ik)
79            CASE DEFAULT ; zmask(nldi:nlei,nldj:nlej) = tmask(nldi:nlei,nldj:nlej,ik)
80         END SELECT
81      ELSE
82         zmask(nldi:nlei,nldj:nlej)=1.e0
83      END IF
84      !
85      ! compute distance
86      IF (jphgr_msh /= 2 .AND. jphgr_msh /= 3) THEN
87         zlon       = MOD( plon       + 720., 360. )                                     ! plon between    0 and 360
88         zglam(:,:) = MOD( zglam(:,:) + 720., 360. )                                     ! glam between    0 and 360
89         IF( zlon > 270. )   zlon = zlon - 360.                                          ! zlon between  -90 and 270
90         IF( zlon <  90. )   WHERE( zglam(:,:) > 180. ) zglam(:,:) = zglam(:,:) - 360.   ! glam between -180 and 180
91         zglam(:,:) = zglam(:,:) - zlon
92      ELSE
93         zglam(:,:) = zglam(:,:) - plon
94      END IF
95      !
96      zgphi(:,:) = zgphi(:,:) - plat
97      zdist(:,:) = zglam(:,:) * zglam(:,:) + zgphi(:,:) * zgphi(:,:)
98      !
99      ! find min
100      IF( lk_mpp ) THEN 
101         CALL mpp_minloc( zdist(:,:), zmask, zmini, kii, kjj)
102      ELSE
103         iloc(:) = MINLOC( zdist(:,:), mask = zmask(:,:) == 1.e0 )
104         kii = iloc(1) + nimpp - 1
105         kjj = iloc(2) + njmpp - 1
106      ENDIF
107      !
108      CALL wrk_dealloc( jpi, jpj, zglam, zgphi, zmask, zdist )
109      !
110      IF( nn_timing == 1 )  CALL timing_stop('dom_ngb')
111      !
112   END SUBROUTINE dom_ngb
113
114   !!======================================================================
115END MODULE domngb
Note: See TracBrowser for help on using the repository browser.