Changeset 12101 for utils/tools_UKMO_MERGE_2019/DOMAINcfg/src
- Timestamp:
- 2019-12-06T18:45:39+01:00 (4 years ago)
- Location:
- utils/tools_UKMO_MERGE_2019/DOMAINcfg/src
- Files:
-
- 41 deleted
- 3 edited
- 47 copied
Legend:
- Unmodified
- Added
- Removed
-
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/agrif_user.F90
r12100 r12101 12 12 !!---------------------------------------------------------------------- 13 13 USE Agrif_Util 14 USE oce15 14 USE dom_oce 16 15 USE nemogcm -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/dom_oce.F90
r12100 r12101 36 36 REAL(wp), PUBLIC :: rn_e3zps_rat !: minimum thickness ration for partial steps 37 37 INTEGER , PUBLIC :: nn_msh !: = 1 create a mesh-mask file 38 INTEGER , PUBLIC :: nn_closea !: =0 suppress closed sea/lake from the ORCA domain or not (=1) 38 39 INTEGER , PUBLIC :: ntopo !: = 0/1 ,compute/read the bathymetry file 40 INTEGER, PUBLIC :: nperio !: type of lateral boundary condition 41 REAL(wp), PUBLIC :: e3zps_min !: miminum thickness for partial steps (meters) 42 REAL(wp), PUBLIC :: e3zps_rat !: minimum thickness ration for partial steps 39 43 40 44 INTEGER, PUBLIC :: nn_interp … … 50 54 LOGICAL, PUBLIC :: lzoom_n = .FALSE. !: North zoom type flag 51 55 56 LOGICAL, PUBLIC :: ln_domclo = .FALSE. 52 57 53 58 INTEGER :: jphgr_msh !: type of horizontal mesh … … 202 207 LOGICAL, PUBLIC :: ln_sco !: s-coordinate or hybrid z-s coordinate 203 208 LOGICAL, PUBLIC :: ln_isfcav !: presence of ISF 204 ! ! ref. ! before ! now ! after ! 205 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3t_0 , e3t_b , e3t_n , e3t_a !: t- vert. scale factor [m] 206 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3u_0 , e3u_b , e3u_n , e3u_a !: u- vert. scale factor [m] 207 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3v_0 , e3v_b , e3v_n , e3v_a !: v- vert. scale factor [m] 208 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3f_0 , e3f_n !: f- vert. scale factor [m] 209 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3w_0 , e3w_b , e3w_n !: w- vert. scale factor [m] 210 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3uw_0 , e3uw_b , e3uw_n !: uw-vert. scale factor [m] 211 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3vw_0 , e3vw_b , e3vw_n !: vw-vert. scale factor [m] 212 213 ! ! ref. ! before ! now ! 214 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdept_0 , gdept_b , gdept_n !: t- depth [m] 215 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdepw_0 , gdepw_b , gdepw_n !: w- depth [m] 216 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gde3w_0 , gde3w_n !: w- depth (sum of e3w) [m] 217 218 ! ! ref. ! before ! now ! after ! 219 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ht_0 , ht_n !: t-depth [m] 220 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hu_0 , hu_b , hu_n , hu_a !: u-depth [m] 221 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: hv_0 , hv_b , hv_n , hv_a !: v-depth [m] 222 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hu_b , r1_hu_n , r1_hu_a !: inverse of u-depth [1/m] 223 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: r1_hv_b , r1_hv_n , r1_hv_a !: inverse of v-depth [1/m] 224 209 ! 210 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3t_0, e3u_0 , e3v_0 , e3f_0 !: t-,u-,v-,f-vert. scale factor [m] 211 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: e3w_0, e3uw_0, e3vw_0 !: w-,uw-,vw-vert. scale factor [m] 212 ! 213 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdept_0 !: t- depth [m] 214 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: gdepw_0 !: w- depth [m] 215 ! 225 216 INTEGER, PUBLIC :: nla10 !: deepest W level Above ~10m (nlb10 - 1) 226 217 INTEGER, PUBLIC :: nlb10 !: shallowest W level Bellow ~10m (nla10 + 1) 227 218 ! 228 219 !! 1D reference vertical coordinate 229 220 !! =-----------------====------ … … 251 242 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: ssmask, ssumask, ssvmask !: surface mask at T-,U-, V- and F-pts 252 243 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: tmask, umask, vmask, fmask !: land/ocean mask at T-, U-, V- and F-pts 253 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: wmask, wumask, wvmask !: land/ocean mask at WT-, WU- and WV-pts 244 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: wmask !: land/ocean mask at W- pts 245 246 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_opnsea , msk_csundef !: open ocean mask, closed sea mask (all of them) 247 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_csglo , msk_csrnf , msk_csemp !: closed sea masks 248 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: msk_csgrpglo, msk_csgrprnf, msk_csgrpemp !: closed sea masks 254 249 255 250 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: tpol, fpol !: north fold mask (jperio= 3 or 4) … … 310 305 INTEGER FUNCTION dom_oce_alloc() 311 306 !!---------------------------------------------------------------------- 312 INTEGER, DIMENSION(1 2) :: ierr307 INTEGER, DIMENSION(11) :: ierr 313 308 !!---------------------------------------------------------------------- 314 309 ierr(:) = 0 … … 331 326 & ff_f (jpi,jpj) , ff_t (jpi,jpj) , STAT=ierr(3) ) 332 327 ! 333 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , gde3w_0(jpi,jpj,jpk) , & 334 & gdept_b(jpi,jpj,jpk) , gdepw_b(jpi,jpj,jpk) , & 335 & gdept_n(jpi,jpj,jpk) , gdepw_n(jpi,jpj,jpk) , gde3w_n(jpi,jpj,jpk) , STAT=ierr(4) ) 336 ! 337 ALLOCATE( e3t_0(jpi,jpj,jpk) , e3u_0(jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) , e3w_0(jpi,jpj,jpk) , & 338 & e3t_b(jpi,jpj,jpk) , e3u_b(jpi,jpj,jpk) , e3v_b(jpi,jpj,jpk) , e3w_b(jpi,jpj,jpk) , & 339 & e3t_n(jpi,jpj,jpk) , e3u_n(jpi,jpj,jpk) , e3v_n(jpi,jpj,jpk) , e3f_n(jpi,jpj,jpk) , e3w_n(jpi,jpj,jpk) , & 340 & e3t_a(jpi,jpj,jpk) , e3u_a(jpi,jpj,jpk) , e3v_a(jpi,jpj,jpk) , & 341 ! ! 342 & e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk) , & 343 & e3uw_b(jpi,jpj,jpk) , e3vw_b(jpi,jpj,jpk) , & 344 & e3uw_n(jpi,jpj,jpk) , e3vw_n(jpi,jpj,jpk) , STAT=ierr(5) ) 345 ! 346 ALLOCATE( ht_0(jpi,jpj) , hu_0(jpi,jpj) , hv_0(jpi,jpj) , & 347 & hu_b(jpi,jpj) , hv_b(jpi,jpj) , r1_hu_b(jpi,jpj) , r1_hv_b(jpi,jpj) , & 348 & ht_n(jpi,jpj) , hu_n(jpi,jpj) , hv_n(jpi,jpj) , r1_hu_n(jpi,jpj) , r1_hv_n(jpi,jpj) , & 349 & hu_a(jpi,jpj) , hv_a(jpi,jpj) , r1_hu_a(jpi,jpj) , r1_hv_a(jpi,jpj) , STAT=ierr(6) ) 350 ! 351 ! 352 ALLOCATE( gdept_1d(jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) ,gdepw_1d(jpk) , e3t_1d(jpk) , e3w_1d(jpk) , STAT=ierr(7) ) 328 ALLOCATE( gdept_0(jpi,jpj,jpk) , gdepw_0(jpi,jpj,jpk) , STAT=ierr(4) ) 329 ! 330 ALLOCATE( e3t_0 (jpi,jpj,jpk) , e3u_0 (jpi,jpj,jpk) , e3v_0(jpi,jpj,jpk) , e3f_0(jpi,jpj,jpk) , e3w_0(jpi,jpj,jpk) , & 331 & e3uw_0(jpi,jpj,jpk) , e3vw_0(jpi,jpj,jpk) , STAT=ierr(5) ) 332 ! 333 ALLOCATE( gdept_1d(jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) ,gdepw_1d(jpk) , e3t_1d(jpk) , e3w_1d(jpk) , STAT=ierr(6) ) 353 334 ! 354 335 ALLOCATE( bathy(jpi,jpj),mbathy(jpi,jpj), tmask_i(jpi,jpj) , tmask_h(jpi,jpj) , & 355 336 & ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , & 356 & mbkt (jpi,jpj) , mbku (jpi,jpj) , mbkv (jpi,jpj) , STAT=ierr( 9) )337 & mbkt (jpi,jpj) , mbku (jpi,jpj) , mbkv (jpi,jpj) , STAT=ierr(7) ) 357 338 ! 358 339 ALLOCATE( misfdep(jpi,jpj) , mikt(jpi,jpj) , miku(jpi,jpj) , & 359 & risfdep(jpi,jpj) , mikv(jpi,jpj) , mikf(jpi,jpj) , STAT=ierr( 10) )340 & risfdep(jpi,jpj) , mikv(jpi,jpj) , mikf(jpi,jpj) , STAT=ierr(8) ) 360 341 ! 361 342 ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk) , & 362 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk) , STAT=ierr(11) ) 363 ! 364 ALLOCATE( wmask(jpi,jpj,jpk) , wumask(jpi,jpj,jpk), wvmask(jpi,jpj,jpk) , STAT=ierr(12) ) 365 343 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk) , wmask(jpi,jpj,jpk) , STAT=ierr(9) ) 344 ! 366 345 ALLOCATE( hbatv (jpi,jpj) , hbatf (jpi,jpj) , & 367 346 & hbatt (jpi,jpj) , hbatu (jpi,jpj) , & 368 347 & scosrf(jpi,jpj) , scobot(jpi,jpj) , & 369 348 & hifv (jpi,jpj) , hiff (jpi,jpj) , & 370 & hift (jpi,jpj) , hifu (jpi,jpj) , STAT=ierr(8) ) 349 & hift (jpi,jpj) , hifu (jpi,jpj) , STAT=ierr(10) ) 350 351 ALLOCATE( msk_opnsea (jpi,jpj), msk_csundef (jpi,jpj), & 352 & msk_csglo (jpi,jpj), msk_csrnf (jpi,jpj), msk_csemp (jpi,jpj), & 353 & msk_csgrpglo(jpi,jpj), msk_csgrprnf(jpi,jpj), msk_csgrpemp(jpi,jpj), STAT=ierr(11) ) 371 354 ! 372 355 dom_oce_alloc = MAXVAL(ierr) -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domain.F90
r12100 r12101 21 21 !! dom_ctl : control print for the ocean domain 22 22 !!---------------------------------------------------------------------- 23 USE oce ! ocean variables24 23 USE dom_oce ! domain: ocean 25 24 USE phycst ! physical constants 26 ! USE closea ! closed seas27 25 USE domhgr ! domain: set the horizontal mesh 28 26 USE domzgr ! domain: set the vertical mesh 29 ! USE domstp ! domain: set the time-step30 27 USE dommsk ! domain: set the mask system 31 USE domwri ! domain: write the meshmask file 32 USE domvvl ! variable volume 28 USE domclo ! domain: set closed sea mask 33 29 ! 30 USE lib_mpp ! 34 31 USE in_out_manager ! I/O manager 35 32 USE iom ! 36 USE wrk_nemo ! Memory Allocation37 USE lib_mpp ! distributed memory computing library38 USE lbclnk ! ocean lateral boundary condition (or mpp link)39 USE timing ! Timing40 33 41 34 IMPLICIT NONE … … 69 62 !! - 1D configuration, move Coriolis, u and v at T-point 70 63 !!---------------------------------------------------------------------- 71 INTEGER :: jk ! dummy loop indices72 INTEGER :: iconf = 0 ! local integers73 REAL(wp), POINTER, DIMENSION(:,:) :: z1_hu_0, z1_hv_074 !!----------------------------------------------------------------------75 !76 ! IF( nn_timing == 1 ) CALL timing_start('dom_init')77 64 ! 78 65 IF(lwp) THEN … … 84 71 ! !== Reference coordinate system ==! 85 72 ! 86 CALL dom_nam ! read namelist ( namrun, namdom ) 87 ! CALL dom_clo ! Closed seas and lake 88 89 CALL dom_hgr ! Horizontal mesh 90 CALL dom_zgr ! Vertical mesh and bathymetry 91 CALL dom_msk ! Masks 92 ! 93 ht_0(:,:) = e3t_0(:,:,1) * tmask(:,:,1) ! Reference ocean thickness 94 hu_0(:,:) = e3u_0(:,:,1) * umask(:,:,1) 95 hv_0(:,:) = e3v_0(:,:,1) * vmask(:,:,1) 96 DO jk = 2, jpk 97 ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk) 98 hu_0(:,:) = hu_0(:,:) + e3u_0(:,:,jk) * umask(:,:,jk) 99 hv_0(:,:) = hv_0(:,:) + e3v_0(:,:,jk) * vmask(:,:,jk) 100 END DO 101 ! 102 ! !== time varying part of coordinate system ==! 103 ! 104 IF( ln_linssh ) THEN ! Fix in time : set to the reference one for all 105 ! before ! now ! after ! 106 ; gdept_b = gdept_0 ; gdept_n = gdept_0 ! --- ! depth of grid-points 107 ; gdepw_b = gdepw_0 ; gdepw_n = gdepw_0 ! --- ! 108 ; ; gde3w_n = gde3w_0 ! --- ! 109 ! 110 ; e3t_b = e3t_0 ; e3t_n = e3t_0 ; e3t_a = e3t_0 ! scale factors 111 ; e3u_b = e3u_0 ; e3u_n = e3u_0 ; e3u_a = e3u_0 ! 112 ; e3v_b = e3v_0 ; e3v_n = e3v_0 ; e3v_a = e3v_0 ! 113 ; ; e3f_n = e3f_0 ! --- ! 114 ; e3w_b = e3w_0 ; e3w_n = e3w_0 ! --- ! 115 ; e3uw_b = e3uw_0 ; e3uw_n = e3uw_0 ! --- ! 116 ; e3vw_b = e3vw_0 ; e3vw_n = e3vw_0 ! --- ! 117 ! 118 CALL wrk_alloc( jpi,jpj, z1_hu_0, z1_hv_0 ) 119 ! 120 z1_hu_0(:,:) = ssumask(:,:) / ( hu_0(:,:) + 1._wp - ssumask(:,:) ) ! _i mask due to ISF 121 z1_hv_0(:,:) = ssvmask(:,:) / ( hv_0(:,:) + 1._wp - ssvmask(:,:) ) 122 ! 123 ! before ! now ! after ! 124 ; ; ht_n = ht_0 ! ! water column thickness 125 ; hu_b = hu_0 ; hu_n = hu_0 ; hu_a = hu_0 ! 126 ; hv_b = hv_0 ; hv_n = hv_0 ; hv_a = hv_0 ! 127 ; r1_hu_b = z1_hu_0 ; r1_hu_n = z1_hu_0 ; r1_hu_a = z1_hu_0 ! inverse of water column thickness 128 ; r1_hv_b = z1_hv_0 ; r1_hv_n = z1_hv_0 ; r1_hv_a = z1_hv_0 ! 129 ! 130 CALL wrk_dealloc( jpi,jpj, z1_hu_0, z1_hv_0 ) 131 ! 132 ELSE ! time varying : initialize before/now/after variables 133 ! 134 CALL dom_vvl_init 135 ! 136 ENDIF 137 ! 138 CALL cfg_write ! create the configuration file 139 ! 140 ! IF( nn_timing == 1 ) CALL timing_stop('dom_init') 73 CALL dom_nam ! read namelist ( namrun, namdom ) 74 ! 75 CALL dom_hgr ! Horizontal mesh 76 ! 77 CALL dom_zgr ! Vertical mesh and bathymetry 78 ! 79 CALL dom_msk ! compute mask (needed by write_cfg) 80 ! 81 IF ( ln_domclo ) CALL dom_clo ! Closed seas and lake 82 ! 83 CALL dom_ctl ! print extrema of masked scale factors 84 ! 85 CALL cfg_write ! create the configuration file 141 86 ! 142 87 END SUBROUTINE dom_init 143 144 88 145 89 SUBROUTINE dom_nam … … 160 104 & ln_cfmeta, ln_iscpl 161 105 NAMELIST/namdom/ nn_bathy, cn_topo, cn_bath, cn_lon, cn_lat, nn_interp, & 162 & rn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh, rn_hmin, rn_isfhmin,&163 & rn_atfp , rn_rdt , nn_closea , ln_crs , jphgr_msh ,&106 & rn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh, rn_hmin, & 107 & rn_atfp , rn_rdt , ln_crs , jphgr_msh , & 164 108 & ppglam0, ppgphi0, ppe1_deg, ppe2_deg, ppe1_m, ppe2_m, & 165 109 & ppsur, ppa0, ppa1, ppkth, ppacr, ppdzmin, pphmax, ldbletanh, & … … 185 129 WRITE(numout,*) '~~~~~~~ ' 186 130 WRITE(numout,*) ' Namelist namrun' 187 WRITE(numout,*) ' job number nn_no = ', nn_no188 131 WRITE(numout,*) ' experiment name for output cn_exp = ', cn_exp 189 WRITE(numout,*) ' file prefix restart input cn_ocerst_in= ', cn_ocerst_in190 WRITE(numout,*) ' restart input directory cn_ocerst_indir= ', cn_ocerst_indir191 WRITE(numout,*) ' file prefix restart output cn_ocerst_out= ', cn_ocerst_out192 WRITE(numout,*) ' restart output directory cn_ocerst_outdir= ', cn_ocerst_outdir193 WRITE(numout,*) ' restart logical ln_rstart = ', ln_rstart194 WRITE(numout,*) ' start with forward time step nn_euler = ', nn_euler195 WRITE(numout,*) ' control of time step nn_rstctl = ', nn_rstctl196 WRITE(numout,*) ' number of the first time step nn_it000 = ', nn_it000197 WRITE(numout,*) ' number of the last time step nn_itend = ', nn_itend198 WRITE(numout,*) ' initial calendar date aammjj nn_date0 = ', nn_date0199 WRITE(numout,*) ' initial time of day in hhmm nn_time0 = ', nn_time0200 WRITE(numout,*) ' leap year calendar (0/1) nn_leapy = ', nn_leapy201 WRITE(numout,*) ' initial state output nn_istate = ', nn_istate202 IF( ln_rst_list ) THEN203 WRITE(numout,*) ' list of restart dump times nn_stocklist =', nn_stocklist204 ELSE205 WRITE(numout,*) ' frequency of restart file nn_stock = ', nn_stock206 ENDIF207 WRITE(numout,*) ' frequency of output file nn_write = ', nn_write208 132 WRITE(numout,*) ' mask land points ln_mskland = ', ln_mskland 209 133 WRITE(numout,*) ' additional CF standard metadata ln_cfmeta = ', ln_cfmeta 210 134 WRITE(numout,*) ' overwrite an existing file ln_clobber = ', ln_clobber 211 135 WRITE(numout,*) ' NetCDF chunksize (bytes) nn_chunksz = ', nn_chunksz 212 WRITE(numout,*) ' IS coupling at the restart step ln_iscpl = ', ln_iscpl213 136 ENDIF 214 137 … … 280 203 WRITE(numout,*) ' min depth of the ocean (>0) or rn_hmin = ', rn_hmin 281 204 WRITE(numout,*) ' min number of ocean level (<0) ' 282 WRITE(numout,*) ' treshold to open the isf cavity rn_isfhmin = ', rn_isfhmin, ' (m)'283 205 WRITE(numout,*) ' minimum thickness of partial rn_e3zps_min = ', rn_e3zps_min, ' (m)' 284 206 WRITE(numout,*) ' step level rn_e3zps_rat = ', rn_e3zps_rat … … 288 210 WRITE(numout,*) ' = 2 mesh and mask ' 289 211 WRITE(numout,*) ' = 3 mesh_hgr, msh_zgr and mask' 290 WRITE(numout,*) ' ocean time step rn_rdt = ', rn_rdt291 WRITE(numout,*) ' asselin time filter parameter rn_atfp = ', rn_atfp292 WRITE(numout,*) ' suppression of closed seas (=0) nn_closea = ', nn_closea293 WRITE(numout,*) ' online coarsening of dynamical fields ln_crs = ', ln_crs294 212 WRITE(numout,*) ' type of horizontal mesh jphgr_msh = ', jphgr_msh 295 213 WRITE(numout,*) ' longitude of first raw and column T-point ppglam0 = ', ppglam0 … … 337 255 !!---------------------------------------------------------------------- 338 256 ! 339 #undef CHECK_DOM340 #ifdef CHECK_DOM341 257 IF(lk_mpp) THEN 342 CALL mpp_minloc( e1t(:,:), tmask_i(:,:), ze1min, iimi1,ijmi1 ) 343 CALL mpp_minloc( e2t(:,:), tmask_i(:,:), ze2min, iimi2,ijmi2 ) 344 CALL mpp_maxloc( e1t(:,:), tmask_i(:,:), ze1max, iima1,ijma1 ) 345 CALL mpp_maxloc( e2t(:,:), tmask_i(:,:), ze2max, iima2,ijma2 ) 258 CALL mpp_minloc( 'dom_ctl', e1t(:,:), tmask_i(:,:), ze1min, iloc ) 259 iimi1 = iloc(1) ; ijmi1 = iloc(2) 260 CALL mpp_minloc( 'dom_ctl', e2t(:,:), tmask_i(:,:), ze2min, iloc ) 261 iimi2 = iloc(1) ; ijmi2 = iloc(2) 262 CALL mpp_maxloc( 'dom_ctl', e1t(:,:), tmask_i(:,:), ze1max, iloc ) 263 iima1 = iloc(1) ; ijma1 = iloc(2) 264 CALL mpp_maxloc( 'dom_ctl', e2t(:,:), tmask_i(:,:), ze2max, iloc ) 265 iima2 = iloc(1) ; ijma2 = iloc(2) 346 266 ELSE 347 267 ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) … … 372 292 WRITE(numout,"(14x,'e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, iimi2, ijmi2 373 293 ENDIF 374 #endif375 294 ! 376 295 END SUBROUTINE dom_ctl … … 490 409 CALL iom_rstput( 0, 0, inum, 'bottom_level' , REAL( mbkt, wp )*ssmask , ktype = jp_i4 ) ! nb of ocean T-points 491 410 CALL iom_rstput( 0, 0, inum, 'top_level' , REAL( mikt, wp )*ssmask , ktype = jp_i4 ) ! nb of ocean T-points (ISF) 492 DO jj = 1,jpj 493 DO ji = 1,jpi 494 z2d (ji,jj) = SUM ( e3t_0(ji,jj, 1:mbkt(ji,jj) ) ) * ssmask(ji,jj) 495 END DO 496 END DO 497 CALL iom_rstput( 0, 0, inum, 'bathy_metry' , z2d , ktype = jp_r4 ) 498 499 ! 500 IF( ln_sco ) THEN ! s-coordinate: store grid stiffness ratio (Not required anyway) 501 CALL dom_stiff( z2d ) 502 CALL iom_rstput( 0, 0, inum, 'stiffness', z2d ) ! ! Max. grid stiffness ratio 503 ENDIF 411 CALL iom_rstput( 0, 0, inum, 'isf_draft' , risfdep , ktype = jp_r8 ) 412 CALL iom_rstput( 0, 0, inum, 'bathy_metry' , bathy , ktype = jp_r8 ) 413 ! 414 ! !== closed sea ==! 415 IF (ln_domclo) THEN 416 ! mask for the open sea 417 CALL iom_rstput( 0, 0, inum, 'mask_opensea' , msk_opnsea , ktype = jp_i4 ) 418 ! mask for all the under closed sea 419 CALL iom_rstput( 0, 0, inum, 'mask_csundef' , msk_csundef , ktype = jp_i4 ) 420 ! mask for global, local net precip, local net precip and evaporation correction 421 CALL iom_rstput( 0, 0, inum, 'mask_csglo' , msk_csglo , ktype = jp_i4 ) 422 CALL iom_rstput( 0, 0, inum, 'mask_csemp' , msk_csemp , ktype = jp_i4 ) 423 CALL iom_rstput( 0, 0, inum, 'mask_csrnf' , msk_csrnf , ktype = jp_i4 ) 424 ! mask for the various river mouth (in case multiple lake in the same outlet) 425 CALL iom_rstput( 0, 0, inum, 'mask_csgrpglo', msk_csgrpglo, ktype = jp_i4 ) 426 CALL iom_rstput( 0, 0, inum, 'mask_csgrpemp', msk_csgrpemp, ktype = jp_i4 ) 427 CALL iom_rstput( 0, 0, inum, 'mask_csgrprnf', msk_csgrprnf, ktype = jp_i4 ) 428 END IF 504 429 ! 505 430 ! ! ============================ -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/dombat.F90
r12100 r12101 1 1 MODULE dombat 2 2 3 USE oce ! ocean variables4 3 USE dom_oce ! ocean domain 5 4 ! USE closea ! closed seas … … 9 8 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 10 9 USE lib_mpp ! distributed memory computing library 11 USE wrk_nemo ! Memory allocation12 USE timing ! Timing13 10 USE agrif_modutil 14 11 USE bilinear_interp -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domcfg.f90
r9598 r12101 15 15 USE in_out_manager ! I/O manager 16 16 USE lib_mpp ! distributed memory computing library 17 USE timing ! Timing18 17 19 18 IMPLICIT NONE … … 36 35 !! 37 36 !!---------------------------------------------------------------------- 38 !39 IF( nn_timing == 1 ) CALL timing_start('dom_cfg')40 37 ! 41 38 IF(lwp) THEN ! Control print … … 60 57 CALL dom_glo ! global domain versus zoom and/or local domain 61 58 ! 62 IF( nn_timing == 1 ) CALL timing_stop('dom_cfg')63 !64 59 END SUBROUTINE dom_cfg 65 66 60 67 61 SUBROUTINE dom_glo … … 69 63 !! *** ROUTINE dom_glo *** 70 64 !! 71 !! ** Purpose : initialization for global domain, zoom and local domain65 !! ** Purpose : initialization of global domain <--> local domain indices 72 66 !! 73 67 !! ** Method : 74 68 !! 75 !! ** Action : - mig , mjg :76 !! - mi0 , mi1 :77 !! - mj0, , mj1 :69 !! ** Action : - mig , mjg : local domain indices ==> global domain indices 70 !! - mi0 , mi1 : global domain indices ==> local domain indices 71 !! - mj0,, mj1 (global point not in the local domain ==> mi0>mi1 and/or mj0>mj1) 78 72 !!---------------------------------------------------------------------- 79 73 INTEGER :: ji, jj ! dummy loop argument 80 74 !!---------------------------------------------------------------------- 81 ! ! recalculate jpizoom/jpjzoom given lat/lon82 75 ! 83 ! ! ============== ! 84 ! ! Local domain ! 85 ! ! ============== ! 86 DO ji = 1, jpi ! local domain indices ==> data domain indices 87 mig(ji) = ji + jpizoom - 1 + nimpp - 1 76 DO ji = 1, jpi ! local domain indices ==> global domain indices 77 mig(ji) = ji + nimpp - 1 88 78 END DO 89 79 DO jj = 1, jpj 90 mjg(jj) = jj + jpjzoom - 1 +njmpp - 180 mjg(jj) = jj + njmpp - 1 91 81 END DO 92 ! 93 ! ! data domain indices ==> local domain indices 82 ! ! global domain indices ==> local domain indices 94 83 ! ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the 95 ! ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.96 DO ji = 1, jpi dta97 mi0(ji) = MAX( 1 , MIN( ji - jpizoom + 1- nimpp + 1, jpi+1 ) )98 mi1(ji) = MAX( 0 , MIN( ji - jpizoom + 1- nimpp + 1, jpi ) )84 ! ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain. 85 DO ji = 1, jpiglo 86 mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) ) 87 mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi ) ) 99 88 END DO 100 DO jj = 1, jpj dta101 mj0(jj) = MAX( 1 , MIN( jj - jpjzoom + 1- njmpp + 1, jpj+1 ) )102 mj1(jj) = MAX( 0 , MIN( jj - jpjzoom + 1- njmpp + 1, jpj ) )89 DO jj = 1, jpjglo 90 mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) ) 91 mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj ) ) 103 92 END DO 104 93 IF(lwp) THEN ! control print 105 94 WRITE(numout,*) 106 WRITE(numout,*) 'dom_glo : domain: data /local '95 WRITE(numout,*) 'dom_glo : domain: global <<==>> local ' 107 96 WRITE(numout,*) '~~~~~~~ ' 108 WRITE(numout,*) ' data input domain : jpidta = ', jpidta, & 109 & ' jpjdta = ', jpjdta, ' jpkdta = ', jpkdta 110 WRITE(numout,*) ' global or zoom domain: jpiglo = ', jpiglo, & 111 & ' jpjglo = ', jpjglo, ' jpk = ', jpk 112 WRITE(numout,*) ' local domain : jpi = ', jpi , & 113 & ' jpj = ', jpj , ' jpk = ', jpk 97 WRITE(numout,*) ' global domain: jpiglo = ', jpiglo, ' jpjglo = ', jpjglo, ' jpkglo = ', jpkglo 98 WRITE(numout,*) ' local domain: jpi = ', jpi , ' jpj = ', jpj , ' jpk = ', jpk 114 99 WRITE(numout,*) 115 WRITE(numout,*) ' south-west indices jpizoom = ', jpizoom, & 116 & ' jpjzoom = ', jpjzoom 100 WRITE(numout,*) ' conversion from local to global domain indices (and vise versa) done' 117 101 IF( nn_print >= 1 ) THEN 118 102 WRITE(numout,*) 119 WRITE(numout,*) ' conversion local ==> data i-index domain'103 WRITE(numout,*) ' conversion local ==> global i-index domain (mig)' 120 104 WRITE(numout,25) (mig(ji),ji = 1,jpi) 121 105 WRITE(numout,*) 122 WRITE(numout,*) ' conversion data==> local i-index domain'123 WRITE(numout,*) ' starting index '124 WRITE(numout,25) (mi0(ji),ji = 1,jpi dta)125 WRITE(numout,*) ' ending index '126 WRITE(numout,25) (mi1(ji),ji = 1,jpi dta)106 WRITE(numout,*) ' conversion global ==> local i-index domain' 107 WRITE(numout,*) ' starting index (mi0)' 108 WRITE(numout,25) (mi0(ji),ji = 1,jpiglo) 109 WRITE(numout,*) ' ending index (mi1)' 110 WRITE(numout,25) (mi1(ji),ji = 1,jpiglo) 127 111 WRITE(numout,*) 128 WRITE(numout,*) ' conversion local ==> data j-index domain'112 WRITE(numout,*) ' conversion local ==> global j-index domain (mjg)' 129 113 WRITE(numout,25) (mjg(jj),jj = 1,jpj) 130 114 WRITE(numout,*) 131 WRITE(numout,*) ' conversion data ==> localj-index domain'132 WRITE(numout,*) ' starting index '133 WRITE(numout,25) (mj0(jj),jj = 1,jpj dta)134 WRITE(numout,*) ' ending index '135 WRITE(numout,25) (mj1(jj),jj = 1,jpj dta)115 WRITE(numout,*) ' conversion global ==> local j-index domain' 116 WRITE(numout,*) ' starting index (mj0)' 117 WRITE(numout,25) (mj0(jj),jj = 1,jpjglo) 118 WRITE(numout,*) ' ending index (mj1)' 119 WRITE(numout,25) (mj1(jj),jj = 1,jpjglo) 136 120 ENDIF 137 121 ENDIF 138 122 25 FORMAT( 100(10x,19i4,/) ) 139 140 ! ! ============== !141 ! ! Zoom domain !142 ! ! ============== !143 ! ! zoom control144 IF( jpiglo + jpizoom - 1 > jpidta .OR. &145 jpjglo + jpjzoom - 1 > jpjdta ) &146 & CALL ctl_stop( ' global or zoom domain exceed the data domain ! ' )147 148 ! ! set zoom flag149 IF( jpiglo < jpidta .OR. jpjglo < jpjdta ) lzoom = .TRUE.150 151 ! ! set zoom type flags152 IF( lzoom .AND. jpizoom /= 1 ) lzoom_w = .TRUE. !153 IF( lzoom .AND. jpjzoom /= 1 ) lzoom_s = .TRUE.154 IF( lzoom .AND. jpiglo + jpizoom -1 /= jpidta ) lzoom_e = .TRUE.155 IF( lzoom .AND. jpjglo + jpjzoom -1 /= jpjdta ) lzoom_n = .TRUE.156 IF(lwp) THEN157 WRITE(numout,*)158 WRITE(numout,*) ' zoom flags : '159 WRITE(numout,*) ' lzoom = ', lzoom , ' (T = zoom, F = global )'160 WRITE(numout,*) ' lzoom_e = ', lzoom_e, ' (T = forced closed east boundary)'161 WRITE(numout,*) ' lzoom_w = ', lzoom_w, ' (T = forced closed west boundary)'162 WRITE(numout,*) ' lzoom_s = ', lzoom_s, ' (T = forced closed South boundary)'163 WRITE(numout,*) ' lzoom_n = ', lzoom_n, ' (T = forced closed North boundary)'164 ENDIF165 IF( ( lzoom_e .OR. lzoom_w ) .AND. ( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) ) &166 & CALL ctl_stop( ' Your zoom choice is inconsistent with east-west cyclic boundary condition' )167 IF( lzoom_n .AND. ( 3 <= jperio .AND. jperio <= 6 ) ) &168 & CALL ctl_stop( ' Your zoom choice is inconsistent with North fold boundary condition' )169 170 ! ! Pre-defined arctic/antarctic zoom of ORCA configuration flag171 IF( cp_cfg == "orca" ) THEN172 SELECT CASE ( jp_cfg )173 CASE ( 2 ) ! ORCA_R2 configuration174 IF( cp_cfz == "arctic" .AND. jpiglo == 142 .AND. jpjglo == 53 .AND. &175 & jpizoom == 21 .AND. jpjzoom == 97 ) THEN176 IF(lwp) WRITE(numout,*) ' ORCA configuration: arctic zoom '177 ENDIF178 IF( cp_cfz == "antarctic" .AND. jpiglo == jpidta .AND. jpjglo == 50 .AND. &179 & jpizoom == 1 .AND. jpjzoom == 1 ) THEN180 IF(lwp) WRITE(numout,*) ' ORCA configuration: antarctic zoom '181 ENDIF182 !183 CASE ( 05 ) ! ORCA_R05 configuration184 IF( cp_cfz == "arctic" .AND. jpiglo == 562 .AND. jpjglo == 202 .AND. &185 & jpizoom == 81 .AND. jpjzoom == 301 ) THEN186 IF(lwp) WRITE(numout,*) ' ORCA configuration: arctic zoom '187 ENDIF188 IF( cp_cfz == "antarctic" .AND. jpiglo == jpidta .AND. jpjglo == 187 .AND. &189 & jpizoom == 1 .AND. jpjzoom == 1 ) THEN190 IF(lwp) WRITE(numout,*) ' ORCA configuration: antarctic zoom '191 ENDIF192 END SELECT193 !194 ENDIF195 123 ! 196 124 END SUBROUTINE dom_glo 197 198 125 !!====================================================================== 199 126 END MODULE domcfg -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domhgr.F90
r12100 r12101 28 28 USE in_out_manager ! I/O manager 29 29 USE lib_mpp ! MPP library 30 USE timing ! Timing31 30 32 31 IMPLICIT NONE … … 111 110 INTEGER :: ie1e2u_v ! fag for u- & v-surface read in coordinate file or not 112 111 !!---------------------------------------------------------------------- 113 !114 ! IF( nn_timing == 1 ) CALL timing_start('dom_hgr')115 112 ! 116 113 IF(lwp) THEN … … 437 434 ! ------------------------------------------ 438 435 ! The equator line must be the latitude coordinate axe 439 440 ! IF( nperio == 2 ) THEN 441 ! znorme = SQRT( SUM( gphiu(:,2) * gphiu(:,2) ) ) / REAL( jpi ) 442 ! IF( znorme > 1.e-13 ) CALL ctl_stop( ' ===>>>> : symmetrical condition: rerun with good equator line' ) 443 ! ENDIF 444 ! 445 ! IF( nn_timing == 1 ) CALL timing_stop('dom_hgr') 436 ! (PM) be carefull with nperio/jperio 437 IF( jperio == 2 ) THEN 438 znorme = SQRT( SUM( gphiu(:,2) * gphiu(:,2) ) ) / REAL( jpi ) 439 IF( znorme > 1.e-13 ) CALL ctl_stop( ' ===>>>> : symmetrical condition: rerun with good equator line' ) 440 ENDIF 446 441 ! 447 442 END SUBROUTINE dom_hgr -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/dommsk.F90
r12100 r12101 9 9 !! - ! 1996-05 (G. Madec) mask computed from tmask 10 10 !! 8.0 ! 1997-02 (G. Madec) mesh information put in domhgr.F 11 !! 8.1 ! 1997-07 (G. Madec) modification of mbathyand fmask11 !! 8.1 ! 1997-07 (G. Madec) modification of kbat and fmask 12 12 !! - ! 1998-05 (G. Roullet) free surface 13 13 !! 8.2 ! 2000-03 (G. Madec) no slip accurate … … 17 17 !! 3.2 ! 2009-07 (R. Benshila) Suppression of rigid-lid option 18 18 !! 3.6 ! 2015-05 (P. Mathiot) ISF: add wmask,wumask and wvmask 19 !!---------------------------------------------------------------------- 20 21 !!---------------------------------------------------------------------- 22 !! dom_msk : compute land/ocean mask 23 !!---------------------------------------------------------------------- 24 USE oce ! ocean dynamics and tracers 25 USE dom_oce ! ocean space and time domain 19 !! 4.0 ! 2016-06 (G. Madec, S. Flavoni) domain configuration / user defined interface 20 !!---------------------------------------------------------------------- 21 22 !!---------------------------------------------------------------------- 23 !! dom_msk : compute land/ocean mask 24 !!---------------------------------------------------------------------- 25 USE dom_oce ! ocean space and time domain 26 USE domisf ! domain: ice shelf 27 USE domwri ! domain: write the meshmask file 28 USE bdy_oce ! open boundary 26 29 ! 27 USE in_out_manager ! I/O manager 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 USE lib_mpp ! 30 USE wrk_nemo ! Memory allocation 31 USE timing ! Timing 30 USE in_out_manager ! I/O manager 31 USE iom ! IOM library 32 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 33 USE lib_mpp ! Massively Parallel Processing library 32 34 33 35 IMPLICIT NONE … … 42 44 43 45 !! * Substitutions 44 !!---------------------------------------------------------------------- 45 !! *** vectopt_loop_substitute *** 46 !!---------------------------------------------------------------------- 47 !! ** purpose : substitute the inner loop start/end indices with CPP macro 48 !! allow unrolling of do-loop (useful with vector processors) 49 !!---------------------------------------------------------------------- 50 !!---------------------------------------------------------------------- 51 !! NEMO/OPA 3.7 , NEMO Consortium (2014) 52 !! $Id: vectopt_loop_substitute.h90 4990 2014-12-15 16:42:49Z timgraham $ 53 !! Software governed by the CeCILL licence (./LICENSE) 54 !!---------------------------------------------------------------------- 55 !!---------------------------------------------------------------------- 56 !! NEMO/OPA 3.2 , LODYC-IPSL (2009) 57 !! $Id: dommsk.F90 6140 2015-12-21 11:35:23Z timgraham $ 58 !! Software governed by the CeCILL licence (./LICENSE) 46 # include "vectopt_loop_substitute.h90" 47 !!---------------------------------------------------------------------- 48 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 49 !! $Id: dommsk.F90 10425 2018-12-19 21:54:16Z smasson $ 50 !! Software governed by the CeCILL license (see ./LICENSE) 59 51 !!---------------------------------------------------------------------- 60 52 CONTAINS … … 67 59 !! zontal velocity points (u & v), vorticity points (f) points. 68 60 !! 69 !! ** Method : The ocean/land mask is computed from the basin bathy- 70 !! metry in level (mbathy) which is defined or read in dommba. 71 !! mbathy equals 0 over continental T-point 72 !! and the number of ocean level over the ocean. 73 !! 74 !! At a given position (ji,jj,jk) the ocean/land mask is given by: 75 !! t-point : 0. IF mbathy( ji ,jj) =< 0 76 !! 1. IF mbathy( ji ,jj) >= jk 77 !! u-point : 0. IF mbathy( ji ,jj) or mbathy(ji+1, jj ) =< 0 78 !! 1. IF mbathy( ji ,jj) and mbathy(ji+1, jj ) >= jk. 79 !! v-point : 0. IF mbathy( ji ,jj) or mbathy( ji ,jj+1) =< 0 80 !! 1. IF mbathy( ji ,jj) and mbathy( ji ,jj+1) >= jk. 81 !! f-point : 0. IF mbathy( ji ,jj) or mbathy( ji ,jj+1) 82 !! or mbathy(ji+1,jj) or mbathy(ji+1,jj+1) =< 0 83 !! 1. IF mbathy( ji ,jj) and mbathy( ji ,jj+1) 84 !! and mbathy(ji+1,jj) and mbathy(ji+1,jj+1) >= jk. 85 !! tmask_i : interior ocean mask at t-point, i.e. excluding duplicated 86 !! rows/lines due to cyclic or North Fold boundaries as well 87 !! as MPP halos. 88 !! 89 !! The lateral friction is set through the value of fmask along 90 !! the coast and topography. This value is defined by rn_shlat, a 91 !! namelist parameter: 61 !! ** Method : The ocean/land mask at t-point is deduced from ko_top 62 !! and ko_bot, the indices of the fist and last ocean t-levels which 63 !! are either defined in usrdef_zgr or read in zgr_read. 64 !! The velocity masks (umask, vmask) 65 !! are deduced from a product of the two neighboring tmask. 66 !! The vorticity mask (fmask) is deduced from tmask taking 67 !! into account the choice of lateral boundary condition (rn_shlat) : 92 68 !! rn_shlat = 0, free slip (no shear along the coast) 93 69 !! rn_shlat = 2, no slip (specified zero velocity at the coast) … … 95 71 !! 2 < rn_shlat, strong slip | in the lateral boundary layer 96 72 !! 97 !! N.B. If nperio not equal to 0, the land/ocean mask arrays98 !! are defined with the proper value at lateral domain boundaries.99 !! 100 !! In case of open boundaries (lk_bdy=T):101 !! - tmask is set to 1 on the points to be computed bay the open102 !! boundaries routines.103 !! 104 !! ** Action : tmask : land/ocean mask at t-point(=0. or 1.)105 !! umask : land/ocean mask at u-point (=0. or 1.)106 !! vmask : land/ocean mask at v-point (=0. or 1.)107 !! fmask : land/ocean mask at f-point (=0. or 1.)108 !! =rn_shlat along lateral boundaries109 !! tmask_i : interiorocean mask73 !! tmask_i : interior ocean mask at t-point, i.e. excluding duplicated 74 !! rows/lines due to cyclic or North Fold boundaries as well 75 !! as MPP halos. 76 !! tmask_h : halo mask at t-point, i.e. excluding duplicated rows/lines 77 !! due to cyclic or North Fold boundaries as well as MPP halos. 78 !! 79 !! ** Action : tmask, umask, vmask, wmask : land/ocean mask 80 !! at t-, u-, v- w, wu-, and wv-points (=0. or 1.) 81 !! fmask : land/ocean mask at f-point (=0., or =1., or 82 !! =rn_shlat along lateral boundaries) 83 !! tmask_i : interior ocean mask 84 !! tmask_h : halo mask 85 !! ssmask , ssumask, ssvmask, ssfmask : 2D ocean mask 110 86 !!---------------------------------------------------------------------- 111 INTEGER :: ji, jj, jk ! dummy loop indices112 INTEGER :: iif, iil, ii0, ii1, ii ! local integers113 INTEGER :: i jf, ijl, ij0, ij1 ! - -114 INTEGER :: i os115 INTEGER :: i srow ! index for ORCA1 starting row116 INTEGER , POINTER, DIMENSION(:,:) :: imsk117 REAL(wp), POINTER, DIMENSION(:,:) :: zwf87 ! 88 INTEGER :: ji, jj, jk ! dummy loop indices 89 INTEGER :: iif, iil ! local integers 90 INTEGER :: ijf, ijl ! - - 91 INTEGER :: iktop, ikbot ! - - 92 INTEGER :: ios, inum 93 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zwf ! 2D workspace 118 94 !! 119 95 NAMELIST/namlbc/ rn_shlat, ln_vorlat 96 NAMELIST/nambdy/ ln_bdy ,nb_bdy, ln_coords_file, cn_coords_file, & 97 & ln_mask_file, cn_mask_file, cn_dyn2d, nn_dyn2d_dta, & 98 & cn_dyn3d, nn_dyn3d_dta, cn_tra, nn_tra_dta, & 99 & ln_tra_dmp, ln_dyn3d_dmp, rn_time_dmp, rn_time_dmp_out, & 100 & cn_ice, nn_ice_dta, & 101 & rn_ice_tem, rn_ice_sal, rn_ice_age, & 102 & ln_vol, nn_volctl, nn_rimwidth, nb_jpk_bdy 120 103 !!--------------------------------------------------------------------- 121 !122 ! IF( nn_timing == 1 ) CALL timing_start('dom_msk')123 !124 CALL wrk_alloc( jpi, jpj, imsk )125 CALL wrk_alloc( jpi, jpj, zwf )126 104 ! 127 105 REWIND( numnam_ref ) ! Namelist namlbc in reference namelist : Lateral momentum boundary condition 128 106 READ ( numnam_ref, namlbc, IOSTAT = ios, ERR = 901 ) 129 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlbc in reference namelist', lwp ) 130 107 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namlbc in reference namelist', lwp ) 131 108 REWIND( numnam_cfg ) ! Namelist namlbc in configuration namelist : Lateral momentum boundary condition 132 109 READ ( numnam_cfg, namlbc, IOSTAT = ios, ERR = 902 ) 133 902 IF( ios /= 0 )CALL ctl_nam ( ios , 'namlbc in configuration namelist', lwp )110 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namlbc in configuration namelist', lwp ) 134 111 IF(lwm) WRITE ( numond, namlbc ) 135 112 … … 142 119 WRITE(numout,*) ' consistency with analytical form ln_vorlat = ',ln_vorlat 143 120 ENDIF 144 145 IF ( rn_shlat == 0. ) THEN ; IF(lwp) WRITE(numout,*) ' ocean lateral free-slip ' 146 ELSEIF ( rn_shlat == 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ocean lateral no-slip ' 147 ELSEIF ( 0. < rn_shlat .AND. rn_shlat < 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ocean lateral partial-slip ' 148 ELSEIF ( 2. < rn_shlat ) THEN ; IF(lwp) WRITE(numout,*) ' ocean lateral strong-slip ' 121 ! 122 IF(lwp) WRITE(numout,*) 123 IF ( rn_shlat == 0. ) THEN ; IF(lwp) WRITE(numout,*) ' ==>>> ocean lateral free-slip' 124 ELSEIF ( rn_shlat == 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ==>>> ocean lateral no-slip' 125 ELSEIF ( 0. < rn_shlat .AND. rn_shlat < 2. ) THEN ; IF(lwp) WRITE(numout,*) ' ==>>> ocean lateral partial-slip' 126 ELSEIF ( 2. < rn_shlat ) THEN ; IF(lwp) WRITE(numout,*) ' ==>>> ocean lateral strong-slip' 149 127 ELSE 150 WRITE(ctmp1,*) ' rn_shlat is negative = ', rn_shlat 151 CALL ctl_stop( ctmp1 ) 152 ENDIF 153 154 ! 1. Ocean/land mask at t-point (computed from mbathy) 155 ! ----------------------------- 156 ! N.B. tmask has already the right boundary conditions since mbathy is ok 157 ! 128 CALL ctl_stop( 'dom_msk: wrong value for rn_shlat (i.e. a negalive value). We stop.' ) 129 ENDIF 130 131 ! 1. Ocean/land mask at t-point (computed from mbathy) 132 ! ----------------------------- 133 ! N.B. tmask has already the right boundary conditions since mbathy is ok 134 ! 158 135 tmask(:,:,:) = 0._wp 159 136 DO jk = 1, jpk 160 137 DO jj = 1, jpj 161 138 DO ji = 1, jpi 162 IF( REAL( mbathy(ji,jj) - jk, wp ) + 0.1_wp >= 0._wp ) tmask(ji,jj,jk) = 1._wp 163 END DO 164 END DO 165 END DO 166 167 ! (ISF) define barotropic mask and mask the ice shelf point 168 ssmask(:,:)=tmask(:,:,1) ! at this stage ice shelf is not masked 169 170 DO jk = 1, jpk 171 DO jj = 1, jpj 172 DO ji = 1, jpi 173 IF( REAL( misfdep(ji,jj) - jk, wp ) - 0.1_wp >= 0._wp ) THEN 174 tmask(ji,jj,jk) = 0._wp 175 END IF 176 END DO 177 END DO 178 END DO 179 180 ! Interior domain mask (used for global sum) 181 ! -------------------- 182 ! tmask_i(:,:) = ssmask(:,:) ! (ISH) tmask_i = 1 even on the ice shelf 183 184 ! tmask_h(:,:) = 1._wp ! 0 on the halo and 1 elsewhere 185 ! iif = jpreci ! ??? 186 ! iil = nlci - jpreci + 1 187 ! ijf = jprecj ! ??? 188 ! ijl = nlcj - jprecj + 1 189 190 ! tmask_h( 1 :iif, : ) = 0._wp ! first columns 191 ! tmask_h(iil:jpi, : ) = 0._wp ! last columns (including mpp extra columns) 192 ! tmask_h( : , 1 :ijf) = 0._wp ! first rows 193 ! tmask_h( : ,ijl:jpj) = 0._wp ! last rows (including mpp extra rows) 194 195 ! north fold mask 196 ! --------------- 197 ! tpol(1:jpiglo) = 1._wp 198 ! fpol(1:jpiglo) = 1._wp 199 ! IF( jperio == 3 .OR. jperio == 4 ) THEN ! T-point pivot 200 ! tpol(jpiglo/2+1:jpiglo) = 0._wp 201 ! fpol( 1 :jpiglo) = 0._wp 202 ! IF( mjg(nlej) == jpjglo ) THEN ! only half of the nlcj-1 row 203 ! DO ji = iif+1, iil-1 204 ! tmask_h(ji,nlej-1) = tmask_h(ji,nlej-1) * tpol(mig(ji)) 205 ! END DO 206 ! ENDIF 207 ! ENDIF 208 209 ! tmask_i(:,:) = tmask_i(:,:) * tmask_h(:,:) 210 211 ! IF( jperio == 5 .OR. jperio == 6 ) THEN ! F-point pivot 212 ! tpol( 1 :jpiglo) = 0._wp 213 ! fpol(jpiglo/2+1:jpiglo) = 0._wp 214 ! ENDIF 215 216 ! 2. Ocean/land mask at u-, v-, and z-points (computed from tmask) 217 ! ------------------------------------------- 139 IF( ( REAL( mbathy (ji,jj) - jk, wp ) + 0.1_wp >= 0._wp ) & 140 & .AND. ( REAL( misfdep(ji,jj) - jk, wp ) - 0.1_wp <= 0._wp ) ) THEN 141 tmask(ji,jj,jk) = 1._wp 142 END IF 143 END DO 144 END DO 145 END DO 146 147 IF ( ln_isfsubgl ) CALL zgr_isf_subgl 148 149 !SF add here lbc_lnk: bug not still understood : cause now domain configuration is read ! 150 !!gm I don't understand why... 151 CALL lbc_lnk( 'dommsk', tmask , 'T', 1._wp ) ! Lateral boundary conditions 152 153 ! Mask corrections for bdy (read in mppini2) 154 REWIND( numnam_ref ) ! Namelist nambdy in reference namelist :Unstructured open boundaries 155 READ ( numnam_ref, nambdy, IOSTAT = ios, ERR = 903) 156 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'nambdy in reference namelist', lwp ) 157 REWIND( numnam_cfg ) ! Namelist nambdy in configuration namelist :Unstructured open boundaries 158 READ ( numnam_cfg, nambdy, IOSTAT = ios, ERR = 904 ) 159 904 IF( ios > 0 ) CALL ctl_nam ( ios , 'nambdy in configuration namelist', lwp ) 160 ! ------------------------ 161 IF ( ln_bdy .AND. ln_mask_file ) THEN 162 CALL iom_open( cn_mask_file, inum ) 163 CALL iom_get ( inum, jpdom_data, 'bdy_msk', bdytmask(:,:) ) 164 CALL iom_close( inum ) 165 DO jk = 1, jpkm1 166 DO jj = 1, jpj 167 DO ji = 1, jpi 168 tmask(ji,jj,jk) = tmask(ji,jj,jk) * bdytmask(ji,jj) 169 END DO 170 END DO 171 END DO 172 ENDIF 173 174 ! Ocean/land mask at u-, v-, and f-points (computed from tmask) 175 ! ---------------------------------------- 176 ! NB: at this point, fmask is designed for free slip lateral boundary condition 218 177 DO jk = 1, jpk 219 178 DO jj = 1, jpjm1 220 DO ji = 1, jpim1 ! vector loop179 DO ji = 1, fs_jpim1 ! vector loop 221 180 umask(ji,jj,jk) = tmask(ji,jj ,jk) * tmask(ji+1,jj ,jk) 222 181 vmask(ji,jj,jk) = tmask(ji,jj ,jk) * tmask(ji ,jj+1,jk) … … 228 187 END DO 229 188 END DO 230 ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet cell at u point 231 ! DO jj = 1, jpjm1 232 ! DO ji = 1, jpim1 ! vector loop 233 ! ssumask(ji,jj) = ssmask(ji,jj) * ssmask(ji+1,jj ) * MIN(1._wp,SUM(umask(ji,jj,:))) 234 ! ssvmask(ji,jj) = ssmask(ji,jj) * ssmask(ji ,jj+1) * MIN(1._wp,SUM(vmask(ji,jj,:))) 235 !! END DO 236 ! DO ji = 1, jpim1 ! NO vector opt. 237 ! ssfmask(ji,jj) = ssmask(ji,jj ) * ssmask(ji+1,jj ) & 238 ! & * ssmask(ji,jj+1) * ssmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:))) 239 ! END DO 240 ! END DO 241 CALL lbc_lnk( 'toto',umask , 'U', 1._wp ) ! Lateral boundary conditions 242 CALL lbc_lnk( 'toto',vmask , 'V', 1._wp ) 243 CALL lbc_lnk( 'toto',fmask , 'F', 1._wp ) 244 ! CALL lbc_lnk( 'toto',ssumask, 'U', 1._wp ) ! Lateral boundary conditions 245 ! CALL lbc_lnk( 'toto',ssvmask, 'V', 1._wp ) 246 ! CALL lbc_lnk( 'toto',ssfmask, 'F', 1._wp ) 247 248 ! 3. Ocean/land mask at wu-, wv- and w points 249 !---------------------------------------------- 189 CALL lbc_lnk_multi( 'dommsk', umask, 'U', 1., vmask, 'V', 1., fmask, 'F', 1. ) ! Lateral boundary conditions 190 191 ! Ocean/land mask at wu-, wv- and w points (computed from tmask) 192 !----------------------------------------- 250 193 wmask (:,:,1) = tmask(:,:,1) ! surface 251 wumask(:,:,1) = umask(:,:,1)252 wvmask(:,:,1) = vmask(:,:,1)253 194 DO jk = 2, jpk ! interior values 254 195 wmask (:,:,jk) = tmask(:,:,jk) * tmask(:,:,jk-1) 255 wumask(:,:,jk) = umask(:,:,jk) * umask(:,:,jk-1)256 wvmask(:,:,jk) = vmask(:,:,jk) * vmask(:,:,jk-1)257 196 END DO 258 197 198 199 ! Ocean/land column mask at t-, u-, and v-points (i.e. at least 1 wet cell in the vertical) 200 ! ---------------------------------------------- 201 ssmask (:,:) = MAXVAL( tmask(:,:,:), DIM=3 ) 202 ssumask(:,:) = MAXVAL( umask(:,:,:), DIM=3 ) 203 ssvmask(:,:) = MAXVAL( vmask(:,:,:), DIM=3 ) 204 205 ! Interior domain mask (used for global sum) 206 ! -------------------- 207 ! 208 iif = nn_hls ; iil = nlci - nn_hls + 1 209 ijf = nn_hls ; ijl = nlcj - nn_hls + 1 210 ! 211 ! ! halo mask : 0 on the halo and 1 elsewhere 212 tmask_h(:,:) = 1._wp 213 tmask_h( 1 :iif, : ) = 0._wp ! first columns 214 tmask_h(iil:jpi, : ) = 0._wp ! last columns (including mpp extra columns) 215 tmask_h( : , 1 :ijf) = 0._wp ! first rows 216 tmask_h( : ,ijl:jpj) = 0._wp ! last rows (including mpp extra rows) 217 ! 218 ! ! north fold mask 219 tpol(1:jpiglo) = 1._wp 220 fpol(1:jpiglo) = 1._wp 221 IF( jperio == 3 .OR. jperio == 4 ) THEN ! T-point pivot 222 tpol(jpiglo/2+1:jpiglo) = 0._wp 223 fpol( 1 :jpiglo) = 0._wp 224 IF( mjg(nlej) == jpjglo ) THEN ! only half of the nlcj-1 row for tmask_h 225 DO ji = iif+1, iil-1 226 tmask_h(ji,nlej-1) = tmask_h(ji,nlej-1) * tpol(mig(ji)) 227 END DO 228 ENDIF 229 ENDIF 230 ! 231 IF( jperio == 5 .OR. jperio == 6 ) THEN ! F-point pivot 232 tpol( 1 :jpiglo) = 0._wp 233 fpol(jpiglo/2+1:jpiglo) = 0._wp 234 ENDIF 235 ! 236 ! ! interior mask : 2D ocean mask x halo mask 237 tmask_i(:,:) = ssmask(:,:) * tmask_h(:,:) 238 239 259 240 ! Lateral boundary conditions on velocity (modify fmask) 260 ! --------------------------------------- 261 DO jk = 1, jpk 262 zwf(:,:) = fmask(:,:,jk) 263 DO jj = 2, jpjm1 264 DO ji = 2, jpim1 ! vector opt. 265 IF( fmask(ji,jj,jk) == 0._wp ) THEN 266 fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), & 267 & zwf(ji-1,jj), zwf(ji,jj-1) ) ) 268 ENDIF 269 END DO 270 END DO 271 DO jj = 2, jpjm1 272 IF( fmask(1,jj,jk) == 0._wp ) THEN 273 fmask(1 ,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 274 ENDIF 275 IF( fmask(jpi,jj,jk) == 0._wp ) THEN 276 fmask(jpi,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 277 ENDIF 278 END DO 279 DO ji = 2, jpim1 280 IF( fmask(ji,1,jk) == 0._wp ) THEN 281 fmask(ji, 1 ,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 282 ENDIF 283 IF( fmask(ji,jpj,jk) == 0._wp ) THEN 284 fmask(ji,jpj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 285 ENDIF 286 END DO 287 END DO 288 ! 289 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA_R2 configuration 290 ! ! Increased lateral friction near of some straits 291 ! ! Gibraltar strait : partial slip (fmask=0.5) 292 ij0 = 101 ; ij1 = 101 293 ii0 = 139 ; ii1 = 140 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 0.5_wp 294 ij0 = 102 ; ij1 = 102 295 ii0 = 139 ; ii1 = 140 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 0.5_wp 296 ! 297 ! ! Bab el Mandeb : partial slip (fmask=1) 298 ij0 = 87 ; ij1 = 88 299 ii0 = 160 ; ii1 = 160 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 1._wp 300 ij0 = 88 ; ij1 = 88 301 ii0 = 159 ; ii1 = 159 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 1._wp 302 ! 303 ! ! Danish straits : strong slip (fmask > 2) 304 ! We keep this as an example but it is instable in this case 305 ! ij0 = 115 ; ij1 = 115 306 ! ii0 = 145 ; ii1 = 146 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp 307 ! ij0 = 116 ; ij1 = 116 308 ! ii0 = 145 ; ii1 = 146 ; fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp 309 ! 310 ENDIF 311 ! 312 IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN ! ORCA R1 configuration 313 ! ! Increased lateral friction near of some straits 314 ! This dirty section will be suppressed by simplification process: 315 ! all this will come back in input files 316 ! Currently these hard-wired indices relate to configuration with 317 ! extend grid (jpjglo=332) 318 ! 319 isrow = 332 - jpjglo 320 ! 321 IF(lwp) WRITE(numout,*) 322 IF(lwp) WRITE(numout,*) ' orca_r1: increase friction near the following straits : ' 323 IF(lwp) WRITE(numout,*) ' Gibraltar ' 324 ii0 = 282 ; ii1 = 283 ! Gibraltar Strait 325 ij0 = 241 - isrow ; ij1 = 241 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 326 327 IF(lwp) WRITE(numout,*) ' Bhosporus ' 328 ii0 = 314 ; ii1 = 315 ! Bhosporus Strait 329 ij0 = 248 - isrow ; ij1 = 248 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 330 331 IF(lwp) WRITE(numout,*) ' Makassar (Top) ' 332 ii0 = 48 ; ii1 = 48 ! Makassar Strait (Top) 333 ij0 = 189 - isrow ; ij1 = 190 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 334 335 IF(lwp) WRITE(numout,*) ' Lombok ' 336 ii0 = 44 ; ii1 = 44 ! Lombok Strait 337 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 338 339 IF(lwp) WRITE(numout,*) ' Ombai ' 340 ii0 = 53 ; ii1 = 53 ! Ombai Strait 341 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 342 343 IF(lwp) WRITE(numout,*) ' Timor Passage ' 344 ii0 = 56 ; ii1 = 56 ! Timor Passage 345 ij0 = 164 - isrow ; ij1 = 165 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp 346 347 IF(lwp) WRITE(numout,*) ' West Halmahera ' 348 ii0 = 58 ; ii1 = 58 ! West Halmahera Strait 349 ij0 = 181 - isrow ; ij1 = 182 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 350 351 IF(lwp) WRITE(numout,*) ' East Halmahera ' 352 ii0 = 55 ; ii1 = 55 ! East Halmahera Strait 353 ij0 = 181 - isrow ; ij1 = 182 - isrow ; fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp 354 ! 355 ENDIF 356 ! 357 CALL lbc_lnk( 'toto',fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask 358 ! 359 ! CAUTION : The fmask may be further modified in dyn_vor_init ( dynvor.F90 ) 360 ! 361 CALL wrk_dealloc( jpi, jpj, imsk ) 362 CALL wrk_dealloc( jpi, jpj, zwf ) 363 ! 364 ! IF( nn_timing == 1 ) CALL timing_stop('dom_msk') 241 ! --------------------------------------- 242 IF( rn_shlat /= 0 ) THEN ! Not free-slip lateral boundary condition 243 ! 244 ALLOCATE( zwf(jpi,jpj) ) 245 ! 246 DO jk = 1, jpk 247 zwf(:,:) = fmask(:,:,jk) 248 DO jj = 2, jpjm1 249 DO ji = fs_2, fs_jpim1 ! vector opt. 250 IF( fmask(ji,jj,jk) == 0._wp ) THEN 251 fmask(ji,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jj), zwf(ji,jj+1), & 252 & zwf(ji-1,jj), zwf(ji,jj-1) ) ) 253 ENDIF 254 END DO 255 END DO 256 DO jj = 2, jpjm1 257 IF( fmask(1,jj,jk) == 0._wp ) THEN 258 fmask(1 ,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(2,jj), zwf(1,jj+1), zwf(1,jj-1) ) ) 259 ENDIF 260 IF( fmask(jpi,jj,jk) == 0._wp ) THEN 261 fmask(jpi,jj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(jpi,jj+1), zwf(jpim1,jj), zwf(jpi,jj-1) ) ) 262 ENDIF 263 END DO 264 DO ji = 2, jpim1 265 IF( fmask(ji,1,jk) == 0._wp ) THEN 266 fmask(ji, 1 ,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,1), zwf(ji,2), zwf(ji-1,1) ) ) 267 ENDIF 268 IF( fmask(ji,jpj,jk) == 0._wp ) THEN 269 fmask(ji,jpj,jk) = rn_shlat * MIN( 1._wp , MAX( zwf(ji+1,jpj), zwf(ji-1,jpj), zwf(ji,jpjm1) ) ) 270 ENDIF 271 END DO 272 #if defined key_agrif 273 IF( .NOT. AGRIF_Root() ) THEN 274 IF ((nbondi == 1).OR.(nbondi == 2)) fmask(nlci-1 , : ,jk) = 0.e0 ! east 275 IF ((nbondi == -1).OR.(nbondi == 2)) fmask(1 , : ,jk) = 0.e0 ! west 276 IF ((nbondj == 1).OR.(nbondj == 2)) fmask(: ,nlcj-1 ,jk) = 0.e0 ! north 277 IF ((nbondj == -1).OR.(nbondj == 2)) fmask(: ,1 ,jk) = 0.e0 ! south 278 ENDIF 279 #endif 280 END DO 281 ! 282 DEALLOCATE( zwf ) 283 ! 284 CALL lbc_lnk( 'dommsk', fmask, 'F', 1._wp ) ! Lateral boundary conditions on fmask 285 ! 286 ! CAUTION : The fmask may be further modified in dyn_vor_init ( dynvor.F90 ) depending on ln_vorlat 287 ! 288 ENDIF 289 ! 290 ! write out mesh mask 291 IF ( nn_msh > 0 ) CALL dom_wri 365 292 ! 366 293 END SUBROUTINE dom_msk -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domngb.F90
r12100 r12101 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 61 zdist = dist(plon, plat, zglam, zgphi) 64 62 65 zgphi(:,:) = zgphi(:,:) - plat66 zdist(:,:) = zglam(:,:) * zglam(:,:) + zgphi(:,:) * zgphi(:,:)67 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 -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domwri.F90
r12100 r12101 154 154 CALL iom_rstput( 0, 0, inum, 'ff_t', ff_t, ktype = jp_r8 ) 155 155 156 ! note that mbkt is set to 1 over land ==> use surface tmask156 ! note that mbkt and mikt is set to 1 over land ==> use surface tmask 157 157 zprt(:,:) = ssmask(:,:) * REAL( mbkt(:,:) , wp ) 158 CALL iom_rstput( 0, 0, inum, 'mbathy', zprt, ktype = jp_i4 ) ! ! nb of ocean T-points 158 CALL iom_rstput( 0, 0, inum, 'mbathy', zprt, ktype = jp_i4 ) ! ! nb of ocean T-points 159 CALL iom_rstput( 0, 0, inum, 'bathy_metry', bathy(:,:) * ssmask(:,:), ktype = jp_r8 ) ! ! bathymetry 159 160 zprt(:,:) = ssmask(:,:) * REAL( mikt(:,:) , wp ) 160 CALL iom_rstput( 0, 0, inum, 'misf', zprt, ktype = jp_i4 ) ! ! nb of ocean T-points 161 zprt(:,:) = ssmask(:,:) * REAL( risfdep(:,:) , wp ) 162 CALL iom_rstput( 0, 0, inum, 'isfdraft', zprt, ktype = jp_r8 ) ! ! nb of ocean T-points 163 ! ! vertical mesh 161 CALL iom_rstput( 0, 0, inum, 'misf', zprt, ktype = jp_i4 ) ! ! first wet level 162 CALL iom_rstput( 0, 0, inum, 'isfdraft' , risfdep(:,:) * ssmask(:,:), ktype = jp_r8 ) ! ! ice shelf draft 163 zprt(:,:) = ssmask(:,:) * REAL( mbkt(:,:) - mikt(:,:) + 1, wp ) 164 CALL iom_rstput( 0, 0, inum, 'mhw',zprt, ktype = jp_i4 ) 165 CALL iom_rstput( 0, 0, inum, 'hw' ,(bathy-risfdep)*ssmask, ktype = jp_r8 ) 166 167 ! ! vertical mesh 164 168 CALL iom_rstput( 0, 0, inum, 'e3t_0', e3t_0, ktype = jp_r8 ) ! ! scale factors 165 169 CALL iom_rstput( 0, 0, inum, 'e3u_0', e3u_0, ktype = jp_r8 ) … … 177 181 ENDIF 178 182 ! 179 ! IF( ll_wd ) CALL iom_rstput( 0, 0, inum, 'ht_0' , ht_0 , ktype = jp_r8 )180 181 183 ! ! ============================ 182 184 CALL iom_close( inum ) ! close the files -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/domzgr.F90
r12100 r12101 17 17 !! 3.4 ! 2012-08 (J. Siddorn) added Siddorn and Furner stretching function 18 18 !! 3.4 ! 2012-12 (R. Bourdalle-Badie and G. Reffray) modify C1D case 19 !! 3.6 ! 2014-11 (P. Mathiot and C. Harris) add ice shelf capability e19 !! 3.6 ! 2014-11 (P. Mathiot and C. Harris) add ice shelf capability 20 20 !! 3.? ! 2015-11 (H. Liu) Modifications for Wetting/Drying 21 21 !!---------------------------------------------------------------------- … … 35 35 !! fgamma : Siddorn and Furner 2012 stretching function 36 36 !!--------------------------------------------------------------------- 37 USE oce ! ocean variables38 37 USE dom_oce ! ocean domain 39 ! USE closea ! closed seas40 38 ! 41 39 USE in_out_manager ! I/O manager … … 43 41 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 44 42 USE lib_mpp ! distributed memory computing library 45 USE wrk_nemo ! Memory allocation 46 USE timing ! Timing 43 USE lib_fortran 47 44 USE dombat 45 USE domisf 48 46 49 47 IMPLICIT NONE … … 51 49 52 50 PUBLIC dom_zgr ! called by dom_init.F90 53 51 ! 54 52 ! !!* Namelist namzgr_sco * 55 53 LOGICAL :: ln_s_sh94 ! use hybrid s-sig Song and Haidvogel 1994 stretching function fssig1 (ln_sco=T) … … 60 58 REAL(wp) :: rn_rmax ! maximum cut-off r-value allowed (0<rn_rmax<1) 61 59 REAL(wp) :: rn_hc ! Critical depth for transition from sigma to stretched coordinates 62 INTEGER , PUBLIC :: ntopo !: = 0/1 ,compute/read the bathymetry file63 REAL(wp), PUBLIC :: e3zps_min !: miminum thickness for partial steps (meters)64 REAL(wp), PUBLIC :: e3zps_rat !: minimum thickness ration for partial steps65 INTEGER, PUBLIC :: nperio !: type of lateral boundary condition66 60 67 61 ! Song and Haidvogel 1994 stretching parameters … … 121 115 !!---------------------------------------------------------------------- 122 116 ! 123 ! IF( nn_timing == 1 ) CALL timing_start('dom_zgr')124 117 ! 125 118 REWIND( numnam_ref ) ! Namelist namzgr in reference namelist : Vertical coordinate … … 152 145 IF( ioptio /= 1 ) CALL ctl_stop( ' none or several vertical coordinate options used' ) 153 146 ! 147 IF ( ln_isfcav ) CALL zgr_isf_nam 154 148 ioptio = 0 155 149 IF ( ln_zco .AND. ln_isfcav ) ioptio = ioptio + 1 … … 164 158 IF( ln_zps ) CALL zgr_zps ! Partial step z-coordinate 165 159 IF( ln_sco ) CALL zgr_sco ! s-coordinate or hybrid z-s coordinate 160 CALL zgr_bat_ctl ! check bathymetry (mbathy) and suppress isolated ocean points 166 161 ! 167 162 ! final adjustment of mbathy & check 168 163 ! ----------------------------------- 169 IF( lzoom ) CALL zgr_bat_zoom ! correct mbathy in case of zoom subdomain170 CALL zgr_bat_ctl ! check bathymetry (mbathy) and suppress isolated ocean points171 164 CALL zgr_bot_level ! deepest ocean level for t-, u- and v-points 172 165 CALL zgr_top_level ! shallowest ocean level for T-, U-, V- points … … 175 168 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 176 169 WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ), & 177 & ' w ', MINVAL( gdepw_0(:,:,:) ) , '3w ', MINVAL( gde3w_0(:,:,:) )170 & ' w ', MINVAL( gdepw_0(:,:,:) ) 178 171 WRITE(numout,*) ' MIN val e3 t ', MINVAL( e3t_0(:,:,:) ), ' f ', MINVAL( e3f_0(:,:,:) ), & 179 172 & ' u ', MINVAL( e3u_0(:,:,:) ), ' u ', MINVAL( e3v_0(:,:,:) ), & … … 182 175 183 176 WRITE(numout,*) ' MAX val depth t ', MAXVAL( gdept_0(:,:,:) ), & 184 & ' w ', MAXVAL( gdepw_0(:,:,:) ) , '3w ', MAXVAL( gde3w_0(:,:,:) )177 & ' w ', MAXVAL( gdepw_0(:,:,:) ) 185 178 WRITE(numout,*) ' MAX val e3 t ', MAXVAL( e3t_0(:,:,:) ), ' f ', MAXVAL( e3f_0(:,:,:) ), & 186 179 & ' u ', MAXVAL( e3u_0(:,:,:) ), ' u ', MAXVAL( e3v_0(:,:,:) ), & … … 188 181 & ' w ', MAXVAL( e3w_0(:,:,:) ) 189 182 ENDIF 190 !191 ! IF( nn_timing == 1 ) CALL timing_stop('dom_zgr')192 183 ! 193 184 END SUBROUTINE dom_zgr … … 222 213 REAL(wp) :: za2, zkth2, zacr2 ! Values for optional double tanh function set from parameters 223 214 !!---------------------------------------------------------------------- 224 !225 ! IF( nn_timing == 1 ) CALL timing_start('zgr_z')226 215 ! 227 216 ! Set variables from parameters … … 322 311 IF ( ln_isfcav .OR. ln_e3_dep ) THEN ! e3. = dk[gdep] 323 312 ! 324 !==>>> need to be like this to compute the pressure gradient with ISF.325 ! If not, level beneath the ISF are not aligned (sum(e3t) /= depth)326 ! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively327 !328 313 DO jk = 1, jpkm1 329 314 e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk) … … 354 339 IF( gdepw_1d(jk) < 0._wp .OR. gdept_1d(jk) < 0._wp ) CALL ctl_stop( 'dom:zgr_z: gdepw_1d or gdept_1d < 0 ' ) 355 340 END DO 356 !357 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_z')358 341 ! 359 342 END SUBROUTINE zgr_z … … 401 384 !!---------------------------------------------------------------------- 402 385 ! 403 ! IF( nn_timing == 1 ) CALL timing_start('zgr_bat')404 !405 386 IF(lwp) WRITE(numout,*) 406 387 IF(lwp) WRITE(numout,*) ' zgr_bat : defines level and meter bathymetry' … … 411 392 ! ! global domain level and meter bathymetry (idta,zdta) 412 393 ! 413 ALLOCATE( idta(jpi dta,jpjdta), STAT=ierror )394 ALLOCATE( idta(jpiglo,jpjglo), STAT=ierror ) 414 395 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate idta array' ) 415 ALLOCATE( zdta(jpi dta,jpjdta), STAT=ierror )396 ALLOCATE( zdta(jpiglo,jpjglo), STAT=ierror ) 416 397 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate zdta array' ) 417 398 ! … … 439 420 IF(lwp) WRITE(numout,*) 440 421 IF(lwp) WRITE(numout,*) ' bathymetry field: flat basin with a bump' 441 ii_bump = jpi dta/ 2 ! i-index of the bump center442 ij_bump = jpj dta/ 2 ! j-index of the bump center422 ii_bump = jpiglo / 2 ! i-index of the bump center 423 ij_bump = jpjglo / 2 ! j-index of the bump center 443 424 r_bump = 50000._wp ! bump radius (meters) 444 425 h_bump = 2700._wp ! bump height (meters) … … 450 431 IF(lwp) WRITE(numout,*) ' background ocean depth = ', h_oce , ' meters' 451 432 ! 452 DO jj = 1, jpj dta! zdta :453 DO ji = 1, jpi dta433 DO jj = 1, jpjglo ! zdta : 434 DO ji = 1, jpiglo 454 435 zi = FLOAT( ji - ii_bump ) * ppe1_m / r_bump 455 436 zj = FLOAT( jj - ij_bump ) * ppe2_m / r_bump … … 467 448 ENDIF 468 449 ENDIF 450 ! 469 451 ! ! set GLOBAL boundary conditions 470 ! ! Caution : idta on the global domain: use of jperio, not nperio471 452 IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN 472 453 idta( : , 1 ) = -1 ; zdta( : , 1 ) = -1._wp 473 idta( : ,jpj dta) = 0 ; zdta( : ,jpjdta) = 0._wp454 idta( : ,jpjglo) = 0 ; zdta( : ,jpjglo) = 0._wp 474 455 ELSEIF( jperio == 2 ) THEN 475 456 idta( : , 1 ) = idta( : , 3 ) ; zdta( : , 1 ) = zdta( : , 3 ) 476 idta( : ,jpj dta) = 0 ; zdta( : ,jpjdta) = 0._wp457 idta( : ,jpjglo) = 0 ; zdta( : ,jpjglo) = 0._wp 477 458 idta( 1 , : ) = 0 ; zdta( 1 , : ) = 0._wp 478 idta(jpi dta, : ) = 0 ; zdta(jpidta, : ) = 0._wp459 idta(jpiglo, : ) = 0 ; zdta(jpiglo, : ) = 0._wp 479 460 ELSE 480 461 ih = 0 ; zh = 0._wp 481 462 IF( ln_sco ) ih = jpkm1 ; IF( ln_sco ) zh = h_oce 482 463 idta( : , 1 ) = ih ; zdta( : , 1 ) = zh 483 idta( : ,jpj dta) = ih ; zdta( : ,jpjdta) = zh464 idta( : ,jpjglo) = ih ; zdta( : ,jpjglo) = zh 484 465 idta( 1 , : ) = ih ; zdta( 1 , : ) = zh 485 idta(jpi dta, : ) = ih ; zdta(jpidta, : ) = zh466 idta(jpiglo, : ) = ih ; zdta(jpiglo, : ) = zh 486 467 ENDIF 487 468 … … 497 478 risfdep(:,:)=0.e0 498 479 misfdep(:,:)=1 499 !500 ! (ISF) TODO build ice draft netcdf file for isomip and build the corresponding part of code501 IF( cp_cfg == "isomip" .AND. ln_isfcav ) THEN502 risfdep(:,:)=200.e0503 misfdep(:,:)=1504 ij0 = 1 ; ij1 = 40505 DO jj = mj0(ij0), mj1(ij1)506 risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp507 END DO508 WHERE( bathy(:,:) <= 0._wp ) risfdep(:,:) = 0._wp509 !510 ELSEIF ( cp_cfg == "isomip2" .AND. ln_isfcav ) THEN511 !512 risfdep(:,:)=0.e0513 misfdep(:,:)=1514 ij0 = 1 ; ij1 = 40515 DO jj = mj0(ij0), mj1(ij1)516 risfdep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp517 END DO518 WHERE( bathy(:,:) <= 0._wp ) risfdep(:,:) = 0._wp519 END IF520 480 ! 521 481 DEALLOCATE( idta, zdta ) … … 591 551 CALL iom_get ( inum, jpdom_data, 'isf_draft', risfdep ) 592 552 CALL iom_close( inum ) 593 WHERE( bathy(:,:) <= 0._wp ) risfdep(:,:) = 0._wp594 595 ! set grounded point to 0596 ! (a treshold could be set here if needed, or set it offline based on the grounded fraction)597 WHERE ( bathy(:,:) <= risfdep(:,:) + rn_isfhmin )598 misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp599 mbathy (:,:) = 0 ; bathy (:,:) = 0._wp600 END WHERE601 553 END IF 602 554 ! … … 633 585 ENDIF 634 586 ! 635 ! IF( nn_closea == 0 ) CALL clo_bat( bathy, mbathy ) !== NO closed seas or lakes ==!636 !637 587 IF ( .not. ln_sco ) THEN !== set a minimum depth ==! 638 588 IF( rn_hmin < 0._wp ) THEN ; ik = - INT( rn_hmin ) ! from a nb of level 639 589 ELSE ; ik = MINLOC( gdepw_1d, mask = gdepw_1d > rn_hmin, dim = 1 ) ! from a depth 640 590 ENDIF 641 zhmin = gdepw_1d(ik+1) 591 zhmin = gdepw_1d(ik+1) ! minimum depth = ik+1 w-levels 642 592 WHERE( bathy(:,:) <= 0._wp ) ; bathy(:,:) = 0._wp ! min=0 over the lands 643 ELSE WHERE 593 ELSE WHERE ( risfdep == 0._wp ); bathy(:,:) = MAX( zhmin , bathy(:,:) ) ! min=zhmin over the oceans 644 594 END WHERE 645 595 IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 646 596 ENDIF 647 597 ! 648 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_bat')649 !650 598 END SUBROUTINE zgr_bat 651 652 653 SUBROUTINE zgr_bat_zoom654 !!----------------------------------------------------------------------655 !! *** ROUTINE zgr_bat_zoom ***656 !!657 !! ** Purpose : - Close zoom domain boundary if necessary658 !! - Suppress Med Sea from ORCA R2 and R05 arctic zoom659 !!660 !! ** Method :661 !!662 !! ** Action : - update mbathy: level bathymetry (in level index)663 !!----------------------------------------------------------------------664 INTEGER :: ii0, ii1, ij0, ij1 ! temporary integers665 !!----------------------------------------------------------------------666 !667 IF(lwp) WRITE(numout,*)668 IF(lwp) WRITE(numout,*) ' zgr_bat_zoom : modify the level bathymetry for zoom domain'669 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~'670 !671 ! Zoom domain672 ! ===========673 !674 ! Forced closed boundary if required675 IF( lzoom_s ) mbathy( : , mj0(jpjzoom):mj1(jpjzoom) ) = 0676 IF( lzoom_w ) mbathy( mi0(jpizoom):mi1(jpizoom) , : ) = 0677 IF( lzoom_e ) mbathy( mi0(jpiglo+jpizoom-1):mi1(jpiglo+jpizoom-1) , : ) = 0678 IF( lzoom_n ) mbathy( : , mj0(jpjglo+jpjzoom-1):mj1(jpjglo+jpjzoom-1) ) = 0679 !680 ! Configuration specific domain modifications681 ! (here, ORCA arctic configuration: suppress Med Sea)682 IF( cp_cfg == "orca" .AND. cp_cfz == "arctic" ) THEN683 SELECT CASE ( jp_cfg )684 ! ! =======================685 CASE ( 2 ) ! ORCA_R2 configuration686 ! ! =======================687 IF(lwp) WRITE(numout,*) ' ORCA R2 arctic zoom: suppress the Med Sea'688 ii0 = 141 ; ii1 = 162 ! Sea box i,j indices689 ij0 = 98 ; ij1 = 110690 ! ! =======================691 CASE ( 05 ) ! ORCA_R05 configuration692 ! ! =======================693 IF(lwp) WRITE(numout,*) ' ORCA R05 arctic zoom: suppress the Med Sea'694 ii0 = 563 ; ii1 = 642 ! zero over the Med Sea boxe695 ij0 = 314 ; ij1 = 370696 END SELECT697 !698 mbathy( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0 ! zero over the Med Sea boxe699 !700 ENDIF701 !702 END SUBROUTINE zgr_bat_zoom703 704 599 705 600 SUBROUTINE zgr_bat_ctl … … 727 622 INTEGER :: ji, jj, jl ! dummy loop indices 728 623 INTEGER :: icompt, ibtest, ikmax ! temporary integers 729 REAL(wp), POINTER, DIMENSION(:,:) :: zbathy 730 !!---------------------------------------------------------------------- 731 ! 732 ! IF( nn_timing == 1 ) CALL timing_start('zgr_bat_ctl') 733 ! 734 CALL wrk_alloc( jpi, jpj, zbathy ) 624 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zbathy 625 !!---------------------------------------------------------------------- 626 ! 627 ALLOCATE(zbathy(jpi,jpj)) 735 628 ! 736 629 IF(lwp) WRITE(numout,*) … … 743 636 icompt = 0 744 637 DO jl = 1, 2 745 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN638 IF( l_Iperio ) THEN 746 639 mbathy( 1 ,:) = mbathy(jpim1,:) ! local domain is cyclic east-west 747 640 mbathy(jpi,:) = mbathy( 2 ,:) 748 641 ENDIF 642 zbathy(:,:) = FLOAT( mbathy(:,:) ) 643 CALL lbc_lnk( 'domzgr',zbathy, 'T', 1._wp ) 644 mbathy(:,:) = INT( zbathy(:,:) ) 645 749 646 DO jj = 2, jpjm1 750 647 DO ji = 2, jpim1 … … 760 657 END DO 761 658 END DO 762 ! IF( lk_mpp ) CALL mpp_sum( icompt ) 659 660 IF( lk_mpp ) CALL mpp_sum( 'domzgr', icompt ) 763 661 IF( icompt == 0 ) THEN 764 662 IF(lwp) WRITE(numout,*)' no isolated ocean grid points' … … 766 664 IF(lwp) WRITE(numout,*)' ',icompt,' ocean grid points suppressed' 767 665 ENDIF 768 IF( lk_mpp ) THEN 769 770 CALL lbc_lnk( 'toto',zbathy, 'T', 1._wp )771 772 ENDIF 666 667 zbathy(:,:) = FLOAT( mbathy(:,:) ) 668 CALL lbc_lnk( 'domzgr',zbathy, 'T', 1._wp ) 669 mbathy(:,:) = INT( zbathy(:,:) ) 670 773 671 ! ! East-west cyclic boundary conditions 774 IF( nperio == 0 ) THEN775 IF(lwp) WRITE(numout,*) ' mbathy set to 0 along east and west boundary: nperio = ', nperio672 IF( jperio == 0 ) THEN 673 IF(lwp) WRITE(numout,*) ' mbathy set to 0 along east and west boundary: jperio = ', jperio 776 674 IF( lk_mpp ) THEN 777 675 IF( nbondi == -1 .OR. nbondi == 2 ) THEN … … 790 688 ENDIF 791 689 ENDIF 792 ELSEIF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6) THEN793 IF(lwp) WRITE(numout,*)' east-west cyclic boundary conditions on mbathy: nperio = ', nperio690 ELSEIF( l_Iperio ) THEN 691 IF(lwp) WRITE(numout,*)' east-west cyclic boundary conditions on mbathy: jperio = ', jperio 794 692 mbathy( 1 ,:) = mbathy(jpim1,:) 795 693 mbathy(jpi,:) = mbathy( 2 ,:) 796 ELSEIF( nperio == 2 ) THEN797 IF(lwp) WRITE(numout,*) ' equatorial boundary conditions on mbathy: nperio = ', nperio694 ELSEIF( jperio == 2 ) THEN 695 IF(lwp) WRITE(numout,*) ' equatorial boundary conditions on mbathy: jperio = ', jperio 798 696 ELSE 799 697 IF(lwp) WRITE(numout,*) ' e r r o r' 800 IF(lwp) WRITE(numout,*) ' parameter , nperio = ', nperio698 IF(lwp) WRITE(numout,*) ' parameter , jperio = ', jperio 801 699 ! STOP 'dom_mba' 802 700 ENDIF 701 803 702 ! Boundary condition on mbathy 804 703 IF( .NOT.lk_mpp ) THEN … … 806 705 ! ... mono- or macro-tasking: T-point, >0, 2D array, no slab 807 706 zbathy(:,:) = FLOAT( mbathy(:,:) ) 808 CALL lbc_lnk( ' toto',zbathy, 'T', 1._wp )707 CALL lbc_lnk( 'domzgr',zbathy, 'T', 1._wp ) 809 708 mbathy(:,:) = INT( zbathy(:,:) ) 810 709 ENDIF 710 811 711 ! Number of ocean level inferior or equal to jpkm1 812 ikmax = 0 813 DO jj = 1, jpj 814 DO ji = 1, jpi 815 ikmax = MAX( ikmax, mbathy(ji,jj) ) 816 END DO 817 END DO 818 !!gm !!! test to do: ikmax = MAX( mbathy(:,:) ) ??? 712 zbathy(:,:) = FLOAT( mbathy(:,:) ) 713 ikmax = glob_max( 'domzgr', zbathy(:,:) ) 714 819 715 IF( ikmax > jpkm1 ) THEN 820 716 IF(lwp) WRITE(numout,*) ' maximum number of ocean level = ', ikmax,' > jpk-1' … … 825 721 ENDIF 826 722 ! 827 CALL wrk_dealloc( jpi, jpj, zbathy ) 828 ! 829 !! IF( nn_timing == 1 ) CALL timing_stop('zgr_bat_ctl') 723 DEALLOCATE( zbathy ) 830 724 ! 831 725 END SUBROUTINE zgr_bat_ctl … … 845 739 !!---------------------------------------------------------------------- 846 740 INTEGER :: ji, jj ! dummy loop indices 847 REAL(wp), POINTER, DIMENSION(:,:) :: zmbk 848 !!---------------------------------------------------------------------- 849 ! 850 ! IF( nn_timing == 1 ) CALL timing_start('zgr_bot_level') 851 ! 852 CALL wrk_alloc( jpi, jpj, zmbk ) 741 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zmbk 742 !!---------------------------------------------------------------------- 743 ! 744 ALLOCATE( zmbk(jpi,jpj) ) 853 745 ! 854 746 IF(lwp) WRITE(numout,*) … … 866 758 END DO 867 759 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 868 zmbk(:,:) = REAL( mbku(:,:), wp ) ; CALL lbc_lnk('toto',zmbk,'U',1.) ; mbku (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 869 zmbk(:,:) = REAL( mbkv(:,:), wp ) ; CALL lbc_lnk('toto',zmbk,'V',1.) ; mbkv (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 870 ! 871 CALL wrk_dealloc( jpi, jpj, zmbk ) 872 ! 873 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_bot_level') 760 zmbk(:,:) = REAL( mbku(:,:), wp ) ; CALL lbc_lnk('domzgr',zmbk,'U',1.) ; mbku (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 761 zmbk(:,:) = REAL( mbkv(:,:), wp ) ; CALL lbc_lnk('domzgr',zmbk,'V',1.) ; mbkv (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 762 ! 763 DEALLOCATE( zmbk ) 874 764 ! 875 765 END SUBROUTINE zgr_bot_level … … 889 779 !!---------------------------------------------------------------------- 890 780 INTEGER :: ji, jj ! dummy loop indices 891 REAL(wp), POINTER, DIMENSION(:,:) :: zmik 892 !!---------------------------------------------------------------------- 893 ! 894 ! IF( nn_timing == 1 ) CALL timing_start('zgr_top_level') 895 ! 896 CALL wrk_alloc( jpi, jpj, zmik ) 781 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zmik 782 !!---------------------------------------------------------------------- 783 ! 784 ALLOCATE( zmik(jpi,jpj) ) 897 785 ! 898 786 IF(lwp) WRITE(numout,*) … … 911 799 912 800 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 913 zmik(:,:) = REAL( miku(:,:), wp ) ; CALL lbc_lnk('toto',zmik,'U',1.) ; miku (:,:) = MAX( INT( zmik(:,:) ), 1 ) 914 zmik(:,:) = REAL( mikv(:,:), wp ) ; CALL lbc_lnk('toto',zmik,'V',1.) ; mikv (:,:) = MAX( INT( zmik(:,:) ), 1 ) 915 zmik(:,:) = REAL( mikf(:,:), wp ) ; CALL lbc_lnk('toto',zmik,'F',1.) ; mikf (:,:) = MAX( INT( zmik(:,:) ), 1 ) 916 ! 917 CALL wrk_dealloc( jpi, jpj, zmik ) 918 ! 919 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_top_level') 801 zmik(:,:) = REAL( miku(:,:), wp ) ; CALL lbc_lnk('domzgr',zmik,'U',1.) ; miku (:,:) = MAX( INT( zmik(:,:) ), 1 ) 802 zmik(:,:) = REAL( mikv(:,:), wp ) ; CALL lbc_lnk('domzgr',zmik,'V',1.) ; mikv (:,:) = MAX( INT( zmik(:,:) ), 1 ) 803 zmik(:,:) = REAL( mikf(:,:), wp ) ; CALL lbc_lnk('domzgr',zmik,'F',1.) ; mikf (:,:) = MAX( INT( zmik(:,:) ), 1 ) 804 ! 805 DEALLOCATE( zmik ) 920 806 ! 921 807 END SUBROUTINE zgr_top_level … … 932 818 INTEGER :: jk 933 819 !!---------------------------------------------------------------------- 934 !935 ! IF( nn_timing == 1 ) CALL timing_start('zgr_zco')936 820 ! 937 821 DO jk = 1, jpk 938 822 gdept_0(:,:,jk) = gdept_1d(jk) 939 823 gdepw_0(:,:,jk) = gdepw_1d(jk) 940 gde3w_0(:,:,jk) = gdepw_1d(jk)941 824 e3t_0 (:,:,jk) = e3t_1d (jk) 942 825 e3u_0 (:,:,jk) = e3t_1d (jk) … … 947 830 e3vw_0 (:,:,jk) = e3w_1d (jk) 948 831 END DO 949 !950 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_zco')951 832 ! 952 833 END SUBROUTINE zgr_zco … … 1004 885 REAL(wp) :: zdiff ! temporary scalar 1005 886 REAL(wp) :: zmax ! temporary scalar 1006 REAL(wp), POINTER, DIMENSION(:,:,:) :: zprt887 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zprt 1007 888 !!--------------------------------------------------------------------- 1008 889 ! 1009 ! IF( nn_timing == 1 ) CALL timing_start('zgr_zps') 1010 ! 1011 CALL wrk_alloc( jpi,jpj,jpk, zprt ) 890 ALLOCATE( zprt(jpi,jpj,jpk) ) 1012 891 ! 1013 892 IF(lwp) WRITE(numout,*) … … 1015 894 IF(lwp) WRITE(numout,*) ' ~~~~~~~ ' 1016 895 IF(lwp) WRITE(numout,*) ' mbathy is recomputed : bathy_level file is NOT used' 896 897 ! compute position of the ice shelf grounding line 898 ! set bathy and isfdraft to 0 where grounded 899 IF ( ln_isfcav ) CALL zgr_isf_zspace 1017 900 1018 901 ! bathymetry in level (from bathy_meter) … … 1033 916 END DO 1034 917 918 ! Check compatibility between bathy and iceshelf draft 919 ! insure at least 2 wet level on the vertical under an ice shelf 920 ! compute misfdep and adjust isf draft if needed 921 IF ( ln_isfcav ) CALL zgr_isf_kspace 922 1035 923 ! Scale factors and depth at T- and W-points 1036 924 DO jk = 1, jpk ! intitialization to the reference z-coordinate … … 1041 929 END DO 1042 930 1043 ! Bathy, iceshelf draft, scale factor and depth at T- and W- points in case of isf1044 IF ( ln_isfcav ) CALL zgr_isf1045 1046 931 ! Scale factors and depth at T- and W-points 1047 IF ( .NOT. ln_isfcav ) THEN1048 DO jj = 1, jpj1049 DO ji = 1, jpi1050 ik = mbathy(ji,jj)1051 IF( ik > 0 ) THEN ! ocean point only1052 ! max ocean level case1053 IF( ik == jpkm1 ) THEN1054 zdepwp = bathy(ji,jj)1055 ze3tp = bathy(ji,jj) - gdepw_1d(ik)1056 ze3wp = 0.5_wp * e3w_1d(ik) * ( 1._wp + ( ze3tp/e3t_1d(ik) ) )1057 e3t_0(ji,jj,ik ) = ze3tp1058 e3t_0(ji,jj,ik+1) = ze3tp1059 e3w_0(ji,jj,ik ) = ze3wp1060 e3w_0(ji,jj,ik+1) = ze3tp1061 gdepw_0(ji,jj,ik+1) = zdepwp1062 gdept_0(ji,jj,ik ) = gdept_1d(ik-1) + ze3wp1063 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + ze3tp1064 !1065 ELSE ! standard case1066 IF( bathy(ji,jj) <= gdepw_1d(ik+1) ) THEN ; gdepw_0(ji,jj,ik+1) = bathy(ji,jj)1067 ELSE ; gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1)1068 ENDIF1069 !gm Bug? check the gdepw_1d1070 ! ... on ik1071 gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) ) &1072 & * ((gdept_1d( ik ) - gdepw_1d(ik) ) &1073 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) ))1074 e3t_0 (ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) ) &1075 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) )1076 e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) ) &1077 & * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) )1078 ! ... on ik+11079 e3w_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik)1080 e3t_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik)1081 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + e3t_0(ji,jj,ik)1082 ENDIF1083 ENDIF1084 END DO1085 END DO1086 !1087 it = 01088 DO jj = 1, jpj1089 DO ji = 1, jpi1090 ik = mbathy(ji,jj)1091 IF( ik > 0 ) THEN ! ocean point only1092 e3tp (ji,jj) = e3t_0(ji,jj,ik)1093 e3wp (ji,jj) = e3w_0(ji,jj,ik)1094 ! test1095 zdiff= gdepw_0(ji,jj,ik+1) - gdept_0(ji,jj,ik )1096 IF( zdiff <= 0._wp .AND. lwp ) THEN1097 it = it + 11098 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj1099 WRITE(numout,*) ' bathy = ', bathy(ji,jj)1100 WRITE(numout,*) ' gdept_0 = ', gdept_0(ji,jj,ik), ' gdepw_0 = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff1101 WRITE(numout,*) ' e3tp = ', e3t_0 (ji,jj,ik), ' e3wp = ', e3w_0 (ji,jj,ik )1102 ENDIF1103 ENDIF1104 END DO1105 END DO1106 END IF1107 !1108 ! Scale factors and depth at U-, V-, UW and VW-points1109 DO jk = 1, jpk ! initialisation to z-scale factors1110 e3u_0 (:,:,jk) = e3t_1d(jk)1111 e3v_0 (:,:,jk) = e3t_1d(jk)1112 e3uw_0(:,:,jk) = e3w_1d(jk)1113 e3vw_0(:,:,jk) = e3w_1d(jk)1114 END DO1115 1116 DO jk = 1,jpk ! Computed as the minimum of neighbooring scale factors1117 DO jj = 1, jpjm11118 DO ji = 1, jpim1 ! vector opt.1119 e3u_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji+1,jj,jk) )1120 e3v_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji,jj+1,jk) )1121 e3uw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji+1,jj,jk) )1122 e3vw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji,jj+1,jk) )1123 END DO1124 END DO1125 END DO1126 IF ( ln_isfcav ) THEN1127 ! (ISF) define e3uw (adapted for 2 cells in the water column)1128 DO jj = 2, jpjm11129 DO ji = 2, jpim1 ! vector opt.1130 ikb = MAX(mbathy (ji,jj),mbathy (ji+1,jj))1131 ikt = MAX(misfdep(ji,jj),misfdep(ji+1,jj))1132 IF (ikb == ikt+1) e3uw_0(ji,jj,ikb) = MIN( gdept_0(ji,jj,ikb ), gdept_0(ji+1,jj ,ikb ) ) &1133 & - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji+1,jj ,ikb-1) )1134 ikb = MAX(mbathy (ji,jj),mbathy (ji,jj+1))1135 ikt = MAX(misfdep(ji,jj),misfdep(ji,jj+1))1136 IF (ikb == ikt+1) e3vw_0(ji,jj,ikb) = MIN( gdept_0(ji,jj,ikb ), gdept_0(ji ,jj+1,ikb ) ) &1137 & - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji ,jj+1,ikb-1) )1138 END DO1139 END DO1140 END IF1141 1142 CALL lbc_lnk('toto', e3u_0 , 'U', 1._wp ) ; CALL lbc_lnk('toto', e3uw_0, 'U', 1._wp ) ! lateral boundary conditions1143 CALL lbc_lnk( 'toto',e3v_0 , 'V', 1._wp ) ; CALL lbc_lnk('toto', e3vw_0, 'V', 1._wp )1144 !1145 1146 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries)1147 WHERE( e3u_0 (:,:,jk) == 0._wp ) e3u_0 (:,:,jk) = e3t_1d(jk)1148 WHERE( e3v_0 (:,:,jk) == 0._wp ) e3v_0 (:,:,jk) = e3t_1d(jk)1149 WHERE( e3uw_0(:,:,jk) == 0._wp ) e3uw_0(:,:,jk) = e3w_1d(jk)1150 WHERE( e3vw_0(:,:,jk) == 0._wp ) e3vw_0(:,:,jk) = e3w_1d(jk)1151 END DO1152 1153 ! Scale factor at F-point1154 DO jk = 1, jpk ! initialisation to z-scale factors1155 e3f_0(:,:,jk) = e3t_1d(jk)1156 END DO1157 DO jk = 1, jpk ! Computed as the minimum of neighbooring V-scale factors1158 DO jj = 1, jpjm11159 DO ji = 1, jpim1 ! vector opt.1160 e3f_0(ji,jj,jk) = MIN( e3v_0(ji,jj,jk), e3v_0(ji+1,jj,jk) )1161 END DO1162 END DO1163 END DO1164 CALL lbc_lnk('toto', e3f_0, 'F', 1._wp ) ! Lateral boundary conditions1165 !1166 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries)1167 WHERE( e3f_0(:,:,jk) == 0._wp ) e3f_0(:,:,jk) = e3t_1d(jk)1168 END DO1169 !!gm bug ? : must be a do loop with mj0,mj11170 !1171 e3t_0(:,mj0(1),:) = e3t_0(:,mj0(2),:) ! we duplicate factor scales for jj = 1 and jj = 21172 e3w_0(:,mj0(1),:) = e3w_0(:,mj0(2),:)1173 e3u_0(:,mj0(1),:) = e3u_0(:,mj0(2),:)1174 e3v_0(:,mj0(1),:) = e3v_0(:,mj0(2),:)1175 e3f_0(:,mj0(1),:) = e3f_0(:,mj0(2),:)1176 1177 ! Control of the sign1178 IF( MINVAL( e3t_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3t_0 <= 0' )1179 IF( MINVAL( e3w_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3w_0 <= 0' )1180 IF( MINVAL( gdept_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdept_0 < 0' )1181 IF( MINVAL( gdepw_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdepw_0 < 0' )1182 1183 ! Compute gde3w_0 (vertical sum of e3w)1184 IF ( ln_isfcav ) THEN ! if cavity1185 WHERE( misfdep == 0 ) misfdep = 11186 DO jj = 1,jpj1187 DO ji = 1,jpi1188 gde3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1)1189 DO jk = 2, misfdep(ji,jj)1190 gde3w_0(ji,jj,jk) = gde3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)1191 END DO1192 IF( misfdep(ji,jj) >= 2 ) gde3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj))1193 DO jk = misfdep(ji,jj) + 1, jpk1194 gde3w_0(ji,jj,jk) = gde3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)1195 END DO1196 END DO1197 END DO1198 ELSE ! no cavity1199 gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1)1200 DO jk = 2, jpk1201 gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk)1202 END DO1203 END IF1204 !1205 CALL wrk_dealloc( jpi,jpj,jpk, zprt )1206 !1207 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_zps')1208 !1209 END SUBROUTINE zgr_zps1210 1211 1212 SUBROUTINE zgr_isf1213 !!----------------------------------------------------------------------1214 !! *** ROUTINE zgr_isf ***1215 !!1216 !! ** Purpose : check the bathymetry in levels1217 !!1218 !! ** Method : THe water column have to contained at least 2 cells1219 !! Bathymetry and isfdraft are modified (dig/close) to respect1220 !! this criterion.1221 !!1222 !! ** Action : - test compatibility between isfdraft and bathy1223 !! - bathy and isfdraft are modified1224 !!----------------------------------------------------------------------1225 INTEGER :: ji, jj, jl, jk ! dummy loop indices1226 INTEGER :: ik, it ! temporary integers1227 INTEGER :: icompt, ibtest ! (ISF)1228 INTEGER :: ibtestim1, ibtestip1 ! (ISF)1229 INTEGER :: ibtestjm1, ibtestjp1 ! (ISF)1230 REAL(wp) :: zdepth ! Ajusted ocean depth to avoid too small e3t1231 REAL(wp) :: zmax ! Maximum and minimum depth1232 REAL(wp) :: zbathydiff ! isf temporary scalar1233 REAL(wp) :: zrisfdepdiff ! isf temporary scalar1234 REAL(wp) :: ze3tp , ze3wp ! Last ocean level thickness at T- and W-points1235 REAL(wp) :: zdepwp ! Ajusted ocean depth to avoid too small e3t1236 REAL(wp) :: zdiff ! temporary scalar1237 REAL(wp), POINTER, DIMENSION(:,:) :: zrisfdep, zbathy, zmask ! 2D workspace (ISH)1238 INTEGER , POINTER, DIMENSION(:,:) :: zmbathy, zmisfdep ! 2D workspace (ISH)1239 !!---------------------------------------------------------------------1240 !1241 !! IF( nn_timing == 1 ) CALL timing_start('zgr_isf')1242 !1243 CALL wrk_alloc( jpi,jpj, zbathy, zmask, zrisfdep)1244 CALL wrk_alloc( jpi,jpj, zmisfdep, zmbathy )1245 1246 ! (ISF) compute misfdep1247 WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) /= 0 ) ; misfdep(:,:) = 1 ! open water : set misfdep to 11248 ELSEWHERE ; misfdep(:,:) = 2 ! iceshelf : initialize misfdep to second level1249 END WHERE1250 1251 ! Compute misfdep for ocean points (i.e. first wet level)1252 ! find the first ocean level such that the first level thickness1253 ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where1254 ! e3t_0 is the reference level thickness1255 DO jk = 2, jpkm11256 zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )1257 WHERE( 0._wp < risfdep(:,:) .AND. risfdep(:,:) >= zdepth ) misfdep(:,:) = jk+11258 END DO1259 WHERE ( 0._wp < risfdep(:,:) .AND. risfdep(:,:) <= e3t_1d(1) )1260 risfdep(:,:) = 0. ; misfdep(:,:) = 11261 END WHERE1262 1263 ! remove very shallow ice shelf (less than ~ 10m if 75L)1264 WHERE (risfdep(:,:) <= 10._wp .AND. misfdep(:,:) > 1)1265 misfdep = 0; risfdep = 0.0_wp;1266 mbathy = 0; bathy = 0.0_wp;1267 END WHERE1268 WHERE (bathy(:,:) <= 30.0_wp .AND. gphit < -60._wp)1269 misfdep = 0; risfdep = 0.0_wp;1270 mbathy = 0; bathy = 0.0_wp;1271 END WHERE1272 1273 ! basic check for the compatibility of bathy and risfdep. I think it should be offline because it is not perfect and cannot solved all the situation1274 icompt = 01275 ! run the bathy check 10 times to be sure all the modif in the bathy or iceshelf draft are compatible together1276 DO jl = 1, 101277 ! check at each iteration if isf is grounded or not (1cm treshold have to be update after first coupling experiments)1278 WHERE (bathy(:,:) <= risfdep(:,:) + rn_isfhmin)1279 misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp1280 mbathy (:,:) = 0 ; bathy (:,:) = 0._wp1281 END WHERE1282 WHERE (mbathy(:,:) <= 0)1283 misfdep(:,:) = 0; risfdep(:,:) = 0._wp1284 mbathy (:,:) = 0; bathy (:,:) = 0._wp1285 END WHERE1286 IF( lk_mpp ) THEN1287 zbathy(:,:) = FLOAT( misfdep(:,:) )1288 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1289 misfdep(:,:) = INT( zbathy(:,:) )1290 1291 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1292 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1293 1294 zbathy(:,:) = FLOAT( mbathy(:,:) )1295 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1296 mbathy(:,:) = INT( zbathy(:,:) )1297 ENDIF1298 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN1299 misfdep( 1 ,:) = misfdep(jpim1,:) ! local domain is cyclic east-west1300 misfdep(jpi,:) = misfdep( 2 ,:)1301 mbathy( 1 ,:) = mbathy(jpim1,:) ! local domain is cyclic east-west1302 mbathy(jpi,:) = mbathy( 2 ,:)1303 ENDIF1304 1305 ! split last cell if possible (only where water column is 2 cell or less)1306 ! if coupled to ice sheet, we do not modify the bathymetry (can be discuss).1307 IF ( .NOT. ln_iscpl) THEN1308 DO jk = jpkm1, 1, -11309 zmax = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )1310 WHERE( gdepw_1d(jk) < bathy(:,:) .AND. bathy(:,:) <= zmax .AND. misfdep + 1 >= mbathy)1311 mbathy(:,:) = jk1312 bathy(:,:) = zmax1313 END WHERE1314 END DO1315 END IF1316 1317 ! split top cell if possible (only where water column is 2 cell or less)1318 DO jk = 2, jpkm11319 zmax = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )1320 WHERE( gdepw_1d(jk+1) > risfdep(:,:) .AND. risfdep(:,:) >= zmax .AND. misfdep + 1 >= mbathy)1321 misfdep(:,:) = jk1322 risfdep(:,:) = zmax1323 END WHERE1324 END DO1325 1326 1327 ! Case where bathy and risfdep compatible but not the level variable mbathy/misfdep because of partial cell condition1328 DO jj = 1, jpj1329 DO ji = 1, jpi1330 ! find the minimum change option:1331 ! test bathy1332 IF (risfdep(ji,jj) > 1) THEN1333 IF ( .NOT. ln_iscpl ) THEN1334 zbathydiff =ABS(bathy(ji,jj) - (gdepw_1d(mbathy (ji,jj)+1) &1335 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj)+1)*e3zps_rat )))1336 zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj) ) &1337 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat )))1338 IF (bathy(ji,jj) > risfdep(ji,jj) .AND. mbathy(ji,jj) < misfdep(ji,jj)) THEN1339 IF (zbathydiff <= zrisfdepdiff) THEN1340 bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat )1341 mbathy(ji,jj)= mbathy(ji,jj) + 11342 ELSE1343 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat )1344 misfdep(ji,jj) = misfdep(ji,jj) - 11345 END IF1346 ENDIF1347 ELSE1348 IF (bathy(ji,jj) > risfdep(ji,jj) .AND. mbathy(ji,jj) < misfdep(ji,jj)) THEN1349 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat )1350 misfdep(ji,jj) = misfdep(ji,jj) - 11351 END IF1352 END IF1353 END IF1354 END DO1355 END DO1356 1357 ! At least 2 levels for water thickness at T, U, and V point.1358 DO jj = 1, jpj1359 DO ji = 1, jpi1360 ! find the minimum change option:1361 ! test bathy1362 IF( misfdep(ji,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN1363 IF ( .NOT. ln_iscpl ) THEN1364 zbathydiff =ABS(bathy(ji,jj) - ( gdepw_1d(mbathy (ji,jj)+1) &1365 & + MIN( e3zps_min,e3t_1d(mbathy (ji,jj)+1)*e3zps_rat )))1366 zrisfdepdiff=ABS(risfdep(ji,jj) - ( gdepw_1d(misfdep(ji,jj) ) &1367 & - MIN( e3zps_min,e3t_1d(misfdep(ji,jj)-1)*e3zps_rat )))1368 IF (zbathydiff <= zrisfdepdiff) THEN1369 mbathy(ji,jj) = mbathy(ji,jj) + 11370 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat )1371 ELSE1372 misfdep(ji,jj)= misfdep(ji,jj) - 11373 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat )1374 END IF1375 ELSE1376 misfdep(ji,jj)= misfdep(ji,jj) - 11377 risfdep(ji,jj)= gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat )1378 END IF1379 ENDIF1380 END DO1381 END DO1382 1383 ! point V mbathy(ji,jj) == misfdep(ji,jj+1)1384 DO jj = 1, jpjm11385 DO ji = 1, jpim11386 IF( misfdep(ji,jj+1) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN1387 IF ( .NOT. ln_iscpl ) THEN1388 zbathydiff =ABS(bathy(ji,jj ) - ( gdepw_1d(mbathy (ji,jj)+1) &1389 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj )+1)*e3zps_rat )))1390 zrisfdepdiff=ABS(risfdep(ji,jj+1) - ( gdepw_1d(misfdep(ji,jj+1)) &1391 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1)-1)*e3zps_rat )))1392 IF (zbathydiff <= zrisfdepdiff) THEN1393 mbathy(ji,jj) = mbathy(ji,jj) + 11394 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj )) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj )+1)*e3zps_rat )1395 ELSE1396 misfdep(ji,jj+1) = misfdep(ji,jj+1) - 11397 risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat )1398 END IF1399 ELSE1400 misfdep(ji,jj+1) = misfdep(ji,jj+1) - 11401 risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat )1402 END IF1403 ENDIF1404 END DO1405 END DO1406 1407 IF( lk_mpp ) THEN1408 zbathy(:,:) = FLOAT( misfdep(:,:) )1409 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1410 misfdep(:,:) = INT( zbathy(:,:) )1411 1412 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1413 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1414 1415 zbathy(:,:) = FLOAT( mbathy(:,:) )1416 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1417 mbathy(:,:) = INT( zbathy(:,:) )1418 ENDIF1419 ! point V misdep(ji,jj) == mbathy(ji,jj+1)1420 DO jj = 1, jpjm11421 DO ji = 1, jpim11422 IF( misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) > 1) THEN1423 IF ( .NOT. ln_iscpl ) THEN1424 zbathydiff =ABS( bathy(ji,jj+1) - ( gdepw_1d(mbathy (ji,jj+1)+1) &1425 & + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat )))1426 zrisfdepdiff=ABS(risfdep(ji,jj ) - ( gdepw_1d(misfdep(ji,jj ) ) &1427 & - MIN( e3zps_min, e3t_1d(misfdep(ji,jj )-1)*e3zps_rat )))1428 IF (zbathydiff <= zrisfdepdiff) THEN1429 mbathy (ji,jj+1) = mbathy(ji,jj+1) + 11430 bathy (ji,jj+1) = gdepw_1d(mbathy (ji,jj+1) ) + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat )1431 ELSE1432 misfdep(ji,jj) = misfdep(ji,jj) - 11433 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj ) )*e3zps_rat )1434 END IF1435 ELSE1436 misfdep(ji,jj) = misfdep(ji,jj) - 11437 risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj ) )*e3zps_rat )1438 END IF1439 ENDIF1440 END DO1441 END DO1442 1443 1444 IF( lk_mpp ) THEN1445 zbathy(:,:) = FLOAT( misfdep(:,:) )1446 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1447 misfdep(:,:) = INT( zbathy(:,:) )1448 1449 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1450 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1451 1452 zbathy(:,:) = FLOAT( mbathy(:,:) )1453 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1454 mbathy(:,:) = INT( zbathy(:,:) )1455 ENDIF1456 1457 ! point U mbathy(ji,jj) == misfdep(ji,jj+1)1458 DO jj = 1, jpjm11459 DO ji = 1, jpim11460 IF( misfdep(ji+1,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) > 1) THEN1461 IF ( .NOT. ln_iscpl ) THEN1462 zbathydiff =ABS( bathy(ji ,jj) - ( gdepw_1d(mbathy (ji,jj)+1) &1463 & + MIN( e3zps_min, e3t_1d(mbathy (ji ,jj)+1)*e3zps_rat )))1464 zrisfdepdiff=ABS(risfdep(ji+1,jj) - ( gdepw_1d(misfdep(ji+1,jj)) &1465 & - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj)-1)*e3zps_rat )))1466 IF (zbathydiff <= zrisfdepdiff) THEN1467 mbathy(ji,jj) = mbathy(ji,jj) + 11468 bathy(ji,jj) = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat )1469 ELSE1470 misfdep(ji+1,jj)= misfdep(ji+1,jj) - 11471 risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat )1472 END IF1473 ELSE1474 misfdep(ji+1,jj)= misfdep(ji+1,jj) - 11475 risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat )1476 ENDIF1477 ENDIF1478 ENDDO1479 ENDDO1480 1481 IF( lk_mpp ) THEN1482 zbathy(:,:) = FLOAT( misfdep(:,:) )1483 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1484 misfdep(:,:) = INT( zbathy(:,:) )1485 1486 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1487 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1488 1489 zbathy(:,:) = FLOAT( mbathy(:,:) )1490 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1491 mbathy(:,:) = INT( zbathy(:,:) )1492 ENDIF1493 1494 ! point U misfdep(ji,jj) == bathy(ji,jj+1)1495 DO jj = 1, jpjm11496 DO ji = 1, jpim11497 IF( misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) > 1) THEN1498 IF ( .NOT. ln_iscpl ) THEN1499 zbathydiff =ABS( bathy(ji+1,jj) - ( gdepw_1d(mbathy (ji+1,jj)+1) &1500 & + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj)+1)*e3zps_rat )))1501 zrisfdepdiff=ABS(risfdep(ji ,jj) - ( gdepw_1d(misfdep(ji ,jj) ) &1502 & - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj)-1)*e3zps_rat )))1503 IF (zbathydiff <= zrisfdepdiff) THEN1504 mbathy(ji+1,jj) = mbathy (ji+1,jj) + 11505 bathy (ji+1,jj) = gdepw_1d(mbathy (ji+1,jj) ) + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj) +1)*e3zps_rat )1506 ELSE1507 misfdep(ji,jj) = misfdep(ji ,jj) - 11508 risfdep(ji,jj) = gdepw_1d(misfdep(ji ,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj) )*e3zps_rat )1509 END IF1510 ELSE1511 misfdep(ji,jj) = misfdep(ji ,jj) - 11512 risfdep(ji,jj) = gdepw_1d(misfdep(ji ,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji ,jj) )*e3zps_rat )1513 ENDIF1514 ENDIF1515 ENDDO1516 ENDDO1517 1518 IF( lk_mpp ) THEN1519 zbathy(:,:) = FLOAT( misfdep(:,:) )1520 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1521 misfdep(:,:) = INT( zbathy(:,:) )1522 1523 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1524 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1525 1526 zbathy(:,:) = FLOAT( mbathy(:,:) )1527 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1528 mbathy(:,:) = INT( zbathy(:,:) )1529 ENDIF1530 END DO1531 ! end dig bathy/ice shelf to be compatible1532 ! now fill single point in "coastline" of ice shelf, bathy, hole, and test again one cell tickness1533 DO jl = 1,201534 1535 ! remove single point "bay" on isf coast line in the ice shelf draft'1536 DO jk = 2, jpk1537 WHERE (misfdep==0) misfdep=jpk1538 zmask=0._wp1539 WHERE (misfdep <= jk) zmask=11540 DO jj = 2, jpjm11541 DO ji = 2, jpim11542 IF (misfdep(ji,jj) == jk) THEN1543 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1)1544 IF (ibtest <= 1) THEN1545 risfdep(ji,jj)=gdepw_1d(jk+1) ; misfdep(ji,jj)=jk+11546 IF (misfdep(ji,jj) > mbathy(ji,jj)) misfdep(ji,jj) = jpk1547 END IF1548 END IF1549 END DO1550 END DO1551 END DO1552 WHERE (misfdep==jpk)1553 misfdep=0 ; risfdep=0._wp ; mbathy=0 ; bathy=0._wp1554 END WHERE1555 IF( lk_mpp ) THEN1556 zbathy(:,:) = FLOAT( misfdep(:,:) )1557 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1558 misfdep(:,:) = INT( zbathy(:,:) )1559 1560 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1561 CALL lbc_lnk('toto', bathy, 'T', 1. )1562 1563 zbathy(:,:) = FLOAT( mbathy(:,:) )1564 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1565 mbathy(:,:) = INT( zbathy(:,:) )1566 ENDIF1567 1568 ! remove single point "bay" on bathy coast line beneath an ice shelf'1569 DO jk = jpk,1,-11570 zmask=0._wp1571 WHERE (mbathy >= jk ) zmask=11572 DO jj = 2, jpjm11573 DO ji = 2, jpim11574 IF (mbathy(ji,jj) == jk .AND. misfdep(ji,jj) >= 2) THEN1575 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1)1576 IF (ibtest <= 1) THEN1577 bathy(ji,jj)=gdepw_1d(jk) ; mbathy(ji,jj)=jk-11578 IF (misfdep(ji,jj) > mbathy(ji,jj)) mbathy(ji,jj) = 01579 END IF1580 END IF1581 END DO1582 END DO1583 END DO1584 WHERE (mbathy==0)1585 misfdep=0 ; risfdep=0._wp ; mbathy=0 ; bathy=0._wp1586 END WHERE1587 IF( lk_mpp ) THEN1588 zbathy(:,:) = FLOAT( misfdep(:,:) )1589 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1590 misfdep(:,:) = INT( zbathy(:,:) )1591 1592 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1593 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1594 1595 zbathy(:,:) = FLOAT( mbathy(:,:) )1596 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1597 mbathy(:,:) = INT( zbathy(:,:) )1598 ENDIF1599 1600 ! fill hole in ice shelf1601 zmisfdep = misfdep1602 zrisfdep = risfdep1603 WHERE (zmisfdep <= 1._wp) zmisfdep=jpk1604 DO jj = 2, jpjm11605 DO ji = 2, jpim11606 ibtestim1 = zmisfdep(ji-1,jj ) ; ibtestip1 = zmisfdep(ji+1,jj )1607 ibtestjm1 = zmisfdep(ji ,jj-1) ; ibtestjp1 = zmisfdep(ji ,jj+1)1608 IF( zmisfdep(ji,jj) >= mbathy(ji-1,jj ) ) ibtestim1 = jpk1609 IF( zmisfdep(ji,jj) >= mbathy(ji+1,jj ) ) ibtestip1 = jpk1610 IF( zmisfdep(ji,jj) >= mbathy(ji ,jj-1) ) ibtestjm1 = jpk1611 IF( zmisfdep(ji,jj) >= mbathy(ji ,jj+1) ) ibtestjp1 = jpk1612 ibtest=MIN(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1)1613 IF( ibtest == jpk .AND. misfdep(ji,jj) >= 2) THEN1614 mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp1615 END IF1616 IF( zmisfdep(ji,jj) < ibtest .AND. misfdep(ji,jj) >= 2) THEN1617 misfdep(ji,jj) = ibtest1618 risfdep(ji,jj) = gdepw_1d(ibtest)1619 ENDIF1620 ENDDO1621 ENDDO1622 1623 IF( lk_mpp ) THEN1624 zbathy(:,:) = FLOAT( misfdep(:,:) )1625 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1626 misfdep(:,:) = INT( zbathy(:,:) )1627 1628 CALL lbc_lnk( 'toto',risfdep, 'T', 1. )1629 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1630 1631 zbathy(:,:) = FLOAT( mbathy(:,:) )1632 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1633 mbathy(:,:) = INT( zbathy(:,:) )1634 ENDIF1635 !1636 !! fill hole in bathymetry1637 zmbathy (:,:)=mbathy (:,:)1638 DO jj = 2, jpjm11639 DO ji = 2, jpim11640 ibtestim1 = zmbathy(ji-1,jj ) ; ibtestip1 = zmbathy(ji+1,jj )1641 ibtestjm1 = zmbathy(ji ,jj-1) ; ibtestjp1 = zmbathy(ji ,jj+1)1642 IF( zmbathy(ji,jj) < misfdep(ji-1,jj ) ) ibtestim1 = 01643 IF( zmbathy(ji,jj) < misfdep(ji+1,jj ) ) ibtestip1 = 01644 IF( zmbathy(ji,jj) < misfdep(ji ,jj-1) ) ibtestjm1 = 01645 IF( zmbathy(ji,jj) < misfdep(ji ,jj+1) ) ibtestjp1 = 01646 ibtest=MAX(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1)1647 IF( ibtest == 0 .AND. misfdep(ji,jj) >= 2) THEN1648 mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp ;1649 END IF1650 IF( ibtest < zmbathy(ji,jj) .AND. misfdep(ji,jj) >= 2) THEN1651 mbathy(ji,jj) = ibtest1652 bathy(ji,jj) = gdepw_1d(ibtest+1)1653 ENDIF1654 END DO1655 END DO1656 IF( lk_mpp ) THEN1657 zbathy(:,:) = FLOAT( misfdep(:,:) )1658 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1659 misfdep(:,:) = INT( zbathy(:,:) )1660 1661 CALL lbc_lnk( 'toto',risfdep, 'T', 1. )1662 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1663 1664 zbathy(:,:) = FLOAT( mbathy(:,:) )1665 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1666 mbathy(:,:) = INT( zbathy(:,:) )1667 ENDIF1668 ! if not compatible after all check (ie U point water column less than 2 cells), mask U1669 DO jj = 1, jpjm11670 DO ji = 1, jpim11671 IF (mbathy(ji,jj) == misfdep(ji+1,jj) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji+1,jj) >= 1) THEN1672 mbathy(ji,jj) = mbathy(ji,jj) - 1 ; bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)+1) ;1673 END IF1674 END DO1675 END DO1676 IF( lk_mpp ) THEN1677 zbathy(:,:) = FLOAT( misfdep(:,:) )1678 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1679 misfdep(:,:) = INT( zbathy(:,:) )1680 1681 CALL lbc_lnk('toto', risfdep, 'T', 1. )1682 CALL lbc_lnk('toto', bathy, 'T', 1. )1683 1684 zbathy(:,:) = FLOAT( mbathy(:,:) )1685 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1686 mbathy(:,:) = INT( zbathy(:,:) )1687 ENDIF1688 ! if not compatible after all check (ie U point water column less than 2 cells), mask U1689 DO jj = 1, jpjm11690 DO ji = 1, jpim11691 IF (misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji+1,jj) >= 1) THEN1692 mbathy(ji+1,jj) = mbathy(ji+1,jj) - 1; bathy(ji+1,jj) = gdepw_1d(mbathy(ji+1,jj)+1) ;1693 END IF1694 END DO1695 END DO1696 IF( lk_mpp ) THEN1697 zbathy(:,:) = FLOAT( misfdep(:,:) )1698 CALL lbc_lnk('toto', zbathy, 'T', 1. )1699 misfdep(:,:) = INT( zbathy(:,:) )1700 1701 CALL lbc_lnk('toto', risfdep,'T', 1. )1702 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1703 1704 zbathy(:,:) = FLOAT( mbathy(:,:) )1705 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1706 mbathy(:,:) = INT( zbathy(:,:) )1707 ENDIF1708 ! if not compatible after all check (ie V point water column less than 2 cells), mask V1709 DO jj = 1, jpjm11710 DO ji = 1, jpi1711 IF (mbathy(ji,jj) == misfdep(ji,jj+1) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji,jj+1) >= 1) THEN1712 mbathy(ji,jj) = mbathy(ji,jj) - 1 ; bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)+1) ;1713 END IF1714 END DO1715 END DO1716 IF( lk_mpp ) THEN1717 zbathy(:,:) = FLOAT( misfdep(:,:) )1718 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1719 misfdep(:,:) = INT( zbathy(:,:) )1720 1721 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1722 CALL lbc_lnk('toto', bathy, 'T', 1. )1723 1724 zbathy(:,:) = FLOAT( mbathy(:,:) )1725 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1726 mbathy(:,:) = INT( zbathy(:,:) )1727 ENDIF1728 ! if not compatible after all check (ie V point water column less than 2 cells), mask V1729 DO jj = 1, jpjm11730 DO ji = 1, jpi1731 IF (misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) >= 1 .AND. mbathy(ji,jj+1) >= 1) THEN1732 mbathy(ji,jj+1) = mbathy(ji,jj+1) - 1 ; bathy(ji,jj+1) = gdepw_1d(mbathy(ji,jj+1)+1) ;1733 END IF1734 END DO1735 END DO1736 IF( lk_mpp ) THEN1737 zbathy(:,:) = FLOAT( misfdep(:,:) )1738 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1739 misfdep(:,:) = INT( zbathy(:,:) )1740 1741 CALL lbc_lnk( 'toto',risfdep,'T', 1. )1742 CALL lbc_lnk( 'toto',bathy, 'T', 1. )1743 1744 zbathy(:,:) = FLOAT( mbathy(:,:) )1745 CALL lbc_lnk( 'toto',zbathy, 'T', 1. )1746 mbathy(:,:) = INT( zbathy(:,:) )1747 ENDIF1748 ! if not compatible after all check, mask T1749 DO jj = 1, jpj1750 DO ji = 1, jpi1751 IF (mbathy(ji,jj) <= misfdep(ji,jj)) THEN1752 misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0._wp ; mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0._wp ;1753 END IF1754 END DO1755 END DO1756 1757 WHERE (mbathy(:,:) == 1)1758 mbathy = 0; bathy = 0.0_wp ; misfdep = 0 ; risfdep = 0.0_wp1759 END WHERE1760 END DO1761 ! end check compatibility ice shelf/bathy1762 ! remove very shallow ice shelf (less than ~ 10m if 75L)1763 WHERE (risfdep(:,:) <= 10._wp)1764 misfdep = 1; risfdep = 0.0_wp;1765 END WHERE1766 1767 IF( icompt == 0 ) THEN1768 IF(lwp) WRITE(numout,*)' no points with ice shelf too close to bathymetry'1769 ELSE1770 IF(lwp) WRITE(numout,*)' ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry'1771 ENDIF1772 1773 ! compute scale factor and depth at T- and W- points1774 932 DO jj = 1, jpj 1775 933 DO ji = 1, jpi … … 1793 951 ELSE ; gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1) 1794 952 ENDIF 1795 ! gdepw_0(ji,jj,ik+1) = gdepw_1d(ik+1)1796 953 !gm Bug? check the gdepw_1d 1797 954 ! ... on ik … … 1799 956 & * ((gdept_1d( ik ) - gdepw_1d(ik) ) & 1800 957 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) )) 1801 e3t_0 (ji,jj,ik ) = gdepw_0(ji,jj,ik+1) - gdepw_1d(ik ) 1802 e3w_0 (ji,jj,ik ) = gdept_0(ji,jj,ik ) - gdept_1d(ik-1) 958 e3t_0 (ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) ) & 959 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) ) 960 e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) ) & 961 & * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 1803 962 ! ... on ik+1 1804 963 e3w_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 1805 964 e3t_0 (ji,jj,ik+1) = e3t_0 (ji,jj,ik) 965 gdept_0(ji,jj,ik+1) = gdept_0(ji,jj,ik) + e3t_0(ji,jj,ik) 1806 966 ENDIF 1807 967 ENDIF … … 1829 989 END DO 1830 990 ! 1831 ! (ISF) Definition of e3t, u, v, w for ISF case 1832 DO jj = 1, jpj 1833 DO ji = 1, jpi 1834 ik = misfdep(ji,jj) 1835 IF( ik > 1 ) THEN ! ice shelf point only 1836 IF( risfdep(ji,jj) < gdepw_1d(ik) ) risfdep(ji,jj)= gdepw_1d(ik) 1837 gdepw_0(ji,jj,ik) = risfdep(ji,jj) 1838 !gm Bug? check the gdepw_0 1839 ! ... on ik 1840 gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) ) & 1841 & * ( gdepw_1d(ik+1) - gdept_1d(ik) ) & 1842 & / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) 1843 e3t_0 (ji,jj,ik ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) 1844 e3w_0 (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 1845 1846 IF( ik + 1 == mbathy(ji,jj) ) THEN ! ice shelf point only (2 cell water column) 1847 e3w_0 (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik) 1848 ENDIF 1849 ! ... on ik / ik-1 1850 e3w_0 (ji,jj,ik ) = e3t_0 (ji,jj,ik) !2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik)) 1851 gdept_0(ji,jj,ik-1) = gdept_0(ji,jj,ik) - e3w_0(ji,jj,ik) 1852 e3t_0 (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 1853 e3w_0 (ji,jj,ik-1) = gdept_0(ji,jj,ik-1) - gdept_1d(ik-2) 1854 gdepw_0(ji,jj,ik-1) = gdepw_0(ji,jj,ik) - e3t_0(ji,jj,ik-1) 1855 ENDIF 1856 END DO 1857 END DO 1858 1859 it = 0 1860 DO jj = 1, jpj 1861 DO ji = 1, jpi 1862 ik = misfdep(ji,jj) 1863 IF( ik > 1 ) THEN ! ice shelf point only 1864 e3tp (ji,jj) = e3t_0(ji,jj,ik ) 1865 e3wp (ji,jj) = e3w_0(ji,jj,ik+1 ) 1866 ! test 1867 zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik ) 1868 IF( zdiff <= 0. .AND. lwp ) THEN 1869 it = it + 1 1870 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj 1871 WRITE(numout,*) ' risfdep = ', risfdep(ji,jj) 1872 WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 1873 WRITE(numout,*) ' e3tp = ', e3tp(ji,jj), ' e3wp = ', e3wp(ji,jj) 1874 ENDIF 1875 ENDIF 1876 END DO 1877 END DO 1878 1879 CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 1880 CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 1881 ! 1882 ! IF( nn_timing == 1 ) CALL timing_stop('zgr_isf') 1883 ! 1884 END SUBROUTINE zgr_isf 1885 991 ! compute top scale factor if ice shelf 992 IF (ln_isfcav) CALL zps_isf 993 ! 994 ! Scale factors and depth at U-, V-, UW and VW-points 995 DO jk = 1, jpk ! initialisation to z-scale factors 996 e3u_0 (:,:,jk) = e3t_1d(jk) 997 e3v_0 (:,:,jk) = e3t_1d(jk) 998 e3uw_0(:,:,jk) = e3w_1d(jk) 999 e3vw_0(:,:,jk) = e3w_1d(jk) 1000 END DO 1001 1002 DO jk = 1,jpk ! Computed as the minimum of neighbooring scale factors 1003 DO jj = 1, jpjm1 1004 DO ji = 1, jpim1 ! vector opt. 1005 e3u_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji+1,jj,jk) ) 1006 e3v_0 (ji,jj,jk) = MIN( e3t_0(ji,jj,jk), e3t_0(ji,jj+1,jk) ) 1007 e3uw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji+1,jj,jk) ) 1008 e3vw_0(ji,jj,jk) = MIN( e3w_0(ji,jj,jk), e3w_0(ji,jj+1,jk) ) 1009 END DO 1010 END DO 1011 END DO 1012 1013 ! update e3uw in case only 2 cells in the water column 1014 IF ( ln_isfcav ) CALL zps_isf_e3uv_w 1015 ! 1016 CALL lbc_lnk('domzgr', e3u_0 , 'U', 1._wp ) ; CALL lbc_lnk('domzgr', e3uw_0, 'U', 1._wp ) ! lateral boundary conditions 1017 CALL lbc_lnk('domzgr', e3v_0 , 'V', 1._wp ) ; CALL lbc_lnk('domzgr', e3vw_0, 'V', 1._wp ) 1018 ! 1019 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 1020 WHERE( e3u_0 (:,:,jk) == 0._wp ) e3u_0 (:,:,jk) = e3t_1d(jk) 1021 WHERE( e3v_0 (:,:,jk) == 0._wp ) e3v_0 (:,:,jk) = e3t_1d(jk) 1022 WHERE( e3uw_0(:,:,jk) == 0._wp ) e3uw_0(:,:,jk) = e3w_1d(jk) 1023 WHERE( e3vw_0(:,:,jk) == 0._wp ) e3vw_0(:,:,jk) = e3w_1d(jk) 1024 END DO 1025 1026 ! Scale factor at F-point 1027 DO jk = 1, jpk ! initialisation to z-scale factors 1028 e3f_0(:,:,jk) = e3t_1d(jk) 1029 END DO 1030 DO jk = 1, jpk ! Computed as the minimum of neighbooring V-scale factors 1031 DO jj = 1, jpjm1 1032 DO ji = 1, jpim1 ! vector opt. 1033 e3f_0(ji,jj,jk) = MIN( e3v_0(ji,jj,jk), e3v_0(ji+1,jj,jk) ) 1034 END DO 1035 END DO 1036 END DO 1037 CALL lbc_lnk('domzgr', e3f_0, 'F', 1._wp ) ! Lateral boundary conditions 1038 ! 1039 DO jk = 1, jpk ! set to z-scale factor if zero (i.e. along closed boundaries) 1040 WHERE( e3f_0(:,:,jk) == 0._wp ) e3f_0(:,:,jk) = e3t_1d(jk) 1041 END DO 1042 !!gm bug ? : must be a do loop with mj0,mj1 1043 ! 1044 e3t_0(:,mj0(1),:) = e3t_0(:,mj0(2),:) ! we duplicate factor scales for jj = 1 and jj = 2 1045 e3w_0(:,mj0(1),:) = e3w_0(:,mj0(2),:) 1046 e3u_0(:,mj0(1),:) = e3u_0(:,mj0(2),:) 1047 e3v_0(:,mj0(1),:) = e3v_0(:,mj0(2),:) 1048 e3f_0(:,mj0(1),:) = e3f_0(:,mj0(2),:) 1049 1050 ! Control of the sign 1051 IF( MINVAL( e3t_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3t_0 <= 0' ) 1052 IF( MINVAL( e3w_0 (:,:,:) ) <= 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r e3w_0 <= 0' ) 1053 IF( MINVAL( gdept_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdept_0 < 0' ) 1054 IF( MINVAL( gdepw_0(:,:,:) ) < 0._wp ) CALL ctl_stop( ' zgr_zps : e r r o r gdepw_0 < 0' ) 1055 ! 1056 ! if in the future gde3w_0 need to be compute, use the function defined in NEMO 1057 ! for now gde3w_0 computation is removed as not an output of domcfg 1058 1059 DEALLOCATE( zprt ) 1060 ! 1061 END SUBROUTINE zgr_zps 1886 1062 1887 1063 SUBROUTINE zgr_sco … … 1935 1111 REAL(wp) :: zrfact 1936 1112 ! 1937 REAL(wp), POINTER, DIMENSION(:,: ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj21938 REAL(wp), POINTER, DIMENSION(:,: ) :: zenv, ztmp, zmsk, zri, zrj, zhbat1113 REAL(wp), ALLOCATABLE, DIMENSION(:,: ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 1114 REAL(wp), ALLOCATABLE, DIMENSION(:,: ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 1939 1115 !! 1940 1116 NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & … … 1942 1118 !!---------------------------------------------------------------------- 1943 1119 ! 1944 !! IF( nn_timing == 1 ) CALL timing_start('zgr_sco') 1945 ! 1946 CALL wrk_alloc( jpi,jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 1120 ALLOCATE( zenv(jpi,jpj), ztmp(jpi,jpj), zmsk(jpi,jpj), zri(jpi,jpj), zrj(jpi,jpj), zhbat(jpi,jpj) , ztmpi1(jpi,jpj), ztmpi2(jpi,jpj), ztmpj1(jpi,jpj), ztmpj2(jpi,jpj) ) 1947 1121 ! 1948 1122 REWIND( numnam_ref ) ! Namelist namzgr_sco in reference namelist : Sigma-stretching parameters … … 2024 1198 2025 1199 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 2026 CALL lbc_lnk( ' toto',zenv, 'T', 1._wp, 'no0' )1200 CALL lbc_lnk( 'domzgr',zenv, 'T', 1._wp, 'no0' ) 2027 1201 ! 2028 1202 ! smooth the bathymetry (if required) … … 2088 1262 END DO 2089 1263 ! apply lateral boundary condition CAUTION: keep the value when the lbc field is zero 2090 CALL lbc_lnk( ' toto',zenv, 'T', 1._wp, 'no0' )1264 CALL lbc_lnk( 'domzgr',zenv, 'T', 1._wp, 'no0' ) 2091 1265 ! ! ================ ! 2092 1266 END DO ! End loop ! … … 2132 1306 ! Apply lateral boundary condition 2133 1307 !!gm ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 2134 zhbat(:,:) = hbatu(:,:) ; CALL lbc_lnk(' toto', hbatu, 'U', 1._wp )1308 zhbat(:,:) = hbatu(:,:) ; CALL lbc_lnk('domzgr', hbatu, 'U', 1._wp ) 2135 1309 DO jj = 1, jpj 2136 1310 DO ji = 1, jpi … … 2142 1316 END DO 2143 1317 END DO 2144 zhbat(:,:) = hbatv(:,:) ; CALL lbc_lnk(' toto', hbatv, 'V', 1._wp )1318 zhbat(:,:) = hbatv(:,:) ; CALL lbc_lnk('domzgr', hbatv, 'V', 1._wp ) 2145 1319 DO jj = 1, jpj 2146 1320 DO ji = 1, jpi … … 2151 1325 END DO 2152 1326 END DO 2153 zhbat(:,:) = hbatf(:,:) ; CALL lbc_lnk(' toto', hbatf, 'F', 1._wp )1327 zhbat(:,:) = hbatf(:,:) ; CALL lbc_lnk('domzgr', hbatf, 'F', 1._wp ) 2154 1328 DO jj = 1, jpj 2155 1329 DO ji = 1, jpi … … 2199 1373 ENDIF 2200 1374 2201 CALL lbc_lnk( ' toto',e3t_0 , 'T', 1._wp )2202 CALL lbc_lnk( ' toto',e3u_0 , 'U', 1._wp )2203 CALL lbc_lnk( ' toto',e3v_0 , 'V', 1._wp )2204 CALL lbc_lnk( ' toto',e3f_0 , 'F', 1._wp )2205 CALL lbc_lnk( ' toto',e3w_0 , 'W', 1._wp )2206 CALL lbc_lnk( ' toto',e3uw_0, 'U', 1._wp )2207 CALL lbc_lnk(' toto', e3vw_0, 'V', 1._wp )1375 CALL lbc_lnk( 'domzgr',e3t_0 , 'T', 1._wp ) 1376 CALL lbc_lnk( 'domzgr',e3u_0 , 'U', 1._wp ) 1377 CALL lbc_lnk( 'domzgr',e3v_0 , 'V', 1._wp ) 1378 CALL lbc_lnk( 'domzgr',e3f_0 , 'F', 1._wp ) 1379 CALL lbc_lnk( 'domzgr',e3w_0 , 'W', 1._wp ) 1380 CALL lbc_lnk( 'domzgr',e3uw_0, 'U', 1._wp ) 1381 CALL lbc_lnk('domzgr', e3vw_0, 'V', 1._wp ) 2208 1382 ! 2209 1383 WHERE( e3t_0 (:,:,:) == 0._wp ) e3t_0 (:,:,:) = 1._wp … … 2214 1388 WHERE( e3uw_0(:,:,:) == 0._wp ) e3uw_0(:,:,:) = 1._wp 2215 1389 WHERE( e3vw_0(:,:,:) == 0._wp ) e3vw_0(:,:,:) = 1._wp 2216 2217 2218 !!gm I don't like that HERE we are supposed to set the reference coordinate (i.e. _0 arrays)2219 !!gm and only that !!!!!2220 !!gm THIS should be removed from here !2221 gdept_n(:,:,:) = gdept_0(:,:,:)2222 gdepw_n(:,:,:) = gdepw_0(:,:,:)2223 gde3w_n(:,:,:) = gde3w_0(:,:,:)2224 e3t_n (:,:,:) = e3t_0 (:,:,:)2225 e3u_n (:,:,:) = e3u_0 (:,:,:)2226 e3v_n (:,:,:) = e3v_0 (:,:,:)2227 e3f_n (:,:,:) = e3f_0 (:,:,:)2228 e3w_n (:,:,:) = e3w_0 (:,:,:)2229 e3uw_n (:,:,:) = e3uw_0 (:,:,:)2230 e3vw_n (:,:,:) = e3vw_0 (:,:,:)2231 !!gm and obviously in the following, use the _0 arrays until the end of this subroutine2232 !! gm end2233 1390 !! 2234 1391 ! HYBRID : … … 2236 1393 DO ji = 1, jpi 2237 1394 DO jk = 1, jpkm1 2238 IF( scobot(ji,jj) >= gdept_ n(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk )1395 IF( scobot(ji,jj) >= gdept_0(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 2239 1396 END DO 2240 1397 END DO … … 2246 1403 WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 2247 1404 WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ), & 2248 & ' w ', MINVAL( gdepw_0(:,:,:) ) , '3w ' , MINVAL( gde3w_0(:,:,:) )1405 & ' w ', MINVAL( gdepw_0(:,:,:) ) 2249 1406 WRITE(numout,*) ' MIN val e3 t ', MINVAL( e3t_0 (:,:,:) ), ' f ' , MINVAL( e3f_0 (:,:,:) ), & 2250 1407 & ' u ', MINVAL( e3u_0 (:,:,:) ), ' u ' , MINVAL( e3v_0 (:,:,:) ), & … … 2253 1410 2254 1411 WRITE(numout,*) ' MAX val depth t ', MAXVAL( gdept_0(:,:,:) ), & 2255 & ' w ', MAXVAL( gdepw_0(:,:,:) ) , '3w ' , MAXVAL( gde3w_0(:,:,:) )1412 & ' w ', MAXVAL( gdepw_0(:,:,:) ) 2256 1413 WRITE(numout,*) ' MAX val e3 t ', MAXVAL( e3t_0 (:,:,:) ), ' f ' , MAXVAL( e3f_0 (:,:,:) ), & 2257 1414 & ' u ', MAXVAL( e3u_0 (:,:,:) ), ' u ' , MAXVAL( e3v_0 (:,:,:) ), & … … 2298 1455 DO jk = 1, mbathy(ji,jj) 2299 1456 ! check coordinate is monotonically increasing 2300 IF (e3w_ n(ji,jj,jk) <= 0._wp .OR. e3t_n(ji,jj,jk) <= 0._wp ) THEN1457 IF (e3w_0(ji,jj,jk) <= 0._wp .OR. e3t_0(ji,jj,jk) <= 0._wp ) THEN 2301 1458 WRITE(ctmp1,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 2302 1459 WRITE(numout,*) 'ERROR zgr_sco : e3w or e3t =< 0 at point (i,j,k)= ', ji, jj, jk 2303 WRITE(numout,*) 'e3w',e3w_ n(ji,jj,:)2304 WRITE(numout,*) 'e3t',e3t_ n(ji,jj,:)1460 WRITE(numout,*) 'e3w',e3w_0(ji,jj,:) 1461 WRITE(numout,*) 'e3t',e3t_0(ji,jj,:) 2305 1462 CALL ctl_stop( ctmp1 ) 2306 1463 ENDIF 2307 1464 ! and check it has never gone negative 2308 IF( gdepw_ n(ji,jj,jk) < 0._wp .OR. gdept_n(ji,jj,jk) < 0._wp ) THEN1465 IF( gdepw_0(ji,jj,jk) < 0._wp .OR. gdept_0(ji,jj,jk) < 0._wp ) THEN 2309 1466 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 2310 1467 WRITE(numout,*) 'ERROR zgr_sco : gdepw or gdept =< 0 at point (i,j,k)= ', ji, jj, jk 2311 WRITE(numout,*) 'gdepw',gdepw_ n(ji,jj,:)2312 WRITE(numout,*) 'gdept',gdept_ n(ji,jj,:)1468 WRITE(numout,*) 'gdepw',gdepw_0(ji,jj,:) 1469 WRITE(numout,*) 'gdept',gdept_0(ji,jj,:) 2313 1470 CALL ctl_stop( ctmp1 ) 2314 1471 ENDIF 2315 1472 ! and check it never exceeds the total depth 2316 IF( gdepw_ n(ji,jj,jk) > hbatt(ji,jj) ) THEN1473 IF( gdepw_0(ji,jj,jk) > hbatt(ji,jj) ) THEN 2317 1474 WRITE(ctmp1,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 2318 1475 WRITE(numout,*) 'ERROR zgr_sco : gdepw > hbatt at point (i,j,k)= ', ji, jj, jk 2319 WRITE(numout,*) 'gdepw',gdepw_ n(ji,jj,:)1476 WRITE(numout,*) 'gdepw',gdepw_0(ji,jj,:) 2320 1477 CALL ctl_stop( ctmp1 ) 2321 1478 ENDIF … … 2324 1481 DO jk = 1, mbathy(ji,jj)-1 2325 1482 ! and check it never exceeds the total depth 2326 IF( gdept_ n(ji,jj,jk) > hbatt(ji,jj) ) THEN1483 IF( gdept_0(ji,jj,jk) > hbatt(ji,jj) ) THEN 2327 1484 WRITE(ctmp1,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 2328 1485 WRITE(numout,*) 'ERROR zgr_sco : gdept > hbatt at point (i,j,k)= ', ji, jj, jk 2329 WRITE(numout,*) 'gdept',gdept_ n(ji,jj,:)1486 WRITE(numout,*) 'gdept',gdept_0(ji,jj,:) 2330 1487 CALL ctl_stop( ctmp1 ) 2331 1488 ENDIF … … 2335 1492 END DO 2336 1493 ! 2337 CALL wrk_dealloc( jpi, jpj, zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 2338 ! 2339 !!! IF( nn_timing == 1 ) CALL timing_stop('zgr_sco') 1494 DEALLOCATE( zenv, ztmp, zmsk, zri, zrj, zhbat , ztmpi1, ztmpi2, ztmpj1, ztmpj2 ) 2340 1495 ! 2341 1496 END SUBROUTINE zgr_sco … … 2358 1513 REAL(wp) :: ztmpu1, ztmpv1, ztmpf1 2359 1514 ! 2360 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 2361 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 2362 !!---------------------------------------------------------------------- 2363 2364 CALL wrk_alloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2365 CALL wrk_alloc( jpi,jpj,jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2366 2367 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 1515 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3 1516 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 1517 !!---------------------------------------------------------------------- 1518 1519 ALLOCATE( z_gsigw3 (jpi,jpj,jpk), z_gsigt3 (jpi,jpj,jpk) ) 1520 ALLOCATE( z_esigt3 (jpi,jpj,jpk), z_esigw3 (jpi,jpj,jpk), z_esigtu3(jpi,jpj,jpk), z_esigtv3(jpi,jpj,jpk) ) 1521 ALLOCATE( z_esigtf3(jpi,jpj,jpk), z_esigwu3(jpi,jpj,jpk), z_esigwv3(jpi,jpj,jpk) ) 1522 1523 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp 2368 1524 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 2369 1525 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp … … 2392 1548 z_esigt3(ji,jj,jpk) = 2._wp * ( z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk) ) 2393 1549 ! 2394 ! Coefficients for vertical depth as the sum of e3w scale factors2395 z_gsi3w3(ji,jj,1) = 0.5_wp * z_esigw3(ji,jj,1)2396 DO jk = 2, jpk2397 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk)2398 END DO2399 !2400 1550 DO jk = 1, jpk 2401 1551 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) … … 2403 1553 gdept_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 2404 1554 gdepw_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 2405 gde3w_0(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsi3w3(ji,jj,jk)+rn_hc*zcoeft )2406 1555 END DO 2407 1556 ! … … 2448 1597 END DO 2449 1598 ! 2450 CALL wrk_dealloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3)2451 CALL wrk_dealloc( jpi,jpj,jpk,z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 )1599 DEALLOCATE( z_gsigw3, z_gsigt3 ) 1600 DEALLOCATE( z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2452 1601 ! 2453 1602 END SUBROUTINE s_sh94 … … 2476 1625 REAL(wp) :: ztmpu1, ztmpv1, ztmpf1 2477 1626 ! 2478 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 2479 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 2480 !!---------------------------------------------------------------------- 2481 ! 2482 CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3 ) 2483 CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2484 2485 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp ; z_gsi3w3 = 0._wp 1627 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3 1628 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 1629 !!---------------------------------------------------------------------- 1630 ! 1631 ALLOCATE( z_gsigw3 (jpi,jpj,jpk), z_gsigt3 (jpi,jpj,jpk) ) 1632 ALLOCATE( z_esigt3 (jpi,jpj,jpk), z_esigw3 (jpi,jpj,jpk), z_esigtu3(jpi,jpj,jpk), z_esigtv3(jpi,jpj,jpk)) 1633 ALLOCATE( z_esigtf3(jpi,jpj,jpk), z_esigwu3(jpi,jpj,jpk), z_esigwv3(jpi,jpj,jpk) ) 1634 1635 z_gsigw3 = 0._wp ; z_gsigt3 = 0._wp 2486 1636 z_esigt3 = 0._wp ; z_esigw3 = 0._wp 2487 1637 z_esigtu3 = 0._wp ; z_esigtv3 = 0._wp ; z_esigtf3 = 0._wp … … 2535 1685 z_esigt3(ji,jj,jpk) = 2.0_wp * (z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk)) 2536 1686 2537 ! Coefficients for vertical depth as the sum of e3w scale factors2538 z_gsi3w3(ji,jj,1) = 0.5 * z_esigw3(ji,jj,1)2539 DO jk = 2, jpk2540 z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk)2541 END DO2542 2543 1687 DO jk = 1, jpk 2544 1688 gdept_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigt3(ji,jj,jk) 2545 1689 gdepw_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigw3(ji,jj,jk) 2546 gde3w_0(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsi3w3(ji,jj,jk)2547 1690 END DO 2548 1691 … … 2608 1751 ENDDO 2609 1752 ! 2610 CALL lbc_lnk(' toto',e3t_0 ,'T',1.) ; CALL lbc_lnk('toto',e3u_0 ,'T',1.)2611 CALL lbc_lnk(' toto',e3v_0 ,'T',1.) ; CALL lbc_lnk('toto',e3f_0 ,'T',1.)2612 CALL lbc_lnk(' toto',e3w_0 ,'T',1.)2613 CALL lbc_lnk(' toto',e3uw_0,'T',1.) ; CALL lbc_lnk('toto',e3vw_0,'T',1.)2614 ! 2615 CALL wrk_dealloc( jpi,jpj,jpk, z_gsigw3, z_gsigt3, z_gsi3w3)2616 CALL wrk_dealloc( jpi,jpj,jpk,z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 )1753 CALL lbc_lnk('domzgr',e3t_0 ,'T',1.) ; CALL lbc_lnk('domzgr',e3u_0 ,'T',1.) 1754 CALL lbc_lnk('domzgr',e3v_0 ,'T',1.) ; CALL lbc_lnk('domzgr',e3f_0 ,'T',1.) 1755 CALL lbc_lnk('domzgr',e3w_0 ,'T',1.) 1756 CALL lbc_lnk('domzgr',e3uw_0,'T',1.) ; CALL lbc_lnk('domzgr',e3vw_0,'T',1.) 1757 ! 1758 DEALLOCATE( z_gsigw3, z_gsigt3 ) 1759 DEALLOCATE( z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 2617 1760 ! 2618 1761 END SUBROUTINE s_sf12 … … 2631 1774 INTEGER :: ji, jj, jk ! dummy loop argument 2632 1775 REAL(wp) :: zcoeft, zcoefw ! temporary scalars 2633 REAL(wp), POINTER, DIMENSION(:) :: z_gsigw, z_gsigt, z_gsi3w2634 REAL(wp), POINTER, DIMENSION(:) :: z_esigt, z_esigw2635 !!---------------------------------------------------------------------- 2636 2637 CALL wrk_alloc( jpk, z_gsigw, z_gsigt, z_gsi3w)2638 CALL wrk_alloc( jpk, z_esigt, z_esigw)2639 2640 z_gsigw = 0._wp ; z_gsigt = 0._wp ; z_gsi3w = 0._wp1776 REAL(wp), ALLOCATABLE, DIMENSION(:) :: z_gsigw, z_gsigt 1777 REAL(wp), ALLOCATABLE, DIMENSION(:) :: z_esigt, z_esigw 1778 !!---------------------------------------------------------------------- 1779 1780 ALLOCATE( z_gsigw(jpk), z_gsigt(jpk) ) 1781 ALLOCATE( z_esigt(jpk), z_esigw(jpk) ) 1782 1783 z_gsigw = 0._wp ; z_gsigt = 0._wp 2641 1784 z_esigt = 0._wp ; z_esigw = 0._wp 2642 1785 … … 2657 1800 z_esigt(jpk) = 2._wp * ( z_gsigt(jpk) - z_gsigw(jpk) ) 2658 1801 ! 2659 ! Coefficients for vertical depth as the sum of e3w scale factors2660 z_gsi3w(1) = 0.5_wp * z_esigw(1)2661 DO jk = 2, jpk2662 z_gsi3w(jk) = z_gsi3w(jk-1) + z_esigw(jk)2663 END DO2664 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays)2665 1802 DO jk = 1, jpk 2666 1803 zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) … … 2668 1805 gdept_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigt(jk) + hift(:,:)*zcoeft ) 2669 1806 gdepw_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigw(jk) + hift(:,:)*zcoefw ) 2670 gde3w_0(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsi3w(jk) + hift(:,:)*zcoeft ) 2671 END DO 2672 !!gm: e3uw, e3vw can be suppressed (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 1807 END DO 1808 2673 1809 DO jj = 1, jpj 2674 1810 DO ji = 1, jpi … … 2686 1822 END DO 2687 1823 ! 2688 CALL wrk_dealloc( jpk, z_gsigw, z_gsigt, z_gsi3w)2689 CALL wrk_dealloc( jpk, z_esigt, z_esigw)1824 DEALLOCATE( z_gsigw, z_gsigt ) 1825 DEALLOCATE( z_esigt, z_esigw ) 2690 1826 ! 2691 1827 END SUBROUTINE s_tanh -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/ioipsl.f90
r6951 r12101 6 6 ! See IOIPSL/IOIPSL_License_CeCILL.txt 7 7 ! 8 USE errioipsl 8 USE errioipsl 9 USE calendar 9 10 USE stringop 10 USE mathelp11 USE getincom12 USE calendar13 11 USE fliocom 14 USE flincom 15 USE histcom 16 USE restcom 12 17 13 END MODULE ioipsl -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/iom.F90
r12100 r12101 35 35 USE domngb ! ocean space and time domain 36 36 USE phycst ! physical constants 37 USE dianam ! build name of file38 37 USE xios 39 38 # endif … … 64 63 PRIVATE iom_set_rst_context, iom_set_rstw_active, iom_set_rstr_active 65 64 # endif 66 PUBLIC iom_set_rstw_var_active, iom_set_rst w_core, iom_set_rst_vars65 PUBLIC iom_set_rstw_var_active, iom_set_rst_vars 67 66 68 67 INTERFACE iom_get … … 348 347 #endif 349 348 END SUBROUTINE iom_set_rstr_active 350 351 SUBROUTINE iom_set_rstw_core(cdmdl)352 !!---------------------------------------------------------------------353 !! *** SUBROUTINE iom_set_rstw_core ***354 !!355 !! ** Purpose : set variables which are always in restart file356 !!---------------------------------------------------------------------357 CHARACTER (len=*), INTENT (IN) :: cdmdl ! model OPA or SAS358 CHARACTER(LEN=256) :: clinfo ! info character359 #if defined key_iomput360 IF(cdmdl == "OPA") THEN361 !from restart.F90362 CALL iom_set_rstw_var_active("rdt")363 IF ( .NOT. ln_diurnal_only ) THEN364 CALL iom_set_rstw_var_active('ub' )365 CALL iom_set_rstw_var_active('vb' )366 CALL iom_set_rstw_var_active('tb' )367 CALL iom_set_rstw_var_active('sb' )368 CALL iom_set_rstw_var_active('sshb')369 !370 CALL iom_set_rstw_var_active('un' )371 CALL iom_set_rstw_var_active('vn' )372 CALL iom_set_rstw_var_active('tn' )373 CALL iom_set_rstw_var_active('sn' )374 CALL iom_set_rstw_var_active('sshn')375 CALL iom_set_rstw_var_active('rhop')376 ! extra variable needed for the ice sheet coupling377 IF ( ln_iscpl ) THEN378 CALL iom_set_rstw_var_active('tmask')379 CALL iom_set_rstw_var_active('umask')380 CALL iom_set_rstw_var_active('vmask')381 CALL iom_set_rstw_var_active('smask')382 CALL iom_set_rstw_var_active('e3t_n')383 CALL iom_set_rstw_var_active('e3u_n')384 CALL iom_set_rstw_var_active('e3v_n')385 CALL iom_set_rstw_var_active('gdepw_n')386 END IF387 ENDIF388 IF(ln_diurnal) CALL iom_set_rstw_var_active('Dsst')389 !from trasbc.F90390 CALL iom_set_rstw_var_active('sbc_hc_b')391 CALL iom_set_rstw_var_active('sbc_sc_b')392 ENDIF393 #else394 clinfo = 'iom_set_rstw_core: key_iomput is needed to use XIOS restart read/write functionality'395 CALL ctl_stop('STOP', TRIM(clinfo))396 #endif397 END SUBROUTINE iom_set_rstw_core398 349 399 350 SUBROUTINE iom_set_rst_vars(fields) … … 662 613 ! start halo size for x,y dimensions 663 614 ! end halo size for x,y dimensions 615 ! 616 INTEGER :: nldi_save, nlei_save !:patch before we remove periodicity and close boundaries in output files 617 INTEGER :: nldj_save, nlej_save !: 618 ! 664 619 !--------------------------------------------------------------------- 665 620 ! Initializations and control … … 668 623 clinfo = ' iom_open ~~~ ' 669 624 istop = nstop 625 626 ! use patch to force the writing off periodicity and close boundaries 627 ! without this, issue in some model decomposition 628 ! seb: patch before we remove periodicity and close boundaries in output files 629 nldi_save = nldi ; nlei_save = nlei 630 nldj_save = nldj ; nlej_save = nlej 631 IF( nimpp == 1 ) nldi = 1 632 IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 633 IF( njmpp == 1 ) nldj = 1 634 IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 635 670 636 ! if iom_open is called for the first time: initialize iom_file(:)%nfid to 0 671 637 ! (could be done when defining iom_file in f95 but not in f90) … … 694 660 ! do we read the overlap 695 661 ! ugly patch SM+JMM+RB to overwrite global definition in some cases 696 llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 662 !llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 663 ! for domain_cfg, force to read the full domain 664 llnoov = .FALSE. 697 665 ! create the file name by added, if needed, TRIM(Agrif_CFixed()) and TRIM(clsuffix) 698 666 ! ============= … … 792 760 CALL iom_nf90_open( clname, kiomid, llwrt, llok, idompar, kdlev = kdlev ) 793 761 ENDIF 762 763 nldi = nldi_save ; nlei = nlei_save 764 nldj = nldj_save ; nlej = nlej_save 794 765 ! 795 766 END SUBROUTINE iom_open … … 1083 1054 ! do we read the overlap 1084 1055 ! ugly patch SM+JMM+RB to overwrite global definition in some cases 1085 llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 1056 ! 1057 !llnoov = (jpni * jpnj ) == jpnij .AND. .NOT. lk_agrif 1058 ! for domain_cfg tools force to read the full domain 1059 llnoov = .FALSE. 1086 1060 ! check kcount and kstart optionals parameters... 1087 1061 IF( PRESENT(kcount) .AND. (.NOT. PRESENT(kstart)) ) CALL ctl_stop(trim(clinfo), 'kcount present needs kstart present') … … 1264 1238 ENDIF 1265 1239 ENDIF 1266 1240 WRITE(numout,*) 'istart icnt',istart, ' ', icnt 1241 WRITE(numout,*) ' idx i1, i2, j1, j2 ',ix1, ix2, iy1, iy2 1267 1242 CALL iom_nf90_get( kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2, pv_r1d, pv_r2d, pv_r3d ) 1268 1243 -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/iom_nf90.F90
r12100 r12101 529 529 INTEGER :: idlv ! local variable 530 530 INTEGER :: idim3 ! id of the third dimension 531 ! 532 INTEGER :: nldi_save, nlei_save !:patch before we remove periodicity and close boundaries in output files 533 INTEGER :: nldj_save, nlej_save !: 531 534 !--------------------------------------------------------------------- 532 535 ! 533 536 clinfo = ' iom_nf90_rp0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar) 534 537 if90id = iom_file(kiomid)%nfid 538 ! 539 ! use patch to force the writing off periodicity and close boundaries 540 ! without this, issue in some model decomposition 541 ! seb: patch before we remove periodicity and close boundaries in output files 542 nldi_save = nldi ; nlei_save = nlei 543 nldj_save = nldj ; nlej_save = nlej 544 IF( nimpp == 1 ) nldi = 1 545 IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 546 IF( njmpp == 1 ) nldj = 1 547 IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 535 548 ! 536 549 ! define dimension variables if it is not already done … … 705 718 IF(lwp) WRITE(numout,*) TRIM(clinfo)//' written ok' 706 719 ENDIF 720 ! 721 nldi = nldi_save ; nlei = nlei_save 722 nldj = nldj_save ; nlej = nlej_save 707 723 ! 708 724 END SUBROUTINE iom_nf90_rp0123d -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/lbclnk.F90
r12100 r12101 71 71 !! lbc_bdy_lnk : set the lateral BDY boundary condition 72 72 !!---------------------------------------------------------------------- 73 USE oce ! ocean dynamics and tracers74 73 USE dom_oce ! ocean space and time domain 75 74 USE in_out_manager ! I/O manager -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/mpp_loc_generic.h90
r12100 r12101 17 17 # define MPI_OPERATION mpi_maxloc 18 18 # define LOC_OPERATION MAXLOC 19 # define ERRVAL -HUGE 19 20 # endif 20 21 # if defined OPERATION_MINLOC 21 22 # define MPI_OPERATION mpi_minloc 22 23 # define LOC_OPERATION MINLOC 24 # define ERRVAL HUGE 23 25 # endif 24 26 … … 42 44 ! 43 45 idim = SIZE(kindex) 44 ALLOCATE ( ilocs(idim) )45 46 ! 46 ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) == 1._wp ) 47 zmin = ARRAY_IN(ilocs(1),ilocs(2),ilocs(3)) 48 ! 49 kindex(1) = ilocs(1) + nimpp - 1 47 IF ( ALL(MASK_IN(:,:,:) /= 1._wp) ) THEN 48 ! special case for land processors 49 zmin = ERRVAL(zmin) 50 index0 = 0 51 ELSE 52 ALLOCATE ( ilocs(idim) ) 53 ! 54 ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) == 1._wp ) 55 zmin = ARRAY_IN(ilocs(1),ilocs(2),ilocs(3)) 56 ! 57 kindex(1) = mig( ilocs(1) ) 50 58 # if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 51 kindex(2) = ilocs(2) + njmpp - 159 kindex(2) = mjg( ilocs(2) ) 52 60 # endif 53 61 # if defined DIM_3d /* avoid warning when kindex has 2 elements */ 54 kindex(3) = ilocs(3)62 kindex(3) = ilocs(3) 55 63 # endif 56 !57 DEALLOCATE (ilocs)58 !59 index0 = kindex(1)-1 ! 1d index starting at 064 ! 65 DEALLOCATE (ilocs) 66 ! 67 index0 = kindex(1)-1 ! 1d index starting at 0 60 68 # if defined DIM_2d || defined DIM_3d /* avoid warning when kindex has 1 element */ 61 index0 = index0 + jpiglo * (kindex(2)-1)69 index0 = index0 + jpiglo * (kindex(2)-1) 62 70 # endif 63 71 # if defined DIM_3d /* avoid warning when kindex has 2 elements */ 64 index0 = index0 + jpiglo * jpjglo * (kindex(3)-1)72 index0 = index0 + jpiglo * jpjglo * (kindex(3)-1) 65 73 # endif 74 END IF 66 75 zain(1,:) = zmin 67 76 zain(2,:) = REAL(index0, wp) … … 98 107 #undef LOC_OPERATION 99 108 #undef INDEX_TYPE 109 #undef ERRVAL -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/nemogcm.F90
r12100 r12101 44 44 !! factorise : calculate the factors of the no. of MPI processes 45 45 !!---------------------------------------------------------------------- 46 USE step_oce ! module used in the ocean time stepping module (step.F90) 46 USE dom_oce ! ocean space and time domain variables 47 USE in_out_manager ! I/O manager 48 USE iom ! 47 49 USE domcfg ! domain configuration (dom_cfg routine) 48 50 USE mppini ! shared/distributed memory setting (mpp_init routine) … … 141 143 INTEGER :: ios, ilocal_comm ! local integers 142 144 CHARACTER(len=120), DIMENSION(60) :: cltxt, cltxt2, clnam 143 ! 144 NAMELIST/namctl/ ln_ctl , sn_cfctl, nn_print,ln_timing 145 !! 146 NAMELIST/namctl/ ln_ctl , sn_cfctl, nn_print, nn_ictls, nn_ictle, & 147 & nn_isplt , nn_jsplt, nn_jctls, nn_jctle, & 148 & ln_timing, ln_diacfl 145 149 NAMELIST/namcfg/ ln_e3_dep, & 146 150 & cp_cfg, cp_cfz, jp_cfg, jpidta, jpjdta, jpkdta, jpiglo, jpjglo, & 147 & jp izoom, jpjzoom, jperio, ln_use_jattr151 & jperio, ln_use_jattr, ln_domclo 148 152 !!---------------------------------------------------------------------- 149 153 ! … … 154 158 CALL ctl_opn( numnam_cfg, 'namelist_cfg', 'OLD', 'FORMATTED', 'SEQUENTIAL', -1, 6, .FALSE. ) 155 159 ! 156 REWIND( numnam_ref ) ! Namelist namctl in reference namelist : Control prints & Benchmark160 REWIND( numnam_ref ) ! Namelist namctl in reference namelist 157 161 READ ( numnam_ref, namctl, IOSTAT = ios, ERR = 901 ) 158 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namctl in reference namelist', .TRUE. ) 159 160 REWIND( numnam_cfg ) ! Namelist namctl in confguration namelist : Control prints & Benchmark 162 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namctl in reference namelist', .TRUE. ) 163 REWIND( numnam_cfg ) ! Namelist namctl in confguration namelist 161 164 READ ( numnam_cfg, namctl, IOSTAT = ios, ERR = 902 ) 162 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namctl in configuration namelist', .TRUE. ) 163 164 ! 165 REWIND( numnam_ref ) ! Namelist namcfg in reference namelist : Control prints & Benchmark 165 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namctl in configuration namelist', .TRUE. ) 166 ! 167 REWIND( numnam_ref ) ! Namelist namcfg in reference namelist 166 168 READ ( numnam_ref, namcfg, IOSTAT = ios, ERR = 903 ) 167 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namcfg in reference namelist', .TRUE. ) 168 169 REWIND( numnam_cfg ) ! Namelist namcfg in confguration namelist : Control prints & Benchmark 169 903 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namcfg in reference namelist', .TRUE. ) 170 REWIND( numnam_cfg ) ! Namelist namcfg in confguration namelist 170 171 READ ( numnam_cfg, namcfg, IOSTAT = ios, ERR = 904 ) 171 904 IF( ios /= 0 )CALL ctl_nam ( ios , 'namcfg in configuration namelist', .TRUE. )172 904 IF( ios > 0 ) CALL ctl_nam ( ios , 'namcfg in configuration namelist', .TRUE. ) 172 173 173 174 ! Force values for AGRIF zoom (cf. agrif_user.F90) … … 265 266 CALL dom_cfg ! Domain configuration 266 267 CALL dom_init ! Domain 267 IF( ln_ctl ) CALL prt_ctl_init ! Print control268 268 ! 269 269 END SUBROUTINE nemo_init … … 315 315 jsplt = nn_jsplt 316 316 317 ! IF( .NOT.ln_read_cfg ) ln_closea = .false. ! dealing possible only with a domcfg file318 317 ! 319 318 ! ! Parameter control … … 409 408 !!---------------------------------------------------------------------- 410 409 ! 411 ierr = oce_alloc () ! ocean 412 ierr = ierr + dom_oce_alloc () ! ocean domain 410 ierr = dom_oce_alloc () ! ocean domain 413 411 ! 414 412 CALL mpp_sum( 'nemogcm', ierr ) -
utils/tools_UKMO_MERGE_2019/DOMAINcfg/src/par_oce.f90
r9598 r12101 13 13 PUBLIC 14 14 15 CHARACTER(lc) :: cp_cfg !: name of the configuration 16 CHARACTER(lc) :: cp_cfz !: name of the zoom of configuration 17 INTEGER :: jp_cfg !: resolution of the configuration 18 19 ! data size !!! * size of all input files * 20 INTEGER :: jpidta !: 1st lateral dimension ( >= jpi ) 21 INTEGER :: jpjdta !: 2nd " " ( >= jpj ) 22 INTEGER :: jpkdta !: number of levels ( >= jpk ) 23 LOGICAL :: ln_e3_dep ! e3. definition flag 24 REAL(wp) :: pp_not_used = 999999._wp !: vertical grid parameter 25 REAL(wp) :: pp_to_be_computed = 999999._wp !: - - - 26 !!---------------------------------------------------------------------- 27 !! namcfg namelist parameters 28 !!---------------------------------------------------------------------- 29 LOGICAL :: ln_read_cfg !: (=T) read the domain configuration file or (=F) not 30 CHARACTER(lc) :: cn_domcfg !: filename the configuration file to be read 31 LOGICAL :: ln_write_cfg !: (=T) create the domain configuration file 32 CHARACTER(lc) :: cn_domcfg_out !: filename the configuration file to be read 33 ! 34 LOGICAL :: ln_use_jattr !: input file read offset 35 ! ! Use file global attribute: open_ocean_jstart to determine start j-row 36 ! ! when reading input from those netcdf files that have the 37 ! ! attribute defined. This is designed to enable input files associated 38 ! ! with the extended grids used in the under ice shelf configurations to 39 ! ! be used without redundant rows when the ice shelves are not in use. 40 ! 41 42 !!--------------------------------------------------------------------- 43 !! Domain Matrix size 44 !!--------------------------------------------------------------------- 45 ! configuration name & resolution (required only in ORCA family case) 46 CHARACTER(lc) :: cn_cfg !: name of the configuration 47 INTEGER :: nn_cfg !: resolution of the configuration 48 49 ! global domain size !!! * total computational domain * 50 INTEGER :: jpiglo !: 1st dimension of global domain --> i-direction 51 INTEGER :: jpjglo !: 2nd - - --> j-direction 52 INTEGER :: jpkglo !: 3nd - - --> k levels 53 54 ! global domain size for AGRIF !!! * total AGRIF computational domain * 55 INTEGER, PUBLIC :: nbug_in_agrif_conv_do_not_remove_or_modify = 1 - 1 56 INTEGER, PUBLIC, PARAMETER :: nbghostcells = 3 !: number of ghost cells 57 INTEGER, PUBLIC :: nbcellsx ! = jpiglo - 2 - 2*nbghostcells !: number of cells in i-direction 58 INTEGER, PUBLIC :: nbcellsy ! = jpjglo - 2 - 2*nbghostcells !: number of cells in j-direction 59 60 ! local domain size !!! * local computational domain * 61 INTEGER, PUBLIC :: jpi ! !: first dimension 62 INTEGER, PUBLIC :: jpj ! !: second dimension 63 INTEGER, PUBLIC :: jpk ! = jpkglo !: third dimension 64 INTEGER, PUBLIC :: jpim1 ! = jpi-1 !: inner domain indices 65 INTEGER, PUBLIC :: jpjm1 ! = jpj-1 !: - - - 66 INTEGER, PUBLIC :: jpkm1 ! = jpk-1 !: - - - 67 INTEGER, PUBLIC :: jpij ! = jpi*jpj !: jpi x jpj 68 INTEGER, PUBLIC :: jpimax! = ( jpiglo-2*nn_hls + (jpni-1) ) / jpni + 2*nn_hls !: maximum jpi 69 INTEGER, PUBLIC :: jpjmax! = ( jpjglo-2*nn_hls + (jpnj-1) ) / jpnj + 2*nn_hls !: maximum jpj 70 71 !!--------------------------------------------------------------------- 72 !! Active tracer parameters 73 !!--------------------------------------------------------------------- 74 INTEGER, PUBLIC, PARAMETER :: jpts = 2 !: Number of active tracers (=2, i.e. T & S ) 75 INTEGER, PUBLIC, PARAMETER :: jp_tem = 1 !: indice for temperature 76 INTEGER, PUBLIC, PARAMETER :: jp_sal = 2 !: indice for salinity 77 15 78 !!---------------------------------------------------------------------- 16 79 !! Domain decomposition … … 22 85 INTEGER, PUBLIC, PARAMETER :: jpr2di = 0 !: number of columns for extra outer halo 23 86 INTEGER, PUBLIC, PARAMETER :: jpr2dj = 0 !: number of rows for extra outer halo 24 INTEGER, PUBLIC, PARAMETER :: jpreci = 1 !: number of columns for overlap 25 INTEGER, PUBLIC, PARAMETER :: jprecj = 1 !: number of rows for overlap 26 27 !!---------------------------------------------------------------------- 28 !! namcfg namelist parameters 29 !!---------------------------------------------------------------------- 30 ! 31 LOGICAL :: ln_e3_dep ! e3. definition flag 32 ! 33 CHARACTER(lc) :: cp_cfg !: name of the configuration 34 CHARACTER(lc) :: cp_cfz !: name of the zoom of configuration 35 INTEGER :: jp_cfg !: resolution of the configuration 36 37 ! data size !!! * size of all input files * 38 INTEGER :: jpidta !: 1st lateral dimension ( >= jpi ) 39 INTEGER :: jpjdta !: 2nd " " ( >= jpj ) 40 INTEGER :: jpkdta !: number of levels ( >= jpk ) 41 42 ! global or zoom domain size !!! * computational domain * 43 INTEGER :: jpiglo !: 1st dimension of global domain --> i 44 INTEGER :: jpjglo !: 2nd - - --> j 45 46 ! zoom starting position 47 INTEGER :: jpizoom !: left bottom (i,j) indices of the zoom 48 INTEGER :: jpjzoom !: in data domain indices 49 50 ! Domain characteristics 51 INTEGER :: jperio !: lateral cond. type (between 0 and 6) 52 ! ! = 0 closed ; = 1 cyclic East-West 53 ! ! = 2 equatorial symmetric ; = 3 North fold T-point pivot 54 ! ! = 4 cyclic East-West AND North fold T-point pivot 55 ! ! = 5 North fold F-point pivot 56 ! ! = 6 cyclic East-West AND North fold F-point pivot 57 58 ! Input file read offset 59 LOGICAL :: ln_use_jattr !: Use file global attribute: open_ocean_jstart to determine start j-row 60 ! when reading input from those netcdf files that have the 61 ! attribute defined. This is designed to enable input files associated 62 ! with the extended grids used in the under ice shelf configurations to 63 ! be used without redundant rows when the ice shelves are not in use. 64 65 !! Values set to pp_not_used indicates that this parameter is not used in THIS config. 66 !! Values set to pp_to_be_computed indicates that variables will be computed in domzgr 67 REAL(wp) :: pp_not_used = 999999._wp !: vertical grid parameter 68 REAL(wp) :: pp_to_be_computed = 999999._wp !: - - - 69 70 71 72 73 !!--------------------------------------------------------------------- 74 !! Active tracer parameters 75 !!--------------------------------------------------------------------- 76 INTEGER, PUBLIC, PARAMETER :: jpts = 2 !: Number of active tracers (=2, i.e. T & S ) 77 INTEGER, PUBLIC, PARAMETER :: jp_tem = 1 !: indice for temperature 78 INTEGER, PUBLIC, PARAMETER :: jp_sal = 2 !: indice for salinity 79 80 !!--------------------------------------------------------------------- 81 !! Domain Matrix size (if AGRIF, they are not all parameters) 82 !!--------------------------------------------------------------------- 83 84 85 86 87 88 89 INTEGER, PUBLIC :: jpi ! = ( jpiglo-2*jpreci + (jpni-1) ) / jpni + 2*jpreci !: first dimension 90 INTEGER, PUBLIC :: jpj ! = ( jpjglo-2*jprecj + (jpnj-1) ) / jpnj + 2*jprecj !: second dimension 91 INTEGER, PUBLIC :: jpk ! = jpkdta 92 INTEGER, PUBLIC :: jpim1 ! = jpi-1 !: inner domain indices 93 INTEGER, PUBLIC :: jpjm1 ! = jpj-1 !: - - - 94 INTEGER, PUBLIC :: jpkm1 ! = jpk-1 !: - - - 95 INTEGER, PUBLIC :: jpij ! = jpi*jpj !: jpi x jpj 87 INTEGER, PUBLIC, PARAMETER :: nn_hls = 1 !: halo width (applies to both rows and columns) 96 88 97 89 !!---------------------------------------------------------------------- 98 90 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 99 !! $Id: par_oce.F90 5836 2015-10-26 14:49:40Z cetlod$100 !! Software governed by the CeCILL licen ce (./LICENSE)91 !! $Id: par_oce.F90 10068 2018-08-28 14:09:04Z nicolasmartin $ 92 !! Software governed by the CeCILL license (see ./LICENSE) 101 93 !!====================================================================== 102 94 END MODULE par_oce
Note: See TracChangeset
for help on using the changeset viewer.