diff --git a/src/OCE/DIA/diaar5.F90 b/src/OCE/DIA/diaar5.F90 index 4e9a4f45715b0425caa5b339e812067968a6d995..584783f9b402c44528cf46c6f3e59728890643ef 100644 --- a/src/OCE/DIA/diaar5.F90 +++ b/src/OCE/DIA/diaar5.F90 @@ -28,6 +28,10 @@ MODULE diaar5 IMPLICIT NONE PRIVATE + INTERFACE dia_ar5_hst + MODULE PROCEDURE dia_ar5_hst_2d, dia_ar5_hst_3d + END INTERFACE + PUBLIC dia_ar5 ! routine called in step.F90 module PUBLIC dia_ar5_init PUBLIC dia_ar5_alloc ! routine called in nemogcm.F90 module @@ -367,49 +371,102 @@ CONTAINS END SUBROUTINE dia_ar5 - SUBROUTINE dia_ar5_hst( ktra, cptr, puflx, pvflx ) + SUBROUTINE dia_ar5_hst_2d( ktra, cptr, puflx, pvflx, ldfin ) + !! + INTEGER, INTENT(in) :: ktra ! tracer index + CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf' + REAL(wp), DIMENSION(:,:), INTENT(in) :: puflx, pvflx ! 2D u/v-flux of advection/diffusion + LOGICAL, INTENT(in) :: ldfin ! last call or not? + !! + CALL dia_ar5_hst_t( ktra, cptr, puflx2d=puflx, pvflx2d=pvflx, ktuvflx=lbnd_ij(puflx), ldfin=ldfin ) + END SUBROUTINE dia_ar5_hst_2d + + + SUBROUTINE dia_ar5_hst_3d( ktra, cptr, puflx, pvflx ) + !! + INTEGER, INTENT(in) :: ktra ! tracer index + CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf' + REAL(wp), DIMENSION(:,:,:), INTENT(in) :: puflx, pvflx ! 3D u/v-flux of advection/diffusion + !! + CALL dia_ar5_hst_t( ktra, cptr, puflx3d=puflx, pvflx3d=pvflx, ktuvflx=lbnd_ij(puflx), ldfin=.TRUE. ) + END SUBROUTINE dia_ar5_hst_3d + + + SUBROUTINE dia_ar5_hst_t( ktra, cptr, puflx2d, pvflx2d, puflx3d, pvflx3d, ktuvflx, ldfin ) !!---------------------------------------------------------------------- !! *** ROUTINE dia_ar5_hst *** !!---------------------------------------------------------------------- !! Wrapper for heat transport calculations !! Called from all advection and/or diffusion routines !!---------------------------------------------------------------------- - INTEGER , INTENT(in ) :: ktra ! tracer index - CHARACTER(len=3) , INTENT(in) :: cptr ! transport type 'adv'/'ldf' - REAL(wp), DIMENSION(T2D(nn_hls),jpk) , INTENT(in) :: puflx ! u-flux of advection/diffusion - REAL(wp), DIMENSION(T2D(nn_hls),jpk) , INTENT(in) :: pvflx ! v-flux of advection/diffusion + INTEGER, DIMENSION(2), INTENT(in) :: ktuvflx + INTEGER, INTENT(in) :: ktra ! tracer index + CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf' + LOGICAL, INTENT(in) :: ldfin ! are diagnostics ready for XIOS? + REAL(wp), DIMENSION(AB2D(ktuvflx)), INTENT(in), OPTIONAL :: puflx2d, pvflx2d ! 2D u/v-flux of advection/diffusion + REAL(wp), DIMENSION(AB2D(ktuvflx),JPK), INTENT(in), OPTIONAL :: puflx3d, pvflx3d ! 3D " " ! - INTEGER :: ji, jj, jk - REAL(wp), DIMENSION(T2D(0)) :: z2d + INTEGER :: ji, jj, jk + REAL(wp), DIMENSION(:,:), ALLOCATABLE, SAVE :: zuflx, zvflx !!---------------------------------------------------------------------- - z2d(:,:) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) - z2d(ji,jj) = z2d(ji,jj) + puflx(ji,jj,jk) - END_3D - - IF( cptr == 'adv' ) THEN - IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * z2d(:,:) ) ! advective heat transport in i-direction - IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0 * z2d(:,:) ) ! advective salt transport in i-direction - ELSE IF( cptr == 'ldf' ) THEN - IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in i-direction - IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0 * z2d(:,:) ) ! diffusive salt transport in i-direction + ! Flux in i-direction + IF( .NOT. ALLOCATED(zuflx) ) THEN + ALLOCATE( zuflx(T2D(0)) ) + zuflx(:,:) = 0._wp ENDIF - ! - z2d(:,:) = 0._wp - DO_3D( 0, 0, 0, 0, 1, jpkm1 ) - z2d(ji,jj) = z2d(ji,jj) + pvflx(ji,jj,jk) - END_3D - - IF( cptr == 'adv' ) THEN - IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * z2d(:,:) ) ! advective heat transport in j-direction - IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0 * z2d(:,:) ) ! advective salt transport in j-direction - ELSE IF( cptr == 'ldf' ) THEN - IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * z2d(:,:) ) ! diffusive heat transport in j-direction - IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0 * z2d(:,:) ) ! diffusive salt transport in j-direction + + IF( PRESENT(puflx2d) ) THEN + DO_2D( 0, 0, 0, 0 ) + zuflx(ji,jj) = zuflx(ji,jj) + puflx2d(ji,jj) + END_2D + ELSE IF( PRESENT(puflx3d) ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1 ) + zuflx(ji,jj) = zuflx(ji,jj) + puflx3d(ji,jj,jk) + END_3D + ENDIF + + IF( ldfin ) THEN + IF( cptr == 'adv' ) THEN + IF( ktra == jp_tem ) CALL iom_put( 'uadv_heattr' , rho0_rcp * zuflx(:,:) ) ! advective heat transport + IF( ktra == jp_sal ) CALL iom_put( 'uadv_salttr' , rho0 * zuflx(:,:) ) ! advective salt transport + ELSE IF( cptr == 'ldf' ) THEN + IF( ktra == jp_tem ) CALL iom_put( 'udiff_heattr' , rho0_rcp * zuflx(:,:) ) ! diffusive heat transport + IF( ktra == jp_sal ) CALL iom_put( 'udiff_salttr' , rho0 * zuflx(:,:) ) ! diffusive salt transport + ENDIF + + DEALLOCATE( zuflx ) + ENDIF + + ! Flux in j-direction + IF( .NOT. ALLOCATED(zvflx) ) THEN + ALLOCATE( zvflx(T2D(0)) ) + zvflx(:,:) = 0._wp + ENDIF + + IF( PRESENT(pvflx2d) ) THEN + DO_2D( 0, 0, 0, 0 ) + zvflx(ji,jj) = zvflx(ji,jj) + pvflx2d(ji,jj) + END_2D + ELSE IF( PRESENT(pvflx3d) ) THEN + DO_3D( 0, 0, 0, 0, 1, jpkm1 ) + zvflx(ji,jj) = zvflx(ji,jj) + pvflx3d(ji,jj,jk) + END_3D + ENDIF + + IF( ldfin ) THEN + IF( cptr == 'adv' ) THEN + IF( ktra == jp_tem ) CALL iom_put( 'vadv_heattr' , rho0_rcp * zvflx(:,:) ) ! advective heat transport + IF( ktra == jp_sal ) CALL iom_put( 'vadv_salttr' , rho0 * zvflx(:,:) ) ! advective salt transport + ELSE IF( cptr == 'ldf' ) THEN + IF( ktra == jp_tem ) CALL iom_put( 'vdiff_heattr' , rho0_rcp * zvflx(:,:) ) ! diffusive heat transport + IF( ktra == jp_sal ) CALL iom_put( 'vdiff_salttr' , rho0 * zvflx(:,:) ) ! diffusive salt transport + ENDIF + + DEALLOCATE( zvflx ) ENDIF - END SUBROUTINE dia_ar5_hst + END SUBROUTINE dia_ar5_hst_t SUBROUTINE dia_ar5_init diff --git a/src/OCE/DIA/diaptr.F90 b/src/OCE/DIA/diaptr.F90 index d8991121c15300db1a00c37bec7f2552ea1f8925..7b062ed269fa14d368be867079e7fc9e5570c524 100644 --- a/src/OCE/DIA/diaptr.F90 +++ b/src/OCE/DIA/diaptr.F90 @@ -33,19 +33,24 @@ MODULE diaptr PRIVATE INTERFACE ptr_sum - MODULE PROCEDURE ptr_sum_3d, ptr_sum_2d + MODULE PROCEDURE ptr_sum_2d, ptr_sum_3d + END INTERFACE + INTERFACE ptr_mpp_sum + MODULE PROCEDURE ptr_mpp_sum_2d, ptr_mpp_sum_3d, ptr_mpp_sum_4d END INTERFACE - INTERFACE ptr_sj - MODULE PROCEDURE ptr_sj_3d, ptr_sj_2d + MODULE PROCEDURE ptr_sj_2d, ptr_sj_3d + END INTERFACE + INTERFACE dia_ptr_hst + MODULE PROCEDURE dia_ptr_hst_2d, dia_ptr_hst_3d END INTERFACE PUBLIC dia_ptr ! call in step module PUBLIC dia_ptr_init ! call in stprk3 module PUBLIC dia_ptr_hst ! called from tra_ldf/tra_adv routines - REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hstr_adv, hstr_ldf, hstr_eiv !: Heat/Salt TRansports(adv, diff, Bolus.) - REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hstr_ove, hstr_btr, hstr_vtr !: heat Salt TRansports(overturn, baro, merional) + REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hstr_adv, hstr_ldf, hstr_eiv !: Heat/salt transports(adv, diff, bolus.) + REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: hstr_vtr !: Heat/salt transports(meridional) REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) :: pvtr_int, pzon_int !: Other zonal integrals LOGICAL, PUBLIC :: l_diaptr !: tracers trend flag @@ -123,12 +128,14 @@ CONTAINS REAL(wp), DIMENSION(:,:,: ), ALLOCATABLE :: zt_jk, zs_jk ! i-mean T and S, j-Stream-Function REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE :: z4d1, z4d2 - REAL(wp), DIMENSION(:,:,: ), ALLOCATABLE :: z3dtr + REAL(wp), DIMENSION(:,:,: ), ALLOCATABLE :: z3dtr, zstr !!---------------------------------------------------------------------- ! ALLOCATE( z3dtr(A2D(0),nbasin) ) IF( PRESENT( pvtr ) ) THEN + IF( lk_mpp ) CALL ptr_mpp_sum( pvtr_int(:,:,:,:) ) ! Call MPI sum + IF( iom_use( 'zomsf' ) ) THEN ! effective MSF ALLOCATE( z4d1(A2D(0),jpk,nbasin) ) ! @@ -147,7 +154,7 @@ CONTAINS ENDIF IF( iom_use( 'sopstove' ) .OR. iom_use( 'sophtove' ) ) THEN ALLOCATE( sjk( A1Dj(0),jpk,nbasin), r1_sjk(A1Dj(0),jpk,nbasin), v_msf(A1Dj(0),jpk,nbasin), & - & zt_jk(A1Dj(0),jpk,nbasin), zs_jk( A1Dj(0),jpk,nbasin) ) + & zt_jk(A1Dj(0),jpk,nbasin), zs_jk( A1Dj(0),jpk,nbasin), zstr(A1Dj(0),nbasin,jpts) ) ! DO jn = 1, nbasin sjk(:,:,jn) = pvtr_int(:,:,jn,jp_msk) @@ -161,31 +168,31 @@ CONTAINS v_msf(jj,jk,jn) = pvtr_int(jj,jk,jn,jp_vtr) END DO END DO - hstr_ove(:,jn,jp_tem) = SUM( v_msf(:,:,jn)*zt_jk(:,:,jn), 2 ) - hstr_ove(:,jn,jp_sal) = SUM( v_msf(:,:,jn)*zs_jk(:,:,jn), 2 ) + zstr(:,jn,jp_tem) = SUM( v_msf(:,:,jn)*zt_jk(:,:,jn), 2 ) + zstr(:,jn,jp_sal) = SUM( v_msf(:,:,jn)*zs_jk(:,:,jn), 2 ) ! ENDDO DO jn = 1, nbasin - z3dtr(Nis0,:,jn) = hstr_ove(:,jn,jp_tem) * rc_pwatt ! (conversion in PW) + z3dtr(Nis0,:,jn) = zstr(:,jn,jp_tem) * rc_pwatt ! (conversion in PW) DO ji = Nis0+1, Nie0 z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn) ENDDO ENDDO CALL iom_put( 'sophtove', z3dtr ) DO jn = 1, nbasin - z3dtr(Nis0,:,jn) = hstr_ove(:,jn,jp_sal) * rc_ggram ! (conversion in Gg) + z3dtr(Nis0,:,jn) = zstr(:,jn,jp_sal) * rc_ggram ! (conversion in Gg) DO ji = Nis0+1, Nie0 z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn) ENDDO ENDDO CALL iom_put( 'sopstove', z3dtr ) ! - DEALLOCATE( sjk, r1_sjk, v_msf, zt_jk, zs_jk ) + DEALLOCATE( sjk, r1_sjk, v_msf, zt_jk, zs_jk, zstr ) ENDIF IF( iom_use( 'sopstbtr' ) .OR. iom_use( 'sophtbtr' ) ) THEN ! Calculate barotropic heat and salt transport here - ALLOCATE( sjk(A1Dj(0),1,nbasin), r1_sjk(A1Dj(0),1,nbasin) ) + ALLOCATE( sjk(A1Dj(0),1,nbasin), r1_sjk(A1Dj(0),1,nbasin), zstr(A1Dj(0),nbasin,jpts) ) ! DO jn = 1, nbasin sjk(:,1,jn) = SUM( pvtr_int(:,:,jn,jp_msk), 2 ) @@ -195,32 +202,38 @@ CONTAINS zvsum(:) = SUM( pvtr_int(:,:,jn,jp_vtr), 2 ) ztsum(:) = SUM( pvtr_int(:,:,jn,jp_tem), 2 ) zssum(:) = SUM( pvtr_int(:,:,jn,jp_sal), 2 ) - hstr_btr(:,jn,jp_tem) = zvsum(:) * ztsum(:) * r1_sjk(:,1,jn) - hstr_btr(:,jn,jp_sal) = zvsum(:) * zssum(:) * r1_sjk(:,1,jn) + zstr(:,jn,jp_tem) = zvsum(:) * ztsum(:) * r1_sjk(:,1,jn) + zstr(:,jn,jp_sal) = zvsum(:) * zssum(:) * r1_sjk(:,1,jn) ! ENDDO DO jn = 1, nbasin - z3dtr(Nis0,:,jn) = hstr_btr(:,jn,jp_tem) * rc_pwatt ! (conversion in PW) + z3dtr(Nis0,:,jn) = zstr(:,jn,jp_tem) * rc_pwatt ! (conversion in PW) DO ji = Nis0+1, Nie0 z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn) ENDDO ENDDO CALL iom_put( 'sophtbtr', z3dtr ) DO jn = 1, nbasin - z3dtr(Nis0,:,jn) = hstr_btr(:,jn,jp_sal) * rc_ggram ! (conversion in Gg) + z3dtr(Nis0,:,jn) = zstr(:,jn,jp_sal) * rc_ggram ! (conversion in Gg) DO ji = Nis0+1, Nie0 z3dtr(ji,:,jn) = z3dtr(Nis0,:,jn) ENDDO ENDDO CALL iom_put( 'sopstbtr', z3dtr ) ! - DEALLOCATE( sjk, r1_sjk ) + DEALLOCATE( sjk, r1_sjk, zstr ) ENDIF ! - hstr_ove(:,:,:) = 0._wp ! Zero before next timestep - hstr_btr(:,:,:) = 0._wp pvtr_int(:,:,:,:) = 0._wp ELSE + IF( lk_mpp ) THEN ! Call MPI sum + CALL ptr_mpp_sum( hstr_adv(:,:,:) ) + CALL ptr_mpp_sum( hstr_ldf(:,:,:) ) + CALL ptr_mpp_sum( hstr_eiv(:,:,:) ) + CALL ptr_mpp_sum( hstr_vtr(:,:,:) ) + CALL ptr_mpp_sum( pzon_int(:,:,:,:) ) + ENDIF + IF( iom_use( 'zotem' ) .OR. iom_use( 'zosal' ) .OR. iom_use( 'zosrf' ) ) THEN ! i-mean i-k-surface ALLOCATE( z4d1(A2D(0),jpk,nbasin), z4d2(A2D(0),jpk,nbasin) ) ! @@ -527,8 +540,6 @@ CONTAINS hstr_adv(:,:,:) = 0._wp hstr_ldf(:,:,:) = 0._wp hstr_eiv(:,:,:) = 0._wp - hstr_ove(:,:,:) = 0._wp - hstr_btr(:,:,:) = 0._wp ! hstr_vtr(:,:,:) = 0._wp ! pvtr_int(:,:,:,:) = 0._wp pzon_int(:,:,:,:) = 0._wp @@ -540,33 +551,51 @@ CONTAINS END SUBROUTINE dia_ptr_init - SUBROUTINE dia_ptr_hst( ktra, cptr, pvflx ) + SUBROUTINE dia_ptr_hst_2d( ktra, cptr, pvflx ) + !! + INTEGER, INTENT(in) :: ktra ! tracer index + CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf'/'eiv' + REAL(wp), DIMENSION(:,:), INTENT(in) :: pvflx ! 2D input array of advection/diffusion + !! + CALL dia_ptr_hst_t( ktra, cptr, pvflx2d=pvflx(:,:), ktvflx=lbnd_ij(pvflx) ) + END SUBROUTINE dia_ptr_hst_2d + + + SUBROUTINE dia_ptr_hst_3d( ktra, cptr, pvflx ) !! INTEGER, INTENT(in) :: ktra ! tracer index CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf'/'eiv' REAL(wp), DIMENSION(:,:,:), INTENT(in) :: pvflx ! 3D input array of advection/diffusion !! - CALL dia_ptr_hst_t( ktra, cptr, pvflx(:,:,:), lbnd_ij(pvflx) ) - END SUBROUTINE dia_ptr_hst + CALL dia_ptr_hst_t( ktra, cptr, pvflx3d=pvflx(:,:,:), ktvflx=lbnd_ij(pvflx) ) + END SUBROUTINE dia_ptr_hst_3d - SUBROUTINE dia_ptr_hst_t( ktra, cptr, pvflx, ktvflx ) + SUBROUTINE dia_ptr_hst_t( ktra, cptr, pvflx2d, pvflx3d, ktvflx ) !!---------------------------------------------------------------------- !! *** ROUTINE dia_ptr_hst *** !!---------------------------------------------------------------------- !! Wrapper for heat and salt transport calculations to calculate them for each basin !! Called from all advection and/or diffusion routines !!---------------------------------------------------------------------- - INTEGER, DIMENSION(2), INTENT(in) :: ktvflx - INTEGER, INTENT(in) :: ktra ! tracer index - CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf'/'eiv' - REAL(wp), DIMENSION(AB2D(ktvflx),JPK), INTENT(in) :: pvflx ! 3D input array of advection/diffusion - REAL(wp), DIMENSION(T1Dj(0),nbasin) :: zsj ! - INTEGER :: jn ! - - DO jn = 1, nbasin - zsj(:,jn) = ptr_sj( pvflx(:,:,:), btmsk(:,:,jn) ) - ENDDO + INTEGER, DIMENSION(2), INTENT(in) :: ktvflx + INTEGER, INTENT(in) :: ktra ! tracer index + CHARACTER(len=3), INTENT(in) :: cptr ! transport type 'adv'/'ldf'/'eiv' + REAL(wp), DIMENSION(AB2D(ktvflx)), INTENT(in), OPTIONAL :: pvflx2d ! 2D input array of advection/diffusion + REAL(wp), DIMENSION(AB2D(ktvflx),JPK), INTENT(in), OPTIONAL :: pvflx3d ! 3D input array of advection/diffusion + !! + REAL(wp), DIMENSION(T1Dj(0),nbasin) :: zsj ! + INTEGER :: jn ! + !!---------------------------------------------------------------------- + IF( PRESENT(pvflx2d) ) THEN + DO jn = 1, nbasin + zsj(:,jn) = ptr_sj( pvflx2d(:,:), btmsk(:,:,jn) ) + END DO + ELSE IF( PRESENT(pvflx3d) ) THEN + DO jn = 1, nbasin + zsj(:,jn) = ptr_sj( pvflx3d(:,:,:), btmsk(:,:,jn) ) + END DO + ENDIF ! IF( cptr == 'adv' ) THEN IF( ktra == jp_tem ) CALL ptr_sum( hstr_adv(:,:,jp_tem), zsj(:,:) ) @@ -592,36 +621,18 @@ CONTAINS !! ** Purpose : Add two 2D arrays with (j,nbasin) dimensions !! !! ** Method : - phstr = phstr + pva - !! - Call mpp_sum if the final tile !! !! ** Action : phstr !!---------------------------------------------------------------------- REAL(wp), DIMENSION(A1Dj(0),nbasin), INTENT(inout) :: phstr ! REAL(wp), DIMENSION(T1Dj(0),nbasin), INTENT(in ) :: pva ! INTEGER :: jj, jn -#if ! defined key_mpi_off - INTEGER, DIMENSION(1) :: ish1d - INTEGER, DIMENSION(2) :: ish2d - REAL(wp), DIMENSION(:), ALLOCATABLE :: zwork -#endif - + !!---------------------------------------------------------------------- DO jn = 1, nbasin DO_1Dj( 0, 0 ) phstr(jj,jn) = phstr(jj,jn) + pva(jj,jn) END_1D END DO - -#if ! defined key_mpi_off - IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the last tile - ALLOCATE( zwork(Nj_0*nbasin) ) - ish1d(1) = Nj_0*nbasin - ish2d(1) = Nj_0 ; ish2d(2) = nbasin - zwork(:) = RESHAPE( phstr(:,:), ish1d ) - CALL mpp_sum( 'diaptr', zwork, ish1d(1), ncomm_znl ) - phstr(:,:) = RESHAPE( zwork, ish2d ) - DEALLOCATE( zwork ) - ENDIF -#endif END SUBROUTINE ptr_sum_2d @@ -632,19 +643,13 @@ CONTAINS !! ** Purpose : Add two 3D arrays with (j,k,nbasin) dimensions !! !! ** Method : - phstr = phstr + pva - !! - Call mpp_sum if the final tile !! !! ** Action : phstr !!---------------------------------------------------------------------- REAL(wp), DIMENSION(A1Dj(0),jpk,nbasin), INTENT(inout) :: phstr ! REAL(wp), DIMENSION(T1Dj(0),jpk,nbasin), INTENT(in ) :: pva ! INTEGER :: jj, jk, jn -#if ! defined key_mpi_off - INTEGER, DIMENSION(1) :: ish1d - INTEGER, DIMENSION(3) :: ish3d - REAL(wp), DIMENSION(:), ALLOCATABLE :: zwork -#endif - + !!---------------------------------------------------------------------- DO jn = 1, nbasin DO jk = 1, jpk DO_1Dj( 0, 0 ) @@ -652,19 +657,70 @@ CONTAINS END_1D END DO END DO + END SUBROUTINE ptr_sum_3d + + SUBROUTINE ptr_mpp_sum_2d( phstr ) + !!---------------------------------------------------------------------- + !! *** ROUTINE ptr_mpp_sum_2d *** + !!---------------------------------------------------------------------- + !! ** Purpose : Call mpp_sum for 2D flux array + !!---------------------------------------------------------------------- + REAL(wp), DIMENSION(:,:), INTENT(inout) :: phstr ! + INTEGER :: isize + REAL(wp), DIMENSION(:), ALLOCATABLE :: zwork + !!---------------------------------------------------------------------- #if ! defined key_mpi_off - IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN ! Do only for the last tile - ALLOCATE( zwork(Nj_0*jpk*nbasin) ) - ish1d(1) = Nj_0*jpk*nbasin - ish3d(1) = Nj_0 ; ish3d(2) = jpk ; ish3d(3) = nbasin - zwork(:) = RESHAPE( phstr(:,:,:), ish1d ) - CALL mpp_sum( 'diaptr', zwork, ish1d(1), ncomm_znl ) - phstr(:,:,:) = RESHAPE( zwork, ish3d ) - DEALLOCATE( zwork ) - ENDIF + isize = SIZE(phstr) + ALLOCATE( zwork(isize) ) + zwork(:) = RESHAPE( phstr(:,:), (/ isize /) ) + CALL mpp_sum( 'diaptr', zwork, isize, ncomm_znl ) + phstr(:,:) = RESHAPE( zwork, SHAPE(phstr) ) + DEALLOCATE( zwork ) #endif - END SUBROUTINE ptr_sum_3d + END SUBROUTINE ptr_mpp_sum_2d + + + SUBROUTINE ptr_mpp_sum_3d( phstr ) + !!---------------------------------------------------------------------- + !! *** ROUTINE ptr_mpp_sum_3d *** + !!---------------------------------------------------------------------- + !! ** Purpose : Call mpp_sum for 3D flux array + !!---------------------------------------------------------------------- + REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: phstr ! + INTEGER :: isize + REAL(wp), DIMENSION(:), ALLOCATABLE :: zwork + !!---------------------------------------------------------------------- +#if ! defined key_mpi_off + isize = SIZE(phstr) + ALLOCATE( zwork(isize) ) + zwork(:) = RESHAPE( phstr(:,:,:), (/ isize /) ) + CALL mpp_sum( 'diaptr', zwork, isize, ncomm_znl ) + phstr(:,:,:) = RESHAPE( zwork, SHAPE(phstr) ) + DEALLOCATE( zwork ) +#endif + END SUBROUTINE ptr_mpp_sum_3d + + + SUBROUTINE ptr_mpp_sum_4d( phstr ) + !!---------------------------------------------------------------------- + !! *** ROUTINE ptr_mpp_sum_4d *** + !!---------------------------------------------------------------------- + !! ** Purpose : Call mpp_sum for 4D flux array + !!---------------------------------------------------------------------- + REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) :: phstr ! + INTEGER :: isize + REAL(wp), DIMENSION(:), ALLOCATABLE :: zwork + !!---------------------------------------------------------------------- +#if ! defined key_mpi_off + isize = SIZE(phstr) + ALLOCATE( zwork(isize) ) + zwork(:) = RESHAPE( phstr(:,:,:,:), (/ isize /) ) + CALL mpp_sum( 'diaptr', zwork, isize, ncomm_znl ) + phstr(:,:,:,:) = RESHAPE( zwork, SHAPE(phstr) ) + DEALLOCATE( zwork ) +#endif + END SUBROUTINE ptr_mpp_sum_4d FUNCTION dia_ptr_alloc() @@ -681,7 +737,6 @@ CONTAINS IF( .NOT. ALLOCATED( btmsk ) ) THEN ALLOCATE( btmsk(A2D(nn_hls),nbasin) , btmsk34(A2D(nn_hls),nbasin) , & & hstr_adv(A1Dj(0),nbasin,jpts), hstr_eiv(A1Dj(0),nbasin,jpts), & - & hstr_ove(A1Dj(0),nbasin,jpts), hstr_btr(A1Dj(0),nbasin,jpts), & & hstr_ldf(A1Dj(0),nbasin,jpts), hstr_vtr(A1Dj(0),nbasin,jpts), STAT=ierr(1) ) ! ALLOCATE( pvtr_int(A1Dj(0),jpk,nbasin,jpts+2), & diff --git a/src/OCE/TRA/traadv_cen.F90 b/src/OCE/TRA/traadv_cen.F90 index e55956f238555c0064a98f900bbaaf70af40f822..3262e2226ee000b42dd4f89f5c78fb05d07e50b1 100644 --- a/src/OCE/TRA/traadv_cen.F90 +++ b/src/OCE/TRA/traadv_cen.F90 @@ -110,7 +110,7 @@ CONTAINS !!st limitation : does not take into acccount iceshelf specificity !! in case of linssh CASE( 2 ) !* 2nd order centered - DO jk = 1, jpkm1 + DO jk = 1, jpkm1 ! DO_2D( 1, 0, 1, 0 ) ! Horizontal fluxes at layer jk zft_u(ji,jj) = 0.5_wp * pU(ji,jj,jk) * ( pt(ji,jj,jk,jn,Kmm) + pt(ji+1,jj ,jk,jn,Kmm) ) @@ -122,6 +122,10 @@ CONTAINS & + ( zft_v(ji,jj) - zft_v(ji ,jj-1) ) ) * r1_e1e2t(ji,jj) & & / e3t(ji,jj,jk,Kmm) END_2D + ! ! "Poleward" heat and salt transports + IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zft_v(:,:) ) + ! ! heat and salt transport + IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zft_u(:,:), zft_v(:,:), ldfin=(jk == jpkm1) ) END DO ! CASE( 4 ) !* 4th order centered @@ -147,6 +151,10 @@ CONTAINS & + ( zft_v(ji,jj) - zft_v(ji ,jj-1) ) ) * r1_e1e2t(ji,jj) & & / e3t(ji,jj,jk,Kmm) END_2D + ! ! "Poleward" heat and salt transports + IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zft_v(:,:) ) + ! ! heat and salt transport + IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zft_u(:,:), zft_v(:,:), ldfin=(jk == jpkm1) ) END DO ! CASE DEFAULT @@ -216,10 +224,6 @@ CONTAINS !! CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) ) !! CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) ) !! ENDIF -!! ! ! "Poleward" heat and salt transports -!! IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) -!! ! ! heat and salt transport -!! IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) ) ! END DO ! diff --git a/src/OCE/TRA/traadv_mus.F90 b/src/OCE/TRA/traadv_mus.F90 index f49d6fae47c2a58e31c040c75558f97d95481236..29455647d3e69fe206fe7a3cfc561676980066e8 100644 --- a/src/OCE/TRA/traadv_mus.F90 +++ b/src/OCE/TRA/traadv_mus.F90 @@ -174,8 +174,12 @@ CONTAINS & + ( zwy(ji,jj) - zwy(ji ,jj-1) ) ) & & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) END_2D + ! ! "Poleward" heat and salt transports + IF( l_ptr ) CALL dia_ptr_hst( jn, 'adv', zwy(:,:) ) + ! ! heat transport + IF( l_hst ) CALL dia_ar5_hst( jn, 'adv', zwx(:,:), zwy(:,:), ldfin=(jk == jpkm1) ) END DO -!!gm + !!st to be done with the whole rewritting of trd +!!gm + !!st to be done with the whole rewritting of trd !! trd routine arguments MUST be changed adding jk and zwx, zwy in 2D !! !! ! ! trend diagnostics @@ -183,10 +187,6 @@ CONTAINS !! CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jk, jptra_xad, zwx(:,:), pU, pt(:,:,:,jn,Kbb) ) !! CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jk, jptra_yad, zwy(:,:), pV, pt(:,:,:,jn,Kbb) ) !! END IF -!! ! ! "Poleward" heat and salt transports -!! IF( l_ptr ) CALL dia_ptr_hst( jn, jk, 'adv', zwy(:,:) ) -!! ! ! heat transport -!! IF( l_hst ) CALL dia_ar5_hst( jn, jk, 'adv', zwx(:,:), zwy(:,:) ) ! ! !* Vertical advective fluxes ! diff --git a/src/OCE/TRA/traldf_iso.F90 b/src/OCE/TRA/traldf_iso.F90 index 20e8f67dc5009dc4feec88bd78505610648ea64e..80d5665d74162009e2ffee81c5a43675830c25c0 100644 --- a/src/OCE/TRA/traldf_iso.F90 +++ b/src/OCE/TRA/traldf_iso.F90 @@ -53,7 +53,7 @@ CONTAINS SUBROUTINE traldf_iso_lap( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst ) !!---------------------------------------------------------------------- - !! *** ROUTINE traldf_iso_iso *** + !! *** ROUTINE traldf_iso_lap *** !! !! —— nn_hls =2 or more —— !! @@ -105,6 +105,8 @@ CONTAINS INTEGER :: itra ! number of tracers INTEGER :: ik, ikp1, iis ! swap indices ! + LOGICAL :: ll_ptr, ll_hst + ! REAL(wp) :: zmsku, zahu_w ! local scalars REAL(wp) :: zmskv, zahv_w ! - - REAL(wp) :: zfw_kp1 ! - - @@ -116,12 +118,10 @@ CONTAINS REAL(wp), DIMENSION(T2D(1),0:1) :: zdkt ! INNER + 1 domain at level jk and jk+1 REAL(wp), DIMENSION(T2D(1) ) :: zfu , zfv ! INNER + 1 domain REAL(wp), DIMENSION(T2D(0) ) :: zfw ! INNER domain - ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics -!!!gm end - REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics !!---------------------------------------------------------------------- + ll_ptr = .FALSE. ; ll_hst = .FALSE. + IF( PRESENT(ld_ptr) ) ll_ptr = ld_ptr + IF( PRESENT(ld_hst) ) ll_hst = ld_hst ! !!gm OPTIMIZATION : This part does not depends on tracer ===>>> put in a routine !! possibility of moving it in tra_ldf routine (shared between TRA and TRC at least in RK3 case). @@ -134,28 +134,10 @@ CONTAINS ! CALL traldf_iso_a33( Kmm, ah_wslp2, akz ) ! calculate a33 element (ah_wslp2 and akz) ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) ) -! ENDIF - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN - IF( ld_ptr .OR. ld_hst ) THEN - ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) ) - zdia_i(:,:,jpk) = 0._wp ; zdia_j(:,:,jpk) = 0._wp - ENDIF - ENDIF -!!gm end - ! itra = SIZE( pt, dim = 4 ) ! number of tracers ! DO jn = 1, itra !== tracer loop ==! ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! zdia_i(:,:) = 0._wp ; zdia_j(:,:) = 0._wp -! ENDIF -!!gm end - DO jk = 1, jpkm1 != ij slab =! ! ! !* iso-neutral laplacian applied on pt over the INNER domain @@ -168,29 +150,14 @@ CONTAINS # undef iso_lap # undef INN # undef pt_in -!!gm ld_ptr,ld_hst: -! IF( ld_ptr .OR. ld_hst ) THEN ! vertically cumulated fluxes (minus sign by convention in the output) -! zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0)) -! zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0)) -! ENDIF - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN ! store fluxes for diagnostics (minus sign by convention in the output) - IF( ld_ptr .OR. ld_hst ) THEN - zdia_i(:,:,jk) = - zfu(T2D(0)) - zdia_j(:,:,jk) = - zfv(T2D(0)) - ENDIF - ENDIF -!!gm end ! + ! + ! != "Poleward" & 2D-integrated diffusive heat and salt transports =! + ! Note sign is reversed to give down-gradient diffusive transports + IF( ll_ptr ) CALL dia_ptr_hst( jn, 'ldf', -zfv(:,:) ) + IF( ll_hst ) CALL dia_ar5_hst( jn, 'ldf', -zfu(:,:), -zfv(:,:), ldfin=(jk == jpkm1) ) END DO != end ij slab =! ! - ! != "Poleward" diffusive heat or salt transports =! - IF( PRESENT(ld_ptr) ) THEN - IF( ld_ptr) CALL dia_ptr_hst( jn, 'ldf' , zdia_j ) - ENDIF - IF( PRESENT(ld_hst) ) THEN - IF( ld_hst) CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j ) - ENDIF - ! END DO !== end tracer loop ==! ! END SUBROUTINE traldf_iso_lap @@ -198,7 +165,7 @@ CONTAINS SUBROUTINE traldf_iso_blp( kt, Kbb, Kmm, pt, Krhs, ld_ptr, ld_hst ) !!---------------------------------------------------------------------- - !! *** ROUTINE tra_ldf_iso_blp *** + !! *** ROUTINE traldf_iso_blp *** !! !! —— nn_hls =2 or more —— !! @@ -212,6 +179,8 @@ CONTAINS INTEGER :: itra ! number of tracers INTEGER :: ik, ikp1, iis ! swap indices ! + LOGICAL :: ll_ptr, ll_hst + ! REAL(wp) :: zmsku, zahu_w ! local scalars REAL(wp) :: zmskv, zahv_w ! - - REAL(wp) :: zfw_kp1 ! - - @@ -224,36 +193,16 @@ CONTAINS REAL(wp), DIMENSION(T2D(2) ) :: zfu , zfv ! INNER + 2 domain REAL(wp), DIMENSION(T2D(1) ) :: zfw ! INNER + 1 domain REAL(wp), DIMENSION(T2D(1),jpkm1) :: zlap ! INNER + 1 doamin (3D laplacian at t-point) - ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics -!!!gm end - REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics !!---------------------------------------------------------------------- + ll_ptr = .FALSE. ; ll_hst = .FALSE. + IF( PRESENT(ld_ptr) ) ll_ptr = ld_ptr + IF( PRESENT(ld_hst) ) ll_hst = ld_hst ! CALL traldf_iso_a33( Kmm, ah_wslp2, akz ) ! calculate a33 element (ah_wslp2 and akz) ! itra = SIZE( pt, dim = 4 ) ! number of tracers ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) ) -! ENDIF - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN - IF( ld_ptr .OR. ld_hst ) THEN - ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) ) - zdia_i(:,:,jpk) = 0._wp ; zdia_j(:,:,jpk) = 0._wp - ENDIF - ENDIF -!!gm end - ! DO jn = 1, itra !== tracer loop ==! - ! ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! zdia_i(:,:) = 0._wp ; zdia_j(:,:) = 0._wp -! ENDIF -!!gm end ! DO jk = 1, jpkm1 != ij slab =! ! @@ -286,29 +235,12 @@ CONTAINS # undef INN # undef pt_in ! -!!gm ld_ptr,ld_hst: -! IF( ld_ptr .OR. ld_hst ) THEN ! vertically cumulated fluxes (minus sign by convention in the output) -! zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0)) -! zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0)) -! ENDIF - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN - IF( ld_ptr .OR. ld_hst ) THEN ! store fluxes for diagnostics (minus sign by convention in the output) - zdia_i(:,:,jk) = - zfu(T2D(0)) - zdia_j(:,:,jk) = - zfv(T2D(0)) - ENDIF - ENDIF -!!gm end - ! + ! != "Poleward" & 2D-integrated diffusive heat and salt transports =! + ! Note sign is reversed to give down-gradient diffusive transports + IF( ll_ptr ) CALL dia_ptr_hst( jn, 'ldf', -zfv(:,:) ) + IF( ll_hst ) CALL dia_ar5_hst( jn, 'ldf', -zfu(:,:), -zfv(:,:), ldfin=(jk == jpkm1) ) END DO != end ij slab =! ! - ! != "Poleward" diffusive heat or salt transports =! - IF( PRESENT(ld_ptr) ) THEN - IF( ld_ptr ) CALL dia_ptr_hst( jn, 'ldf' , zdia_j ) - ENDIF - IF( PRESENT(ld_hst) ) THEN - IF( ld_hst ) CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j ) - ENDIF - ! END DO !== end tracer loop ==! ! END SUBROUTINE traldf_iso_blp @@ -360,12 +292,6 @@ CONTAINS & + ( ahtu(ji-1,jj,jk-1) + ahtu(ji ,jj,jk) ) ) * zmsku zahv_w = ( ( ahtv(ji,jj ,jk-1) + ahtv(ji,jj-1,jk) ) & & + ( ahtv(ji,jj-1,jk-1) + ahtv(ji,jj ,jk) ) ) * zmskv -!!st need to do something for dia... -!!st ! ! "Poleward" diffusive heat or salt transports (T-S case only) -!!st ! note sign is reversed to give down-gradient diffusive transports ) -!!st IF( l_ptr ) CALL dia_ptr_hst( jn, 'ldf', -zftv(A2D(0),:) ) -!!st ! ! Diffusive heat transports -!!st IF( l_hst ) CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) ) ! pah_wslp2(ji,jj,jk) = zahu_w * wslpi(ji,jj,jk) * wslpi(ji,jj,jk) & & + zahv_w * wslpj(ji,jj,jk) * wslpj(ji,jj,jk) diff --git a/src/OCE/TRA/traldf_lev.F90 b/src/OCE/TRA/traldf_lev.F90 index 3bbfa0190d9671137bcad17ed5288012fe501b39..089207b0704b9d3dd25289ad9e90d345029abb4b 100644 --- a/src/OCE/TRA/traldf_lev.F90 +++ b/src/OCE/TRA/traldf_lev.F90 @@ -67,26 +67,14 @@ CONTAINS ! INTEGER :: ji, jj, jk, jn ! dummy loop indices INTEGER :: itra ! number of tracers - REAL(wp) :: zaheeu, zaheev ! local scalar + REAL(wp) :: zaheeu, zaheev ! local scalar + LOGICAL :: ll_ptr, ll_hst + ! REAL(wp), DIMENSION(T2D(1)) :: zfu, zfv -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics -!!!gm end - REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zdia_i , zdia_j !!---------------------------------------------------------------------- - ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! and to be duplicated in traldf_lev_blp (2nd pass only) -! IF( ld_ptr .OR. ld_hst ) THEN -! ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) ) -! ENDIF - !!gm end - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN - IF( ld_ptr .OR. ld_hst ) THEN - ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) ) - zdia_i(:,:,jpk) = 0._wp ; zdia_j(:,:,jpk) = 0._wp - ENDIF - ENDIF + ll_ptr = .FALSE. ; ll_hst = .FALSE. + IF( PRESENT(ld_ptr) ) ll_ptr = ld_ptr + IF( PRESENT(ld_hst) ) ll_hst = ld_hst ! itra = SIZE( pt, dim=4 ) ! number of tracers ! @@ -110,29 +98,12 @@ CONTAINS & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) END_2D ! -!!gm ld_ptr,ld_hst: -! IF( ld_ptr .OR. ld_hst ) THEN ! vertically cumulated fluxes (minus sign by convention in the output) -! zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0)) -! zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0)) -! ENDIF - !!gm end - IF( PRESENT(ld_ptr) .OR. PRESENT(ld_hst) ) THEN - IF( ld_ptr .OR. ld_hst ) THEN ! store fluxes for diagnostics (minus sign by convention in the output) - zdia_i(:,:,jk) = - zfu(T2D(0)) - zdia_j(:,:,jk) = - zfv(T2D(0)) - ENDIF - ENDIF - ! + ! != "Poleward" & 2D-integrated diffusive heat and salt transports =! + ! Note sign is reversed to give down-gradient diffusive transports + IF( ll_ptr ) CALL dia_ptr_hst( jn, 'ldf', -zfv(:,:) ) + IF( ll_hst ) CALL dia_ar5_hst( jn, 'ldf', -zfu(:,:), -zfv(:,:), ldfin=(jk == jpkm1) ) END DO ! end horizontal slab ! - ! !== "Poleward" diffusive heat or salt transports ==! - IF( PRESENT(ld_ptr) ) THEN - IF( ld_ptr ) CALL dia_ptr_hst( jn, 'ldf' , zdia_j ) - ENDIF - IF( PRESENT(ld_hst) ) THEN - IF( ld_hst ) CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j ) - ENDIF - ! ! ! ================== END DO ! end of tracer loop ! ! ================== @@ -163,24 +134,15 @@ CONTAINS ! INTEGER :: ji, jj, jk, jn ! dummy loop indices INTEGER :: itra ! number of tracers + LOGICAL :: ll_ptr, ll_hst REAL(wp), DIMENSION(T2D(2)) :: zaheeu, zfu REAL(wp), DIMENSION(T2D(2)) :: zaheev, zfv REAL(wp), DIMENSION(T2D(1)) :: zlap ! laplacian at t-point -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! REAL(wp), DIMENSION(:,:), ALLOCATABLE :: zdia_i , zdia_j ! used for some diagnostics -!!!gm end - REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zdia_i , zdia_j !!--------------------------------------------------------------------- ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! ALLOCATE( zdia_i(A2D(0)) , zdia_j(A2D(0)) ) -! ENDIF - IF( ld_ptr .OR. ld_hst ) THEN - ALLOCATE( zdia_i(T2D(0),jpk) , zdia_j(T2D(0),jpk) ) - zdia_i(:,:,jpk) = 0._wp ; zdia_j(:,:,jpk) = 0._wp - ENDIF -!!gm end + ll_ptr = .FALSE. ; ll_hst = .FALSE. + IF( PRESENT(ld_ptr) ) ll_ptr = ld_ptr + IF( PRESENT(ld_hst) ) ll_hst = ld_hst ! itra = SIZE( pt, dim=4 ) ! number of tracers ! @@ -188,12 +150,6 @@ CONTAINS DO jn = 1, itra ! tracer loop ! ! ! =========== ! ! -!!gm ld_ptr,ld_hst: require changes in the dia_ptr/dia_ar5 <<<=== comment for the moment -! IF( ld_ptr .OR. ld_hst ) THEN -! zdia_i(:,:) = 0._wp ; zdia_j(:,:) = 0._wp -! ENDIF -!!gm end - ! DO jk = 1, jpkm1 ! horizontal slab ! DO_2D( 2, 1, 2, 1 ) @@ -224,24 +180,12 @@ CONTAINS & * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm) END_2D ! -!!gm ld_ptr,ld_hst: -! IF( ld_ptr .OR. ld_hst ) THEN ! vertically cumulated fluxes (minus sign by convention in the output) -! zdia_i(:,:) = zdia_i(:,:) - zfu(A2D(0)) -! zdia_j(:,:) = zdia_j(:,:) - zfv(A2D(0)) -! ENDIF -!!gm end - IF( ld_ptr .OR. ld_hst ) THEN ! vertically cumulated fluxes (minus sign by convention in the output) - zdia_i(:,:,jk) = - zfu(T2D(0)) - zdia_j(:,:,jk) = - zfv(T2D(0)) - ENDIF - ! + ! != "Poleward" & 2D-integrated diffusive heat and salt transports =! + ! Note sign is reversed to give down-gradient diffusive transports + IF( ll_ptr ) CALL dia_ptr_hst( jn, 'ldf', -zfv(:,:) ) + IF( ll_hst ) CALL dia_ar5_hst( jn, 'ldf', -zfu(:,:), -zfv(:,:), ldfin=(jk == jpkm1) ) END DO ! end horizontal slab ! - ! !== "Poleward" diffusive heat or salt transports ==! - ! !== "Poleward" diffusive heat or salt transports ==! - IF( ld_ptr ) CALL dia_ptr_hst( jn, 'ldf' , zdia_j ) - IF( ld_hst ) CALL dia_ar5_hst( jn, 'ldf', zdia_i, zdia_j ) - ! ! ! ================== END DO ! end of tracer loop ! ! ==================