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 6871 – NEMO

Changeset 6871


Ignore:
Timestamp:
2016-08-17T11:13:03+02:00 (8 years ago)
Author:
timgraham
Message:

Modifcations based on Dorotea's implementation of heat/salt transport due to overturning circulation

Location:
branches/UKMO/v3_6_extra_CMIP6_diagnostics/NEMOGCM
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/v3_6_extra_CMIP6_diagnostics/NEMOGCM/CONFIG/SHARED/field_def.xml

    r6674 r6871  
    660660        <field id="sophtldf_ind"      long_name="Diffusive Heat Transport: Indian"             unit="PW"       grid_ref="gznl_T_2D" /> 
    661661        <field id="sophtldf_ipc"      long_name="Diffusive Heat Transport: Pacific+Indian"     unit="PW"       grid_ref="gznl_T_2D" /> 
    662         <field id="sophteiv"          long_name="Heat Transport from mesoscale eddy advection"                     unit="PW"       grid_ref="gznl_T_2D" /> 
     662        <field id="sophtove"          long_name="Overturning Heat Transport"                     unit="PW"       grid_ref="gznl_T_2D" /> 
     663        <field id="sophtove_atl"      long_name="Overturning Heat Transport: Atlantic"           unit="PW"       grid_ref="gznl_T_2D" /> 
     664        <field id="sophtove_pac"      long_name="Overturning Heat Transport: Pacific"            unit="PW"       grid_ref="gznl_T_2D" /> 
     665        <field id="sophtove_ind"      long_name="Overturning Heat Transport: Indian"             unit="PW"       grid_ref="gznl_T_2D" /> 
     666        <field id="sophtove_ipc"      long_name="Overturning Heat Transport: Pacific+Indian"     unit="PW"       grid_ref="gznl_T_2D" /> 
     667        <field id="sophtbtr"          long_name="Barotropic Heat Transport"                     unit="PW"       grid_ref="gznl_T_2D" /> 
     668        <field id="sophtbtr_atl"      long_name="Barotropic Heat Transport: Atlantic"           unit="PW"       grid_ref="gznl_T_2D" /> 
     669        <field id="sophtbtr_pac"      long_name="Barotropic Heat Transport: Pacific"            unit="PW"       grid_ref="gznl_T_2D" /> 
     670        <field id="sophtbtr_ind"      long_name="Barotropic Heat Transport: Indian"             unit="PW"       grid_ref="gznl_T_2D" /> 
     671        <field id="sophtbtr_ipc"      long_name="Barotropic Heat Transport: Pacific+Indian"     unit="PW"       grid_ref="gznl_T_2D" /> 
     672        <field id="sophteiv"          long_name="Heat Transport from mesoscale eddy oveection"                     unit="PW"       grid_ref="gznl_T_2D" /> 
    663673        <field id="sophteiv_atl"      long_name="Heat Transport from mesoscale eddy advection: Atlantic"           unit="PW"       grid_ref="gznl_T_2D" /> 
    664674        <field id="sophteiv_pac"      long_name="Heat Transport from mesoscale eddy advection: Pacific"            unit="PW"       grid_ref="gznl_T_2D" /> 
     
    670680        <field id="sopstadv_ind"      long_name="Advective Salt Transport: Indian"             unit="Giga g/s" grid_ref="gznl_T_2D" /> 
    671681        <field id="sopstadv_ipc"      long_name="Advective Salt Transport: Pacific+Indian"     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     682        <field id="sopstove"          long_name="Overturning Salt Transport"                     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     683        <field id="sopstove_atl"      long_name="Overturning Salt Transport: Atlantic"           unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     684        <field id="sopstove_pac"      long_name="Overturning Salt Transport: Pacific"            unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     685        <field id="sopstove_ind"      long_name="Overturning Salt Transport: Indian"             unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     686        <field id="sopstove_ipc"      long_name="Overturning Salt Transport: Pacific+Indian"     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     687        <field id="sopstbtr"          long_name="Barotropic Salt Transport"                     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     688        <field id="sopstbtr_atl"      long_name="Barotropic Salt Transport: Atlantic"           unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     689        <field id="sopstbtr_pac"      long_name="Barotropic Salt Transport: Pacific"            unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     690        <field id="sopstbtr_ind"      long_name="Barotropic Salt Transport: Indian"             unit="Giga g/s" grid_ref="gznl_T_2D" /> 
     691        <field id="sopstbtr_ipc"      long_name="Barotropic Salt Transport: Pacific+Indian"     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
    672692        <field id="sopstldf"          long_name="Diffusive Salt Transport"                     unit="Giga g/s" grid_ref="gznl_T_2D" /> 
    673693        <field id="sopstldf_atl"      long_name="Diffusive Salt Transport: Atlantic"           unit="Giga g/s" grid_ref="gznl_T_2D" /> 
  • branches/UKMO/v3_6_extra_CMIP6_diagnostics/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90

    r6672 r6871  
    4444   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_adv, htr_ldf, htr_eiv, htr_vt   !: Heat TRansports (adv, diff, Bolus.) 
    4545   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   str_adv, str_ldf, str_eiv, str_vs   !: Salt TRansports (adv, diff, Bolus.) 
     46   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_ove, str_ove   !: heat Salt TRansports ( overturn.) 
     47   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_btr, str_btr   !: heat Salt TRansports ( barotropic ) 
    4648 
    4749   LOGICAL, PUBLIC ::   ln_diaptr   !  Poleward transport flag (T) or not (F) 
     
    7880      ! 
    7981      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    80       REAL(wp) ::   zv, zsfc               ! local scalar 
     82      REAL(wp) ::   zsfc,zvfc               ! local scalar 
    8183      REAL(wp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace 
    8284      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  z3d   ! 3D workspace 
    8385      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zmask   ! 3D workspace 
    8486      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::  zts   ! 3D workspace 
     87      ! 
     88      !overturning calculation 
     89      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   sjk  , r1_sjk ! i-mean i-k-surface and its inverse 
     90      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   v_msf, sn_jk  , tn_jk ! i-mean T and S, j-Stream-Function 
     91      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zvn   ! 3D workspace 
     92 
     93 
    8594      CHARACTER( len = 12 )  :: cl1 
    8695      !!---------------------------------------------------------------------- 
     
    112121            END DO 
    113122         ENDIF 
     123         IF( iom_use("sopstove") .OR. iom_use("sophtove") .OR. iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
     124            ! define fields multiplied by scalar 
     125            zmask(:,:,:) = 0._wp 
     126            zts(:,:,:,:) = 0._wp 
     127            zvn(:,:,:) = 0._wp 
     128            DO jk = 1, jpkm1 
     129               DO jj = 1, jpjm1 
     130                  DO ji = 1, jpi 
     131                     zvfc = e1v(ji,jj) * fse3v(ji,jj,jk) 
     132                     zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc 
     133                     zts(ji,jj,jk,jp_tem) = (tsn(ji,jj,jk,jp_tem)+tsn(ji,jj,jk,jp_tem)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     134                     zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj,jk,jp_sal)) * 0.5 * zvfc 
     135                     zvn(ji,jj,jk)        = vn(ji,jj,jk)         * zvfc 
     136                  ENDDO 
     137               ENDDO 
     138             ENDDO 
     139         ENDIF 
     140         IF( iom_use("sopstove") .OR. iom_use("sophtove") ) THEN 
     141             sjk(:,:,1) = ptr_sjk( zmask(:,:,:), btmsk(:,:,1) ) 
     142             r1_sjk(:,:,1) = 0._wp 
     143             WHERE( sjk(:,:,1) /= 0._wp )   r1_sjk(:,:,1) = 1._wp / sjk(:,:,1) 
     144 
     145             ! i-mean T and S, j-Stream-Function, global 
     146             tn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_tem) ) * r1_sjk(:,:,1) 
     147             sn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_sal) ) * r1_sjk(:,:,1) 
     148             v_msf(:,:,1) = ptr_sjk( zvn(:,:,:) ) 
     149 
     150             htr_ove(:,1) = SUM( v_msf(:,:,1)*tn_jk(:,:,1) ,2 ) 
     151             str_ove(:,1) = SUM( v_msf(:,:,1)*sn_jk(:,:,1) ,2 ) 
     152 
     153             z2d(1,:) = htr_ove(:,1) * rc_pwatt        !  (conversion in PW) 
     154             DO ji = 1, jpi 
     155               z2d(ji,:) = z2d(1,:) 
     156             ENDDO 
     157             cl1 = 'sophtove' 
     158             CALL iom_put( TRIM(cl1), z2d ) 
     159             z2d(1,:) = str_ove(:,1) * rc_ggram        !  (conversion in Gg) 
     160             DO ji = 1, jpi 
     161               z2d(ji,:) = z2d(1,:) 
     162             ENDDO 
     163             cl1 = 'sopstove' 
     164             CALL iom_put( TRIM(cl1), z2d ) 
     165             IF( ln_subbas ) THEN 
     166                DO jn = 2, nptr 
     167                    sjk(:,:,jn) = ptr_sjk( zmask(:,:,:), btmsk(:,:,jn) ) 
     168                    r1_sjk(:,:,jn) = 0._wp 
     169                    WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
     170 
     171                    ! i-mean T and S, j-Stream-Function, basin 
     172                    tn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     173                    sn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     174                    v_msf(:,:,jn) = ptr_sjk( zvn(:,:,:), btmsk(:,:,jn) )  
     175                    htr_ove(:,jn) = SUM( v_msf(:,:,jn)*tn_jk(:,:,jn) ,2 ) 
     176                    str_ove(:,jn) = SUM( v_msf(:,:,jn)*sn_jk(:,:,jn) ,2 ) 
     177 
     178                    z2d(1,:) = htr_ove(:,jn) * rc_pwatt !  (conversion in PW) 
     179                    DO ji = 1, jpi 
     180                        z2d(ji,:) = z2d(1,:) 
     181                    ENDDO 
     182                    cl1 = TRIM('sophtove_'//clsubb(jn)) 
     183                    CALL iom_put( cl1, z2d ) 
     184                    z2d(1,:) = str_ove(:,jn) * rc_ggram        ! (conversion in Gg) 
     185                    DO ji = 1, jpi 
     186                        z2d(ji,:) = z2d(1,:) 
     187                    ENDDO 
     188                    cl1 = TRIM('sopstove_'//clsubb(jn)) 
     189                    CALL iom_put( cl1, z2d ) 
     190                END DO 
     191             ENDIF 
     192         ENDIF 
     193         IF( iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
     194         ! Calculate barotropic heat and salt transport here  
     195             sjk(:,1,1) = ptr_sj( zmask(:,:,:), btmsk(:,:,1) ) 
     196             r1_sjk(:,1,1) = 0._wp 
     197             WHERE( sjk(:,1,1) /= 0._wp )   r1_sjk(:,1,1) = 1._wp / sjk(:,1,1) 
     198             
     199            htr_btr(:,1) = ptr_sj( zvn(:,:,:)) * ptr_sj( zts(:,:,:,jp_tem) ) * r1_sjk(:,1,1) 
     200            str_btr(:,1) = ptr_sj( zvn(:,:,:)) * ptr_sj( zts(:,:,:,jp_sal) ) * r1_sjk(:,1,1) 
     201            z2d(1,:) = htr_btr(:,1) * rc_pwatt        !  (conversion in PW) 
     202            DO ji = 1, jpi 
     203               z2d(ji,:) = z2d(1,:) 
     204            ENDDO 
     205            cl1 = 'sophtbtr' 
     206            CALL iom_put( TRIM(cl1), z2d ) 
     207            z2d(1,:) = str_btr(:,1) * rc_ggram        !  (conversion in Gg) 
     208            DO ji = 1, jpi 
     209              z2d(ji,:) = z2d(1,:) 
     210            ENDDO 
     211            cl1 = 'sopstbtr' 
     212            CALL iom_put( TRIM(cl1), z2d ) 
     213            IF( ln_subbas ) THEN 
     214                DO jn = 2, nptr 
     215                    sjk(:,1,jn) = ptr_sj( zmask(:,:,:), btmsk(:,:,jn) ) 
     216                    r1_sjk(:,1,jn) = 0._wp 
     217                    WHERE( sjk(:,1,jn) /= 0._wp )   r1_sjk(:,1,jn) = 1._wp / sjk(:,1,jn) 
     218                    htr_btr(:,jn) = ptr_sj( zvn(:,:,:)) * ptr_sj( zts(:,:,:,jp_tem) ) * r1_sjk(:,1,jn) 
     219                    str_btr(:,jn) = ptr_sj( zvn(:,:,:)) * ptr_sj( zts(:,:,:,jp_sal) ) * r1_sjk(:,1,jn) 
     220                    z2d(1,:) = htr_btr(:,jn) * rc_pwatt !  (conversion in PW) 
     221                    DO ji = 1, jpi 
     222                        z2d(ji,:) = z2d(1,:) 
     223                    ENDDO 
     224                    cl1 = TRIM('sophtbtr_'//clsubb(jn)) 
     225                    CALL iom_put( cl1, z2d ) 
     226                    z2d(1,:) = str_btr(:,jn) * rc_ggram        ! (conversion in Gg) 
     227                    DO ji = 1, jpi 
     228                        z2d(ji,:) = z2d(1,:) 
     229                    ENDDO 
     230                    cl1 = TRIM('sopstbtr_'//clsubb(jn)) 
     231                    CALL iom_put( cl1, z2d ) 
     232               ENDDO 
     233            ENDIF !ln_subbas 
     234         ENDIF !iom_use("sopstbtr....) 
    114235         ! 
    115236      ELSE 
     
    355476         ! Initialise arrays to zero because diatpr is called before they are first calculated 
    356477         ! Note that this means diagnostics will not be exactly correct when model run is restarted. 
    357          htr_adv(:,:) = 0._wp  ;  str_adv(:,:) =  0._wp   
     478         htr_adv(:,:) = 0._wp  ;  str_adv(:,:) =  0._wp  
    358479         htr_ldf(:,:) = 0._wp  ;  str_ldf(:,:) =  0._wp  
    359480         htr_eiv(:,:) = 0._wp  ;  str_eiv(:,:) =  0._wp  
    360          htr_vt(:,:) = 0._wp  ;   str_vs(:,:) =  0._wp  
     481         htr_vt(:,:) = 0._wp  ;   str_vs(:,:) =  0._wp 
     482         htr_ove(:,:) = 0._wp  ;   str_ove(:,:) =  0._wp 
     483         htr_btr(:,:) = 0._wp  ;   str_btr(:,:) =  0._wp 
    361484         ! 
    362485      ENDIF  
     
    376499      INTEGER                                        :: jn    ! 
    377500 
    378        
    379501      IF( cptr == 'adv' ) THEN 
    380502         IF( ktra == jp_tem )  htr_adv(:,1) = ptr_sj( pva(:,:,:) ) 
     
    446568         ! 
    447569      ENDIF 
    448  
    449    END SUBROUTINE 
     570   END SUBROUTINE dia_ptr_ohst_components 
    450571 
    451572 
     
    459580      ierr(:) = 0 
    460581      ! 
    461       ALLOCATE( btmsk(jpi,jpj,nptr) ,           & 
     582      ALLOCATE( btmsk(jpi,jpj,nptr) ,              & 
    462583         &      htr_adv(jpj,nptr) , str_adv(jpj,nptr) ,   & 
    463584         &      htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) ,   & 
    464585         &      htr_vt(jpj,nptr)  , str_vs(jpj,nptr)  ,   & 
     586         &      htr_ove(jpj,nptr) , str_ove(jpj,nptr) ,   & 
    465587         &      htr_ldf(jpj,nptr) , str_ldf(jpj,nptr) , STAT=ierr(1)  ) 
    466588         ! 
     
    590712#endif 
    591713      !!-------------------------------------------------------------------- 
    592       ! 
     714     ! 
    593715      p_fval => p_fval2d 
    594716 
     
    622744#endif 
    623745      ! 
     746 
    624747   END FUNCTION ptr_sjk 
    625748 
Note: See TracChangeset for help on using the changeset viewer.