Changeset 11201 for NEMO/branches/2019/ENHANCE-03_domcfg/src/domngb.F90
- Timestamp:
- 2019-07-01T12:10:15+02:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/ENHANCE-03_domcfg/src/domngb.F90
r10727 r11201 11 11 !!---------------------------------------------------------------------- 12 12 USE dom_oce ! ocean space and time domain 13 USE phycst 13 14 ! 14 15 USE in_out_manager ! I/O manager … … 18 19 PRIVATE 19 20 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 21 23 22 24 !!---------------------------------------------------------------------- … … 27 29 CONTAINS 28 30 29 SUBROUTINE dom_ngb( plon, plat, kii, kjj, cdgrid, kkk )31 SUBROUTINE dom_ngb( plon, plat, kii, kjj, rdist, cdgrid, kkk ) 30 32 !!---------------------------------------------------------------------- 31 33 !! *** ROUTINE dom_ngb *** … … 37 39 !!---------------------------------------------------------------------- 38 40 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 39 42 INTEGER , INTENT( out) :: kii, kjj ! i-,j-index of the closes grid point 40 43 INTEGER , INTENT(in ), OPTIONAL :: kkk ! k-index of the mask level used … … 43 46 INTEGER :: ik ! working level 44 47 INTEGER , DIMENSION(2) :: iloc 45 REAL(wp) :: zlon, zmini46 48 REAL(wp), DIMENSION(jpi,jpj) :: zglam, zgphi, zmask, zdist 47 49 !!-------------------------------------------------------------------- … … 57 59 END SELECT 58 60 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) 67 62 68 63 IF( lk_mpp ) THEN 69 CALL mpp_minloc( 'domngb', zdist(:,:), zmask, zmini, iloc)64 CALL mpp_minloc( 'domngb', zdist(:,:), zmask, rdist, iloc) 70 65 kii = iloc(1) ; kjj = iloc(2) 71 66 ELSE 72 67 iloc(:) = MINLOC( zdist(:,:), mask = zmask(:,:) == 1.e0 ) 68 rdist = MINVAL( zdist(:,:) ) 73 69 kii = iloc(1) + nimpp - 1 74 70 kjj = iloc(2) + njmpp - 1 … … 77 73 END SUBROUTINE dom_ngb 78 74 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 79 100 !!====================================================================== 80 101 END MODULE domngb
Note: See TracChangeset
for help on using the changeset viewer.