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 r14805
- Location:
- NEMO/branches/2021
- Files:
-
- 5 added
- 2 deleted
- 75 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/ASM/asminc.F90
r14776 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 #if defined key_loop_fusion 55 IF( ln_tile ) THEN 56 CALL ctl_warn('Tiling is not yet implemented for key_loop_fusion; ln_tile is forced to FALSE') 57 ln_tile = .FALSE. 58 CALL dom_tile_init 59 ENDIF 60 #endif 61 62 ntile = 0 ! Initialise to full domain 63 nijtile = 1 64 ntsi = Nis0 65 ntsj = Njs0 66 ntei = Nie0 67 ntej = Nje0 68 nthl = 0 69 nthr = 0 70 nthb = 0 71 ntht = 0 72 l_istiled = .FALSE. 73 74 IF( ln_tile ) THEN ! Calculate tile domain indices 75 iitile = Ni_0 / nn_ltile_i ! Number of tiles 76 ijtile = Nj_0 / nn_ltile_j 77 IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 78 IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1 79 80 nijtile = iitile * ijtile 81 ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile), l_tilefin(nijtile) ) 82 83 l_tilefin(:) = .FALSE. 84 85 ntsi_a(0) = Nis0 ! Full domain 86 ntsj_a(0) = Njs0 87 ntei_a(0) = Nie0 88 ntej_a(0) = Nje0 89 90 DO jt = 1, nijtile ! Tile domains 91 ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile) 92 ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile) 93 ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0) 94 ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0) 95 ENDDO 96 ENDIF 97 98 IF(lwp) THEN ! control print 99 WRITE(numout,*) 100 WRITE(numout,*) 'dom_tile : Domain tiling decomposition' 101 WRITE(numout,*) '~~~~~~~~' 102 IF( ln_tile ) THEN 103 WRITE(numout,*) iitile, 'tiles in i' 104 WRITE(numout,*) ' Starting indices' 105 WRITE(numout,*) ' ', (ntsi_a(jt), jt=1, iitile) 106 WRITE(numout,*) ' Ending indices' 107 WRITE(numout,*) ' ', (ntei_a(jt), jt=1, iitile) 108 WRITE(numout,*) ijtile, 'tiles in j' 109 WRITE(numout,*) ' Starting indices' 110 WRITE(numout,*) ' ', (ntsj_a(jt), jt=1, nijtile, iitile) 111 WRITE(numout,*) ' Ending indices' 112 WRITE(numout,*) ' ', (ntej_a(jt), jt=1, nijtile, iitile) 113 ELSE 114 WRITE(numout,*) 'No domain tiling' 115 WRITE(numout,*) ' i indices =', ntsi, ':', ntei 116 WRITE(numout,*) ' j indices =', ntsj, ':', ntej 117 ENDIF 118 ENDIF 119 END SUBROUTINE dom_tile_init 120 121 122 SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile, ldhold, cstr ) 30 123 !!---------------------------------------------------------------------- 31 124 !! *** ROUTINE dom_tile *** 32 125 !! 33 !! ** Purpose : Set t ile domain variables126 !! ** Purpose : Set the current tile and its domain indices 34 127 !! 35 128 !! ** Action : - ktsi, ktsj : start of internal part of domain 36 129 !! - ktei, ktej : end of internal part of domain 37 !! - ntile : current tile number 38 !! - nijtile : total number of tiles 130 !! - nthl, nthr : modifier on DO loop macro bound offset (left, right) 131 !! - nthb, ntht : " " (bottom, top) 132 !! - ktile : set the current tile number (ntile) 39 133 !!---------------------------------------------------------------------- 40 134 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 135 INTEGER, INTENT(in) :: ktile ! Tile number 136 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Pause/resume (.true.) or set (.false.) current tile 137 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 138 CHARACTER(len=23) :: clstr 139 LOGICAL :: llhold 140 CHARACTER(len=11) :: charout 141 INTEGER :: iitile 142 !!---------------------------------------------------------------------- 143 llhold = .FALSE. 144 IF( PRESENT(ldhold) ) llhold = ldhold 145 clstr = '' 146 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 147 148 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot use dom_tile with ln_tile = .false.') 149 IF( .NOT. llhold ) THEN 150 IF( .NOT. l_istiled ) THEN 151 CALL ctl_warn('Cannot call dom_tile when tiling is inactive'//clstr) 152 RETURN 153 ENDIF 154 155 IF( ntile /= 0 ) l_tilefin(ntile) = .TRUE. ! If setting a new tile, the current tile is complete 156 157 ntile = ktile ! Set the new tile 53 158 IF(sn_cfctl%l_prtctl) THEN 54 WRITE(charout, FMT="('ntile =', I4)") ktile159 WRITE(charout, FMT="('ntile =', I4)") ntile 55 160 CALL prt_ctl_info( charout ) 56 161 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 162 ENDIF 163 164 ktsi = ntsi_a(ktile) ! Set the domain indices 165 ktsj = ntsj_a(ktile) 166 ktei = ntei_a(ktile) 167 ktej = ntej_a(ktile) 168 169 ! Calculate the modifying factor on DO loop bounds (1 = do not work on points that have already been processed by a neighbouring tile) 170 nthl = 0 ; nthr = 0 ; nthb = 0 ; ntht = 0 171 iitile = Ni_0 / nn_ltile_i 172 IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1 173 IF( ktsi > Nis0 ) THEN ; IF( l_tilefin(ktile - 1 ) ) nthl = 1 ; ENDIF ! Left adjacent tile 174 IF( ktei < Nie0 ) THEN ; IF( l_tilefin(ktile + 1 ) ) nthr = 1 ; ENDIF ! Right " " 175 IF( ktsj > Njs0 ) THEN ; IF( l_tilefin(ktile - iitile) ) nthb = 1 ; ENDIF ! Bottom " " 176 IF( ktej < Nje0 ) THEN ; IF( l_tilefin(ktile + iitile) ) ntht = 1 ; ENDIF ! Top " " 109 177 END SUBROUTINE dom_tile 110 178 179 180 SUBROUTINE dom_tile_start( ldhold, cstr ) 181 !!---------------------------------------------------------------------- 182 !! *** ROUTINE dom_tile_start *** 183 !! 184 !! ** Purpose : Start or resume the use of tiling 185 !! 186 !! ** Method : dom_tile_start & dom_tile_stop are used to declare a tiled region of code. 187 !! 188 !! Tiling is active/inactive (l_istiled = .true./.false.) within/outside of this code region. 189 !! After enabling tiling, no tile will initially be set (the full domain will be used) and dom_tile must 190 !! be called to set a specific tile to work on. Furthermore, all tiles will be marked as incomplete 191 !! (ln_tilefin(:) = .false.). 192 !! 193 !! Tiling can be paused/resumed within the tiled code region by calling dom_tile_stop/dom_tile_start 194 !! with ldhold = .true.. This can be used to temporarily revert back to using the full domain. 195 !! 196 !! CALL dom_tile_start ! Enable tiling 197 !! CALL dom_tile(ntsi, ntei, ntsj, ntej, ktile=n) ! Set current tile "n" 198 !! ... 199 !! CALL dom_tile_stop(.TRUE.) ! Pause tiling (temporarily disable) 200 !! ... 201 !! CALL dom_tile_start(.TRUE.) ! Resume tiling 202 !! CALL dom_tile_stop ! Disable tiling 203 !!---------------------------------------------------------------------- 204 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Resume (.true.) or start (.false.) 205 LOGICAL :: llhold 206 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 207 CHARACTER(len=23) :: clstr 208 !!---------------------------------------------------------------------- 209 llhold = .FALSE. 210 IF( PRESENT(ldhold) ) llhold = ldhold 211 clstr = '' 212 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 213 214 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot resume/start tiling as ln_tile = .false.') 215 IF( l_istiled ) THEN 216 CALL ctl_warn('Cannot resume/start tiling as it is already active'//clstr) 217 RETURN 218 ! TODO: [tiling] this warning will always be raised outside a tiling loop (cannot check for pause rather than stop) 219 ELSE IF( llhold .AND. ntile == 0 ) THEN 220 CALL ctl_warn('Cannot resume tiling as it is not paused'//clstr) 221 RETURN 222 ENDIF 223 224 ! Whether resumed or started, the tiling is made active. If resumed, the domain indices for the current tile are used. 225 IF( llhold ) CALL dom_tile(ntsi, ntsj, ntei, ntej, ktile=ntile, ldhold=.TRUE., cstr='dom_tile_start'//clstr) 226 l_istiled = .TRUE. 227 END SUBROUTINE dom_tile_start 228 229 230 SUBROUTINE dom_tile_stop( ldhold, cstr ) 231 !!---------------------------------------------------------------------- 232 !! *** ROUTINE dom_tile_stop *** 233 !! 234 !! ** Purpose : End or pause the use of tiling 235 !! 236 !! ** Method : See dom_tile_start 237 !!---------------------------------------------------------------------- 238 LOGICAL, INTENT(in), OPTIONAL :: ldhold ! Pause (.true.) or stop (.false.) 239 LOGICAL :: llhold 240 CHARACTER(len=*), INTENT(in), OPTIONAL :: cstr ! Debug information (added to warnings) 241 CHARACTER(len=23) :: clstr 242 !!---------------------------------------------------------------------- 243 llhold = .FALSE. 244 IF( PRESENT(ldhold) ) llhold = ldhold 245 clstr = '' 246 IF( PRESENT(cstr) ) clstr = TRIM(' ('//TRIM(cstr)//')') 247 248 IF( .NOT. ln_tile ) CALL ctl_stop('Cannot pause/stop tiling as ln_tile = .false.') 249 IF( .NOT. l_istiled ) THEN 250 CALL ctl_warn('Cannot pause/stop tiling as it is inactive'//clstr) 251 RETURN 252 ENDIF 253 254 ! Whether paused or stopped, the tiling is made inactive and the full domain indices are used. 255 ! If stopped, there is no active tile (ntile = 0) and the finished tile indicators are reset 256 CALL dom_tile(ntsi, ntsj, ntei, ntej, ktile=0, ldhold=llhold, cstr='dom_tile_stop'//clstr) 257 IF( .NOT. llhold ) l_tilefin(:) = .FALSE. 258 l_istiled = .FALSE. 259 END SUBROUTINE dom_tile_stop 111 260 !!====================================================================== 112 261 END MODULE domtile -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DOM/domutl.F90
r14776 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 28 28 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 29 29 USE prtctl ! Print control 30 #if defined key_loop_fusion 31 USE dynldf_iso_lf ! lateral mixing - loop fusion version (dyn_ldf_iso routine ) 32 #endif 30 33 31 34 IMPLICIT NONE … … 36 39 37 40 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 41 42 42 !! * Substitutions … … 54 54 !! *** ROUTINE dyn_ldf_iso_alloc *** 55 55 !!---------------------------------------------------------------------- 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.') 56 dyn_ldf_iso_alloc = 0 57 IF( .NOT. ALLOCATED( akzu ) ) THEN 58 ALLOCATE( akzu(jpi,jpj,jpk), akzv(jpi,jpj,jpk), STAT=dyn_ldf_iso_alloc ) 59 ! 60 IF( dyn_ldf_iso_alloc /= 0 ) CALL ctl_warn('dyn_ldf_iso_alloc: array allocate failed.') 61 ENDIF 60 62 END FUNCTION dyn_ldf_iso_alloc 61 63 … … 112 114 REAL(wp) :: zabe2, zmskf, zmkf, zvav, zvwslpi, zvwslpj ! - - 113 115 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 ! - - 116 REAL(wp), DIMENSION(A2D(nn_hls)) :: ziut, zivf, zdku, zdk1u ! 2D workspace 117 REAL(wp), DIMENSION(A2D(nn_hls)) :: zjuf, zjvt, zdkv, zdk1v ! - - 118 REAL(wp), DIMENSION(A1Di(nn_hls),jpk) :: zfuw, zdiu, zdju, zdj1u ! - - 119 REAL(wp), DIMENSION(A1Di(nn_hls),jpk) :: zfvw, zdiv, zdjv, zdj1v ! - - 116 120 !!---------------------------------------------------------------------- 117 121 ! 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') 122 #if defined key_loop_fusion 123 CALL dyn_ldf_iso_lf( kt, Kbb, Kmm, puu, pvv, Krhs ) 124 #else 125 126 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 127 IF( kt == nit000 ) THEN 128 IF(lwp) WRITE(numout,*) 129 IF(lwp) WRITE(numout,*) 'dyn_ldf_iso : iso-neutral laplacian diffusive operator or ' 130 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ s-coordinate horizontal diffusive operator' 131 ! ! allocate dyn_ldf_iso arrays 132 IF( dyn_ldf_iso_alloc() /= 0 ) CALL ctl_stop('STOP', 'dyn_ldf_iso: failed to allocate arrays') 133 ENDIF 124 134 ENDIF 125 135 … … 128 138 IF( ln_dynldf_hor .AND. ln_traldf_iso ) THEN 129 139 ! 130 DO_3D ( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) ! set the slopes of iso-level140 DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpk ) ! set the slopes of iso-level 131 141 uslp (ji,jj,jk) = - ( gdept(ji+1,jj,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e1u(ji,jj) * umask(ji,jj,jk) 132 142 vslp (ji,jj,jk) = - ( gdept(ji,jj+1,jk,Kbb) - gdept(ji ,jj ,jk,Kbb) ) * r1_e2v(ji,jj) * vmask(ji,jj,jk) … … 135 145 END_3D 136 146 ! 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 )147 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 148 ! 139 149 ENDIF 140 150 141 151 zaht_0 = 0.5_wp * rn_Ud * rn_Ld ! aht_0 from namtra_ldf = zaht_max … … 150 160 ! zdkv(jk=1)=zdkv(jk=2) 151 161 152 zdk1u(:,:) = ( puu(:,:,jk,Kbb) -puu(:,:,jk+1,Kbb) ) * umask(:,:,jk+1) 153 zdk1v(:,:) = ( pvv(:,:,jk,Kbb) -pvv(:,:,jk+1,Kbb) ) * vmask(:,:,jk+1) 162 DO_2D( 1, 1, 1, 1 ) 163 zdk1u(ji,jj) = ( puu(ji,jj,jk,Kbb) -puu(ji,jj,jk+1,Kbb) ) * umask(ji,jj,jk+1) 164 zdk1v(ji,jj) = ( pvv(ji,jj,jk,Kbb) -pvv(ji,jj,jk+1,Kbb) ) * vmask(ji,jj,jk+1) 165 END_2D 154 166 155 167 IF( jk == 1 ) THEN … … 157 169 zdkv(:,:) = zdk1v(:,:) 158 170 ELSE 159 zdku(:,:) = ( puu(:,:,jk-1,Kbb) - puu(:,:,jk,Kbb) ) * umask(:,:,jk) 160 zdkv(:,:) = ( pvv(:,:,jk-1,Kbb) - pvv(:,:,jk,Kbb) ) * vmask(:,:,jk) 171 DO_2D( 1, 1, 1, 1 ) 172 zdku(ji,jj) = ( puu(ji,jj,jk-1,Kbb) - puu(ji,jj,jk,Kbb) ) * umask(ji,jj,jk) 173 zdkv(ji,jj) = ( pvv(ji,jj,jk-1,Kbb) - pvv(ji,jj,jk,Kbb) ) * vmask(ji,jj,jk) 174 END_2D 161 175 ENDIF 162 176 … … 286 300 287 301 ! ! =============== 288 DO jj = 2, jpjm1! Vertical slab302 DO jj = ntsj, ntej ! Vertical slab 289 303 ! ! =============== 290 304 … … 299 313 300 314 DO jk = 1, jpk 301 DO ji = 2, jpi315 DO ji = ntsi, ntei + nn_hls 302 316 ! i-gradient of u at jj 303 317 zdiu (ji,jk) = tmask(ji,jj ,jk) * ( puu(ji,jj ,jk,Kbb) - puu(ji-1,jj ,jk,Kbb) ) … … 311 325 END DO 312 326 DO jk = 1, jpk 313 DO ji = 1, jpim1327 DO ji = ntsi - nn_hls, ntei 314 328 ! i-gradient of v at jj 315 329 zdiv (ji,jk) = fmask(ji,jj ,jk) * ( pvv(ji+1,jj,jk,Kbb) - pvv(ji ,jj ,jk,Kbb) ) … … 322 336 323 337 ! Surface and bottom vertical fluxes set to zero 324 DO ji = 1, jpi338 DO ji = ntsi - nn_hls, ntei + nn_hls 325 339 zfuw(ji, 1 ) = 0.e0 326 340 zfvw(ji, 1 ) = 0.e0 … … 331 345 ! interior (2=<jk=<jpk-1) on U field 332 346 DO jk = 2, jpkm1 333 DO ji = 2, jpim1347 DO ji = ntsi, ntei 334 348 zcof0 = 0.5_wp * zaht_0 * umask(ji,jj,jk) 335 349 ! … … 357 371 ! interior (2=<jk=<jpk-1) on V field 358 372 DO jk = 2, jpkm1 359 DO ji = 2, jpim1373 DO ji = ntsi, ntei 360 374 zcof0 = 0.5_wp * zaht_0 * vmask(ji,jj,jk) 361 375 ! … … 385 399 ! ------------------------------------------------------------------- 386 400 DO jk = 1, jpkm1 387 DO ji = 2, jpim1401 DO ji = ntsi, ntei 388 402 puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) + ( zfuw(ji,jk) - zfuw(ji,jk+1) ) * r1_e1e2u(ji,jj) & 389 403 & / e3u(ji,jj,jk,Kmm) … … 395 409 END DO ! End of slab 396 410 ! ! =============== 411 #endif 397 412 END SUBROUTINE dyn_ldf_iso 398 413 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynldf_lap_blp.F90
r14776 r14805 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 … … 21 22 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 22 23 USE lib_mpp 23 24 #if defined key_loop_fusion 25 USE dynldf_lap_blp_lf 26 #endif 27 24 28 IMPLICIT NONE 25 29 PRIVATE … … 39 43 40 44 SUBROUTINE dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 45 !! 46 INTEGER , INTENT(in ) :: kt ! ocean time-step index 47 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 48 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 49 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pu, pv ! before velocity [m/s] 50 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 51 !! 52 CALL dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, is_tile(pu), pu_rhs, pv_rhs, is_tile(pu_rhs), kpass ) 53 END SUBROUTINE dyn_ldf_lap 54 55 56 SUBROUTINE dyn_ldf_lap_t( kt, Kbb, Kmm, pu, pv, ktuv, pu_rhs, pv_rhs, ktuv_rhs, kpass ) 41 57 !!---------------------------------------------------------------------- 42 58 !! *** ROUTINE dyn_ldf_lap *** … … 52 68 !! Reference : S.Griffies, R.Hallberg 2000 Mon.Wea.Rev., DOI:/ 53 69 !!---------------------------------------------------------------------- 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] 70 INTEGER , INTENT(in ) :: kt ! ocean time-step index 71 INTEGER , INTENT(in ) :: Kbb, Kmm ! ocean time level indices 72 INTEGER , INTENT(in ) :: kpass ! =1/2 first or second passage 73 INTEGER , INTENT(in ) :: ktuv, ktuv_rhs 74 REAL(wp), DIMENSION(A2D_T(ktuv) ,JPK), INTENT(in ) :: pu, pv ! before velocity [m/s] 75 REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) :: pu_rhs, pv_rhs ! velocity trend [m/s2] 59 76 ! 60 77 INTEGER :: ji, jj, jk ! dummy loop indices 78 INTEGER :: iij 61 79 REAL(wp) :: zsign ! local scalars 62 80 REAL(wp) :: zua, zva ! local scalars … … 65 83 !!---------------------------------------------------------------------- 66 84 ! 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,*) '~~~~~~~ ' 85 #if defined key_loop_fusion 86 CALL dyn_ldf_lap_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass ) 87 #else 88 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 89 IF( kt == nit000 .AND. lwp ) THEN 90 WRITE(numout,*) 91 WRITE(numout,*) 'dyn_ldf : iso-level harmonic (laplacian) operator, pass=', kpass 92 WRITE(numout,*) '~~~~~~~ ' 93 ENDIF 94 ENDIF 95 ! 96 ! Define pu_rhs/pv_rhs halo points for multi-point haloes in bilaplacian case 97 IF( nldf_dyn == np_blp .AND. kpass == 1 ) THEN ; iij = nn_hls 98 ELSE ; iij = 1 71 99 ENDIF 72 100 ! … … 79 107 CASE ( np_typ_rot ) !== Vorticity-Divergence operator ==! 80 108 ! 81 ALLOCATE( zcur( jpi,jpj) , zdiv(jpi,jpj) )109 ALLOCATE( zcur(A2D(nn_hls)) , zdiv(A2D(nn_hls)) ) 82 110 ! 83 111 DO jk = 1, jpkm1 ! Horizontal slab 84 112 ! 85 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls)113 DO_2D( iij-1, iij, iij-1, iij ) 86 114 ! ! ahm * e3 * curl (computed from 1 to jpim1/jpjm1) 87 115 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 122 END_2D 95 123 ! 96 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )! - curl( curl) + grad( div )124 DO_2D( iij-1, iij-1, iij-1, iij-1 ) ! - curl( curl) + grad( div ) 97 125 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 126 & - ( zcur(ji ,jj) - zcur(ji,jj-1) ) * r1_e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & … … 110 138 CASE ( np_typ_sym ) !== Symmetric operator ==! 111 139 ! 112 ALLOCATE( zten( jpi,jpj) , zshe(jpi,jpj) )140 ALLOCATE( zten(A2D(nn_hls)) , zshe(A2D(nn_hls)) ) 113 141 ! 114 142 DO jk = 1, jpkm1 ! Horizontal slab 115 143 ! 116 DO_2D( nn_hls-1, nn_hls, nn_hls-1, nn_hls)144 DO_2D( iij-1, iij, iij-1, iij ) 117 145 ! ! shearing stress component (F-point) NB : ahmf has already been multiplied by fmask 118 146 zshe(ji-1,jj-1) = ahmf(ji-1,jj-1,jk) & … … 129 157 END_2D 130 158 ! 131 DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )159 DO_2D( iij-1, iij-1, iij-1, iij-1 ) 132 160 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zsign * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm) & 133 161 & * ( ( zten(ji+1,jj ) * e2t(ji+1,jj )*e2t(ji+1,jj ) * e3t(ji+1,jj ,jk,Kmm) & … … 150 178 END SELECT 151 179 ! 152 END SUBROUTINE dyn_ldf_lap 180 #endif 181 END SUBROUTINE dyn_ldf_lap_t 153 182 154 183 … … 171 200 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: pu_rhs, pv_rhs ! momentum trend 172 201 ! 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,*) '~~~~~~~~~~~~' 202 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zulap, zvlap ! laplacian at u- and v-point 203 !!---------------------------------------------------------------------- 204 ! 205 #if defined key_loop_fusion 206 CALL dyn_ldf_blp_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs ) 207 #else 208 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 209 IF( kt == nit000 ) THEN 210 IF(lwp) WRITE(numout,*) 211 IF(lwp) WRITE(numout,*) 'dyn_ldf_blp : bilaplacian operator momentum ' 212 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 213 ENDIF 180 214 ENDIF 181 215 ! … … 189 223 CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 ) ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs)) 190 224 ! 225 #endif 191 226 END SUBROUTINE dyn_ldf_blp 192 227 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynvor.F90
r14776 r14805 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)) :: z1_e3f 628 #if defined key_loop_fusion 629 REAL(wp) :: ztne, ztnw, ztnw_ip1, ztse, ztse_jp1, ztsw_jp1, ztsw_ip1 630 REAL(wp) :: zwx, zwx_im1, zwx_jp1, zwx_im1_jp1 631 REAL(wp) :: zwy, zwy_ip1, zwy_jm1, zwy_ip1_jm1 632 #else 633 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx , zwy 634 REAL(wp), DIMENSION(A2D(nn_hls)) :: ztnw, ztne, ztsw, ztse 635 #endif 636 REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) :: zwz ! 3D workspace, jpkm1 -> jpkm1 -> avoid lbc_lnk on jpk that is not defined 637 !!---------------------------------------------------------------------- 638 ! 639 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 640 IF( kt == nit000 ) THEN 641 IF(lwp) WRITE(numout,*) 642 IF(lwp) WRITE(numout,*) 'dyn:vor_een : vorticity term: energy and enstrophy conserving scheme' 643 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 644 ENDIF 620 645 ENDIF 621 646 ! … … 632 657 CASE ( 0 ) ! original formulation (masked averaging of e3t divided by 4) 633 658 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) ) 659 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 660 ze3f = ( (e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 661 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)) & 662 & + (e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 663 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk)) ) 638 664 IF( ze3f /= 0._wp ) THEN ; z1_e3f(ji,jj) = 4._wp / ze3f 639 665 ELSE ; z1_e3f(ji,jj) = 0._wp … … 642 668 CASE ( 1 ) ! new formulation (masked averaging of e3t divided by the sum of mask) 643 669 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) ) 670 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 671 ze3f = ( (e3t(ji ,jj+1,jk,Kmm)*tmask(ji ,jj+1,jk) & 672 & + e3t(ji+1,jj+1,jk,Kmm)*tmask(ji+1,jj+1,jk)) & 673 & + (e3t(ji ,jj ,jk,Kmm)*tmask(ji ,jj ,jk) & 674 & + e3t(ji+1,jj ,jk,Kmm)*tmask(ji+1,jj ,jk)) ) 648 675 zmsk = ( tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) & 649 676 & + tmask(ji,jj ,jk) + tmask(ji+1,jj ,jk) ) … … 706 733 ! 707 734 ! ! =============== 708 DO jk = 1, jpkm1 ! Horizontal slab 709 ! ! =============== 710 ! 735 ! ! Horizontal slab 736 ! ! =============== 737 #if defined key_loop_fusion 738 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 711 739 ! !== horizontal fluxes ==! 712 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 713 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 740 zwx = e2u(ji ,jj ) * e3u(ji ,jj ,jk,Kmm) * pu(ji ,jj ,jk) 741 zwx_im1 = e2u(ji-1,jj ) * e3u(ji-1,jj ,jk,Kmm) * pu(ji-1,jj ,jk) 742 zwx_jp1 = e2u(ji ,jj+1) * e3u(ji ,jj+1,jk,Kmm) * pu(ji ,jj+1,jk) 743 zwx_im1_jp1 = e2u(ji-1,jj+1) * e3u(ji-1,jj+1,jk,Kmm) * pu(ji-1,jj+1,jk) 744 zwy = e1v(ji ,jj ) * e3v(ji ,jj ,jk,Kmm) * pv(ji ,jj ,jk) 745 zwy_ip1 = e1v(ji+1,jj ) * e3v(ji+1,jj ,jk,Kmm) * pv(ji+1,jj ,jk) 746 zwy_jm1 = e1v(ji ,jj-1) * e3v(ji ,jj-1,jk,Kmm) * pv(ji ,jj-1,jk) 747 zwy_ip1_jm1 = e1v(ji+1,jj-1) * e3v(ji+1,jj-1,jk,Kmm) * pv(ji+1,jj-1,jk) 748 ! !== compute and add the vorticity term trend =! 749 ztne = zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) 750 ztnw = zwz(ji-1,jj-1,jk) + zwz(ji-1,jj ,jk) + zwz(ji ,jj ,jk) 751 ztnw_ip1 = zwz(ji ,jj-1,jk) + zwz(ji ,jj ,jk) + zwz(ji+1,jj ,jk) 752 ztse = zwz(ji ,jj ,jk) + zwz(ji ,jj-1,jk) + zwz(ji-1,jj-1,jk) 753 ztse_jp1 = zwz(ji ,jj+1,jk) + zwz(ji ,jj ,jk) + zwz(ji-1,jj ,jk) 754 ztsw_jp1 = zwz(ji ,jj ,jk) + zwz(ji-1,jj ,jk) + zwz(ji-1,jj+1,jk) 755 ztsw_ip1 = zwz(ji+1,jj-1,jk) + zwz(ji ,jj-1,jk) + zwz(ji ,jj ,jk) 756 ! 757 zua = + r1_12 * r1_e1u(ji,jj) * ( ztne * zwy + ztnw_ip1 * zwy_ip1 & 758 & + ztse * zwy_jm1 + ztsw_ip1 * zwy_ip1_jm1 ) 759 zva = - r1_12 * r1_e2v(ji,jj) * ( ztsw_jp1 * zwx_im1_jp1 + ztse_jp1 * zwx_jp1 & 760 & + ztnw * zwx_im1 + ztne * zwx ) 761 pu_rhs(ji,jj,jk) = pu_rhs(ji,jj,jk) + zua 762 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 763 END_3D 764 #else 765 DO jk = 1, jpkm1 766 ! 767 ! !== horizontal fluxes ==! 768 DO_2D( 1, 1, 1, 1 ) 769 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 770 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 771 END_2D 714 772 ! 715 773 ! !== compute and add the vorticity term trend =! … … 729 787 pv_rhs(ji,jj,jk) = pv_rhs(ji,jj,jk) + zva 730 788 END_2D 731 ! ! =============== 732 END DO ! End of slab 789 END DO 790 #endif 791 ! ! =============== 792 ! ! End of slab 733 793 ! ! =============== 734 794 END SUBROUTINE vor_een … … 762 822 REAL(wp) :: zua, zva ! local scalars 763 823 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,*) '~~~~~~~~~~~' 824 REAL(wp), DIMENSION(A2D(nn_hls)) :: zwx , zwy 825 REAL(wp), DIMENSION(A2D(nn_hls)) :: ztnw, ztne, ztsw, ztse 826 REAL(wp), DIMENSION(A2D(nn_hls),jpkm1) :: zwz ! 3D workspace, avoid lbc_lnk on jpk that is not defined 827 !!---------------------------------------------------------------------- 828 ! 829 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 830 IF( kt == nit000 ) THEN 831 IF(lwp) WRITE(numout,*) 832 IF(lwp) WRITE(numout,*) 'dyn:vor_eeT : vorticity term: energy and enstrophy conserving scheme' 833 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 834 ENDIF 773 835 ENDIF 774 836 ! … … 785 847 CASE ( np_RVO ) !* relative vorticity 786 848 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) ) & 849 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 850 zwz(ji,jj,jk) = ( (e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk)) & 851 & - (e1u(ji ,jj+1) * pu(ji ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)) ) & 789 852 & * r1_e1e2f(ji,jj) 790 853 END_2D … … 801 864 CASE ( np_CRV ) !* Coriolis + relative vorticity 802 865 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) ) 866 ! NOTE: [halo1-halo2] brackets added to make results independent of nn_hls 867 zwz(ji,jj,jk) = ( ff_f(ji,jj) + ( (e2v(ji+1,jj ) * pv(ji+1,jj ,jk) - e2v(ji,jj) * pv(ji,jj,jk)) & 868 & - (e1u(ji ,jj+1) * pu(ji ,jj+1,jk) - e1u(ji,jj) * pu(ji,jj,jk)) ) & 869 & * r1_e1e2f(ji,jj) ) 806 870 END_2D 807 871 IF( ln_dynvor_msk ) THEN ! mask the relative vorticity … … 830 894 ! 831 895 ! !== horizontal fluxes ==! 832 zwx(:,:) = e2u(:,:) * e3u(:,:,jk,Kmm) * pu(:,:,jk) 833 zwy(:,:) = e1v(:,:) * e3v(:,:,jk,Kmm) * pv(:,:,jk) 896 DO_2D( 1, 1, 1, 1 ) 897 zwx(ji,jj) = e2u(ji,jj) * e3u(ji,jj,jk,Kmm) * pu(ji,jj,jk) 898 zwy(ji,jj) = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) * pv(ji,jj,jk) 899 END_2D 834 900 ! 835 901 ! !== compute and add the vorticity term trend =! -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/dynzad.F90
r14776 r14805 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 r14805 19 19 USE zdfdrg ! vertical physics: top/bottom drag coef. 20 20 USE dynadv ,ONLY: ln_dynadv_vec ! dynamics: advection form 21 #if defined key_loop_fusion 22 USE dynldf_iso_lf,ONLY: akzu, akzv ! dynamics: vertical component of rotated lateral mixing 23 #else 21 24 USE dynldf_iso,ONLY: akzu, akzv ! dynamics: vertical component of rotated lateral mixing 25 #endif 22 26 USE ldfdyn ! lateral diffusion: eddy viscosity coef. and type of operator 23 27 USE trd_oce ! trends: ocean variables … … 78 82 REAL(wp) :: zWui, zWvi ! - - 79 83 REAL(wp) :: zWus, zWvs ! - - 80 REAL(wp), DIMENSION( jpi,jpj,jpk) :: zwi, zwd, zws ! 3D workspace84 REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zwi, zwd, zws ! 3D workspace 81 85 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdu, ztrdv ! - - 82 86 !!--------------------------------------------------------------------- … … 84 88 IF( ln_timing ) CALL timing_start('dyn_zdf') 85 89 ! 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 90 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 91 IF( kt == nit000 ) THEN !* initialization 92 IF(lwp) WRITE(numout,*) 93 IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 94 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 95 ! 96 If( ln_linssh ) THEN ; r_vvl = 0._wp ! non-linear free surface indicator 97 ELSE ; r_vvl = 1._wp 98 ENDIF 93 99 ENDIF 94 100 ENDIF -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/DYN/sshwzv.F90
r14776 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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/LDF/ldftra.F90
r14776 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 … … 25 25 USE traadv_cen ! centered scheme (tra_adv_cen routine) 26 26 USE traadv_fct ! FCT scheme (tra_adv_fct routine) 27 USE traadv_fct_lf ! FCT scheme (tra_adv_fct routine - loop fusion version)28 27 USE traadv_mus ! MUSCL scheme (tra_adv_mus routine) 29 USE traadv_mus_lf ! MUSCL scheme (tra_adv_mus routine - loop fusion version)30 28 USE traadv_ubs ! UBS scheme (tra_adv_ubs routine) 31 29 USE traadv_qck ! QUICKEST scheme (tra_adv_qck routine) … … 93 91 ! 94 92 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)93 ! 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 94 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zuu, zvv, zww ! 3D workspace 97 95 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds 98 ! TEMP: [tiling] This change not necessary after extra haloes development96 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 99 97 LOGICAL :: lskip 100 98 !!---------------------------------------------------------------------- … … 104 102 lskip = .FALSE. 105 103 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 tile104 ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 105 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 108 106 ALLOCATE( zuu(jpi,jpj,jpk), zvv(jpi,jpj,jpk), zww(jpi,jpj,jpk) ) 109 107 ENDIF 110 108 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 109 ! TEMP: [tiling] These changes not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 110 IF( ln_tile .AND. nadv == np_FCT ) THEN 111 IF( ntile == 1 ) THEN 112 CALL dom_tile_stop( ldhold=.TRUE. ) 113 ELSE 114 lskip = .TRUE. 119 115 ENDIF 120 116 ENDIF … … 122 118 ! !== effective transport ==! 123 119 IF( ln_wave .AND. ln_sdw ) THEN 124 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )120 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 125 121 zuu(ji,jj,jk) = e2u (ji,jj) * e3u(ji,jj,jk,Kmm) * ( uu(ji,jj,jk,Kmm) + usd(ji,jj,jk) ) 126 122 zvv(ji,jj,jk) = e1v (ji,jj) * e3v(ji,jj,jk,Kmm) * ( vv(ji,jj,jk,Kmm) + vsd(ji,jj,jk) ) … … 128 124 END_3D 129 125 ELSE 130 DO_3D ( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )126 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 131 127 zuu(ji,jj,jk) = e2u (ji,jj) * e3u(ji,jj,jk,Kmm) * uu(ji,jj,jk,Kmm) ! eulerian transport only 132 128 zvv(ji,jj,jk) = e1v (ji,jj) * e3v(ji,jj,jk,Kmm) * vv(ji,jj,jk,Kmm) … … 136 132 ! 137 133 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 )134 DO_3D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1, 1, jpkm1 ) 139 135 zuu(ji,jj,jk) = zuu(ji,jj,jk) + un_td(ji,jj,jk) 140 136 zvv(ji,jj,jk) = zvv(ji,jj,jk) + vn_td(ji,jj,jk) … … 142 138 ENDIF 143 139 ! 144 DO_2D ( nn_hls, nn_hls, nn_hls, nn_hls)140 DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 ) 145 141 zuu(ji,jj,jpk) = 0._wp ! no transport trough the bottom 146 142 zvv(ji,jj,jpk) = 0._wp … … 148 144 END_2D 149 145 ! 150 ! TEMP: [tiling] These changes not necessary if using XIOS (subdomain support)151 146 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 147 & CALL ldf_eiv_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm, Krhs ) ! add the eiv transport (if necessary) 148 ! 149 IF( ln_mle ) CALL tra_mle_trp( kt, nit000, zuu, zvv, zww, 'TRA', Kmm ) ! add the mle transport (if necessary) 150 ! 151 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 152 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only on the last tile 160 153 CALL iom_put( "uocetr_eff", zuu ) ! output effective transport 161 154 CALL iom_put( "vocetr_eff", zvv ) … … 163 156 ENDIF 164 157 ! 165 166 ! TEMP: [tiling] This c hange not necessary if using XIOS (subdomain support)158 !!gm ??? 159 ! TEMP: [tiling] This copy-in not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 167 160 CALL dia_ptr( kt, Kmm, zvv(A2D(nn_hls),:) ) ! diagnose the effective MSF 168 161 !!gm ??? 169 162 ! 170 163 … … 180 173 CALL tra_adv_cen ( kt, nit000, 'TRA', zuu, zvv, zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v ) 181 174 CASE ( np_FCT ) ! FCT scheme : 2nd / 4th order 182 IF (nn_hls==2) THEN183 #if defined key_loop_fusion184 CALL tra_adv_fct_lf ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v )185 #else186 175 CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v ) 187 #endif188 ELSE189 CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v )190 END IF191 176 CASE ( np_MUS ) ! MUSCL 192 IF (nn_hls==2) THEN193 #if defined key_loop_fusion194 CALL tra_adv_mus_lf ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups )195 #else196 177 CALL tra_adv_mus ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups ) 197 #endif198 ELSE199 CALL tra_adv_mus ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups )200 END IF201 178 CASE ( np_UBS ) ! UBS 202 179 CALL tra_adv_ubs ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v ) … … 216 193 ENDIF 217 194 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 195 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 196 IF( ln_tile .AND. .NOT. l_istiled ) CALL dom_tile_start( ldhold=.TRUE. ) 221 197 ENDIF 222 198 ! ! print mean trends (used for debugging) … … 224 200 & tab3d_2=pts(:,:,:,jp_sal,Krhs), clinfo2= ' Sa: ', mask2=tmask, clinfo3='tra' ) 225 201 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 domain202 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 203 IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the full domain 228 204 DEALLOCATE( zuu, zvv, zww ) 229 205 ENDIF … … 297 273 CALL ctl_stop( 'tra_adv_init: FCT scheme, choose 2nd or 4th order' ) 298 274 ENDIF 275 ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 276 IF( ln_traadv_fct .AND. ln_tile ) THEN 277 CALL ctl_warn( 'tra_adv_init: FCT scheme does not yet work with tiling' ) 278 ENDIF 299 279 IF( ln_traadv_ubs .AND. ( nn_ubs_v /= 2 .AND. nn_ubs_v /= 4 ) ) THEN ! UBS 300 280 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 r14805 23 23 USE trc_oce ! share passive tracers/Ocean variables 24 24 USE lib_mpp ! MPP library 25 #if defined key_loop_fusion 26 USE traadv_cen_lf ! centered scheme (tra_adv_cen routine - loop fusion version) 27 #endif 25 28 26 29 IMPLICIT NONE … … 71 74 INTEGER , INTENT(in ) :: kn_cen_h ! =2/4 (2nd or 4th order scheme) 72 75 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)76 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 74 77 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 75 78 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 82 85 !!---------------------------------------------------------------------- 83 86 ! 84 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only on the first tile 87 #if defined key_loop_fusion 88 CALL tra_adv_cen_lf ( kt, nit000, cdtype, pU, pV, pW, Kmm, pt, kjpt, Krhs, kn_cen_h, kn_cen_v ) 89 #else 90 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 85 91 IF( kt == kit000 ) THEN 86 92 IF(lwp) WRITE(numout,*) … … 184 190 END DO 185 191 ! 192 #endif 186 193 END SUBROUTINE tra_adv_cen 187 194 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_fct.F90
r14776 r14805 34 34 PUBLIC tra_adv_fct ! called by traadv.F90 35 35 PUBLIC interp_4th_cpt ! called by traadv_cen.F90 36 PUBLIC tridia_solver ! called by traadv_fct_lf.F9037 PUBLIC nonosc ! called by traadv_fct_lf.F90 - key_agrif38 36 39 37 LOGICAL :: l_trd ! flag to compute trends … … 81 79 INTEGER , INTENT(in ) :: kn_fct_v ! order of the FCT scheme (=2 or 4) 82 80 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 83 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)81 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case 84 82 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 85 83 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 95 93 !!---------------------------------------------------------------------- 96 94 ! 97 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only on the first tile 95 #if defined key_loop_fusion 96 CALL tra_adv_fct_lf ( kt, nit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs, kn_fct_h, kn_fct_v ) 97 #else 98 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 98 99 IF( kt == kit000 ) THEN 99 100 IF(lwp) WRITE(numout,*) … … 136 137 ! If adaptive vertical advection, check if it is needed on this PE at this time 137 138 IF( ln_zad_Aimp ) THEN 138 IF( MAXVAL( ABS( wi(A2D( nn_hls),:) ) ) > 0._wp ) ll_zAimp = .TRUE.139 IF( MAXVAL( ABS( wi(A2D(1),:) ) ) > 0._wp ) ll_zAimp = .TRUE. 139 140 END IF 140 141 ! If active adaptive vertical advection, build tridiagonal matrix … … 380 381 ENDIF 381 382 ! 383 #endif 382 384 END SUBROUTINE tra_adv_fct 383 385 … … 676 678 END SUBROUTINE tridia_solver 677 679 680 #if defined key_loop_fusion 681 #define tracer_flux_i(out,zfp,zfm,ji,jj,jk) \ 682 zfp = pU(ji,jj,jk) + ABS( pU(ji,jj,jk) ) ; \ 683 zfm = pU(ji,jj,jk) - ABS( pU(ji,jj,jk) ) ; \ 684 out = 0.5 * ( zfp * pt(ji,jj,jk,jn,Kbb) + zfm * pt(ji+1,jj,jk,jn,Kbb) ) 685 686 #define tracer_flux_j(out,zfp,zfm,ji,jj,jk) \ 687 zfp = pV(ji,jj,jk) + ABS( pV(ji,jj,jk) ) ; \ 688 zfm = pV(ji,jj,jk) - ABS( pV(ji,jj,jk) ) ; \ 689 out = 0.5 * ( zfp * pt(ji,jj,jk,jn,Kbb) + zfm * pt(ji,jj+1,jk,jn,Kbb) ) 690 691 SUBROUTINE tra_adv_fct_lf( kt, kit000, cdtype, p2dt, pU, pV, pW, & 692 & Kbb, Kmm, pt, kjpt, Krhs, kn_fct_h, kn_fct_v ) 693 !!---------------------------------------------------------------------- 694 !! *** ROUTINE tra_adv_fct *** 695 !! 696 !! ** Purpose : Compute the now trend due to total advection of tracers 697 !! and add it to the general trend of tracer equations 698 !! 699 !! ** Method : - 2nd or 4th FCT scheme on the horizontal direction 700 !! (choice through the value of kn_fct) 701 !! - on the vertical the 4th order is a compact scheme 702 !! - corrected flux (monotonic correction) 703 !! 704 !! ** Action : - update pt(:,:,:,:,Krhs) with the now advective tracer trends 705 !! - send trends to trdtra module for further diagnostics (l_trdtra=T) 706 !! - poleward advective heat and salt transport (ln_diaptr=T) 707 !!---------------------------------------------------------------------- 708 INTEGER , INTENT(in ) :: kt ! ocean time-step index 709 INTEGER , INTENT(in ) :: Kbb, Kmm, Krhs ! ocean time level indices 710 INTEGER , INTENT(in ) :: kit000 ! first time step index 711 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 712 INTEGER , INTENT(in ) :: kjpt ! number of tracers 713 INTEGER , INTENT(in ) :: kn_fct_h ! order of the FCT scheme (=2 or 4) 714 INTEGER , INTENT(in ) :: kn_fct_v ! order of the FCT scheme (=2 or 4) 715 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 716 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume flux components 717 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 718 ! 719 INTEGER :: ji, jj, jk, jn ! dummy loop indices 720 REAL(wp) :: ztra ! local scalar 721 REAL(wp) :: zwx_im1, zfp_ui, zfp_ui_m1, zfp_vj, zfp_vj_m1, zfp_wk, zC2t_u, zC4t_u ! - - 722 REAL(wp) :: zwy_jm1, zfm_ui, zfm_ui_m1, zfm_vj, zfm_vj_m1, zfm_wk, zC2t_v, zC4t_v ! - - 723 REAL(wp) :: ztu, ztv, ztu_im1, ztu_ip1, ztv_jm1, ztv_jp1 724 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zwi, zwx_3d, zwy_3d, zwz, ztw, zltu_3d, zltv_3d 725 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdx, ztrdy, ztrdz, zptry 726 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zwinf, zwdia, zwsup 727 LOGICAL :: ll_zAimp ! flag to apply adaptive implicit vertical advection 728 !!---------------------------------------------------------------------- 729 ! 730 IF( kt == kit000 ) THEN 731 IF(lwp) WRITE(numout,*) 732 IF(lwp) WRITE(numout,*) 'tra_adv_fct_lf : FCT advection scheme on ', cdtype 733 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 734 ENDIF 735 !! -- init to 0 736 zwx_3d(:,:,:) = 0._wp 737 zwy_3d(:,:,:) = 0._wp 738 zwz(:,:,:) = 0._wp 739 zwi(:,:,:) = 0._wp 740 ! 741 l_trd = .FALSE. ! set local switches 742 l_hst = .FALSE. 743 l_ptr = .FALSE. 744 ll_zAimp = .FALSE. 745 IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype =='TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 746 IF( cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE. 747 IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 748 & iom_use("uadv_salttr") .OR. iom_use("vadv_salttr") ) ) l_hst = .TRUE. 749 ! 750 IF( l_trd .OR. l_hst ) THEN 751 ALLOCATE( ztrdx(jpi,jpj,jpk), ztrdy(jpi,jpj,jpk), ztrdz(jpi,jpj,jpk) ) 752 ztrdx(:,:,:) = 0._wp ; ztrdy(:,:,:) = 0._wp ; ztrdz(:,:,:) = 0._wp 753 ENDIF 754 ! 755 IF( l_ptr ) THEN 756 ALLOCATE( zptry(jpi,jpj,jpk) ) 757 zptry(:,:,:) = 0._wp 758 ENDIF 759 ! 760 ! If adaptive vertical advection, check if it is needed on this PE at this time 761 IF( ln_zad_Aimp ) THEN 762 IF( MAXVAL( ABS( wi(:,:,:) ) ) > 0._wp ) ll_zAimp = .TRUE. 763 END IF 764 ! If active adaptive vertical advection, build tridiagonal matrix 765 IF( ll_zAimp ) THEN 766 ALLOCATE(zwdia(jpi,jpj,jpk), zwinf(jpi,jpj,jpk),zwsup(jpi,jpj,jpk)) 767 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) 768 zwdia(ji,jj,jk) = 1._wp + p2dt * ( MAX( wi(ji,jj,jk) , 0._wp ) - MIN( wi(ji,jj,jk+1) , 0._wp ) ) & 769 & / e3t(ji,jj,jk,Krhs) 770 zwinf(ji,jj,jk) = p2dt * MIN( wi(ji,jj,jk ) , 0._wp ) / e3t(ji,jj,jk,Krhs) 771 zwsup(ji,jj,jk) = -p2dt * MAX( wi(ji,jj,jk+1) , 0._wp ) / e3t(ji,jj,jk,Krhs) 772 END_3D 773 END IF 774 ! 775 DO jn = 1, kjpt !== loop over the tracers ==! 776 ! 777 ! !== upstream advection with initial mass fluxes & intermediate update ==! 778 ! !* upstream tracer flux in the k direction *! 779 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 780 zfp_wk = pW(ji,jj,jk) + ABS( pW(ji,jj,jk) ) 781 zfm_wk = pW(ji,jj,jk) - ABS( pW(ji,jj,jk) ) 782 zwz(ji,jj,jk) = 0.5 * ( zfp_wk * pt(ji,jj,jk,jn,Kbb) + zfm_wk * pt(ji,jj,jk-1,jn,Kbb) ) * wmask(ji,jj,jk) 783 END_3D 784 IF( ln_linssh ) THEN ! top ocean value (only in linear free surface as zwz has been w-masked) 785 IF( ln_isfcav ) THEN ! top of the ice-shelf cavities and at the ocean surface 786 DO_2D( 1, 1, 1, 1 ) 787 zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kbb) ! linear free surface 788 END_2D 789 ELSE ! no cavities: only at the ocean surface 790 DO_2D( 1, 1, 1, 1 ) 791 zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kbb) 792 END_2D 793 ENDIF 794 ENDIF 795 ! 796 ! !* upstream tracer flux in the i and j direction 797 DO jk = 1, jpkm1 798 DO jj = 1, jpj-1 799 tracer_flux_i(zwx_3d(1,jj,jk),zfp_ui,zfm_ui,1,jj,jk) 800 tracer_flux_j(zwy_3d(1,jj,jk),zfp_vj,zfm_vj,1,jj,jk) 801 END DO 802 DO ji = 1, jpi-1 803 tracer_flux_i(zwx_3d(ji,1,jk),zfp_ui,zfm_ui,ji,1,jk) 804 tracer_flux_j(zwy_3d(ji,1,jk),zfp_vj,zfm_vj,ji,1,jk) 805 END DO 806 DO_2D( 1, 1, 1, 1 ) 807 tracer_flux_i(zwx_3d(ji,jj,jk),zfp_ui,zfm_ui,ji,jj,jk) 808 tracer_flux_i(zwx_im1,zfp_ui_m1,zfm_ui_m1,ji-1,jj,jk) 809 tracer_flux_j(zwy_3d(ji,jj,jk),zfp_vj,zfm_vj,ji,jj,jk) 810 tracer_flux_j(zwy_jm1,zfp_vj_m1,zfm_vj_m1,ji,jj-1,jk) 811 ztra = - ( zwx_3d(ji,jj,jk) - zwx_im1 + zwy_3d(ji,jj,jk) - zwy_jm1 + zwz(ji,jj,jk) - zwz(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) 812 ! ! update and guess with monotonic sheme 813 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra & 814 & / e3t(ji,jj,jk,Kmm ) * tmask(ji,jj,jk) 815 zwi(ji,jj,jk) = ( e3t(ji,jj,jk,Kbb) * pt(ji,jj,jk,jn,Kbb) + p2dt * ztra ) & 816 & / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 817 END_2D 818 END DO 819 820 IF ( ll_zAimp ) THEN 821 CALL tridia_solver( zwdia, zwsup, zwinf, zwi, zwi , 0 ) 822 ! 823 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp ; 824 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 825 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 826 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 827 ztw(ji,jj,jk) = 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 828 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! update vertical fluxes 829 END_3D 830 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 831 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 832 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 833 END_3D 834 ! 835 END IF 836 ! 837 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics (contribution of upstream fluxes) 838 ztrdx(:,:,:) = zwx_3d(:,:,:) ; ztrdy(:,:,:) = zwy_3d(:,:,:) ; ztrdz(:,:,:) = zwz(:,:,:) 839 END IF 840 ! ! "Poleward" heat and salt transports (contribution of upstream fluxes) 841 IF( l_ptr ) zptry(:,:,:) = zwy_3d(:,:,:) 842 ! 843 ! !== anti-diffusive flux : high order minus low order ==! 844 ! 845 SELECT CASE( kn_fct_h ) !* horizontal anti-diffusive fluxes 846 ! 847 CASE( 2 ) !- 2nd order centered 848 DO_3D( 2, 1, 2, 1, 1, jpkm1 ) 849 zwx_3d(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj,jk,jn,Kmm) ) - zwx_3d(ji,jj,jk) 850 zwy_3d(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj+1,jk,jn,Kmm) ) - zwy_3d(ji,jj,jk) 851 END_3D 852 ! 853 CASE( 4 ) !- 4th order centered 854 zltu_3d(:,:,jpk) = 0._wp ! Bottom value : flux set to zero 855 zltv_3d(:,:,jpk) = 0._wp 856 ! ! Laplacian 857 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! 2nd derivative * 1/ 6 858 ! ! 1st derivative (gradient) 859 ztu = ( pt(ji+1,jj,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * umask(ji,jj,jk) 860 ztu_im1 = ( pt(ji,jj,jk,jn,Kmm) - pt(ji-1,jj,jk,jn,Kmm) ) * umask(ji-1,jj,jk) 861 ztv = ( pt(ji,jj+1,jk,jn,Kmm) - pt(ji,jj,jk,jn,Kmm) ) * vmask(ji,jj,jk) 862 ztv_jm1 = ( pt(ji,jj,jk,jn,Kmm) - pt(ji,jj-1,jk,jn,Kmm) ) * vmask(ji,jj-1,jk) 863 ! ! 2nd derivative * 1/ 6 864 zltu_3d(ji,jj,jk) = ( ztu + ztu_im1 ) * r1_6 865 zltv_3d(ji,jj,jk) = ( ztv + ztv_jm1 ) * r1_6 866 END_2D 867 END DO 868 ! NOTE [ comm_cleanup ] : need to change sign to ensure halo 1 - halo 2 compatibility 869 CALL lbc_lnk( 'traadv_fct', zltu_3d, 'T', -1.0_wp , zltv_3d, 'T', -1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 870 ! 871 DO_3D( 2, 1, 2, 1, 1, jpkm1 ) 872 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points 873 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 874 ! ! C4 minus upstream advective fluxes 875 ! round brackets added to fix the order of floating point operations 876 ! needed to ensure halo 1 - halo 2 compatibility 877 zwx_3d(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * ( zC2t_u + ( zltu_3d(ji,jj,jk) - zltu_3d(ji+1,jj,jk) & 878 & ) & ! bracket for halo 1 - halo 2 compatibility 879 & ) - zwx_3d(ji,jj,jk) 880 zwy_3d(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * ( zC2t_v + ( zltv_3d(ji,jj,jk) - zltv_3d(ji,jj+1,jk) & 881 & ) & ! bracket for halo 1 - halo 2 compatibility 882 & ) - zwy_3d(ji,jj,jk) 883 END_3D 884 ! 885 CASE( 41 ) !- 4th order centered ==>> !!gm coding attempt need to be tested 886 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! Horizontal advective fluxes 887 ztu_im1 = ( pt(ji ,jj ,jk,jn,Kmm) - pt(ji-1,jj,jk,jn,Kmm) ) * umask(ji-1,jj,jk) 888 ztu_ip1 = ( pt(ji+2,jj ,jk,jn,Kmm) - pt(ji+1,jj,jk,jn,Kmm) ) * umask(ji+1,jj,jk) 889 890 ztv_jm1 = ( pt(ji,jj ,jk,jn,Kmm) - pt(ji,jj-1,jk,jn,Kmm) ) * vmask(ji,jj-1,jk) 891 ztv_jp1 = ( pt(ji,jj+2,jk,jn,Kmm) - pt(ji,jj+1,jk,jn,Kmm) ) * vmask(ji,jj+1,jk) 892 zC2t_u = pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ! 2 x C2 interpolation of T at u- & v-points (x2) 893 zC2t_v = pt(ji,jj,jk,jn,Kmm) + pt(ji ,jj+1,jk,jn,Kmm) 894 ! ! C4 interpolation of T at u- & v-points (x2) 895 zC4t_u = zC2t_u + r1_6 * ( ztu_im1 - ztu_ip1 ) 896 zC4t_v = zC2t_v + r1_6 * ( ztv_jm1 - ztv_jp1 ) 897 ! ! C4 minus upstream advective fluxes 898 zwx_3d(ji,jj,jk) = 0.5_wp * pU(ji,jj,jk) * zC4t_u - zwx_3d(ji,jj,jk) 899 zwy_3d(ji,jj,jk) = 0.5_wp * pV(ji,jj,jk) * zC4t_v - zwy_3d(ji,jj,jk) 900 END_3D 901 CALL lbc_lnk( 'traadv_fct', zwx_3d, 'U', -1.0_wp , zwy_3d, 'V', -1.0_wp ) ! Lateral boundary cond. (unchanged sgn) 902 ! 903 END SELECT 904 ! 905 SELECT CASE( kn_fct_v ) !* vertical anti-diffusive fluxes (w-masked interior values) 906 ! 907 CASE( 2 ) !- 2nd order centered 908 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 909 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * 0.5_wp * ( pt(ji,jj,jk,jn,Kmm) + pt(ji,jj,jk-1,jn,Kmm) ) & 910 & - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 911 END_3D 912 ! 913 CASE( 4 ) !- 4th order COMPACT 914 CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw ) ! zwt = COMPACT interpolation of T at w-point 915 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) 916 zwz(ji,jj,jk) = ( pW(ji,jj,jk) * ztw(ji,jj,jk) - zwz(ji,jj,jk) ) * wmask(ji,jj,jk) 917 END_3D 918 ! 919 END SELECT 920 IF( ln_linssh ) THEN ! top ocean value: high order = upstream ==>> zwz=0 921 zwz(:,:,1) = 0._wp ! only ocean surface as interior zwz values have been w-masked 922 ENDIF 923 ! 924 CALL lbc_lnk( 'traadv_fct', zwi, 'T', 1.0_wp) 925 ! 926 IF ( ll_zAimp ) THEN 927 DO_3D( 1, 1, 1, 1, 1, jpkm1 ) !* trend and after field with monotonic scheme 928 ! ! total intermediate advective trends 929 ztra = - ( zwx_3d(ji,jj,jk) - zwx_3d(ji-1,jj ,jk ) & 930 & + zwy_3d(ji,jj,jk) - zwy_3d(ji ,jj-1,jk ) & 931 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 932 ztw(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 933 END_3D 934 ! 935 CALL tridia_solver( zwdia, zwsup, zwinf, ztw, ztw , 0 ) 936 ! 937 DO_3D( 1, 1, 1, 1, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 938 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 939 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 940 zwz(ji,jj,jk) = zwz(ji,jj,jk) + 0.5 * e1e2t(ji,jj) * ( zfp_wk * ztw(ji,jj,jk) + zfm_wk * ztw(ji,jj,jk-1) ) * wmask(ji,jj,jk) 941 END_3D 942 END IF 943 ! 944 ! !== monotonicity algorithm ==! 945 ! 946 CALL nonosc( Kmm, pt(:,:,:,jn,Kbb), zwx_3d, zwy_3d, zwz, zwi, p2dt ) 947 ! 948 ! !== final trend with corrected fluxes ==! 949 ! 950 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 951 ztra = - ( zwx_3d(ji,jj,jk) - zwx_3d(ji-1,jj ,jk ) & 952 & + zwy_3d(ji,jj,jk) - zwy_3d(ji ,jj-1,jk ) & 953 & + zwz(ji,jj,jk) - zwz(ji ,jj ,jk+1) ) * r1_e1e2t(ji,jj) 954 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra / e3t(ji,jj,jk,Kmm) 955 zwi(ji,jj,jk) = zwi(ji,jj,jk) + p2dt * ztra / e3t(ji,jj,jk,Krhs) * tmask(ji,jj,jk) 956 END_3D 957 ! 958 IF ( ll_zAimp ) THEN 959 ! 960 ztw(:,:,1) = 0._wp ; ztw(:,:,jpk) = 0._wp 961 DO_3D( 0, 0, 0, 0, 2, jpkm1 ) ! Interior value ( multiplied by wmask) 962 zfp_wk = wi(ji,jj,jk) + ABS( wi(ji,jj,jk) ) 963 zfm_wk = wi(ji,jj,jk) - ABS( wi(ji,jj,jk) ) 964 ztw(ji,jj,jk) = - 0.5 * e1e2t(ji,jj) * ( zfp_wk * zwi(ji,jj,jk) + zfm_wk * zwi(ji,jj,jk-1) ) * wmask(ji,jj,jk) 965 zwz(ji,jj,jk) = zwz(ji,jj,jk) + ztw(ji,jj,jk) ! Update vertical fluxes for trend diagnostic 966 END_3D 967 DO_3D( 0, 0, 0, 0, 1, jpkm1 ) 968 pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( ztw(ji,jj,jk) - ztw(ji ,jj ,jk+1) ) & 969 & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) 970 END_3D 971 END IF 972 ! NOT TESTED - NEED l_trd OR l_hst TRUE 973 IF( l_trd .OR. l_hst ) THEN ! trend diagnostics // heat/salt transport 974 ztrdx(:,:,:) = ztrdx(:,:,:) + zwx_3d(:,:,:) ! <<< add anti-diffusive fluxes 975 ztrdy(:,:,:) = ztrdy(:,:,:) + zwy_3d(:,:,:) ! to upstream fluxes 976 ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:) ! 977 ! 978 IF( l_trd ) THEN ! trend diagnostics 979 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztrdx, pU, pt(:,:,:,jn,Kmm) ) 980 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztrdy, pV, pt(:,:,:,jn,Kmm) ) 981 CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, ztrdz, pW, pt(:,:,:,jn,Kmm) ) 982 ENDIF 983 ! ! heat/salt transport 984 IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 985 ! 986 ENDIF 987 ! NOT TESTED - NEED l_ptr TRUE 988 IF( l_ptr ) THEN ! "Poleward" transports 989 zptry(:,:,:) = zptry(:,:,:) + zwy_3d(:,:,:) ! <<< add anti-diffusive fluxes 990 CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) ) 991 ENDIF 992 ! 993 END DO ! end of tracer loop 994 ! 995 IF ( ll_zAimp ) THEN 996 DEALLOCATE( zwdia, zwinf, zwsup ) 997 ENDIF 998 IF( l_trd .OR. l_hst ) THEN 999 DEALLOCATE( ztrdx, ztrdy, ztrdz ) 1000 ENDIF 1001 IF( l_ptr ) THEN 1002 DEALLOCATE( zptry ) 1003 ENDIF 1004 ! 1005 END SUBROUTINE tra_adv_fct_lf 1006 #endif 678 1007 !!====================================================================== 679 1008 END MODULE traadv_fct -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_mus.F90
r14776 r14805 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 r14805 27 27 USE lbclnk ! ocean lateral boundary condition (or mpp link) 28 28 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 29 #if defined key_loop_fusion 30 USE traadv_qck_lf ! QCK scheme (tra_adv_qck routine - loop fusion version) 31 #endif 29 32 30 33 IMPLICIT NONE … … 91 94 INTEGER , INTENT(in ) :: kjpt ! number of tracers 92 95 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 93 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)96 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 94 97 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume transport components 95 98 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation 96 99 !!---------------------------------------------------------------------- 97 100 ! 98 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only on the first tile 101 #if defined key_loop_fusion 102 CALL tra_adv_qck_lf ( kt, kit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs ) 103 #else 104 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 99 105 IF( kt == kit000 ) THEN 100 106 IF(lwp) WRITE(numout,*) … … 117 123 CALL tra_adv_cen2_k( kt, cdtype, pW, Kmm, pt, kjpt, Krhs ) 118 124 ! 125 #endif 119 126 END SUBROUTINE tra_adv_qck 120 127 … … 129 136 INTEGER , INTENT(in ) :: kjpt ! number of tracers 130 137 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 131 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)138 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 132 139 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU ! i-velocity components 133 140 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 214 221 INTEGER , INTENT(in ) :: kjpt ! number of tracers 215 222 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 216 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)223 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 217 224 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pV ! j-velocity components 218 225 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 229 236 zfd(:,:,:) = 0.0 ; zwy(:,:,:) = 0.0 230 237 ! 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 238 !--- Computation of the ustream and downstream value of the tracer and the mask 239 DO_3D( 0, 0, nn_hls-1, nn_hls-1, 1, jpkm1 ) 240 ! Upstream in the x-direction for the tracer 241 zfc(ji,jj,jk) = pt(ji,jj-1,jk,jn,Kbb) 242 ! Downstream in the x-direction for the tracer 243 zfd(ji,jj,jk) = pt(ji,jj+1,jk,jn,Kbb) 244 END_3D 245 241 246 IF (nn_hls==1) CALL lbc_lnk( 'traadv_qck', zfc(:,:,:), 'T', 1.0_wp , zfd(:,:,:), 'T', 1.0_wp, ld4only= .TRUE. ) ! Lateral boundary conditions 242 247 … … 306 311 CHARACTER(len=3) , INTENT(in ) :: cdtype ! =TRA or TRC (tracer indicator) 307 312 INTEGER , INTENT(in ) :: kjpt ! number of tracers 308 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)313 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 309 314 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pW ! vertical velocity 310 315 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! active tracers and RHS of tracer equation … … 365 370 !---------------------------------------------------------------------- 366 371 ! 367 DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpkm1 )372 DO_3D( 1, 0, 1, 0, 1, jpkm1 ) 368 373 zc = puc(ji,jj,jk) ! Courant number 369 374 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 r14805 26 26 USE lbclnk ! ocean lateral boundary condition (or mpp link) 27 27 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 28 #if defined key_loop_fusion 29 USE traadv_ubs_lf ! UBS scheme (tra_adv_ubs routine - loop fusion version) 30 #endif 28 31 29 32 IMPLICIT NONE … … 92 95 INTEGER , INTENT(in ) :: kn_ubs_v ! number of tracers 93 96 REAL(wp) , INTENT(in ) :: p2dt ! tracer time-step 94 ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)97 ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct 95 98 REAL(wp), DIMENSION(jpi,jpj,jpk ), INTENT(in ) :: pU, pV, pW ! 3 ocean volume transport components 96 99 REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) :: pt ! tracers and RHS of tracer equation … … 103 106 !!---------------------------------------------------------------------- 104 107 ! 105 IF( ntile == 0 .OR. ntile == 1 ) THEN ! Do only on the first tile 108 #if defined key_loop_fusion 109 CALL tra_adv_ubs_lf ( kt, kit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs, kn_ubs_v ) 110 #else 111 IF( .NOT. l_istiled .OR. ntile == 1 ) THEN ! Do only on the first tile 106 112 IF( kt == kit000 ) THEN 107 113 IF(lwp) WRITE(numout,*) … … 260 266 END DO 261 267 ! 268 #endif 262 269 END SUBROUTINE tra_adv_ubs 263 270 -
NEMO/branches/2021/dev_r14273_HPC-02_Daley_Tiling/src/OCE/TRA/traatf_qco.F90
r14776 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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 r14805 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.