New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 15048 for NEMO/trunk/src/OCE/DIA – NEMO

Ignore:
Timestamp:
2021-06-23T18:02:14+02:00 (3 years ago)
Author:
clem
Message:

reduce drastically the number of global communications when using diagnostic outputs. New functions are created: glob_sum_vec and glob_sum_full_vec, which gave a vector as an output. This vector is composed of different summed arrays (such as temperature, salinity etc). Global diagnostics are identical as before. See examples in icedia and diahsb.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/DIA/diahsb.F90

    r15004 r15048  
    8383      REAL(wp)   ::   z_wn_trd_t , z_wn_trd_s     !    -     - 
    8484      REAL(wp)   ::   z_ssh_hc , z_ssh_sc         !    -     - 
    85       REAL(wp), DIMENSION(jpi,jpj)       ::   z2d0, z2d1   ! 2D workspace 
    86       REAL(wp), DIMENSION(jpi,jpj,jpkm1) ::   zwrk         ! 3D workspace 
     85      REAL(wp), DIMENSION(jpi,jpj,13)      ::   ztmp 
     86      REAL(wp), DIMENSION(jpi,jpj,jpkm1,4) ::   ztmpk 
     87      REAL(wp), DIMENSION(17)              ::   zbg           
    8788      !!--------------------------------------------------------------------------- 
    8889      IF( ln_timing )   CALL timing_start('dia_hsb') 
    8990      ! 
     91      ztmp (:,:,:)   = 0._wp ! should be better coded 
     92      ztmpk(:,:,:,:) = 0._wp ! should be better coded 
     93      ! 
    9094      ts(:,:,:,1,Kmm) = ts(:,:,:,1,Kmm) * tmask(:,:,:) ; ts(:,:,:,1,Kbb) = ts(:,:,:,1,Kbb) * tmask(:,:,:) ; 
    9195      ts(:,:,:,2,Kmm) = ts(:,:,:,2,Kmm) * tmask(:,:,:) ; ts(:,:,:,2,Kbb) = ts(:,:,:,2,Kbb) * tmask(:,:,:) ; 
     96      ! 
    9297      ! ------------------------- ! 
    9398      ! 1 - Trends due to forcing ! 
    9499      ! ------------------------- ! 
    95       z_frc_trd_v = r1_rho0 * glob_sum( 'diahsb', - ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) * surf(:,:) )   ! volume fluxes 
    96       z_frc_trd_t =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) )                       ! heat fluxes 
    97       z_frc_trd_s =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) )                       ! salt fluxes 
    98       !                    !  Add runoff    heat & salt input 
    99       IF( ln_rnf    )   z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', rnf_tsc(:,:,jp_tem) * surf(:,:) ) 
    100       IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + glob_sum( 'diahsb', rnf_tsc(:,:,jp_sal) * surf(:,:) ) 
    101       !                    ! Add ice shelf heat & salt input 
    102       IF( ln_isf    )   z_frc_trd_t = z_frc_trd_t & 
    103          &                          + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 
    104       !                    ! Add penetrative solar radiation 
    105       IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rho0_rcp * glob_sum( 'diahsb', qsr     (:,:) * surf(:,:) ) 
    106       !                    ! Add geothermal heat flux 
    107       IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t +               glob_sum( 'diahsb', qgh_trd0(:,:) * surf(:,:) ) 
    108       ! 
    109       IF( ln_linssh ) THEN 
     100      ! prepare trends 
     101      ztmp(:,:,1)  = - r1_rho0 * ( emp(:,:) - rnf(:,:) - fwfisf_cav(:,:) - fwfisf_par(:,:) ) * surf(:,:)    ! volume 
     102      ztmp(:,:,2)  =   sbc_tsc(:,:,jp_tem) * surf(:,:)                                                      ! heat 
     103      ztmp(:,:,3)  =   sbc_tsc(:,:,jp_sal) * surf(:,:)                                                      ! salt 
     104      IF( ln_rnf     )    ztmp(:,:,4) =   rnf_tsc(:,:,jp_tem) * surf(:,:)                                   ! runoff temp 
     105      IF( ln_rnf_sal )    ztmp(:,:,5) =   rnf_tsc(:,:,jp_sal) * surf(:,:)                                   ! runoff salt 
     106      IF( ln_isf     )    ztmp(:,:,6) = ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ! isf temp 
     107      IF( ln_traqsr  )    ztmp(:,:,7) =   r1_rho0_rcp * qsr(:,:) * surf(:,:)                                ! penetrative solar radiation 
     108      IF( ln_trabbc  )    ztmp(:,:,8) =   qgh_trd0(:,:) * surf(:,:)                                         ! geothermal heat 
     109      ! 
     110      IF( ln_linssh ) THEN   ! Advection flux through fixed surface (z=0) 
    110111         IF( ln_isfcav ) THEN 
    111112            DO ji=1,jpi 
    112113               DO jj=1,jpj 
    113                   z2d0(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 
    114                   z2d1(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb) 
     114                  ztmp(ji,jj,9 ) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 
     115                  ztmp(ji,jj,10) = - surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_sal,Kbb) 
    115116               END DO 
    116117            END DO 
    117118         ELSE 
    118             z2d0(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 
    119             z2d1(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb) 
     119            ztmp(:,:,9 ) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 
     120            ztmp(:,:,10) = - surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_sal,Kbb) 
    120121         END IF 
    121          z_wn_trd_t = - glob_sum( 'diahsb', z2d0 ) 
    122          z_wn_trd_s = - glob_sum( 'diahsb', z2d1 ) 
    123       ENDIF 
    124  
     122      ENDIF 
     123       
     124      ! global sum 
     125      zbg(1:10) = glob_sum_vec( 'dia_hsb', ztmp(:,:,1:10) ) 
     126 
     127      ! adding up 
     128      z_frc_trd_v = zbg(1)  ! volume fluxes 
     129      z_frc_trd_t = zbg(2)  ! heat fluxes 
     130      z_frc_trd_s = zbg(3)  ! salt fluxes 
     131      IF( ln_rnf    )   z_frc_trd_t = z_frc_trd_t + zbg(4) ! runoff heat 
     132      IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + zbg(5) ! runoff salt 
     133      IF( ln_isf    )   z_frc_trd_t = z_frc_trd_t + zbg(6) ! isf heat 
     134      IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + zbg(7) ! penetrative solar flux 
     135      IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t + zbg(8) ! geothermal heat 
     136      ! 
    125137      frc_v = frc_v + z_frc_trd_v * rn_Dt 
    126138      frc_t = frc_t + z_frc_trd_t * rn_Dt 
     
    128140      !                                          ! Advection flux through fixed surface (z=0) 
    129141      IF( ln_linssh ) THEN 
     142         z_wn_trd_t = zbg(9) 
     143         z_wn_trd_s = zbg(10) 
     144         ! 
    130145         frc_wn_t = frc_wn_t + z_wn_trd_t * rn_Dt 
    131146         frc_wn_s = frc_wn_s + z_wn_trd_s * rn_Dt 
    132147      ENDIF 
    133148 
    134       ! ------------------------ ! 
    135       ! 2 -  Content variations ! 
    136       ! ------------------------ ! 
     149      ! --------------------------------- ! 
     150      ! 2 -  Content variations with ssh ! 
     151      ! --------------------------------- ! 
    137152      ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 
    138  
     153      ! 
    139154      !                    ! volume variation (calculated with ssh) 
    140       zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) ) 
     155      ztmp(:,:,11) = surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) 
    141156 
    142157      !                    ! heat & salt content variation (associated with ssh) 
     
    145160            DO ji = 1, jpi 
    146161               DO jj = 1, jpj 
    147                   z2d0(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) ) 
    148                   z2d1(ji,jj) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) ) 
     162                  ztmp(ji,jj,12) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_tem,Kmm) * ssh(ji,jj,Kmm) - ssh_hc_loc_ini(ji,jj) ) 
     163                  ztmp(ji,jj,13) = surf(ji,jj) * ( ts(ji,jj,mikt(ji,jj),jp_sal,Kmm) * ssh(ji,jj,Kmm) - ssh_sc_loc_ini(ji,jj) ) 
    149164               END DO 
    150165            END DO 
    151166         ELSE                          ! no under ice-shelf seas 
    152             z2d0(:,:) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) ) 
    153             z2d1(:,:) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) ) 
     167            ztmp(:,:,12) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) ) 
     168            ztmp(:,:,13) = surf(:,:) * ( ts(:,:,1,jp_sal,Kmm) * ssh(:,:,Kmm) - ssh_sc_loc_ini(:,:) ) 
    154169         END IF 
    155          z_ssh_hc = glob_sum_full( 'diahsb', z2d0 ) 
    156          z_ssh_sc = glob_sum_full( 'diahsb', z2d1 ) 
    157       ENDIF 
    158       ! 
    159       DO jk = 1, jpkm1           ! volume variation (calculated with scale factors) 
    160          zwrk(:,:,jk) =   surf    (:,:) * e3t    (:,:,jk,Kmm)*tmask    (:,:,jk)   & 
    161             &           - surf_ini(:,:) * e3t_ini(:,:,jk    )*tmask_ini(:,:,jk) 
     170      ENDIF 
     171 
     172      ! global sum 
     173      zbg(11:13) = glob_sum_full_vec( 'dia_hsb', ztmp(:,:,11:13) ) 
     174       
     175      zdiff_v1 = zbg(11) 
     176      !                    ! heat & salt content variation (associated with ssh) 
     177      IF( ln_linssh ) THEN       ! linear free surface case 
     178         z_ssh_hc = zbg(12) 
     179         z_ssh_sc = zbg(13) 
     180      ENDIF 
     181      ! 
     182      ! --------------------------------- ! 
     183      ! 3 -  Content variations with e3t  ! 
     184      ! --------------------------------- ! 
     185      ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 
     186      ! 
     187      DO jk = 1, jpkm1           ! volume 
     188         ztmpk(:,:,jk,1) =   surf    (:,:) * e3t    (:,:,jk,Kmm)*tmask    (:,:,jk)   & 
     189            &              - surf_ini(:,:) * e3t_ini(:,:,jk    )*tmask_ini(:,:,jk) 
    162190      END DO 
    163       zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) )     ! glob_sum_full needed as tmask and tmask_ini could be different 
    164       DO jk = 1, jpkm1           ! heat content variation 
    165          zwrk(:,:,jk) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm)   & 
    166             &           - surf_ini(:,:) *         hc_loc_ini(:,:,jk) ) 
     191      DO jk = 1, jpkm1           ! heat 
     192         ztmpk(:,:,jk,2) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm)   & 
     193            &              - surf_ini(:,:) *         hc_loc_ini(:,:,jk) ) 
    167194      END DO 
    168       zdiff_hc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
    169       DO jk = 1, jpkm1           ! salt content variation 
    170          zwrk(:,:,jk) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm)   & 
    171             &           - surf_ini(:,:) *         sc_loc_ini(:,:,jk) ) 
     195      DO jk = 1, jpkm1           ! salt 
     196         ztmpk(:,:,jk,3) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm)   & 
     197            &              - surf_ini(:,:) *         sc_loc_ini(:,:,jk) ) 
    172198      END DO 
    173       zdiff_sc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
     199      DO jk = 1, jpkm1           ! total ocean volume 
     200         ztmpk(:,:,jk,4) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
     201      END DO 
     202       
     203      ! global sum 
     204      zbg(14:17) = glob_sum_full_vec( 'dia_hsb', ztmpk(:,:,:,1:4) ) 
     205       
     206      zdiff_v2 = zbg(14)     ! glob_sum_full needed as tmask and tmask_ini could be different 
     207      zdiff_hc = zbg(15) 
     208      zdiff_sc = zbg(16) 
     209      zvol_tot = zbg(17) 
    174210 
    175211      ! ------------------------ ! 
    176       ! 3 -  Drifts              ! 
     212      ! 4 -  Drifts              ! 
    177213      ! ------------------------ ! 
    178214      zdiff_v1 = zdiff_v1 - frc_v 
     
    186222         zerr_sc1  = z_ssh_sc - frc_wn_s 
    187223      ENDIF 
    188  
    189       ! ----------------------- ! 
    190       ! 4 - Diagnostics writing ! 
    191       ! ----------------------- ! 
    192       DO jk = 1, jpkm1           ! total ocean volume (calculated with scale factors) 
    193          zwrk(:,:,jk) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    194       END DO 
    195       zvol_tot = glob_sum( 'diahsb', zwrk(:,:,:) ) 
    196224 
    197225!!gm to be added ? 
Note: See TracChangeset for help on using the changeset viewer.