- Timestamp:
- 2014-06-11T14:52:23+02:00 (10 years ago)
- Location:
- branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90
r4488 r4666 175 175 LOGICAL, PUBLIC :: ln_zps !: z-coordinate - partial step 176 176 LOGICAL, PUBLIC :: ln_sco !: s-coordinate or hybrid z-s coordinate 177 LOGICAL, PUBLIC :: ln_isf !: presence of ISF 177 178 178 179 !! All coordinates … … 250 251 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbkt !: vertical index of the bottom last T- ocean level 251 252 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mbku, mbkv !: vertical index of the bottom last U- and W- ocean level 252 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bathy !: ocean depth (meters) 253 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_i !: interior domain T-point mask 254 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bmask !: land/ocean mask of barotropic stream function 253 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bathy !: ocean depth (meters) 254 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_i, umask_i, vmask_i, fmask_i !: interior domain T-point mask 255 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: bmask !: land/ocean mask of barotropic stream function 256 257 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: micedep !: top first ocean level (ISF) 258 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: mikt, miku, mikv, mikf !: first wet T-, U-, V-, F- ocean level (ISF) 259 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: icedep, iceh !: Iceshelf draft, iceshef freeboard (ISF) 260 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: lmask !: surface domain T-point mask 255 261 256 262 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET :: tmask, umask, vmask, fmask !: land/ocean mask at T-, U-, V- and F-pts … … 379 385 & hift (jpi,jpj) , hifu (jpi,jpj) , rx1 (jpi,jpj) , STAT=ierr(8) ) 380 386 381 ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) , & 382 & tmask_i(jpi,jpj) , bmask(jpi,jpj) , & 387 ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) , & 388 & tmask_i(jpi,jpj) , umask_i(jpi,jpj), vmask_i(jpi,jpj), fmask_i(jpi,jpj), & 389 & bmask(jpi,jpj) , & 383 390 & mbkt (jpi,jpj) , mbku (jpi,jpj) , mbkv(jpi,jpj) , STAT=ierr(9) ) 384 391 392 ! (ISF) Allocation of basic array 393 ALLOCATE( micedep(jpi,jpj) , icedep(jpi,jpj), iceh(jpi,jpj), & 394 & mikt(jpi,jpj), miku(jpi,jpj), mikv(jpi,jpj) , & 395 & mikf(jpi,jpj), lmask(jpi,jpj), STAT=ierr(10) ) 396 385 397 ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk), & 386 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(1 0) )398 & vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk), STAT=ierr(11) ) 387 399 388 400 #if defined key_noslip_accurate -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90
r4624 r4666 111 111 END DO 112 112 ! ! Inverse of the local depth 113 hur(:,:) = 1._wp / ( hu(:,:) + 1._wp - umask (:,:,1) ) * umask(:,:,1)114 hvr(:,:) = 1._wp / ( hv(:,:) + 1._wp - vmask (:,:,1) ) * vmask(:,:,1)113 hur(:,:) = 1._wp / ( hu(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 114 hvr(:,:) = 1._wp / ( hv(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 115 115 116 116 CALL dom_stp ! time step … … 159 159 READ ( numnam_cfg, namrun, IOSTAT = ios, ERR = 902 ) 160 160 902 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namrun in configuration namelist', lwp ) 161 IF(lwm)WRITE ( numond, namrun )161 WRITE ( numond, namrun ) 162 162 ! 163 163 IF(lwp) THEN ! control print … … 241 241 READ ( numnam_cfg, namdom, IOSTAT = ios, ERR = 904 ) 242 242 904 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namdom in configuration namelist', lwp ) 243 IF(lwm)WRITE ( numond, namdom )243 WRITE ( numond, namdom ) 244 244 245 245 IF(lwp) THEN … … 303 303 READ ( numnam_cfg, namcla, IOSTAT = ios, ERR = 906 ) 304 304 906 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namcla in configuration namelist', lwp ) 305 IF(lwm)WRITE( numond, namcla )305 WRITE( numond, namcla ) 306 306 307 307 IF(lwp) THEN … … 327 327 READ ( numnam_cfg, namnc4, IOSTAT = ios, ERR = 908 ) 328 328 908 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namnc4 in configuration namelist', lwp ) 329 IF(lwm)WRITE( numond, namnc4 )329 WRITE( numond, namnc4 ) 330 330 331 331 IF(lwp) THEN ! control print … … 365 365 ! 366 366 IF(lk_mpp) THEN 367 CALL mpp_minloc( e1t(:,:), tmask (:,:,1), ze1min, iimi1,ijmi1 )368 CALL mpp_minloc( e2t(:,:), tmask (:,:,1), ze2min, iimi2,ijmi2 )369 CALL mpp_maxloc( e1t(:,:), tmask (:,:,1), ze1max, iima1,ijma1 )370 CALL mpp_maxloc( e2t(:,:), tmask (:,:,1), ze2max, iima2,ijma2 )367 CALL mpp_minloc( e1t(:,:), tmask_i(:,:), ze1min, iimi1,ijmi1 ) 368 CALL mpp_minloc( e2t(:,:), tmask_i(:,:), ze2min, iimi2,ijmi2 ) 369 CALL mpp_maxloc( e1t(:,:), tmask_i(:,:), ze1max, iima1,ijma1 ) 370 CALL mpp_maxloc( e2t(:,:), tmask_i(:,:), ze2max, iima2,ijma2 ) 371 371 ELSE 372 ze1min = MINVAL( e1t(:,:), mask = tmask (:,:,1) == 1._wp )373 ze2min = MINVAL( e2t(:,:), mask = tmask (:,:,1) == 1._wp )374 ze1max = MAXVAL( e1t(:,:), mask = tmask (:,:,1) == 1._wp )375 ze2max = MAXVAL( e2t(:,:), mask = tmask (:,:,1) == 1._wp )376 377 iloc = MINLOC( e1t(:,:), mask = tmask (:,:,1) == 1._wp )372 ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 373 ze2min = MINVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 374 ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 375 ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 376 377 iloc = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 378 378 iimi1 = iloc(1) + nimpp - 1 379 379 ijmi1 = iloc(2) + njmpp - 1 380 iloc = MINLOC( e2t(:,:), mask = tmask (:,:,1) == 1._wp )380 iloc = MINLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 381 381 iimi2 = iloc(1) + nimpp - 1 382 382 ijmi2 = iloc(2) + njmpp - 1 383 iloc = MAXLOC( e1t(:,:), mask = tmask (:,:,1) == 1._wp )383 iloc = MAXLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp ) 384 384 iima1 = iloc(1) + nimpp - 1 385 385 ijma1 = iloc(2) + njmpp - 1 386 iloc = MAXLOC( e2t(:,:), mask = tmask (:,:,1) == 1._wp )386 iloc = MAXLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp ) 387 387 iima2 = iloc(1) + nimpp - 1 388 388 ijma2 = iloc(2) + njmpp - 1 -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90
r4366 r4666 638 638 CALL iom_close( inum ) 639 639 640 ! need to be define for the extended grid south of -80S 641 ! some point are undefined but you need to have e1 and e2 .NE. 0 642 WHERE (e1t==0.0_wp) 643 e1t=1.0e2 644 END WHERE 645 WHERE (e1v==0.0_wp) 646 e1v=1.0e2 647 END WHERE 648 WHERE (e1u==0.0_wp) 649 e1u=1.0e2 650 END WHERE 651 WHERE (e1f==0.0_wp) 652 e1f=1.0e2 653 END WHERE 654 WHERE (e2t==0.0_wp) 655 e2t=1.0e2 656 END WHERE 657 WHERE (e2v==0.0_wp) 658 e2v=1.0e2 659 END WHERE 660 WHERE (e2u==0.0_wp) 661 e2u=1.0e2 662 END WHERE 663 WHERE (e2f==0.0_wp) 664 e2f=1.0e2 665 END WHERE 666 640 667 END SUBROUTINE hgr_read 641 668 -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90
r4624 r4666 184 184 END DO 185 185 END DO 186 187 ! (ISF) define barotropic mask and mask the ice shelf point 188 lmask(:,:)=tmask(:,:,1) ! at this stage ice shelf is not masked 189 190 DO jk = 1, jpk 191 DO jj = 1, jpj 192 DO ji = 1, jpi 193 IF( REAL( micedep(ji,jj) - jk, wp ) - 0.1_wp >= 0._wp ) THEN 194 tmask(ji,jj,jk) = 0._wp 195 END IF 196 END DO 197 END DO 198 END DO 186 199 187 200 !!gm ???? … … 207 220 ! Interior domain mask (used for global sum) 208 221 ! -------------------- 209 tmask_i(:,:) = tmask(:,:,1)222 tmask_i(:,:) = lmask(:,:) ! (ISH) tmask_i = 1 even on the ice shelf 210 223 iif = jpreci ! ??? 211 224 iil = nlci - jpreci + 1 … … 250 263 END DO 251 264 END DO 265 ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet u point 266 DO jj = 1, jpjm1 267 DO ji = 1, fs_jpim1 ! vector loop 268 umask_i(ji,jj) = lmask(ji,jj) * lmask(ji+1,jj ) * MIN(1._wp,SUM(umask(ji,jj,:))) 269 vmask_i(ji,jj) = lmask(ji,jj) * lmask(ji ,jj+1) * MIN(1._wp,SUM(vmask(ji,jj,:))) 270 END DO 271 DO ji = 1, jpim1 ! NO vector opt. 272 fmask_i(ji,jj) = lmask(ji,jj ) * lmask(ji+1,jj ) & 273 & * lmask(ji,jj+1) * lmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:))) 274 END DO 275 END DO 252 276 CALL lbc_lnk( umask, 'U', 1._wp ) ! Lateral boundary conditions 253 277 CALL lbc_lnk( vmask, 'V', 1._wp ) 254 278 CALL lbc_lnk( fmask, 'F', 1._wp ) 279 CALL lbc_lnk( umask_i, 'U', 1._wp ) ! Lateral boundary conditions 280 CALL lbc_lnk( vmask_i, 'V', 1._wp ) 281 CALL lbc_lnk( fmask_i, 'F', 1._wp ) 255 282 256 283 257 284 ! 4. ocean/land mask for the elliptic equation 258 285 ! -------------------------------------------- 259 bmask(:,:) = tmask(:,:,1) ! elliptic equation is written at t-point286 bmask(:,:) = lmask(:,:) ! elliptic equation is written at t-point 260 287 ! 261 288 ! ! Boundary conditions -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90
r4624 r4666 169 169 fsdept_b(:,:,1) = 0.5_wp * fse3w_b(:,:,1) 170 170 fsdepw_b(:,:,1) = 0.0_wp 171 DO jk = 2, jpk 172 fsdept_n(:,:,jk) = fsdept_n(:,:,jk-1) + fse3w_n(:,:,jk) 173 fsdepw_n(:,:,jk) = fsdepw_n(:,:,jk-1) + fse3t_n(:,:,jk-1) 174 fsde3w_n(:,:,jk) = fsdept_n(:,:,jk ) - sshn (:,:) 175 fsdept_b(:,:,jk) = fsdept_b(:,:,jk-1) + fse3w_b(:,:,jk) 176 fsdepw_b(:,:,jk) = fsdepw_b(:,:,jk-1) + fse3t_b(:,:,jk-1) 171 DO jj = 1,jpj 172 DO ji = 1,jpi 173 DO jk = 1,mikt(ji,jj)-1 174 fsdept_n(ji,jj,jk) = gdept_0(ji,jj,jk) 175 fsdepw_n(ji,jj,jk) = gdepw_0(ji,jj,jk) 176 fsde3w_n(ji,jj,jk) = gdept_0(ji,jj,jk) - sshn(ji,jj) 177 fsdept_b(ji,jj,jk) = gdept_0(ji,jj,jk) 178 fsdepw_b(ji,jj,jk) = gdepw_0(ji,jj,jk) 179 END DO 180 DO jk = mikt(ji,jj), jpk 181 fsdept_n(ji,jj,jk) = fsdept_n(ji,jj,jk-1) + fse3w_n(ji,jj,jk) 182 fsdepw_n(ji,jj,jk) = fsdepw_n(ji,jj,jk-1) + fse3t_n(ji,jj,jk-1) 183 fsde3w_n(ji,jj,jk) = fsdept_n(ji,jj,jk ) - sshn (ji,jj) 184 fsdept_b(ji,jj,jk) = fsdept_b(ji,jj,jk-1) + fse3w_b(ji,jj,jk) 185 fsdepw_b(ji,jj,jk) = fsdepw_b(ji,jj,jk-1) + fse3t_b(ji,jj,jk-1) 186 END DO 187 END DO 177 188 END DO 178 189 … … 185 196 hv_b(:,:) = hv_b(:,:) + fse3v_b(:,:,jk) * vmask(:,:,jk) 186 197 END DO 187 hur_b(:,:) = umask (:,:,1) / ( hu_b(:,:) + 1. - umask(:,:,1) )188 hvr_b(:,:) = vmask (:,:,1) / ( hv_b(:,:) + 1. - vmask(:,:,1) )198 hur_b(:,:) = umask_i(:,:) / ( hu_b(:,:) + 1. - umask_i(:,:) ) 199 hvr_b(:,:) = vmask_i(:,:) / ( hv_b(:,:) + 1. - vmask_i(:,:) ) 189 200 190 201 ! Restoring frequencies for z_tilde coordinate … … 293 304 ! ! --------------------------------------------- ! 294 305 295 z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * tmask (:,:,1) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask(:,:,1) )306 z_scale(:,:) = ( ssha(:,:) - sshb(:,:) ) * tmask_i(:,:) / ( ht_0(:,:) + sshn(:,:) + 1. - tmask_i(:,:) ) 296 307 DO jk = 1, jpkm1 297 308 ! formally this is the same as fse3t_a = e3t_0*(1+ssha/ht_0) … … 313 324 zht (:,:) = zht (:,:) + fse3t_n(:,:,jk) * tmask(:,:,jk) 314 325 END DO 315 zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask (:,:,1) )326 zhdiv(:,:) = zhdiv(:,:) / ( zht(:,:) + 1. - tmask_i(:,:) ) 316 327 317 328 ! 2 - Low frequency baroclinic horizontal divergence (z-tilde case only) … … 338 349 ELSE ! layer case 339 350 DO jk = 1, jpkm1 340 tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) 351 tilde_e3t_a(:,:,jk) = tilde_e3t_a(:,:,jk) - fse3t_n(:,:,jk) * ( hdivn(:,:,jk) - zhdiv(:,:) ) * tmask(:,:,jk) 341 352 END DO 342 353 END IF … … 463 474 ! ! ---baroclinic part--------- ! 464 475 DO jk = 1, jpkm1 465 fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) 476 fse3t_a(:,:,jk) = fse3t_a(:,:,jk) + dtilde_e3t_a(:,:,jk) * tmask(:,:,jk) 466 477 END DO 467 478 ENDIF … … 531 542 END DO 532 543 ! ! Inverse of the local depth 533 hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask (:,:,1) ) * umask(:,:,1)534 hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask (:,:,1) ) * vmask(:,:,1)544 hur_a(:,:) = 1._wp / ( hu_a(:,:) + 1._wp - umask_i(:,:) ) * umask_i(:,:) 545 hvr_a(:,:) = 1._wp / ( hv_a(:,:) + 1._wp - vmask_i(:,:) ) * vmask_i(:,:) 535 546 536 547 CALL wrk_dealloc( jpi, jpj, zht, z_scale, zwu, zwv, zhdiv ) … … 830 841 DO jk=1,jpk 831 842 fse3t_n(:,:,jk) = e3t_0(:,:,jk) * ( ht_0(:,:) + sshn(:,:) ) & 832 & / ( ht_0(:,:) + 1._wp - tmask (:,:,1) ) * tmask(:,:,jk) &843 & / ( ht_0(:,:) + 1._wp - tmask_i(:,:) ) * tmask(:,:,jk) & 833 844 & + e3t_0(:,:,jk) * (1._wp -tmask(:,:,jk)) 834 845 END DO -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90
r4292 r4666 132 132 133 133 CALL dom_uniq( zprw, 'T' ) 134 zprt = tmask(:,:,1) * zprw ! ! unique point mask 134 DO jj = 1, jpj 135 DO ji = 1, jpi 136 jk=mikt(ji,jj) 137 zprt(ji,jj) = tmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 138 END DO 139 END DO ! ! unique point mask 135 140 CALL iom_rstput( 0, 0, inum2, 'tmaskutil', zprt, ktype = jp_i1 ) 136 141 CALL dom_uniq( zprw, 'U' ) 137 zprt = umask(:,:,1) * zprw 142 DO jj = 1, jpj 143 DO ji = 1, jpi 144 jk=miku(ji,jj) 145 zprt(ji,jj) = umask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 146 END DO 147 END DO 138 148 CALL iom_rstput( 0, 0, inum2, 'umaskutil', zprt, ktype = jp_i1 ) 139 149 CALL dom_uniq( zprw, 'V' ) 140 zprt = vmask(:,:,1) * zprw 150 DO jj = 1, jpj 151 DO ji = 1, jpi 152 jk=mikv(ji,jj) 153 zprt(ji,jj) = vmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 154 END DO 155 END DO 141 156 CALL iom_rstput( 0, 0, inum2, 'vmaskutil', zprt, ktype = jp_i1 ) 142 157 CALL dom_uniq( zprw, 'F' ) 143 zprt = fmask(:,:,1) * zprw 158 DO jj = 1, jpj 159 DO ji = 1, jpi 160 jk=mikf(ji,jj) 161 zprt(ji,jj) = fmask(ji,jj,jk) * zprw(ji,jj) ! ! unique point mask 162 END DO 163 END DO 144 164 CALL iom_rstput( 0, 0, inum2, 'fmaskutil', zprt, ktype = jp_i1 ) 145 165 … … 168 188 169 189 ! note that mbkt is set to 1 over land ==> use surface tmask 170 zprt(:,:) = tmask(:,:,1) * REAL( mbkt(:,:) , wp )190 zprt(:,:) = lmask(:,:) * REAL( mbkt(:,:) , wp ) 171 191 CALL iom_rstput( 0, 0, inum4, 'mbathy', zprt, ktype = jp_i2 ) ! ! nb of ocean T-points 192 zprt(:,:) = lmask(:,:) * REAL( mikt(:,:) , wp ) 193 CALL iom_rstput( 0, 0, inum4, 'misf', zprt, ktype = jp_i2 ) ! ! nb of ocean T-points 194 zprt(:,:) = lmask(:,:) * REAL( icedep(:,:) , wp ) 195 CALL iom_rstput( 0, 0, inum4, 'isfdraft', zprt, ktype = jp_r4 ) ! ! nb of ocean T-points 172 196 173 197 IF( ln_sco ) THEN ! s-coordinate … … 203 227 DO jj = 1,jpj 204 228 DO ji = 1,jpi 205 e3tp(ji,jj) = e3t_0(ji,jj,mbkt(ji,jj)) * tmask(ji,jj,1)206 e3wp(ji,jj) = e3w_0(ji,jj,mbkt(ji,jj)) * tmask(ji,jj,1)229 e3tp(ji,jj) = e3t_0(ji,jj,mbkt(ji,jj)) * lmask(ji,jj) 230 e3wp(ji,jj) = e3w_0(ji,jj,mbkt(ji,jj)) * lmask(ji,jj) 207 231 END DO 208 232 END DO … … 228 252 DO jj = 1,jpj 229 253 DO ji = 1,jpi 230 zprt(ji,jj) = gdept_0(ji,jj,mbkt(ji,jj) ) * tmask(ji,jj,1)231 zprw(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) * tmask(ji,jj,1)254 zprt(ji,jj) = gdept_0(ji,jj,mbkt(ji,jj) ) * lmask(ji,jj) 255 zprw(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) * lmask(ji,jj) 232 256 END DO 233 257 END DO -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90
r4624 r4666 35 35 USE oce ! ocean variables 36 36 USE dom_oce ! ocean domain 37 USE sbc_oce ! surface variable (isf) 37 38 USE closea ! closed seas 38 39 USE c1d ! 1D vertical configuration … … 102 103 ! 103 104 NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 105 NAMELIST/namsbc/ nn_fsbc , ln_ana , ln_flx , ln_blk_clio, ln_blk_core, ln_cpl, & 106 & ln_blk_mfs, ln_apr_dyn, nn_ice , ln_dm2dc, ln_rnf, ln_ssr, nn_fwb, ln_cdgw, nn_isf 104 107 !!---------------------------------------------------------------------- 105 108 ! … … 145 148 IF( .NOT.lk_c1d ) CALL zgr_bat_ctl ! check bathymetry (mbathy) and suppress isolated ocean points 146 149 CALL zgr_bot_level ! deepest ocean level for t-, u- and v-points 150 CALL zgr_top_level ! shallowest ocean level for T-, U-, V- points 147 151 ! 148 152 IF( lk_c1d ) THEN ! 1D config.: same mbathy value over the 3x3 domain … … 294 298 gdepw_1d(1) = 0._wp ! force first w-level to be exactly at zero 295 299 ENDIF 300 301 ! need to be like this to compute the pressure gradient with ISF 302 ! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 303 DO jk = 1, jpkm1 304 e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk) 305 END DO 306 e3t_1d(jpk) = e3t_1d(jpk-1) ! we don't care because this level is masked in NEMO 307 308 DO jk = 2, jpk 309 e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1) 310 END DO 311 e3w_1d(1 ) = 2._wp * (gdept_1d(1) - gdepw_1d(1)) 296 312 297 313 !!gm BUG in s-coordinate this does not work! … … 451 467 END DO 452 468 ! 469 ! (ISF) TODO build ice draft netcdf file for isomip and build the corresponding part of code 470 IF( cp_cfg == "isomip" ) THEN 471 ! 472 icedep(:,:)=200.e0 473 micedep(:,:)=1 474 ij0 = 1 ; ij1 = 40 475 DO jj = mj0(ij0), mj1(ij1) 476 icedep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp 477 END DO 478 WHERE( bathy(:,:) <= 0._wp ) icedep(:,:) = 0._wp 479 ! 480 ELSEIF ( cp_cfg == "isomip2" ) THEN 481 ! 482 icedep(:,:)=0.e0 483 micedep(:,:)=1 484 ij0 = 1 ; ij1 = 40 485 DO jj = mj0(ij0), mj1(ij1) 486 icedep(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp 487 END DO 488 WHERE( bathy(:,:) <= 0._wp ) icedep(:,:) = 0._wp 489 END IF 490 ! 453 491 ! ! ================ ! 454 492 ELSEIF( ntopo == 1 ) THEN ! read in file ! (over the local domain) … … 492 530 CALL iom_get ( inum, jpdom_data, 'Bathymetry', bathy ) 493 531 CALL iom_close( inum ) 494 ! 532 ! 533 icedep(:,:)=0._wp 534 micedep(:,:)=1 535 IF ( nn_isf == 1 .OR. nn_isf == 4 ) THEN 536 CALL iom_open ( 'isf_draft_meter.nc', inum ) 537 CALL iom_get ( inum, jpdom_data, 'isf_draft', icedep ) 538 CALL iom_close( inum ) 539 WHERE( bathy(:,:) <= 0._wp ) icedep(:,:) = 0._wp 540 END IF 541 ! 495 542 IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN ! ORCA R2 configuration 496 543 ! … … 783 830 END SUBROUTINE zgr_bot_level 784 831 832 SUBROUTINE zgr_top_level 833 !!---------------------------------------------------------------------- 834 !! *** ROUTINE zgr_bot_level *** 835 !! 836 !! ** Purpose : defines the vertical index of ocean top (mik. arrays) 837 !! 838 !! ** Method : computes from micedep with a minimum value of 1 839 !! 840 !! ** Action : mikt, miku, mikv : vertical indices of the shallowest 841 !! ocean level at t-, u- & v-points 842 !! (min value = 1) 843 !!---------------------------------------------------------------------- 844 !! 845 INTEGER :: ji, jj ! dummy loop indices 846 REAL(wp), POINTER, DIMENSION(:,:) :: zmik 847 !!---------------------------------------------------------------------- 848 ! 849 IF( nn_timing == 1 ) CALL timing_start('zgr_top_level') 850 ! 851 CALL wrk_alloc( jpi, jpj, zmik ) 852 ! 853 IF(lwp) WRITE(numout,*) 854 IF(lwp) WRITE(numout,*) ' zgr_top_level : ocean top k-index of T-, U-, V- and W-levels ' 855 IF(lwp) WRITE(numout,*) ' ~~~~~~~~~~~~~' 856 ! 857 mikt(:,:) = MAX( micedep(:,:) , 1 ) ! top k-index of T-level (=1) 858 ! ! top k-index of W-level (=mikt) 859 DO jj = 1, jpjm1 ! top k-index of U- (U-) level 860 DO ji = 1, jpim1 861 miku(ji,jj) = MAX( mikt(ji+1,jj ) , mikt(ji,jj) ) 862 mikv(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj) ) 863 mikf(ji,jj) = MAX( mikt(ji ,jj+1) , mikt(ji,jj), mikt(ji+1,jj ), mikt(ji+1,jj+1) ) 864 END DO 865 END DO 866 867 ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk 868 zmik(:,:) = REAL( miku(:,:), wp ) ; CALL lbc_lnk(zmik,'U',1.) ; miku (:,:) = MAX( INT( zmik(:,:) ), 1 ) 869 zmik(:,:) = REAL( mikv(:,:), wp ) ; CALL lbc_lnk(zmik,'V',1.) ; mikv (:,:) = MAX( INT( zmik(:,:) ), 1 ) 870 zmik(:,:) = REAL( mikf(:,:), wp ) ; CALL lbc_lnk(zmik,'F',1.) ; mikf (:,:) = MAX( INT( zmik(:,:) ), 1 ) 871 ! 872 CALL wrk_dealloc( jpi, jpj, zmik ) 873 ! 874 IF( nn_timing == 1 ) CALL timing_stop('zgr_top_level') 875 ! 876 END SUBROUTINE zgr_top_level 785 877 786 878 SUBROUTINE zgr_zco … … 861 953 !!---------------------------------------------------------------------- 862 954 !! 863 INTEGER :: ji, jj, jk 955 INTEGER :: ji, jj, jk, jl ! dummy loop indices 864 956 INTEGER :: ik, it ! temporary integers 957 INTEGER :: id, jd, nprocd 958 INTEGER :: icompt, ibtest ! (ISF) 865 959 LOGICAL :: ll_print ! Allow control print for debugging 866 960 REAL(wp) :: ze3tp , ze3wp ! Last ocean level thickness at T- and W-points 867 961 REAL(wp) :: zdepwp, zdepth ! Ajusted ocean depth to avoid too small e3t 868 REAL(wp) :: zmax ! Maximum depth962 REAL(wp) :: zmax, zmin ! Maximum and minimum depth 869 963 REAL(wp) :: zdiff ! temporary scalar 870 964 REAL(wp) :: zrefdep ! temporary scalar 965 REAL(wp) :: eps=0.99 ! small offset to avoid large pool in case bathy slightly greater than icedep 966 REAL(wp), POINTER, DIMENSION(:,:) :: zbathy, zmask ! 3D workspace (ISH) 967 INTEGER , POINTER, DIMENSION(:,:) :: zmbathy, zmicedep ! 3D workspace (ISH) 871 968 REAL(wp), POINTER, DIMENSION(:,:,:) :: zprt 872 969 !!--------------------------------------------------------------------- … … 875 972 ! 876 973 CALL wrk_alloc( jpi, jpj, jpk, zprt ) 974 CALL wrk_alloc( jpi, jpj, zbathy, zmask) 975 CALL wrk_alloc( jpi, jpj, zmbathy, zmicedep) 877 976 ! 878 977 IF(lwp) WRITE(numout,*) … … 906 1005 WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth ) mbathy(:,:) = jk-1 907 1006 END DO 1007 ! (ISF) compute micedep 1008 WHERE( icedep(:,:) == 0._wp ) ; micedep(:,:) = 1 ! no ice shelf : set micedep to 1 1009 ELSEWHERE ; micedep(:,:) = 2 ! iceshelf : initialize micedep to second level 1010 END WHERE 1011 1012 ! Compute micedep for ocean points (i.e. first wet level) 1013 ! find the first ocean level such that the first level thickness 1014 ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where 1015 ! e3t_0 is the reference level thickness 1016 DO jk = 2, jpkm1 1017 zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 1018 WHERE( 0._wp < icedep(:,:) .AND. icedep(:,:) >= zdepth ) micedep(:,:) = jk+1 1019 END DO 1020 WHERE (icedep <= e3t_1d(1) .AND. icedep .GT. 0._wp) 1021 icedep = 0. 1022 micedep= 1 1023 END WHERE 1024 1025 1026 icompt = 0 1027 DO jl = 1, 10 1028 IF( lk_mpp ) THEN 1029 zbathy(:,:) = FLOAT( micedep(:,:) ) 1030 CALL lbc_lnk( zbathy, 'T', 1. ) 1031 micedep(:,:) = INT( zbathy(:,:) ) 1032 CALL lbc_lnk( icedep, 'T', 1. ) 1033 CALL lbc_lnk( bathy, 'T', 1. ) 1034 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1035 CALL lbc_lnk( zbathy, 'T', 1. ) 1036 mbathy(:,:) = INT( zbathy(:,:) ) 1037 ENDIF 1038 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 1039 micedep( 1 ,:) = micedep(jpim1,:) ! local domain is cyclic east-west 1040 micedep(jpi,:) = micedep( 2 ,:) 1041 ENDIF 1042 1043 IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 1044 mbathy( 1 ,:) = mbathy(jpim1,:) ! local domain is cyclic east-west 1045 mbathy(jpi,:) = mbathy( 2 ,:) 1046 ENDIF 1047 1048 WHERE (mbathy == 0) 1049 icedep = 0._wp 1050 micedep= 0 1051 bathy = 0._wp 1052 ENDWHERE 1053 1054 WHERE (bathy(:,:) < icedep(:,:)+eps) 1055 micedep(:,:) = 0 1056 icedep(:,:) = 0._wp 1057 mbathy(:,:) = 0 1058 bathy(:,:) = 0._wp 1059 END WHERE 1060 1061 DO jj = 1, jpj 1062 DO ji = 1, jpi 1063 IF (bathy(ji,jj) .GT. icedep(ji,jj) .AND. mbathy(ji,jj) .LT. micedep(ji,jj)) THEN 1064 bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)+1) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat ) 1065 mbathy(ji,jj)= mbathy(ji,jj) + 1 1066 END IF 1067 END DO 1068 END DO 1069 1070 1071 ! At least 2 levels for water thickness at T, U, and V point. 1072 zmicedep(:,:)=micedep(:,:) 1073 zmbathy (:,:)=mbathy (:,:) 1074 1075 DO jj = 2, jpjm1 1076 DO ji = 2, jpim1 1077 IF( zmicedep(ji,jj) == zmbathy(ji,jj) .AND. zmbathy(ji,jj) .GT. 1) THEN 1078 mbathy(ji,jj) = zmbathy(ji,jj) + 1 1079 bathy(ji,jj)=gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj))*e3zps_rat ) 1080 ENDIF 1081 IF( zmicedep(ji,jj+1) == zmbathy(ji,jj) .AND. zmbathy(ji,jj) .GT. 1) THEN 1082 mbathy(ji,jj) = zmbathy(ji,jj) + 1 1083 bathy(ji,jj)=gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj))*e3zps_rat ) 1084 ENDIF 1085 IF( zmicedep(ji,jj-1) == zmbathy(ji,jj) .AND. zmbathy(ji,jj) .GT. 1) THEN 1086 mbathy(ji,jj) = zmbathy(ji,jj) + 1 1087 bathy(ji,jj)=gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj))*e3zps_rat ) 1088 ENDIF 1089 IF( zmicedep(ji+1,jj) == zmbathy(ji,jj) .AND. zmbathy(ji,jj) .GT. 1) THEN 1090 mbathy(ji,jj) = zmbathy(ji,jj) + 1 1091 bathy(ji,jj)=gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj))*e3zps_rat ) 1092 ENDIF 1093 IF( zmicedep(ji-1,jj) == zmbathy(ji,jj) .AND. zmbathy(ji,jj) .GT. 1) THEN 1094 mbathy(ji,jj) = zmbathy(ji,jj) + 1 1095 bathy(ji,jj)=gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj))*e3zps_rat ) 1096 ENDIF 1097 ENDDO 1098 ENDDO 1099 IF( lk_mpp ) THEN 1100 zbathy(:,:) = FLOAT( micedep(:,:) ) 1101 CALL lbc_lnk( zbathy, 'T', 1. ) 1102 micedep(:,:) = INT( zbathy(:,:) ) 1103 CALL lbc_lnk( icedep, 'T', 1. ) 1104 CALL lbc_lnk( bathy, 'T', 1. ) 1105 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1106 CALL lbc_lnk( zbathy, 'T', 1. ) 1107 mbathy(:,:) = INT( zbathy(:,:) ) 1108 ENDIF 1109 1110 ! if single ocean point put as land 1111 zmask=1 1112 WHERE (mbathy .EQ. 0) zmask=0 1113 DO jj = 2, jpjm1 1114 DO ji = 2, jpim1 1115 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 1116 IF (ibtest .LE. 1) THEN 1117 bathy(ji,jj)=0._wp 1118 mbathy(ji,jj)=0 1119 icedep(ji,jj)=0._wp 1120 micedep(ji,jj)=0 1121 END IF 1122 END DO 1123 END DO 1124 IF( lk_mpp ) THEN 1125 zbathy(:,:) = FLOAT( micedep(:,:) ) 1126 CALL lbc_lnk( zbathy, 'T', 1. ) 1127 micedep(:,:) = INT( zbathy(:,:) ) 1128 CALL lbc_lnk( icedep, 'T', 1. ) 1129 CALL lbc_lnk( bathy, 'T', 1. ) 1130 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1131 CALL lbc_lnk( zbathy, 'T', 1. ) 1132 mbathy(:,:) = INT( zbathy(:,:) ) 1133 ENDIF 1134 1135 ! if single point on isf coast line 1136 DO jk = 1, jpk 1137 WHERE (micedep==0) micedep=jpk 1138 zmask=0 1139 WHERE (micedep .LE. jk) zmask=1 1140 DO jj = 2, jpjm1 1141 DO ji = 2, jpim1 1142 IF (micedep(ji,jj) .EQ. jk) THEN 1143 ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 1144 IF (ibtest .LE. 1) THEN 1145 icedep(ji,jj)=gdepw_1d(jk+1) ; micedep(ji,jj)=jk+1 1146 IF (micedep(ji,jj) .GT. mbathy(ji,jj)) micedep(ji,jj) = jpk 1147 ! bathy(ji,jj)=0. ; mbathy(ji,jj)=0 1148 !END IF 1149 END IF 1150 END IF 1151 END DO 1152 END DO 1153 WHERE (micedep==jpk) 1154 micedep=0 ; icedep=0._wp ; mbathy=0 ; bathy=0._wp 1155 END WHERE 1156 1157 IF( lk_mpp ) THEN 1158 zbathy(:,:) = FLOAT( micedep(:,:) ) 1159 CALL lbc_lnk( zbathy, 'T', 1. ) 1160 micedep(:,:) = INT( zbathy(:,:) ) 1161 CALL lbc_lnk( icedep, 'T', 1. ) 1162 CALL lbc_lnk( bathy, 'T', 1. ) 1163 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1164 CALL lbc_lnk( zbathy, 'T', 1. ) 1165 mbathy(:,:) = INT( zbathy(:,:) ) 1166 ENDIF 1167 END DO 1168 1169 ! fill hole in ice shelf 1170 WHERE (micedep==0) micedep=jpk 1171 zmicedep(:,:)=micedep(:,:) 1172 zmbathy (:,:)=mbathy (:,:) 1173 DO jj = 2, jpjm1 1174 DO ji = 2, jpim1 1175 ibtest=MIN(zmicedep(ji-1,jj), zmicedep(ji+1,jj), zmicedep(ji,jj-1), zmicedep(ji,jj+1)) 1176 IF( ibtest > zmicedep(ji,jj)) THEN 1177 micedep(ji,jj) = ibtest 1178 icedep(ji,jj) = gdepw_1d(ibtest) 1179 ENDIF 1180 ENDDO 1181 ENDDO 1182 WHERE (micedep==jpk) 1183 micedep=0 ; icedep=0. ; mbathy=0 ; bathy=0 1184 END WHERE 1185 IF( lk_mpp ) THEN 1186 zbathy(:,:) = FLOAT( micedep(:,:) ) 1187 CALL lbc_lnk( zbathy, 'T', 1. ) 1188 micedep(:,:) = INT( zbathy(:,:) ) 1189 CALL lbc_lnk( icedep, 'T', 1. ) 1190 CALL lbc_lnk( bathy, 'T', 1. ) 1191 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1192 CALL lbc_lnk( zbathy, 'T', 1. ) 1193 mbathy(:,:) = INT( zbathy(:,:) ) 1194 ENDIF 1195 1196 ! fill hole in bathymetry 1197 zmicedep(:,:)=micedep(:,:) 1198 zmbathy (:,:)=mbathy (:,:) 1199 DO jj = 2, jpjm1 1200 DO ji = 2, jpim1 1201 ibtest = MAX( zmbathy(ji-1,jj), zmbathy(ji+1,jj), & 1202 & zmbathy(ji,jj-1), zmbathy(ji,jj+1) ) 1203 IF( ibtest < zmbathy(ji,jj) ) THEN 1204 mbathy(ji,jj) = ibtest 1205 bathy(ji,jj) = gdepw_1d(ibtest+1) 1206 ENDIF 1207 END DO 1208 END DO 1209 IF( lk_mpp ) THEN 1210 zbathy(:,:) = FLOAT( micedep(:,:) ) 1211 CALL lbc_lnk( zbathy, 'T', 1. ) 1212 micedep(:,:) = INT( zbathy(:,:) ) 1213 CALL lbc_lnk( icedep, 'T', 1. ) 1214 CALL lbc_lnk( bathy, 'T', 1. ) 1215 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1216 CALL lbc_lnk( zbathy, 'T', 1. ) 1217 mbathy(:,:) = INT( zbathy(:,:) ) 1218 ENDIF 1219 ! remove pool of water stuck between ice shelf and bathymetry 1220 DO jk = 1, jpk 1221 WHERE (micedep==0) micedep=jpk 1222 zmicedep(:,:)=micedep(:,:) 1223 zmbathy (:,:)=mbathy (:,:) 1224 DO jj = 2, jpjm1 1225 DO ji = 2, jpim1 1226 IF( jk .GE. zmicedep(ji,jj) .AND. jk .LE. zmbathy(ji,jj) ) THEN 1227 IF( (jk > zmbathy(ji,jj+1) .OR. jk < zmicedep(ji,jj+1)) .AND. & 1228 & (jk > zmbathy(ji,jj-1) .OR. jk < zmicedep(ji,jj-1)) .AND. & 1229 & (jk > zmbathy(ji+1,jj) .OR. jk < zmicedep(ji+1,jj)) .AND. & 1230 & (jk > zmbathy(ji-1,jj) .OR. jk < zmicedep(ji-1,jj)) ) THEN 1231 mbathy(ji,jj) = 0 ; micedep(ji,jj) = jpk ; icedep(ji,jj) = 0._wp ; bathy(ji,jj) = 0._wp 1232 ENDIF 1233 ENDIF 1234 ENDDO 1235 ENDDO 1236 WHERE (micedep==jpk) micedep=0 1237 IF( lk_mpp ) THEN 1238 zbathy(:,:) = FLOAT( micedep(:,:) ) 1239 CALL lbc_lnk( zbathy, 'T', 1. ) 1240 micedep(:,:) = INT( zbathy(:,:) ) 1241 CALL lbc_lnk( icedep, 'T', 1. ) 1242 CALL lbc_lnk( bathy, 'T', 1. ) 1243 zbathy(:,:) = FLOAT( mbathy(:,:) ) 1244 CALL lbc_lnk( zbathy, 'T', 1. ) 1245 mbathy(:,:) = INT( zbathy(:,:) ) 1246 ENDIF 1247 ENDDO 1248 END DO 1249 1250 WHERE (mbathy(:,:) < micedep(:,:)) 1251 micedep(:,:) = 0 1252 icedep(:,:) = 0._wp 1253 mbathy(:,:) = 0 1254 bathy(:,:) = 0._wp 1255 END WHERE 1256 1257 1258 IF( icompt == 0 ) THEN 1259 IF(lwp) WRITE(numout,*)' no points with ice shelf too close to bathymetry' 1260 ELSE 1261 IF(lwp) WRITE(numout,*)' ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry' 1262 ENDIF 908 1263 909 1264 ! Scale factors and depth at T- and W-points … … 938 1293 !gm Bug? check the gdepw_1d 939 1294 ! ... on ik 940 gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0 941 & * ((gdept_1d(ik ) - gdepw_1d(ik) ) &942 & / ( gdepw_1d(ik+1) - gdepw_1d(ik) ))1295 gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) ) & 1296 & * ((gdept_1d( ik ) - gdepw_1d(ik) ) & 1297 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) )) 943 1298 e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) ) & 944 1299 & / ( gdepw_1d( ik+1) - gdepw_1d(ik) ) … … 973 1328 END DO 974 1329 END DO 1330 ! 1331 ! (ISF) Definition of e3t, u, v, w for ISF case 1332 DO jj = 1, jpj 1333 DO ji = 1, jpi 1334 ik = micedep(ji,jj) 1335 IF( ik > 1 ) THEN ! ice shelf point only 1336 IF( icedep(ji,jj) < gdepw_1d(ik) ) icedep(ji,jj)= gdepw_1d(ik) 1337 gdepw_0(ji,jj,ik) = icedep(ji,jj) 1338 !gm Bug? check the gdepw_0 1339 ! ... on ik 1340 gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) ) & 1341 & * ( gdepw_1d(ik+1) - gdept_1d(ik) ) & 1342 & / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) 1343 e3t_0 (ji,jj,ik ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) 1344 e3w_0 (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 1345 1346 IF( ik + 1 == mbathy(ji,jj) ) THEN ! ice shelf point only 1347 e3w_0 (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik) 1348 ENDIF 1349 ! ... on ik / ik-1 1350 e3w_0 (ji,jj,ik ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik)) 1351 e3t_0 (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 1352 ! The next line isn't required and doesn't affect results - included for consistency with bathymetry code 1353 gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 1354 ENDIF 1355 END DO 1356 END DO 1357 ! 1358 it = 0 1359 DO jj = 1, jpj 1360 DO ji = 1, jpi 1361 ik = micedep(ji,jj) 1362 IF( ik > 1 ) THEN ! ice shelf point only 1363 e3tp (ji,jj) = e3t_0(ji,jj,ik ) 1364 e3wp (ji,jj) = e3w_0(ji,jj,ik+1 ) 1365 ! test 1366 zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik ) 1367 IF( zdiff <= 0. .AND. lwp ) THEN 1368 it = it + 1 1369 WRITE(numout,*) ' it = ', it, ' ik = ', ik, ' (i,j) = ', ji, jj 1370 WRITE(numout,*) ' icedep = ', icedep(ji,jj) 1371 WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff 1372 WRITE(numout,*) ' e3tp = ', e3tp(ji,jj), ' e3wp = ', e3wp(ji,jj) 1373 ENDIF 1374 ENDIF 1375 END DO 1376 END DO 1377 ! END (ISF) 975 1378 976 1379 ! Scale factors and depth at U-, V-, UW and VW-points … … 991 1394 END DO 992 1395 END DO 1396 ! (ISF) define e3uw 1397 DO jk = 2,jpk 1398 DO jj = 1, jpjm1 1399 DO ji = 1, fs_jpim1 ! vector opt. 1400 ! (ISF)** NEEDS CHANGING TO SECOND OPTION FOR ICE SHELF BUT WILL CHANGE RESULTS WITHOUT ICE (DIFFER AT THE 1e-13 LEVEL) 1401 e3uw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji+1,jj ,jk) ) - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji+1,jj ,jk-1) ) 1402 e3vw_0(ji,jj,jk) = MIN( gdept_0(ji,jj,jk), gdept_0(ji ,jj+1,jk) ) - MAX( gdept_0(ji,jj,jk-1), gdept_0(ji ,jj+1,jk-1) ) 1403 END DO 1404 END DO 1405 END DO 1406 !End (ISF) 1407 993 1408 CALL lbc_lnk( e3u_0 , 'U', 1._wp ) ; CALL lbc_lnk( e3uw_0, 'U', 1._wp ) ! lateral boundary conditions 994 1409 CALL lbc_lnk( e3v_0 , 'V', 1._wp ) ; CALL lbc_lnk( e3vw_0, 'V', 1._wp ) … … 1032 1447 1033 1448 ! Compute gdep3w_0 (vertical sum of e3w) 1034 gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 1035 DO jk = 2, jpk 1036 gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk) 1037 END DO 1038 1449 WHERE (micedep == 0) micedep = 1 1450 DO jj = 1,jpj 1451 DO ji = 1,jpi 1452 gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 1453 DO jk = 2, micedep(ji,jj) 1454 gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk) 1455 END DO 1456 IF (micedep(ji,jj) .GE. 2) gdep3w_0(ji,jj,micedep(ji,jj)) = icedep(ji,jj) + 0.5_wp * e3w_0(ji,jj,micedep(ji,jj)) 1457 DO jk = micedep(ji,jj) + 1, jpk 1458 gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk) 1459 END DO 1460 END DO 1461 END DO 1039 1462 ! ! ================= ! 1040 1463 IF(lwp .AND. ll_print) THEN ! Control print ! … … 1066 1489 ! 1067 1490 CALL wrk_dealloc( jpi, jpj, jpk, zprt ) 1491 CALL wrk_dealloc( jpi, jpj, zmask, zbathy ) 1492 CALL wrk_dealloc( jpi, jpj, zmicedep, zmbathy ) 1068 1493 ! 1069 1494 IF( nn_timing == 1 ) CALL timing_stop('zgr_zps') -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90
r4624 r4666 263 263 ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik-1,jp_sal) 264 264 ENDIF 265 ik = mikt(ji,jj) 266 IF( ik > 1 ) THEN 267 zl = ( gdept_0(ji,jj,ik) - gdept_1d(ik) ) / ( gdept_1d(ik+1) - gdept_1d(ik) ) 268 ptsd(ji,jj,ik,jp_tem) = (1.-zl) * ptsd(ji,jj,ik,jp_tem) + zl * ptsd(ji,jj,ik+1,jp_tem) 269 ptsd(ji,jj,ik,jp_sal) = (1.-zl) * ptsd(ji,jj,ik,jp_sal) + zl * ptsd(ji,jj,ik+1,jp_sal) 270 END IF 265 271 END DO 266 272 END DO -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90
r4370 r4666 76 76 ! 77 77 78 IF(lwp) WRITE(numout,*) 78 IF(lwp) WRITE(numout,*) ' ' 79 79 IF(lwp) WRITE(numout,*) 'istate_ini : Initialization of the dynamics and tracers' 80 80 IF(lwp) WRITE(numout,*) '~~~~~~~~~~' … … 110 110 ELSEIF( cp_cfg == 'gyre' ) THEN 111 111 CALL istate_gyre ! GYRE configuration : start from pre-defined T-S fields 112 ELSEIF( cp_cfg == 'isomip' .OR. cp_cfg == 'isomip2') THEN 113 IF(lwp) WRITE(numout,*) 'Initialization of T+S for ISOMIP domain' 114 tsn(:,:,:,jp_tem)=-1.9*tmask(:,:,:) ! ISOMIP configuration : start from constant T+S fields 115 tsn(:,:,:,jp_sal)=34.4*tmask(:,:,:) 116 tsb(:,:,:,:)=tsn(:,:,:,:) 112 117 ELSE ! Initial T-S, U-V fields read in files 113 118 IF ( ln_tsd_init ) THEN ! read 3D T and S data at nit000 … … 129 134 CALL eos( tsb, rhd, rhop, gdept_0(:,:,:) ) ! before potential and in situ densities 130 135 #if ! defined key_c1d 131 IF( ln_zps ) CALL zps_hde( nit000, jpts, tsb, gtsu, gtsv, & ! zps: before hor. gradient 132 & rhd, gru , grv ) ! of t,s,rd at ocean bottom 136 IF( ln_zps ) CALL zps_hde( nit000, jpts, tsb, gtsu, gtsv, & ! Partial steps: before horizontal gradient 137 & rhd, gru , grv, aru, arv, gzu, gzv, ge3ru, ge3rv, & ! 138 & gtui, gtvi, grui, grvi, arui, arvi, gzui, gzvi, ge3rui, ge3rvi ) ! of t, s, rd at the last ocean level 133 139 #endif 134 140 ! -
branches/2014/dev_r4650_UKMO2_ice_shelves/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90
r3625 r4666 50 50 REAL(wp), PUBLIC :: rau0 = 1026._wp !: volumic mass of reference [kg/m3] 51 51 #else 52 REAL(wp), PUBLIC :: rau0 = 10 35._wp!: volumic mass of reference [kg/m3]52 REAL(wp), PUBLIC :: rau0 = 1028.4_wp !: volumic mass of reference [kg/m3] 53 53 #endif 54 54 REAL(wp), PUBLIC :: r1_rau0 !: = 1. / rau0 [m3/kg]
Note: See TracChangeset
for help on using the changeset viewer.