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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DIA/diahsb.F90

    r5120 r6808  
    4646   REAL(wp) ::   frc_wn_t, frc_wn_s    ! global forcing trends 
    4747   ! 
    48    REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf          , ssh_ini          ! 
     48   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf  
     49   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf_ini      , ssh_ini          ! 
    4950   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   ssh_hc_loc_ini, ssh_sc_loc_ini   ! 
    5051   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   hc_loc_ini, sc_loc_ini, e3t_ini  ! 
    5152 
    5253   !! * Substitutions 
    53 #  include "domzgr_substitute.h90" 
    5454#  include "vectopt_loop_substitute.h90" 
    5555   !!---------------------------------------------------------------------- 
     
    9393      ! 1 - Trends due to forcing ! 
    9494      ! ------------------------- ! 
    95       z_frc_trd_v = r1_rau0 * glob_sum( - ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) ) * surf(:,:) ) ! volume fluxes 
     95      z_frc_trd_v = r1_rau0 * glob_sum( - ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) * surf(:,:) ) ! volume fluxes 
    9696      z_frc_trd_t =           glob_sum( sbc_tsc(:,:,jp_tem) * surf(:,:) )                               ! heat fluxes 
    9797      z_frc_trd_s =           glob_sum( sbc_tsc(:,:,jp_sal) * surf(:,:) )                               ! salt fluxes 
     
    100100      IF( ln_rnf_sal)   z_frc_trd_s = z_frc_trd_s + glob_sum( rnf_tsc(:,:,jp_sal) * surf(:,:) ) 
    101101      ! Add ice shelf heat & salt input 
    102       IF( nn_isf .GE. 1 )  THEN 
    103           z_frc_trd_t = z_frc_trd_t & 
    104               &   + glob_sum( ( risf_tsc(:,:,jp_tem) - rdivisf * fwfisf(:,:) * (-1.9) * r1_rau0 ) * surf(:,:) ) 
    105           z_frc_trd_s = z_frc_trd_s + (1.0_wp - rdivisf) * glob_sum( risf_tsc(:,:,jp_sal) * surf(:,:) ) 
    106       ENDIF 
    107  
     102      IF( ln_isf    ) z_frc_trd_t = z_frc_trd_t + glob_sum( risf_tsc(:,:,jp_tem) * surf(:,:) ) 
    108103      ! Add penetrative solar radiation 
    109104      IF( ln_traqsr )   z_frc_trd_t = z_frc_trd_t + r1_rau0_rcp * glob_sum( qsr     (:,:) * surf(:,:) ) 
     
    111106      IF( ln_trabbc )   z_frc_trd_t = z_frc_trd_t +               glob_sum( qgh_trd0(:,:) * surf(:,:) ) 
    112107      ! 
    113       IF( .NOT. lk_vvl ) THEN 
    114          IF ( ln_isfcav ) THEN 
     108      IF( ln_linssh ) THEN 
     109         IF( ln_isfcav ) THEN 
    115110            DO ji=1,jpi 
    116111               DO jj=1,jpj 
    117112                  z2d0(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_tem) 
    118113                  z2d1(ji,jj) = surf(ji,jj) * wn(ji,jj,mikt(ji,jj)) * tsb(ji,jj,mikt(ji,jj),jp_sal) 
    119                ENDDO 
    120             ENDDO 
     114               END DO 
     115            END DO 
    121116         ELSE 
    122117            z2d0(:,:) = surf(:,:) * wn(:,:,1) * tsb(:,:,1,jp_tem) 
     
    131126      frc_s = frc_s + z_frc_trd_s * rdt 
    132127      !                                          ! Advection flux through fixed surface (z=0) 
    133       IF( .NOT. lk_vvl ) THEN 
     128      IF( ln_linssh ) THEN 
    134129         frc_wn_t = frc_wn_t + z_wn_trd_t * rdt 
    135130         frc_wn_s = frc_wn_s + z_wn_trd_s * rdt 
     
    139134      ! 2 -  Content variations ! 
    140135      ! ------------------------ ! 
     136      ! glob_sum_full is needed because you keep the full interior domain to compute the sum (iscpl) 
    141137      zdiff_v2 = 0._wp 
    142138      zdiff_hc = 0._wp 
     
    144140 
    145141      ! volume variation (calculated with ssh) 
    146       zdiff_v1 = glob_sum( surf(:,:) * ( sshn(:,:) - ssh_ini(:,:) ) ) 
     142      zdiff_v1 = glob_sum_full( surf(:,:) * sshn(:,:) - surf_ini(:,:) * ssh_ini(:,:) ) 
    147143 
    148144      ! heat & salt content variation (associated with ssh) 
    149       IF( .NOT. lk_vvl ) THEN 
    150          IF ( ln_isfcav ) THEN 
     145      IF( ln_linssh ) THEN 
     146         IF( ln_isfcav ) THEN 
    151147            DO ji = 1, jpi 
    152148               DO jj = 1, jpj 
     
    159155            z2d1(:,:) = surf(:,:) * ( tsn(:,:,1,jp_sal) * sshn(:,:) - ssh_sc_loc_ini(:,:) )  
    160156         END IF 
    161          z_ssh_hc = glob_sum( z2d0 )  
    162          z_ssh_sc = glob_sum( z2d1 )  
     157         z_ssh_hc = glob_sum_full( z2d0 )  
     158         z_ssh_sc = glob_sum_full( z2d1 )  
    163159      ENDIF 
    164160 
    165161      DO jk = 1, jpkm1 
    166162         ! volume variation (calculated with scale factors) 
    167          zdiff_v2 = zdiff_v2 + glob_sum( surf(:,:) * tmask(:,:,jk) & 
    168             &                           * ( fse3t_n(:,:,jk) - e3t_ini(:,:,jk) ) ) 
     163         zdiff_v2 = zdiff_v2 + glob_sum_full( surf(:,:) * tmask(:,:,jk)            & 
     164            &                           * e3t_n(:,:,jk) - surf_ini(:,:) * e3t_ini(:,:,jk) ) 
    169165         ! heat content variation 
    170          zdiff_hc = zdiff_hc + glob_sum(  surf(:,:) * tmask(:,:,jk) &  
    171             &                           * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_tem) - hc_loc_ini(:,:,jk) ) ) 
     166         zdiff_hc = zdiff_hc + glob_sum_full(  surf(:,:) * tmask(:,:,jk)                                  &  
     167            &                           * e3t_n(:,:,jk) * tsn(:,:,jk,jp_tem) - surf_ini(:,:) * hc_loc_ini(:,:,jk) )  
    172168         ! salt content variation 
    173          zdiff_sc = zdiff_sc + glob_sum(  surf(:,:) * tmask(:,:,jk)   & 
    174             &                           * ( fse3t_n(:,:,jk) * tsn(:,:,jk,jp_sal) - sc_loc_ini(:,:,jk) ) ) 
     169         zdiff_sc = zdiff_sc + glob_sum_full( surf    (:,:) * tmask(:,:,jk)                           & 
     170                                        * e3t_n(:,:,jk) * tsn(:,:,jk,jp_sal) - surf_ini(:,:) * sc_loc_ini(:,:,jk) ) 
    175171      ENDDO 
    176172 
    177173      ! Substract forcing from heat content, salt content and volume variations 
    178174      zdiff_v1 = zdiff_v1 - frc_v 
    179       IF( lk_vvl )   zdiff_v2 = zdiff_v2 - frc_v 
     175      IF( .NOT.ln_linssh )   zdiff_v2 = zdiff_v2 - frc_v 
    180176      zdiff_hc = zdiff_hc - frc_t 
    181177      zdiff_sc = zdiff_sc - frc_s 
    182       IF( .NOT. lk_vvl ) THEN 
     178      IF( ln_linssh ) THEN 
    183179         zdiff_hc1 = zdiff_hc + z_ssh_hc  
    184180         zdiff_sc1 = zdiff_sc + z_ssh_sc 
     
    192188      zvol_tot = 0._wp                    ! total ocean volume (calculated with scale factors) 
    193189      DO jk = 1, jpkm1 
    194          zvol_tot  = zvol_tot + glob_sum( surf(:,:) * tmask(:,:,jk) * fse3t_n(:,:,jk) ) 
     190         zvol_tot  = zvol_tot + glob_sum_full( surf(:,:) * tmask(:,:,jk) * e3t_n(:,:,jk) ) 
    195191      END DO 
    196192 
    197193!!gm to be added ? 
    198 !      IF( .NOT. lk_vvl ) THEN            ! fixed volume, add the ssh contribution 
     194!      IF( ln_linssh ) THEN            ! fixed volume, add the ssh contribution 
    199195!        zvol_tot = zvol_tot + glob_sum( surf(:,:) * sshn(:,:) ) 
    200196!      ENDIF 
    201197!!gm end 
    202198 
    203  
    204       IF( lk_vvl ) THEN 
     199      IF( ln_linssh ) THEN 
     200        CALL iom_put( 'bgtemper' , zdiff_hc1 / zvol_tot)              ! Heat content variation (C)  
     201        CALL iom_put( 'bgsaline' , zdiff_sc1 / zvol_tot)              ! Salt content variation (psu) 
     202        CALL iom_put( 'bgheatco' , zdiff_hc1 * 1.e-20 * rau0 * rcp )  ! Heat content variation (1.e20 J)  
     203        CALL iom_put( 'bgsaltco' , zdiff_sc1 * 1.e-9   )              ! Salt content variation (psu*km3) 
     204        CALL iom_put( 'bgvolssh' , zdiff_v1  * 1.e-9   )              ! volume ssh variation (km3)   
     205        CALL iom_put( 'bgfrcvol' , frc_v    * 1.e-9    )              ! vol - surface forcing (km3)  
     206        CALL iom_put( 'bgfrctem' , frc_t / zvol_tot    )              ! hc  - surface forcing (C)  
     207        CALL iom_put( 'bgfrcsal' , frc_s / zvol_tot    )              ! sc  - surface forcing (psu)  
     208        CALL iom_put( 'bgmistem' , zerr_hc1 / zvol_tot )              ! hc  - error due to free surface (C) 
     209        CALL iom_put( 'bgmissal' , zerr_sc1 / zvol_tot )              ! sc  - error due to free surface (psu) 
     210      ELSE 
    205211        CALL iom_put( 'bgtemper' , zdiff_hc / zvol_tot )              ! Temperature variation (C)  
    206212        CALL iom_put( 'bgsaline' , zdiff_sc / zvol_tot )              ! Salinity    variation (psu) 
     
    212218        CALL iom_put( 'bgfrctem' , frc_t / zvol_tot    )              ! hc  - surface forcing (C)  
    213219        CALL iom_put( 'bgfrcsal' , frc_s / zvol_tot    )              ! sc  - surface forcing (psu)  
    214       ELSE 
    215         CALL iom_put( 'bgtemper' , zdiff_hc1 / zvol_tot)              ! Heat content variation (C)  
    216         CALL iom_put( 'bgsaline' , zdiff_sc1 / zvol_tot)              ! Salt content variation (psu) 
    217         CALL iom_put( 'bgheatco' , zdiff_hc1 * 1.e-20 * rau0 * rcp )  ! Heat content variation (1.e20 J)  
    218         CALL iom_put( 'bgsaltco' , zdiff_sc1 * 1.e-9    )             ! Salt content variation (psu*km3) 
    219         CALL iom_put( 'bgvolssh' , zdiff_v1 * 1.e-9    )              ! volume ssh variation (km3)   
    220         CALL iom_put( 'bgfrcvol' , frc_v    * 1.e-9    )              ! vol - surface forcing (km3)  
    221         CALL iom_put( 'bgfrctem' , frc_t / zvol_tot    )              ! hc  - surface forcing (C)  
    222         CALL iom_put( 'bgfrcsal' , frc_s / zvol_tot    )              ! sc  - surface forcing (psu)  
    223         CALL iom_put( 'bgmistem' , zerr_hc1 / zvol_tot )              ! hc  - error due to free surface (C) 
    224         CALL iom_put( 'bgmissal' , zerr_sc1 / zvol_tot )              ! sc  - error due to free surface (psu) 
    225220      ENDIF 
    226221      ! 
    227222      IF( lrst_oce )   CALL dia_hsb_rst( kt, 'WRITE' ) 
    228  
     223      ! 
    229224      CALL wrk_dealloc( jpi,jpj,   z2d0, z2d1 ) 
    230  
     225      ! 
    231226      IF( nn_timing == 1 )   CALL timing_stop('dia_hsb') 
    232227      ! 
     
    259254           CALL iom_get( numror, 'frc_t', frc_t ) 
    260255           CALL iom_get( numror, 'frc_s', frc_s ) 
    261            IF( .NOT. lk_vvl ) THEN 
     256           IF( ln_linssh ) THEN 
    262257              CALL iom_get( numror, 'frc_wn_t', frc_wn_t ) 
    263258              CALL iom_get( numror, 'frc_wn_s', frc_wn_s ) 
    264259           ENDIF 
     260           CALL iom_get( numror, jpdom_autoglo, 'surf_ini', surf_ini ) ! ice sheet coupling 
    265261           CALL iom_get( numror, jpdom_autoglo, 'ssh_ini', ssh_ini ) 
    266262           CALL iom_get( numror, jpdom_autoglo, 'e3t_ini', e3t_ini ) 
    267263           CALL iom_get( numror, jpdom_autoglo, 'hc_loc_ini', hc_loc_ini ) 
    268264           CALL iom_get( numror, jpdom_autoglo, 'sc_loc_ini', sc_loc_ini ) 
    269            IF( .NOT. lk_vvl ) THEN 
     265           IF( ln_linssh ) THEN 
    270266              CALL iom_get( numror, jpdom_autoglo, 'ssh_hc_loc_ini', ssh_hc_loc_ini ) 
    271267              CALL iom_get( numror, jpdom_autoglo, 'ssh_sc_loc_ini', ssh_sc_loc_ini ) 
     
    275271          IF(lwp) WRITE(numout,*) ' dia_hsb at initial state ' 
    276272          IF(lwp) WRITE(numout,*) '~~~~~~~' 
    277           ssh_ini(:,:) = sshn(:,:)                                       ! initial ssh 
     273          surf_ini(:,:) = e1e2t(:,:) * tmask_i(:,:)         ! initial ocean surface 
     274          ssh_ini(:,:) = sshn(:,:)                          ! initial ssh 
    278275          DO jk = 1, jpk 
    279              e3t_ini   (:,:,jk) = fse3t_n(:,:,jk)                        ! initial vertical scale factors 
    280              hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * fse3t_n(:,:,jk)   ! initial heat content 
    281              sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * fse3t_n(:,:,jk)   ! initial salt content 
     276             ! if ice sheet/oceqn coupling, need to mask ini variables here (mask could change at the next NEMO instance). 
     277             e3t_ini   (:,:,jk) = e3t_n(:,:,jk)                      * tmask(:,:,jk)  ! initial vertical scale factors 
     278             hc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_tem) * e3t_n(:,:,jk) * tmask(:,:,jk)  ! initial heat content 
     279             sc_loc_ini(:,:,jk) = tsn(:,:,jk,jp_sal) * e3t_n(:,:,jk) * tmask(:,:,jk)  ! initial salt content 
    282280          END DO 
    283281          frc_v = 0._wp                                           ! volume       trend due to forcing 
    284282          frc_t = 0._wp                                           ! heat content   -    -   -    -    
    285283          frc_s = 0._wp                                           ! salt content   -    -   -    -         
    286           IF( .NOT. lk_vvl ) THEN 
     284          IF( ln_linssh ) THEN 
    287285             IF ( ln_isfcav ) THEN 
    288286                DO ji=1,jpi 
     
    310308        CALL iom_rstput( kt, nitrst, numrow, 'frc_t'   , frc_t     ) 
    311309        CALL iom_rstput( kt, nitrst, numrow, 'frc_s'   , frc_s     ) 
    312         IF( .NOT. lk_vvl ) THEN 
     310        IF( ln_linssh ) THEN 
    313311           CALL iom_rstput( kt, nitrst, numrow, 'frc_wn_t', frc_wn_t ) 
    314312           CALL iom_rstput( kt, nitrst, numrow, 'frc_wn_s', frc_wn_s ) 
    315313        ENDIF 
     314        CALL iom_rstput( kt, nitrst, numrow, 'surf_ini', surf_ini )      ! ice sheet coupling 
    316315        CALL iom_rstput( kt, nitrst, numrow, 'ssh_ini', ssh_ini ) 
    317316        CALL iom_rstput( kt, nitrst, numrow, 'e3t_ini', e3t_ini ) 
    318317        CALL iom_rstput( kt, nitrst, numrow, 'hc_loc_ini', hc_loc_ini ) 
    319318        CALL iom_rstput( kt, nitrst, numrow, 'sc_loc_ini', sc_loc_ini ) 
    320         IF( .NOT. lk_vvl ) THEN 
     319        IF( ln_linssh ) THEN 
    321320           CALL iom_rstput( kt, nitrst, numrow, 'ssh_hc_loc_ini', ssh_hc_loc_ini ) 
    322321           CALL iom_rstput( kt, nitrst, numrow, 'ssh_sc_loc_ini', ssh_sc_loc_ini ) 
     
    381380      ! 1 - Allocate memory ! 
    382381      ! ------------------- ! 
    383       ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), & 
    384          &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), STAT=ierror ) 
     382      ALLOCATE( hc_loc_ini(jpi,jpj,jpk), sc_loc_ini(jpi,jpj,jpk), surf_ini(jpi,jpj), & 
     383         &      e3t_ini(jpi,jpj,jpk), surf(jpi,jpj),  ssh_ini(jpi,jpj), STAT=ierror  ) 
    385384      IF( ierror > 0 ) THEN 
    386385         CALL ctl_stop( 'dia_hsb: unable to allocate hc_loc_ini' )   ;   RETURN 
    387386      ENDIF 
    388387 
    389       IF(.NOT. lk_vvl ) ALLOCATE( ssh_hc_loc_ini(jpi,jpj), ssh_sc_loc_ini(jpi,jpj),STAT=ierror ) 
     388      IF( ln_linssh )  ALLOCATE( ssh_hc_loc_ini(jpi,jpj), ssh_sc_loc_ini(jpi,jpj),STAT=ierror ) 
    390389      IF( ierror > 0 ) THEN 
    391390         CALL ctl_stop( 'dia_hsb: unable to allocate hc_loc_ini' )   ;   RETURN 
Note: See TracChangeset for help on using the changeset viewer.