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 15574 for NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DIA/diahsb.F90 – NEMO

Ignore:
Timestamp:
2021-12-03T20:32:50+01:00 (3 years ago)
Author:
techene
Message:

#2605 #2715 trunk merged into dev_r14318_RK3_stage1

Location:
NEMO/branches/2021/dev_r14318_RK3_stage1
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1

    • Property svn:externals
      •  

        old new  
        99 
        1010# SETTE 
        11 ^/utils/CI/sette@14244        sette 
         11^/utils/CI/sette@HEAD        sette 
         12 
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DIA/diahsb.F90

    r14784 r15574  
    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 #if defined key_RK3 
    97 !!st 
    98       z_frc_trd_t =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) )                       ! heat fluxes 
    99       z_frc_trd_s =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) )                       ! salt fluxes 
    100 !!st      CALL ctl_stop( 'dia_hsb: not yet instrumented for RK3' ) 
    101 #else 
    102       z_frc_trd_t =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_tem) * surf(:,:) )                       ! heat fluxes 
    103       z_frc_trd_s =           glob_sum( 'diahsb', sbc_tsc(:,:,jp_sal) * surf(:,:) )                       ! salt fluxes 
    104 #endif 
    105       !                    !  Add runoff    heat & salt input 
    106       IF( ln_rnf    )   z_frc_trd_t = z_frc_trd_t + glob_sum( 'diahsb', rnf_tsc(:,:,jp_tem) * surf(:,:) ) 
    107       IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + glob_sum( 'diahsb', rnf_tsc(:,:,jp_sal) * surf(:,:) ) 
    108       !                    ! Add ice shelf heat & salt input 
    109       IF( ln_isf    )   z_frc_trd_t = z_frc_trd_t & 
    110          &                          + glob_sum( 'diahsb', ( risf_cav_tsc(:,:,jp_tem) + risf_par_tsc(:,:,jp_tem) ) * surf(:,:) ) 
    111       !                    ! Add penetrative solar radiation 
    112       IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rho0_rcp * glob_sum( 'diahsb', qsr     (:,:) * surf(:,:) ) 
    113       !                    ! Add geothermal heat flux 
    114       IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t +               glob_sum( 'diahsb', qgh_trd0(:,:) * surf(:,:) ) 
    115       ! 
    116       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) 
    117111         IF( ln_isfcav ) THEN 
    118112            DO ji=1,jpi 
    119113               DO jj=1,jpj 
    120                   z2d0(ji,jj) = surf(ji,jj) * ww(ji,jj,mikt(ji,jj)) * ts(ji,jj,mikt(ji,jj),jp_tem,Kbb) 
    121                   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) 
    122116               END DO 
    123117            END DO 
    124118         ELSE 
    125             z2d0(:,:) = surf(:,:) * ww(:,:,1) * ts(:,:,1,jp_tem,Kbb) 
    126             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) 
    127121         END IF 
    128          z_wn_trd_t = - glob_sum( 'diahsb', z2d0 ) 
    129          z_wn_trd_s = - glob_sum( 'diahsb', z2d1 ) 
    130       ENDIF 
    131  
     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      ! 
    132137      frc_v = frc_v + z_frc_trd_v * rn_Dt 
    133138      frc_t = frc_t + z_frc_trd_t * rn_Dt 
     
    135140      !                                          ! Advection flux through fixed surface (z=0) 
    136141      IF( ln_linssh ) THEN 
     142         z_wn_trd_t = zbg(9) 
     143         z_wn_trd_s = zbg(10) 
     144         ! 
    137145         frc_wn_t = frc_wn_t + z_wn_trd_t * rn_Dt 
    138146         frc_wn_s = frc_wn_s + z_wn_trd_s * rn_Dt 
    139147      ENDIF 
    140148 
    141       ! ------------------------ ! 
    142       ! 2 -  Content variations ! 
    143       ! ------------------------ ! 
     149      ! --------------------------------- ! 
     150      ! 2 -  Content variations with ssh ! 
     151      ! --------------------------------- ! 
    144152      ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 
    145  
     153      ! 
    146154      !                    ! volume variation (calculated with ssh) 
    147       zdiff_v1 = glob_sum_full( 'diahsb', surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) ) 
     155      ztmp(:,:,11) = surf(:,:)*ssh(:,:,Kmm) - surf_ini(:,:)*ssh_ini(:,:) 
    148156 
    149157      !                    ! heat & salt content variation (associated with ssh) 
     
    152160            DO ji = 1, jpi 
    153161               DO jj = 1, jpj 
    154                   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) ) 
    155                   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) ) 
    156164               END DO 
    157165            END DO 
    158166         ELSE                          ! no under ice-shelf seas 
    159             z2d0(:,:) = surf(:,:) * ( ts(:,:,1,jp_tem,Kmm) * ssh(:,:,Kmm) - ssh_hc_loc_ini(:,:) ) 
    160             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(:,:) ) 
    161169         END IF 
    162          z_ssh_hc = glob_sum_full( 'diahsb', z2d0 ) 
    163          z_ssh_sc = glob_sum_full( 'diahsb', z2d1 ) 
    164       ENDIF 
    165       ! 
    166       DO jk = 1, jpkm1           ! volume variation (calculated with scale factors) 
    167          zwrk(:,:,jk) =   surf    (:,:) * e3t    (:,:,jk,Kmm)*tmask    (:,:,jk)   & 
    168             &           - 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) 
    169190      END DO 
    170       zdiff_v2 = glob_sum_full( 'diahsb', zwrk(:,:,:) )     ! glob_sum_full needed as tmask and tmask_ini could be different 
    171       DO jk = 1, jpkm1           ! heat content variation 
    172          zwrk(:,:,jk) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_tem,Kmm)   & 
    173             &           - 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) ) 
    174194      END DO 
    175       zdiff_hc = glob_sum_full( 'diahsb', zwrk(:,:,:) ) 
    176       DO jk = 1, jpkm1           ! salt content variation 
    177          zwrk(:,:,jk) = ( surf    (:,:) * e3t(:,:,jk,Kmm)*ts(:,:,jk,jp_sal,Kmm)   & 
    178             &           - 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) ) 
    179198      END DO 
    180       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) 
    181210 
    182211      ! ------------------------ ! 
    183       ! 3 -  Drifts              ! 
     212      ! 4 -  Drifts              ! 
    184213      ! ------------------------ ! 
    185214      zdiff_v1 = zdiff_v1 - frc_v 
     
    193222         zerr_sc1  = z_ssh_sc - frc_wn_s 
    194223      ENDIF 
    195  
    196       ! ----------------------- ! 
    197       ! 4 - Diagnostics writing ! 
    198       ! ----------------------- ! 
    199       DO jk = 1, jpkm1           ! total ocean volume (calculated with scale factors) 
    200          zwrk(:,:,jk) = surf(:,:) * e3t(:,:,jk,Kmm) * tmask(:,:,jk) 
    201       END DO 
    202       zvol_tot = glob_sum( 'diahsb', zwrk(:,:,:) ) 
    203224 
    204225!!gm to be added ? 
Note: See TracChangeset for help on using the changeset viewer.