Changes from NEMO/branches/2021/dev_r14393_HPC-03_Mele_Comm_Cleanup/src/OCE at r14776 to NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE at r14787
- Location:
- NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE
- Files:
-
- 77 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ASM/asminc.F90
r14776 r14787 26 26 USE par_oce ! Ocean space and time domain variables 27 27 USE dom_oce ! Ocean space and time domain 28 USE domtile29 28 USE domvvl ! domain: variable volume level 30 29 USE ldfdyn ! lateral diffusion: eddy viscosity coefficients … … 519 518 ! 520 519 INTEGER :: ji, jj, jk 521 INTEGER :: it , itile520 INTEGER :: it 522 521 REAL(wp) :: zincwgt ! IAU weight for current time step 523 522 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: fzptnz ! 3d freezing point values … … 541 540 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 542 541 ! 543 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile542 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 544 543 IF(lwp) THEN 545 544 WRITE(numout,*) … … 578 577 ENDIF 579 578 ! 580 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only on the last tile579 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 581 580 IF ( kt == nitiaufin_r + 1 ) THEN ! For bias crcn to work 582 581 DEALLOCATE( t_bkginc ) … … 595 594 IF (ln_temnofreeze) THEN 596 595 ! Do not apply negative increments if the temperature will fall below freezing 597 WHERE( t_bkginc( A2D(0),:) > 0.0_wp .OR. pts(A2D(0),:,jp_tem,Kmm) + t_bkginc(A2D(0),:) > fzptnz(:,:,:) )598 pts( A2D(0),:,jp_tem,Kmm) = t_bkg(A2D(0),:) + t_bkginc(A2D(0),:)596 WHERE( t_bkginc(:,:,:) > 0.0_wp .OR. pts(:,:,:,jp_tem,Kmm) + t_bkginc(:,:,:) > fzptnz(:,:,:) ) 597 pts(:,:,:,jp_tem,Kmm) = t_bkg(:,:,:) + t_bkginc(:,:,:) 599 598 END WHERE 600 599 ELSE 601 DO_3D( 0, 0, 0, 0, 1, jpk ) 602 pts(ji,jj,jk,jp_tem,Kmm) = t_bkg(ji,jj,jk) + t_bkginc(ji,jj,jk) 603 END_3D 600 pts(:,:,:,jp_tem,Kmm) = t_bkg(:,:,:) + t_bkginc(:,:,:) 604 601 ENDIF 605 602 IF (ln_salfix) THEN 606 603 ! Do not apply negative increments if the salinity will fall below a specified 607 604 ! minimum value salfixmin 608 WHERE( s_bkginc( A2D(0),:) > 0.0_wp .OR. pts(A2D(0),:,jp_sal,Kmm) + s_bkginc(A2D(0),:) > salfixmin )609 pts( A2D(0),:,jp_sal,Kmm) = s_bkg(A2D(0),:) + s_bkginc(A2D(0),:)605 WHERE( s_bkginc(:,:,:) > 0.0_wp .OR. pts(:,:,:,jp_sal,Kmm) + s_bkginc(:,:,:) > salfixmin ) 606 pts(:,:,:,jp_sal,Kmm) = s_bkg(:,:,:) + s_bkginc(:,:,:) 610 607 END WHERE 611 608 ELSE 612 DO_3D( 0, 0, 0, 0, 1, jpk ) 613 pts(ji,jj,jk,jp_sal,Kmm) = s_bkg(ji,jj,jk) + s_bkginc(ji,jj,jk) 614 END_3D 615 ENDIF 616 617 DO_3D( 0, 0, 0, 0, 1, jpk ) 618 pts(ji,jj,jk,:,Kbb) = pts(ji,jj,jk,:,Kmm) ! Update before fields 619 END_3D 609 pts(:,:,:,jp_sal,Kmm) = s_bkg(:,:,:) + s_bkginc(:,:,:) 610 ENDIF 611 612 pts(:,:,:,:,Kbb) = pts(:,:,:,:,Kmm) ! Update before fields 620 613 621 614 CALL eos( pts(:,:,:,:,Kbb), rhd, rhop, gdept_0(:,:,:) ) ! Before potential and in situ densities … … 624 617 !!gm 625 618 626 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from zps_hde*) 627 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only for the full domain 628 itile = ntile 629 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) ! Use full domain 630 631 IF( ln_zps .AND. .NOT. lk_c1d .AND. .NOT. ln_isfcav) & 632 & CALL zps_hde ( kt, Kmm, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv, & ! Partial steps: before horizontal gradient 633 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 634 IF( ln_zps .AND. .NOT. lk_c1d .AND. ln_isfcav) & 635 & CALL zps_hde_isf( nit000, Kmm, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv, gtui, gtvi, & ! Partial steps for top cell (ISF) 636 & rhd, gru , grv , grui, grvi ) ! of t, s, rd at the last ocean level 637 638 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = itile ) ! Revert to tile domain 639 ENDIF 640 641 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 642 DEALLOCATE( t_bkginc ) 643 DEALLOCATE( s_bkginc ) 644 DEALLOCATE( t_bkg ) 645 DEALLOCATE( s_bkg ) 646 ENDIF 647 ! 619 IF( ln_zps .AND. .NOT. lk_c1d .AND. .NOT. ln_isfcav) & 620 & CALL zps_hde ( kt, Kmm, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv, & ! Partial steps: before horizontal gradient 621 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 622 IF( ln_zps .AND. .NOT. lk_c1d .AND. ln_isfcav) & 623 & CALL zps_hde_isf( nit000, Kmm, jpts, pts(:,:,:,:,Kbb), gtsu, gtsv, gtui, gtvi, & ! Partial steps for top cell (ISF) 624 & rhd, gru , grv , grui, grvi ) ! of t, s, rd at the last ocean level 625 626 DEALLOCATE( t_bkginc ) 627 DEALLOCATE( s_bkginc ) 628 DEALLOCATE( t_bkg ) 629 DEALLOCATE( s_bkg ) 648 630 ENDIF 649 631 ! … … 669 651 REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv ! ocean velocities and RHS of momentum equation 670 652 ! 671 INTEGER :: j k653 INTEGER :: ji, jj, jk 672 654 INTEGER :: it 673 655 REAL(wp) :: zincwgt ! IAU weight for current time step … … 683 665 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 684 666 ! 685 IF(lwp) THEN 686 WRITE(numout,*) 687 WRITE(numout,*) 'dyn_asm_inc : Dynamics IAU at time step = ', kt,' with IAU weight = ', wgtiau(it) 688 WRITE(numout,*) '~~~~~~~~~~~~' 667 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 668 IF(lwp) THEN 669 WRITE(numout,*) 670 WRITE(numout,*) 'dyn_asm_inc : Dynamics IAU at time step = ', kt,' with IAU weight = ', wgtiau(it) 671 WRITE(numout,*) '~~~~~~~~~~~~' 672 ENDIF 689 673 ENDIF 690 674 ! 691 675 ! Update the dynamic tendencies 692 DO jk = 1, jpkm1 693 puu(:,:,jk,Krhs) = puu(:,:,jk,Krhs) + u_bkginc(:,:,jk) * zincwgt 694 pvv(:,:,jk,Krhs) = pvv(:,:,jk,Krhs) + v_bkginc(:,:,jk) * zincwgt 695 END DO 696 ! 697 IF ( kt == nitiaufin_r ) THEN 698 DEALLOCATE( u_bkginc ) 699 DEALLOCATE( v_bkginc ) 676 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 677 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + u_bkginc(ji,jj,jk) * zincwgt 678 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + v_bkginc(ji,jj,jk) * zincwgt 679 END_3D 680 ! 681 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 682 IF ( kt == nitiaufin_r ) THEN 683 DEALLOCATE( u_bkginc ) 684 DEALLOCATE( v_bkginc ) 685 ENDIF 700 686 ENDIF 701 687 ! … … 741 727 ! 742 728 INTEGER :: it 743 INTEGER :: j k729 INTEGER :: ji, jj, jk 744 730 REAL(wp) :: zincwgt ! IAU weight for current time step 745 731 !!---------------------------------------------------------------------- … … 754 740 zincwgt = wgtiau(it) / rn_Dt ! IAU weight for the current time step 755 741 ! 756 IF(lwp) THEN 757 WRITE(numout,*) 758 WRITE(numout,*) 'ssh_asm_inc : SSH IAU at time step = ', & 759 & kt,' with IAU weight = ', wgtiau(it) 760 WRITE(numout,*) '~~~~~~~~~~~~' 742 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 743 IF(lwp) THEN 744 WRITE(numout,*) 745 WRITE(numout,*) 'ssh_asm_inc : SSH IAU at time step = ', & 746 & kt,' with IAU weight = ', wgtiau(it) 747 WRITE(numout,*) '~~~~~~~~~~~~' 748 ENDIF 761 749 ENDIF 762 750 ! … … 764 752 ! (applied in dynspg.*) 765 753 #if defined key_asminc 766 ssh_iau(:,:) = ssh_bkginc(:,:) * zincwgt 754 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 755 ssh_iau(ji,jj) = ssh_bkginc(ji,jj) * zincwgt 756 END_2D 767 757 #endif 768 758 ! … … 770 760 ! 771 761 ! test on ssh_bkginc needed as ssh_asm_inc is called twice by time step 772 IF (ALLOCATED(ssh_bkginc)) DEALLOCATE( ssh_bkginc ) 762 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 763 IF (ALLOCATED(ssh_bkginc)) DEALLOCATE( ssh_bkginc ) 764 ENDIF 773 765 ! 774 766 #if defined key_asminc 775 ssh_iau(:,:) = 0._wp 767 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 768 ssh_iau(ji,jj) = 0._wp 769 END_2D 776 770 #endif 777 771 ! … … 820 814 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phdivn ! horizontal divergence 821 815 !! 822 INTEGER :: j k! dummy loop index816 INTEGER :: ji, jj, jk ! dummy loop index 823 817 REAL(wp), DIMENSION(:,:) , POINTER :: ztim ! local array 824 818 !!---------------------------------------------------------------------- … … 828 822 ! 829 823 IF( ln_linssh ) THEN 830 phdivn(:,:,1) = phdivn(:,:,1) - ssh_iau(:,:) / e3t(:,:,1,Kmm) * tmask(:,:,1) 824 DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) 825 phdivn(ji,jj,1) = phdivn(ji,jj,1) - ssh_iau(ji,jj) / e3t(ji,jj,1,Kmm) * tmask(ji,jj,1) 826 END_2D 831 827 ELSE 832 ALLOCATE( ztim(jpi,jpj) ) 833 ztim(:,:) = ssh_iau(:,:) / ( ht(:,:) + 1.0 - ssmask(:,:) ) 834 DO jk = 1, jpkm1 835 phdivn(:,:,jk) = phdivn(:,:,jk) - ztim(:,:) * tmask(:,:,jk) 836 END DO 828 ALLOCATE( ztim(A2D(nn_hls)) ) 829 DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) 830 ztim(ji,jj) = ssh_iau(ji,jj) / ( ht(ji,jj) + 1.0 - ssmask(ji,jj) ) 831 DO jk = 1, jpkm1 832 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ztim(ji,jj) * tmask(ji,jj,jk) 833 END DO 834 END_2D 837 835 ! 838 836 DEALLOCATE(ztim) … … 876 874 ! note this is not a tendency so should not be divided by rn_Dt (as with the tracer and other increments) 877 875 ! 878 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile876 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 879 877 IF(lwp) THEN 880 878 WRITE(numout,*) … … 920 918 #endif 921 919 ! 922 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only on the last tile920 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 923 921 IF ( kt == nitiaufin_r ) THEN 924 922 DEALLOCATE( seaice_bkginc ) … … 979 977 END_2D 980 978 #endif 981 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only on the last tile979 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 982 980 IF ( .NOT. PRESENT(kindic) ) THEN 983 981 DEALLOCATE( seaice_bkginc ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/BDY/bdydyn3d.F90
r14776 r14787 349 349 REAL(wp) :: zwgt ! boundary weight 350 350 !!---------------------------------------------------------------------- 351 IF( l_istiled .AND. ntile /= 1 ) RETURN ! Do only for the full domain 351 352 ! 352 353 IF( ln_timing ) CALL timing_start('bdy_dyn3d_dmp') -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/BDY/bdytra.F90
r14776 r14787 158 158 INTEGER :: ib_bdy ! Loop index 159 159 !!---------------------------------------------------------------------- 160 IF( ntile /= 0.AND. ntile /= 1 ) RETURN ! Do only for the full domain160 IF( l_istiled .AND. ntile /= 1 ) RETURN ! Do only for the full domain 161 161 ! 162 162 IF( ln_timing ) CALL timing_start('bdy_tra_dmp') -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DIA/diaar5.F90
r14776 r14787 34 34 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,: ) :: thick0 ! ocean thickness (interior domain) 35 35 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: sn0 ! initial salinity 36 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: hstr_adv, hstr_ldf37 36 38 37 LOGICAL :: l_ar5 … … 55 54 !!---------------------------------------------------------------------- 56 55 ! 57 ALLOCATE( thick0(jpi,jpj) , sn0(jpi,jpj,jpk) , & 58 & hstr_adv(jpi,jpj,jpts,2), hstr_ldf(jpi,jpj,jpts,2), STAT=dia_ar5_alloc ) 56 ALLOCATE( thick0(jpi,jpj) , sn0(jpi,jpj,jpk), STAT=dia_ar5_alloc ) 59 57 ! 60 58 CALL mpp_sum ( 'diaar5', dia_ar5_alloc ) … … 306 304 END SUBROUTINE dia_ar5 307 305 308 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support, will not output haloes) 306 309 307 SUBROUTINE dia_ar5_hst( ktra, cptr, puflx, pvflx ) 310 308 !!---------------------------------------------------------------------- … … 320 318 ! 321 319 INTEGER :: ji, jj, jk 322 323 IF( cptr /= 'adv' .AND. cptr /= 'ldf' ) RETURN 324 IF( ktra /= jp_tem .AND. ktra /= jp_sal ) RETURN 320 REAL(wp), DIMENSION(A2D(nn_hls)) :: z2d 321 322 z2d(:,:) = puflx(:,:,1) 323 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 324 z2d(ji,jj) = z2d(ji,jj) + puflx(ji,jj,jk) 325 END_3D 325 326 326 327 IF( cptr == 'adv' ) THEN 327 DO_2D( 0, 0, 0, 0 ) 328 hstr_adv(ji,jj,ktra,1) = puflx(ji,jj,1) 329 hstr_adv(ji,jj,ktra,2) = pvflx(ji,jj,1) 330 END_2D 331 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 332 hstr_adv(ji,jj,ktra,1) = hstr_adv(ji,jj,ktra,1) + puflx(ji,jj,jk) 333 hstr_adv(ji,jj,ktra,2) = hstr_adv(ji,jj,ktra,2) + pvflx(ji,jj,jk) 334 END_3D 328 IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * z2d(:,:) ) ! advective heat transport in i-direction 329 IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0 * z2d(:,:) ) ! advective salt transport in i-direction 335 330 ELSE IF( cptr == 'ldf' ) THEN 336 DO_2D( 0, 0, 0, 0 ) 337 hstr_ldf(ji,jj,ktra,1) = puflx(ji,jj,1) 338 hstr_ldf(ji,jj,ktra,2) = pvflx(ji,jj,1) 339 END_2D 340 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 341 hstr_ldf(ji,jj,ktra,1) = hstr_ldf(ji,jj,ktra,1) + puflx(ji,jj,jk) 342 hstr_ldf(ji,jj,ktra,2) = hstr_ldf(ji,jj,ktra,2) + pvflx(ji,jj,jk) 343 END_3D 344 ENDIF 345 346 IF( ntile == 0 .OR. ntile == nijtile ) THEN 347 IF( cptr == 'adv' ) THEN 348 IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * hstr_adv(:,:,ktra,1) ) ! advective heat transport in i-direction 349 IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0 * hstr_adv(:,:,ktra,1) ) ! advective salt transport in i-direction 350 IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * hstr_adv(:,:,ktra,2) ) ! advective heat transport in j-direction 351 IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0 * hstr_adv(:,:,ktra,2) ) ! advective salt transport in j-direction 352 ENDIF 353 IF( cptr == 'ldf' ) THEN 354 IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * hstr_ldf(:,:,ktra,1) ) ! diffusive heat transport in i-direction 355 IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0 * hstr_ldf(:,:,ktra,1) ) ! diffusive salt transport in i-direction 356 IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * hstr_ldf(:,:,ktra,2) ) ! diffusive heat transport in j-direction 357 IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0 * hstr_ldf(:,:,ktra,2) ) ! diffusive salt transport in j-direction 358 ENDIF 331 IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in i-direction 332 IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0 * z2d(:,:) ) ! diffusive salt transport in i-direction 333 ENDIF 334 ! 335 z2d(:,:) = pvflx(:,:,1) 336 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 337 z2d(ji,jj) = z2d(ji,jj) + pvflx(ji,jj,jk) 338 END_3D 339 340 IF( cptr == 'adv' ) THEN 341 IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * z2d(:,:) ) ! advective heat transport in j-direction 342 IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0 * z2d(:,:) ) ! advective salt transport in j-direction 343 ELSE IF( cptr == 'ldf' ) THEN 344 IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in j-direction 345 IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0 * z2d(:,:) ) ! diffusive salt transport in j-direction 359 346 ENDIF 360 347 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DIA/diaptr.F90
r14776 r14787 71 71 CONTAINS 72 72 73 ! NOTE: [tiling] tiling sometimes changes the diagnostics very slightly, usually where there are few zonal points e.g. the northern Indian Ocean basin. The difference is usually very small, for one point in one diagnostic. Presumably this is because of the additional zonal integration step over tiles. 73 74 SUBROUTINE dia_ptr( kt, Kmm, pvtr ) 74 75 !!---------------------------------------------------------------------- … … 93 94 94 95 ! Calculate diagnostics only when zonal integrals have finished 95 IF( ntile == 0.OR. ntile == nijtile ) CALL dia_ptr_iom(kt, Kmm, pvtr)96 IF( .NOT. l_istiled .OR. ntile == nijtile ) CALL dia_ptr_iom(kt, Kmm, pvtr) 96 97 ENDIF 97 98 … … 317 318 ! 318 319 IF( iom_use( 'uocetr_vsum_cumul' ) ) THEN 319 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) ! Use full domain320 320 CALL iom_get_var( 'uocetr_vsum_op', z2d ) ! get uocetr_vsum_op from xml 321 321 z2d(:,:) = ptr_ci_2d( z2d(:,:) ) 322 322 CALL iom_put( 'uocetr_vsum_cumul', z2d ) 323 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = nijtile ) ! Revert to tile domain324 323 ENDIF 325 324 ! … … 589 588 590 589 #if ! defined key_mpi_off 591 IF( ntile == 0.OR. ntile == nijtile ) THEN590 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 592 591 ish1d(1) = jpj*nbasin 593 592 ish2d(1) = jpj ; ish2d(2) = nbasin … … 627 626 628 627 #if ! defined key_mpi_off 629 IF( ntile == 0.OR. ntile == nijtile ) THEN628 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 630 629 ish1d(1) = jpj*jpk*nbasin 631 630 ish3d(1) = jpj ; ish3d(2) = jpk ; ish3d(3) = nbasin -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/dom_oce.F90
r14776 r14787 73 73 INTEGER :: nn_ltile_i, nn_ltile_j 74 74 75 ! Domain tiling (all tiles)75 ! Domain tiling 76 76 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ntsi_a !: start of internal part of tile domain 77 77 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ntsj_a ! 78 78 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ntei_a !: end of internal part of tile domain 79 79 INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) :: ntej_a ! 80 LOGICAL, PUBLIC :: l_istiled ! whether tiling is currently active or not 80 81 81 82 ! !: domain MPP decomposition parameters -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domain.F90
r14776 r14787 125 125 ! !== Reference coordinate system ==! 126 126 ! 127 CALL dom_glo 128 CALL dom_nam 129 CALL dom_tile ( ntsi, ntsj, ntei, ntej )! Tile domain127 CALL dom_glo ! global domain versus local domain 128 CALL dom_nam ! read namelist ( namrun, namdom ) 129 CALL dom_tile_init ! Tile domain 130 130 131 131 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domqco.F90
r14776 r14787 96 96 #endif 97 97 ! 98 IF(nn_hls==2.AND..NOT.lk_linssh) CALL lbc_lnk( 'stp_MLF', r3u(:,:,Kbb), 'U', 1.0_wp, r3v(:,:,Kbb), 'V', 1.0_wp, r3t(:,:,Kbb), 'T', 1.0_wp, &99 & r3u(:,:,Kmm), 'U', 1.0_wp, r3v(:,:,Kmm), 'V', 1.0_wp, r3t(:,:,Kmm), 'T', 1.0_wp, r3f(:,:), 'F', 1.0_wp )100 98 END SUBROUTINE dom_qco_init 101 99 … … 125 123 CALL dom_qco_r3c( ssh(:,:,Kmm), r3t(:,:,Kmm), r3u(:,:,Kmm), r3v(:,:,Kmm), r3f(:,:) ) 126 124 #endif 125 ! dom_qco_r3c defines over [nn_hls, nn_hls-1, nn_hls, nn_hls-1] 126 IF( nn_hls == 2 ) CALL lbc_lnk( 'dom_qco_zgr', r3u(:,:,Kbb), 'U', 1._wp, r3v(:,:,Kbb), 'V', 1._wp, & 127 & r3u(:,:,Kmm), 'U', 1._wp, r3v(:,:,Kmm), 'V', 1._wp ) 127 128 ! 128 129 END SUBROUTINE dom_qco_zgr … … 148 149 ! 149 150 ! 150 pr3t(:,:) = pssh(:,:) * r1_ht_0(:,:) !== ratio at t-point ==! 151 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 152 pr3t(ji,jj) = pssh(ji,jj) * r1_ht_0(ji,jj) !== ratio at t-point ==! 153 END_2D 151 154 ! 152 155 ! … … 156 159 #if ! defined key_qcoTest_FluxForm 157 160 ! ! no 'key_qcoTest_FluxForm' : surface weighted ssh average 158 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )159 160 161 162 163 161 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 162 pr3u(ji,jj) = 0.5_wp * ( e1e2t(ji ,jj) * pssh(ji ,jj) & 163 & + e1e2t(ji+1,jj) * pssh(ji+1,jj) ) * r1_hu_0(ji,jj) * r1_e1e2u(ji,jj) 164 pr3v(ji,jj) = 0.5_wp * ( e1e2t(ji,jj ) * pssh(ji,jj ) & 165 & + e1e2t(ji,jj+1) * pssh(ji,jj+1) ) * r1_hv_0(ji,jj) * r1_e1e2v(ji,jj) 166 END_2D 164 167 !!st ELSE !- Flux Form (simple averaging) 165 168 #else 166 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )167 168 169 169 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 170 pr3u(ji,jj) = 0.5_wp * ( pssh(ji,jj) + pssh(ji+1,jj ) ) * r1_hu_0(ji,jj) 171 pr3v(ji,jj) = 0.5_wp * ( pssh(ji,jj) + pssh(ji ,jj+1) ) * r1_hv_0(ji,jj) 172 END_2D 170 173 !!st ENDIF 171 174 #endif … … 181 184 ! ! no 'key_qcoTest_FluxForm' : surface weighted ssh average 182 185 183 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! start from 1 since lbc_lnk('F') doesn't update the 1st row/line184 185 186 187 188 189 190 191 192 193 186 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! start from 1 since lbc_lnk('F') doesn't update the 1st row/line 187 ! round brackets added to fix the order of floating point operations 188 ! needed to ensure halo 1 - halo 2 compatibility 189 pr3f(ji,jj) = 0.25_wp * ( ( e1e2t(ji ,jj ) * pssh(ji ,jj ) & 190 & + e1e2t(ji+1,jj ) * pssh(ji+1,jj ) & 191 & ) & ! bracket for halo 1 - halo 2 compatibility 192 & + ( e1e2t(ji ,jj+1) * pssh(ji ,jj+1) & 193 & + e1e2t(ji+1,jj+1) * pssh(ji+1,jj+1) & 194 & ) & ! bracket for halo 1 - halo 2 compatibility 195 & ) * r1_hf_0(ji,jj) * r1_e1e2f(ji,jj) 196 END_2D 194 197 !!st ELSE !- Flux Form (simple averaging) 195 198 #else 196 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )197 198 199 200 & + ( pssh(ji,jj+1) + pssh(ji+1,jj+1) &201 202 203 199 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 200 ! round brackets added to fix the order of floating point operations 201 ! needed to ensure halo 1 - halo 2 compatibility 202 pr3f(ji,jj) = 0.25_wp * ( ( pssh(ji,jj ) + pssh(ji+1,jj ) ) & 203 & + ( pssh(ji,jj+1) + pssh(ji+1,jj+1) & 204 & ) & ! bracket for halo 1 - halo 2 compatibility 205 & ) * r1_hf_0(ji,jj) 206 END_2D 204 207 !!st ENDIF 205 208 #endif -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domtile.F90
r14776 r14787 13 13 ! 14 14 USE prtctl ! Print control (prt_ctl_info routine) 15 USE lib_mpp , ONLY : ctl_stop, ctl_warn 15 16 USE in_out_manager ! I/O manager 16 17 … … 18 19 PRIVATE 19 20 20 PUBLIC dom_tile ! called by step.F90 21 PUBLIC dom_tile ! called by step.F90 22 PUBLIC dom_tile_start ! called by various 23 PUBLIC dom_tile_stop ! " " 24 PUBLIC dom_tile_init ! called by domain.F90 25 26 LOGICAL, ALLOCATABLE, DIMENSION(:) :: l_tilefin ! whether a tile is finished or not 21 27 22 28 !!---------------------------------------------------------------------- … … 27 33 CONTAINS 28 34 29 SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile ) 35 SUBROUTINE dom_tile_init 36 !!---------------------------------------------------------------------- 37 !! *** ROUTINE dom_tile_init *** 38 !! 39 !! ** Purpose : Initialise tile domain variables 40 !! 41 !! ** Action : - ntsi, ntsj : start of internal part of domain 42 !! - ntei, ntej : end of internal part of domain 43 !! - ntile : current tile number 44 !! - nijtile : total number of tiles 45 !! - nthl, nthr : modifier on DO loop macro bound offset (left, right) 46 !! - nthb, ntht : " " (bottom, top) 47 !! - l_istiled : whether tiling is currently active or not 48 !! - l_tilefin : whether a tile is finished or not 49 !!---------------------------------------------------------------------- 50 INTEGER :: jt ! dummy loop argument 51 INTEGER :: iitile, ijtile ! Local integers 52 !!---------------------------------------------------------------------- 53 IF( ln_tile .AND. nn_hls /= 2 ) CALL ctl_stop('dom_tile_init: Tiling is only supported for nn_hls = 2') 54 55 ntile = 0 ! Initialise to full domain 56 nijtile = 1 57 ntsi = Nis0 58 ntsj = Njs0 59 ntei = Nie0 60 ntej = Nje0 61 nthl = 0 62 nthr = 0 63 nthb = 0 64 ntht = 0 65 l_istiled = .FALSE. 66 67 IF( ln_tile ) THEN ! Calculate tile domain indices 68 iitile = Ni_0 / nn_ltile_i ! Number of tiles 69 ijtile = Nj_0 / nn_ltile_j 70 IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 71 IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1 72 73 nijtile = iitile * ijtile 74 ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile), l_tilefin(nijtile) ) 75 76 l_tilefin(:) = .FALSE. 77 78 ntsi_a(0) = Nis0 ! Full domain 79 ntsj_a(0) = Njs0 80 ntei_a(0) = Nie0 81 ntej_a(0) = Nje0 82 83 DO jt = 1, nijtile ! Tile domains 84 ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile) 85 ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile) 86 ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0) 87 ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0) 88 ENDDO 89 ENDIF 90 91 IF(lwp) THEN ! control print 92 WRITE(numout,*) 93 WRITE(numout,*) 'dom_tile : Domain tiling decomposition' 94 WRITE(numout,*) '~~~~~~~~' 95 IF( ln_tile ) THEN 96 WRITE(numout,*) iitile, 'tiles in i' 97 WRITE(numout,*) ' Starting indices' 98 WRITE(numout,*) ' ', (ntsi_a(jt), jt=1, iitile) 99 WRITE(numout,*) ' Ending indices' 100 WRITE(numout,*) ' ', (ntei_a(jt), jt=1, iitile) 101 WRITE(numout,*) ijtile, 'tiles in j' 102 WRITE(numout,*) ' Starting indices' 103 WRITE(numout,*) ' ', (ntsj_a(jt), jt=1, nijtile, iitile) 104 WRITE(numout,*) ' Ending indices' 105 WRITE(numout,*) ' ', (ntej_a(jt), jt=1, nijtile, iitile) 106 ELSE 107 WRITE(numout,*) 'No domain tiling' 108 WRITE(numout,*) ' i indices =', ntsi, ':', ntei 109 WRITE(numout,*) ' j indices =', ntsj, ':', ntej 110 ENDIF 111 ENDIF 112 END SUBROUTINE dom_tile_init 113 114 115 SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile, ldhold, cstr ) 30 116 !!---------------------------------------------------------------------- 31 117 !! *** ROUTINE dom_tile *** 32 118 !! 33 !! ** Purpose : Set t ile domain variables119 !! ** Purpose : Set the current tile and its domain indices 34 120 !! 35 121 !! ** Action : - ktsi, ktsj : start of internal part of domain 36 122 !! - ktei, ktej : end of internal part of domain 37 !! - ntile : current tile number 38 !! - nijtile : total number of tiles 123 !! - nthl, nthr : modifier on DO loop macro bound offset (left, right) 124 !! - nthb, ntht : " " (bottom, top) 125 !! - ktile : set the current tile number (ntile) 39 126 !!---------------------------------------------------------------------- 40 127 INTEGER, INTENT(out) :: ktsi, ktsj, ktei, ktej ! Tile domain indices 41 INTEGER, INTENT(in), OPTIONAL :: ktile ! Tile number 42 INTEGER :: jt ! dummy loop argument 43 INTEGER :: iitile, ijtile ! Local integers 44 CHARACTER (len=11) :: charout 45 !!---------------------------------------------------------------------- 46 IF( PRESENT(ktile) .AND. ln_tile ) THEN 47 ntile = ktile ! Set domain indices for tile 48 ktsi = ntsi_a(ktile) 49 ktsj = ntsj_a(ktile) 50 ktei = ntei_a(ktile) 51 ktej = ntej_a(ktile) 52 128 INTEGER, INTENT(in) :: ktile ! Tile number 129 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Pause/resume (.true.) or set (.false.) current tile 130 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 131 CHARACTER(len=23) :: clstr 132 LOGICAL :: llhold 133 CHARACTER(len=11) :: charout 134 INTEGER :: iitile 135 !!---------------------------------------------------------------------- 136 llhold = .FALSE. 137 IF( PRESENT(ldhold) ) llhold = ldhold 138 clstr = '' 139 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 140 141 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot use dom_tile with ln_tile = .false.') 142 IF( .NOT. llhold ) THEN 143 IF( .NOT. l_istiled ) THEN 144 CALL ctl_warn('Cannot call dom_tile when tiling is inactive'//clstr) 145 RETURN 146 ENDIF 147 148 IF( ntile /= 0 ) l_tilefin(ntile) = .TRUE. ! If setting a new tile, the current tile is complete 149 150 ntile = ktile ! Set the new tile 53 151 IF(sn_cfctl%l_prtctl) THEN 54 WRITE(charout, FMT="('ntile =', I4)") ktile152 WRITE(charout, FMT="('ntile =', I4)") ntile 55 153 CALL prt_ctl_info( charout ) 56 154 ENDIF 57 ELSE 58 ntile = 0 ! Initialise to full domain 59 nijtile = 1 60 ktsi = Nis0 61 ktsj = Njs0 62 ktei = Nie0 63 ktej = Nje0 64 65 IF( ln_tile ) THEN ! Calculate tile domain indices 66 iitile = Ni_0 / nn_ltile_i ! Number of tiles 67 ijtile = Nj_0 / nn_ltile_j 68 IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 69 IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1 70 71 nijtile = iitile * ijtile 72 ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile) ) 73 74 ntsi_a(0) = ktsi ! Full domain 75 ntsj_a(0) = ktsj 76 ntei_a(0) = ktei 77 ntej_a(0) = ktej 78 79 DO jt = 1, nijtile ! Tile domains 80 ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile) 81 ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile) 82 ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0) 83 ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0) 84 ENDDO 85 ENDIF 86 87 IF(lwp) THEN ! control print 88 WRITE(numout,*) 89 WRITE(numout,*) 'dom_tile : Domain tiling decomposition' 90 WRITE(numout,*) '~~~~~~~~' 91 IF( ln_tile ) THEN 92 WRITE(numout,*) iitile, 'tiles in i' 93 WRITE(numout,*) ' Starting indices' 94 WRITE(numout,*) ' ', (ntsi_a(jt), jt=1, iitile) 95 WRITE(numout,*) ' Ending indices' 96 WRITE(numout,*) ' ', (ntei_a(jt), jt=1, iitile) 97 WRITE(numout,*) ijtile, 'tiles in j' 98 WRITE(numout,*) ' Starting indices' 99 WRITE(numout,*) ' ', (ntsj_a(jt), jt=1, nijtile, iitile) 100 WRITE(numout,*) ' Ending indices' 101 WRITE(numout,*) ' ', (ntej_a(jt), jt=1, nijtile, iitile) 102 ELSE 103 WRITE(numout,*) 'No domain tiling' 104 WRITE(numout,*) ' i indices =', ktsi, ':', ktei 105 WRITE(numout,*) ' j indices =', ktsj, ':', ktej 106 ENDIF 107 ENDIF 108 ENDIF 155 ENDIF 156 157 ktsi = ntsi_a(ktile) ! Set the domain indices 158 ktsj = ntsj_a(ktile) 159 ktei = ntei_a(ktile) 160 ktej = ntej_a(ktile) 161 162 ! Calculate the modifying factor on DO loop bounds (1 = do not work on points that have already been processed by a neighbouring tile) 163 nthl = 0 ; nthr = 0 ; nthb = 0 ; ntht = 0 164 iitile = Ni_0 / nn_ltile_i 165 IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 166 IF( ktsi > Nis0 ) THEN ; IF( l_tilefin(ktile - 1 ) ) nthl = 1 ; ENDIF ! Left adjacent tile 167 IF( ktei < Nie0 ) THEN ; IF( l_tilefin(ktile + 1 ) ) nthr = 1 ; ENDIF ! Right " " 168 IF( ktsj > Njs0 ) THEN ; IF( l_tilefin(ktile - iitile) ) nthb = 1 ; ENDIF ! Bottom " " 169 IF( ktej < Nje0 ) THEN ; IF( l_tilefin(ktile + iitile) ) ntht = 1 ; ENDIF ! Top " " 109 170 END SUBROUTINE dom_tile 110 171 172 173 SUBROUTINE dom_tile_start( ldhold, cstr ) 174 !!---------------------------------------------------------------------- 175 !! *** ROUTINE dom_tile_start *** 176 !! 177 !! ** Purpose : Start or resume the use of tiling 178 !! 179 !! ** Method : dom_tile_start & dom_tile_stop are used to declare a tiled region of code. 180 !! 181 !! Tiling is active/inactive (l_istiled = .true./.false.) within/outside of this code region. 182 !! After enabling tiling, no tile will initially be set (the full domain will be used) and dom_tile must 183 !! be called to set a specific tile to work on. Furthermore, all tiles will be marked as incomplete 184 !! (ln_tilefin(:) = .false.). 185 !! 186 !! Tiling can be paused/resumed within the tiled code region by calling dom_tile_stop/dom_tile_start 187 !! with ldhold = .true.. This can be used to temporarily revert back to using the full domain. 188 !! 189 !! CALL dom_tile_start ! Enable tiling 190 !! CALL dom_tile(ntsi, ntei, ntsj, ntej, ktile=n) ! Set current tile "n" 191 !! ... 192 !! CALL dom_tile_stop(.TRUE.) ! Pause tiling (temporarily disable) 193 !! ... 194 !! CALL dom_tile_start(.TRUE.) ! Resume tiling 195 !! CALL dom_tile_stop ! Disable tiling 196 !!---------------------------------------------------------------------- 197 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Resume (.true.) or start (.false.) 198 LOGICAL :: llhold 199 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 200 CHARACTER(len=23) :: clstr 201 !!---------------------------------------------------------------------- 202 llhold = .FALSE. 203 IF( PRESENT(ldhold) ) llhold = ldhold 204 clstr = '' 205 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 206 207 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot resume/start tiling as ln_tile = .false.') 208 IF( l_istiled ) THEN 209 CALL ctl_warn('Cannot resume/start tiling as it is already active'//clstr) 210 RETURN 211 ! TODO: [tiling] this warning will always be raised outside a tiling loop (cannot check for pause rather than stop) 212 ELSE IF( llhold .AND. ntile == 0 ) THEN 213 CALL ctl_warn('Cannot resume tiling as it is not paused'//clstr) 214 RETURN 215 ENDIF 216 217 ! Whether resumed or started, the tiling is made active. If resumed, the domain indices for the current tile are used. 218 IF( llhold ) CALL dom_tile(ntsi, ntsj, ntei, ntej, ktile=ntile, ldhold=.TRUE., cstr='dom_tile_start'//clstr) 219 l_istiled = .TRUE. 220 END SUBROUTINE dom_tile_start 221 222 223 SUBROUTINE dom_tile_stop( ldhold, cstr ) 224 !!---------------------------------------------------------------------- 225 !! *** ROUTINE dom_tile_stop *** 226 !! 227 !! ** Purpose : End or pause the use of tiling 228 !! 229 !! ** Method : See dom_tile_start 230 !!---------------------------------------------------------------------- 231 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Pause (.true.) or stop (.false.) 232 LOGICAL :: llhold 233 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 234 CHARACTER(len=23) :: clstr 235 !!---------------------------------------------------------------------- 236 llhold = .FALSE. 237 IF( PRESENT(ldhold) ) llhold = ldhold 238 clstr = '' 239 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 240 241 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot pause/stop tiling as ln_tile = .false.') 242 IF( .NOT. l_istiled ) THEN 243 CALL ctl_warn('Cannot pause/stop tiling as it is inactive'//clstr) 244 RETURN 245 ENDIF 246 247 ! Whether paused or stopped, the tiling is made inactive and the full domain indices are used. 248 ! If stopped, there is no active tile (ntile = 0) and the finished tile indicators are reset 249 CALL dom_tile(ntsi, ntsj, ntei, ntej, ktile=0, ldhold=llhold, cstr='dom_tile_stop'//clstr) 250 IF( .NOT. llhold ) l_tilefin(:) = .FALSE. 251 l_istiled = .FALSE. 252 END SUBROUTINE dom_tile_stop 111 253 !!====================================================================== 112 254 END MODULE domtile -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domutl.F90
r14776 r14787 22 22 23 23 INTERFACE is_tile 24 MODULE PROCEDURE is_tile_2d , is_tile_3d, is_tile_4d24 MODULE PROCEDURE is_tile_2d_sp, is_tile_3d_sp, is_tile_4d_sp, is_tile_2d_dp, is_tile_3d_dp, is_tile_4d_dp 25 25 END INTERFACE is_tile 26 26 … … 116 116 117 117 118 FUNCTION is_tile_2d( pt ) 119 !! 120 REAL(wp), DIMENSION(:,:), INTENT(in) :: pt 121 INTEGER :: is_tile_2d 122 !! 123 IF( ln_tile .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 124 is_tile_2d = 1 118 INTEGER FUNCTION is_tile_2d_sp( pt ) 119 REAL(sp), DIMENSION(:,:), INTENT(in) :: pt 120 121 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 122 is_tile_2d_sp = 1 125 123 ELSE 126 is_tile_2d = 0124 is_tile_2d_sp = 0 127 125 ENDIF 128 END FUNCTION is_tile_2d 126 END FUNCTION is_tile_2d_sp 129 127 130 128 131 FUNCTION is_tile_3d( pt ) 132 !! 133 REAL(wp), DIMENSION(:,:,:), INTENT(in) :: pt 134 INTEGER :: is_tile_3d 135 !! 136 IF( ln_tile .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 137 is_tile_3d = 1 129 INTEGER FUNCTION is_tile_2d_dp( pt ) 130 REAL(dp), DIMENSION(:,:), INTENT(in) :: pt 131 132 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 133 is_tile_2d_dp = 1 138 134 ELSE 139 is_tile_ 3d= 0135 is_tile_2d_dp = 0 140 136 ENDIF 141 END FUNCTION is_tile_ 3d137 END FUNCTION is_tile_2d_dp 142 138 143 139 144 FUNCTION is_tile_4d( pt ) 145 !! 146 REAL(wp), DIMENSION(:,:,:,:), INTENT(in) :: pt 147 INTEGER :: is_tile_4d 148 !! 149 IF( ln_tile .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 150 is_tile_4d = 1 140 INTEGER FUNCTION is_tile_3d_sp( pt ) 141 REAL(sp), DIMENSION(:,:,:), INTENT(in) :: pt 142 143 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 144 is_tile_3d_sp = 1 151 145 ELSE 152 is_tile_ 4d= 0146 is_tile_3d_sp = 0 153 147 ENDIF 154 END FUNCTION is_tile_ 4d148 END FUNCTION is_tile_3d_sp 155 149 150 151 INTEGER FUNCTION is_tile_3d_dp( pt ) 152 REAL(dp), DIMENSION(:,:,:), INTENT(in) :: pt 153 154 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 155 is_tile_3d_dp = 1 156 ELSE 157 is_tile_3d_dp = 0 158 ENDIF 159 END FUNCTION is_tile_3d_dp 160 161 162 INTEGER FUNCTION is_tile_4d_sp( pt ) 163 REAL(sp), DIMENSION(:,:,:,:), INTENT(in) :: pt 164 165 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 166 is_tile_4d_sp = 1 167 ELSE 168 is_tile_4d_sp = 0 169 ENDIF 170 END FUNCTION is_tile_4d_sp 171 172 173 INTEGER FUNCTION is_tile_4d_dp( pt ) 174 REAL(dp), DIMENSION(:,:,:,:), INTENT(in) :: pt 175 176 IF( l_istiled .AND. (SIZE(pt, 1) < jpi .OR. SIZE(pt, 2) < jpj) ) THEN 177 is_tile_4d_dp = 1 178 ELSE 179 is_tile_4d_dp = 0 180 ENDIF 181 END FUNCTION is_tile_4d_dp 156 182 !!====================================================================== 157 183 END MODULE domutl -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domvvl.F90
r14776 r14787 204 204 gdept(:,:,1,Kbb) = 0.5_wp * e3w(:,:,1,Kbb) 205 205 gdepw(:,:,1,Kbb) = 0.0_wp 206 DO_3D( 1, 1, 1, 1, 2, jpk ) ! vertical sum206 DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk ) ! vertical sum 207 207 ! zcoef = tmask - wmask ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 208 208 ! ! 1 everywhere from mbkt to mikt + 1 or 1 (if no isf) … … 404 404 zwu(:,:) = 0._wp 405 405 zwv(:,:) = 0._wp 406 DO_3D( 1, 0, 1, 0, 1, jpkm1 )! a - first derivative: diffusive fluxes406 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) ! a - first derivative: diffusive fluxes 407 407 un_td(ji,jj,jk) = rn_ahe3 * umask(ji,jj,jk) * e2_e1u(ji,jj) & 408 408 & * ( tilde_e3t_b(ji,jj,jk) - tilde_e3t_b(ji+1,jj ,jk) ) … … 412 412 zwv(ji,jj) = zwv(ji,jj) + vn_td(ji,jj,jk) 413 413 END_3D 414 DO_2D( 1, 1, 1, 1 )! b - correction for last oceanic u-v points414 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! b - correction for last oceanic u-v points 415 415 un_td(ji,jj,mbku(ji,jj)) = un_td(ji,jj,mbku(ji,jj)) - zwu(ji,jj) 416 416 vn_td(ji,jj,mbkv(ji,jj)) = vn_td(ji,jj,mbkv(ji,jj)) - zwv(ji,jj) … … 423 423 ! ! d - thickness diffusion transport: boundary conditions 424 424 ! (stored for tracer advction and continuity equation) 425 CALL lbc_lnk( 'domvvl', un_td , 'U' , -1._wp, vn_td , 'V' , -1._wp)425 IF( nn_hls == 1 ) CALL lbc_lnk( 'domvvl', un_td , 'U' , -1._wp, vn_td , 'V' , -1._wp) 426 426 ! 4 - Time stepping of baroclinic scale factors 427 427 ! --------------------------------------------- … … 640 640 gdepw(:,:,1,Kmm) = 0.0_wp 641 641 gde3w(:,:,1) = gdept(:,:,1,Kmm) - ssh(:,:,Kmm) 642 DO_3D( 1, 1, 1, 1, 2, jpk )642 DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 2, jpk ) 643 643 ! zcoef = (tmask(ji,jj,jk) - wmask(ji,jj,jk)) ! 0 everywhere tmask = wmask, ie everywhere expect at jk = mikt 644 644 ! 1 for jk = mikt -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/dtatsd.F90
r14776 r14787 141 141 INTEGER :: ji, jj, jk, jl, jkk ! dummy loop indicies 142 142 INTEGER :: ik, il0, il1, ii0, ii1, ij0, ij1 ! local integers 143 INTEGER :: itile144 143 INTEGER, DIMENSION(jpts), SAVE :: irec_b, irec_n 145 144 REAL(wp):: zl, zi ! local scalars … … 147 146 !!---------------------------------------------------------------------- 148 147 ! 149 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only for the full domain 150 itile = ntile 151 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) ! Use full domain 148 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only for the full domain 149 IF( ln_tile ) CALL dom_tile_stop( ldhold=.TRUE. ) ! Use full domain 152 150 CALL fld_read( kt, 1, sf_tsd ) !== read T & S data at kt time step ==! 153 151 ! … … 195 193 ENDIF 196 194 !!gm end 197 IF( ln_tile ) CALL dom_tile ( ntsi, ntsj, ntei, ntej, ktile = itile) ! Revert to tile domain195 IF( ln_tile ) CALL dom_tile_start( ldhold=.TRUE. ) ! Revert to tile domain 198 196 ENDIF 199 197 ! … … 205 203 IF( ln_sco ) THEN !== s- or mixed s-zps-coordinate ==! 206 204 ! 207 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile205 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 208 206 IF( kt == nit000 .AND. lwp )THEN 209 207 WRITE(numout,*) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/divhor.F90
r14776 r14787 69 69 ! 70 70 IF( kt == nit000 ) THEN 71 IF(lwp) WRITE(numout,*) 72 IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 73 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 74 hdiv(:,:,:) = 0._wp ! initialize hdiv for the halos at the first time step 71 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 72 IF(lwp) WRITE(numout,*) 73 IF(lwp) WRITE(numout,*) 'div_hor : horizontal velocity divergence ' 74 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 75 ENDIF 76 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 77 hdiv(ji,jj,jk) = 0._wp ! initialize hdiv for the halos at the first time step 78 END_3D 75 79 ENDIF 76 80 ! 77 DO_3D ( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 ) !== Horizontal divergence ==!81 DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 ) !== Horizontal divergence ==! 78 82 ! round brackets added to fix the order of floating point operations 79 83 ! needed to ensure halo 1 - halo 2 compatibility … … 93 97 ! 94 98 #endif 95 ! WED025 + isomip true96 99 IF( ln_isf ) CALL isf_hdiv( kt, Kmm, hdiv ) !== ice shelf ==! (update hdiv field) 97 100 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynadv_cen2.F90
r14776 r14787 52 52 ! 53 53 INTEGER :: ji, jj, jk ! dummy loop indices 54 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zfu_t, zfu_f, zfu_uw, zfu55 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw54 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zfu_t, zfu_f, zfu_uw, zfu 55 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw 56 56 !!---------------------------------------------------------------------- 57 57 ! 58 IF( kt == nit000 .AND. lwp ) THEN 59 WRITE(numout,*) 60 WRITE(numout,*) 'dyn_adv_cen2 : 2nd order flux form momentum advection' 61 WRITE(numout,*) '~~~~~~~~~~~~' 58 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 59 IF( kt == nit000 .AND. lwp ) THEN 60 WRITE(numout,*) 61 WRITE(numout,*) 'dyn_adv_cen2 : 2nd order flux form momentum advection' 62 WRITE(numout,*) '~~~~~~~~~~~~' 63 ENDIF 62 64 ENDIF 63 65 ! … … 70 72 ! 71 73 DO jk = 1, jpkm1 ! horizontal transport 72 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 73 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 74 DO_2D( 1, 1, 1, 1 ) 75 zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 76 zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 77 END_2D 74 78 DO_2D( 1, 0, 1, 0 ) ! horizontal momentum fluxes (at T- and F-point) 75 79 zfu_t(ji+1,jj ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( puu(ji,jj,jk,Kmm) + puu(ji+1,jj ,jk,Kmm) ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynadv_ubs.F90
r14776 r14787 75 75 INTEGER :: ji, jj, jk ! dummy loop indices 76 76 REAL(wp) :: zui, zvj, zfuj, zfvi, zl_u, zl_v ! local scalars 77 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zfu_t, zfu_f, zfu_uw, zfu78 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw79 REAL(wp), DIMENSION( jpi,jpj,jpk,2) :: zlu_uu, zlu_uv80 REAL(wp), DIMENSION( jpi,jpj,jpk,2) :: zlv_vv, zlv_vu77 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zfu_t, zfu_f, zfu_uw, zfu 78 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zfv_t, zfv_f, zfv_vw, zfv, zfw 79 REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) :: zlu_uu, zlu_uv 80 REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) :: zlv_vv, zlv_vu 81 81 !!---------------------------------------------------------------------- 82 82 ! 83 IF( kt == nit000 ) THEN 84 IF(lwp) WRITE(numout,*) 85 IF(lwp) WRITE(numout,*) 'dyn_adv_ubs : UBS flux form momentum advection' 86 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 83 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 84 IF( kt == nit000 ) THEN 85 IF(lwp) WRITE(numout,*) 86 IF(lwp) WRITE(numout,*) 'dyn_adv_ubs : UBS flux form momentum advection' 87 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 88 ENDIF 87 89 ENDIF 88 90 ! … … 105 107 ! ! =========================== ! 106 108 ! ! horizontal volume fluxes 107 zfu(:,:,jk) = e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 108 zfv(:,:,jk) = e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 109 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 110 zfu(ji,jj,jk) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 111 zfv(ji,jj,jk) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 112 END_2D 109 113 ! 110 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! laplacia 114 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! laplacian 111 115 ! round brackets added to fix the order of floating point operations 112 116 ! needed to ensure halo 1 - halo 2 compatibility … … 116 120 & ) & ! bracket for halo 1 - halo 2 compatibility 117 121 & ) * umask(ji ,jj ,jk) 118 zlv_vv(ji,jj,jk,1) = ( ( pvv (ji ,jj+1,jk,Kbb) - pvv (ji ,jj ,jk,Kbb) & 122 zlv_vv(ji,jj,jk,1) = ( ( pvv (ji ,jj+1,jk,Kbb) - pvv (ji ,jj ,jk,Kbb) & 119 123 & ) & ! bracket for halo 1 - halo 2 compatibility 120 124 & + ( pvv (ji ,jj-1,jk,Kbb) - pvv (ji ,jj ,jk,Kbb) & … … 135 139 zlv_vv(ji,jj,jk,2) = ( ( zfv(ji ,jj+1,jk) - zfv(ji ,jj ,jk) & 136 140 & ) & ! bracket for halo 1 - halo 2 compatibility 137 & + ( zfv(ji ,jj-1,jk) - zfv(ji ,jj ,jk) & 141 & + ( zfv(ji ,jj-1,jk) - zfv(ji ,jj ,jk) & 138 142 & ) & ! bracket for halo 1 - halo 2 compatibility 139 143 & ) * vmask(ji ,jj ,jk) … … 144 148 END_2D 145 149 END DO 146 ! NOTE: [tiling] sign reversal necessary for results to be independent of nn_hls (bug in trunk) 147 IF( nn_hls==1 ) CALL lbc_lnk( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', -1.0_wp , zlu_uv(:,:,:,1), 'U', -1.0_wp, & 150 IF( nn_hls == 1 ) CALL lbc_lnk( 'dynadv_ubs', zlu_uu(:,:,:,1), 'U', -1.0_wp , zlu_uv(:,:,:,1), 'U', -1.0_wp, & 148 151 & zlu_uu(:,:,:,2), 'U', -1.0_wp , zlu_uv(:,:,:,2), 'U', -1.0_wp, & 149 152 & zlv_vv(:,:,:,1), 'V', -1.0_wp , zlv_vu(:,:,:,1), 'V', -1.0_wp, & … … 154 157 DO jk = 1, jpkm1 ! ====================== ! 155 158 ! ! horizontal volume fluxes 156 zfu(:,:,jk) = 0.25_wp * e2u(:,:) * e3u(:,:,jk,Kmm) * puu(:,:,jk,Kmm) 157 zfv(:,:,jk) = 0.25_wp * e1v(:,:) * e3v(:,:,jk,Kmm) * pvv(:,:,jk,Kmm) 159 DO_2D( 1, 1, 1, 1 ) 160 zfu(ji,jj,jk) = 0.25_wp * e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * puu(ji,jj,jk,Kmm) 161 zfv(ji,jj,jk) = 0.25_wp * e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pvv(ji,jj,jk,Kmm) 162 END_2D 158 163 ! 159 164 DO_2D( 1, 0, 1, 0 ) ! horizontal momentum fluxes at T- and F-point -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynatf.F90
r14776 r14787 169 169 # endif 170 170 ! 171 IF (nn_hls==1)CALL lbc_lnk( 'dynatf', puu(:,:,:,Kaa), 'U', -1.0_wp, pvv(:,:,:,Kaa), 'V', -1.0_wp ) !* local domain boundaries171 CALL lbc_lnk( 'dynatf', puu(:,:,:,Kaa), 'U', -1.0_wp, pvv(:,:,:,Kaa), 'V', -1.0_wp ) !* local domain boundaries 172 172 ! 173 173 ! !* BDY open boundaries … … 285 285 ENDIF ! .NOT. l_1st_euler 286 286 ! 287 ! This is needed for dyn_ldf_blp to be restartable 288 IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatf', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp ) 287 289 ! Set "now" and "before" barotropic velocities for next time step: 288 290 ! JC: Would be more clever to swap variables than to make a full vertical -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynatf_qco.F90
r14776 r14787 195 195 ENDIF ! .NOT. l_1st_euler 196 196 ! 197 ! This is needed for dyn_ldf_blp to be restartable 198 IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatfqco', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp ) 199 197 200 ! Set "now" and "before" barotropic velocities for next time step: 198 201 ! JC: Would be more clever to swap variables than to make a full vertical -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynhpg.F90
r14776 r14787 118 118 CASE ( np_zps ) ; CALL hpg_zps ( kt, Kmm, puu, pvv, Krhs ) ! z-coordinate plus partial steps (interpolation) 119 119 CASE ( np_sco ) ; CALL hpg_sco ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (standard jacobian formulation) 120 CASE ( np_djc ) 120 CASE ( np_djc ) 121 121 ! [ comm_cleanup ] : it should not be needed but the removal/shift of this lbc_lnk results in a seg_fault error 122 IF (nn_hls==2) CALL lbc_lnk( 'dynhpg', r3t(:,:,Kmm), 'T', 1.) 122 ! TODO: [tiling] to check if still needed 123 !#if defined key_qco 124 ! IF (nn_hls==2) CALL lbc_lnk( 'dynhpg', r3t(:,:,Kmm), 'T', 1.) 125 !#endif 123 126 CALL hpg_djc ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (Density Jacobian with Cubic polynomial) 124 127 CASE ( np_prj ) ; CALL hpg_prj ( kt, Kmm, puu, pvv, Krhs ) ! s-coordinate (Pressure Jacobian scheme) … … 269 272 INTEGER :: ji, jj, jk ! dummy loop indices 270 273 REAL(wp) :: zcoef0, zcoef1 ! temporary scalars 271 REAL(wp), DIMENSION(jpi,jpj) :: zhpi, zhpj 272 !!---------------------------------------------------------------------- 273 ! 274 IF( kt == nit000 ) THEN 275 IF(lwp) WRITE(numout,*) 276 IF(lwp) WRITE(numout,*) 'dyn:hpg_zco : hydrostatic pressure gradient trend' 277 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate case ' 274 REAL(wp), DIMENSION(A2D(nn_hls)) :: zhpi, zhpj 275 !!---------------------------------------------------------------------- 276 ! 277 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 278 IF( kt == nit000 ) THEN 279 IF(lwp) WRITE(numout,*) 280 IF(lwp) WRITE(numout,*) 'dyn:hpg_zco : hydrostatic pressure gradient trend' 281 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate case ' 282 ENDIF 278 283 ENDIF 279 284 ! … … 321 326 INTEGER :: iku, ikv ! temporary integers 322 327 REAL(wp) :: zcoef0, zcoef1, zcoef2, zcoef3 ! temporary scalars 323 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zhpi, zhpj 324 REAL(wp), DIMENSION(jpi,jpj,jpts) :: zgtsu, zgtsv 325 REAL(wp), DIMENSION(jpi,jpj) :: zgru, zgrv 326 !!---------------------------------------------------------------------- 327 ! 328 IF( kt == nit000 ) THEN 329 IF(lwp) WRITE(numout,*) 330 IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend' 331 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate with partial steps - vector optimization' 328 REAL(wp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj 329 REAL(wp), DIMENSION(A2D(nn_hls),jpts) :: zgtsu, zgtsv 330 REAL(wp), DIMENSION(A2D(nn_hls) ) :: zgru, zgrv 331 !!---------------------------------------------------------------------- 332 ! 333 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 334 IF( kt == nit000 ) THEN 335 IF(lwp) WRITE(numout,*) 336 IF(lwp) WRITE(numout,*) 'dyn:hpg_zps : hydrostatic pressure gradient trend' 337 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ z-coordinate with partial steps - vector optimization' 338 ENDIF 332 339 ENDIF 333 340 … … 413 420 REAL(wp) :: zcoef0, zuap, zvap, ztmp ! local scalars 414 421 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables 415 REAL(wp), DIMENSION( jpi,jpj,jpk):: zhpi, zhpj422 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zhpi, zhpj 416 423 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 417 424 !!---------------------------------------------------------------------- 418 425 ! 419 IF( ln_wd_il ) ALLOCATE(zcpx(jpi,jpj), zcpy(jpi,jpj)) 420 ! 421 IF( kt == nit000 ) THEN 422 IF(lwp) WRITE(numout,*) 423 IF(lwp) WRITE(numout,*) 'dyn:hpg_sco : hydrostatic pressure gradient trend' 424 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, OCE original scheme used' 426 IF( ln_wd_il ) ALLOCATE(zcpx(A2D(nn_hls)), zcpy(A2D(nn_hls))) 427 ! 428 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 429 IF( kt == nit000 ) THEN 430 IF(lwp) WRITE(numout,*) 431 IF(lwp) WRITE(numout,*) 'dyn:hpg_sco : hydrostatic pressure gradient trend' 432 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, OCE original scheme used' 433 ENDIF 425 434 ENDIF 426 435 ! … … 550 559 REAL(wp) :: ze3w, ze3wi1, ze3wj1 ! local scalars 551 560 REAL(wp) :: zcoef0, zuap, zvap ! - - 552 REAL(wp), DIMENSION( jpi,jpj,jpk ) :: zhpi, zhpj553 REAL(wp), DIMENSION( jpi,jpj,jpts) :: zts_top554 REAL(wp), DIMENSION( jpi,jpj) :: zrhdtop_oce561 REAL(wp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj 562 REAL(wp), DIMENSION(A2D(nn_hls),jpts) :: zts_top 563 REAL(wp), DIMENSION(A2D(nn_hls)) :: zrhdtop_oce 555 564 !!---------------------------------------------------------------------- 556 565 ! … … 562 571 ! compute rhd at the ice/oce interface (ocean side) 563 572 ! usefull to reduce residual current in the test case ISOMIP with no melting 564 DO ji = 1, jpi 565 DO jj = 1, jpj 566 ikt = mikt(ji,jj) 567 zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 568 zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 569 END DO 570 END DO 573 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 574 ikt = mikt(ji,jj) 575 zts_top(ji,jj,1) = ts(ji,jj,ikt,1,Kmm) 576 zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 577 END_2D 571 578 CALL eos( zts_top, risfdep, zrhdtop_oce ) 572 579 … … 638 645 INTEGER :: iktb, iktt ! jk indices at tracer points for top and bottom points 639 646 REAL(wp) :: zcoef0, zep, cffw ! temporary scalars 640 REAL(wp) :: z_grav_10, z1_12 647 REAL(wp) :: z_grav_10, z1_12, z1_cff 641 648 REAL(wp) :: cffu, cffx ! " " 642 649 REAL(wp) :: cffv, cffy ! " " 643 650 LOGICAL :: ll_tmp1, ll_tmp2 ! local logical variables 644 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zhpi, zhpj645 646 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zdzx, zdzy, zdzz ! Primitive grid differences ('delta_xyz')647 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zdz_i, zdz_j, zdz_k ! Harmonic average of primitive grid differences ('d_xyz')648 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zdrhox, zdrhoy, zdrhoz ! Primitive rho differences ('delta_rho')649 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zdrho_i, zdrho_j, zdrho_k ! Harmonic average of primitive rho differences ('d_rho')650 REAL(wp), DIMENSION( jpi,jpj,jpk) :: z_rho_i, z_rho_j, z_rho_k ! Face intergrals651 REAL(wp), DIMENSION( jpi,jpj) :: zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j ! temporary arrays651 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zhpi, zhpj 652 653 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdzx, zdzy, zdzz ! Primitive grid differences ('delta_xyz') 654 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdz_i, zdz_j, zdz_k ! Harmonic average of primitive grid differences ('d_xyz') 655 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdrhox, zdrhoy, zdrhoz ! Primitive rho differences ('delta_rho') 656 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdrho_i, zdrho_j, zdrho_k ! Harmonic average of primitive rho differences ('d_rho') 657 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: z_rho_i, z_rho_j, z_rho_k ! Face intergrals 658 REAL(wp), DIMENSION(A2D(nn_hls)) :: zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j ! temporary arrays 652 659 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 653 660 !!---------------------------------------------------------------------- 654 661 ! 655 662 IF( ln_wd_il ) THEN 656 ALLOCATE( zcpx( jpi,jpj) , zcpy(jpi,jpj) )663 ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) ) 657 664 DO_2D( 0, 0, 0, 0 ) 658 665 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & … … 691 698 END IF 692 699 END_2D 693 ! NOTE: [tiling] sign reversal necessary for results to be independent of nn_hls (bug in trunk)694 IF( nn_hls == 1 ) CALL lbc_lnk( 'dynhpg', zdrhox, 'U', -1._wp, zdzx, 'U', -1._wp, zdrhoy, 'V', -1._wp, zdzy, 'V', -1._wp )695 700 END IF 696 701 697 IF( kt == nit000 ) THEN 698 IF(lwp) WRITE(numout,*) 699 IF(lwp) WRITE(numout,*) 'dyn:hpg_djc : hydrostatic pressure gradient trend' 700 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, density Jacobian with cubic polynomial scheme' 702 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 703 IF( kt == nit000 ) THEN 704 IF(lwp) WRITE(numout,*) 705 IF(lwp) WRITE(numout,*) 'dyn:hpg_djc : hydrostatic pressure gradient trend' 706 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, density Jacobian with cubic polynomial scheme' 707 ENDIF 701 708 ENDIF 702 709 … … 726 733 zdz_k (:,:,:) = 0._wp 727 734 728 DO_3D( 1, 1, 1, 1, 2, jpk-2 ) 729 cffw = 2._wp * zdrhoz(ji ,jj ,jk) * zdrhoz(ji,jj,jk+1) 730 IF( cffw > zep) THEN 731 zdrho_k(ji,jj,jk) = cffw / ( zdrhoz(ji,jj,jk) + zdrhoz(ji,jj,jk+1) ) 732 ENDIF 735 DO_3D( 1, 1, 1, 1, 2, jpk-2 ) 736 cffw = MAX( 2._wp * zdrhoz(ji,jj,jk) * zdrhoz(ji,jj,jk+1), 0._wp ) 737 z1_cff = zdrhoz(ji,jj,jk) + zdrhoz(ji,jj,jk+1) 738 zdrho_k(ji,jj,jk) = cffw / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 733 739 zdz_k(ji,jj,jk) = 2._wp * zdzz(ji,jj,jk) * zdzz(ji,jj,jk+1) & 734 740 & / ( zdzz(ji,jj,jk) + zdzz(ji,jj,jk+1) ) … … 740 746 741 747 ! mb for sea-ice shelves we will need to re-write this upper boundary condition in the same form as the lower boundary condition 742 zdrho_k(:,:,1) = aco_bc_vrt * ( rhd (:,:,2) - rhd (:,:,1) ) - bco_bc_vrt * zdrho_k(:,:,2) 743 zdz_k (:,:,1) = aco_bc_vrt * (-gde3w(:,:,2) + gde3w(:,:,1) ) - bco_bc_vrt * zdz_k (:,:,2) 748 DO_2D( 1, 1, 1, 1 ) 749 zdrho_k(ji,jj,1) = aco_bc_vrt * ( rhd (ji,jj,2) - rhd (ji,jj,1) ) - bco_bc_vrt * zdrho_k(ji,jj,2) 750 zdz_k (ji,jj,1) = aco_bc_vrt * (-gde3w(ji,jj,2) + gde3w(ji,jj,1) ) - bco_bc_vrt * zdz_k (ji,jj,2) 751 END_2D 744 752 745 753 DO_2D( 1, 1, 1, 1 ) … … 788 796 ! 5. compute and store elementary horizontal differences in provisional arrays 789 797 !---------------------------------------------------------------------------------------- 790 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 791 zdrhox(ji,jj,jk) = rhd (ji+1,jj ,jk) - rhd (ji,jj,jk ) 792 zdzx (ji,jj,jk) = - gde3w(ji+1,jj ,jk) + gde3w(ji,jj,jk ) 793 zdrhoy(ji,jj,jk) = rhd (ji ,jj+1,jk) - rhd (ji,jj,jk ) 794 zdzy (ji,jj,jk) = - gde3w(ji ,jj+1,jk) + gde3w(ji,jj,jk ) 795 END_3D 796 797 IF (nn_hls==1) CALL lbc_lnk( 'dynhpg', zdrhox, 'U', -1., zdzx, 'U', -1., zdrhoy, 'V', -1., zdzy, 'V', -1. ) 798 zdrhox(:,:,:) = 0._wp 799 zdzx (:,:,:) = 0._wp 800 zdrhoy(:,:,:) = 0._wp 801 zdzy (:,:,:) = 0._wp 802 803 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 804 zdrhox(ji,jj,jk) = rhd (ji+1,jj ,jk) - rhd (ji ,jj ,jk) 805 zdzx (ji,jj,jk) = gde3w(ji ,jj ,jk) - gde3w(ji+1,jj ,jk) 806 zdrhoy(ji,jj,jk) = rhd (ji ,jj+1,jk) - rhd (ji ,jj ,jk) 807 zdzy (ji,jj,jk) = gde3w(ji ,jj ,jk) - gde3w(ji ,jj+1,jk) 808 END_3D 809 810 IF( nn_hls == 1 ) CALL lbc_lnk( 'dynhpg', zdrhox, 'U', -1._wp, zdzx, 'U', -1._wp, zdrhoy, 'V', -1._wp, zdzy, 'V', -1._wp ) 798 811 799 812 !------------------------------------------------------------------------- … … 802 815 803 816 DO_3D( 0, 1, 0, 1, 1, jpkm1 ) 804 cffu = 2._wp * zdrhox(ji-1,jj ,jk) * zdrhox(ji,jj,jk ) 805 IF( cffu > zep ) THEN 806 zdrho_i(ji,jj,jk) = cffu / ( zdrhox(ji-1,jj,jk) + zdrhox(ji,jj,jk) ) 807 ELSE 808 zdrho_i(ji,jj,jk ) = 0._wp 809 ENDIF 810 811 cffx = 2._wp * zdzx (ji-1,jj ,jk) * zdzx (ji,jj,jk ) 812 IF( cffx > zep ) THEN 813 zdz_i(ji,jj,jk) = cffx / ( zdzx(ji-1,jj,jk) + zdzx(ji,jj,jk) ) 814 ELSE 815 zdz_i(ji,jj,jk) = 0._wp 816 ENDIF 817 818 cffv = 2._wp * zdrhoy(ji ,jj-1,jk) * zdrhoy(ji,jj,jk ) 819 IF( cffv > zep ) THEN 820 zdrho_j(ji,jj,jk) = cffv / ( zdrhoy(ji,jj-1,jk) + zdrhoy(ji,jj,jk) ) 821 ELSE 822 zdrho_j(ji,jj,jk) = 0._wp 823 ENDIF 824 825 cffy = 2._wp * zdzy (ji ,jj-1,jk) * zdzy (ji,jj,jk ) 826 IF( cffy > zep ) THEN 827 zdz_j(ji,jj,jk) = cffy / ( zdzy(ji,jj-1,jk) + zdzy(ji,jj,jk) ) 828 ELSE 829 zdz_j(ji,jj,jk) = 0._wp 830 ENDIF 817 cffu = MAX( 2._wp * zdrhox(ji-1,jj,jk) * zdrhox(ji,jj,jk), 0._wp ) 818 z1_cff = zdrhox(ji-1,jj,jk) + zdrhox(ji,jj,jk) 819 zdrho_i(ji,jj,jk) = cffu / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 820 821 cffx = MAX( 2._wp * zdzx(ji-1,jj,jk) * zdzx(ji,jj,jk), 0._wp ) 822 z1_cff = zdzx(ji-1,jj,jk) + zdzx(ji,jj,jk) 823 zdz_i(ji,jj,jk) = cffx / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 824 825 cffv = MAX( 2._wp * zdrhoy(ji,jj-1,jk) * zdrhoy(ji,jj,jk), 0._wp ) 826 z1_cff = zdrhoy(ji,jj-1,jk) + zdrhoy(ji,jj,jk) 827 zdrho_j(ji,jj,jk) = cffv / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 828 829 cffy = MAX( 2._wp * zdzy(ji,jj-1,jk) * zdzy(ji,jj,jk), 0._wp ) 830 z1_cff = zdzy(ji,jj-1,jk) + zdzy(ji,jj,jk) 831 zdz_j(ji,jj,jk) = cffy / SIGN( MAX( ABS(z1_cff), zep ), z1_cff ) 831 832 END_3D 832 833 … … 842 843 zz_drho_j(:,:) = zdrho_j(:,:,jk) 843 844 zz_dz_j (:,:) = zdz_j (:,:,jk) 844 DO_2D( 0, 1, 0, 1) 845 ! Walls coming from left: should check from 2 to jpi-1 (and jpj=2-jpj) 846 IF (ji < jpi) THEN 847 IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp) THEN 848 zz_drho_i(ji,jj) = aco_bc_hor * ( rhd (ji+1,jj,jk) - rhd (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk) 849 zz_dz_i (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i (ji+1,jj,jk) 850 END IF 845 ! Walls coming from left: should check from 2 to jpi-1 (and jpj=2-jpj) 846 DO_2D( 0, 0, 0, 1 ) 847 IF ( umask(ji,jj,jk) > 0.5_wp .AND. umask(ji-1,jj,jk) < 0.5_wp .AND. umask(ji+1,jj,jk) > 0.5_wp) THEN 848 zz_drho_i(ji,jj) = aco_bc_hor * ( rhd (ji+1,jj,jk) - rhd (ji,jj,jk) ) - bco_bc_hor * zdrho_i(ji+1,jj,jk) 849 zz_dz_i (ji,jj) = aco_bc_hor * (-gde3w(ji+1,jj,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_i (ji+1,jj,jk) 851 850 END IF 852 ! Walls coming from right: should check from 3 to jpi (and jpj=2-jpj)853 IF (ji > 2) THEN854 IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN855 zz_drho_i(ji,jj) = aco_bc_hor * ( rhd (ji,jj,jk) - rhd (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk)856 zz_dz_i (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i(ji-1,jj,jk)857 END IF851 END_2D 852 ! Walls coming from right: should check from 3 to jpi (and jpj=2-jpj) 853 DO_2D( -1, 1, 0, 1 ) 854 IF ( umask(ji,jj,jk) < 0.5_wp .AND. umask(ji-1,jj,jk) > 0.5_wp .AND. umask(ji-2,jj,jk) > 0.5_wp) THEN 855 zz_drho_i(ji,jj) = aco_bc_hor * ( rhd (ji,jj,jk) - rhd (ji-1,jj,jk) ) - bco_bc_hor * zdrho_i(ji-1,jj,jk) 856 zz_dz_i (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji-1,jj,jk) ) - bco_bc_hor * zdz_i (ji-1,jj,jk) 858 857 END IF 859 ! Walls coming from left: should check from 2 to jpj-1 (and jpi=2-jpi)860 IF (jj < jpj) THEN861 IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp) THEN862 zz_drho_j(ji,jj) = aco_bc_hor * ( rhd (ji,jj+1,jk) - rhd (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk)863 zz_dz_j (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j(ji,jj+1,jk)864 END IF865 END IF 866 ! Walls coming from right: should check from 3 to jpj (and jpi=2-jpi)867 IF (jj > 2) THEN868 IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN869 zz_drho_j(ji,jj) = aco_bc_hor * ( rhd (ji,jj,jk) - rhd (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk)870 zz_dz_j (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j(ji,jj-1,jk)871 END IF858 END_2D 859 ! Walls coming from left: should check from 2 to jpj-1 (and jpi=2-jpi) 860 DO_2D( 0, 1, 0, 0 ) 861 IF ( vmask(ji,jj,jk) > 0.5_wp .AND. vmask(ji,jj-1,jk) < 0.5_wp .AND. vmask(ji,jj+1,jk) > 0.5_wp) THEN 862 zz_drho_j(ji,jj) = aco_bc_hor * ( rhd (ji,jj+1,jk) - rhd (ji,jj,jk) ) - bco_bc_hor * zdrho_j(ji,jj+1,jk) 863 zz_dz_j (ji,jj) = aco_bc_hor * (-gde3w(ji,jj+1,jk) + gde3w(ji,jj,jk) ) - bco_bc_hor * zdz_j (ji,jj+1,jk) 864 END IF 865 END_2D 866 ! Walls coming from right: should check from 3 to jpj (and jpi=2-jpi) 867 DO_2D( 0, 1, -1, 1 ) 868 IF ( vmask(ji,jj,jk) < 0.5_wp .AND. vmask(ji,jj-1,jk) > 0.5_wp .AND. vmask(ji,jj-2,jk) > 0.5_wp) THEN 869 zz_drho_j(ji,jj) = aco_bc_hor * ( rhd (ji,jj,jk) - rhd (ji,jj-1,jk) ) - bco_bc_hor * zdrho_j(ji,jj-1,jk) 870 zz_dz_j (ji,jj) = aco_bc_hor * (-gde3w(ji,jj,jk) + gde3w(ji,jj-1,jk) ) - bco_bc_hor * zdz_j (ji,jj-1,jk) 872 871 END IF 873 872 END_2D … … 976 975 REAL(wp) :: zrhdt1 977 976 REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 978 REAL(wp), DIMENSION( jpi,jpj) :: zpgu, zpgv ! 2D workspace979 REAL(wp), DIMENSION( jpi,jpj) :: zsshu_n, zsshv_n980 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zdept, zrhh981 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp977 REAL(wp), DIMENSION(A2D(nn_hls)) :: zpgu, zpgv ! 2D workspace 978 REAL(wp), DIMENSION(A2D(nn_hls)) :: zsshu_n, zsshv_n 979 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdept, zrhh 980 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 982 981 REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zcpx, zcpy !W/D pressure filter 983 982 !!---------------------------------------------------------------------- 984 983 ! 985 IF( kt == nit000 ) THEN 986 IF(lwp) WRITE(numout,*) 987 IF(lwp) WRITE(numout,*) 'dyn:hpg_prj : hydrostatic pressure gradient trend' 988 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, cubic spline pressure Jacobian' 984 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 985 IF( kt == nit000 ) THEN 986 IF(lwp) WRITE(numout,*) 987 IF(lwp) WRITE(numout,*) 'dyn:hpg_prj : hydrostatic pressure gradient trend' 988 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate case, cubic spline pressure Jacobian' 989 ENDIF 989 990 ENDIF 990 991 … … 1003 1004 ! 1004 1005 IF( ln_wd_il ) THEN 1005 ALLOCATE( zcpx( jpi,jpj) , zcpy(jpi,jpj) )1006 ALLOCATE( zcpx(A2D(nn_hls)) , zcpy(A2D(nn_hls)) ) 1006 1007 DO_2D( 0, 0, 0, 0 ) 1007 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 1008 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 1009 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) & 1010 & > rn_wdmin1 + rn_wdmin2 1011 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. ( & 1012 & MAX( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 1013 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 1014 1015 IF(ll_tmp1) THEN 1016 zcpx(ji,jj) = 1.0_wp 1017 ELSE IF(ll_tmp2) THEN 1018 ! no worries about ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm) = 0, it won't happen ! here 1019 zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 1020 & / (ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm)) ) 1021 1022 zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 1023 ELSE 1024 zcpx(ji,jj) = 0._wp 1025 END IF 1026 1027 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 1028 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 1029 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) & 1030 & > rn_wdmin1 + rn_wdmin2 1031 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. ( & 1032 & MAX( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 1033 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 1034 1035 IF(ll_tmp1) THEN 1036 zcpy(ji,jj) = 1.0_wp 1037 ELSE IF(ll_tmp2) THEN 1038 ! no worries about ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm) = 0, it won't happen ! here 1039 zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 1040 & / (ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm)) ) 1041 zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 1042 1008 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 1009 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) .AND. & 1010 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) ) > & 1011 & rn_wdmin1 + rn_wdmin2 1012 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji+1,jj,Kmm) ) > 1.E-12 ) .AND. & 1013 & ( MAX( ssh(ji,jj,Kmm) , ssh(ji+1,jj,Kmm) ) > & 1014 & MAX( -ht_0(ji,jj) , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 1015 1016 IF(ll_tmp1) THEN 1017 zcpx(ji,jj) = 1.0_wp 1018 ELSE IF(ll_tmp2) THEN 1019 ! no worries about ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm) = 0, it won't happen ! here 1020 zcpx(ji,jj) = ABS( (ssh(ji+1,jj,Kmm) + ht_0(ji+1,jj) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 1021 & / (ssh(ji+1,jj,Kmm) - ssh(ji ,jj,Kmm)) ) 1022 zcpx(ji,jj) = MAX(MIN( zcpx(ji,jj) , 1.0_wp),0.0_wp) 1023 ELSE 1024 zcpx(ji,jj) = 0._wp 1025 END IF 1026 1027 ll_tmp1 = MIN( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 1028 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) .AND. & 1029 & MAX( ssh(ji,jj,Kmm) + ht_0(ji,jj), ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) ) > & 1030 & rn_wdmin1 + rn_wdmin2 1031 ll_tmp2 = ( ABS( ssh(ji,jj,Kmm) - ssh(ji,jj+1,Kmm) ) > 1.E-12 ) .AND. & 1032 & ( MAX( ssh(ji,jj,Kmm) , ssh(ji,jj+1,Kmm) ) > & 1033 & MAX( -ht_0(ji,jj) , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 1034 1035 IF(ll_tmp1) THEN 1036 zcpy(ji,jj) = 1.0_wp 1037 ELSE IF(ll_tmp2) THEN 1038 ! no worries about ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm) = 0, it won't happen ! here 1039 zcpy(ji,jj) = ABS( (ssh(ji,jj+1,Kmm) + ht_0(ji,jj+1) - ssh(ji,jj,Kmm) - ht_0(ji,jj)) & 1040 & / (ssh(ji,jj+1,Kmm) - ssh(ji,jj ,Kmm)) ) 1041 zcpy(ji,jj) = MAX(MIN( zcpy(ji,jj) , 1.0_wp),0.0_wp) 1043 1042 ELSE 1044 1043 zcpy(ji,jj) = 0._wp … … 1049 1048 ! Clean 3-D work arrays 1050 1049 zhpi(:,:,:) = 0._wp 1051 zrhh(:,:,:) = rhd( :,:,:)1050 zrhh(:,:,:) = rhd(A2D(nn_hls),:) 1052 1051 1053 1052 ! Preparing vertical density profile "zrhh(:,:,:)" for hybrid-sco coordinate 1054 1053 DO_2D( 1, 1, 1, 1 ) 1055 jk = mbkt(ji,jj)1056 IF( jk <= 1 ) THEN ; zrhh(ji,jj, : ) = 0._wp1057 ELSEIF( jk == 2 ) THEN ; zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk)1058 ELSEIF( jk < jpkm1 ) THEN1059 DO jkk = jk+1, jpk1060 zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk ), gde3w(ji,jj,jkk-1), &1061 & gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2))1062 END DO1063 ENDIF1054 jk = mbkt(ji,jj) 1055 IF( jk <= 1 ) THEN ; zrhh(ji,jj, : ) = 0._wp 1056 ELSEIF( jk == 2 ) THEN ; zrhh(ji,jj,jk+1:jpk) = rhd(ji,jj,jk) 1057 ELSEIF( jk < jpkm1 ) THEN 1058 DO jkk = jk+1, jpk 1059 zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk ), gde3w(ji,jj,jkk-1), & 1060 & gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 1061 END DO 1062 ENDIF 1064 1063 END_2D 1065 1064 … … 1083 1082 ! Integrate the hydrostatic pressure "zhpi(:,:,:)" at "T(ji,jj,1)" 1084 1083 DO_2D( 0, 1, 0, 1 ) 1085 zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1), &1086 & csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm)1087 1088 ! assuming linear profile across the top half surface layer1089 zhpi(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt11084 zrhdt1 = zrhh(ji,jj,1) - interp3( zdept(ji,jj,1), asp(ji,jj,1), bsp(ji,jj,1), & 1085 & csp(ji,jj,1), dsp(ji,jj,1) ) * 0.25_wp * e3w(ji,jj,1,Kmm) 1086 1087 ! assuming linear profile across the top half surface layer 1088 zhpi(ji,jj,1) = 0.5_wp * e3w(ji,jj,1,Kmm) * zrhdt1 1090 1089 END_2D 1091 1090 1092 1091 ! Calculate the pressure "zhpi(:,:,:)" at "T(ji,jj,2:jpkm1)" 1093 1092 DO_3D( 0, 1, 0, 1, 2, jpkm1 ) 1094 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + &1095 & integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk), &1096 & asp (ji,jj,jk-1), bsp (ji,jj,jk-1), &1097 & csp (ji,jj,jk-1), dsp (ji,jj,jk-1) )1093 zhpi(ji,jj,jk) = zhpi(ji,jj,jk-1) + & 1094 & integ_spline( zdept(ji,jj,jk-1), zdept(ji,jj,jk), & 1095 & asp (ji,jj,jk-1), bsp (ji,jj,jk-1), & 1096 & csp (ji,jj,jk-1), dsp (ji,jj,jk-1) ) 1098 1097 END_3D 1099 1098 … … 1108 1107 ! & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 1109 1108 !!gm not this: 1110 zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * &1111 & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp1112 zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * &1113 & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp1109 zsshu_n(ji,jj) = (e1e2u(ji,jj) * ssh(ji,jj,Kmm) + e1e2u(ji+1, jj) * ssh(ji+1,jj,Kmm)) * & 1110 & r1_e1e2u(ji,jj) * umask(ji,jj,1) * 0.5_wp 1111 zsshv_n(ji,jj) = (e1e2v(ji,jj) * ssh(ji,jj,Kmm) + e1e2v(ji+1, jj) * ssh(ji,jj+1,Kmm)) * & 1112 & r1_e1e2v(ji,jj) * vmask(ji,jj,1) * 0.5_wp 1114 1113 END_2D 1115 1114 1116 1115 DO_2D( 0, 0, 0, 0 ) 1117 zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) )1118 zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) )1116 zu(ji,jj,1) = - ( e3u(ji,jj,1,Kmm) - zsshu_n(ji,jj) ) 1117 zv(ji,jj,1) = - ( e3v(ji,jj,1,Kmm) - zsshv_n(ji,jj) ) 1119 1118 END_2D 1120 1119 1121 1120 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 1122 zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm)1123 zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm)1121 zu(ji,jj,jk) = zu(ji,jj,jk-1) - e3u(ji,jj,jk,Kmm) 1122 zv(ji,jj,jk) = zv(ji,jj,jk-1) - e3v(ji,jj,jk,Kmm) 1124 1123 END_3D 1125 1124 1126 1125 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1127 zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm)1128 zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm)1126 zu(ji,jj,jk) = zu(ji,jj,jk) + 0.5_wp * e3u(ji,jj,jk,Kmm) 1127 zv(ji,jj,jk) = zv(ji,jj,jk) + 0.5_wp * e3v(ji,jj,jk,Kmm) 1129 1128 END_3D 1130 1129 1131 1130 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1132 zu(ji,jj,jk) = MIN( zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) )1133 zu(ji,jj,jk) = MAX( zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) )1134 zv(ji,jj,jk) = MIN( zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) )1135 zv(ji,jj,jk) = MAX( zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) )1131 zu(ji,jj,jk) = MIN( zu(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1132 zu(ji,jj,jk) = MAX( zu(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji+1,jj,jk) ) ) 1133 zv(ji,jj,jk) = MIN( zv(ji,jj,jk) , MAX( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1134 zv(ji,jj,jk) = MAX( zv(ji,jj,jk) , MIN( -zdept(ji,jj,jk) , -zdept(ji,jj+1,jk) ) ) 1136 1135 END_3D 1137 1136 1138 1137 1139 1138 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 1140 zpwes = 0._wp; zpwed = 0._wp 1141 zpnss = 0._wp; zpnsd = 0._wp 1142 zuijk = zu(ji,jj,jk) 1143 zvijk = zv(ji,jj,jk) 1144 1145 !!!!! for u equation 1146 IF( jk <= mbku(ji,jj) ) THEN 1147 IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 1148 jis = ji + 1; jid = ji 1149 ELSE 1150 jis = ji; jid = ji +1 1139 zpwes = 0._wp; zpwed = 0._wp 1140 zpnss = 0._wp; zpnsd = 0._wp 1141 zuijk = zu(ji,jj,jk) 1142 zvijk = zv(ji,jj,jk) 1143 1144 !!!!! for u equation 1145 IF( jk <= mbku(ji,jj) ) THEN 1146 IF( -zdept(ji+1,jj,jk) >= -zdept(ji,jj,jk) ) THEN 1147 jis = ji + 1; jid = ji 1148 ELSE 1149 jis = ji; jid = ji +1 1150 ENDIF 1151 1152 ! integrate the pressure on the shallow side 1153 jk1 = jk 1154 DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 1155 IF( jk1 == mbku(ji,jj) ) THEN 1156 zuijk = -zdept(jis,jj,jk1) 1157 EXIT 1158 ENDIF 1159 zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 1160 zpwes = zpwes + & 1161 integ_spline(zdept(jis,jj,jk1), zdeps, & 1162 asp(jis,jj,jk1), bsp(jis,jj,jk1), & 1163 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 1164 jk1 = jk1 + 1 1165 END DO 1166 1167 ! integrate the pressure on the deep side 1168 jk1 = jk 1169 DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 1170 IF( jk1 == 1 ) THEN 1171 zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 1172 zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 1173 bsp(jid,jj,1) , csp(jid,jj,1), & 1174 dsp(jid,jj,1)) * zdeps 1175 zpwed = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 1176 EXIT 1177 ENDIF 1178 zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 1179 zpwed = zpwed + & 1180 integ_spline(zdeps, zdept(jid,jj,jk1), & 1181 asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1), & 1182 csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 1183 jk1 = jk1 - 1 1184 END DO 1185 1186 ! update the momentum trends in u direction 1187 zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 1188 IF( .NOT.ln_linssh ) THEN 1189 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 1190 & ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 1191 ELSE 1192 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 1193 ENDIF 1194 IF( ln_wd_il ) THEN 1195 zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj) 1196 zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj) 1197 ENDIF 1198 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2 - zpgu(ji,jj)) * umask(ji,jj,jk) 1151 1199 ENDIF 1152 1200 1153 ! integrate the pressure on the shallow side 1154 jk1 = jk 1155 DO WHILE ( -zdept(jis,jj,jk1) > zuijk ) 1156 IF( jk1 == mbku(ji,jj) ) THEN 1157 zuijk = -zdept(jis,jj,jk1) 1158 EXIT 1159 ENDIF 1160 zdeps = MIN(zdept(jis,jj,jk1+1), -zuijk) 1161 zpwes = zpwes + & 1162 integ_spline(zdept(jis,jj,jk1), zdeps, & 1163 asp(jis,jj,jk1), bsp(jis,jj,jk1), & 1164 csp(jis,jj,jk1), dsp(jis,jj,jk1)) 1165 jk1 = jk1 + 1 1166 END DO 1167 1168 ! integrate the pressure on the deep side 1169 jk1 = jk 1170 DO WHILE ( -zdept(jid,jj,jk1) < zuijk ) 1171 IF( jk1 == 1 ) THEN 1172 zdeps = zdept(jid,jj,1) + MIN(zuijk, ssh(jid,jj,Kmm)*znad) 1173 zrhdt1 = zrhh(jid,jj,1) - interp3(zdept(jid,jj,1), asp(jid,jj,1), & 1174 bsp(jid,jj,1), csp(jid,jj,1), & 1175 dsp(jid,jj,1)) * zdeps 1176 zpwed = zpwed + 0.5_wp * (zrhh(jid,jj,1) + zrhdt1) * zdeps 1177 EXIT 1178 ENDIF 1179 zdeps = MAX(zdept(jid,jj,jk1-1), -zuijk) 1180 zpwed = zpwed + & 1181 integ_spline(zdeps, zdept(jid,jj,jk1), & 1182 asp(jid,jj,jk1-1), bsp(jid,jj,jk1-1), & 1183 csp(jid,jj,jk1-1), dsp(jid,jj,jk1-1) ) 1184 jk1 = jk1 - 1 1185 END DO 1186 1187 ! update the momentum trends in u direction 1188 1189 zdpdx1 = zcoef0 * r1_e1u(ji,jj) * ( zhpi(ji+1,jj,jk) - zhpi(ji,jj,jk) ) 1190 IF( .NOT.ln_linssh ) THEN 1191 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * & 1192 & ( REAL(jis-jid, wp) * (zpwes + zpwed) + (ssh(ji+1,jj,Kmm)-ssh(ji,jj,Kmm)) ) 1193 ELSE 1194 zdpdx2 = zcoef0 * r1_e1u(ji,jj) * REAL(jis-jid, wp) * (zpwes + zpwed) 1201 !!!!! for v equation 1202 IF( jk <= mbkv(ji,jj) ) THEN 1203 IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN 1204 jjs = jj + 1; jjd = jj 1205 ELSE 1206 jjs = jj ; jjd = jj + 1 1207 ENDIF 1208 1209 ! integrate the pressure on the shallow side 1210 jk1 = jk 1211 DO WHILE ( -zdept(ji,jjs,jk1) > zvijk ) 1212 IF( jk1 == mbkv(ji,jj) ) THEN 1213 zvijk = -zdept(ji,jjs,jk1) 1214 EXIT 1215 ENDIF 1216 zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk) 1217 zpnss = zpnss + & 1218 integ_spline(zdept(ji,jjs,jk1), zdeps, & 1219 asp(ji,jjs,jk1), bsp(ji,jjs,jk1), & 1220 csp(ji,jjs,jk1), dsp(ji,jjs,jk1) ) 1221 jk1 = jk1 + 1 1222 END DO 1223 1224 ! integrate the pressure on the deep side 1225 jk1 = jk 1226 DO WHILE ( -zdept(ji,jjd,jk1) < zvijk ) 1227 IF( jk1 == 1 ) THEN 1228 zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad) 1229 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), & 1230 bsp(ji,jjd,1) , csp(ji,jjd,1), & 1231 dsp(ji,jjd,1) ) * zdeps 1232 zpnsd = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps 1233 EXIT 1234 ENDIF 1235 zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk) 1236 zpnsd = zpnsd + & 1237 integ_spline(zdeps, zdept(ji,jjd,jk1), & 1238 asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), & 1239 csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) ) 1240 jk1 = jk1 - 1 1241 END DO 1242 1243 ! update the momentum trends in v direction 1244 zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) ) 1245 IF( .NOT.ln_linssh ) THEN 1246 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * & 1247 ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) ) 1248 ELSE 1249 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd ) 1250 ENDIF 1251 IF( ln_wd_il ) THEN 1252 zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj) 1253 zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj) 1254 ENDIF 1255 1256 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2 - zpgv(ji,jj)) * vmask(ji,jj,jk) 1195 1257 ENDIF 1196 IF( ln_wd_il ) THEN1197 zdpdx1 = zdpdx1 * zcpx(ji,jj) * wdrampu(ji,jj)1198 zdpdx2 = zdpdx2 * zcpx(ji,jj) * wdrampu(ji,jj)1199 ENDIF1200 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + (zdpdx1 + zdpdx2 - zpgu(ji,jj)) * umask(ji,jj,jk)1201 ENDIF1202 1203 !!!!! for v equation1204 IF( jk <= mbkv(ji,jj) ) THEN1205 IF( -zdept(ji,jj+1,jk) >= -zdept(ji,jj,jk) ) THEN1206 jjs = jj + 1; jjd = jj1207 ELSE1208 jjs = jj ; jjd = jj + 11209 ENDIF1210 1211 ! integrate the pressure on the shallow side1212 jk1 = jk1213 DO WHILE ( -zdept(ji,jjs,jk1) > zvijk )1214 IF( jk1 == mbkv(ji,jj) ) THEN1215 zvijk = -zdept(ji,jjs,jk1)1216 EXIT1217 ENDIF1218 zdeps = MIN(zdept(ji,jjs,jk1+1), -zvijk)1219 zpnss = zpnss + &1220 integ_spline(zdept(ji,jjs,jk1), zdeps, &1221 asp(ji,jjs,jk1), bsp(ji,jjs,jk1), &1222 csp(ji,jjs,jk1), dsp(ji,jjs,jk1) )1223 jk1 = jk1 + 11224 END DO1225 1226 ! integrate the pressure on the deep side1227 jk1 = jk1228 DO WHILE ( -zdept(ji,jjd,jk1) < zvijk )1229 IF( jk1 == 1 ) THEN1230 zdeps = zdept(ji,jjd,1) + MIN(zvijk, ssh(ji,jjd,Kmm)*znad)1231 zrhdt1 = zrhh(ji,jjd,1) - interp3(zdept(ji,jjd,1), asp(ji,jjd,1), &1232 bsp(ji,jjd,1), csp(ji,jjd,1), &1233 dsp(ji,jjd,1) ) * zdeps1234 zpnsd = zpnsd + 0.5_wp * (zrhh(ji,jjd,1) + zrhdt1) * zdeps1235 EXIT1236 ENDIF1237 zdeps = MAX(zdept(ji,jjd,jk1-1), -zvijk)1238 zpnsd = zpnsd + &1239 integ_spline(zdeps, zdept(ji,jjd,jk1), &1240 asp(ji,jjd,jk1-1), bsp(ji,jjd,jk1-1), &1241 csp(ji,jjd,jk1-1), dsp(ji,jjd,jk1-1) )1242 jk1 = jk1 - 11243 END DO1244 1245 1246 ! update the momentum trends in v direction1247 1248 zdpdy1 = zcoef0 * r1_e2v(ji,jj) * ( zhpi(ji,jj+1,jk) - zhpi(ji,jj,jk) )1249 IF( .NOT.ln_linssh ) THEN1250 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * &1251 ( REAL(jjs-jjd, wp) * (zpnss + zpnsd) + (ssh(ji,jj+1,Kmm)-ssh(ji,jj,Kmm)) )1252 ELSE1253 zdpdy2 = zcoef0 * r1_e2v(ji,jj) * REAL(jjs-jjd, wp) * (zpnss + zpnsd )1254 ENDIF1255 IF( ln_wd_il ) THEN1256 zdpdy1 = zdpdy1 * zcpy(ji,jj) * wdrampv(ji,jj)1257 zdpdy2 = zdpdy2 * zcpy(ji,jj) * wdrampv(ji,jj)1258 ENDIF1259 1260 pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) + (zdpdy1 + zdpdy2 - zpgv(ji,jj)) * vmask(ji,jj,jk)1261 ENDIF1262 1258 ! 1263 1259 END_3D … … 1278 1274 !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 1279 1275 !!---------------------------------------------------------------------- 1280 REAL(wp), DIMENSION( :,:,:), INTENT(in ) :: fsp, xsp ! value and coordinate1281 REAL(wp), DIMENSION( :,:,:), INTENT( out) :: asp, bsp, csp, dsp ! coefficients of the interpoated function1282 INTEGER , INTENT(in ) :: polynomial_type ! 1: cubic spline ; 2: Linear1276 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in ) :: fsp, xsp ! value and coordinate 1277 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT( out) :: asp, bsp, csp, dsp ! coefficients of the interpoated function 1278 INTEGER , INTENT(in ) :: polynomial_type ! 1: cubic spline ; 2: Linear 1283 1279 ! 1284 1280 INTEGER :: ji, jj, jk ! dummy loop indices 1285 INTEGER :: jpi, jpj, jpkm11286 1281 REAL(wp) :: zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp 1287 1282 REAL(wp) :: zdxtmp1, zdxtmp2, zalpha 1288 REAL(wp) :: zdf(size(fsp,3)) 1289 !!---------------------------------------------------------------------- 1290 ! 1291 !!gm WHAT !!!!! THIS IS VERY DANGEROUS !!!!! 1292 jpi = size(fsp,1) 1293 jpj = size(fsp,2) 1294 jpkm1 = MAX( 1, size(fsp,3) - 1 ) 1283 REAL(wp) :: zdf(jpk) 1284 !!---------------------------------------------------------------------- 1295 1285 ! 1296 1286 IF (polynomial_type == 1) THEN ! Constrained Cubic Spline 1297 DO ji = 1, jpi 1298 DO jj = 1, jpj 1299 !!Fritsch&Butland's method, 1984 (preferred, but more computation) 1300 ! DO jk = 2, jpkm1-1 1301 ! zdxtmp1 = xsp(ji,jj,jk) - xsp(ji,jj,jk-1) 1302 ! zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1303 ! zdf1 = ( fsp(ji,jj,jk) - fsp(ji,jj,jk-1) ) / zdxtmp1 1304 ! zdf2 = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp2 1305 ! 1306 ! zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 1307 ! 1308 ! IF(zdf1 * zdf2 <= 0._wp) THEN 1309 ! zdf(jk) = 0._wp 1310 ! ELSE 1311 ! zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 1312 ! ENDIF 1313 ! END DO 1314 1315 !!Simply geometric average 1316 DO jk = 2, jpkm1-1 1317 zdf1 = (fsp(ji,jj,jk ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk ) - xsp(ji,jj,jk-1)) 1318 zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk )) 1319 1320 IF(zdf1 * zdf2 <= 0._wp) THEN 1321 zdf(jk) = 0._wp 1322 ELSE 1323 zdf(jk) = 2._wp * zdf1 * zdf2 / (zdf1 + zdf2) 1324 ENDIF 1325 END DO 1326 1327 zdf(1) = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 1328 & ( xsp(ji,jj,2) - xsp(ji,jj,1) ) - 0.5_wp * zdf(2) 1329 zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 1330 & ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - 0.5_wp * zdf(jpkm1 - 1) 1331 1332 DO jk = 1, jpkm1 - 1 1333 zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1334 ztmp1 = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 1335 ztmp2 = 6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 1336 zddf1 = -2._wp * ztmp1 + ztmp2 1337 ztmp1 = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 1338 zddf2 = 2._wp * ztmp1 - ztmp2 1339 1340 dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 1341 csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 1342 bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - & 1343 & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 1344 & dsp(ji,jj,jk) * ((xsp(ji,jj,jk+1) + xsp(ji,jj,jk))**2 - & 1345 & xsp(ji,jj,jk+1) * xsp(ji,jj,jk)) 1346 asp(ji,jj,jk) = fsp(ji,jj,jk) - xsp(ji,jj,jk) * (bsp(ji,jj,jk) + & 1347 & (xsp(ji,jj,jk) * (csp(ji,jj,jk) + & 1348 & dsp(ji,jj,jk) * xsp(ji,jj,jk)))) 1349 END DO 1287 DO_2D( 1, 1, 1, 1 ) 1288 !!Fritsch&Butland's method, 1984 (preferred, but more computation) 1289 ! DO jk = 2, jpkm1-1 1290 ! zdxtmp1 = xsp(ji,jj,jk) - xsp(ji,jj,jk-1) 1291 ! zdxtmp2 = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1292 ! zdf1 = ( fsp(ji,jj,jk) - fsp(ji,jj,jk-1) ) / zdxtmp1 1293 ! zdf2 = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp2 1294 ! 1295 ! zalpha = ( zdxtmp1 + 2._wp * zdxtmp2 ) / ( zdxtmp1 + zdxtmp2 ) / 3._wp 1296 ! 1297 ! IF(zdf1 * zdf2 <= 0._wp) THEN 1298 ! zdf(jk) = 0._wp 1299 ! ELSE 1300 ! zdf(jk) = zdf1 * zdf2 / ( ( 1._wp - zalpha ) * zdf1 + zalpha * zdf2 ) 1301 ! ENDIF 1302 ! END DO 1303 1304 !!Simply geometric average 1305 DO jk = 2, jpk-2 1306 zdf1 = (fsp(ji,jj,jk ) - fsp(ji,jj,jk-1)) / (xsp(ji,jj,jk ) - xsp(ji,jj,jk-1)) 1307 zdf2 = (fsp(ji,jj,jk+1) - fsp(ji,jj,jk )) / (xsp(ji,jj,jk+1) - xsp(ji,jj,jk )) 1308 1309 IF(zdf1 * zdf2 <= 0._wp) THEN 1310 zdf(jk) = 0._wp 1311 ELSE 1312 zdf(jk) = 2._wp * zdf1 * zdf2 / (zdf1 + zdf2) 1313 ENDIF 1350 1314 END DO 1351 END DO 1315 1316 zdf(1) = 1.5_wp * ( fsp(ji,jj,2) - fsp(ji,jj,1) ) / & 1317 & ( xsp(ji,jj,2) - xsp(ji,jj,1) ) - 0.5_wp * zdf(2) 1318 zdf(jpkm1) = 1.5_wp * ( fsp(ji,jj,jpkm1) - fsp(ji,jj,jpkm1-1) ) / & 1319 & ( xsp(ji,jj,jpkm1) - xsp(ji,jj,jpkm1-1) ) - 0.5_wp * zdf(jpk - 2) 1320 1321 DO jk = 1, jpk-2 1322 zdxtmp = xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1323 ztmp1 = (zdf(jk+1) + 2._wp * zdf(jk)) / zdxtmp 1324 ztmp2 = 6._wp * (fsp(ji,jj,jk+1) - fsp(ji,jj,jk)) / zdxtmp / zdxtmp 1325 zddf1 = -2._wp * ztmp1 + ztmp2 1326 ztmp1 = (2._wp * zdf(jk+1) + zdf(jk)) / zdxtmp 1327 zddf2 = 2._wp * ztmp1 - ztmp2 1328 1329 dsp(ji,jj,jk) = (zddf2 - zddf1) / 6._wp / zdxtmp 1330 csp(ji,jj,jk) = ( xsp(ji,jj,jk+1) * zddf1 - xsp(ji,jj,jk)*zddf2 ) / 2._wp / zdxtmp 1331 bsp(ji,jj,jk) = ( fsp(ji,jj,jk+1) - fsp(ji,jj,jk) ) / zdxtmp - & 1332 & csp(ji,jj,jk) * ( xsp(ji,jj,jk+1) + xsp(ji,jj,jk) ) - & 1333 & dsp(ji,jj,jk) * ((xsp(ji,jj,jk+1) + xsp(ji,jj,jk))**2 - & 1334 & xsp(ji,jj,jk+1) * xsp(ji,jj,jk)) 1335 asp(ji,jj,jk) = fsp(ji,jj,jk) - xsp(ji,jj,jk) * (bsp(ji,jj,jk) + & 1336 & (xsp(ji,jj,jk) * (csp(ji,jj,jk) + & 1337 & dsp(ji,jj,jk) * xsp(ji,jj,jk)))) 1338 END DO 1339 END_2D 1352 1340 1353 1341 ELSEIF ( polynomial_type == 2 ) THEN ! Linear 1354 DO ji = 1, jpi 1355 DO jj = 1, jpj 1356 DO jk = 1, jpkm1-1 1357 zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1358 ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 1359 1360 dsp(ji,jj,jk) = 0._wp 1361 csp(ji,jj,jk) = 0._wp 1362 bsp(ji,jj,jk) = ztmp1 / zdxtmp 1363 asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 1364 END DO 1365 END DO 1366 END DO 1342 DO_3D( 1, 1, 1, 1, 1, jpk-2 ) 1343 zdxtmp =xsp(ji,jj,jk+1) - xsp(ji,jj,jk) 1344 ztmp1 = fsp(ji,jj,jk+1) - fsp(ji,jj,jk) 1345 1346 dsp(ji,jj,jk) = 0._wp 1347 csp(ji,jj,jk) = 0._wp 1348 bsp(ji,jj,jk) = ztmp1 / zdxtmp 1349 asp(ji,jj,jk) = fsp(ji,jj,jk) - bsp(ji,jj,jk) * xsp(ji,jj,jk) 1350 END_3D 1367 1351 ! 1368 1352 ELSE -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynkeg.F90
r14776 r14787 78 78 INTEGER :: ji, jj, jk ! dummy loop indices 79 79 REAL(wp) :: zu, zv ! local scalars 80 REAL(wp), DIMENSION( jpi,jpj,jpk):: zhke80 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zhke 81 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdu, ztrdv 82 82 !!---------------------------------------------------------------------- … … 84 84 IF( ln_timing ) CALL timing_start('dyn_keg') 85 85 ! 86 IF( kt == nit000 ) THEN 87 IF(lwp) WRITE(numout,*) 88 IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend, scheme number=', kscheme 89 IF(lwp) WRITE(numout,*) '~~~~~~~' 86 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 87 IF( kt == nit000 ) THEN 88 IF(lwp) WRITE(numout,*) 89 IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend, scheme number=', kscheme 90 IF(lwp) WRITE(numout,*) '~~~~~~~' 91 ENDIF 90 92 ENDIF 91 93 … … 109 111 END_3D 110 112 CASE ( nkeg_HW ) !-- Hollingsworth scheme --! 111 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )113 DO_3D( 0, nn_hls-1, 0, nn_hls-1, 1, jpkm1 ) 112 114 ! round brackets added to fix the order of floating point operations 113 115 ! needed to ensure halo 1 - halo 2 compatibility … … 121 123 & + pvv(ji ,jj ,jk,Kmm) * pvv(ji ,jj ,jk,Kmm) ) & 122 124 & + ( ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) & 123 & + ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) * ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) & 125 & + ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) * ( pvv(ji-1,jj ,jk,Kmm) + pvv(ji+1,jj ,jk,Kmm) ) & 124 126 & ) ! bracket for halo 1 - halo 2 compatibility 125 127 zhke(ji,jj,jk) = r1_48 * ( zv + zu ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynldf_iso.F90
r14776 r14787 36 36 37 37 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: akzu, akzv !: vertical component of rotated lateral viscosity 38 39 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfuw, zdiu, zdju, zdj1u ! 2D workspace (dyn_ldf_iso)40 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: zfvw, zdiv, zdjv, zdj1v ! - -41 38 42 39 !! * Substitutions … … 54 51 !! *** ROUTINE dyn_ldf_iso_alloc *** 55 52 !!---------------------------------------------------------------------- 56 ALLOCATE( akzu(jpi,jpj,jpk) , zfuw(jpi,jpk) , zdiu(jpi,jpk) , zdju(jpi,jpk) , zdj1u(jpi,jpk) , & 57 & akzv(jpi,jpj,jpk) , zfvw(jpi,jpk) , zdiv(jpi,jpk) , zdjv(jpi,jpk) , zdj1v(jpi,jpk) , STAT=dyn_ldf_iso_alloc ) 58 ! 59 IF( dyn_ldf_iso_alloc /= 0 ) CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 53 dyn_ldf_iso_alloc = 0 54 IF( .NOT. ALLOCATED( akzu ) ) THEN 55 ALLOCATE( akzu(jpi,jpj,jpk), akzv(jpi,jpj,jpk), STAT=dyn_ldf_iso_alloc ) 56 ! 57 IF( dyn_ldf_iso_alloc /= 0 ) CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 58 ENDIF 60 59 END FUNCTION dyn_ldf_iso_alloc 61 60 … … 112 111 REAL(wp) :: zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj ! - - 113 112 REAL(wp) :: zcof0, zcof1, zcof2, zcof3, zcof4, zaht_0 ! - - 114 REAL(wp), DIMENSION(jpi,jpj) :: ziut, zivf, zdku, zdk1u ! 2D workspace 115 REAL(wp), DIMENSION(jpi,jpj) :: zjuf, zjvt, zdkv, zdk1v ! - - 113 REAL(wp), DIMENSION(A2D(nn_hls)) :: ziut, zivf, zdku, zdk1u ! 2D workspace 114 REAL(wp), DIMENSION(A2D(nn_hls)) :: zjuf, zjvt, zdkv, zdk1v ! - - 115 REAL(wp), DIMENSION(A1Di(nn_hls),jpk) :: zfuw, zdiu, zdju, zdj1u ! - - 116 REAL(wp), DIMENSION(A1Di(nn_hls),jpk) :: zfvw, zdiv, zdjv, zdj1v ! - - 116 117 !!---------------------------------------------------------------------- 117 118 ! 118 IF( kt == nit000 ) THEN 119 IF(lwp) WRITE(numout,*) 120 IF(lwp) WRITE(numout,*) 'dyn_ldf_iso : iso-neutral laplacian diffusive operator or ' 121 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate horizontal diffusive operator' 122 ! ! allocate dyn_ldf_bilap arrays 123 IF( dyn_ldf_iso_alloc() /= 0 ) CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 119 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 120 IF( kt == nit000 ) THEN 121 IF(lwp) WRITE(numout,*) 122 IF(lwp) WRITE(numout,*) 'dyn_ldf_iso : iso-neutral laplacian diffusive operator or ' 123 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate horizontal diffusive operator' 124 ! ! allocate dyn_ldf_iso arrays 125 IF( dyn_ldf_iso_alloc() /= 0 ) CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 126 ENDIF 124 127 ENDIF 125 128 … … 128 131 IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 129 132 ! 130 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) ! set the slopes of iso-level133 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) ! set the slopes of iso-level 131 134 uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 132 135 vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) … … 135 138 END_3D 136 139 ! Lateral boundary conditions on the slopes 137 IF (nn_hls ==1) CALL lbc_lnk( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp )140 IF (nn_hls == 1) CALL lbc_lnk( 'dynldf_iso', uslp , 'U', -1.0_wp, vslp , 'V', -1.0_wp, wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp ) 138 141 ! 139 142 ENDIF 140 143 141 144 zaht_0 = 0.5_wp * rn_Ud * rn_Ld ! aht_0 from namtra_ldf = zaht_max … … 150 153 ! zdkv(jk=1)=zdkv(jk=2) 151 154 152 zdk1u(:,:) = ( puu(:,:,jk,Kbb) -puu(:,:,jk+1,Kbb) ) * umask(:,:,jk+1) 153 zdk1v(:,:) = ( pvv(:,:,jk,Kbb) -pvv(:,:,jk+1,Kbb) ) * vmask(:,:,jk+1) 155 DO_2D( 1, 1, 1, 1 ) 156 zdk1u(ji,jj) = ( puu(ji,jj,jk,Kbb) -puu(ji,jj,jk+1,Kbb) ) * umask(ji,jj,jk+1) 157 zdk1v(ji,jj) = ( pvv(ji,jj,jk,Kbb) -pvv(ji,jj,jk+1,Kbb) ) * vmask(ji,jj,jk+1) 158 END_2D 154 159 155 160 IF( jk == 1 ) THEN … … 157 162 zdkv(:,:) = zdk1v(:,:) 158 163 ELSE 159 zdku(:,:) = ( puu(:,:,jk-1,Kbb) - puu(:,:,jk,Kbb) ) * umask(:,:,jk) 160 zdkv(:,:) = ( pvv(:,:,jk-1,Kbb) - pvv(:,:,jk,Kbb) ) * vmask(:,:,jk) 164 DO_2D( 1, 1, 1, 1 ) 165 zdku(ji,jj) = ( puu(ji,jj,jk-1,Kbb) - puu(ji,jj,jk,Kbb) ) * umask(ji,jj,jk) 166 zdkv(ji,jj) = ( pvv(ji,jj,jk-1,Kbb) - pvv(ji,jj,jk,Kbb) ) * vmask(ji,jj,jk) 167 END_2D 161 168 ENDIF 162 169 … … 286 293 287 294 ! ! =============== 288 DO jj = 2, jpjm1! Vertical slab295 DO jj = ntsj, ntej ! Vertical slab 289 296 ! ! =============== 290 297 … … 299 306 300 307 DO jk = 1, jpk 301 DO ji = 2, jpi308 DO ji = ntsi, ntei + nn_hls 302 309 ! i-gradient of u at jj 303 310 zdiu (ji,jk) = tmask(ji,jj ,jk) * ( puu(ji,jj ,jk,Kbb) - puu(ji-1,jj ,jk,Kbb) ) … … 311 318 END DO 312 319 DO jk = 1, jpk 313 DO ji = 1, jpim1320 DO ji = ntsi - nn_hls, ntei 314 321 ! i-gradient of v at jj 315 322 zdiv (ji,jk) = fmask(ji,jj ,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji ,jj ,jk,Kbb) ) … … 322 329 323 330 ! Surface and bottom vertical fluxes set to zero 324 DO ji = 1, jpi331 DO ji = ntsi - nn_hls, ntei + nn_hls 325 332 zfuw(ji, 1 ) = 0.e0 326 333 zfvw(ji, 1 ) = 0.e0 … … 331 338 ! interior (2=<jk=<jpk-1) on U field 332 339 DO jk = 2, jpkm1 333 DO ji = 2, jpim1340 DO ji = ntsi, ntei 334 341 zcof0 = 0.5_wp * zaht_0 * umask(ji,jj,jk) 335 342 ! … … 357 364 ! interior (2=<jk=<jpk-1) on V field 358 365 DO jk = 2, jpkm1 359 DO ji = 2, jpim1366 DO ji = ntsi, ntei 360 367 zcof0 = 0.5_wp * zaht_0 * vmask(ji,jj,jk) 361 368 ! … … 385 392 ! ------------------------------------------------------------------- 386 393 DO jk = 1, jpkm1 387 DO ji = 2, jpim1394 DO ji = ntsi, ntei 388 395 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) & 389 396 & / e3u(ji,jj,jk,Kmm) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynldf_lap_blp.F90
r14776 r14787 14 14 USE oce ! ocean dynamics and tracers 15 15 USE dom_oce ! ocean space and time domain 16 USE domutl, ONLY : is_tile 16 17 USE ldfdyn ! lateral diffusion: eddy viscosity coef. 17 18 USE ldfslp ! iso-neutral slopes … … 39 40 40 41 SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 42 !! 43 INTEGER , INTENT(in ) :: kt ! ocean time-step index 44 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 45 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 46 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pu, pv ! before velocity [m/s] 47 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 48 !! 49 CALL dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, is_tile(pu), pu_rhs, pv_rhs, is_tile(pu_rhs), kpass ) 50 END SUBROUTINE dyn_ldf_lap 51 52 53 SUBROUTINE dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, ktuv, pu_rhs, pv_rhs, ktuv_rhs, kpass ) 41 54 !!---------------------------------------------------------------------- 42 55 !! *** ROUTINE dyn_ldf_lap *** … … 52 65 !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/ 53 66 !!---------------------------------------------------------------------- 54 INTEGER , INTENT(in ) :: kt ! ocean time-step index 55 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 56 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 57 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pu, pv ! before velocity [m/s] 58 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 67 INTEGER , INTENT(in ) :: kt ! ocean time-step index 68 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 69 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 70 INTEGER , INTENT(in ) :: ktuv, ktuv_rhs 71 REAL(wp), DIMENSION(A2D_T(ktuv) ,JPK), INTENT(in ) :: pu, pv ! before velocity [m/s] 72 REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 59 73 ! 60 74 INTEGER :: ji, jj, jk ! dummy loop indices 75 INTEGER :: iij 61 76 REAL(wp) :: zsign ! local scalars 62 77 REAL(wp) :: zua, zva ! local scalars … … 65 80 !!---------------------------------------------------------------------- 66 81 ! 67 IF( kt == nit000 .AND. lwp ) THEN 68 WRITE(numout,*) 69 WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 70 WRITE(numout,*) '~~~~~~~ ' 82 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 83 IF( kt == nit000 .AND. lwp ) THEN 84 WRITE(numout,*) 85 WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 86 WRITE(numout,*) '~~~~~~~ ' 87 ENDIF 88 ENDIF 89 ! 90 ! Define pu_rhs/pv_rhs halo points for multi-point haloes in bilaplacian case 91 IF( nldf_dyn == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls 92 ELSE ; iij = 1 71 93 ENDIF 72 94 ! … … 79 101 CASE ( np_typ_rot ) !== Vorticity-Divergence operator ==! 80 102 ! 81 ALLOCATE( zcur( jpi,jpj) , zdiv(jpi,jpj) )103 ALLOCATE( zcur(A2D(nn_hls)) , zdiv(A2D(nn_hls)) ) 82 104 ! 83 105 DO jk = 1, jpkm1 ! Horizontal slab 84 106 ! 85 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls)107 DO_2D( iij-1, iij, iij-1, iij ) 86 108 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1) 87 109 zcur(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) * e3f(ji-1,jj-1,jk) * r1_e1e2f(ji-1,jj-1) & ! ahmf already * by fmask … … 94 116 END_2D 95 117 ! 96 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )! - curl( curl) + grad( div )118 DO_2D( iij-1, iij-1, iij-1, iij-1 ) ! - curl( curl) + grad( div ) 97 119 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * umask(ji,jj,jk) * ( & ! * by umask is mandatory for dyn_ldf_blp use 98 120 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & … … 110 132 CASE ( np_typ_sym ) !== Symmetric operator ==! 111 133 ! 112 ALLOCATE( zten( jpi,jpj) , zshe(jpi,jpj) )134 ALLOCATE( zten(A2D(nn_hls)) , zshe(A2D(nn_hls)) ) 113 135 ! 114 136 DO jk = 1, jpkm1 ! Horizontal slab 115 137 ! 116 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls)138 DO_2D( iij-1, iij, iij-1, iij ) 117 139 ! ! shearing stress component (F-point) NB : ahmf has already been multiplied by fmask 118 140 zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) & … … 129 151 END_2D 130 152 ! 131 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )153 DO_2D( iij-1, iij-1, iij-1, iij-1 ) 132 154 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & 133 155 & * ( ( zten(ji+1,jj ) * e2t(ji+1,jj )*e2t(ji+1,jj ) * e3t(ji+1,jj ,jk,Kmm) & … … 150 172 END SELECT 151 173 ! 152 END SUBROUTINE dyn_ldf_lap 174 END SUBROUTINE dyn_ldf_lap_t 153 175 154 176 … … 171 193 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! momentum trend 172 194 ! 173 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zulap, zvlap ! laplacian at u- and v-point 174 !!---------------------------------------------------------------------- 175 ! 176 IF( kt == nit000 ) THEN 177 IF(lwp) WRITE(numout,*) 178 IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum ' 179 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 195 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zulap, zvlap ! laplacian at u- and v-point 196 !!---------------------------------------------------------------------- 197 ! 198 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 199 IF( kt == nit000 ) THEN 200 IF(lwp) WRITE(numout,*) 201 IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum ' 202 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 203 ENDIF 180 204 ENDIF 181 205 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynvor.F90
r14776 r14787 240 240 INTEGER :: ji, jj, jk ! dummy loop indices 241 241 REAL(wp) :: zx1, zy1, zx2, zy2 ! local scalars 242 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwt ! 2D workspace 243 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zwz ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 244 !!---------------------------------------------------------------------- 245 ! 246 IF( kt == nit000 ) THEN 247 IF(lwp) WRITE(numout,*) 248 IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 249 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 242 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx, zwy, zwt ! 2D workspace 243 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zwz ! 3D workspace, jpkm1 -> avoid lbc_lnk on jpk that is not defined 244 !!---------------------------------------------------------------------- 245 ! 246 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 247 IF( kt == nit000 ) THEN 248 IF(lwp) WRITE(numout,*) 249 IF(lwp) WRITE(numout,*) 'dyn:vor_enT : vorticity term: t-point energy conserving scheme' 250 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 251 ENDIF 250 252 ENDIF 251 253 ! … … 254 256 ! 255 257 CASE ( np_RVO , np_CRV ) !* relative vorticity at f-point is used 256 ALLOCATE( zwz( jpi,jpj,jpk) )258 ALLOCATE( zwz(A2D(nn_hls),jpk) ) 257 259 DO jk = 1, jpkm1 ! Horizontal slab 258 260 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) … … 277 279 ! 278 280 CASE ( np_COR ) !* Coriolis (planetary vorticity) 279 zwt(:,:) = ff_t(:,:) * e1e2t(:,:)*e3t(:,:,jk,Kmm) 281 DO_2D( 0, 1, 0, 1 ) 282 zwt(ji,jj) = ff_t(ji,jj) * e1e2t(ji,jj)*e3t(ji,jj,jk,Kmm) 283 END_2D 280 284 CASE ( np_RVO ) !* relative vorticity 281 285 DO_2D( 0, 1, 0, 1 ) … … 356 360 INTEGER :: ji, jj, jk ! dummy loop indices 357 361 REAL(wp) :: zx1, zy1, zx2, zy2, ze3f, zmsk ! local scalars 358 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz ! 2D workspace 359 !!---------------------------------------------------------------------- 360 ! 361 IF( kt == nit000 ) THEN 362 IF(lwp) WRITE(numout,*) 363 IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 364 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 362 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx, zwy, zwz ! 2D workspace 363 !!---------------------------------------------------------------------- 364 ! 365 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 366 IF( kt == nit000 ) THEN 367 IF(lwp) WRITE(numout,*) 368 IF(lwp) WRITE(numout,*) 'dyn:vor_ene : vorticity term: energy conserving scheme' 369 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 370 ENDIF 365 371 ENDIF 366 372 ! … … 371 377 SELECT CASE( kvor ) !== vorticity considered ==! 372 378 CASE ( np_COR ) !* Coriolis (planetary vorticity) 373 zwz(:,:) = ff_f(:,:) 379 DO_2D( 1, 0, 1, 0 ) 380 zwz(ji,jj) = ff_f(ji,jj) 381 END_2D 374 382 CASE ( np_RVO ) !* relative vorticity 375 383 DO_2D( 1, 0, 1, 0 ) … … 437 445 #endif 438 446 ! !== horizontal fluxes ==! 439 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 440 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 447 DO_2D( 1, 1, 1, 1 ) 448 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 449 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 450 END_2D 441 451 ! 442 452 ! !== compute and add the vorticity term trend =! … … 483 493 INTEGER :: ji, jj, jk ! dummy loop indices 484 494 REAL(wp) :: zuav, zvau, ze3f, zmsk ! local scalars 485 REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zwz, zww ! 2D workspace 486 !!---------------------------------------------------------------------- 487 ! 488 IF( kt == nit000 ) THEN 489 IF(lwp) WRITE(numout,*) 490 IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 491 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 495 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx, zwy, zwz ! 2D workspace 496 !!---------------------------------------------------------------------- 497 ! 498 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 499 IF( kt == nit000 ) THEN 500 IF(lwp) WRITE(numout,*) 501 IF(lwp) WRITE(numout,*) 'dyn:vor_ens : vorticity term: enstrophy conserving scheme' 502 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 503 ENDIF 492 504 ENDIF 493 505 ! ! =============== … … 497 509 SELECT CASE( kvor ) !== vorticity considered ==! 498 510 CASE ( np_COR ) !* Coriolis (planetary vorticity) 499 zwz(:,:) = ff_f(:,:) 511 DO_2D( 1, 0, 1, 0 ) 512 zwz(ji,jj) = ff_f(ji,jj) 513 END_2D 500 514 CASE ( np_RVO ) !* relative vorticity 501 515 DO_2D( 1, 0, 1, 0 ) … … 564 578 #endif 565 579 ! !== horizontal fluxes ==! 566 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 567 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 580 DO_2D( 1, 1, 1, 1 ) 581 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 582 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 583 END_2D 568 584 ! 569 585 ! !== compute and add the vorticity term trend =! … … 609 625 REAL(wp) :: zua, zva ! local scalars 610 626 REAL(wp) :: zmsk, ze3f ! local scalars 611 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy , z1_e3f 612 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 613 REAL(wp), DIMENSION(jpi,jpj,jpkm1) :: zwz ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 614 !!---------------------------------------------------------------------- 615 ! 616 IF( kt == nit000 ) THEN 617 IF(lwp) WRITE(numout,*) 618 IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 619 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 627 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx , zwy , z1_e3f 628 REAL(wp), DIMENSION(A2D(nn_hls)) :: ztnw, ztne, ztsw, ztse 629 REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) :: zwz ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 630 !!---------------------------------------------------------------------- 631 ! 632 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 633 IF( kt == nit000 ) THEN 634 IF(lwp) WRITE(numout,*) 635 IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 636 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 637 ENDIF 620 638 ENDIF 621 639 ! … … 632 650 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 633 651 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 634 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 635 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 636 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 637 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 652 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 653 ze3f = ( (e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 654 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)) & 655 & + (e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 656 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk)) ) 638 657 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f 639 658 ELSE ; z1_e3f(ji,jj) = 0._wp … … 642 661 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 643 662 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 644 ze3f = ( e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 645 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk) & 646 & + e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 647 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk) ) 663 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 664 ze3f = ( (e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 665 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)) & 666 & + (e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 667 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk)) ) 648 668 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 649 669 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) … … 710 730 ! 711 731 ! !== horizontal fluxes ==! 712 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 713 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 732 DO_2D( 1, 1, 1, 1 ) 733 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 734 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 735 END_2D 714 736 ! 715 737 ! !== compute and add the vorticity term trend =! … … 762 784 REAL(wp) :: zua, zva ! local scalars 763 785 REAL(wp) :: zmsk, z1_e3t ! local scalars 764 REAL(wp), DIMENSION(jpi,jpj) :: zwx , zwy 765 REAL(wp), DIMENSION(jpi,jpj) :: ztnw, ztne, ztsw, ztse 766 REAL(wp), DIMENSION(jpi,jpj,jpkm1) :: zwz ! 3D workspace, avoid lbc_lnk on jpk that is not defined 767 !!---------------------------------------------------------------------- 768 ! 769 IF( kt == nit000 ) THEN 770 IF(lwp) WRITE(numout,*) 771 IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 772 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 786 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx , zwy 787 REAL(wp), DIMENSION(A2D(nn_hls)) :: ztnw, ztne, ztsw, ztse 788 REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) :: zwz ! 3D workspace, avoid lbc_lnk on jpk that is not defined 789 !!---------------------------------------------------------------------- 790 ! 791 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 792 IF( kt == nit000 ) THEN 793 IF(lwp) WRITE(numout,*) 794 IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 795 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 796 ENDIF 773 797 ENDIF 774 798 ! … … 785 809 CASE ( np_RVO ) !* relative vorticity 786 810 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 787 zwz(ji,jj,jk) = ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 788 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) & 811 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 812 zwz(ji,jj,jk) = ( (e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk)) & 813 & - (e1u(ji ,jj+1) * pu(ji ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)) ) & 789 814 & * r1_e1e2f(ji,jj) 790 815 END_2D … … 801 826 CASE ( np_CRV ) !* Coriolis + relative vorticity 802 827 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 803 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk) & 804 & - e1u(ji ,jj+1) * pu(ji ,jj+1,jk) + e1u(ji,jj) * pu(ji,jj,jk) ) & 805 & * r1_e1e2f(ji,jj) ) 828 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 829 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( (e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk)) & 830 & - (e1u(ji ,jj+1) * pu(ji ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)) ) & 831 & * r1_e1e2f(ji,jj) ) 806 832 END_2D 807 833 IF( ln_dynvor_msk ) THEN ! mask the relative vorticity … … 830 856 ! 831 857 ! !== horizontal fluxes ==! 832 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 833 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 858 DO_2D( 1, 1, 1, 1 ) 859 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 860 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 861 END_2D 834 862 ! 835 863 ! !== compute and add the vorticity term trend =! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynzad.F90
r14776 r14787 60 60 INTEGER :: ji, jj, jk ! dummy loop indices 61 61 REAL(wp) :: zua, zva ! local scalars 62 REAL(wp), DIMENSION( jpi,jpj) :: zww63 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zwuw, zwvw62 REAL(wp), DIMENSION(A2D(nn_hls)) :: zww 63 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zwuw, zwvw 64 64 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv 65 65 !!---------------------------------------------------------------------- … … 67 67 IF( ln_timing ) CALL timing_start('dyn_zad') 68 68 ! 69 IF( kt == nit000 ) THEN 70 IF(lwp) WRITE(numout,*) 71 IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 69 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 70 IF( kt == nit000 ) THEN 71 IF(lwp) WRITE(numout,*) 72 IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 73 ENDIF 72 74 ENDIF 73 75 … … 79 81 80 82 DO jk = 2, jpkm1 ! Vertical momentum advection at level w and u- and v- vertical 81 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) ! vertical fluxes 82 IF( ln_vortex_force ) THEN 83 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 84 ELSE 85 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 86 ENDIF 87 END_2D 88 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! vertical momentum advection at w-point 83 IF( ln_vortex_force ) THEN ! vertical fluxes 84 DO_2D( 0, 1, 0, 1 ) 85 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 86 END_2D 87 ELSE 88 DO_2D( 0, 1, 0, 1 ) 89 zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 90 END_2D 91 ENDIF 92 DO_2D( 0, 0, 0, 0 ) ! vertical momentum advection at w-point 89 93 zwuw(ji,jj,jk) = ( zww(ji+1,jj ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) ) 90 94 zwvw(ji,jj,jk) = ( zww(ji ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) ) … … 93 97 ! 94 98 ! Surface and bottom advective fluxes set to zero 95 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)99 DO_2D( 0, 0, 0, 0 ) 96 100 zwuw(ji,jj, 1 ) = 0._wp 97 101 zwvw(ji,jj, 1 ) = 0._wp … … 100 104 END_2D 101 105 ! 102 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) ! Vertical momentum advection at u- and v-points106 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Vertical momentum advection at u- and v-points 103 107 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) & 104 108 & / e3u(ji,jj,jk,Kmm) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynzdf.F90
r14776 r14787 78 78 REAL(wp) :: zWui, zWvi ! - - 79 79 REAL(wp) :: zWus, zWvs ! - - 80 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zwi, zwd, zws ! 3D workspace80 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zwi, zwd, zws ! 3D workspace 81 81 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - - 82 82 !!--------------------------------------------------------------------- … … 84 84 IF( ln_timing ) CALL timing_start('dyn_zdf') 85 85 ! 86 IF( kt == nit000 ) THEN !* initialization 87 IF(lwp) WRITE(numout,*) 88 IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 89 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 90 ! 91 If( ln_linssh ) THEN ; r_vvl = 0._wp ! non-linear free surface indicator 92 ELSE ; r_vvl = 1._wp 86 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 87 IF( kt == nit000 ) THEN !* initialization 88 IF(lwp) WRITE(numout,*) 89 IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 90 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 91 ! 92 If( ln_linssh ) THEN ; r_vvl = 0._wp ! non-linear free surface indicator 93 ELSE ; r_vvl = 1._wp 94 ENDIF 93 95 ENDIF 94 96 ENDIF -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/sshwzv.F90
r14776 r14787 103 103 ! 104 104 zhdiv(:,:) = 0._wp 105 DO_3D( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpkm1 ) ! Horizontal divergence of barotropic transports105 DO_3D( 1, nn_hls, 1, nn_hls, 1, jpkm1 ) ! Horizontal divergence of barotropic transports 106 106 zhdiv(ji,jj) = zhdiv(ji,jj) + e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk) 107 107 END_3D … … 110 110 ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 111 111 ! 112 DO_2D ( nn_hls-1, nn_hls, nn_hls-1, nn_hls )112 DO_2D_OVR( 1, nn_hls, 1, nn_hls ) ! Loop bounds limited by hdiv definition in div_hor 113 113 pssh(ji,jj,Kaa) = ( pssh(ji,jj,Kbb) - rDt * ( zcoef * ( emp_b(ji,jj) + emp(ji,jj) ) + zhdiv(ji,jj) ) ) * ssmask(ji,jj) 114 114 END_2D 115 ! pssh must be defined everywhere (true for dyn_spg_ts, not for dyn_spg_exp) 116 IF ( .NOT. ln_dynspg_ts .AND. nn_hls == 2 ) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp ) 115 117 ! 116 118 #if defined key_agrif … … 187 189 ! ! Is it problematic to have a wrong vertical velocity in boundary cells? 188 190 ! ! Same question holds for hdiv. Perhaps just for security 189 DO jk = jpkm1, 1, -1! integrate from the bottom the hor. divergence191 DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 ) ! integrate from the bottom the hor. divergence 190 192 ! computation of w 191 pww( :,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) &192 & + zhdiv(:,:,jk) &193 & + r1_Dt * ( e3t(:,:,jk,Kaa) &194 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk)195 END DO193 pww(ji,jj,jk) = pww(ji,jj,jk+1) - ( e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk) & 194 & + zhdiv(ji,jj,jk) & 195 & + r1_Dt * ( e3t(ji,jj,jk,Kaa) & 196 & - e3t(ji,jj,jk,Kbb) ) ) * tmask(ji,jj,jk) 197 END_3D 196 198 ! IF( ln_vvl_layer ) pww(:,:,:) = 0.e0 197 199 DEALLOCATE( zhdiv ) … … 199 201 ELSEIF( ln_linssh ) THEN !== linear free surface cases ==! 200 202 ! !=================================! 201 DO jk = jpkm1, 1, -1! integrate from the bottom the hor. divergence202 pww( :,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk) ) * tmask(:,:,jk)203 END DO203 DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 ) ! integrate from the bottom the hor. divergence 204 pww(ji,jj,jk) = pww(ji,jj,jk+1) - ( e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk) ) * tmask(ji,jj,jk) 205 END_3D 204 206 ! !==========================================! 205 207 ELSE !== Quasi-Eulerian vertical coordinate ==! ('key_qco') 206 208 ! !==========================================! 207 DO jk = jpkm1, 1, -1! integrate from the bottom the hor. divergence208 pww( :,:,jk) = pww(:,:,jk+1) - ( e3t(:,:,jk,Kmm) * hdiv(:,:,jk)&209 & + r1_Dt * ( e3t(:,:,jk,Kaa) &210 & - e3t(:,:,jk,Kbb) ) ) * tmask(:,:,jk)211 END DO209 DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 ) ! integrate from the bottom the hor. divergence 210 pww(ji,jj,jk) = pww(ji,jj,jk+1) - ( e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk) & 211 & + r1_Dt * ( e3t(ji,jj,jk,Kaa) & 212 & - e3t(ji,jj,jk,Kbb) ) ) * tmask(ji,jj,jk) 213 END_3D 212 214 ENDIF 213 215 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/wet_dry.F90
r14776 r14787 117 117 IF( ierr /= 0 ) CALL ctl_stop('STOP', 'wad_init : Array allocation error') 118 118 ENDIF 119 120 IF( ln_tile .AND. ln_wd_il ) CALL ctl_warn('Tiling has not been tested with ln_wd_il = T') 119 121 ! 120 122 END SUBROUTINE wad_init -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/IOM/iom.F90
r14776 r14787 2014 2014 IF( iom_use(cdname) ) THEN 2015 2015 #if defined key_xios 2016 CALL xios_send_field( cdname, pfield2d ) 2016 IF( is_tile(pfield2d) == 1 ) THEN 2017 CALL xios_send_field( cdname, pfield2d, ntile - 1 ) 2018 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2019 CALL xios_send_field( cdname, pfield2d ) 2020 ENDIF 2017 2021 #else 2018 2022 WRITE(numout,*) pfield2d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2026 2030 IF( iom_use(cdname) ) THEN 2027 2031 #if defined key_xios 2028 CALL xios_send_field( cdname, pfield2d ) 2032 IF( is_tile(pfield2d) == 1 ) THEN 2033 CALL xios_send_field( cdname, pfield2d, ntile - 1 ) 2034 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2035 CALL xios_send_field( cdname, pfield2d ) 2036 ENDIF 2029 2037 #else 2030 2038 WRITE(numout,*) pfield2d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2038 2046 IF( iom_use(cdname) ) THEN 2039 2047 #if defined key_xios 2040 CALL xios_send_field( cdname, pfield3d ) 2048 IF( is_tile(pfield3d) == 1 ) THEN 2049 CALL xios_send_field( cdname, pfield3d, ntile - 1 ) 2050 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2051 CALL xios_send_field( cdname, pfield3d ) 2052 ENDIF 2041 2053 #else 2042 2054 WRITE(numout,*) pfield3d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2050 2062 IF( iom_use(cdname) ) THEN 2051 2063 #if defined key_xios 2052 CALL xios_send_field( cdname, pfield3d ) 2064 IF( is_tile(pfield3d) == 1 ) THEN 2065 CALL xios_send_field( cdname, pfield3d, ntile - 1 ) 2066 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2067 CALL xios_send_field( cdname, pfield3d ) 2068 ENDIF 2053 2069 #else 2054 2070 WRITE(numout,*) pfield3d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2062 2078 IF( iom_use(cdname) ) THEN 2063 2079 #if defined key_xios 2064 CALL xios_send_field (cdname, pfield4d ) 2080 IF( is_tile(pfield4d) == 1 ) THEN 2081 CALL xios_send_field( cdname, pfield4d, ntile - 1 ) 2082 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2083 CALL xios_send_field( cdname, pfield4d ) 2084 ENDIF 2065 2085 #else 2066 2086 WRITE(numout,*) pfield4d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2074 2094 IF( iom_use(cdname) ) THEN 2075 2095 #if defined key_xios 2076 CALL xios_send_field (cdname, pfield4d ) 2096 IF( is_tile(pfield4d) == 1 ) THEN 2097 CALL xios_send_field( cdname, pfield4d, ntile - 1 ) 2098 ELSE IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN 2099 CALL xios_send_field( cdname, pfield4d ) 2100 ENDIF 2077 2101 #else 2078 2102 WRITE(numout,*) pfield4d ! iom_use(cdname) = .F. -> useless test to avoid compilation warnings … … 2088 2112 SUBROUTINE iom_set_domain_attr( cdid, ni_glo, nj_glo, ibegin, jbegin, ni, nj, & 2089 2113 & data_dim, data_ibegin, data_ni, data_jbegin, data_nj, lonvalue, latvalue, mask, & 2114 & ntiles, tile_ibegin, tile_jbegin, tile_ni, tile_nj, & 2115 & tile_data_ibegin, tile_data_jbegin, tile_data_ni, tile_data_nj, & 2090 2116 & nvertex, bounds_lon, bounds_lat, area ) 2091 2117 !!---------------------------------------------------------------------- … … 2093 2119 CHARACTER(LEN=*) , INTENT(in) :: cdid 2094 2120 INTEGER , OPTIONAL, INTENT(in) :: ni_glo, nj_glo, ibegin, jbegin, ni, nj 2121 INTEGER, DIMENSION(:) , OPTIONAL, INTENT(in) :: tile_ibegin, tile_jbegin, tile_ni, tile_nj 2122 INTEGER, DIMENSION(:) , OPTIONAL, INTENT(in) :: tile_data_ibegin, tile_data_jbegin, tile_data_ni, tile_data_nj 2095 2123 INTEGER , OPTIONAL, INTENT(in) :: data_dim, data_ibegin, data_ni, data_jbegin, data_nj 2096 INTEGER , OPTIONAL, INTENT(in) :: nvertex 2124 INTEGER , OPTIONAL, INTENT(in) :: nvertex, ntiles 2097 2125 REAL(dp), DIMENSION(:) , OPTIONAL, INTENT(in) :: lonvalue, latvalue 2098 2126 REAL(dp), DIMENSION(:,:), OPTIONAL, INTENT(in) :: bounds_lon, bounds_lat, area … … 2103 2131 CALL xios_set_domain_attr ( cdid, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj, & 2104 2132 & data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj , & 2133 & ntiles=ntiles, tile_ibegin=tile_ibegin, tile_jbegin=tile_jbegin, tile_ni=tile_ni, tile_nj=tile_nj, & 2134 & tile_data_ibegin=tile_data_ibegin, tile_data_jbegin=tile_data_jbegin, & 2135 & tile_data_ni=tile_data_ni, tile_data_nj=tile_data_nj, & 2105 2136 & lonvalue_1D=lonvalue, latvalue_1D=latvalue, mask_1D=mask, nvertex=nvertex, bounds_lon_1D=bounds_lon, & 2106 2137 & bounds_lat_1D=bounds_lat, area=area, type='curvilinear') … … 2109 2140 CALL xios_set_domaingroup_attr( cdid, ni_glo=ni_glo, nj_glo=nj_glo, ibegin=ibegin, jbegin=jbegin, ni=ni, nj=nj, & 2110 2141 & data_dim=data_dim, data_ibegin=data_ibegin, data_ni=data_ni, data_jbegin=data_jbegin, data_nj=data_nj , & 2142 & ntiles=ntiles, tile_ibegin=tile_ibegin, tile_jbegin=tile_jbegin, tile_ni=tile_ni, tile_nj=tile_nj, & 2143 & tile_data_ibegin=tile_data_ibegin, tile_data_jbegin=tile_data_jbegin, & 2144 & tile_data_ni=tile_data_ni, tile_data_nj=tile_data_nj, & 2111 2145 & lonvalue_1D=lonvalue, latvalue_1D=latvalue, mask_1D=mask, nvertex=nvertex, bounds_lon_1D=bounds_lon, & 2112 2146 & bounds_lat_1D=bounds_lat, area=area, type='curvilinear' ) … … 2276 2310 ! 2277 2311 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmask 2312 INTEGER :: jn 2313 INTEGER, DIMENSION(nijtile) :: ini, inj, idb 2278 2314 LOGICAL, INTENT(IN) :: ldxios, ldrxios 2279 2315 !!---------------------------------------------------------------------- … … 2281 2317 CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig0(Nis0)-1,jbegin=mjg0(Njs0)-1,ni=Ni_0,nj=Nj_0) 2282 2318 CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = -nn_hls, data_ni=jpi, data_jbegin = -nn_hls, data_nj=jpj) 2319 2320 IF( ln_tile ) THEN 2321 DO jn = 1, nijtile 2322 ini(jn) = ntei_a(jn) - ntsi_a(jn) + 1 ! Tile size in i and j 2323 inj(jn) = ntej_a(jn) - ntsj_a(jn) + 1 2324 idb(jn) = -nn_hls ! Tile data offset (halo size) 2325 END DO 2326 2327 ! Tile_[ij]begin are defined with respect to the processor data domain, so data_[ij]begin is added 2328 CALL iom_set_domain_attr("grid_"//cdgrd, ntiles=nijtile, & 2329 & tile_ibegin=ntsi_a(1:nijtile) + idb(:) - 1, tile_jbegin=ntsj_a(1:nijtile) + idb(:) - 1, & 2330 & tile_ni=ini(:), tile_nj=inj(:), & 2331 & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:), & 2332 & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:)) 2333 ENDIF 2334 2283 2335 !don't define lon and lat for restart reading context. 2284 2336 IF ( .NOT.ldrxios ) & -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ISF/isfhdiv.F90
r14776 r14787 52 52 IF ( ln_isfpar_mlt ) CALL isf_hdiv_mlt(misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par, fwfisf_par, fwfisf_par_b, phdiv) 53 53 ! 54 ! ice sheet coupling contribution 54 ! ice sheet coupling contribution 55 55 IF ( ln_isfcpl .AND. kt /= 0 ) THEN 56 56 ! … … 91 91 INTEGER :: ji, jj, jk ! dummy loop indices 92 92 INTEGER :: ikt, ikb 93 REAL(wp), DIMENSION( jpi,jpj) :: zhdiv93 REAL(wp), DIMENSION(A2D(nn_hls)) :: zhdiv 94 94 !!---------------------------------------------------------------------- 95 95 ! … … 97 97 ! 98 98 ! compute integrated divergence correction 99 zhdiv(:,:) = 0.5_wp * ( pfwf(:,:) + pfwf_b(:,:) ) * r1_rho0 / phtbl(:,:) 99 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) 100 zhdiv(ji,jj) = 0.5_wp * ( pfwf(ji,jj) + pfwf_b(ji,jj) ) * r1_rho0 / phtbl(ji,jj) 101 END_2D 100 102 ! 101 103 ! update divergence at each level affected by ice shelf top boundary layer 102 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls )104 DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) 103 105 ikt = ktop(ji,jj) 104 106 ikb = kbot(ji,jj) … … 131 133 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in ) :: pqvol 132 134 !!---------------------------------------------------------------------- 133 INTEGER :: j k135 INTEGER :: ji, jj, jk 134 136 !!---------------------------------------------------------------------- 135 137 ! 136 DO jk=1,jpk137 phdiv( :,:,jk) = phdiv(:,:,jk) + pqvol(:,:,jk) * r1_e1e2t(:,:) &138 & / e3t( :,:,jk,Kmm)139 END DO138 DO_3D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls, 1, jpk ) 139 phdiv(ji,jj,jk) = phdiv(ji,jj,jk) + pqvol(ji,jj,jk) * r1_e1e2t(ji,jj) & 140 & / e3t(ji,jj,jk,Kmm) 141 END_3D 140 142 ! 141 143 END SUBROUTINE isf_hdiv_cpl -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ISF/isftbl.F90
r14776 r14787 176 176 ! 177 177 ! get htbl 178 DO_2D( 1, 1, 1, 1)178 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 179 179 ! 180 180 ! tbl top/bottom indices initialisation … … 193 193 ! 194 194 ! get pfrac 195 DO_2D( 1, 1, 1, 1)195 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 196 196 ! 197 197 ! tbl top/bottom indices initialisation … … 227 227 ! 228 228 ! get ktbl 229 DO_2D( 1, 1, 1, 1)229 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 230 230 ! 231 231 ! determine the deepest level influenced by the boundary layer … … 261 261 ! test: this routine run with pdep = 0 should return 1 262 262 ! 263 DO_2D( 1, 1, 1, 1)263 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 264 264 ! comput ktop 265 265 ikt = 2 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
r14776 r14787 26 26 INTEGER, DIMENSION(8) :: isizej, ishtSj, ishtRj, ishtPj 27 27 INTEGER, DIMENSION(8) :: ifill, iszall 28 INTEGER, DIMENSION(8) :: jnf29 28 INTEGER, DIMENSION(:), ALLOCATABLE :: iScnt, iRcnt ! number of elements to be sent/received 30 29 INTEGER, DIMENSION(:), ALLOCATABLE :: iSdpl, iRdpl ! displacement in halos arrays … … 193 192 ! 194 193 idx = 1 195 ! MPI3 bug fix when domain decomposition has 2 columns/rows196 IF (jpni .eq. 2) THEN197 IF (jpnj .eq. 2) THEN198 jnf(1:8) = (/ 2, 1, 4, 3, 8, 7, 6, 5 /)199 ELSE200 jnf(1:8) = (/ 2, 1, 3, 4, 6, 5, 8, 7 /)201 ENDIF202 ELSE203 IF (jpnj .eq. 2) THEN204 jnf(1:8) = (/ 1, 2, 4, 3, 7, 8, 5, 6 /)205 ELSE206 jnf(1:8) = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)207 ENDIF208 ENDIF209 210 194 DO jn = 1, 8 211 ishti = ishtRi(jn f(jn))212 ishtj = ishtRj(jn f(jn))213 SELECT CASE ( ifill(jn f(jn)) )195 ishti = ishtRi(jn) 196 ishtj = ishtRj(jn) 197 SELECT CASE ( ifill(jn) ) 214 198 CASE ( jpfillnothing ) ! no filling 215 199 CASE ( jpfillmpi ) ! fill with data received by MPI 216 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn f(jn)) ; DO ji = 1,isizei(jnf(jn))200 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn) ; DO ji = 1,isizei(jn) 217 201 ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idx) 218 202 idx = idx + 1 219 203 END DO ; END DO ; END DO ; END DO ; END DO 220 204 CASE ( jpfillperio ) ! use periodicity 221 ishti2 = ishtPi(jn f(jn))222 ishtj2 = ishtPj(jn f(jn))223 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn f(jn)) ; DO ji = 1,isizei(jnf(jn))205 ishti2 = ishtPi(jn) 206 ishtj2 = ishtPj(jn) 207 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn) ; DO ji = 1,isizei(jn) 224 208 ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 225 209 END DO ; END DO ; END DO ; END DO ; END DO 226 210 CASE ( jpfillcopy ) ! filling with inner domain values 227 ishti2 = ishtSi(jn f(jn))228 ishtj2 = ishtSj(jn f(jn))229 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn f(jn)) ; DO ji = 1,isizei(jnf(jn))211 ishti2 = ishtSi(jn) 212 ishtj2 = ishtSj(jn) 213 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn) ; DO ji = 1,isizei(jn) 230 214 ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl) 231 215 END DO ; END DO ; END DO ; END DO ; END DO 232 216 CASE ( jpfillcst ) ! filling with constant value 233 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn f(jn)) ; DO ji = 1,isizei(jnf(jn))217 DO jf = 1, ipf ; DO jl = 1, ipl ; DO jk = 1, ipk ; DO jj = 1,isizej(jn) ; DO ji = 1,isizei(jn) 234 218 ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland 235 219 END DO ; END DO ; END DO ; END DO ; END DO -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/LDF/ldftra.F90
r14776 r14787 729 729 INTEGER , INTENT(in ) :: Kmm, Krhs ! ocean time level indices 730 730 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 731 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pu ! in : 3 ocean transport components [m3/s] 732 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pv ! out: 3 ocean transport components [m3/s] 733 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pw ! increased by the eiv [m3/s] 731 ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 732 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu ! in : 3 ocean transport components [m3/s] 733 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pv ! out: 3 ocean transport components [m3/s] 734 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pw ! increased by the eiv [m3/s] 734 735 !! 735 736 INTEGER :: ji, jj, jk ! dummy loop indices … … 739 740 !!---------------------------------------------------------------------- 740 741 ! 741 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile742 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 742 743 IF( kt == kit000 ) THEN 743 744 IF(lwp) WRITE(numout,*) … … 758 759 END_3D 759 760 ! 760 DO_3D ( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )761 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 761 762 pu(ji,jj,jk) = pu(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) ) 762 763 pv(ji,jj,jk) = pv(ji,jj,jk) - ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) ) 763 764 END_3D 764 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )765 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 765 766 pw(ji,jj,jk) = pw(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj ,jk) & 766 & 767 & + zpsi_vw(ji,jj,jk) - zpsi_vw(ji ,jj-1,jk) ) 767 768 END_3D 768 769 ! … … 783 784 !! 784 785 !!---------------------------------------------------------------------- 785 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in out) :: psi_uw, psi_vw ! streamfunction [m3/s]786 INTEGER , INTENT(in ) :: Kmm! ocean time level indices786 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in) :: psi_uw, psi_vw ! streamfunction [m3/s] 787 INTEGER , INTENT(in) :: Kmm ! ocean time level indices 787 788 ! 788 789 INTEGER :: ji, jj, jk ! dummy loop indices -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/OBS/diaobs.F90
r14776 r14787 687 687 & nit000, idaystp, jvar, & 688 688 & zprofvar(:,:,:,jvar), & 689 & gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm), & 689 & gdept(:,:,:,Kmm), gdepw(:,:,:,Kmm), & 690 690 & zprofmask(:,:,:,jvar), & 691 691 & zglam(:,:,jvar), zgphi(:,:,jvar), & -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/SBC/sbcmod.F90
r14776 r14787 475 475 END SELECT 476 476 477 IF( ln_icebergs ) THEN 478 CALL icb_stp( kt, Kmm ) ! compute icebergs 479 ! Icebergs do not melt over the haloes. 480 ! So emp values over the haloes are no more consistent with the inner domain values. 481 ! A lbc_lnk is therefore needed to ensure reproducibility and restartability. 482 ! see ticket #2113 for discussion about this lbc_lnk. 483 IF( .NOT. ln_passive_mode ) CALL lbc_lnk( 'sbcmod', emp, 'T', 1.0_wp ) ! ensure restartability with icebergs 477 IF( ln_icebergs ) CALL icb_stp( kt, Kmm ) ! compute icebergs 478 479 ! Icebergs do not melt over the haloes. 480 ! So emp values over the haloes are no more consistent with the inner domain values. 481 ! A lbc_lnk is therefore needed to ensure reproducibility and restartability. 482 ! see ticket #2113 for discussion about this lbc_lnk. 483 ! The lbc_lnk is also needed for SI3 with nn_hls > 1 as emp is not yet defined for these points in iceupdate.F90 484 IF( (ln_icebergs .AND. .NOT. ln_passive_mode) .OR. (nn_ice == 2 .AND. nn_hls == 2) ) THEN 485 CALL lbc_lnk( 'sbcmod', emp, 'T', 1.0_wp ) 484 486 ENDIF 485 487 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/SBC/sbcrnf.F90
r14776 r14787 206 206 IF( ln_rnf_depth .OR. ln_rnf_depth_ini ) THEN !== runoff distributed over several levels ==! 207 207 IF( ln_linssh ) THEN !* constant volume case : just apply the runoff input flow 208 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls )208 DO_2D_OVR( nn_hls-1, nn_hls, nn_hls-1, nn_hls ) 209 209 DO jk = 1, nk_rnf(ji,jj) 210 210 phdivn(ji,jj,jk) = phdivn(ji,jj,jk) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / h_rnf(ji,jj) … … 212 212 END_2D 213 213 ELSE !* variable volume case 214 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls )! update the depth over which runoffs are distributed214 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) ! update the depth over which runoffs are distributed 215 215 h_rnf(ji,jj) = 0._wp 216 216 DO jk = 1, nk_rnf(ji,jj) ! recalculates h_rnf to be the depth in metres … … 224 224 ENDIF 225 225 ELSE !== runoff put only at the surface ==! 226 h_rnf (:,:) = e3t (:,:,1,Kmm) ! update h_rnf to be depth of top box 227 phdivn(:,:,1) = phdivn(:,:,1) - ( rnf(:,:) + rnf_b(:,:) ) * zfact * r1_rho0 / e3t(:,:,1,Kmm) 226 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 227 h_rnf (ji,jj) = e3t (ji,jj,1,Kmm) ! update h_rnf to be depth of top box 228 phdivn(ji,jj,1) = phdivn(ji,jj,1) - ( rnf(ji,jj) + rnf_b(ji,jj) ) * zfact * r1_rho0 / e3t(ji,jj,1,Kmm) 229 END_2D 228 230 ENDIF 229 231 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/SBC/sbcssr.F90
r14776 r14787 95 95 ! 96 96 IF( nn_sstr == 1 ) THEN !* Temperature restoring term 97 DO_2D( 1, 1, 1, 1)97 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 98 98 zqrp = rn_dqdt * ( sst_m(ji,jj) - sf_sst(1)%fnow(ji,jj,1) ) * tmask(ji,jj,1) 99 99 qns(ji,jj) = qns(ji,jj) + zqrp … … 105 105 ! use fraction of ice ( fr_i ) to adjust relaxation under ice if nn_sssr_ice .ne. 1 106 106 ! n.b. coefice is initialised and fixed to 1._wp if nn_sssr_ice = 1 107 DO_2D( 1, 1, 1, 1)107 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 108 108 SELECT CASE ( nn_sssr_ice ) 109 109 CASE ( 0 ) ; coefice(ji,jj) = 1._wp - fr_i(ji,jj) ! no/reduced damping under ice … … 115 115 IF( nn_sssr == 1 ) THEN !* Salinity damping term (salt flux only (sfx)) 116 116 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 117 DO_2D( 1, 1, 1, 1)117 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 118 118 zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 119 119 & * coefice(ji,jj) & ! Optional control of damping under sea-ice … … 126 126 zsrp = rn_deds / rday ! from [mm/day] to [kg/m2/s] 127 127 zerp_bnd = rn_sssr_bnd / rday ! - - 128 DO_2D( 1, 1, 1, 1)128 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 129 129 zerp = zsrp * ( 1. - 2.*rnfmsk(ji,jj) ) & ! No damping in vicinity of river mouths 130 130 & * coefice(ji,jj) & ! Optional control of damping under sea-ice -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/eosbn2.F90
r14776 r14787 577 577 578 578 SUBROUTINE eos_insitu_pot_2d( pts, prhop ) 579 !! 580 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 581 ! ! 2 : salinity [psu] 582 REAL(wp), DIMENSION(:,:) , INTENT( out) :: prhop ! potential density (surface referenced) 583 !! 584 CALL eos_insitu_pot_2d_t( pts, is_tile(pts), prhop, is_tile(prhop) ) 585 END SUBROUTINE eos_insitu_pot_2d 586 587 588 SUBROUTINE eos_insitu_pot_2d_t( pts, ktts, prhop, ktrhop ) 579 589 !!---------------------------------------------------------------------- 580 590 !! *** ROUTINE eos_insitu_pot *** … … 589 599 !! 590 600 !!---------------------------------------------------------------------- 591 REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 601 INTEGER , INTENT(in ) :: ktts, ktrhop 602 REAL(wp), DIMENSION(A2D_T(ktts),JPTS), INTENT(in ) :: pts ! 1 : potential temperature [Celsius] 592 603 ! ! 2 : salinity [psu] 593 REAL(wp), DIMENSION( jpi,jpj), INTENT( out) :: prhop ! potential density (surface referenced)604 REAL(wp), DIMENSION(A2D_T(ktrhop) ), INTENT( out) :: prhop ! potential density (surface referenced) 594 605 ! 595 606 INTEGER :: ji, jj, jk, jsmp ! dummy loop indices … … 606 617 CASE( np_teos10, np_eos80 ) !== polynomial TEOS-10 / EOS-80 ==! 607 618 ! 608 DO_2D( 1, 1, 1, 1)609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 619 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 620 ! 621 zt = pts (ji,jj,jp_tem) * r1_T0 ! temperature 622 zs = SQRT( ABS( pts(ji,jj,jp_sal) + rdeltaS ) * r1_S0 ) ! square root salinity 623 ztm = tmask(ji,jj,1) ! tmask 624 ! 625 zn0 = (((((EOS060*zt & 626 & + EOS150*zs+EOS050)*zt & 627 & + (EOS240*zs+EOS140)*zs+EOS040)*zt & 628 & + ((EOS330*zs+EOS230)*zs+EOS130)*zs+EOS030)*zt & 629 & + (((EOS420*zs+EOS320)*zs+EOS220)*zs+EOS120)*zs+EOS020)*zt & 630 & + ((((EOS510*zs+EOS410)*zs+EOS310)*zs+EOS210)*zs+EOS110)*zs+EOS010)*zt & 631 & + (((((EOS600*zs+EOS500)*zs+EOS400)*zs+EOS300)*zs+EOS200)*zs+EOS100)*zs+EOS000 632 ! 633 ! 634 prhop(ji,jj) = zn0 * ztm ! potential density referenced at the surface 635 ! 636 END_2D 626 637 627 638 CASE( np_seos ) !== simplified EOS ==! 628 639 ! 629 DO_2D( 1, 1, 1, 1)640 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 630 641 zt = pts (ji,jj,jp_tem) - 10._wp 631 642 zs = pts (ji,jj,jp_sal) - 35._wp … … 646 657 IF( ln_timing ) CALL timing_stop('eos-pot') 647 658 ! 648 END SUBROUTINE eos_insitu_pot_2d 659 END SUBROUTINE eos_insitu_pot_2d_t 649 660 650 661 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv.F90
r14776 r14787 18 18 USE oce ! ocean dynamics and active tracers 19 19 USE dom_oce ! ocean space and time domain 20 ! TEMP: [tiling] This change not necessary after extended haloes development20 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 21 21 USE domtile 22 22 USE domvvl ! variable vertical scale factors … … 93 93 ! 94 94 INTEGER :: ji, jj, jk ! dummy loop index 95 ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) if using XIOS (subdomain support)95 ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 96 96 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zuu, zvv, zww ! 3D workspace 97 97 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 98 ! TEMP: [tiling] This change not necessary after extra haloes development98 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 99 99 LOGICAL :: lskip 100 100 !!---------------------------------------------------------------------- … … 104 104 lskip = .FALSE. 105 105 106 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support)107 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile106 ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 107 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 108 108 ALLOCATE( zuu(jpi,jpj,jpk), zvv(jpi,jpj,jpk), zww(jpi,jpj,jpk) ) 109 109 ENDIF 110 110 111 ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk removed from tra_adv_*) and if XIOS has subdomain support (ldf_eiv_dia) 112 IF( nadv /= np_CEN .OR. (nadv == np_CEN .AND. nn_cen_h == 4) .OR. ln_ldfeiv_dia ) THEN 113 IF( ln_tile ) THEN 114 IF( ntile == 1 ) THEN 115 CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) 116 ELSE 117 lskip = .TRUE. 118 ENDIF 111 ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 112 IF( ln_tile .AND. nadv == np_FCT ) THEN 113 IF( ntile == 1 ) THEN 114 CALL dom_tile_stop( ldhold=.TRUE. ) 115 ELSE 116 lskip = .TRUE. 119 117 ENDIF 120 118 ENDIF … … 122 120 ! !== effective transport ==! 123 121 IF( ln_wave .AND. ln_sdw ) THEN 124 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )122 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 125 123 zuu(ji,jj,jk) = e2u (ji,jj) * e3u(ji,jj,jk,Kmm) * ( uu(ji,jj,jk,Kmm) + usd(ji,jj,jk) ) 126 124 zvv(ji,jj,jk) = e1v (ji,jj) * e3v(ji,jj,jk,Kmm) * ( vv(ji,jj,jk,Kmm) + vsd(ji,jj,jk) ) … … 128 126 END_3D 129 127 ELSE 130 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )128 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 131 129 zuu(ji,jj,jk) = e2u (ji,jj) * e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm) ! eulerian transport only 132 130 zvv(ji,jj,jk) = e1v (ji,jj) * e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) … … 136 134 ! 137 135 IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN ! add z-tilde and/or vvl corrections 138 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )136 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 139 137 zuu(ji,jj,jk) = zuu(ji,jj,jk) + un_td(ji,jj,jk) 140 138 zvv(ji,jj,jk) = zvv(ji,jj,jk) + vn_td(ji,jj,jk) … … 142 140 ENDIF 143 141 ! 144 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls)142 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 145 143 zuu(ji,jj,jpk) = 0._wp ! no transport trough the bottom 146 144 zvv(ji,jj,jpk) = 0._wp … … 148 146 END_2D 149 147 ! 150 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support)151 148 IF( ln_ldfeiv .AND. .NOT. ln_traldf_triad ) & 152 & CALL ldf_eiv_trp( kt, nit000, zuu(A2D(nn_hls),:), zvv(A2D(nn_hls),:), zww(A2D(nn_hls),:), & 153 & 'TRA', Kmm, Krhs ) ! add the eiv transport (if necessary) 154 ! 155 IF( ln_mle ) CALL tra_mle_trp( kt, nit000, zuu(A2D(nn_hls),:), zvv(A2D(nn_hls),:), zww(A2D(nn_hls),:), & 156 & 'TRA', Kmm ) ! add the mle transport (if necessary) 157 ! 158 ! TEMP: [tiling] This change not necessary if using XIOS (subdomain support) 159 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 149 & CALL ldf_eiv_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm, Krhs ) ! add the eiv transport (if necessary) 150 ! 151 IF( ln_mle ) CALL tra_mle_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm ) ! add the mle transport (if necessary) 152 ! 153 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 154 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 160 155 CALL iom_put( "uocetr_eff", zuu ) ! output effective transport 161 156 CALL iom_put( "vocetr_eff", zvv ) … … 163 158 ENDIF 164 159 ! 165 166 ! TEMP: [tiling] This c hange not necessary if using XIOS (subdomain support)160 !!gm ??? 161 ! TEMP: [tiling] This copy-in not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 167 162 CALL dia_ptr( kt, Kmm, zvv(A2D(nn_hls),:) ) ! diagnose the effective MSF 168 163 !!gm ??? 169 164 ! 170 165 … … 216 211 ENDIF 217 212 218 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_adv_*) and if XIOS has subdomain support (ldf_eiv_dia) 219 IF( ln_tile .AND. ntile == 0 ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 1 ) 220 213 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 214 IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE. ) 221 215 ENDIF 222 216 ! ! print mean trends (used for debugging) … … 224 218 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 225 219 226 ! TEMP: [tiling] This change not necessary if using XIOS (subdomain support)227 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only for the full domain220 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 221 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the full domain 228 222 DEALLOCATE( zuu, zvv, zww ) 229 223 ENDIF … … 297 291 CALL ctl_stop( 'tra_adv_init: FCT scheme, choose 2nd or 4th order' ) 298 292 ENDIF 293 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 294 IF( ln_traadv_fct .AND. ln_tile ) THEN 295 CALL ctl_warn( 'tra_adv_init: FCT scheme does not yet work with tiling' ) 296 ENDIF 299 297 IF( ln_traadv_ubs .AND. ( nn_ubs_v /= 2 .AND. nn_ubs_v /= 4 ) ) THEN ! UBS 300 298 CALL ctl_stop( 'tra_adv_init: UBS scheme, choose 2nd or 4th order' ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_cen.F90
r14776 r14787 71 71 INTEGER , INTENT(in ) :: kn_cen_h ! =2/4 (2nd or 4th order scheme) 72 72 INTEGER , INTENT(in ) :: kn_cen_v ! =2/4 (2nd or 4th order scheme) 73 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)73 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 74 74 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 75 75 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 82 82 !!---------------------------------------------------------------------- 83 83 ! 84 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile84 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 85 85 IF( kt == kit000 ) THEN 86 86 IF(lwp) WRITE(numout,*) … … 119 119 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 120 120 END_3D 121 IF (nn_hls==1) CALL lbc_lnk( 'traadv_cen', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp , ld4only= .TRUE.) ! Lateral boundary cond.121 IF (nn_hls==1) CALL lbc_lnk( 'traadv_cen', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp ) ! Lateral boundary cond. 122 122 ! 123 123 DO_3D( nn_hls-1, 0, nn_hls-1, 0, 1, jpkm1 ) ! Horizontal advective fluxes -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct.F90
r14776 r14787 81 81 INTEGER , INTENT(in ) :: kn_fct_v ! order of the FCT scheme (=2 or 4) 82 82 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 83 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)83 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case 84 84 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 85 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 95 95 !!---------------------------------------------------------------------- 96 96 ! 97 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile97 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 98 98 IF( kt == kit000 ) THEN 99 99 IF(lwp) WRITE(numout,*) … … 136 136 ! If adaptive vertical advection, check if it is needed on this PE at this time 137 137 IF( ln_zad_Aimp ) THEN 138 IF( MAXVAL( ABS( wi(A2D( nn_hls),:) ) ) > 0._wp ) ll_zAimp = .TRUE.138 IF( MAXVAL( ABS( wi(A2D(1),:) ) ) > 0._wp ) ll_zAimp = .TRUE. 139 139 END IF 140 140 ! If active adaptive vertical advection, build tridiagonal matrix … … 239 239 END DO 240 240 ! NOTE [ comm_cleanup ] : need to change sign to ensure halo 1 - halo 2 compatibility 241 CALL lbc_lnk( 'traadv_fct', zltu, 'T', -1.0_wp , zltv, 'T', -1.0_wp , ld4only= .TRUE.) ! Lateral boundary cond. (unchanged sgn)241 CALL lbc_lnk( 'traadv_fct', zltu, 'T', -1.0_wp , zltv, 'T', -1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 242 242 ! 243 243 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) … … 262 262 ztv(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 263 263 END_3D 264 IF (nn_hls==1) CALL lbc_lnk( 'traadv_fct', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp , ld4only= .TRUE.) ! Lateral boundary cond. (unchanged sgn)264 IF (nn_hls==1) CALL lbc_lnk( 'traadv_fct', ztu, 'U', -1.0_wp , ztv, 'V', -1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 265 265 ! 266 266 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Horizontal advective fluxes … … 455 455 END_2D 456 456 END DO 457 IF (nn_hls==1) CALL lbc_lnk( 'traadv_fct', zbetup, 'T', 1.0_wp , zbetdo, 'T', 1.0_wp , ld4only= .TRUE.) ! lateral boundary cond. (unchanged sign)457 IF (nn_hls==1) CALL lbc_lnk( 'traadv_fct', zbetup, 'T', 1.0_wp , zbetdo, 'T', 1.0_wp ) ! lateral boundary cond. (unchanged sign) 458 458 459 459 ! 3. monotonic flux in the i & j direction (paa & pbb) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct_lf.F90
r14776 r14787 270 270 END_2D 271 271 END DO 272 IF(nn_hls .EQ. 1) THEN 273 CALL lbc_lnk( 'traadv_fct', zltu_3d, 'T', 1.0_wp , zltv_3d, 'T', 1.0_wp, ld4only= .TRUE. ) ! Lateral boundary cond. (unchanged sgn) 274 ELSE 275 CALL lbc_lnk( 'traadv_fct', zltu_3d, 'T', 1.0_wp , zltv_3d, 'T', 1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 276 ENDIF 272 CALL lbc_lnk( 'traadv_fct', zltu_3d, 'T', 1.0_wp , zltv_3d, 'T', 1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 277 273 ! ! 278 274 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_mus.F90
r14776 r14787 81 81 LOGICAL , INTENT(in ) :: ld_msc_ups ! use upstream scheme within muscl 82 82 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 83 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)83 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 84 84 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 85 85 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 93 93 !!---------------------------------------------------------------------- 94 94 ! 95 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile95 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 96 96 IF( kt == kit000 ) THEN 97 97 IF(lwp) WRITE(numout,*) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_qck.F90
r14776 r14787 91 91 INTEGER , INTENT(in ) :: kjpt ! number of tracers 92 92 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 93 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)93 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 94 94 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume transport components 95 95 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 96 96 !!---------------------------------------------------------------------- 97 97 ! 98 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile98 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 99 99 IF( kt == kit000 ) THEN 100 100 IF(lwp) WRITE(numout,*) … … 129 129 INTEGER , INTENT(in ) :: kjpt ! number of tracers 130 130 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 131 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)131 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 132 132 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU ! i-velocity components 133 133 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 149 149 zfd(ji,jj,jk) = pt(ji+1,jj,jk,jn,Kbb) ! Downstream in the x-direction for the tracer 150 150 END_3D 151 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp , ld4only= .TRUE.) ! Lateral boundary conditions151 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 152 152 153 153 ! … … 176 176 zfu(ji,jj,jk) = tmask(ji-1,jj,jk) + tmask(ji,jj,jk) + tmask(ji+1,jj,jk) - 2. 177 177 END_3D 178 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp , ld4only= .TRUE.) ! Lateral boundary conditions178 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 179 179 180 180 ! … … 214 214 INTEGER , INTENT(in ) :: kjpt ! number of tracers 215 215 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 216 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)216 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 217 217 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pV ! j-velocity components 218 218 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 229 229 zfd(:,:,:) = 0.0 ; zwy(:,:,:) = 0.0 230 230 ! 231 DO jk = 1, jpkm1 232 ! 233 !--- Computation of the ustream and downstream value of the tracer and the mask 234 DO_2D( 0, 0, nn_hls-1, nn_hls-1 ) 235 ! Upstream in the x-direction for the tracer 236 zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) 237 ! Downstream in the x-direction for the tracer 238 zfd(ji,jj,jk) = pt(ji,jj+1,jk,jn,Kbb) 239 END_2D 240 END DO 241 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp, ld4only= .TRUE. ) ! Lateral boundary conditions 231 !--- Computation of the ustream and downstream value of the tracer and the mask 232 DO_3D( 0, 0, nn_hls-1, nn_hls-1, 1, jpkm1 ) 233 ! Upstream in the x-direction for the tracer 234 zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) 235 ! Downstream in the x-direction for the tracer 236 zfd(ji,jj,jk) = pt(ji,jj+1,jk,jn,Kbb) 237 END_3D 238 239 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp ) ! Lateral boundary conditions 242 240 243 241 ! … … 268 266 zfu(ji,jj,jk) = tmask(ji,jj-1,jk) + tmask(ji,jj,jk) + tmask(ji,jj+1,jk) - 2. 269 267 END_3D 270 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp , ld4only= .TRUE.) !--- Lateral boundary conditions268 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfu(:,:,:), 'T', 1.0_wp ) !--- Lateral boundary conditions 271 269 ! 272 270 ! Tracer flux on the x-direction … … 306 304 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 307 305 INTEGER , INTENT(in ) :: kjpt ! number of tracers 308 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)306 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 309 307 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pW ! vertical velocity 310 308 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 365 363 !---------------------------------------------------------------------- 366 364 ! 367 DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )365 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 368 366 zc = puc(ji,jj,jk) ! Courant number 369 367 zcurv = pfd(ji,jj,jk) + pfu(ji,jj,jk) - 2. * pfc(ji,jj,jk) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_ubs.F90
r14776 r14787 92 92 INTEGER , INTENT(in ) :: kn_ubs_v ! number of tracers 93 93 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 94 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)94 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 95 95 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume transport components 96 96 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 103 103 !!---------------------------------------------------------------------- 104 104 ! 105 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile105 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 106 106 IF( kt == kit000 ) THEN 107 107 IF(lwp) WRITE(numout,*) … … 140 140 ! 141 141 END DO 142 IF (nn_hls==1) CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1.0_wp, zltv, 'T', 1.0_wp , ld4only= .TRUE.) ! Lateral boundary cond. (unchanged sgn)142 IF (nn_hls==1) CALL lbc_lnk( 'traadv_ubs', zltu, 'T', 1.0_wp, zltv, 'T', 1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 143 143 ! 144 144 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) !== Horizontal advective fluxes ==! (UBS) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traatf_qco.F90
r14776 r14787 146 146 ENDIF 147 147 ! 148 IF (nn_hls==1)CALL lbc_lnk( 'traatfqco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._wp )148 CALL lbc_lnk( 'traatfqco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._wp ) 149 149 ! 150 150 ENDIF -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/trabbc.F90
r14776 r14787 102 102 ENDIF 103 103 ! 104 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only for the full domain 105 CALL iom_put ( "hfgeou" , rho0_rcp * qgh_trd0(:,:) ) 106 ENDIF 104 CALL iom_put ( "hfgeou" , rho0_rcp * qgh_trd0(:,:) ) 105 107 106 IF(sn_cfctl%l_prtctl) CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' bbc - Ta: ', mask1=tmask, clinfo3='tra-ta' ) 108 107 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/trabbl.F90
r14776 r14787 126 126 CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' bbl_ldf - Ta: ', mask1=tmask, & 127 127 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 128 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 129 CALL iom_put( "ahu_bbl", ahu_bbl ) ! bbl diffusive flux i-coef 130 CALL iom_put( "ahv_bbl", ahv_bbl ) ! bbl diffusive flux j-coef 131 ENDIF 128 CALL iom_put( "ahu_bbl", ahu_bbl ) ! bbl diffusive flux i-coef 129 CALL iom_put( "ahv_bbl", ahv_bbl ) ! bbl diffusive flux j-coef 132 130 ! 133 131 ENDIF … … 139 137 CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' bbl_adv - Ta: ', mask1=tmask, & 140 138 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 141 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 142 ! lateral boundary conditions ; just need for outputs 143 CALL iom_put( "uoce_bbl", utr_bbl ) ! bbl i-transport 144 CALL iom_put( "voce_bbl", vtr_bbl ) ! bbl j-transport 145 ENDIF 139 CALL iom_put( "uoce_bbl", utr_bbl ) ! bbl i-transport 140 CALL iom_put( "voce_bbl", vtr_bbl ) ! bbl j-transport 146 141 ! 147 142 ENDIF … … 214 209 215 210 211 ! NOTE: [tiling] tiling changes the results, but only the order of floating point operations is different 216 212 SUBROUTINE tra_bbl_adv( pt, pt_rhs, kjpt, Kmm ) 217 213 !!---------------------------------------------------------------------- … … 237 233 INTEGER :: iis , iid , ijs , ijd ! local integers 238 234 INTEGER :: ikus, ikud, ikvs, ikvd ! - - 239 INTEGER :: isi, isj ! - -240 235 REAL(wp) :: zbtr, ztra ! local scalars 241 236 REAL(wp) :: zu_bbl, zv_bbl ! - - 242 237 !!---------------------------------------------------------------------- 243 !244 IF( ntsi == Nis0 ) THEN ; isi = 1 ; ELSE ; isi = 0 ; ENDIF ! Avoid double-counting when using tiling245 IF( ntsj == Njs0 ) THEN ; isj = 1 ; ELSE ; isj = 0 ; ENDIF246 238 ! ! =========== 247 239 DO jn = 1, kjpt ! tracer loop 248 240 ! ! =========== 249 DO_2D ( isi, 0, isj, 0 ) ! CAUTION start from i=1 to update i=2 when cyclic east-west241 DO_2D_OVR( 1, 0, 1, 0 ) ! CAUTION start from i=1 to update i=2 when cyclic east-west 250 242 IF( utr_bbl(ji,jj) /= 0.e0 ) THEN ! non-zero i-direction bbl advection 251 243 ! down-slope i/k-indices (deep) & up-slope i/k indices (shelf) … … 339 331 !!---------------------------------------------------------------------- 340 332 ! 341 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile333 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 342 334 IF( kt == kit000 ) THEN 343 335 IF(lwp) WRITE(numout,*) … … 362 354 IF( nn_bbl_ldf == 1 ) THEN ! diffusive bbl ! 363 355 ! !-------------------! 364 DO_2D ( 1, 0, 1, 0 ) ! (criteria for non zero flux: grad(rho).grad(h) < 0 )356 DO_2D_OVR( 1, 0, 1, 0 ) ! (criteria for non zero flux: grad(rho).grad(h) < 0 ) 365 357 ! ! i-direction 366 358 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point … … 392 384 ! 393 385 CASE( 1 ) != use of upper velocity 394 DO_2D ( 1, 0, 1, 0 ) ! criteria: grad(rho).grad(h)<0 and grad(rho).grad(h)<0386 DO_2D_OVR( 1, 0, 1, 0 ) ! criteria: grad(rho).grad(h)<0 and grad(rho).grad(h)<0 395 387 ! ! i-direction 396 388 za = zab(ji+1,jj,jp_tem) + zab(ji,jj,jp_tem) ! 2*(alpha,beta) at u-point … … 421 413 CASE( 2 ) != bbl velocity = F( delta rho ) 422 414 zgbbl = grav * rn_gambbl 423 DO_2D ( 1, 0, 1, 0 ) ! criteria: rho_up > rho_down415 DO_2D_OVR( 1, 0, 1, 0 ) ! criteria: rho_up > rho_down 424 416 ! ! i-direction 425 417 ! down-slope T-point i/k-index (deep) & up-slope T-point i/k-index (shelf) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traisf.F90
r14776 r14787 47 47 IF( ln_timing ) CALL timing_start('tra_isf') 48 48 ! 49 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile49 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 50 50 IF( kt == nit000 ) THEN 51 51 IF(lwp) WRITE(numout,*) … … 79 79 ! 80 80 IF ( ln_isfdebug ) THEN 81 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only for the full domain81 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the full domain 82 82 CALL debug('tra_isf: pts(:,:,:,:,Krhs) T', pts(:,:,:,1,Krhs)) 83 83 CALL debug('tra_isf: pts(:,:,:,:,Krhs) S', pts(:,:,:,2,Krhs)) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf.F90
r14776 r14787 17 17 USE oce ! ocean dynamics and tracers 18 18 USE dom_oce ! ocean space and time domain 19 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*)20 USE domtile21 19 USE phycst ! physical constants 22 20 USE ldftra ! lateral diffusion: eddy diffusivity & EIV coeff. … … 58 56 !! 59 57 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds 60 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*)61 LOGICAL :: lskip62 58 !!---------------------------------------------------------------------- 63 59 ! 64 60 IF( ln_timing ) CALL timing_start('tra_ldf') 65 61 ! 66 lskip = .FALSE.67 68 62 IF( l_trdtra ) THEN !* Save ta and sa trends 69 63 ALLOCATE( ztrdt(jpi,jpj,jpk) , ztrds(jpi,jpj,jpk) ) … … 71 65 ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) 72 66 ENDIF 73 74 ! TEMP: [tiling] These changes not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 75 IF( nldf_tra == np_blp .OR. nldf_tra == np_blp_i .OR. nldf_tra == np_blp_it ) THEN 76 IF( ln_tile ) THEN 77 IF( ntile == 1 ) THEN 78 CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) 79 ELSE 80 lskip = .TRUE. 81 ENDIF 82 ENDIF 83 ENDIF 84 IF( .NOT. lskip ) THEN 85 ! 86 SELECT CASE ( nldf_tra ) !* compute lateral mixing trend and add it to the general trend 87 CASE ( np_lap ) ! laplacian: iso-level operator 88 CALL tra_ldf_lap ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 89 CASE ( np_lap_i ) ! laplacian: standard iso-neutral operator (Madec) 90 CALL tra_ldf_iso ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 91 CASE ( np_lap_it ) ! laplacian: triad iso-neutral operator (griffies) 92 CALL tra_ldf_triad( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 93 CASE ( np_blp , np_blp_i , np_blp_it ) ! bilaplacian: iso-level & iso-neutral operators 94 CALL tra_ldf_blp ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, nldf_tra ) 95 END SELECT 96 ! 97 IF( l_trdtra ) THEN !* save the horizontal diffusive trends for further diagnostics 98 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 99 ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:) 100 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, ztrdt ) 101 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, ztrds ) 102 DEALLOCATE( ztrdt, ztrds ) 103 ENDIF 104 105 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed from tra_ldf_blp, zps_hde*) 106 IF( ln_tile .AND. ntile == 0 ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 1 ) 67 ! 68 SELECT CASE ( nldf_tra ) !* compute lateral mixing trend and add it to the general trend 69 CASE ( np_lap ) ! laplacian: iso-level operator 70 CALL tra_ldf_lap ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 71 CASE ( np_lap_i ) ! laplacian: standard iso-neutral operator (Madec) 72 CALL tra_ldf_iso ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 73 CASE ( np_lap_it ) ! laplacian: triad iso-neutral operator (griffies) 74 CALL tra_ldf_triad( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, 1 ) 75 CASE ( np_blp , np_blp_i , np_blp_it ) ! bilaplacian: iso-level & iso-neutral operators 76 CALL tra_ldf_blp ( kt, Kmm, nit000,'TRA', ahtu, ahtv, gtsu, gtsv, gtui, gtvi, pts(:,:,:,:,Kbb), pts(:,:,:,:,Krhs), jpts, nldf_tra ) 77 END SELECT 78 ! 79 IF( l_trdtra ) THEN !* save the horizontal diffusive trends for further diagnostics 80 ztrdt(:,:,:) = pts(:,:,:,jp_tem,Krhs) - ztrdt(:,:,:) 81 ztrds(:,:,:) = pts(:,:,:,jp_sal,Krhs) - ztrds(:,:,:) 82 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_ldf, ztrdt ) 83 CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_sal, jptra_ldf, ztrds ) 84 DEALLOCATE( ztrdt, ztrds ) 107 85 ENDIF 108 86 ! !* print mean trends (used for debugging) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_iso.F90
r14776 r14787 132 132 INTEGER :: ji, jj, jk, jn ! dummy loop indices 133 133 INTEGER :: ikt 134 INTEGER :: ierr 134 INTEGER :: ierr, iij ! local integer 135 135 REAL(wp) :: zmsku, zahu_w, zabe1, zcof1, zcoef3 ! local scalars 136 136 REAL(wp) :: zmskv, zahv_w, zabe2, zcof2, zcoef4 ! - - … … 141 141 ! 142 142 IF( kpass == 1 .AND. kt == kit000 ) THEN 143 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile143 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 144 144 IF(lwp) WRITE(numout,*) 145 145 IF(lwp) WRITE(numout,*) 'tra_ldf_iso : rotated laplacian diffusion operator on ', cdtype … … 147 147 ENDIF 148 148 ! 149 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )149 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 150 150 akz (ji,jj,jk) = 0._wp 151 151 ah_wslp2(ji,jj,jk) = 0._wp … … 153 153 ENDIF 154 154 ! 155 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile155 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 156 156 l_hst = .FALSE. 157 157 l_ptr = .FALSE. … … 161 161 ENDIF 162 162 ! 163 ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 164 IF( nldf_tra == np_blp_i .AND. kpass == 1 ) THEN ; iij = nn_hls 165 ELSE ; iij = 1 166 ENDIF 167 163 168 ! 164 169 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) … … 172 177 IF( kpass == 1 ) THEN !== first pass only ==! 173 178 ! 174 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )179 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 175 180 ! 176 181 zmsku = wmask(ji,jj,jk) / MAX( umask(ji ,jj,jk-1) + umask(ji-1,jj,jk) & … … 186 191 zahv_w = ( ( pahv(ji,jj ,jk-1) + pahv(ji,jj-1,jk) & 187 192 & ) & ! bracket for halo 1 - halo 2 compatibility 188 & + ( pahv(ji,jj-1,jk-1) + pahv(ji,jj ,jk) & 193 & + ( pahv(ji,jj-1,jk-1) + pahv(ji,jj ,jk) & 189 194 & ) ) * zmskv ! bracket for halo 1 - halo 2 compatibility 190 195 ! … … 194 199 ! 195 200 IF( ln_traldf_msc ) THEN ! stabilizing vertical diffusivity coefficient 196 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )201 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 197 202 ! round brackets added to fix the order of floating point operations 198 203 ! needed to ensure halo 1 - halo 2 compatibility … … 202 207 & ) & ! bracket for halo 1 - halo 2 compatibility 203 208 & + ( ( pahv(ji,jj ,jk) + pahv(ji,jj ,jk-1) ) / ( e2v(ji,jj ) * e2v(ji,jj ) ) & 204 & + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) ) & 209 & + ( pahv(ji,jj-1,jk) + pahv(ji,jj-1,jk-1) ) / ( e2v(ji,jj-1) * e2v(ji,jj-1) ) & 205 210 & ) ) ! bracket for halo 1 - halo 2 compatibility 206 211 END_3D 207 212 ! 208 213 IF( ln_traldf_blp ) THEN ! bilaplacian operator 209 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )214 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 210 215 akz(ji,jj,jk) = 16._wp & 211 216 & * ah_wslp2 (ji,jj,jk) & … … 215 220 END_3D 216 221 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator 217 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )222 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 218 223 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 219 224 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) … … 223 228 ! 224 229 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 225 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )230 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 226 231 akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 227 232 END_3D … … 236 241 !! I - masked horizontal derivative 237 242 !!---------------------------------------------------------------------- 238 !!gm : bug.... why (x,:,:)? (1,jpj,:) and (jpi,1,:) should be sufficient.... 239 zdit (ntsi-nn_hls,:,:) = 0._wp ; zdit (ntei+nn_hls,:,:) = 0._wp 240 zdjt (ntsi-nn_hls,:,:) = 0._wp ; zdjt (ntei+nn_hls,:,:) = 0._wp 241 !!end 243 zdit(:,:,:) = 0._wp 244 zdjt(:,:,:) = 0._wp 242 245 243 246 ! Horizontal tracer gradient 244 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 )247 DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) 245 248 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 246 249 zdjt(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 247 250 END_3D 248 251 IF( ln_zps ) THEN ! botton and surface ocean correction of the horizontal gradient 249 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! bottom correction (partial bottom cell)252 DO_2D( iij, iij-1, iij, iij-1 ) ! bottom correction (partial bottom cell) 250 253 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 251 254 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 252 255 END_2D 253 256 IF( ln_isfcav ) THEN ! first wet level beneath a cavity 254 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )257 DO_2D( iij, iij-1, iij, iij-1 ) 255 258 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj)) = pgui(ji,jj,jn) 256 259 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj)) = pgvi(ji,jj,jn) … … 265 268 DO jk = 1, jpkm1 ! Horizontal slab 266 269 ! 267 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls)270 DO_2D( iij, iij, iij, iij ) 268 271 ! !== Vertical tracer gradient 269 272 zdk1t(ji,jj) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * wmask(ji,jj,jk+1) ! level jk+1 … … 274 277 END_2D 275 278 ! 276 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) !== Horizontal fluxes279 DO_2D( iij, iij-1, iij, iij-1 ) !== Horizontal fluxes 277 280 zabe1 = pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) 278 281 zabe2 = pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) … … 292 295 & + zcof1 * ( ( zdkt (ji+1,jj) + zdk1t(ji,jj) & 293 296 & ) & ! bracket for halo 1 - halo 2 compatibility 294 & + ( zdk1t(ji+1,jj) + zdkt (ji,jj) & 297 & + ( zdk1t(ji+1,jj) + zdkt (ji,jj) & 295 298 & ) & ! bracket for halo 1 - halo 2 compatibility 296 299 & ) ) * umask(ji,jj,jk) … … 300 303 & + ( zdk1t(ji,jj+1) + zdkt (ji,jj) & 301 304 & ) & ! bracket for halo 1 - halo 2 compatibility 302 & ) ) * vmask(ji,jj,jk) 305 & ) ) * vmask(ji,jj,jk) 303 306 END_2D 304 307 ! 305 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !== horizontal divergence and add to pta308 DO_2D( iij-1, iij-1, iij-1, iij-1 ) !== horizontal divergence and add to pta 306 309 ! round brackets added to fix the order of floating point operations 307 310 ! needed to ensure halo 1 - halo 2 compatibility … … 324 327 ztfw(:,:, 1 ) = 0._wp ; ztfw(:,:,jpk) = 0._wp 325 328 326 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) ! interior (2=<jk=<jpk-1)329 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) ! interior (2=<jk=<jpk-1) 327 330 ! 328 331 zmsku = wmask(ji,jj,jk) / MAX( umask(ji ,jj,jk-1) + umask(ji-1,jj,jk) & … … 344 347 & ) & ! bracket for halo 1 - halo 2 compatibility 345 348 & + ( zdit(ji-1,jj ,jk-1) + zdit(ji ,jj ,jk) & 346 & ) & ! bracket for halo 1 - halo 2 compatibility 349 & ) & ! bracket for halo 1 - halo 2 compatibility 347 350 & ) & 348 351 & + zcoef4 * ( ( zdjt(ji ,jj ,jk-1) + zdjt(ji ,jj-1,jk) & … … 354 357 ! !== add the vertical 33 flux ==! 355 358 IF( ln_traldf_lap ) THEN ! laplacian case: eddy coef = ah_wslp2 - akz 356 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )359 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 357 360 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk) & 358 361 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & … … 363 366 SELECT CASE( kpass ) 364 367 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 365 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )368 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 366 369 ztfw(ji,jj,jk) = & 367 370 & ztfw(ji,jj,jk) + ah_wslp2(ji,jj,jk) * e1e2t(ji,jj) & … … 369 372 END_3D 370 373 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp. 371 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )374 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 372 375 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk) & 373 376 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) ) & … … 377 380 ENDIF 378 381 ! 379 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==!382 DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==! 380 383 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) + zsign * ( ztfw (ji,jj,jk) - ztfw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) & 381 384 & / e3t(ji,jj,jk,Kmm) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_lap_blp.F90
r14776 r14787 103 103 ! 104 104 INTEGER :: ji, jj, jk, jn ! dummy loop indices 105 INTEGER :: i si, iei, isj, iej ! local integers105 INTEGER :: iij 106 106 REAL(wp) :: zsign ! local scalars 107 107 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: ztu, ztv, zaheeu, zaheev 108 108 !!---------------------------------------------------------------------- 109 109 ! 110 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile110 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 111 111 IF( kt == nit000 .AND. lwp ) THEN 112 112 WRITE(numout,*) … … 122 122 ENDIF 123 123 ! 124 ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 125 IF( nldf_tra == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls 126 ELSE ; iij = 1 127 ENDIF 128 124 129 ! !== Initialization of metric arrays used for all tracers ==! 125 130 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) … … 127 132 ENDIF 128 133 129 IF( ntsi == Nis0 ) THEN ; isi = nn_hls - 1 ; ELSE ; isi = 0 ; ENDIF ! Avoid double-counting when using tiling 130 IF( ntsj == Njs0 ) THEN ; isj = nn_hls - 1 ; ELSE ; isj = 0 ; ENDIF 131 IF( ntei == Nie0 ) THEN ; iei = nn_hls - 1 ; ELSE ; iei = 0 ; ENDIF 132 IF( ntej == Nje0 ) THEN ; iej = nn_hls - 1 ; ELSE ; iej = 0 ; ENDIF 133 134 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) !== First derivative (gradient) ==! 134 DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) !== First derivative (gradient) ==! 135 135 zaheeu(ji,jj,jk) = zsign * pahu(ji,jj,jk) * e2_e1u(ji,jj) * e3u(ji,jj,jk,Kmm) !!gm * umask(ji,jj,jk) pah masked! 136 136 zaheev(ji,jj,jk) = zsign * pahv(ji,jj,jk) * e1_e2v(ji,jj) * e3v(ji,jj,jk,Kmm) !!gm * vmask(ji,jj,jk) … … 141 141 ! ! =========== ! 142 142 ! 143 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) !== First derivative (gradient) ==!143 DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) !== First derivative (gradient) ==! 144 144 ztu(ji,jj,jk) = zaheeu(ji,jj,jk) * ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) 145 145 ztv(ji,jj,jk) = zaheev(ji,jj,jk) * ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) 146 146 END_3D 147 147 IF( ln_zps ) THEN ! set gradient at bottom/top ocean level 148 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! bottom148 DO_2D( iij, iij-1, iij, iij-1 ) ! bottom 149 149 ztu(ji,jj,mbku(ji,jj)) = zaheeu(ji,jj,mbku(ji,jj)) * pgu(ji,jj,jn) 150 150 ztv(ji,jj,mbkv(ji,jj)) = zaheev(ji,jj,mbkv(ji,jj)) * pgv(ji,jj,jn) 151 151 END_2D 152 152 IF( ln_isfcav ) THEN ! top in ocean cavities only 153 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )153 DO_2D( iij, iij-1, iij, iij-1 ) 154 154 IF( miku(ji,jj) > 1 ) ztu(ji,jj,miku(ji,jj)) = zaheeu(ji,jj,miku(ji,jj)) * pgui(ji,jj,jn) 155 155 IF( mikv(ji,jj) > 1 ) ztv(ji,jj,mikv(ji,jj)) = zaheev(ji,jj,mikv(ji,jj)) * pgvi(ji,jj,jn) … … 158 158 ENDIF 159 159 ! 160 DO_3D( i si, iei, isj, iej, 1, jpkm1 ) !== Second derivative (divergence) added to the general tracer trends ==!160 DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 ) !== Second derivative (divergence) added to the general tracer trends ==! 161 161 ! round brackets added to fix the order of floating point operations 162 162 ! needed to ensure halo 1 - halo 2 compatibility … … 215 215 !!--------------------------------------------------------------------- 216 216 ! 217 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile217 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 218 218 IF( kt == kit000 .AND. lwp ) THEN 219 219 WRITE(numout,*) … … 241 241 IF (nn_hls==1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp ) ! Lateral boundary conditions (unchanged sign) 242 242 ! ! Partial top/bottom cell: GRADh( zlap ) 243 IF( ln_zps ) THEN 244 IF( ln_isfcav ) THEN ; CALL zps_hde_isf( kt, Kmm, kjpt, zlap, zglu, zglv, zgui, zgvi ) ! both top & bottom 245 ELSE ; CALL zps_hde ( kt, Kmm, kjpt, zlap, zglu, zglv ) ! only bottom 246 ENDIF 243 IF( ln_isfcav .AND. ln_zps ) THEN ; CALL zps_hde_isf( kt, Kmm, kjpt, zlap, zglu, zglv, zgui, zgvi ) ! both top & bottom 244 ELSEIF( ln_zps ) THEN ; CALL zps_hde ( kt, Kmm, kjpt, zlap, zglu, zglv ) ! only bottom 247 245 ENDIF 248 246 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traldf_triad.F90
r14776 r14787 13 13 USE oce ! ocean dynamics and active tracers 14 14 USE dom_oce ! ocean space and time domain 15 ! TEMP: [tiling] This change not necessary if XIOS has subdomain support16 USE domtile17 15 USE domutl, ONLY : is_tile 18 16 USE phycst ! physical constants … … 109 107 REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) :: pt_rhs ! tracer trend 110 108 ! 111 INTEGER :: ji, jj, jk, jn, kp ! dummy loop indices109 INTEGER :: ji, jj, jk, jn, kp, iij ! dummy loop indices 112 110 REAL(wp) :: zcoef0, ze3w_2, zsign ! - - 113 111 ! … … 115 113 REAL(wp) :: ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt, zdyt_jp1, ze3wr_jp1, zdzt_jp1, zah_slp1, zah_slp_jp1, zaei_slp_jp1 116 114 REAL(wp) :: zah_slp, zaei_slp, zdxt_ip1, ze3wr_ip1, zdzt_ip1, zah_slp_ip1, zaei_slp_ip1, zaei_slp1 117 REAL(wp), DIMENSION(A2D(nn_hls),0:1) :: zdkt3d ! vertical tracer gradient at 2 levels 118 REAL(wp), DIMENSION(A2D(nn_hls) ) :: z2d ! 2D workspace 119 REAL(wp), DIMENSION(A2D(nn_hls) ,jpk) :: zdit, zdjt, zftu, zftv, ztfw ! 3D - 120 ! TEMP: [tiling] This can be A2D(nn_hls) if XIOS has subdomain support 121 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpsi_uw, zpsi_vw 115 REAL(wp), DIMENSION(A2D(nn_hls),0:1) :: zdkt3d ! vertical tracer gradient at 2 levels 116 REAL(wp), DIMENSION(A2D(nn_hls) ) :: z2d ! 2D workspace 117 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw ! 3D - 122 118 !!---------------------------------------------------------------------- 123 119 ! 124 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile120 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 125 121 IF( kpass == 1 .AND. kt == kit000 ) THEN 126 122 IF(lwp) WRITE(numout,*) … … 138 134 ENDIF 139 135 ! 136 ! Define pt_rhs halo points for multi-point haloes in bilaplacian case 137 IF( nldf_tra == np_blp_it .AND. kpass == 1 ) THEN ; iij = nn_hls 138 ELSE ; iij = 1 139 ENDIF 140 141 ! 140 142 IF( kpass == 1 ) THEN ; zsign = 1._wp ! bilaplacian operator require a minus sign (eddy diffusivity >0) 141 143 ELSE ; zsign = -1._wp … … 148 150 IF( kpass == 1 ) THEN !== first pass only and whatever the tracer is ==! 149 151 ! 150 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )152 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 151 153 akz (ji,jj,jk) = 0._wp 152 154 ah_wslp2(ji,jj,jk) = 0._wp … … 154 156 ! 155 157 DO kp = 0, 1 ! i-k triads 156 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )158 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 157 159 ze3wr = 1._wp / e3w(ji,jj,jk+kp,Kmm) 158 160 zbu = e1e2u(ji,jj) * e3u(ji,jj,jk,Kmm) … … 177 179 ! 178 180 DO kp = 0, 1 ! j-k triads 179 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )181 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 180 182 ze3wr = 1.0_wp / e3w(ji,jj,jk+kp,Kmm) 181 183 zbv = e1e2v(ji,jj) * e3v(ji,jj,jk,Kmm) … … 204 206 ! 205 207 IF( ln_traldf_blp ) THEN ! bilaplacian operator 206 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )208 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 207 209 akz(ji,jj,jk) = 16._wp & 208 210 & * ah_wslp2 (ji,jj,jk) & … … 212 214 END_3D 213 215 ELSEIF( ln_traldf_lap ) THEN ! laplacian operator 214 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )216 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 215 217 ze3w_2 = e3w(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 216 218 zcoef0 = rDt * ( akz(ji,jj,jk) + ah_wslp2(ji,jj,jk) / ze3w_2 ) … … 220 222 ! 221 223 ELSE ! 33 flux set to zero with akz=ah_wslp2 ==>> computed in full implicit 222 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )224 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 223 225 akz(ji,jj,jk) = ah_wslp2(ji,jj,jk) 224 226 END_3D 225 227 ENDIF 226 228 ! 227 ! TEMP: [tiling] These changes not necessary if XIOS has subdomain support 228 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only for the full domain 229 IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 230 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) 231 232 zpsi_uw(:,:,:) = 0._wp 233 zpsi_vw(:,:,:) = 0._wp 234 235 DO kp = 0, 1 236 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 237 ! round brackets added to fix the order of floating point operations 238 ! needed to ensure halo 1 - halo 2 compatibility 239 zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp) & 240 & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp) & 241 & + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp) & 242 & ) ! bracket for halo 1 - halo 2 compatibility 243 zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp) & 244 & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp) & 245 & + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp) & 246 & ) ! bracket for halo 1 - halo 2 compatibility 247 END_3D 248 END DO 249 CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 250 251 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = nijtile ) 252 ENDIF 229 IF( ln_ldfeiv_dia .AND. cdtype == 'TRA' ) THEN 230 zpsi_uw(:,:,:) = 0._wp 231 zpsi_vw(:,:,:) = 0._wp 232 233 DO kp = 0, 1 234 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 235 ! round brackets added to fix the order of floating point operations 236 ! needed to ensure halo 1 - halo 2 compatibility 237 zpsi_uw(ji,jj,jk+kp) = zpsi_uw(ji,jj,jk+kp) & 238 & + ( 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji,jj,jk,1,kp) & 239 & + 0.25_wp * aeiu(ji,jj,jk) * e2u(ji,jj) * triadi_g(ji+1,jj,jk,0,kp) & 240 & ) ! bracket for halo 1 - halo 2 compatibility 241 zpsi_vw(ji,jj,jk+kp) = zpsi_vw(ji,jj,jk+kp) & 242 & + ( 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj,jk,1,kp) & 243 & + 0.25_wp * aeiv(ji,jj,jk) * e1v(ji,jj) * triadj_g(ji,jj+1,jk,0,kp) & 244 & ) ! bracket for halo 1 - halo 2 compatibility 245 END_3D 246 END DO 247 CALL ldf_eiv_dia( zpsi_uw, zpsi_vw, Kmm ) 253 248 ENDIF 254 249 ! … … 263 258 zftu(:,:,:) = 0._wp 264 259 zftv(:,:,:) = 0._wp 265 ! 266 DO_3D( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) !== before lateral T & S gradients at T-level jk ==! 260 zdit(:,:,:) = 0._wp 261 zdjt(:,:,:) = 0._wp 262 ! 263 DO_3D( iij, iij-1, iij, iij-1, 1, jpkm1 ) !== before lateral T & S gradients at T-level jk ==! 267 264 zdit(ji,jj,jk) = ( pt(ji+1,jj ,jk,jn) - pt(ji,jj,jk,jn) ) * umask(ji,jj,jk) 268 265 zdjt(ji,jj,jk) = ( pt(ji ,jj+1,jk,jn) - pt(ji,jj,jk,jn) ) * vmask(ji,jj,jk) 269 266 END_3D 270 267 IF( ln_zps .AND. l_grad_zps ) THEN ! partial steps: correction at top/bottom ocean level 271 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) ! bottom level268 DO_2D( iij, iij-1, iij, iij-1 ) ! bottom level 272 269 zdit(ji,jj,mbku(ji,jj)) = pgu(ji,jj,jn) 273 270 zdjt(ji,jj,mbkv(ji,jj)) = pgv(ji,jj,jn) 274 271 END_2D 275 272 IF( ln_isfcav ) THEN ! top level (ocean cavities only) 276 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )273 DO_2D( iij, iij-1, iij, iij-1 ) 277 274 IF( miku(ji,jj) > 1 ) zdit(ji,jj,miku(ji,jj) ) = pgui(ji,jj,jn) 278 275 IF( mikv(ji,jj) > 1 ) zdjt(ji,jj,mikv(ji,jj) ) = pgvi(ji,jj,jn) … … 287 284 DO jk = 1, jpkm1 288 285 ! !== Vertical tracer gradient at level jk and jk+1 289 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls)286 DO_2D( iij, iij, iij, iij ) 290 287 zdkt3d(ji,jj,1) = ( pt(ji,jj,jk,jn) - pt(ji,jj,jk+1,jn) ) * tmask(ji,jj,jk+1) 291 288 END_2D … … 294 291 IF( jk == 1 ) THEN ; zdkt3d(:,:,0) = zdkt3d(:,:,1) 295 292 ELSE 296 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls)293 DO_2D( iij, iij, iij, iij ) 297 294 zdkt3d(ji,jj,0) = ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) * tmask(ji,jj,jk) 298 295 END_2D … … 300 297 ! 301 298 zaei_slp = 0._wp 299 zaei_slp_ip1 = 0._wp 300 zaei_slp_jp1 = 0._wp 301 zaei_slp1 = 0._wp 302 302 ! 303 303 IF( ln_botmix_triad ) THEN 304 304 DO kp = 0, 1 !== Horizontal & vertical fluxes 305 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )305 DO_2D( iij, iij-1, iij, iij-1 ) 306 306 ze1ur = r1_e1u(ji,jj) 307 307 zdxt = zdit(ji,jj,jk) * ze1ur … … 315 315 zbu_ip1 = 0.25_wp * e1e2u(ji+1,jj) * e3u(ji+1,jj,jk,Kmm) 316 316 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahu is masked.... 317 zah = pahu(ji,jj,jk) 318 zah_ip1 = pahu(ji+1,jj,jk) 317 zah = pahu(ji,jj,jk) 318 zah_ip1 = pahu(ji+1,jj,jk) 319 319 zah_slp = zah * triadi(ji,jj,jk,1,kp) 320 320 zah_slp_ip1 = zah_ip1 * triadi(ji+1,jj,jk,1,kp) … … 331 331 & + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur & 332 332 & ) ! bracket for halo 1 - halo 2 compatibility 333 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 333 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 334 334 & - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1 & 335 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & 335 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & 336 336 & ) ! bracket for halo 1 - halo 2 compatibility 337 337 END_2D … … 339 339 ! 340 340 DO kp = 0, 1 341 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )341 DO_2D( iij, iij-1, iij, iij-1 ) 342 342 ze2vr = r1_e2v(ji,jj) 343 343 zdyt = zdjt(ji,jj,jk) * ze2vr … … 351 351 ! ln_botmix_triad is .T. don't mask zah for bottom half cells !!gm ????? ahu is masked.... 352 352 zah = pahv(ji,jj,jk) ! pahv(ji,jj+jp,jk) ???? 353 zah_jp1 = pahv(ji,jj+1,jk) 353 zah_jp1 = pahv(ji,jj+1,jk) 354 354 zah_slp = zah * triadj(ji,jj,jk,1,kp) 355 355 zah_slp1 = zah * triadj(ji,jj+1,jk,0,kp) 356 356 zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 357 357 IF( ln_ldfeiv ) THEN 358 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 359 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 358 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 359 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 360 360 zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) 361 361 ENDIF … … 376 376 ! 377 377 DO kp = 0, 1 !== Horizontal & vertical fluxes 378 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )378 DO_2D( iij, iij-1, iij, iij-1 ) 379 379 ze1ur = r1_e1u(ji,jj) 380 380 zdxt = zdit(ji,jj,jk) * ze1ur … … 389 389 ! ln_botmix_triad is .F. mask zah for bottom half cells 390 390 zah = pahu(ji,jj,jk) * umask(ji,jj,jk+kp) ! pahu(ji+ip,jj,jk) ===>> ???? 391 zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp) 391 zah_ip1 = pahu(ji+1,jj,jk) * umask(ji+1,jj,jk+kp) 392 392 zah_slp = zah * triadi(ji,jj,jk,1,kp) 393 393 zah_slp_ip1 = zah_ip1 * triadi(ji+1,jj,jk,1,kp) 394 394 zah_slp1 = zah * triadi(ji+1,jj,jk,0,kp) 395 395 IF( ln_ldfeiv ) THEN 396 zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp) 396 zaei_slp = aeiu(ji,jj,jk) * triadi_g(ji,jj,jk,1,kp) 397 397 zaei_slp_ip1 = aeiu(ji+1,jj,jk) * triadi_g(ji+1,jj,jk,1,kp) 398 398 zaei_slp1 = aeiu(ji,jj,jk) * triadi_g(ji+1,jj,jk,0,kp) 399 399 ENDIF 400 ! zftu(ji ,jj,jk ) = zftu(ji ,jj,jk ) - ( zah * zdxt + (zah_slp - zaei_slp) * zdzt ) * zbu * ze1ur - ( zah * zdxt + (zah_slp1 - zaei_slp1) * zdzt_ip1 ) * zbu * ze1ur401 ! ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) - (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1 - (zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1402 400 ! round brackets added to fix the order of floating point operations 403 401 ! needed to ensure halo 1 - halo 2 compatibility … … 406 404 & + ( zah * zdxt + zah_slp1 * zdzt_ip1 - zaei_slp1 * zdzt_ip1 ) * zbu * ze1ur & 407 405 & ) ! bracket for halo 1 - halo 2 compatibility 408 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 406 ztfw(ji+1,jj,jk+kp) = ztfw(ji+1,jj,jk+kp) & 409 407 & - ( (zah_slp_ip1 + zaei_slp_ip1) * zdxt_ip1 * zbu_ip1 * ze3wr_ip1 & 410 408 & + ( zah_slp1 + zaei_slp1) * zdxt * zbu * ze3wr_ip1 & … … 414 412 ! 415 413 DO kp = 0, 1 416 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )414 DO_2D( iij, iij-1, iij, iij-1 ) 417 415 ze2vr = r1_e2v(ji,jj) 418 416 zdyt = zdjt(ji,jj,jk) * ze2vr … … 431 429 zah_slp_jp1 = zah_jp1 * triadj(ji,jj+1,jk,1,kp) 432 430 IF( ln_ldfeiv ) THEN 433 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 431 zaei_slp = aeiv(ji,jj,jk) * triadj_g(ji,jj,jk,1,kp) 434 432 zaei_slp_jp1 = aeiv(ji,jj+1,jk) * triadj_g(ji,jj+1,jk,1,kp) 435 433 zaei_slp1 = aeiv(ji,jj,jk) * triadj_g(ji,jj+1,jk,0,kp) 436 434 ENDIF 437 ! zftv(ji,jj ,jk ) = zftv(ji,jj ,jk ) - ( zah * zdyt + (zah_slp - zaei_slp) * zdzt ) * zbv * ze2vr - ( zah * zdyt + (zah_slp1 - zaei_slp1) * zdzt_jp1 ) * zbv * ze2vr438 ! ztfw(ji,jj+1,jk+kp) = ztfw(ji,jj+1,jk+kp) - ( zah_slp_jp1 + zaei_slp_jp1) * zdyt_jp1 * zbv_jp1 * ze3wr_jp1 - (zah_slp1 + zaei_slp1) * zdyt * zbv * ze3wr_jp1439 435 ! round brackets added to fix the order of floating point operations 440 436 ! needed to ensure halo 1 - halo 2 compatibility … … 451 447 ENDIF 452 448 ! !== horizontal divergence and add to the general trend ==! 453 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )449 DO_2D( iij-1, iij-1, iij-1, iij-1 ) 454 450 ! round brackets added to fix the order of floating point operations 455 451 ! needed to ensure halo 1 - halo 2 compatibility … … 466 462 ! !== add the vertical 33 flux ==! 467 463 IF( ln_traldf_lap ) THEN ! laplacian case: eddy coef = ah_wslp2 - akz 468 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )464 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 469 465 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 470 466 & * ( ah_wslp2(ji,jj,jk) - akz(ji,jj,jk) ) & … … 474 470 SELECT CASE( kpass ) 475 471 CASE( 1 ) ! 1st pass : eddy coef = ah_wslp2 476 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )472 DO_3D( iij-1, iij-1, iij-1, iij-1, 2, jpkm1 ) 477 473 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 478 474 & * ah_wslp2(ji,jj,jk) * ( pt(ji,jj,jk-1,jn) - pt(ji,jj,jk,jn) ) 479 475 END_3D 480 476 CASE( 2 ) ! 2nd pass : eddy flux = ah_wslp2 and akz applied on pt and pt2 gradients, resp. 481 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )477 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 482 478 ztfw(ji,jj,jk) = ztfw(ji,jj,jk) - e1e2t(ji,jj) / e3w(ji,jj,jk,Kmm) * tmask(ji,jj,jk) & 483 479 & * ( ah_wslp2(ji,jj,jk) * ( pt (ji,jj,jk-1,jn) - pt (ji,jj,jk,jn) ) & … … 487 483 ENDIF 488 484 ! 489 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==!485 DO_3D( iij-1, iij-1, iij-1, iij-1, 1, jpkm1 ) !== Divergence of vertical fluxes added to pta ==! 490 486 pt_rhs(ji,jj,jk,jn) = pt_rhs(ji,jj,jk,jn) & 491 487 & + zsign * ( ztfw(ji,jj,jk+1) - ztfw(ji,jj,jk) ) & -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/tramle.F90
r14776 r14787 87 87 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 88 88 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 89 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pu ! in : 3 ocean transport components 90 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pv ! out: same 3 transport components 91 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: pw ! increased by the MLE induced transport 89 ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 90 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu ! in : 3 ocean transport components 91 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pv ! out: same 3 transport components 92 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pw ! increased by the MLE induced transport 92 93 ! 93 94 INTEGER :: ji, jj, jk ! dummy loop indices … … 96 97 REAL(wp) :: zcvw, zmvw ! - - 97 98 INTEGER , DIMENSION(A2D(nn_hls)) :: inml_mle 98 REAL(wp), DIMENSION(A2D(nn_hls)) :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_ MH99 REAL(wp), DIMENSION(A2D(nn_hls)) :: zpsim_u, zpsim_v, zmld, zbm, zhu, zhv, zn2, zLf_NH, zLf_MH 99 100 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zpsi_uw, zpsi_vw 100 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support)101 REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: zLf_NH102 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zpsiu_mle, zpsiv_mle103 101 !!---------------------------------------------------------------------- 104 102 ! … … 253 251 ! !== transport increased by the MLE induced transport ==! 254 252 DO jk = 1, ikmax 255 DO_2D ( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )253 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 256 254 pu(ji,jj,jk) = pu(ji,jj,jk) + ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji,jj,jk+1) ) 257 255 pv(ji,jj,jk) = pv(ji,jj,jk) + ( zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj,jk+1) ) 258 256 END_2D 259 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )257 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 260 258 pw(ji,jj,jk) = pw(ji,jj,jk) - ( zpsi_uw(ji,jj,jk) - zpsi_uw(ji-1,jj,jk) & 261 259 & + zpsi_vw(ji,jj,jk) - zpsi_vw(ji,jj-1,jk) ) * wmask(ji,jj,1) … … 263 261 END DO 264 262 265 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support)266 263 IF( cdtype == 'TRA') THEN !== outputs ==! 267 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only on the first tile268 ALLOCATE( zLf_NH(jpi,jpj), zpsiu_mle(jpi,jpj,jpk), zpsiv_mle(jpi,jpj,jpk) )269 zpsiu_mle(:,:,:) = 0._wp ; zpsiv_mle(:,:,:) = 0._wp270 ENDIF271 264 ! 272 265 IF (ln_osm_mle.and.ln_zdfosm) THEN 273 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)266 DO_2D( 0, 0, 0, 0 ) 274 267 zLf_NH(ji,jj) = SQRT( rb_c * hmle(ji,jj) ) * r1_ft(ji,jj) ! Lf = N H / f 275 268 END_2D 276 269 ELSE 277 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)270 DO_2D( 0, 0, 0, 0 ) 278 271 zLf_NH(ji,jj) = SQRT( rb_c * zmld(ji,jj) ) * r1_ft(ji,jj) ! Lf = N H / f 279 272 END_2D 280 273 ENDIF 281 274 ! 275 CALL iom_put( "Lf_NHpf" , zLf_NH ) ! Lf = N H / f 276 ! 282 277 ! divide by cross distance to give streamfunction with dimensions m^2/s 283 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, ikmax+1 )284 zpsi u_mle(ji,jj,jk) = zpsi_uw(ji,jj,jk) * r1_e2u(ji,jj)285 zpsi v_mle(ji,jj,jk) = zpsi_vw(ji,jj,jk) * r1_e1v(ji,jj)278 DO_3D( 0, 0, 0, 0, 1, ikmax+1 ) 279 zpsi_uw(ji,jj,jk) = zpsi_uw(ji,jj,jk) * r1_e2u(ji,jj) 280 zpsi_vw(ji,jj,jk) = zpsi_vw(ji,jj,jk) * r1_e1v(ji,jj) 286 281 END_3D 287 288 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 289 CALL iom_put( "Lf_NHpf" , zLf_NH ) ! Lf = N H / f 290 CALL iom_put( "psiu_mle", zpsiu_mle ) ! i-mle streamfunction 291 CALL iom_put( "psiv_mle", zpsiv_mle ) ! j-mle streamfunction 292 DEALLOCATE( zLf_NH, zpsiu_mle, zpsiv_mle ) 293 ENDIF 282 CALL iom_put( "psiu_mle", zpsi_uw ) ! i-mle streamfunction 283 CALL iom_put( "psiv_mle", zpsi_vw ) ! j-mle streamfunction 294 284 ENDIF 295 285 ! … … 376 366 r1_ft(:,:) = 1._wp / SQRT( ff_t(:,:) * ff_t(:,:) + z1_t2 ) 377 367 ! 368 ! Specifically, dbdx_mle, dbdy_mle and mld_prof need to be defined for nn_hls = 2 369 IF( nn_hls == 2 .AND. ln_osm_mle .AND. ln_zdfosm ) THEN 370 CALL ctl_stop('nn_hls = 2 cannot be used with ln_mle = ln_osm_mle = ln_zdfosm = T (zdfosm not updated for nn_hls = 2)') 371 ENDIF 378 372 ENDIF 379 373 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/tranpc.F90
r14776 r14787 17 17 USE oce ! ocean dynamics and active tracers 18 18 USE dom_oce ! ocean space and time domain 19 ! TEMP: [tiling] This change not necessary after extra haloes development (lbc_lnk removed)20 USE domtile21 19 USE phycst ! physical constants 22 20 USE zdf_oce ! ocean vertical physics … … 81 79 LOGICAL, PARAMETER :: l_LB_debug = .FALSE. ! set to true if you want to follow what is 82 80 INTEGER :: ilc1, jlc1, klc1, nncpu ! actually happening in a water column at point "ilc1, jlc1" 83 INTEGER :: isi, isj, iei, iej84 81 LOGICAL :: lp_monitor_point = .FALSE. ! in CPU domain "nncpu" 85 82 !!---------------------------------------------------------------------- … … 105 102 CALL bn2 ( pts(:,:,:,:,Kaa), zab, zn2, Kmm ) ! after Brunt-Vaisala (given on W-points) 106 103 ! 107 IF( ntile == 0 .OR. ntile == 1 ) nnpcc = 0 ! Do only on the first tile 108 ! 109 IF( ntsi == Nis0 ) THEN ; isi = nn_hls ; ELSE ; isi = 0 ; ENDIF ! Avoid double-counting when using tiling 110 IF( ntsj == Njs0 ) THEN ; isj = nn_hls ; ELSE ; isj = 0 ; ENDIF 111 IF( ntei == Nie0 ) THEN ; iei = nn_hls ; ELSE ; iei = 0 ; ENDIF 112 IF( ntej == Nje0 ) THEN ; iej = nn_hls ; ELSE ; iej = 0 ; ENDIF 113 ! 114 DO_2D( isi, iei, isj, iej ) ! interior column only 104 IF( .NOT. l_istiled .OR. ntile == 1 ) nnpcc = 0 ! Do only on the first tile 105 ! 106 DO_2D_OVR( 0, 0, 0, 0 ) ! interior column only 115 107 ! 116 108 IF( tmask(ji,jj,2) == 1 ) THEN ! At least 2 ocean points … … 319 311 ENDIF 320 312 ! 321 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only for the full domain313 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the full domain 322 314 IF( lwp .AND. l_LB_debug ) THEN 323 315 WRITE(numout,*) 'Exiting tra_npc , kt = ',kt,', => numb. of statically instable water-columns: ', nnpcc -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traqsr.F90
r14776 r14787 108 108 ! 109 109 INTEGER :: ji, jj, jk ! dummy loop indices 110 INTEGER :: irgb , isi, iei, isj, iej! local integers110 INTEGER :: irgb ! local integers 111 111 REAL(wp) :: zchl, zcoef, z1_2 ! local scalars 112 112 REAL(wp) :: zc0 , zc1 , zc2 , zc3 ! - - … … 121 121 IF( ln_timing ) CALL timing_start('tra_qsr') 122 122 ! 123 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile123 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 124 124 IF( kt == nit000 ) THEN 125 125 IF(lwp) WRITE(numout,*) … … 137 137 ! ! before qsr induced heat content ! 138 138 ! !-----------------------------------! 139 IF( ntsi == Nis0 ) THEN ; isi = nn_hls ; ELSE ; isi = 0 ; ENDIF ! Avoid double-counting when using tiling140 IF( ntsj == Njs0 ) THEN ; isj = nn_hls ; ELSE ; isj = 0 ; ENDIF141 IF( ntei == Nie0 ) THEN ; iei = nn_hls ; ELSE ; iei = 0 ; ENDIF142 IF( ntej == Nje0 ) THEN ; iej = nn_hls ; ELSE ; iej = 0 ; ENDIF143 144 139 IF( kt == nit000 ) THEN !== 1st time step ==! 145 140 IF( ln_rstart .AND. .NOT.l_1st_euler ) THEN ! read in restart 146 141 z1_2 = 0.5_wp 147 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile142 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 148 143 IF(lwp) WRITE(numout,*) ' nit000-1 qsr tracer content forcing field read in the restart file' 149 144 CALL iom_get( numror, jpdom_auto, 'qsr_hc_b', qsr_hc_b ) ! before heat content trend due to Qsr flux … … 151 146 ELSE ! No restart or Euler forward at 1st time step 152 147 z1_2 = 1._wp 153 DO_3D ( isi, iei, isj, iej, 1, jpk )148 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 154 149 qsr_hc_b(ji,jj,jk) = 0._wp 155 150 END_3D … … 157 152 ELSE !== Swap of qsr heat content ==! 158 153 z1_2 = 0.5_wp 159 DO_3D ( isi, iei, isj, iej, 1, jpk )154 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk ) 160 155 qsr_hc_b(ji,jj,jk) = qsr_hc(ji,jj,jk) 161 156 END_3D … … 168 163 CASE( np_BIO ) !== bio-model fluxes ==! 169 164 ! 170 DO_3D ( isi, iei, isj, iej, 1, nksr )165 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr ) 171 166 qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( etot3(ji,jj,jk) - etot3(ji,jj,jk+1) ) 172 167 END_3D … … 179 174 ! 180 175 IF( nqsr == np_RGBc ) THEN !* Variable Chlorophyll 181 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only for the full domain182 IF( ln_tile ) CALL dom_tile ( ntsi, ntsj, ntei, ntej, ktile = 0 )! Use full domain176 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only for the full domain 177 IF( ln_tile ) CALL dom_tile_stop( ldhold=.TRUE. ) ! Use full domain 183 178 CALL fld_read( kt, 1, sf_chl ) ! Read Chl data and provides it at the current time step 184 IF( ln_tile ) CALL dom_tile ( ntsi, ntsj, ntei, ntej, ktile = 1) ! Revert to tile domain179 IF( ln_tile ) CALL dom_tile_start( ldhold=.TRUE. ) ! Revert to tile domain 185 180 ENDIF 186 181 ! … … 190 185 ! most expensive calculations) 191 186 ! 192 DO_2D ( isi, iei, isj, iej)187 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 193 188 ! zlogc = log(zchl) 194 189 zlogc = LOG ( MIN( 10. , MAX( 0.03, sf_chl(1)%fnow(ji,jj,1) ) ) ) … … 209 204 210 205 ! 211 DO_3D ( isi, iei, isj, iej, 1, nksr + 1 )206 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr + 1 ) 212 207 ! zchl = ALOG( ze0(ji,jj) ) 213 208 zlogc = ze0(ji,jj) … … 239 234 ! 240 235 zcoef = ( 1. - rn_abs ) / 3._wp !* surface equi-partition in R-G-B 241 DO_2D ( isi, iei, isj, iej)236 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 242 237 ze0(ji,jj) = rn_abs * qsr(ji,jj) 243 238 ze1(ji,jj) = zcoef * qsr(ji,jj) … … 250 245 ! 251 246 ! !* interior equi-partition in R-G-B depending on vertical profile of Chl 252 DO_3D ( isi, iei, isj, iej, 2, nksr + 1 )247 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 2, nksr + 1 ) 253 248 ze3t = e3t(ji,jj,jk-1,Kmm) 254 249 irgb = NINT( ztmp3d(ji,jj,jk) ) … … 264 259 END_3D 265 260 ! 266 DO_3D ( isi, iei, isj, iej, 1, nksr ) !* now qsr induced heat content261 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr ) !* now qsr induced heat content 267 262 qsr_hc(ji,jj,jk) = r1_rho0_rcp * ( ztmp3d(ji,jj,jk) - ztmp3d(ji,jj,jk+1) ) 268 263 END_3D … … 274 269 zz0 = rn_abs * r1_rho0_rcp ! surface equi-partition in 2-bands 275 270 zz1 = ( 1. - rn_abs ) * r1_rho0_rcp 276 DO_3D ( isi, iei, isj, iej, 1, nksr ) !* now qsr induced heat content271 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, 1, nksr ) !* now qsr induced heat content 277 272 zc0 = zz0 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk ,Kmm)*xsi1r ) 278 273 zc1 = zz0 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi0r ) + zz1 * EXP( -gdepw(ji,jj,jk+1,Kmm)*xsi1r ) … … 292 287 ! 293 288 ! sea-ice: store the 1st ocean level attenuation coefficient 294 DO_2D ( isi, iei, isj, iej)289 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 295 290 IF( qsr(ji,jj) /= 0._wp ) THEN ; fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rho0_rcp * qsr(ji,jj) ) 296 291 ELSE ; fraqsr_1lev(ji,jj) = 1._wp … … 298 293 END_2D 299 294 ! 300 ! TEMP: [tiling] This change not necessary and working array can use A2D(nn_hls) if using XIOS (subdomain support) 301 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only for the full domain 302 IF( iom_use('qsr3d') ) THEN ! output the shortwave Radiation distribution 303 ALLOCATE( zetot(jpi,jpj,jpk) ) 304 zetot(:,:,nksr+1:jpk) = 0._wp ! below ~400m set to zero 305 DO jk = nksr, 1, -1 306 zetot(:,:,jk) = zetot(:,:,jk+1) + qsr_hc(:,:,jk) * rho0_rcp 307 END DO 308 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation 309 DEALLOCATE( zetot ) 310 ENDIF 311 ENDIF 312 ! 313 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 295 IF( iom_use('qsr3d') ) THEN ! output the shortwave Radiation distribution 296 ALLOCATE( zetot(A2D(nn_hls),jpk) ) 297 zetot(:,:,nksr+1:jpk) = 0._wp ! below ~400m set to zero 298 DO_3DS(0, 0, 0, 0, nksr, 1, -1) 299 zetot(ji,jj,jk) = zetot(ji,jj,jk+1) + qsr_hc(ji,jj,jk) * rho0_rcp 300 END_3D 301 CALL iom_put( 'qsr3d', zetot ) ! 3D distribution of shortwave Radiation 302 DEALLOCATE( zetot ) 303 ENDIF 304 ! 305 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 314 306 IF( lrst_oce ) THEN ! write in the ocean restart file 315 307 CALL iom_rstput( kt, nitrst, numrow, 'qsr_hc_b' , qsr_hc ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/trasbc.F90
r14776 r14787 77 77 ! 78 78 INTEGER :: ji, jj, jk, jn ! dummy loop indices 79 INTEGER :: ikt, ikb , isi, iei, isj, iej! local integers79 INTEGER :: ikt, ikb ! local integers 80 80 REAL(wp) :: zfact, z1_e3t, zdep, ztim ! local scalar 81 81 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ztrdt, ztrds … … 84 84 IF( ln_timing ) CALL timing_start('tra_sbc') 85 85 ! 86 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile86 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 87 87 IF( kt == nit000 ) THEN 88 88 IF(lwp) WRITE(numout,*) … … 98 98 ENDIF 99 99 ! 100 IF( ntsi == Nis0 ) THEN ; isi = nn_hls ; ELSE ; isi = 0 ; ENDIF ! Avoid double-counting when using tiling101 IF( ntsj == Njs0 ) THEN ; isj = nn_hls ; ELSE ; isj = 0 ; ENDIF102 IF( ntei == Nie0 ) THEN ; iei = nn_hls ; ELSE ; iei = 0 ; ENDIF103 IF( ntej == Nje0 ) THEN ; iej = nn_hls ; ELSE ; iej = 0 ; ENDIF104 105 100 !!gm This should be moved into sbcmod.F90 module ? (especially now that ln_traqsr is read in namsbc namelist) 106 101 IF( .NOT.ln_traqsr ) THEN ! no solar radiation penetration 107 DO_2D ( isi, iei, isj, iej)102 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 108 103 qns(ji,jj) = qns(ji,jj) + qsr(ji,jj) ! total heat flux in qns 109 104 qsr(ji,jj) = 0._wp ! qsr set to zero … … 118 113 IF( ln_rstart .AND. .NOT.l_1st_euler ) THEN ! Restart: read in restart file 119 114 zfact = 0.5_wp 120 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile115 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 121 116 IF(lwp) WRITE(numout,*) ' nit000-1 sbc tracer content field read in the restart file' 122 117 sbc_tsc(:,:,:) = 0._wp … … 126 121 ELSE ! No restart or restart not found: Euler forward time stepping 127 122 zfact = 1._wp 128 DO_2D ( isi, iei, isj, iej)123 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 129 124 sbc_tsc(ji,jj,:) = 0._wp 130 125 sbc_tsc_b(ji,jj,:) = 0._wp … … 133 128 ELSE !* other time-steps: swap of forcing fields 134 129 zfact = 0.5_wp 135 DO_2D ( isi, iei, isj, iej)130 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 136 131 sbc_tsc_b(ji,jj,:) = sbc_tsc(ji,jj,:) 137 132 END_2D 138 133 ENDIF 139 134 ! !== Now sbc tracer content fields ==! 140 DO_2D ( isi, iei, isj, iej)135 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 141 136 sbc_tsc(ji,jj,jp_tem) = r1_rho0_rcp * qns(ji,jj) ! non solar heat flux 142 137 sbc_tsc(ji,jj,jp_sal) = r1_rho0 * sfx(ji,jj) ! salt flux due to freezing/melting 143 138 END_2D 144 139 IF( ln_linssh ) THEN !* linear free surface 145 DO_2D ( isi, iei, isj, iej) !==>> add concentration/dilution effect due to constant volume cell140 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) !==>> add concentration/dilution effect due to constant volume cell 146 141 sbc_tsc(ji,jj,jp_tem) = sbc_tsc(ji,jj,jp_tem) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_tem,Kmm) 147 142 sbc_tsc(ji,jj,jp_sal) = sbc_tsc(ji,jj,jp_sal) + r1_rho0 * emp(ji,jj) * pts(ji,jj,1,jp_sal,Kmm) 148 143 END_2D !==>> output c./d. term 149 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 150 IF( iom_use('emp_x_sst') ) CALL iom_put( "emp_x_sst", emp (:,:) * pts(:,:,1,jp_tem,Kmm) ) 151 IF( iom_use('emp_x_sss') ) CALL iom_put( "emp_x_sss", emp (:,:) * pts(:,:,1,jp_sal,Kmm) ) 152 ENDIF 144 IF( iom_use('emp_x_sst') ) CALL iom_put( "emp_x_sst", emp (:,:) * pts(:,:,1,jp_tem,Kmm) ) 145 IF( iom_use('emp_x_sss') ) CALL iom_put( "emp_x_sss", emp (:,:) * pts(:,:,1,jp_sal,Kmm) ) 153 146 ENDIF 154 147 ! … … 160 153 END DO 161 154 ! 162 IF( ntile == 0.OR. ntile == nijtile ) THEN ! Do only on the last tile155 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 163 156 IF( lrst_oce ) THEN !== write sbc_tsc in the ocean restart file ==! 164 157 CALL iom_rstput( kt, nitrst, numrow, 'sbc_hc_b', sbc_tsc(:,:,jp_tem) ) … … 186 179 ENDIF 187 180 188 IF( ntile == 0 .OR. ntile == nijtile ) THEN ! Do only on the last tile 189 IF( iom_use('rnf_x_sst') ) CALL iom_put( "rnf_x_sst", rnf*pts(:,:,1,jp_tem,Kmm) ) ! runoff term on sst 190 IF( iom_use('rnf_x_sss') ) CALL iom_put( "rnf_x_sss", rnf*pts(:,:,1,jp_sal,Kmm) ) ! runoff term on sss 191 ENDIF 181 IF( iom_use('rnf_x_sst') ) CALL iom_put( "rnf_x_sst", rnf*pts(:,:,1,jp_tem,Kmm) ) ! runoff term on sst 182 IF( iom_use('rnf_x_sss') ) CALL iom_put( "rnf_x_sss", rnf*pts(:,:,1,jp_sal,Kmm) ) ! runoff term on sss 192 183 193 184 #if defined key_asminc -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/trazdf.F90
r14776 r14787 64 64 ! 65 65 IF( kt == nit000 ) THEN 66 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile66 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 67 67 IF(lwp)WRITE(numout,*) 68 68 IF(lwp)WRITE(numout,*) 'tra_zdf : implicit vertical mixing on T & S' -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/zpshde.F90
r14776 r14787 174 174 pgru(:,:) = 0._wp 175 175 pgrv(:,:) = 0._wp ! depth of the partial step level 176 DO_2D( nn_hls , nn_hls-1, nn_hls, nn_hls-1 )176 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 177 177 iku = mbku(ji,jj) 178 178 ikv = mbkv(ji,jj) … … 190 190 CALL eos( ztj, zhj, zrj ) ! at the partial step depth output in zri, zrj 191 191 ! 192 DO_2D( nn_hls , nn_hls-1, nn_hls, nn_hls-1 ) ! Gradient of density at the last level192 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! Gradient of density at the last level 193 193 iku = mbku(ji,jj) 194 194 ikv = mbkv(ji,jj) … … 310 310 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! 311 311 ! 312 DO_2D( nn_hls -1, nn_hls-1, nn_hls-1, nn_hls-1 )312 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 313 313 314 314 iku = mbku(ji,jj); ikum1 = MAX( iku - 1 , 1 ) ! last and before last ocean level at u- & v-points … … 399 399 ! 400 400 DO jn = 1, kjpt !== Interpolation of tracers at the last ocean level ==! ! 401 DO_2D( nn_hls -1, nn_hls-1, nn_hls-1, nn_hls-1 )401 DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 402 402 iku = miku(ji,jj); ikup1 = miku(ji,jj) + 1 403 403 ikv = mikv(ji,jj); ikvp1 = mikv(ji,jj) + 1 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRD/trdini.F90
r14776 r14787 93 93 CALL ctl_warn('Tiling is not yet implemented for the trends diagnostics; ln_tile is forced to FALSE') 94 94 ln_tile = .FALSE. 95 CALL dom_tile ( ntsi, ntsj, ntei, ntej )95 CALL dom_tile_init 96 96 ENDIF 97 97 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfddm.F90
r14776 r14787 83 83 REAL(dp) :: zavfs ! - - 84 84 REAL(wp) :: zavdt, zavds ! - - 85 REAL(wp), DIMENSION( jpi,jpj) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd385 REAL(wp), DIMENSION(A2D(nn_hls)) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 86 86 !!---------------------------------------------------------------------- 87 87 ! … … 95 95 !!gm and many acces in memory 96 96 97 DO_2D( nn_hls , nn_hls, nn_hls, nn_hls) !== R=zrau = (alpha / beta) (dk[t] / dk[s]) ==!97 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !== R=zrau = (alpha / beta) (dk[t] / dk[s]) ==! 98 98 zrw = ( gdepw(ji,jj,jk ,Kmm) - gdept(ji,jj,jk,Kmm) ) & 99 99 !!gm please, use e3w at Kmm below … … 111 111 END_2D 112 112 113 DO_2D( nn_hls , nn_hls, nn_hls, nn_hls) !== indicators ==!113 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !== indicators ==! 114 114 ! stability indicator: msks=1 if rn2>0; 0 elsewhere 115 115 IF( rn2(ji,jj,jk) + 1.e-12 <= 0. ) THEN ; zmsks(ji,jj) = 0._wp … … 135 135 END_2D 136 136 ! mask zmsk in order to have avt and avs masked 137 zmsks(:,:) = zmsks(:,:) * wmask( :,:,jk)137 zmsks(:,:) = zmsks(:,:) * wmask(A2D(nn_hls),jk) 138 138 139 139 … … 141 141 ! ------------------ 142 142 ! Constant eddy coefficient: reset to the background value 143 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls)143 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 144 144 zinr = 1._wp / zrau(ji,jj) 145 145 ! salt fingering -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfdrg.F90
r14776 r14787 117 117 ! 118 118 IF( l_log_not_linssh ) THEN !== "log layer" ==! compute Cd and -Cd*|U| 119 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )119 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 120 120 imk = k_mk(ji,jj) ! ocean bottom level at t-points 121 121 zut = uu(ji,jj,imk,Kmm) + uu(ji-1,jj,imk,Kmm) ! 2 x velocity at t-point … … 129 129 END_2D 130 130 ELSE !== standard Cd ==! 131 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )131 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 132 132 imk = k_mk(ji,jj) ! ocean bottom level at t-points 133 133 zut = uu(ji,jj,imk,Kmm) + uu(ji-1,jj,imk,Kmm) ! 2 x velocity at t-point … … 176 176 ENDIF 177 177 178 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)178 DO_2D( 0, 0, 0, 0 ) 179 179 ikbu = mbku(ji,jj) ! deepest wet ocean u- & v-levels 180 180 ikbv = mbkv(ji,jj) … … 189 189 ! 190 190 IF( ln_isfcav ) THEN ! ocean cavities 191 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)191 DO_2D( 0, 0, 0, 0 ) 192 192 ikbu = miku(ji,jj) ! first wet ocean u- & v-levels 193 193 ikbv = mikv(ji,jj) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfevd.F90
r14776 r14787 62 62 ! 63 63 INTEGER :: ji, jj, jk ! dummy loop indices 64 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zavt_evd, zavm_evd 64 ! NOTE: [tiling] use a SAVE array to store diagnostics, then send after all tiles are finished. This is necessary because p_avt/p_avm are modified on adjacent tiles when using nn_hls > 1. zavt_evd/zavm_evd are then zero on some points when subsequently calculated for these tiles. 65 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: zavt_evd, zavm_evd 65 66 !!---------------------------------------------------------------------- 66 67 ! 67 IF( kt == nit000 ) THEN 68 IF(lwp) WRITE(numout,*) 69 IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)' 70 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 71 IF(lwp) WRITE(numout,*) 68 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 69 IF( kt == nit000 ) THEN 70 IF(lwp) WRITE(numout,*) 71 IF(lwp) WRITE(numout,*) 'zdf_evd : Enhanced Vertical Diffusion (evd)' 72 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 73 IF(lwp) WRITE(numout,*) 74 ENDIF 75 76 ALLOCATE( zavt_evd(jpi,jpj,jpk) ) 77 IF( nn_evdm == 1 ) ALLOCATE( zavm_evd(jpi,jpj,jpk) ) 72 78 ENDIF 73 79 ! 74 80 ! 75 zavt_evd(:,:,:) = p_avt(:,:,:) ! set avt prior to evd application 81 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 82 zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk) ! set avt prior to evd application 83 END_3D 76 84 ! 77 85 SELECT CASE ( nn_evdm ) … … 79 87 CASE ( 1 ) !== enhance tracer & momentum Kz ==! (if rn2<-1.e-12) 80 88 ! 81 zavm_evd(:,:,:) = p_avm(:,:,:) ! set avm prior to evd application 89 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 90 zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk) ! set avm prior to evd application 91 END_3D 82 92 ! 83 93 !! change last digits results … … 87 97 ! END WHERE 88 98 ! 89 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )99 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 90 100 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 91 101 p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) … … 94 104 END_3D 95 105 ! 96 zavm_evd(:,:,:) = p_avm(:,:,:) - zavm_evd(:,:,:) ! change in avm due to evd 97 CALL iom_put( "avm_evd", zavm_evd ) ! output this change 106 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 107 zavm_evd(ji,jj,jk) = p_avm(ji,jj,jk) - zavm_evd(ji,jj,jk) ! change in avm due to evd 108 END_3D 109 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 110 CALL iom_put( "avm_evd", zavm_evd ) ! output this change 111 DEALLOCATE( zavm_evd ) 112 ENDIF 98 113 ! 99 114 CASE DEFAULT !== enhance tracer Kz ==! (if rn2<-1.e-12) … … 103 118 ! END WHERE 104 119 105 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )120 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 106 121 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) & 107 122 p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) … … 110 125 END SELECT 111 126 ! 112 zavt_evd(:,:,:) = p_avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd 113 CALL iom_put( "avt_evd", zavt_evd ) ! output this change 127 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 128 zavt_evd(ji,jj,jk) = p_avt(ji,jj,jk) - zavt_evd(ji,jj,jk) ! change in avt due to evd 129 END_3D 130 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 131 CALL iom_put( "avt_evd", zavt_evd ) ! output this change 132 DEALLOCATE( zavt_evd ) 133 ENDIF 114 134 IF( l_trdtra ) CALL trd_tra( kt, Kmm, Krhs, 'TRA', jp_tem, jptra_evd, zavt_evd ) 115 135 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfgls.F90
r14776 r14787 137 137 USE zdf_oce , ONLY : en, avtb, avmb ! ocean vertical physics 138 138 !! 139 INTEGER , INTENT(in ) :: kt ! ocean time step140 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices141 REAL(wp), DIMENSION( :,:,:), INTENT(in ) :: p_sh2 ! shear production term142 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points)139 INTEGER , INTENT(in ) :: kt ! ocean time step 140 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 141 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in ) :: p_sh2 ! shear production term 142 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 143 143 ! 144 144 INTEGER :: ji, jj, jk ! dummy loop arguments … … 151 151 REAL(wp) :: gh, gm, shr, dif, zsqen, zavt, zavm ! - - 152 152 REAL(wp) :: zmsku, zmskv ! - - 153 REAL(wp), DIMENSION( jpi,jpj) :: zdep154 REAL(wp), DIMENSION( jpi,jpj) :: zkar155 REAL(wp), DIMENSION( jpi,jpj) :: zflxs! Turbulence fluxed induced by internal waves156 REAL(wp), DIMENSION( jpi,jpj) :: zhsro! Surface roughness (surface waves)157 REAL(wp), DIMENSION( jpi,jpj) :: zice_fra! Tapering of wave breaking under sea ice158 REAL(wp), DIMENSION( jpi,jpj,jpk) :: eb! tke at time before159 REAL(wp), DIMENSION( jpi,jpj,jpk) :: hmxl_b! mixing length at time before160 REAL(wp), DIMENSION( jpi,jpj,jpk) :: eps! dissipation rate161 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zwall_psi! Wall function use in the wb case (ln_sigpsi)162 REAL(wp), DIMENSION( jpi,jpj,jpk) :: psi! psi at time now163 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zd_lw, zd_up, zdiag ! lower, upper and diagonal of the matrix164 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zstt, zstm! stability function on tracer and momentum153 REAL(wp), DIMENSION(A2D(nn_hls)) :: zdep 154 REAL(wp), DIMENSION(A2D(nn_hls)) :: zkar 155 REAL(wp), DIMENSION(A2D(nn_hls)) :: zflxs ! Turbulence fluxed induced by internal waves 156 REAL(wp), DIMENSION(A2D(nn_hls)) :: zhsro ! Surface roughness (surface waves) 157 REAL(wp), DIMENSION(A2D(nn_hls)) :: zice_fra ! Tapering of wave breaking under sea ice 158 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: eb ! tke at time before 159 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: hmxl_b ! mixing length at time before 160 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: eps ! dissipation rate 161 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zwall_psi ! Wall function use in the wb case (ln_sigpsi) 162 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: psi ! psi at time now 163 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zd_lw, zd_up, zdiag ! lower, upper and diagonal of the matrix 164 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zstt, zstm ! stability function on tracer and momentum 165 165 !!-------------------------------------------------------------------- 166 166 ! 167 167 ! Preliminary computing 168 169 ustar2_surf(:,:) = 0._wp ; psi(:,:,:) = 0._wp 170 ustar2_top (:,:) = 0._wp ; zwall_psi(:,:,:) = 0._wp 171 ustar2_bot (:,:) = 0._wp 168 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 169 ustar2_surf(ji,jj) = 0._wp ; ustar2_top(ji,jj) = 0._wp ; ustar2_bot(ji,jj) = 0._wp 170 END_2D 171 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 172 psi(ji,jj,jk) = 0._wp ; zwall_psi(ji,jj,jk) = 0._wp 173 END_3D 172 174 173 175 SELECT CASE ( nn_z0_ice ) 174 176 CASE( 0 ) ; zice_fra(:,:) = 0._wp 175 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i( :,:) * 10._wp )176 CASE( 2 ) ; zice_fra(:,:) = fr_i( :,:)177 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i( :,:) , 1._wp )177 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(A2D(nn_hls)) * 10._wp ) 178 CASE( 2 ) ; zice_fra(:,:) = fr_i(A2D(nn_hls)) 179 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(A2D(nn_hls)) , 1._wp ) 178 180 END SELECT 179 181 180 182 ! Compute surface, top and bottom friction at T-points 181 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !== surface ocean friction183 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !== surface ocean friction 182 184 ustar2_surf(ji,jj) = r1_rho0 * taum(ji,jj) * tmask(ji,jj,1) ! surface friction 183 185 END_2D … … 186 188 ! 187 189 IF( .NOT.ln_drg_OFF ) THEN !== top/bottom friction (explicit before friction) 188 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! bottom friction (explicit before friction)190 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! bottom friction (explicit before friction) 189 191 zmsku = 0.5_wp * ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 190 192 zmskv = 0.5_wp * ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) ! (CAUTION: CdU<0) … … 193 195 END_2D 194 196 IF( ln_isfcav ) THEN 195 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! top friction197 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! top friction 196 198 zmsku = 0.5_wp * ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 197 199 zmskv = 0.5_wp * ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) ! (CAUTION: CdU<0) … … 206 208 zhsro(:,:) = rn_hsro 207 209 CASE ( 1 ) ! Standard Charnock formula 208 zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf( :,:) , rn_hsro )210 zhsro(:,:) = MAX( rsbc_zs1 * ustar2_surf(A2D(nn_hls)) , rn_hsro ) 209 211 CASE ( 2 ) ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 210 212 !!gm faster coding : the 2 comment lines should be used 211 213 !!gm zcof = 2._wp * 0.6_wp / 28._wp 212 214 !!gm zdep(:,:) = 30._wp * TANH( zcof/ SQRT( MAX(ustar2_surf(:,:),rsmall) ) ) ! Wave age (eq. 10) 213 zdep (:,:) = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(:,:),rsmall))) ) ! Wave age (eq. 10) 214 zhsro(:,:) = MAX(rsbc_zs2 * ustar2_surf(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 215 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 216 zcof = 30.*TANH( 2.*0.3/(28.*SQRT(MAX(ustar2_surf(ji,jj),rsmall))) ) ! Wave age (eq. 10) 217 zhsro(ji,jj) = MAX(rsbc_zs2 * ustar2_surf(ji,jj) * zcof**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 218 END_2D 215 219 CASE ( 3 ) ! Roughness given by the wave model (coupled or read in file) 216 zhsro(:,:) = MAX(rn_frac_hs * hsw( :,:), rn_hsro) ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 )220 zhsro(:,:) = MAX(rn_frac_hs * hsw(A2D(nn_hls)), rn_hsro) ! (rn_frac_hs=1.6 see Eq. (5) of Rascle et al. 2008 ) 217 221 END SELECT 218 222 ! 219 223 ! adapt roughness where there is sea ice 220 zhsro(:,:) = ( (1._wp-zice_fra(:,:)) * zhsro(:,:) + zice_fra(:,:) * rn_hsri )*tmask(:,:,1) + (1._wp - tmask(:,:,1))*rn_hsro 224 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 225 zhsro(ji,jj) = ( (1._wp-zice_fra(ji,jj)) * zhsro(ji,jj) + zice_fra(ji,jj) * rn_hsri )*tmask(ji,jj,1) + & 226 & (1._wp - tmask(ji,jj,1))*rn_hsro 227 END_2D 221 228 ! 222 229 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !== Compute dissipation rate ==! … … 225 232 226 233 ! Save tke at before time step 227 eb (:,:,:) = en (:,:,:) 228 hmxl_b(:,:,:) = hmxl_n(:,:,:) 234 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 235 eb (ji,jj,jk) = en (ji,jj,jk) 236 hmxl_b(ji,jj,jk) = hmxl_n(ji,jj,jk) 237 END_3D 229 238 230 239 IF( nn_clos == 0 ) THEN ! Mellor-Yamada 231 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )240 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 232 241 zup = hmxl_n(ji,jj,jk) * gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) 233 242 zdown = vkarmn * gdepw(ji,jj,jk,Kmm) * ( -gdepw(ji,jj,jk,Kmm) + gdepw(ji,jj,mbkt(ji,jj)+1,Kmm) ) … … 250 259 ! Warning : after this step, en : right hand side of the matrix 251 260 252 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )261 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 253 262 ! 254 263 buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk) ! stratif. destruction … … 303 312 ! 304 313 CASE ( 0 ) ! Dirichlet boundary condition (set e at k=1 & 2) 305 ! First level 306 en (:,:,1) = MAX( rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 ) 307 zd_lw(:,:,1) = en(:,:,1) 308 zd_up(:,:,1) = 0._wp 309 zdiag(:,:,1) = 1._wp 310 ! 311 ! One level below 312 en (:,:,2) = MAX( rc02r * ustar2_surf(:,:) * ( 1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1 * ((zhsro(:,:)+gdepw(:,:,2,Kmm)) & 313 & / zhsro(:,:) )**(1.5_wp*ra_sf) )**(2._wp/3._wp) , rn_emin ) 314 zd_lw(:,:,2) = 0._wp 315 zd_up(:,:,2) = 0._wp 316 zdiag(:,:,2) = 1._wp 317 ! 318 ! 314 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 315 ! First level 316 en (ji,jj,1) = MAX( rn_emin , rc02r * ustar2_surf(ji,jj) * (1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1)**r2_3 ) 317 zd_lw(ji,jj,1) = en(ji,jj,1) 318 zd_up(ji,jj,1) = 0._wp 319 zdiag(ji,jj,1) = 1._wp 320 ! 321 ! One level below 322 en (ji,jj,2) = MAX( rn_emin , rc02r * ustar2_surf(ji,jj) * (1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1 & 323 & * ((zhsro(ji,jj)+gdepw(ji,jj,2,Kmm)) / zhsro(ji,jj) )**(1.5_wp*ra_sf) )**r2_3 ) 324 zd_lw(ji,jj,2) = 0._wp 325 zd_up(ji,jj,2) = 0._wp 326 zdiag(ji,jj,2) = 1._wp 327 END_2D 328 ! 329 ! 319 330 CASE ( 1 ) ! Neumann boundary condition (set d(e)/dz) 320 ! 321 ! Dirichlet conditions at k=1 322 en (:,:,1) = MAX( rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 , rn_emin ) 323 zd_lw(:,:,1) = en(:,:,1) 324 zd_up(:,:,1) = 0._wp 325 zdiag(:,:,1) = 1._wp 326 ! 327 ! at k=2, set de/dz=Fw 328 !cbr 329 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! zdiag zd_lw not defined/used on the halo 330 zdiag(ji,jj,2) = zdiag(ji,jj,2) + zd_lw(ji,jj,2) ! Remove zd_lw from zdiag 331 zd_lw(ji,jj,2) = 0._wp 332 END_2D 333 zkar (:,:) = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept(:,:,1,Kmm)/zhsro(:,:)) )) 334 zflxs(:,:) = rsbc_tke2 * (1._wp-zice_fra(:,:)) * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 335 & * ( ( zhsro(:,:)+gdept(:,:,1,Kmm) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 331 ! 332 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 333 ! Dirichlet conditions at k=1 334 en (ji,jj,1) = MAX( rn_emin , rc02r * ustar2_surf(ji,jj) * (1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1)**r2_3 ) 335 zd_lw(ji,jj,1) = en(ji,jj,1) 336 zd_up(ji,jj,1) = 0._wp 337 zdiag(ji,jj,1) = 1._wp 338 ! 339 ! at k=2, set de/dz=Fw 340 !cbr 341 ! zdiag zd_lw not defined/used on the halo 342 zdiag(ji,jj,2) = zdiag(ji,jj,2) + zd_lw(ji,jj,2) ! Remove zd_lw from zdiag 343 zd_lw(ji,jj,2) = 0._wp 344 ! 345 zkar (ji,jj) = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept(ji,jj,1,Kmm)/zhsro(ji,jj)) )) 346 zflxs(ji,jj) = rsbc_tke2 * (1._wp-zice_fra(ji,jj)) * ustar2_surf(ji,jj)**1.5_wp * zkar(ji,jj) & 347 & * ( ( zhsro(ji,jj)+gdept(ji,jj,1,Kmm) ) / zhsro(ji,jj) )**(1.5_wp*ra_sf) 336 348 !!gm why not : * ( 1._wp + gdept(:,:,1,Kmm) / zhsro(:,:) )**(1.5_wp*ra_sf) 337 en(:,:,2) = en(:,:,2) + zflxs(:,:) / e3w(:,:,2,Kmm) 338 ! 339 ! 349 en(ji,jj,2) = en(ji,jj,2) + zflxs(ji,jj) / e3w(ji,jj,2,Kmm) 350 END_2D 351 ! 352 ! 340 353 END SELECT 341 354 … … 348 361 ! ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 349 362 ! ! Balance between the production and the dissipation terms 350 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )363 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 351 364 !!gm This means that bottom and ocean w-level above have a specified "en" value. Sure ???? 352 365 !! With thick deep ocean level thickness, this may be quite large, no ??? … … 365 378 END_2D 366 379 ! 380 ! NOTE: ctl_stop with ln_isfcav when using GLS 367 381 IF( ln_isfcav) THEN ! top boundary (ocean cavity) 368 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )382 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 369 383 itop = mikt(ji,jj) ! k top w-point 370 384 itopp1 = mikt(ji,jj) + 1 ! k+1 1st w-point below the top one … … 384 398 CASE ( 1 ) ! Neumman boundary condition 385 399 ! 386 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )400 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 387 401 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 388 402 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 … … 398 412 en (ji,jj,ibot) = z_en 399 413 END_2D 414 ! NOTE: ctl_stop with ln_isfcav when using GLS 400 415 IF( ln_isfcav) THEN ! top boundary (ocean cavity) 401 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )416 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 402 417 itop = mikt(ji,jj) ! k top w-point 403 418 itopp1 = mikt(ji,jj) + 1 ! k+1 1st w-point below the top one … … 426 441 zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 427 442 END_3D 428 DO_3DS ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 ) ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk443 DO_3DS_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 ) ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 429 444 en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 430 445 END_3D 431 446 ! ! set the minimum value of tke 432 en(:,:,:) = MAX( en(:,:,:), rn_emin ) 447 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 448 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) 449 END_3D 433 450 434 451 !!----------------------------------------!! … … 516 533 CASE ( 0 ) ! Dirichlet boundary conditions 517 534 ! 518 ! Surface value 519 zdep (:,:) = zhsro(:,:) * rl_sf ! Cosmetic 520 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 521 zd_lw(:,:,1) = psi(:,:,1) 522 zd_up(:,:,1) = 0._wp 523 zdiag(:,:,1) = 1._wp 524 ! 525 ! One level below 526 zkar (:,:) = (rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdepw(:,:,2,Kmm)/zhsro(:,:) ))) 527 zdep (:,:) = (zhsro(:,:) + gdepw(:,:,2,Kmm)) * zkar(:,:) 528 psi (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 529 zd_lw(:,:,2) = 0._wp 530 zd_up(:,:,2) = 0._wp 531 zdiag(:,:,2) = 1._wp 535 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 536 ! Surface value 537 zdep (ji,jj) = zhsro(ji,jj) * rl_sf ! Cosmetic 538 psi (ji,jj,1) = rc0**rpp * en(ji,jj,1)**rmm * zdep(ji,jj)**rnn * tmask(ji,jj,1) 539 zd_lw(ji,jj,1) = psi(ji,jj,1) 540 zd_up(ji,jj,1) = 0._wp 541 zdiag(ji,jj,1) = 1._wp 542 ! 543 ! One level below 544 zkar (ji,jj) = (rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdepw(ji,jj,2,Kmm)/zhsro(ji,jj) ))) 545 zdep (ji,jj) = (zhsro(ji,jj) + gdepw(ji,jj,2,Kmm)) * zkar(ji,jj) 546 psi (ji,jj,2) = rc0**rpp * en(ji,jj,2)**rmm * zdep(ji,jj)**rnn * tmask(ji,jj,1) 547 zd_lw(ji,jj,2) = 0._wp 548 zd_up(ji,jj,2) = 0._wp 549 zdiag(ji,jj,2) = 1._wp 550 END_2D 532 551 ! 533 552 CASE ( 1 ) ! Neumann boundary condition on d(psi)/dz 534 553 ! 535 ! Surface value: Dirichlet536 zdep (:,:) = zhsro(:,:) * rl_sf537 psi (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1)538 zd_lw(:,:,1) = psi(:,:,1)539 zd_up(:,:,1) = 0._wp540 zdiag(:,:,1) = 1._wp541 !542 ! Neumann condition at k=2543 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) !zdiag zd_lw not defined/used on the halo554 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 555 ! Surface value: Dirichlet 556 zdep (ji,jj) = zhsro(ji,jj) * rl_sf 557 psi (ji,jj,1) = rc0**rpp * en(ji,jj,1)**rmm * zdep(ji,jj)**rnn * tmask(ji,jj,1) 558 zd_lw(ji,jj,1) = psi(ji,jj,1) 559 zd_up(ji,jj,1) = 0._wp 560 zdiag(ji,jj,1) = 1._wp 561 ! 562 ! Neumann condition at k=2, zdiag zd_lw not defined/used on the halo 544 563 zdiag(ji,jj,2) = zdiag(ji,jj,2) + zd_lw(ji,jj,2) ! Remove zd_lw from zdiag 545 564 zd_lw(ji,jj,2) = 0._wp 565 ! 566 ! Set psi vertical flux at the surface: 567 zkar (ji,jj) = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept(ji,jj,1,Kmm)/zhsro(ji,jj) )) ! Lengh scale slope 568 zdep (ji,jj) = ((zhsro(ji,jj) + gdept(ji,jj,1,Kmm)) / zhsro(ji,jj))**(rmm*ra_sf) 569 zflxs(ji,jj) = (rnn + (1._wp-zice_fra(ji,jj))*rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(ji,jj)) & 570 & *(1._wp + (1._wp-zice_fra(ji,jj))*rsbc_tke1*zdep(ji,jj))**(2._wp*rmm/3._wp-1_wp) 571 zdep (ji,jj) = rsbc_psi1 * (zwall_psi(ji,jj,1)*p_avm(ji,jj,1)+zwall_psi(ji,jj,2)*p_avm(ji,jj,2)) * & 572 & ustar2_surf(ji,jj)**rmm * zkar(ji,jj)**rnn * (zhsro(ji,jj) + gdept(ji,jj,1,Kmm))**(rnn-1.) 573 zflxs(ji,jj) = zdep(ji,jj) * zflxs(ji,jj) 574 psi (ji,jj,2) = psi(ji,jj,2) + zflxs(ji,jj) / e3w(ji,jj,2,Kmm) 546 575 END_2D 547 !548 ! Set psi vertical flux at the surface:549 zkar (:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept(:,:,1,Kmm)/zhsro(:,:) )) ! Lengh scale slope550 zdep (:,:) = ((zhsro(:,:) + gdept(:,:,1,Kmm)) / zhsro(:,:))**(rmm*ra_sf)551 zflxs(:,:) = (rnn + (1._wp-zice_fra(:,:))*rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:)) &552 & *(1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp)553 zdep (:,:) = rsbc_psi1 * (zwall_psi(:,:,1)*p_avm(:,:,1)+zwall_psi(:,:,2)*p_avm(:,:,2)) * &554 & ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept(:,:,1,Kmm))**(rnn-1.)555 zflxs(:,:) = zdep(:,:) * zflxs(:,:)556 psi (:,:,2) = psi(:,:,2) + zflxs(:,:) / e3w(:,:,2,Kmm)557 576 ! 558 577 END SELECT … … 658 677 ! Limit dissipation rate under stable stratification 659 678 ! -------------------------------------------------- 660 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) ! Note that this set boundary conditions on hmxl_n at the same time679 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) ! Note that this set boundary conditions on hmxl_n at the same time 661 680 ! limitation 662 681 eps (ji,jj,jk) = MAX( eps(ji,jj,jk), rn_epsmin ) 663 682 hmxl_n(ji,jj,jk) = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / eps(ji,jj,jk) 664 ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 665 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 666 IF( ln_length_lim ) hmxl_n(ji,jj,jk) = MIN( rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxl_n(ji,jj,jk) ) 667 END_3D 683 END_3D 684 IF( ln_length_lim ) THEN ! Galperin criterium (NOTE : Not required if the proper value of C3 in stable cases is calculated) 685 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 686 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 687 hmxl_n(ji,jj,jk) = MIN( rn_clim_galp * SQRT( 2._wp * en(ji,jj,jk) / zrn2 ), hmxl_n(ji,jj,jk) ) 688 END_3D 689 ENDIF 668 690 669 691 ! … … 727 749 END_2D 728 750 729 zstt(:,:, 1) = wmask( :,:, 1) ! default value not needed but avoid a bug when looking for undefined values (-fpe0)730 zstt(:,:,jpk) = wmask( :,:,jpk) ! default value not needed but avoid a bug when looking for undefined values (-fpe0)751 zstt(:,:, 1) = wmask(A2D(nn_hls), 1) ! default value not needed but avoid a bug when looking for undefined values (-fpe0) 752 zstt(:,:,jpk) = wmask(A2D(nn_hls),jpk) ! default value not needed but avoid a bug when looking for undefined values (-fpe0) 731 753 732 754 !!gm should be done for ISF (top boundary cond.) … … 738 760 ! later overwritten by surface/bottom boundaries conditions, so we don't really care of p_avm(:,:1) and p_avm(:,:jpk) 739 761 ! for zd_lw and zd_up but they have to be defined to avoid a bug when looking for undefined values (-fpe0) 740 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk )762 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) 741 763 zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk) 742 764 zavt = zsqen * zstt(ji,jj,jk) … … 745 767 p_avm(ji,jj,jk) = MAX( zavm, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom 746 768 END_3D 747 p_avt( :,:,1) = 0._wp769 p_avt(A2D(nn_hls),1) = 0._wp 748 770 ! 749 771 IF(sn_cfctl%l_prtctl) THEN -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfiwm.F90
r14776 r14787 125 125 ! 126 126 INTEGER :: ji, jj, jk ! dummy loop indices 127 REAL(wp) :: zztmp, ztmp1, ztmp2 ! scalar workspace 128 REAL(wp), DIMENSION(jpi,jpj) :: zfact ! Used for vertical structure 129 REAL(wp), DIMENSION(jpi,jpj) :: zhdep ! Ocean depth 130 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwkb ! WKB-stretched height above bottom 131 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zweight ! Weight for high mode vertical distribution 132 REAL(wp), DIMENSION(jpi,jpj,jpk) :: znu_t ! Molecular kinematic viscosity (T grid) 133 REAL(wp), DIMENSION(jpi,jpj,jpk) :: znu_w ! Molecular kinematic viscosity (W grid) 134 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zReb ! Turbulence intensity parameter 135 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zemx_iwm ! local energy density available for mixing (W/kg) 136 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zav_ratio ! S/T diffusivity ratio (only for ln_tsdiff=T) 137 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zav_wave ! Internal wave-induced diffusivity 127 REAL(wp), SAVE :: zztmp 128 REAL(wp) :: ztmp1, ztmp2 ! scalar workspace 129 REAL(wp), DIMENSION(A2D(nn_hls)) :: zfact ! Used for vertical structure 130 REAL(wp), DIMENSION(A2D(nn_hls)) :: zhdep ! Ocean depth 131 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zwkb ! WKB-stretched height above bottom 132 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zweight ! Weight for high mode vertical distribution 133 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: znu_t ! Molecular kinematic viscosity (T grid) 134 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: znu_w ! Molecular kinematic viscosity (W grid) 135 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zReb ! Turbulence intensity parameter 136 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zemx_iwm ! local energy density available for mixing (W/kg) 137 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zav_ratio ! S/T diffusivity ratio (only for ln_tsdiff=T) 138 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zav_wave ! Internal wave-induced diffusivity 138 139 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3d ! 3D workspace used for iom_put 139 140 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: z2d ! 2D - - - - … … 308 309 ! 309 310 IF( kt == nit000 ) THEN !* Control print at first time-step: diagnose the energy consumed by zav_wave 310 zztmp = 0._wp311 IF( .NOT. l_istiled .OR. ntile == 1 ) zztmp = 0._wp ! Do only on the first tile 311 312 !!gm used of glosum 3D.... 312 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )313 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) 313 314 zztmp = zztmp + e3w(ji,jj,jk,Kmm) * e1e2t(ji,jj) & 314 315 & * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 315 316 END_3D 316 CALL mpp_sum( 'zdfiwm', zztmp ) 317 zztmp = rho0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing 318 ! 319 IF(lwp) THEN 320 WRITE(numout,*) 321 WRITE(numout,*) 'zdf_iwm : Internal wave-driven mixing (iwm)' 322 WRITE(numout,*) '~~~~~~~ ' 323 WRITE(numout,*) 324 WRITE(numout,*) ' Total power consumption by av_wave = ', zztmp * 1.e-12_wp, 'TW' 317 318 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 319 CALL mpp_sum( 'zdfiwm', zztmp ) 320 zztmp = rho0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing 321 ! 322 IF(lwp) THEN 323 WRITE(numout,*) 324 WRITE(numout,*) 'zdf_iwm : Internal wave-driven mixing (iwm)' 325 WRITE(numout,*) '~~~~~~~ ' 326 WRITE(numout,*) 327 WRITE(numout,*) ' Total power consumption by av_wave = ', zztmp * 1.e-12_wp, 'TW' 328 ENDIF 325 329 ENDIF 326 330 ENDIF … … 341 345 END_3D 342 346 CALL iom_put( "av_ratio", zav_ratio ) 343 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* update momentum & tracer diffusivity with wave-driven mixing347 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* update momentum & tracer diffusivity with wave-driven mixing 344 348 p_avs(ji,jj,jk) = p_avs(ji,jj,jk) + zav_wave(ji,jj,jk) * zav_ratio(ji,jj,jk) 345 349 p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zav_wave(ji,jj,jk) … … 348 352 ! 349 353 ELSE !* update momentum & tracer diffusivity with wave-driven mixing 350 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )354 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 351 355 p_avs(ji,jj,jk) = p_avs(ji,jj,jk) + zav_wave(ji,jj,jk) 352 356 p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zav_wave(ji,jj,jk) … … 361 365 ! vertical integral of rho0 * Kz * N^2 , energy density (zemx_iwm) 362 366 IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN 363 ALLOCATE( z2d( jpi,jpj) , z3d(jpi,jpj,jpk) )367 ALLOCATE( z2d(A2D(nn_hls)) , z3d(A2D(nn_hls),jpk) ) 364 368 ! Initialisation for iom_put 365 369 DO_2D( 0, 0, 0, 0 ) 366 370 z3d(ji,jj,1) = 0._wp ; z3d(ji,jj,jpk) = 0._wp 367 371 END_2D 368 z3d( 1:nn_hls,:,:) = 0._wp ; z3d(:, 1:nn_hls,:) = 0._wp369 z3d(jpi-nn_hls+1:jpi ,:,:) = 0._wp ; z3d(:,jpj-nn_hls+1: jpj,:) = 0._wp370 z2d( 1:nn_hls,: ) = 0._wp ; z2d(:, 1:nn_hls ) = 0._wp371 z2d(jpi-nn_hls+1:jpi ,: ) = 0._wp ; z2d(:,jpj-nn_hls+1: jpj ) = 0._wp372 372 373 373 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfmfc.F90
r14776 r14787 96 96 INTEGER , INTENT(in) :: Kmm, Krhs ! time level indices 97 97 REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts ! active tracers and RHS of tracer equation 98 REAL(wp), DIMENSION( jpi,jpj,jpk,2) :: ztsp ! T/S of the plume99 REAL(wp), DIMENSION( jpi,jpj,jpk,2) :: ztse ! T/S at W point100 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zrwp !101 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zrwp2 !102 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zapp !103 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zedmf !104 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zepsT, zepsW !105 ! 106 REAL(wp), DIMENSION( jpi,jpj) :: zustar, zustar2 !107 REAL(wp), DIMENSION( jpi,jpj) :: zuws, zvws, zsws, zfnet !108 REAL(wp), DIMENSION( jpi,jpj) :: zfbuo, zrautbm1, zrautb, zraupl109 REAL(wp), DIMENSION( jpi,jpj) :: zwpsurf !110 REAL(wp), DIMENSION( jpi,jpj) :: zop0 , zsp0 !111 REAL(wp), DIMENSION( jpi,jpj) :: zrwp_0, zrwp2_0 !112 REAL(wp), DIMENSION( jpi,jpj) :: zapp0 !113 REAL(wp), DIMENSION( jpi,jpj) :: zphp, zph, zphpm1, zphm1, zNHydro114 REAL(wp), DIMENSION( jpi,jpj) :: zhcmo !115 ! 116 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zn2 ! N^2117 REAL(wp), DIMENSION( jpi,jpj,2 ) :: zab, zabm1, zabp ! alpha and beta98 REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) :: ztsp ! T/S of the plume 99 REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) :: ztse ! T/S at W point 100 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zrwp ! 101 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zrwp2 ! 102 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zapp ! 103 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zedmf ! 104 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zepsT, zepsW ! 105 ! 106 REAL(wp), DIMENSION(A2D(nn_hls)) :: zustar, zustar2 ! 107 REAL(wp), DIMENSION(A2D(nn_hls)) :: zuws, zvws, zsws, zfnet ! 108 REAL(wp), DIMENSION(A2D(nn_hls)) :: zfbuo, zrautbm1, zrautb, zraupl 109 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwpsurf ! 110 REAL(wp), DIMENSION(A2D(nn_hls)) :: zop0 , zsp0 ! 111 REAL(wp), DIMENSION(A2D(nn_hls)) :: zrwp_0, zrwp2_0 ! 112 REAL(wp), DIMENSION(A2D(nn_hls)) :: zapp0 ! 113 REAL(wp), DIMENSION(A2D(nn_hls)) :: zphp, zph, zphpm1, zphm1, zNHydro 114 REAL(wp), DIMENSION(A2D(nn_hls)) :: zhcmo ! 115 ! 116 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zn2 ! N^2 117 REAL(wp), DIMENSION(A2D(nn_hls),2 ) :: zab, zabm1, zabp ! alpha and beta 118 118 119 119 REAL(wp), PARAMETER :: zepsilon = 1.e-30 ! local small value … … 136 136 zcd = 1._wp 137 137 138 !------------------------------------------------------------------ 139 ! Surface boundary condition 140 !------------------------------------------------------------------ 141 ! surface Stress 142 !-------------------- 143 zuws(:,:) = utau(:,:) * r1_rho0 144 zvws(:,:) = vtau(:,:) * r1_rho0 145 zustar2(:,:) = SQRT(zuws(:,:)*zuws(:,:)+zvws(:,:)*zvws(:,:)) 146 zustar(:,:) = SQRT(zustar2(:,:)) 147 148 ! Heat Flux 149 !-------------------- 150 zfnet(:,:) = qns(:,:) + qsr(:,:) 151 zfnet(:,:) = zfnet(:,:) / (rho0 * rcp) 152 153 ! Water Flux 154 !--------------------- 155 zsws(:,:) = emp(:,:) 156 157 !------------------------------------------- 158 ! Initialisation of prognostic variables 159 !------------------------------------------- 160 zrwp (:,:,:) = 0._wp ; zrwp2(:,:,:) = 0._wp ; zedmf(:,:,:) = 0._wp 161 zph (:,:) = 0._wp ; zphm1(:,:) = 0._wp ; zphpm1(:,:) = 0._wp 162 ztsp(:,:,:,:)= 0._wp 163 164 ! Tracers inside plume (ztsp) and environment (ztse) 165 ztsp(:,:,1,jp_tem) = pts(:,:,1,jp_tem,Kmm) * tmask(:,:,1) 166 ztsp(:,:,1,jp_sal) = pts(:,:,1,jp_sal,Kmm) * tmask(:,:,1) 167 ztse(:,:,1,jp_tem) = pts(:,:,1,jp_tem,Kmm) * tmask(:,:,1) 168 ztse(:,:,1,jp_sal) = pts(:,:,1,jp_sal,Kmm) * tmask(:,:,1) 138 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 139 !------------------------------------------------------------------ 140 ! Surface boundary condition 141 !------------------------------------------------------------------ 142 ! surface Stress 143 !-------------------- 144 zuws(ji,jj) = utau(ji,jj) * r1_rho0 145 zvws(ji,jj) = vtau(ji,jj) * r1_rho0 146 zustar2(ji,jj) = SQRT(zuws(ji,jj)*zuws(ji,jj)+zvws(ji,jj)*zvws(ji,jj)) 147 zustar(ji,jj) = SQRT(zustar2(ji,jj)) 148 149 ! Heat Flux 150 !-------------------- 151 zfnet(ji,jj) = qns(ji,jj) + qsr(ji,jj) 152 zfnet(ji,jj) = zfnet(ji,jj) / (rho0 * rcp) 153 154 ! Water Flux 155 !--------------------- 156 zsws(ji,jj) = emp(ji,jj) 157 158 !------------------------------------------- 159 ! Initialisation of prognostic variables 160 !------------------------------------------- 161 zrwp (ji,jj,:) = 0._wp ; zrwp2(ji,jj,:) = 0._wp ; zedmf(ji,jj,:) = 0._wp 162 zph (ji,jj) = 0._wp ; zphm1(ji,jj) = 0._wp ; zphpm1(ji,jj) = 0._wp 163 ztsp(ji,jj,:,:)= 0._wp 164 165 ! Tracers inside plume (ztsp) and environment (ztse) 166 ztsp(ji,jj,1,jp_tem) = pts(ji,jj,1,jp_tem,Kmm) * tmask(ji,jj,1) 167 ztsp(ji,jj,1,jp_sal) = pts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1) 168 ztse(ji,jj,1,jp_tem) = pts(ji,jj,1,jp_tem,Kmm) * tmask(ji,jj,1) 169 ztse(ji,jj,1,jp_sal) = pts(ji,jj,1,jp_sal,Kmm) * tmask(ji,jj,1) 170 END_2D 169 171 170 172 CALL eos( ztse(:,:,1,:) , zrautb(:,:) ) … … 174 176 ! Boundary Condition of Mass Flux (plume velo.; convective area, entrain/detrain) 175 177 !------------------------------------------- 176 zhcmo(:,:) = e3t( :,:,1,Kmm)178 zhcmo(:,:) = e3t(A1Di(nn_hls),A1Dj(nn_hls),1,Kmm) 177 179 zfbuo(:,:) = 0._wp 178 180 WHERE ( ABS(zrautb(:,:)) > 1.e-20 ) zfbuo(:,:) = & 179 & grav * ( 2.e-4_wp *zfnet(:,:) - 7.6E-4_wp*pts(:,:,1,jp_sal,Kmm)*zsws(:,:)/zrautb(:,:)) * zhcmo(:,:) 181 & grav * ( 2.e-4_wp *zfnet(:,:) & 182 & - 7.6E-4_wp*pts(A2D(nn_hls),1,jp_sal,Kmm) & 183 & * zsws(:,:)/zrautb(:,:)) * zhcmo(:,:) 180 184 181 185 zedmf(:,:,1) = -0.065_wp*(ABS(zfbuo(:,:)))**(1._wp/3._wp)*SIGN(1.,zfbuo(:,:)) … … 211 215 CALL eos( ztsp(:,:,jk-1,: ) , zraupl(:,:) ) 212 216 213 zphm1(:,:) = zphm1(:,:) + grav * zrautbm1(:,:) * e3t(:,:,jk-1, Kmm) 214 zphpm1(:,:) = zphpm1(:,:) + grav * zraupl(:,:) * e3t(:,:,jk-1, Kmm) 215 zph(:,:) = zphm1(:,:) + grav * zrautb(:,:) * e3t(:,:,jk , Kmm) 216 zph(:,:) = MAX( zph(:,:), zepsilon) 217 DO_2D( 0, 0, 0, 0 ) 218 zphm1(ji,jj) = zphm1(ji,jj) + grav * zrautbm1(ji,jj) * e3t(ji,jj,jk-1, Kmm) 219 zphpm1(ji,jj) = zphpm1(ji,jj) + grav * zraupl(ji,jj) * e3t(ji,jj,jk-1, Kmm) 220 zph(ji,jj) = zphm1(ji,jj) + grav * zrautb(ji,jj) * e3t(ji,jj,jk , Kmm) 221 zph(ji,jj) = MAX( zph(ji,jj), zepsilon) 222 END_2D 217 223 218 224 WHERE(zrautbm1 .NE. 0.) zfbuo(:,:) = grav * (zraupl(:,:) - zrautbm1(:,:)) / zrautbm1(:,:) 219 225 220 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1)226 DO_2D( 0, 0, 0, 0 ) 221 227 222 228 ! Compute Environment of Plume. Interpolation T/S (before time step) on W-points … … 322 328 323 329 ! Compute Mass Flux on T-point 324 DO jk=1,jpk-1 325 edmfm(:,:,jk) = (zedmf(:,:,jk+1) + zedmf(:,:,jk) )*0.5_wp 326 END DO 327 edmfm(:,:,jpk) = zedmf(:,:,jpk) 330 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 331 edmfm(ji,jj,jk) = (zedmf(ji,jj,jk+1) + zedmf(ji,jj,jk) )*0.5_wp 332 END_3D 333 DO_2D( 0, 0, 0, 0 ) 334 edmfm(ji,jj,jpk) = zedmf(ji,jj,jpk) 335 END_2D 328 336 329 337 ! Save variable (on T point) … … 338 346 ! Computation of a tridiagonal matrix and right hand side terms of the linear system 339 347 !================================================================================= 340 edmfa(:,:,:) = 0._wp 341 edmfb(:,:,:) = 0._wp 342 edmfc(:,:,:) = 0._wp 343 edmftra(:,:,:,:) = 0._wp 348 DO_3D( 0, 0, 0, 0, 1, jpk ) 349 edmfa(ji,jj,jk) = 0._wp 350 edmfb(ji,jj,jk) = 0._wp 351 edmfc(ji,jj,jk) = 0._wp 352 edmftra(ji,jj,jk,:) = 0._wp 353 END_3D 344 354 345 355 !--------------------------------------------------------------- 346 356 ! Diagonal terms 347 357 !--------------------------------------------------------------- 348 DO jk=1,jpk-1 349 edmfa(:,:,jk) = 0._wp 350 edmfb(:,:,jk) = -edmfm(:,:,jk ) / e3w(:,:,jk+1,Kmm) 351 edmfc(:,:,jk) = edmfm(:,:,jk+1) / e3w(:,:,jk+1,Kmm) 352 END DO 353 edmfa(:,:,jpk) = -edmfm(:,:,jpk-1) / e3w(:,:,jpk,Kmm) 354 edmfb(:,:,jpk) = edmfm(:,:,jpk ) / e3w(:,:,jpk,Kmm) 355 edmfc(:,:,jpk) = 0._wp 358 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 359 edmfa(ji,jj,jk) = 0._wp 360 edmfb(ji,jj,jk) = -edmfm(ji,jj,jk ) / e3w(ji,jj,jk+1,Kmm) 361 edmfc(ji,jj,jk) = edmfm(ji,jj,jk+1) / e3w(ji,jj,jk+1,Kmm) 362 END_3D 363 DO_2D( 0, 0, 0, 0 ) 364 edmfa(ji,jj,jpk) = -edmfm(ji,jj,jpk-1) / e3w(ji,jj,jpk,Kmm) 365 edmfb(ji,jj,jpk) = edmfm(ji,jj,jpk ) / e3w(ji,jj,jpk,Kmm) 366 edmfc(ji,jj,jpk) = 0._wp 367 END_2D 356 368 357 369 !--------------------------------------------------------------- 358 370 ! right hand side term for Temperature 359 371 !--------------------------------------------------------------- 360 DO jk=1,jpk-1 361 edmftra(:,:,jk,1) = - edmfm(:,:,jk ) * ztsp(:,:,jk ,jp_tem) / e3w(:,:,jk+1,Kmm) & 362 & + edmfm(:,:,jk+1) * ztsp(:,:,jk+1,jp_tem) / e3w(:,:,jk+1,Kmm) 363 END DO 364 edmftra(:,:,jpk,1) = - edmfm(:,:,jpk-1) * ztsp(:,:,jpk-1,jp_tem) / e3w(:,:,jpk,Kmm) & 365 & + edmfm(:,:,jpk ) * ztsp(:,:,jpk ,jp_tem) / e3w(:,:,jpk,Kmm) 366 372 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 373 edmftra(ji,jj,jk,1) = - edmfm(ji,jj,jk ) * ztsp(ji,jj,jk ,jp_tem) / e3w(ji,jj,jk+1,Kmm) & 374 & + edmfm(ji,jj,jk+1) * ztsp(ji,jj,jk+1,jp_tem) / e3w(ji,jj,jk+1,Kmm) 375 END_3D 376 DO_2D( 0, 0, 0, 0 ) 377 edmftra(ji,jj,jpk,1) = - edmfm(ji,jj,jpk-1) * ztsp(ji,jj,jpk-1,jp_tem) / e3w(ji,jj,jpk,Kmm) & 378 & + edmfm(ji,jj,jpk ) * ztsp(ji,jj,jpk ,jp_tem) / e3w(ji,jj,jpk,Kmm) 379 END_2D 380 367 381 !--------------------------------------------------------------- 368 382 ! Right hand side term for Salinity 369 383 !--------------------------------------------------------------- 370 DO jk=1,jpk-1 371 edmftra(:,:,jk,2) = - edmfm(:,:,jk ) * ztsp(:,:,jk ,jp_sal) / e3w(:,:,jk+1,Kmm) & 372 & + edmfm(:,:,jk+1) * ztsp(:,:,jk+1,jp_sal) / e3w(:,:,jk+1,Kmm) 373 END DO 374 edmftra(:,:,jpk,2) = - edmfm(:,:,jpk-1) * ztsp(:,:,jpk-1,jp_sal) / e3w(:,:,jpk,Kmm) & 375 & + edmfm(:,:,jpk ) * ztsp(:,:,jpk ,jp_sal) / e3w(:,:,jpk,Kmm) 376 ! 377 ! 378 IF (nn_hls==1) CALL lbc_lnk( 'zdfmfc', edmfm,'T',1., edmfa,'T',1., edmfb,'T',1., edmfc,'T',1., edmftra(:,:,:,jp_tem),'T',1., edmftra(:,:,:,jp_sal),'T',1.) 384 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 385 edmftra(ji,jj,jk,2) = - edmfm(ji,jj,jk ) * ztsp(ji,jj,jk ,jp_sal) / e3w(ji,jj,jk+1,Kmm) & 386 & + edmfm(ji,jj,jk+1) * ztsp(ji,jj,jk+1,jp_sal) / e3w(ji,jj,jk+1,Kmm) 387 END_3D 388 DO_2D( 0, 0, 0, 0 ) 389 edmftra(ji,jj,jpk,2) = - edmfm(ji,jj,jpk-1) * ztsp(ji,jj,jpk-1,jp_sal) / e3w(ji,jj,jpk,Kmm) & 390 & + edmfm(ji,jj,jpk ) * ztsp(ji,jj,jpk ,jp_sal) / e3w(ji,jj,jpk,Kmm) 391 END_2D 379 392 ! 380 393 END SUBROUTINE tra_mfc … … 383 396 SUBROUTINE diag_mfc( zdiagi, zdiagd, zdiags, p2dt, Kaa ) 384 397 385 REAL(wp), DIMENSION( jpi,jpj,jpk), INTENT(inout) :: zdiagi, zdiagd, zdiags ! inout: tridaig. terms386 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step387 INTEGER , INTENT(in ) :: Kaa ! ocean time level indices398 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) :: zdiagi, zdiagd, zdiags ! inout: tridaig. terms 399 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 400 INTEGER , INTENT(in ) :: Kaa ! ocean time level indices 388 401 389 402 INTEGER :: ji, jj, jk ! dummy loop arguments -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfmxl.F90
r14776 r14787 26 26 PRIVATE 27 27 28 PUBLIC zdf_mxl ! called by zdfphy.F9028 PUBLIC zdf_mxl, zdf_mxl_turb ! called by zdfphy.F90 29 29 30 30 INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: nmln !: number of level in the mixed layer (used by LDF, ZDF, TRD, TOP) … … 41 41 !!---------------------------------------------------------------------- 42 42 !! NEMO/OCE 4.0 , NEMO Consortium (2018) 43 !! $Id$ 43 !! $Id$ 44 44 !! Software governed by the CeCILL license (see ./LICENSE) 45 45 !!---------------------------------------------------------------------- … … 65 65 !! *** ROUTINE zdfmxl *** 66 66 !! 67 !! ** Purpose : Compute the turbocline depth and the mixed layer depth 68 !! with density criteria. 67 !! ** Purpose : Compute the mixed layer depth with density criteria. 69 68 !! 70 69 !! ** Method : The mixed layer depth is the shallowest W depth with 71 70 !! the density of the corresponding T point (just bellow) bellow a 72 71 !! given value defined locally as rho(10m) + rho_c 73 !! The turbocline depth is the depth at which the vertical74 !! eddy diffusivity coefficient (resulting from the vertical physics75 !! alone, not the isopycnal part, see trazdf.F) fall below a given76 !! value defined locally (avt_c here taken equal to 5 cm/s2 by default)77 72 !! 78 !! ** Action : nmln, hml d, hmlp, hmlpt73 !! ** Action : nmln, hmlp, hmlpt 79 74 !!---------------------------------------------------------------------- 80 75 INTEGER, INTENT(in) :: kt ! ocean time-step index … … 82 77 ! 83 78 INTEGER :: ji, jj, jk ! dummy loop indices 84 INTEGER :: iik n, iiki, ikt! local integer79 INTEGER :: iik, ikt ! local integer 85 80 REAL(wp) :: zN2_c ! local scalar 86 INTEGER, DIMENSION(jpi,jpj) :: imld ! 2D workspace87 81 !!---------------------------------------------------------------------- 88 82 ! 89 IF( kt == nit000 ) THEN 90 IF(lwp) WRITE(numout,*) 91 IF(lwp) WRITE(numout,*) 'zdf_mxl : mixed layer depth' 92 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 93 ! ! allocate zdfmxl arrays 94 IF( zdf_mxl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_mxl : unable to allocate arrays' ) 83 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 84 IF( kt == nit000 ) THEN 85 IF(lwp) WRITE(numout,*) 86 IF(lwp) WRITE(numout,*) 'zdf_mxl : mixed layer depth' 87 IF(lwp) WRITE(numout,*) '~~~~~~~ ' 88 ! ! allocate zdfmxl arrays 89 IF( zdf_mxl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'zdf_mxl : unable to allocate arrays' ) 90 ENDIF 95 91 ENDIF 96 92 ! 97 93 ! w-level of the mixing and mixed layers 98 nmln(:,:) = nlb10 ! Initialization to the number of w ocean point 99 hmlp(:,:) = 0._wp ! here hmlp used as a dummy variable, integrating vertically N^2 94 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 95 nmln(ji,jj) = nlb10 ! Initialization to the number of w ocean point 96 hmlp(ji,jj) = 0._wp ! here hmlp used as a dummy variable, integrating vertically N^2 97 END_2D 100 98 zN2_c = grav * rho_c * r1_rho0 ! convert density criteria into N^2 criteria 101 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, nlb10, jpkm1 ) ! Mixed layer level: w-level99 DO_3D_OVR( nn_hls, nn_hls, nn_hls, nn_hls, nlb10, jpkm1 ) ! Mixed layer level: w-level 102 100 ikt = mbkt(ji,jj) 103 101 hmlp(ji,jj) = & … … 105 103 IF( hmlp(ji,jj) < zN2_c ) nmln(ji,jj) = MIN( jk , ikt ) + 1 ! Mixed layer level 106 104 END_3D 107 ! 108 ! w-level of the turbocline and mixing layer (iom_use) 109 imld(:,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point 110 DO_3DS( nn_hls, nn_hls, nn_hls, nn_hls, jpkm1, nlb10, -1 ) ! from the bottom to nlb10 111 IF( avt (ji,jj,jk) < avt_c * wmask(ji,jj,jk) ) imld(ji,jj) = jk ! Turbocline 112 END_3D 113 ! depth of the mixing and mixed layers 114 DO_2D( nn_hls, nn_hls, nn_hls, nn_hls ) 115 iiki = imld(ji,jj) 116 iikn = nmln(ji,jj) 117 hmld (ji,jj) = gdepw(ji,jj,iiki ,Kmm) * ssmask(ji,jj) ! Turbocline depth 118 hmlp (ji,jj) = gdepw(ji,jj,iikn ,Kmm) * ssmask(ji,jj) ! Mixed layer depth 119 hmlpt(ji,jj) = gdept(ji,jj,iikn-1,Kmm) * ssmask(ji,jj) ! depth of the last T-point inside the mixed layer 105 ! depth of the mixed layer 106 DO_2D_OVR( nn_hls, nn_hls, nn_hls, nn_hls ) 107 iik = nmln(ji,jj) 108 hmlp (ji,jj) = gdepw(ji,jj,iik ,Kmm) * ssmask(ji,jj) ! Mixed layer depth 109 hmlpt(ji,jj) = gdept(ji,jj,iik-1,Kmm) * ssmask(ji,jj) ! depth of the last T-point inside the mixed layer 120 110 END_2D 121 111 ! 122 IF( .NOT.l_offline ) THEN 123 IF( iom_use("mldr10_1") ) THEN 124 IF( ln_isfcav ) THEN ; CALL iom_put( "mldr10_1", hmlp - risfdep) ! mixed layer thickness 125 ELSE ; CALL iom_put( "mldr10_1", hmlp ) ! mixed layer depth 126 END IF 112 IF( .NOT.l_offline .AND. iom_use("mldr10_1") ) THEN 113 IF( ln_isfcav ) THEN ; CALL iom_put( "mldr10_1", hmlp - risfdep) ! mixed layer thickness 114 ELSE ; CALL iom_put( "mldr10_1", hmlp ) ! mixed layer depth 127 115 END IF 128 IF( iom_use("mldkz5") ) THEN129 IF( ln_isfcav ) THEN ; CALL iom_put( "mldkz5" , hmld - risfdep ) ! turbocline thickness130 ELSE ; CALL iom_put( "mldkz5" , hmld ) ! turbocline depth131 END IF132 ENDIF133 116 ENDIF 134 117 ! … … 137 120 END SUBROUTINE zdf_mxl 138 121 122 123 SUBROUTINE zdf_mxl_turb( kt, Kmm ) 124 !!---------------------------------------------------------------------- 125 !! *** ROUTINE zdf_mxl_turb *** 126 !! 127 !! ** Purpose : Compute the turbocline depth. 128 !! 129 !! ** Method : The turbocline depth is the depth at which the vertical 130 !! eddy diffusivity coefficient (resulting from the vertical physics 131 !! alone, not the isopycnal part, see trazdf.F) fall below a given 132 !! value defined locally (avt_c here taken equal to 5 cm/s2 by default) 133 !! 134 !! ** Action : hmld 135 !!---------------------------------------------------------------------- 136 INTEGER, INTENT(in) :: kt ! ocean time-step index 137 INTEGER, INTENT(in) :: Kmm ! ocean time level index 138 ! 139 INTEGER :: ji, jj, jk ! dummy loop indices 140 INTEGER :: iik ! local integer 141 INTEGER, DIMENSION(A2D(nn_hls)) :: imld ! 2D workspace 142 !!---------------------------------------------------------------------- 143 ! 144 ! w-level of the turbocline and mixing layer (iom_use) 145 imld(:,:) = mbkt(A2D(nn_hls)) + 1 ! Initialization to the number of w ocean point 146 DO_3DS( 1, 1, 1, 1, jpkm1, nlb10, -1 ) ! from the bottom to nlb10 147 IF( avt (ji,jj,jk) < avt_c * wmask(ji,jj,jk) ) imld(ji,jj) = jk ! Turbocline 148 END_3D 149 ! depth of the mixing layer 150 DO_2D_OVR( 1, 1, 1, 1 ) 151 iik = imld(ji,jj) 152 hmld (ji,jj) = gdepw(ji,jj,iik ,Kmm) * ssmask(ji,jj) ! Turbocline depth 153 END_2D 154 ! 155 IF( .NOT.l_offline .AND. iom_use("mldkz5") ) THEN 156 IF( ln_isfcav ) THEN ; CALL iom_put( "mldkz5" , hmld - risfdep ) ! turbocline thickness 157 ELSE ; CALL iom_put( "mldkz5" , hmld ) ! turbocline depth 158 END IF 159 ENDIF 160 ! 161 END SUBROUTINE zdf_mxl_turb 139 162 !!====================================================================== 140 163 END MODULE zdfmxl -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfphy.F90
r14776 r14787 12 12 !!---------------------------------------------------------------------- 13 13 USE oce ! ocean dynamics and tracers variables 14 ! TEMP: [tiling] This change not necessary after finalisation of zdf_osm (not yet tiled) 15 USE domtile 14 16 USE zdf_oce ! vertical physics: shared variables 15 17 USE zdfdrg ! vertical physics: top/bottom drag coef. … … 56 58 LOGICAL, PUBLIC :: l_zdfsh2 ! shear production term flag (=F for CST, =T otherwise (i.e. TKE, GLS, RIC)) 57 59 60 REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) :: avm_k_n !: "Now" avm_k used for calculation of zsh2 with tiling 61 62 !! * Substitutions 63 # include "do_loop_substitute.h90" 58 64 !!---------------------------------------------------------------------- 59 65 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 180 186 IF( lk_top .AND. ln_zdfnpc ) CALL ctl_stop( 'zdf_phy_init: npc scheme is not working with key_top' ) 181 187 IF( lk_top .AND. ln_zdfosm ) CALL ctl_warn( 'zdf_phy_init: osmosis gives no non-local fluxes for TOP tracers yet' ) 188 ! TEMP: [tiling] This change not necessary after finalisation of zdf_osm (not yet tiled) 189 IF( ln_tile .AND. ln_zdfosm ) CALL ctl_warn( 'zdf_phy_init: osmosis does not yet work with tiling' ) 182 190 IF( lk_top .AND. ln_zdfmfc ) CALL ctl_stop( 'zdf_phy_init: Mass Flux scheme is not working with key_top' ) 183 191 IF(lwp) THEN … … 210 218 ENDIF 211 219 ! ! shear production term flag 212 IF( ln_zdfcst ) THEN ; l_zdfsh2 = .FALSE. 213 ELSE ; l_zdfsh2 = .TRUE. 214 ENDIF 220 IF( ln_zdfcst .OR. ln_zdfosm ) THEN ; l_zdfsh2 = .FALSE. 221 ELSE ; l_zdfsh2 = .TRUE. 222 ENDIF 223 IF( ln_tile .AND. l_zdfsh2 ) ALLOCATE( avm_k_n(jpi,jpj,jpk) ) 215 224 ! !== Mass Flux Convectiive algorithm ==! 216 225 IF( ln_zdfmfc ) CALL zdf_mfc_init ! Convection computed with eddy diffusivity mass flux … … 246 255 ! 247 256 INTEGER :: ji, jj, jk ! dummy loop indice 248 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zsh2 ! shear production 257 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zsh2 ! shear production 258 ! TEMP: [tiling] This change not necessary after finalisation of zdf_osm (not yet tiled) 259 LOGICAL :: lskip 249 260 !! --------------------------------------------------------------------- 250 261 ! 251 262 IF( ln_timing ) CALL timing_start('zdf_phy') 263 264 ! TEMP: [tiling] These changes not necessary after finalisation of zdf_osm (not yet tiled) 265 lskip = .FALSE. 266 267 IF( ln_tile .AND. nzdf_phy == np_OSM ) THEN 268 IF( ntile == 1 ) THEN 269 CALL dom_tile_stop( ldhold=.TRUE. ) 270 ELSE 271 lskip = .TRUE. 272 ENDIF 273 ENDIF 252 274 ! 253 275 IF( l_zdfdrg ) THEN !== update top/bottom drag ==! (non-linear cases) … … 267 289 IF ( ln_drgice_imp) THEN 268 290 IF ( ln_isfcav ) THEN 269 rCdU_top(:,:) = rCdU_top(:,:) + ssmask(:,:) * tmask(:,:,1) * rCdU_ice(:,:) 291 DO_2D_OVR( 1, 1, 1, 1 ) 292 rCdU_top(ji,jj) = rCdU_top(ji,jj) + ssmask(ji,jj) * tmask(ji,jj,1) * rCdU_ice(ji,jj) 293 END_2D 270 294 ELSE 271 rCdU_top(:,:) = rCdU_ice(:,:) 295 DO_2D_OVR( 1, 1, 1, 1 ) 296 rCdU_top(ji,jj) = rCdU_ice(ji,jj) 297 END_2D 272 298 ENDIF 273 299 ENDIF 274 300 #endif 275 301 ! 276 ! !== Kz from chosen turbulent closure ==! (avm_k, avt_k) 277 ! 278 IF( l_zdfsh2 ) & !* shear production at w-points (energy conserving form) 279 CALL zdf_sh2( Kbb, Kmm, avm_k, & ! <<== in 280 & zsh2 ) ! ==>> out : shear production 281 ! 282 SELECT CASE ( nzdf_phy ) !* Vertical eddy viscosity and diffusivity coefficients at w-points 283 CASE( np_RIC ) ; CALL zdf_ric( kt, Kmm, zsh2, avm_k, avt_k ) ! Richardson number dependent Kz 284 CASE( np_TKE ) ; CALL zdf_tke( kt, Kbb, Kmm, zsh2, avm_k, avt_k ) ! TKE closure scheme for Kz 285 CASE( np_GLS ) ; CALL zdf_gls( kt, Kbb, Kmm, zsh2, avm_k, avt_k ) ! GLS closure scheme for Kz 286 CASE( np_OSM ) ; CALL zdf_osm( kt, Kbb, Kmm, Krhs, avm_k, avt_k ) ! OSMOSIS closure scheme for Kz 287 ! CASE( np_CST ) ! Constant Kz (reset avt, avm to the background value) 288 ! ! avt_k and avm_k set one for all at initialisation phase 302 CALL zdf_mxl( kt, Kmm ) !* mixed layer depth, and level 303 304 ! TEMP: [tiling] These changes not necessary after finalisation of zdf_osm (not yet tiled) 305 IF( .NOT. lskip ) THEN 306 ! !== Kz from chosen turbulent closure ==! (avm_k, avt_k) 307 ! 308 ! NOTE: [tiling] the closure schemes (zdf_tke etc) will update avm_k. With tiling, the calculation of zsh2 on adjacent tiles then uses both updated (next timestep) and non-updated (current timestep) values of avm_k. To preserve results, we save a read-only copy of the "now" avm_k to use in the calculation of zsh2. 309 IF( l_zdfsh2 ) THEN !* shear production at w-points (energy conserving form) 310 IF( ln_tile ) THEN 311 IF( ntile == 1 ) avm_k_n(:,:,:) = avm_k(:,:,:) ! Preserve "now" avm_k for calculation of zsh2 312 CALL zdf_sh2( Kbb, Kmm, avm_k_n, & ! <<== in 313 & zsh2 ) ! ==>> out : shear production 314 ELSE 315 CALL zdf_sh2( Kbb, Kmm, avm_k, & ! <<== in 316 & zsh2 ) ! ==>> out : shear production 317 ENDIF 318 ENDIF 319 ! 320 SELECT CASE ( nzdf_phy ) !* Vertical eddy viscosity and diffusivity coefficients at w-points 321 CASE( np_RIC ) ; CALL zdf_ric( kt, Kmm, zsh2, avm_k, avt_k ) ! Richardson number dependent Kz 322 CASE( np_TKE ) ; CALL zdf_tke( kt, Kbb, Kmm, zsh2, avm_k, avt_k ) ! TKE closure scheme for Kz 323 CASE( np_GLS ) ; CALL zdf_gls( kt, Kbb, Kmm, zsh2, avm_k, avt_k ) ! GLS closure scheme for Kz 324 CASE( np_OSM ) ; CALL zdf_osm( kt, Kbb, Kmm, Krhs, avm_k, avt_k ) ! OSMOSIS closure scheme for Kz 325 ! CASE( np_CST ) ! Constant Kz (reset avt, avm to the background value) 326 ! ! avt_k and avm_k set one for all at initialisation phase 289 327 !!gm avt(2:jpim1,2:jpjm1,1:jpkm1) = rn_avt0 * wmask(2:jpim1,2:jpjm1,1:jpkm1) 290 328 !!gm avm(2:jpim1,2:jpjm1,1:jpkm1) = rn_avm0 * wmask(2:jpim1,2:jpjm1,1:jpkm1) 291 END SELECT 329 END SELECT 330 331 IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE. ) 332 ENDIF 292 333 ! 293 334 ! !== ocean Kz ==! (avt, avs, avm) 294 335 ! 295 336 ! !* start from turbulent closure values 296 avt(:,:,2:jpkm1) = avt_k(:,:,2:jpkm1) 297 avm(:,:,2:jpkm1) = avm_k(:,:,2:jpkm1) 337 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 338 avt(ji,jj,jk) = avt_k(ji,jj,jk) 339 avm(ji,jj,jk) = avm_k(ji,jj,jk) 340 END_3D 298 341 ! 299 342 IF( ln_rnf_mouth ) THEN !* increase diffusivity at rivers mouths 300 DO jk = 2, nkrnf301 avt( :,:,jk) = avt(:,:,jk) + 2._wp * rn_avt_rnf * rnfmsk(:,:) * wmask(:,:,jk)302 END DO343 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, nkrnf ) 344 avt(ji,jj,jk) = avt(ji,jj,jk) + 2._wp * rn_avt_rnf * rnfmsk(ji,jj) * wmask(ji,jj,jk) 345 END_3D 303 346 ENDIF 304 347 ! … … 309 352 CALL zdf_ddm( kt, Kmm, avm, avt, avs ) 310 353 ELSE ! same mixing on all tracers 311 avs(2:jpim1,2:jpjm1,1:jpkm1) = avt(2:jpim1,2:jpjm1,1:jpkm1) 354 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) 355 avs(ji,jj,jk) = avt(ji,jj,jk) 356 END_3D 312 357 ENDIF 313 358 ! … … 318 363 #if defined key_agrif 319 364 ! interpolation parent grid => child grid for avm_k ( ex : at west border: update column 1 and 2) 320 IF( l_zdfsh2 ) CALL Agrif_avm 365 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 366 IF( l_zdfsh2 ) CALL Agrif_avm 367 ENDIF 321 368 #endif 322 369 323 370 ! !* Lateral boundary conditions (sign unchanged) 324 IF(nn_hls==1) THEN 371 IF(nn_hls==1) THEN 325 372 IF( l_zdfsh2 ) THEN 326 373 CALL lbc_lnk( 'zdfphy', avm_k, 'W', 1.0_wp , avt_k, 'W', 1.0_wp, & 327 &avm , 'W', 1.0_wp , avt , 'W', 1.0_wp , avs , 'W', 1.0_wp )374 & avm , 'W', 1.0_wp , avt , 'W', 1.0_wp , avs , 'W', 1.0_wp ) 328 375 ELSE 329 376 CALL lbc_lnk( 'zdfphy', avm , 'W', 1.0_wp , avt , 'W', 1.0_wp , avs , 'W', 1.0_wp ) 330 377 ENDIF 331 !378 ! 332 379 IF( l_zdfdrg ) THEN ! drag have been updated (non-linear cases) 333 380 IF( ln_isfcav ) THEN ; CALL lbc_lnk( 'zdfphy', rCdU_top, 'T', 1.0_wp , rCdU_bot, 'T', 1.0_wp ) ! top & bot drag 334 ELSE ; CALL lbc_lnk( 'zdfphy', rCdU_bot, 'T', 1.0_wp ) ! bottom drag only381 ELSE ; CALL lbc_lnk( 'zdfphy', rCdU_bot, 'T', 1.0_wp ) ! bottom drag only 335 382 ENDIF 336 383 ENDIF 337 384 ENDIF 338 385 ! 339 CALL zdf_mxl( kt, Kmm ) !* mixed layer depth, and level 340 ! 341 IF( lrst_oce ) THEN !* write TKE, GLS or RIC fields in the restart file 342 IF( ln_zdftke ) CALL tke_rst( kt, 'WRITE' ) 343 IF( ln_zdfgls ) CALL gls_rst( kt, 'WRITE' ) 344 IF( ln_zdfric ) CALL ric_rst( kt, 'WRITE' ) 345 ! NB. OSMOSIS restart (osm_rst) will be called in step.F90 after ww has been updated 386 CALL zdf_mxl_turb( kt, Kmm ) !* turbocline depth 387 ! 388 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 389 IF( lrst_oce ) THEN !* write TKE, GLS or RIC fields in the restart file 390 IF( ln_zdftke ) CALL tke_rst( kt, 'WRITE' ) 391 IF( ln_zdfgls ) CALL gls_rst( kt, 'WRITE' ) 392 IF( ln_zdfric ) CALL ric_rst( kt, 'WRITE' ) 393 ! NB. OSMOSIS restart (osm_rst) will be called in step.F90 after ww has been updated 394 ENDIF 346 395 ENDIF 347 396 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfric.F90
r14776 r14787 145 145 !! PFJ Lermusiaux 2001. 146 146 !!---------------------------------------------------------------------- 147 INTEGER , INTENT(in ) :: kt ! ocean time-step148 INTEGER , INTENT(in ) :: Kmm ! ocean time level index149 REAL(wp), DIMENSION( :,:,:), INTENT(in ) :: p_sh2 ! shear production term150 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points)147 INTEGER , INTENT(in ) :: kt ! ocean time-step 148 INTEGER , INTENT(in ) :: Kmm ! ocean time level index 149 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in ) :: p_sh2 ! shear production term 150 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 151 151 !! 152 152 INTEGER :: ji, jj, jk ! dummy loop indices 153 153 REAL(wp) :: zcfRi, zav, zustar, zhek ! local scalars 154 REAL(wp), DIMENSION( jpi,jpj) :: zh_ekm ! 2D workspace154 REAL(wp), DIMENSION(A2D(nn_hls)) :: zh_ekm ! 2D workspace 155 155 !!---------------------------------------------------------------------- 156 156 ! 157 157 ! !== avm and avt = F(Richardson number) ==! 158 DO_3D ( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 2, jpkm1 ) ! coefficient = F(richardson number) (avm-weighted Ri)158 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 2, jpkm1 ) ! coefficient = F(richardson number) (avm-weighted Ri) 159 159 zcfRi = 1._wp / ( 1._wp + rn_alp * MAX( 0._wp , avm(ji,jj,jk) * rn2(ji,jj,jk) / ( p_sh2(ji,jj,jk) + 1.e-20 ) ) ) 160 160 zav = rn_avmri * zcfRi**nn_ric … … 174 174 zh_ekm(ji,jj) = MAX( rn_mldmin , MIN( zhek , rn_mldmax ) ) ! set allowed range 175 175 END_2D 176 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* minimum mixing coeff. within the Ekman layer176 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* minimum mixing coeff. within the Ekman layer 177 177 IF( gdept(ji,jj,jk,Kmm) < zh_ekm(ji,jj) ) THEN 178 178 p_avm(ji,jj,jk) = MAX( p_avm(ji,jj,jk), rn_wvmix ) * wmask(ji,jj,jk) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfsh2.F90
r14776 r14787 55 55 !! References : Bruchard, OM 2002 56 56 !! --------------------------------------------------------------------- 57 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices58 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm ! vertical eddy viscosity (w-points)59 REAL(wp), DIMENSION( :,:,:) , INTENT( out) :: p_sh2 ! shear production of TKE (w-points)57 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 58 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm ! vertical eddy viscosity (w-points) 59 REAL(wp), DIMENSION(A2D(nn_hls),jpk) , INTENT( out) :: p_sh2 ! shear production of TKE (w-points) 60 60 ! 61 61 INTEGER :: ji, jj, jk ! dummy loop arguments 62 REAL(wp), DIMENSION( jpi,jpj) :: zsh2u, zsh2v ! 2D workspace62 REAL(wp), DIMENSION(A2D(nn_hls)) :: zsh2u, zsh2v ! 2D workspace 63 63 !!-------------------------------------------------------------------- 64 64 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdfswm.F90
r14776 r14787 63 63 ! 64 64 zcoef = 1._wp * 0.353553_wp 65 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )65 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 66 66 zqb = zcoef * hsw(ji,jj) * tsd2d(ji,jj) * EXP( -3. * wnum(ji,jj) * gdepw(ji,jj,jk,Kmm) ) * wmask(ji,jj,jk) 67 67 ! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ZDF/zdftke.F90
r14776 r14787 168 168 !! Bruchard OM 2002 169 169 !!---------------------------------------------------------------------- 170 INTEGER , INTENT(in ) :: kt ! ocean time step171 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices172 REAL(wp), DIMENSION( :,:,:), INTENT(in ) :: p_sh2 ! shear production term173 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points)170 INTEGER , INTENT(in ) :: kt ! ocean time step 171 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 172 REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in ) :: p_sh2 ! shear production term 173 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 174 174 !!---------------------------------------------------------------------- 175 175 ! … … 201 201 USE zdf_oce , ONLY : en ! ocean vertical physics 202 202 !! 203 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices204 REAL(wp), DIMENSION( :,:,:) , INTENT(in ) :: p_sh2 ! shear production term205 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity & diffusivity (w-points)203 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 204 REAL(wp), DIMENSION(A2D(nn_hls),jpk) , INTENT(in ) :: p_sh2 ! shear production term 205 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity & diffusivity (w-points) 206 206 ! 207 207 INTEGER :: ji, jj, jk ! dummy loop arguments … … 216 216 REAL(wp) :: zzd_up, zzd_lw ! - - 217 217 REAL(wp) :: ztaui, ztauj, z1_norm 218 INTEGER , DIMENSION( jpi,jpj) :: imlc219 REAL(wp), DIMENSION( jpi,jpj) :: zice_fra, zhlc, zus3, zWlc2220 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zpelc, zdiag, zd_up, zd_lw218 INTEGER , DIMENSION(A2D(nn_hls)) :: imlc 219 REAL(wp), DIMENSION(A2D(nn_hls)) :: zice_fra, zhlc, zus3, zWlc2 220 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zpelc, zdiag, zd_up, zd_lw 221 221 !!-------------------------------------------------------------------- 222 222 ! … … 232 232 SELECT CASE ( nn_eice ) 233 233 CASE( 0 ) ; zice_fra(:,:) = 0._wp 234 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i( :,:) * 10._wp )235 CASE( 2 ) ; zice_fra(:,:) = fr_i( :,:)236 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i( :,:) , 1._wp )234 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(A2D(nn_hls)) * 10._wp ) 235 CASE( 2 ) ; zice_fra(:,:) = fr_i(A2D(nn_hls)) 236 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(A2D(nn_hls)) , 1._wp ) 237 237 END SELECT 238 238 ! … … 241 241 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 242 242 ! 243 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )243 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 244 244 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) 245 245 zdiag(ji,jj,1) = 1._wp/en(ji,jj,1) … … 258 258 IF( .NOT.ln_drg_OFF ) THEN !== friction used as top/bottom boundary condition on TKE 259 259 ! 260 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! bottom friction260 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! bottom friction 261 261 zmsku = ( 2. - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 262 262 zmskv = ( 2. - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) ) … … 267 267 END_2D 268 268 IF( ln_isfcav ) THEN 269 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! top friction269 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! top friction 270 270 zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 271 271 zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) ) … … 307 307 zWlc2(ji,jj) = 0.5_wp * z1_norm * ( MAX( ut0sd(ji,jj)*ztaui + vt0sd(ji,jj)*ztauj, 0._wp ) )**2 308 308 END_2D 309 IF (nn_hls==1) CALL lbc_lnk ( 'zdftke', zWlc2, 'T', 1. )310 !311 309 ELSE ! Surface Stokes drift deduced from surface stress 312 310 ! ! Wlc = u_s with u_s = 0.016*U_10m, the surface stokes drift (Axell 2002, Eq.44) … … 315 313 ! ! 1/2 Wlc^2 = 0.5 * 0.016 * 0.016 |tau| /( rho_air Cdrag ) 316 314 zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) ! to convert stress in 10m wind using a constant drag 317 DO_2D( nn_hls , nn_hls, nn_hls, nn_hls)315 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 318 316 zWlc2(ji,jj) = zcof * taum(ji,jj) 319 317 END_2D … … 323 321 ! !* Depth of the LC circulation (Axell 2002, Eq.47) 324 322 ! !- LHS of Eq.47 325 zpelc(:,:,1) = MAX( rn2b(:,:,1), 0._wp ) * gdepw(:,:,1,Kmm) * e3w(:,:,1,Kmm) 326 DO jk = 2, jpk 327 zpelc(:,:,jk) = zpelc(:,:,jk-1) + & 328 & MAX( rn2b(:,:,jk), 0._wp ) * gdepw(:,:,jk,Kmm) * e3w(:,:,jk,Kmm) 329 END DO 323 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 324 zpelc(ji,jj,1) = MAX( rn2b(ji,jj,1), 0._wp ) * gdepw(ji,jj,1,Kmm) * e3w(ji,jj,1,Kmm) 325 END_2D 326 DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpk ) 327 zpelc(ji,jj,jk) = zpelc(ji,jj,jk-1) + & 328 & MAX( rn2b(ji,jj,jk), 0._wp ) * gdepw(ji,jj,jk,Kmm) * e3w(ji,jj,jk,Kmm) 329 END_3D 330 330 ! 331 331 ! !- compare LHS to RHS of Eq.47 332 imlc(:,:) = mbkt( :,:) + 1 ! Initialization to the number of w ocean point (=2 over land)333 DO_3DS( nn_hls , nn_hls, nn_hls, nn_hls, jpkm1, 2, -1 )332 imlc(:,:) = mbkt(A2D(nn_hls)) + 1 ! Initialization to the number of w ocean point (=2 over land) 333 DO_3DS( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpkm1, 2, -1 ) 334 334 IF( zpelc(ji,jj,jk) > zWlc2(ji,jj) ) imlc(ji,jj) = jk 335 335 END_3D 336 336 ! ! finite LC depth 337 DO_2D( nn_hls , nn_hls, nn_hls, nn_hls)337 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 338 338 zhlc(ji,jj) = gdepw(ji,jj,imlc(ji,jj),Kmm) 339 339 END_2D … … 344 344 zus3(ji,jj) = MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 345 345 END_2D 346 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* TKE Langmuir circulation source term added to en346 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* TKE Langmuir circulation source term added to en 347 347 IF ( zus3(ji,jj) /= 0._wp ) THEN 348 348 IF ( gdepw(ji,jj,jk,Kmm) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN … … 365 365 ! 366 366 IF( nn_pdl == 1 ) THEN !* Prandtl number = F( Ri ) 367 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )367 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 368 368 ! ! local Richardson number 369 369 IF (rn2b(ji,jj,jk) <= 0.0_wp) then … … 377 377 ENDIF 378 378 ! 379 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* Matrix and right hand side in en379 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) !* Matrix and right hand side in en 380 380 zcof = zfact1 * tmask(ji,jj,jk) 381 381 ! ! A minimum of 2.e-5 m2/s is imposed on TKE vertical … … 406 406 407 407 CASE ( 0 ) ! Dirichlet BC 408 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! en(1) = rn_ebb taum / rho0 (min value rn_emin0)408 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! en(1) = rn_ebb taum / rho0 (min value rn_emin0) 409 409 IF ( phioc(ji,jj) < 0 ) phioc(ji,jj) = 0._wp 410 410 en(ji,jj,1) = MAX( rn_emin0, .5 * ( 15.8 * phioc(ji,jj) / rho0 )**(2./3.) ) * tmask(ji,jj,1) … … 413 413 414 414 CASE ( 1 ) ! Neumann BC 415 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )415 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 416 416 IF ( phioc(ji,jj) < 0 ) phioc(ji,jj) = 0._wp 417 417 en(ji,jj,2) = en(ji,jj,2) + ( rn_Dt * phioc(ji,jj) / rho0 ) /e3w(ji,jj,2,Kmm) … … 437 437 zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1) 438 438 END_3D 439 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk439 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 440 440 en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 441 441 END_2D 442 DO_3DS ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpk-2, 2, -1 )442 DO_3DS_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, jpk-2, 2, -1 ) 443 443 en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 444 444 END_3D 445 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) ! set the minimum value of tke445 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) ! set the minimum value of tke 446 446 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 447 447 END_3D … … 456 456 ! 457 457 IF( nn_etau == 1 ) THEN !* penetration below the mixed layer (rn_efr fraction) 458 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )458 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 459 459 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) ) & 460 460 & * MAX( 0._wp, 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 461 461 END_3D 462 462 ELSEIF( nn_etau == 2 ) THEN !* act only at the base of the mixed layer (jk=nmln) (rn_efr fraction) 463 DO_2D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )463 DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 ) 464 464 jk = nmln(ji,jj) 465 465 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -gdepw(ji,jj,jk,Kmm) / htau(ji,jj) ) & … … 467 467 END_2D 468 468 ELSEIF( nn_etau == 3 ) THEN !* penetration belox the mixed layer (HF variability) 469 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )469 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 470 470 ztx2 = utau(ji-1,jj ) + utau(ji,jj) 471 471 zty2 = vtau(ji ,jj-1) + vtau(ji,jj) … … 524 524 REAL(wp) :: zdku, zdkv, zsqen ! - - 525 525 REAL(wp) :: zemxl, zemlm, zemlp, zmaxice ! - - 526 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zmxlm, zmxld ! 3D workspace526 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zmxlm, zmxld ! 3D workspace 527 527 !!-------------------------------------------------------------------- 528 528 ! … … 660 660 ! ! Vertical eddy viscosity and diffusivity (avm and avt) 661 661 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 662 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) !* vertical eddy viscosity & diffivity at w-points662 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 ) !* vertical eddy viscosity & diffivity at w-points 663 663 zsqen = SQRT( en(ji,jj,jk) ) 664 664 zav = rn_ediff * zmxlm(ji,jj,jk) * zsqen … … 670 670 ! 671 671 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt 672 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )672 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 ) 673 673 p_avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 674 674 END_3D … … 786 786 ! 787 787 ! !* Check of some namelist values 788 IF( nn_mxl < 0 .OR. nn_mxl > 3 ) CALL ctl_stop( 'bad flag: nn_mxl is 0, 1 or 2' )789 IF( nn_pdl < 0 .OR. nn_pdl > 1 ) CALL ctl_stop( 'bad flag: nn_pdl is 0 or 1 790 IF( nn_htau < 0 .OR. nn_htau > 1 ) CALL ctl_stop( 'bad flag: nn_htau is 0 , 1 or 2' )788 IF( nn_mxl < 0 .OR. nn_mxl > 3 ) CALL ctl_stop( 'bad flag: nn_mxl is 0, 1, 2 or 3' ) 789 IF( nn_pdl < 0 .OR. nn_pdl > 1 ) CALL ctl_stop( 'bad flag: nn_pdl is 0 or 1' ) 790 IF( nn_htau < 0 .OR. nn_htau > 1 ) CALL ctl_stop( 'bad flag: nn_htau is 0 or 1' ) 791 791 IF( nn_etau == 3 .AND. .NOT. ln_cpl ) CALL ctl_stop( 'nn_etau == 3 : HF taum only known in coupled mode' ) 792 792 ! … … 796 796 rn_mxl0 = rmxl_min 797 797 ENDIF 798 799 IF( nn_etau == 2 ) CALL zdf_mxl( nit000, Kmm ) ! Initialization of nmln800 801 798 ! !* depth of penetration of surface tke 802 799 IF( nn_etau /= 0 ) THEN -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/do_loop_substitute.h90
r14776 r14787 59 59 #endif 60 60 61 #define DO_2D(L, R, B, T) DO jj = ntsj-(B), ntej+(T) ; DO ji = ntsi-(L), ntei+(R) 61 #define DO_2D(L, R, B, T) DO jj = ntsj-(B), ntej+(T) ; DO ji = ntsi-(L), ntei+(R) 62 #define DO_2D_OVR(L, R, B, T) DO_2D(L-(L+R)*nthl, R-(R+L)*nthr, B-(B+T)*nthb, T-(T+B)*ntht) 62 63 #define A1Di(H) ntsi-H:ntei+H 63 64 #define A1Dj(H) ntsj-H:ntej+H … … 70 71 #define KJPT : 71 72 72 #define DO_3D(L, R, B, T, ks, ke) DO jk = ks, ke ; DO_2D(L, R, B, T) 73 #define DO_3D(L, R, B, T, ks, ke) DO jk = ks, ke ; DO_2D(L, R, B, T) 74 #define DO_3D_OVR(L, R, B, T, ks, ke) DO jk = ks, ke ; DO_2D_OVR(L, R, B, T) 73 75 74 #define DO_3DS(L, R, B, T, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D(L, R, B, T) 76 #define DO_3DS(L, R, B, T, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D(L, R, B, T) 77 #define DO_3DS_OVR(L, R, B, T, ks, ke, ki) DO jk = ks, ke, ki ; DO_2D_OVR(L, R, B, T) 75 78 76 79 #define END_2D END DO ; END DO -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/module_example.F90
r14776 r14787 102 102 !!-------------------------------------------------------------------- 103 103 ! 104 IF( ntile == 0.OR. ntile == 1 ) THEN ! Do only on the first tile104 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 105 105 IF( kt == nit000 ) CALL exa_mpl_init ! Initialization (first time-step only) 106 106 … … 175 175 IF( exa_mpl_alloc() /= 0 ) CALL ctl_stop( 'STOP', 'exa_mpl_init : unable to allocate arrays' ) 176 176 ! ! Parameter control 177 IF( ln_tile .AND. ntile > 0) CALL ctl_stop( 'exa_mpl_init: tiling is not supported in this module by default, see manual for how to adapt your code' )177 IF( ln_tile ) CALL ctl_stop( 'exa_mpl_init: tiling is not supported in this module by default, see manual for how to adapt your code' ) 178 178 IF( ln_opt ) CALL ctl_stop( 'exa_mpl_init: this work and option xxx are incompatible' ) 179 179 IF( nn_opt == 2 ) CALL ctl_stop( 'STOP', 'exa_mpl_init: this work and option yyy may cause problems' ) -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/nemogcm.F90
r14776 r14787 390 390 CALL mpp_init 391 391 392 #if ! defined key_qco && ! defined key_linssh393 IF( nn_hls == 2 ) THEN394 CALL ctl_stop( 'STOP', 'nemogcm : Extra-halo can not be used if key_qco is not defined' )395 ENDIF396 #endif397 392 #if defined key_loop_fusion 398 393 IF( nn_hls == 1 ) THEN -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/par_oce.F90
r14776 r14787 72 72 INTEGER, PUBLIC :: ntei !: end of internal part of tile domain 73 73 INTEGER, PUBLIC :: ntej ! 74 INTEGER, PUBLIC :: nthl, nthr !: Modifier on DO loop macro bound offset (left, right) 75 INTEGER, PUBLIC :: nthb, ntht !: " " (bottom, top) 74 76 75 77 !!--------------------------------------------------------------------- -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/step.F90
r14776 r14787 169 169 170 170 ! VERTICAL PHYSICS 171 ! lbc_lnk needed for zdf_sh2 when using nn_hls = 2, moved here to allow tiling in zdf_phy 172 IF( nn_hls == 2 .AND. l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp ) 173 174 IF( ln_tile ) CALL dom_tile_start ! [tiling] ZDF tiling loop 175 DO jtile = 1, nijtile 176 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 177 171 178 CALL zdf_phy( kstp, Nbb, Nnn, Nrhs ) ! vertical physics update (top/bot drag, avt, avs, avm + MLD) 179 END DO 180 IF( ln_tile ) CALL dom_tile_stop 172 181 173 182 ! LATERAL PHYSICS … … 176 185 CALL eos( ts(:,:,:,:,Nbb), rhd, gdept_0(:,:,:) ) ! before in situ density 177 186 178 187 IF( ln_zps .AND. .NOT. ln_isfcav) & 179 188 & CALL zps_hde ( kstp, Nnn, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, & ! Partial steps: before horizontal gradient 180 189 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 181 190 182 191 IF( ln_zps .AND. ln_isfcav) & 183 192 & CALL zps_hde_isf( kstp, Nnn, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, gtui, gtvi, & ! Partial steps for top cell (ISF) 184 193 & rhd, gru , grv , grui, grvi ) ! of t, s, rd at the first ocean level … … 208 217 vv(:,:,:,Nrhs) = 0._wp 209 218 210 IF( lk_asminc .AND. ln_asmiau .AND. ln_dyninc ) & 211 & CALL dyn_asm_inc ( kstp, Nbb, Nnn, uu, vv, Nrhs ) ! apply dynamics assimilation increment 212 IF( ln_bdy ) CALL bdy_dyn3d_dmp ( kstp, Nbb, uu, vv, Nrhs ) ! bdy damping trends 213 #if defined key_agrif 219 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (1) 220 DO jtile = 1, nijtile 221 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 222 223 IF( lk_asminc .AND. ln_asmiau .AND. ln_dyninc ) & 224 & CALL dyn_asm_inc ( kstp, Nbb, Nnn, uu, vv, Nrhs ) ! apply dynamics assimilation increment 225 IF( ln_bdy ) CALL bdy_dyn3d_dmp ( kstp, Nbb, uu, vv, Nrhs ) ! bdy damping trends 226 #if defined key_agrif 227 END DO 228 IF( ln_tile ) CALL dom_tile_stop 229 214 230 IF(.NOT. Agrif_Root()) & 215 231 & CALL Agrif_Sponge_dyn ! momentum sponge 216 #endif 217 CALL dyn_adv( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! advection (VF or FF) ==> RHS 218 CALL dyn_vor( kstp, Nnn , uu, vv, Nrhs ) ! vorticity ==> RHS 219 CALL dyn_ldf( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! lateral mixing 220 IF( ln_zdfosm ) CALL dyn_osm( kstp, Nnn , uu, vv, Nrhs ) ! OSMOSIS non-local velocity fluxes ==> RHS 221 CALL dyn_hpg( kstp, Nnn , uu, vv, Nrhs ) ! horizontal gradient of Hydrostatic pressure 222 CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa ) ! surface pressure gradient 232 233 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (1, continued) 234 DO jtile = 1, nijtile 235 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 236 #endif 237 CALL dyn_adv( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! advection (VF or FF) ==> RHS 238 CALL dyn_vor( kstp, Nnn , uu, vv, Nrhs ) ! vorticity ==> RHS 239 CALL dyn_ldf( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! lateral mixing 240 IF( ln_zdfosm ) CALL dyn_osm( kstp, Nnn , uu, vv, Nrhs ) ! OSMOSIS non-local velocity fluxes ==> RHS 241 CALL dyn_hpg( kstp, Nnn , uu, vv, Nrhs ) ! horizontal gradient of Hydrostatic pressure 242 END DO 243 IF( ln_tile ) CALL dom_tile_stop 244 245 CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa ) ! surface pressure gradient 223 246 224 247 ! With split-explicit free surface, since now transports have been updated and ssh(:,:,Nrhs) as well 225 248 IF( ln_dynspg_ts ) THEN ! vertical scale factors and vertical velocity need to be updated 226 CALL div_hor ( kstp, Nbb, Nnn ) ! Horizontal divergence (2nd call in time-split case) 227 IF(.NOT.ln_linssh) CALL dom_vvl_sf_nxt( kstp, Nbb, Nnn, Naa, kcall=2 ) ! after vertical scale factors (update depth average component) 228 ENDIF 229 CALL dyn_zdf ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa ) ! vertical diffusion 249 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (2- div_hor only) 250 DO jtile = 1, nijtile 251 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 252 253 CALL div_hor ( kstp, Nbb, Nnn ) ! Horizontal divergence (2nd call in time-split case) 254 END DO 255 IF( ln_tile ) CALL dom_tile_stop 256 257 IF(.NOT. ln_linssh) CALL dom_vvl_sf_nxt( kstp, Nbb, Nnn, Naa, kcall=2 ) ! after vertical scale factors (update depth average component) 258 ENDIF 259 260 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (3- dyn_zdf only) 261 DO jtile = 1, nijtile 262 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 263 264 CALL dyn_zdf ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa ) ! vertical diffusion 265 END DO 266 IF( ln_tile ) CALL dom_tile_stop 267 230 268 IF( ln_dynspg_ts ) THEN ! vertical scale factors and vertical velocity need to be updated 231 269 CALL wzv ( kstp, Nbb, Nnn, Naa, ww ) ! Nnn cross-level velocity … … 263 301 ! Active tracers 264 302 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 265 ! Loop over tile domains 266 DO jtile = 1, nijtile 267 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 268 269 DO_3D( 0, 0, 0, 0, 1, jpk ) 270 ts(ji,jj,jk,:,Nrhs) = 0._wp ! set tracer trends to zero 271 END_3D 303 ts(:,:,:,:,Nrhs) = 0._wp ! set tracer trends to zero 304 305 IF( ln_tile ) CALL dom_tile_start ! [tiling] TRA tiling loop (1) 306 DO jtile = 1, nijtile 307 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 272 308 273 309 IF( lk_asminc .AND. ln_asmiau .AND. & … … 281 317 IF( ln_bdy ) CALL bdy_tra_dmp( kstp, Nbb, ts, Nrhs ) ! bdy damping trends 282 318 END DO 319 IF( ln_tile ) CALL dom_tile_stop 283 320 284 321 #if defined key_agrif 285 322 IF(.NOT. Agrif_Root() ) THEN 286 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 )287 323 CALL Agrif_Sponge_tra ! tracers sponge 288 324 ENDIF … … 290 326 291 327 ! TEMP: [tiling] Separate loop over tile domains (due to tra_adv workarounds for tiling) 292 DO jtile = 1, nijtile 293 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 328 IF( ln_tile ) CALL dom_tile_start ! [tiling] TRA tiling loop (2) 329 DO jtile = 1, nijtile 330 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 294 331 295 332 CALL tra_adv ( kstp, Nbb, Nnn, ts, Nrhs ) ! hor. + vert. advection ==> RHS … … 304 341 IF( ln_zdfnpc ) CALL tra_npc ( kstp, Nnn, Nrhs, ts, Naa ) ! update after fields by non-penetrative convection 305 342 END DO 306 307 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) ! Revert to tile over full domain 343 IF( ln_tile ) CALL dom_tile_stop 344 308 345 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 309 346 ! Set boundary conditions, time filter and swap time levels -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/stpmlf.F90
r14776 r14787 176 176 177 177 ! VERTICAL PHYSICS 178 IF( ln_tile ) CALL dom_tile_start ! [tiling] ZDF tiling loop 179 DO jtile = 1, nijtile 180 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 178 181 CALL zdf_phy( kstp, Nbb, Nnn, Nrhs ) ! vertical physics update (top/bot drag, avt, avs, avm + MLD) 182 END DO 183 IF( ln_tile ) CALL dom_tile_stop 179 184 180 185 ! LATERAL PHYSICS … … 183 188 CALL eos( ts(:,:,:,:,Nbb), rhd, gdept_0(:,:,:) ) ! before in situ density 184 189 185 190 IF( ln_zps .AND. .NOT. ln_isfcav) & 186 191 & CALL zps_hde ( kstp, Nnn, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, & ! Partial steps: before horizontal gradient 187 192 & rhd, gru , grv ) ! of t, s, rd at the last ocean level 188 193 189 194 IF( ln_zps .AND. ln_isfcav) & 190 195 & CALL zps_hde_isf( kstp, Nnn, jpts, ts(:,:,:,:,Nbb), gtsu, gtsv, gtui, gtvi, & ! Partial steps for top cell (ISF) 191 196 & rhd, gru , grv , grui, grvi ) ! of t, s, rd at the first ocean level … … 222 227 vv(:,:,:,Nrhs) = 0._wp 223 228 224 IF( lk_asminc .AND. ln_asmiau .AND. ln_dyninc ) & 225 & CALL dyn_asm_inc ( kstp, Nbb, Nnn, uu, vv, Nrhs ) ! apply dynamics assimilation increment 226 IF( ln_bdy ) CALL bdy_dyn3d_dmp ( kstp, Nbb, uu, vv, Nrhs ) ! bdy damping trends 227 #if defined key_agrif 229 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (1) 230 DO jtile = 1, nijtile 231 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 232 233 IF( lk_asminc .AND. ln_asmiau .AND. ln_dyninc ) & 234 & CALL dyn_asm_inc ( kstp, Nbb, Nnn, uu, vv, Nrhs ) ! apply dynamics assimilation increment 235 IF( ln_bdy ) CALL bdy_dyn3d_dmp ( kstp, Nbb, uu, vv, Nrhs ) ! bdy damping trends 236 #if defined key_agrif 237 END DO 238 IF( ln_tile ) CALL dom_tile_stop 239 228 240 IF(.NOT. Agrif_Root()) & 229 241 & CALL Agrif_Sponge_dyn ! momentum sponge 230 #endif 231 CALL dyn_adv( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! advection (VF or FF) ==> RHS 232 CALL dyn_vor( kstp, Nnn , uu, vv, Nrhs ) ! vorticity ==> RHS 233 CALL dyn_ldf( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! lateral mixing 234 IF( ln_zdfosm ) CALL dyn_osm( kstp, Nnn , uu, vv, Nrhs ) ! OSMOSIS non-local velocity fluxes ==> RHS 235 236 CALL dyn_hpg( kstp, Nnn , uu, vv, Nrhs ) ! horizontal gradient of Hydrostatic pressure 237 CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa ) ! surface pressure gradient 238 239 IF( ln_dynspg_ts ) THEN ! With split-explicit free surface, since now transports have been updated and ssh(:,:,Nrhs) 240 ! as well as vertical scale factors and vertical velocity need to be updated 241 CALL div_hor ( kstp, Nbb, Nnn ) ! Horizontal divergence (2nd call in time-split case) 242 IF(.NOT.lk_linssh) CALL dom_qco_r3c( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) ) ! update ssh/h_0 ratio at t,u,v,f pts 243 ENDIF 242 243 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (1, continued) 244 DO jtile = 1, nijtile 245 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 246 #endif 247 CALL dyn_adv( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! advection (VF or FF) ==> RHS 248 CALL dyn_vor( kstp, Nnn , uu, vv, Nrhs ) ! vorticity ==> RHS 249 CALL dyn_ldf( kstp, Nbb, Nnn , uu, vv, Nrhs ) ! lateral mixing 250 IF( ln_zdfosm ) CALL dyn_osm( kstp, Nnn , uu, vv, Nrhs ) ! OSMOSIS non-local velocity fluxes ==> RHS 251 CALL dyn_hpg( kstp, Nnn , uu, vv, Nrhs ) ! horizontal gradient of Hydrostatic pressure 252 END DO 253 IF( ln_tile ) CALL dom_tile_stop 254 255 CALL dyn_spg( kstp, Nbb, Nnn, Nrhs, uu, vv, ssh, uu_b, vv_b, Naa ) ! surface pressure gradient 256 257 IF( ln_tile ) CALL dom_tile_start ! [tiling] DYN tiling loop (2) 258 DO jtile = 1, nijtile 259 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 260 261 IF( ln_dynspg_ts ) THEN ! With split-explicit free surface, since now transports have been updated and ssh(:,:,Nrhs) 262 ! as well as vertical scale factors and vertical velocity need to be updated 263 CALL div_hor ( kstp, Nbb, Nnn ) ! Horizontal divergence (2nd call in time-split case) 264 IF(.NOT.lk_linssh) CALL dom_qco_r3c( ssh(:,:,Naa), r3t(:,:,Naa), r3u(:,:,Naa), r3v(:,:,Naa), r3f(:,:) ) ! update ssh/h_0 ratio at t,u,v,f pts 265 ENDIF 244 266 CALL dyn_zdf ( kstp, Nbb, Nnn, Nrhs, uu, vv, Naa ) ! vertical diffusion 267 END DO 268 IF( ln_tile ) CALL dom_tile_stop 269 245 270 IF( ln_dynspg_ts ) THEN ! vertical scale factors and vertical velocity need to be updated 246 271 CALL wzv ( kstp, Nbb, Nnn, Naa, ww ) ! Nnn cross-level velocity … … 248 273 ENDIF 249 274 250 IF(nn_hls==2.AND..NOT.lk_linssh) CALL lbc_lnk( 'stp_MLF', r3u(:,:,Naa), 'U', 1.0_wp, r3v(:,:,Naa), 'V', 1.0_wp )251 275 252 276 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 274 298 CALL ssh_atf ( kstp, Nbb, Nnn, Naa, ssh ) ! time filtering of "now" sea surface height 275 299 IF(.NOT.lk_linssh) CALL dom_qco_r3c( ssh(:,:,Nnn), r3t_f, r3u_f, r3v_f ) ! "now" ssh/h_0 ratio from filtrered ssh 276 !277 IF(nn_hls==2.AND..NOT.lk_linssh) CALL lbc_lnk( 'stp_MLF', r3u_f, 'U', 1.0_wp, r3v_f, 'V', 1.0_wp, r3t_f, 'T', 1.0_wp )278 300 #if defined key_top 279 301 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 286 308 ! Active tracers 287 309 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 288 ! Loop over tile domains 310 ts(:,:,:,:,Nrhs) = 0._wp ! set tracer trends to zero 311 312 IF( ln_tile ) CALL dom_tile_start ! [tiling] TRA tiling loop (1) 289 313 DO jtile = 1, nijtile 290 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 291 292 DO_3D( 0, 0, 0, 0, 1, jpk ) 293 ts(ji,jj,jk,:,Nrhs) = 0._wp ! set tracer trends to zero 294 END_3D 314 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 295 315 296 316 IF( lk_asminc .AND. ln_asmiau .AND. & … … 304 324 IF( ln_bdy ) CALL bdy_tra_dmp( kstp, Nbb, ts, Nrhs ) ! bdy damping trends 305 325 END DO 326 IF( ln_tile ) CALL dom_tile_stop 306 327 307 328 #if defined key_agrif 308 329 IF(.NOT. Agrif_Root() ) THEN 309 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 )310 330 CALL Agrif_Sponge_tra ! tracers sponge 311 331 ENDIF … … 313 333 314 334 ! TEMP: [tiling] Separate loop over tile domains (due to tra_adv workarounds for tiling) 335 IF( ln_tile ) CALL dom_tile_start ! [tiling] TRA tiling loop (2) 315 336 DO jtile = 1, nijtile 316 IF( ln_tile )CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile )337 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = jtile ) 317 338 318 339 CALL tra_adv ( kstp, Nbb, Nnn, ts, Nrhs ) ! hor. + vert. advection ==> RHS … … 327 348 IF( ln_zdfnpc ) CALL tra_npc ( kstp, Nnn, Nrhs, ts, Naa ) ! update after fields by non-penetrative convection 328 349 END DO 329 330 IF( ln_tile ) CALL dom_tile( ntsi, ntsj, ntei, ntej, ktile = 0 ) ! Revert to tile over full domain 350 IF( ln_tile ) CALL dom_tile_stop 351 331 352 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 332 353 ! Set boundary conditions, time filter and swap time levels … … 349 370 CALL tra_atf_qco ( kstp, Nbb, Nnn, Naa , ts ) ! time filtering of "now" tracer arrays 350 371 CALL dyn_atf_qco ( kstp, Nbb, Nnn, Naa, uu, vv ) ! time filtering of "now" velocities 351 352 IF( nn_hls==2) CALL lbc_lnk( 'stp_MLF', ts(:,:,:,jp_tem,Nnn), 'T', 1._wp, ts(:,:,:,jp_sal,Nnn), 'T', 1._wp)353 354 372 IF(.NOT.lk_linssh) THEN 355 373 r3t(:,:,Nnn) = r3t_f(:,:) ! update now ssh/h_0 with time filtered values … … 517 535 & , pts(:,:,:,jp_tem,Kaa), 'T', 1., pts(:,:,:,jp_sal,Kaa), 'T', 1. ) 518 536 ! 519 IF (nn_hls==2) THEN 520 IF( l_zdfsh2 ) THEN 521 CALL lbc_lnk( 'stp_MLF', avm_k, 'W', 1.0_wp) 522 ENDIF 537 ! lbc_lnk needed for zdf_sh2 when using nn_hls = 2, moved here to allow tiling in zdf_phy 538 IF( nn_hls == 2 .AND. l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp ) 539 540 ! dom_qco_r3c defines over [nn_hls, nn_hls-1, nn_hls, nn_hls-1] 541 IF( nn_hls == 2 .AND. .NOT. lk_linssh ) THEN 542 CALL lbc_lnk( 'finalize_lbc', r3u(:,:,Kaa), 'U', 1._wp, r3v(:,:,Kaa), 'V', 1._wp, & 543 & r3u_f(:,:), 'U', 1._wp, r3v_f(:,:), 'V', 1._wp ) 523 544 ENDIF 524 545 ! !* BDY open boundaries -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/timing.F90
r14776 r14787 109 109 110 110 s_timer%l_tdone = .FALSE. 111 IF( ntile == 0.OR. ntile == 1 ) s_timer%niter = s_timer%niter + 1 ! All tiles count as one iteration111 IF( .NOT. l_istiled .OR. ntile == 1 ) s_timer%niter = s_timer%niter + 1 ! All tiles count as one iteration 112 112 s_timer%t_cpu = 0. 113 113 s_timer%t_clock = 0.
Note: See TracChangeset
for help on using the changeset viewer.