- Timestamp:
- 2018-10-29T15:20:26+01:00 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/dev_r5518_AMM15_package/NEMOGCM/TOOLS/SIREN/src/vgrid.f90
r10248 r10251 70 70 !> @date Spetember, 2014 71 71 !> - add header 72 !> @date June, 2015 - update subroutine with NEMO 3.673 72 !> 74 73 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) … … 119 118 !> 120 119 !> @author G. Madec 121 !> @date Marsh,2008 -F90: Free form and module120 !> - 03,08- G. Madec: F90: Free form and module 122 121 ! 123 122 !> @note Reference : Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766. … … 140 139 !------------------------------------------------------------------- 141 140 SUBROUTINE vgrid_zgr_z( dd_gdepw, dd_gdept, dd_e3w, dd_e3t, & 142 & dd_e3w_1d, dd_e3t_1d, &143 141 & dd_ppkth, dd_ppkth2, dd_ppacr, dd_ppacr2, & 144 142 & dd_ppdzmin, dd_pphmax, dd_pp_to_be_computed, & … … 150 148 REAL(dp), DIMENSION(:), INTENT(INOUT) :: dd_e3w 151 149 REAL(dp), DIMENSION(:), INTENT(INOUT) :: dd_e3t 152 REAL(dp), DIMENSION(:), INTENT(INOUT) :: dd_e3w_1d153 REAL(dp), DIMENSION(:), INTENT(INOUT) :: dd_e3t_1d154 150 155 151 REAL(dp) , INTENT(IN ) :: dd_ppkth … … 230 226 DO jk = 1, il_jpk 231 227 dl_zw = REAL(jk,dp) 232 dl_zt = REAL(jk,dp) + 0.5 _dp228 dl_zt = REAL(jk,dp) + 0.5 233 229 dd_gdepw(jk) = ( dl_zw - 1.0 ) * dl_za1 234 230 dd_gdept(jk) = ( dl_zt - 1.0 ) * dl_za1 … … 241 237 DO jk = 1, il_jpk 242 238 dl_zw = REAL( jk,dp) 243 dl_zt = REAL( jk,dp) + 0.5 _dp239 dl_zt = REAL( jk,dp) + 0.5 244 240 dd_gdepw(jk) = ( dl_zsur + dl_za0 * dl_zw + & 245 241 & dl_za1 * dl_zacr * LOG( COSH( (dl_zw-dl_zkth)/dl_zacr ) ) + & … … 259 255 ENDIF 260 256 261 ! need to be like this to compute the pressure gradient with ISF.262 ! If not, level beneath the ISF are not aligned (sum(e3t) /= depth)263 ! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively264 DO jk = 1, il_jpk-1265 dd_e3t_1d(jk) = dd_gdepw(jk+1)-dd_gdepw(jk)266 END DO267 dd_e3t_1d(il_jpk) = dd_e3t_1d(il_jpk-1) ! we don't care because this level is masked in NEMO268 269 DO jk = 2, il_jpk270 dd_e3w_1d(jk) = dd_gdept(jk) - dd_gdept(jk-1)271 END DO272 dd_e3w_1d(1 ) = 2._dp * (dd_gdept(1) - dd_gdepw(1))273 274 257 ! Control and print 275 258 ! ================== … … 277 260 DO jk = 1, il_jpk 278 261 IF( dd_e3w(jk) <= 0. .OR. dd_e3t(jk) <= 0. )then 279 CALL logger_debug("VGRID ZGR Z: e3w or e3t <=0 ")262 CALL logger_debug("VGRID ZGR Z: e3w or e3t =< 0 ") 280 263 ENDIF 281 282 IF( dd_e3w_1d(jk) <= 0. .OR. dd_e3t_1d(jk) <= 0. )then283 CALL logger_debug("VGRID ZGR Z: e3w_1d or e3t_1d <= 0 ")284 ENDIF285 264 286 265 IF( dd_gdepw(jk) < 0. .OR. dd_gdept(jk) < 0. )then … … 290 269 291 270 END SUBROUTINE vgrid_zgr_z 292 !-------------------------------------------------------------------293 !-------------------------------------------------------------------294 SUBROUTINE vgrid_zgr_bat( dd_bathy, dd_gdepw, dd_hmin, dd_fill )295 IMPLICIT NONE296 ! Argument297 REAL(dp), DIMENSION(:,:), INTENT(INOUT) :: dd_bathy298 REAL(dp), DIMENSION(:) , INTENT(IN ) :: dd_gdepw299 REAL(dp) , INTENT(IN ) :: dd_hmin300 REAL(dp) , INTENT(IN ), OPTIONAL :: dd_fill301 302 ! local303 INTEGER(i4) :: il_jpk304 305 REAL(dp) :: dl_hmin306 REAL(dp) :: dl_fill307 308 ! loop indices309 INTEGER(i4) :: jk310 !----------------------------------------------------------------311 il_jpk = SIZE(dd_gdepw(:))312 313 dl_fill=0._dp314 IF( PRESENT(dd_fill) ) dl_fill=dd_fill315 316 IF( dd_hmin < 0._dp ) THEN317 jk = - INT( dd_hmin ) ! from a nb of level318 ELSE319 jk = MINLOC( dd_gdepw, mask = dd_gdepw > dd_hmin, dim = 1 ) ! from a depth320 ENDIF321 322 dl_hmin = dd_gdepw(jk+1) ! minimum depth = ik+1 w-levels323 WHERE( dd_bathy(:,:) <= 0._wp .OR. dd_bathy(:,:) == dl_fill )324 dd_bathy(:,:) = dl_fill ! min=0 over the lands325 ELSE WHERE326 dd_bathy(:,:) = MAX( dl_hmin , dd_bathy(:,:) ) ! min=dl_hmin over the oceans327 END WHERE328 WRITE(*,*) 'Minimum ocean depth: ', dl_hmin, ' minimum number of ocean levels : ', jk329 330 END SUBROUTINE vgrid_zgr_bat331 271 !------------------------------------------------------------------- 332 272 !> @brief This subroutine set the depth and vertical scale factor in partial step … … 373 313 ! 374 314 !> @author A. Bozec, G. Madec 375 !> @date February, 2009 - F90: Free form and module 376 !> @date February, 2009 377 !> - A. de Miranda : rigid-lid + islands 315 !> - 02-09 (A. Bozec, G. Madec) F90: Free form and module 316 !> - 02-09 (A. de Miranda) rigid-lid + islands 378 317 !> 379 318 !> @note Reference : Pacanowsky & Gnanadesikan 1997, Mon. Wea. Rev., 126, 3248-3270. … … 388 327 !------------------------------------------------------------------- 389 328 SUBROUTINE vgrid_zgr_zps( id_mbathy, dd_bathy, id_jpkmax, & 390 & dd_gdepw, dd_e3t, & 391 & dd_e3zps_min, dd_e3zps_rat, & 392 & dd_fill ) 329 & dd_gdepw, dd_e3t, & 330 & dd_e3zps_min, dd_e3zps_rat ) 393 331 IMPLICIT NONE 394 332 ! Argument … … 398 336 REAL(dp) , DIMENSION(:) , INTENT(IN ) :: dd_gdepw 399 337 REAL(dp) , DIMENSION(:) , INTENT(IN ) :: dd_e3t 400 REAL(dp) , INTENT(IN ) :: dd_e3zps_min 401 REAL(dp) , INTENT(IN ) :: dd_e3zps_rat 402 REAL(dp) , INTENT(IN ), OPTIONAL :: dd_fill 338 REAL(dp) :: dd_e3zps_min 339 REAL(dp) :: dd_e3zps_rat 403 340 404 341 ! local variable 405 342 REAL(dp) :: dl_zmax ! Maximum depth 406 !REAL(dp) :: dl_zmin ! Minimum depth343 REAL(dp) :: dl_zmin ! Minimum depth 407 344 REAL(dp) :: dl_zdepth ! Ajusted ocean depth to avoid too small e3t 408 REAL(dp) :: dl_fill409 345 410 346 INTEGER(i4) :: il_jpk … … 423 359 il_jpjglo=SIZE(id_mbathy(:,:),DIM=2) 424 360 425 dl_fill=0._dp426 IF( PRESENT(dd_fill) ) dl_fill=dd_fill427 428 361 ! Initialization of constant 429 dl_zmax = dd_gdepw(il_jpk) + dd_e3t(il_jpk) ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_1d(jpkm1) ) 430 431 ! bounded value of bathy (min already set at the end of zgr_bat) 432 WHERE( dd_bathy(:,:) /= dl_fill ) 433 dd_bathy(:,:) = MIN( dl_zmax , dd_bathy(:,:) ) 434 END WHERE 362 dl_zmax = dd_gdepw(il_jpk) + dd_e3t(il_jpk) 363 dl_zmin = dd_gdepw(4) 435 364 436 365 ! bathymetry in level (from bathy_meter) … … 443 372 DO jj = 1, il_jpjglo 444 373 DO ji= 1, il_jpiglo 445 IF( dd_bathy(ji,jj) <= 0._dp )THEN 446 id_mbathy(ji,jj) = INT(dd_bathy(ji,jj),i4) 447 ELSEIF( dd_bathy(ji,jj) == dl_fill )THEN 448 id_mbathy(ji,jj) = 0_i4 374 IF( dd_bathy(ji,jj) <= 0. ) id_mbathy(ji,jj) = INT(dd_bathy(ji,jj),i4) 375 END DO 376 END DO 377 378 ! bounded value of bathy 379 ! minimum depth == 3 levels 380 ! maximum depth == gdepw(jpk)+e3t(jpk) 381 ! i.e. the last ocean level thickness cannot exceed e3t(jpkm1)+e3t(jpk) 382 DO jj = 1, il_jpjglo 383 DO ji= 1, il_jpiglo 384 IF( dd_bathy(ji,jj) <= 0. ) THEN 385 dd_bathy(ji,jj) = 0.e0 386 ELSE 387 dd_bathy(ji,jj) = MAX( dd_bathy(ji,jj), dl_zmin ) 388 dd_bathy(ji,jj) = MIN( dd_bathy(ji,jj), dl_zmax ) 449 389 ENDIF 450 390 END DO … … 461 401 DO jj = 1, il_jpjglo 462 402 DO ji = 1, il_jpiglo 463 IF( dd_bathy(ji,jj) /= dl_fill )THEN 464 IF( 0. < dd_bathy(ji,jj) .AND. & 465 & dd_bathy(ji,jj) <= dl_zdepth ) id_mbathy(ji,jj) = jk-1 466 ENDIF 403 IF( 0. < dd_bathy(ji,jj) .AND. dd_bathy(ji,jj) <= dl_zdepth ) id_mbathy(ji,jj) = jk-1 467 404 END DO 468 405 END DO … … 497 434 498 435 !> @author G.Madec 499 !> @date Marsh, 2008 -Original code436 !> - 03-08 Original code 500 437 ! 501 438 !> @param[in] id_mbathy … … 606 543 !> 607 544 !> @author J.Paul 608 !> @date November, 2013- Initial Version545 !> - November, 2013- Initial Version 609 546 ! 610 547 !> @param[in] td_bathy Bathymetry file structure … … 630 567 REAL(dp) , DIMENSION(:) , ALLOCATABLE :: dl_e3w 631 568 REAL(dp) , DIMENSION(:) , ALLOCATABLE :: dl_e3t 632 REAL(dp) , DIMENSION(:) , ALLOCATABLE :: dl_e3w_1d633 REAL(dp) , DIMENSION(:) , ALLOCATABLE :: dl_e3t_1d634 569 635 570 INTEGER(i4) :: il_status … … 775 710 ALLOCATE( dl_gdepw(in_nlevel), dl_gdept(in_nlevel) ) 776 711 ALLOCATE( dl_e3w(in_nlevel), dl_e3t(in_nlevel) ) 777 ALLOCATE( dl_e3w_1d(in_nlevel), dl_e3t_1d(in_nlevel) )778 712 CALL vgrid_zgr_z( dl_gdepw(:), dl_gdept(:), dl_e3w(:), dl_e3t(:), & 779 & dl_e3w_1d, dl_e3t_1d, &780 713 & dn_ppkth, dn_ppkth2, dn_ppacr, dn_ppacr2, & 781 714 & dn_ppdzmin, dn_pphmax, dn_pp_to_be_computed, &
Note: See TracChangeset
for help on using the changeset viewer.