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/2016/dev_r6519_HPC_4/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

source: branches/2016/dev_r6519_HPC_4/NEMOGCM/NEMO/OPA_SRC/DOM/domngb.F90 @ 7508

Last change on this file since 7508 was 7508, checked in by mocavero, 7 years ago

changes on code duplication and workshare construct

  • Property svn:keywords set to Id
File size: 5.6 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, kkk )
31      !!----------------------------------------------------------------------
32      !!                    ***  ROUTINE dom_ngb  ***
33      !!
34      !! ** Purpose :   find the closest 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      REAL(wp)        , INTENT(in   ) ::   plon, plat   ! longitude,latitude of the point
40      INTEGER         , INTENT(  out) ::   kii, kjj     ! i-,j-index of the closes grid point
41      INTEGER         , INTENT(in   ), OPTIONAL :: kkk  ! k-index of the mask level used
42      CHARACTER(len=1), INTENT(in   ) ::   cdgrid       ! grid name 'T', 'U', 'V', 'W'
43      !
44      INTEGER :: ik, jj, ji         ! working level
45      INTEGER , DIMENSION(2) ::   iloc
46      REAL(wp)               ::   zlon, zmini
47      REAL(wp), POINTER, DIMENSION(:,:) ::  zglam, zgphi, zmask, zdist
48      !!--------------------------------------------------------------------
49      !
50      IF( nn_timing == 1 )  CALL timing_start('dom_ngb')
51      !
52      CALL wrk_alloc( jpi,jpj,   zglam, zgphi, zmask, zdist )
53      !
54!$OMP PARALLEL DO schedule(static) private(jj, ji)
55      DO jj = 1, jpj
56         DO ji = 1, jpi
57            zmask(ji,jj) = 0._wp
58         END DO
59      END DO
60      ik = 1
61      IF ( PRESENT(kkk) ) ik=kkk
62      SELECT CASE( cdgrid )
63      CASE( 'U' )
64!$OMP PARALLEL DO schedule(static) private(jj, ji)
65      DO jj = 1, jpj
66         DO ji = 1, jpi
67            zglam(ji,jj) = glamu(ji,jj) ; zgphi(ji,jj) = gphiu(ji,jj)
68         END DO
69      END DO
70      zmask(nldi:nlei,nldj:nlej) = umask(nldi:nlei,nldj:nlej,ik)
71      CASE( 'V' ) 
72!$OMP PARALLEL DO schedule(static) private(jj, ji)
73      DO jj = 1, jpj
74         DO ji = 1, jpi
75            zglam(ji,jj) = glamv(ji,jj) ; zgphi(ji,jj) = gphiv(ji,jj)
76         END DO
77      END DO
78      zmask(nldi:nlei,nldj:nlej) = vmask(nldi:nlei,nldj:nlej,ik)
79      CASE( 'F' ) 
80!$OMP PARALLEL DO schedule(static) private(jj, ji)
81      DO jj = 1, jpj
82         DO ji = 1, jpi
83            zglam(ji,jj) = glamf(ji,jj) ; zgphi(ji,jj) = gphif(ji,jj)
84         END DO
85      END DO
86      zmask(nldi:nlei,nldj:nlej) = fmask(nldi:nlei,nldj:nlej,ik)
87      CASE DEFAULT 
88!$OMP PARALLEL DO schedule(static) private(jj, ji)
89      DO jj = 1, jpj
90         DO ji = 1, jpi
91            zglam(ji,jj) = glamt(ji,jj) ; zgphi(ji,jj) = gphit(ji,jj)
92         END DO
93      END DO
94      zmask(nldi:nlei,nldj:nlej) = tmask(nldi:nlei,nldj:nlej,ik)
95      END SELECT
96
97      IF (jphgr_msh /= 2 .AND. jphgr_msh /= 3) THEN
98         zlon       = MOD( plon       + 720., 360. )                                     ! plon between    0 and 360
99!$OMP PARALLEL DO schedule(static) private(jj, ji, zglam, zlon)
100         DO jj = 1, jpj
101            DO ji = 1, jpi
102               zglam(ji,jj) = MOD( zglam(ji,jj) + 720., 360. )                                     ! glam between    0 and 360
103               IF( zlon > 270. )   zlon = zlon - 360.                                          ! zlon between  -90 and 270
104               IF( zlon <  90. ) THEN
105                 IF( zglam(ji,jj) > 180. ) zglam(ji,jj) = zglam(ji,jj) - 360.   ! glam between -180 and 180
106               END IF
107               zglam(ji,jj) = zglam(ji,jj) - zlon
108            END DO
109         END DO
110      ELSE
111!$OMP PARALLEL DO schedule(static) private(jj, ji)
112         DO jj = 1, jpj
113            DO ji = 1, jpi
114               zglam(ji,jj) = zglam(ji,jj) - plon
115            END DO
116         END DO
117      END IF
118!$OMP PARALLEL DO schedule(static) private(jj, ji)
119      DO jj = 1, jpj
120         DO ji = 1, jpi
121            zgphi(ji,jj) = zgphi(ji,jj) - plat
122            zdist(ji,jj) = zglam(ji,jj) * zglam(ji,jj) + zgphi(ji,jj) * zgphi(ji,jj)
123         END DO
124      END DO
125      IF( lk_mpp ) THEN 
126         CALL mpp_minloc( zdist(:,:), zmask, zmini, kii, kjj)
127      ELSE
128         iloc(:) = MINLOC( zdist(:,:), mask = zmask(:,:) == 1.e0 )
129         kii = iloc(1) + nimpp - 1
130         kjj = iloc(2) + njmpp - 1
131      ENDIF
132      !
133      CALL wrk_dealloc( jpi,jpj,   zglam, zgphi, zmask, zdist )
134      !
135      IF( nn_timing == 1 )  CALL timing_stop('dom_ngb')
136      !
137   END SUBROUTINE dom_ngb
138
139   !!======================================================================
140END MODULE domngb
Note: See TracBrowser for help on using the repository browser.