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 9817 for branches/UKMO/dev_r5518_nemo2cice_prints/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90 – NEMO

Ignore:
Timestamp:
2018-06-21T11:58:42+02:00 (6 years ago)
Author:
dancopsey
Message:

Merged in GO6 package branch up to revision 8356.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_nemo2cice_prints/NEMOGCM/NEMO/OPA_SRC/DIA/diaptr.F90

    r9816 r9817  
    99   !!            3.3  ! 2010-10  (G. Madec)  dynamical allocation 
    1010   !!            3.6  ! 2014-12  (C. Ethe) use of IOM 
     11   !!            3.6  ! 2016-06  (T. Graham) Addition of diagnostics for CMIP6 
    1112   !!---------------------------------------------------------------------- 
    1213 
     
    2122   USE dom_oce          ! ocean space and time domain 
    2223   USE phycst           ! physical constants 
     24   USE ldftra_oce  
    2325   ! 
    2426   USE iom              ! IOM library 
     
    3840   PUBLIC   dia_ptr_init   ! call in step module 
    3941   PUBLIC   dia_ptr        ! call in step module 
     42   PUBLIC   dia_ptr_ohst_components        ! called from tra_ldf/tra_adv routines 
    4043 
    4144   !                                  !!** namelist  namptr  ** 
    42    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   htr_adv, htr_ldf   !: Heat TRansports (adv, diff, overturn.) 
    43    REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:) ::   str_adv, str_ldf   !: Salt TRansports (adv, diff, overturn.) 
    44     
     45   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_adv, htr_ldf, htr_eiv, htr_vt   !: Heat TRansports (adv, diff, Bolus.) 
     46   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   str_adv, str_ldf, str_eiv, str_vs   !: Salt TRansports (adv, diff, Bolus.) 
     47   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_ove, str_ove   !: heat Salt TRansports ( overturn.) 
     48   REAL(wp), ALLOCATABLE, SAVE, PUBLIC, DIMENSION(:,:) ::   htr_btr, str_btr   !: heat Salt TRansports ( barotropic ) 
    4549 
    4650   LOGICAL, PUBLIC ::   ln_diaptr   !  Poleward transport flag (T) or not (F) 
    4751   LOGICAL, PUBLIC ::   ln_subbas   !  Atlantic/Pacific/Indian basins calculation 
    48    INTEGER        ::   nptr        ! = 1 (l_subbas=F) or = 5 (glo, atl, pac, ind, ipc) (l_subbas=T)  
     52   INTEGER, PUBLIC ::   nptr        ! = 1 (l_subbas=F) or = 5 (glo, atl, pac, ind, ipc) (l_subbas=T)  
    4953 
    5054   REAL(wp) ::   rc_sv    = 1.e-6_wp   ! conversion from m3/s to Sverdrup 
     
    7781      ! 
    7882      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    79       REAL(wp) ::   zv, zsfc               ! local scalar 
     83      REAL(wp) ::   zsfc,zvfc               ! local scalar 
    8084      REAL(wp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace 
    8185      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  z3d   ! 3D workspace 
    8286      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zmask   ! 3D workspace 
    8387      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts) ::  zts   ! 3D workspace 
    84       CHARACTER( len = 10 )  :: cl1 
     88      REAL(wp), DIMENSION(jpj)     ::  vsum   ! 1D workspace 
     89      REAL(wp), DIMENSION(jpj,jpts)     ::  tssum   ! 1D workspace 
     90  
     91      ! 
     92      !overturning calculation 
     93      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   sjk  , r1_sjk ! i-mean i-k-surface and its inverse 
     94      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   v_msf, sn_jk  , tn_jk ! i-mean T and S, j-Stream-Function 
     95      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zvn   ! 3D workspace 
     96 
     97 
     98      CHARACTER( len = 12 )  :: cl1 
    8599      !!---------------------------------------------------------------------- 
    86100      ! 
     
    88102 
    89103      ! 
     104      z3d(:,:,:) = 0._wp 
    90105      IF( PRESENT( pvtr ) ) THEN 
    91106         IF( iom_use("zomsfglo") ) THEN    ! effective MSF 
    92107            z3d(1,:,:) = ptr_sjk( pvtr(:,:,:) )  ! zonal cumulative effective transport 
    93             DO jk = 2, jpkm1  
    94               z3d(1,:,jk) = z3d(1,:,jk-1) + z3d(1,:,jk)   ! effective j-Stream-Function (MSF) 
     108            DO jk = jpkm1,1,-1                   !Integrate from bottom up to get 
     109              z3d(1,:,jk) = z3d(1,:,jk+1) - z3d(1,:,jk)   ! effective j-Stream-Function (MSF) 
    95110            END DO 
    96111            DO ji = 1, jpi 
     
    100115            CALL iom_put( cl1, z3d * rc_sv ) 
    101116            DO jn = 2, nptr                                    ! by sub-basins 
    102                z3d(1,:,:) =  ptr_sjk( pvtr(:,:,:), btmsk(:,:,jn)*btm30(:,:) )  
    103                DO jk = 2, jpkm1  
    104                   z3d(1,:,jk) = z3d(1,:,jk-1) + z3d(1,:,jk)    ! effective j-Stream-Function (MSF) 
     117               z3d(1,:,:) =  ptr_sjk( pvtr(:,:,:), btmsk(:,:,jn) )  
     118               DO jk = jpkm1,1,-1 
     119                  z3d(1,:,jk) = z3d(1,:,jk+1) - z3d(1,:,jk)    ! effective j-Stream-Function (MSF) 
    105120               END DO 
    106121               DO ji = 1, jpi 
     
    111126            END DO 
    112127         ENDIF 
     128         IF( iom_use("sopstove") .OR. iom_use("sophtove") .OR. iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
     129            ! define fields multiplied by scalar 
     130            zmask(:,:,:) = 0._wp 
     131            zts(:,:,:,:) = 0._wp 
     132            zvn(:,:,:) = 0._wp 
     133            DO jk = 1, jpkm1 
     134               DO jj = 1, jpjm1 
     135                  DO ji = 1, jpi 
     136                     zvfc = e1v(ji,jj) * fse3v(ji,jj,jk) 
     137                     zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc 
     138                     zts(ji,jj,jk,jp_tem) = (tsn(ji,jj,jk,jp_tem)+tsn(ji,jj+1,jk,jp_tem)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     139                     zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
     140                     zvn(ji,jj,jk)        = vn(ji,jj,jk)         * zvfc 
     141                  ENDDO 
     142               ENDDO 
     143             ENDDO 
     144         ENDIF 
     145         IF( iom_use("sopstove") .OR. iom_use("sophtove") ) THEN 
     146             sjk(:,:,1) = ptr_sjk( zmask(:,:,:), btmsk(:,:,1) ) 
     147             r1_sjk(:,:,1) = 0._wp 
     148             WHERE( sjk(:,:,1) /= 0._wp )   r1_sjk(:,:,1) = 1._wp / sjk(:,:,1) 
     149 
     150             ! i-mean T and S, j-Stream-Function, global 
     151             tn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_tem) ) * r1_sjk(:,:,1) 
     152             sn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_sal) ) * r1_sjk(:,:,1) 
     153             v_msf(:,:,1) = ptr_sjk( zvn(:,:,:) ) 
     154 
     155             htr_ove(:,1) = SUM( v_msf(:,:,1)*tn_jk(:,:,1) ,2 ) 
     156             str_ove(:,1) = SUM( v_msf(:,:,1)*sn_jk(:,:,1) ,2 ) 
     157 
     158             z2d(1,:) = htr_ove(:,1) * rc_pwatt        !  (conversion in PW) 
     159             DO ji = 1, jpi 
     160               z2d(ji,:) = z2d(1,:) 
     161             ENDDO 
     162             cl1 = 'sophtove' 
     163             CALL iom_put( TRIM(cl1), z2d ) 
     164             z2d(1,:) = str_ove(:,1) * rc_ggram        !  (conversion in Gg) 
     165             DO ji = 1, jpi 
     166               z2d(ji,:) = z2d(1,:) 
     167             ENDDO 
     168             cl1 = 'sopstove' 
     169             CALL iom_put( TRIM(cl1), z2d ) 
     170             IF( ln_subbas ) THEN 
     171                DO jn = 2, nptr 
     172                    sjk(:,:,jn) = ptr_sjk( zmask(:,:,:), btmsk(:,:,jn) ) 
     173                    r1_sjk(:,:,jn) = 0._wp 
     174                    WHERE( sjk(:,:,jn) /= 0._wp )   r1_sjk(:,:,jn) = 1._wp / sjk(:,:,jn) 
     175 
     176                    ! i-mean T and S, j-Stream-Function, basin 
     177                    tn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     178                    sn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
     179                    v_msf(:,:,jn) = ptr_sjk( zvn(:,:,:), btmsk(:,:,jn) )  
     180                    htr_ove(:,jn) = SUM( v_msf(:,:,jn)*tn_jk(:,:,jn) ,2 ) 
     181                    str_ove(:,jn) = SUM( v_msf(:,:,jn)*sn_jk(:,:,jn) ,2 ) 
     182 
     183                    z2d(1,:) = htr_ove(:,jn) * rc_pwatt !  (conversion in PW) 
     184                    DO ji = 1, jpi 
     185                        z2d(ji,:) = z2d(1,:) 
     186                    ENDDO 
     187                    cl1 = TRIM('sophtove_'//clsubb(jn)) 
     188                    CALL iom_put( cl1, z2d ) 
     189                    z2d(1,:) = str_ove(:,jn) * rc_ggram        ! (conversion in Gg) 
     190                    DO ji = 1, jpi 
     191                        z2d(ji,:) = z2d(1,:) 
     192                    ENDDO 
     193                    cl1 = TRIM('sopstove_'//clsubb(jn)) 
     194                    CALL iom_put( cl1, z2d ) 
     195                END DO 
     196             ENDIF 
     197         ENDIF 
     198         IF( iom_use("sopstbtr") .OR. iom_use("sophtbtr") ) THEN 
     199         ! Calculate barotropic heat and salt transport here  
     200             sjk(:,1,1) = ptr_sj( zmask(:,:,:), btmsk(:,:,1) ) 
     201             r1_sjk(:,1,1) = 0._wp 
     202             WHERE( sjk(:,1,1) /= 0._wp )   r1_sjk(:,1,1) = 1._wp / sjk(:,1,1) 
     203             
     204            vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,1)) 
     205            tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,1) ) 
     206            tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,1) ) 
     207            htr_btr(:,1) = vsum * tssum(:,jp_tem) * r1_sjk(:,1,1) 
     208            str_btr(:,1) = vsum * tssum(:,jp_sal) * r1_sjk(:,1,1) 
     209            z2d(1,:) = htr_btr(:,1) * rc_pwatt        !  (conversion in PW) 
     210            DO ji = 2, jpi 
     211               z2d(ji,:) = z2d(1,:) 
     212            ENDDO 
     213            cl1 = 'sophtbtr' 
     214            CALL iom_put( TRIM(cl1), z2d ) 
     215            z2d(1,:) = str_btr(:,1) * rc_ggram        !  (conversion in Gg) 
     216            DO ji = 2, jpi 
     217              z2d(ji,:) = z2d(1,:) 
     218            ENDDO 
     219            cl1 = 'sopstbtr' 
     220            CALL iom_put( TRIM(cl1), z2d ) 
     221            IF( ln_subbas ) THEN 
     222                DO jn = 2, nptr 
     223                    sjk(:,1,jn) = ptr_sj( zmask(:,:,:), btmsk(:,:,jn) ) 
     224                    r1_sjk(:,1,jn) = 0._wp 
     225                    WHERE( sjk(:,1,jn) /= 0._wp )   r1_sjk(:,1,jn) = 1._wp / sjk(:,1,jn) 
     226                    vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,jn)) 
     227                    tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) 
     228                    tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) 
     229                    htr_btr(:,jn) = vsum * tssum(:,jp_tem) * r1_sjk(:,1,jn) 
     230                    str_btr(:,jn) = vsum * tssum(:,jp_sal) * r1_sjk(:,1,jn) 
     231                    z2d(1,:) = htr_btr(:,jn) * rc_pwatt !  (conversion in PW) 
     232                    DO ji = 1, jpi 
     233                        z2d(ji,:) = z2d(1,:) 
     234                    ENDDO 
     235                    cl1 = TRIM('sophtbtr_'//clsubb(jn)) 
     236                    CALL iom_put( cl1, z2d ) 
     237                    z2d(1,:) = str_btr(:,jn) * rc_ggram        ! (conversion in Gg) 
     238                    DO ji = 1, jpi 
     239                        z2d(ji,:) = z2d(1,:) 
     240                    ENDDO 
     241                    cl1 = TRIM('sopstbtr_'//clsubb(jn)) 
     242                    CALL iom_put( cl1, z2d ) 
     243               ENDDO 
     244            ENDIF !ln_subbas 
     245         ENDIF !iom_use("sopstbtr....) 
    113246         ! 
    114247      ELSE 
     
    150283         !                                ! Advective and diffusive heat and salt transport 
    151284         IF( iom_use("sophtadv") .OR. iom_use("sopstadv") ) THEN    
    152             z2d(1,:) = htr_adv(:) * rc_pwatt        !  (conversion in PW) 
     285            z2d(1,:) = htr_adv(:,1) * rc_pwatt        !  (conversion in PW) 
    153286            DO ji = 1, jpi 
    154287               z2d(ji,:) = z2d(1,:) 
     
    156289            cl1 = 'sophtadv'                  
    157290            CALL iom_put( TRIM(cl1), z2d ) 
    158             z2d(1,:) = str_adv(:) * rc_ggram        ! (conversion in Gg) 
     291            z2d(1,:) = str_adv(:,1) * rc_ggram        ! (conversion in Gg) 
    159292            DO ji = 1, jpi 
    160293               z2d(ji,:) = z2d(1,:) 
     
    162295            cl1 = 'sopstadv' 
    163296            CALL iom_put( TRIM(cl1), z2d ) 
     297            IF( ln_subbas ) THEN 
     298              DO jn=2,nptr 
     299               z2d(1,:) = htr_adv(:,jn) * rc_pwatt        !  (conversion in PW) 
     300               DO ji = 1, jpi 
     301                 z2d(ji,:) = z2d(1,:) 
     302               ENDDO 
     303               cl1 = TRIM('sophtadv_'//clsubb(jn))                  
     304               CALL iom_put( cl1, z2d ) 
     305               z2d(1,:) = str_adv(:,jn) * rc_ggram        ! (conversion in Gg) 
     306               DO ji = 1, jpi 
     307                  z2d(ji,:) = z2d(1,:) 
     308               ENDDO 
     309               cl1 = TRIM('sopstadv_'//clsubb(jn))                  
     310               CALL iom_put( cl1, z2d )               
     311              ENDDO 
     312            ENDIF 
    164313         ENDIF 
    165314         ! 
    166315         IF( iom_use("sophtldf") .OR. iom_use("sopstldf") ) THEN    
    167             z2d(1,:) = htr_ldf(:) * rc_pwatt        !  (conversion in PW)  
     316            z2d(1,:) = htr_ldf(:,1) * rc_pwatt        !  (conversion in PW)  
    168317            DO ji = 1, jpi 
    169318               z2d(ji,:) = z2d(1,:) 
     
    171320            cl1 = 'sophtldf' 
    172321            CALL iom_put( TRIM(cl1), z2d ) 
    173             z2d(1,:) = str_ldf(:) * rc_ggram        !  (conversion in Gg) 
     322            z2d(1,:) = str_ldf(:,1) * rc_ggram        !  (conversion in Gg) 
    174323            DO ji = 1, jpi 
    175324               z2d(ji,:) = z2d(1,:) 
     
    177326            cl1 = 'sopstldf' 
    178327            CALL iom_put( TRIM(cl1), z2d ) 
    179          ENDIF 
     328            IF( ln_subbas ) THEN 
     329              DO jn=2,nptr 
     330               z2d(1,:) = htr_ldf(:,jn) * rc_pwatt        !  (conversion in PW) 
     331               DO ji = 1, jpi 
     332                 z2d(ji,:) = z2d(1,:) 
     333               ENDDO 
     334               cl1 = TRIM('sophtldf_'//clsubb(jn))                  
     335               CALL iom_put( cl1, z2d ) 
     336               z2d(1,:) = str_ldf(:,jn) * rc_ggram        ! (conversion in Gg) 
     337               DO ji = 1, jpi 
     338                  z2d(ji,:) = z2d(1,:) 
     339               ENDDO 
     340               cl1 = TRIM('sopstldf_'//clsubb(jn))                  
     341               CALL iom_put( cl1, z2d )               
     342              ENDDO 
     343            ENDIF 
     344         ENDIF 
     345 
     346         IF( iom_use("sopht_vt") .OR. iom_use("sopst_vs") ) THEN    
     347            z2d(1,:) = htr_vt(:,1) * rc_pwatt        !  (conversion in PW)  
     348            DO ji = 1, jpi 
     349               z2d(ji,:) = z2d(1,:) 
     350            ENDDO 
     351            cl1 = 'sopht_vt' 
     352            CALL iom_put( TRIM(cl1), z2d ) 
     353            z2d(1,:) = str_vs(:,1) * rc_ggram        !  (conversion in Gg) 
     354            DO ji = 1, jpi 
     355               z2d(ji,:) = z2d(1,:) 
     356            ENDDO 
     357            cl1 = 'sopst_vs' 
     358            CALL iom_put( TRIM(cl1), z2d ) 
     359            IF( ln_subbas ) THEN 
     360              DO jn=2,nptr 
     361               z2d(1,:) = htr_vt(:,jn) * rc_pwatt        !  (conversion in PW) 
     362               DO ji = 1, jpi 
     363                 z2d(ji,:) = z2d(1,:) 
     364               ENDDO 
     365               cl1 = TRIM('sopht_vt_'//clsubb(jn))                  
     366               CALL iom_put( cl1, z2d ) 
     367               z2d(1,:) = str_vs(:,jn) * rc_ggram        ! (conversion in Gg) 
     368               DO ji = 1, jpi 
     369                  z2d(ji,:) = z2d(1,:) 
     370               ENDDO 
     371               cl1 = TRIM('sopst_vs_'//clsubb(jn))                  
     372               CALL iom_put( cl1, z2d )               
     373              ENDDO 
     374            ENDIF 
     375         ENDIF 
     376 
     377#ifdef key_diaeiv 
     378         IF(lk_traldf_eiv) THEN 
     379            IF( iom_use("sophteiv") .OR. iom_use("sopsteiv") ) THEN  
     380               z2d(1,:) = htr_eiv(:,1) * rc_pwatt        !  (conversion in PW)  
     381               DO ji = 1, jpi 
     382                  z2d(ji,:) = z2d(1,:) 
     383               ENDDO 
     384               cl1 = 'sophteiv' 
     385               CALL iom_put( TRIM(cl1), z2d ) 
     386               z2d(1,:) = str_eiv(:,1) * rc_ggram        !  (conversion in Gg) 
     387               DO ji = 1, jpi 
     388                  z2d(ji,:) = z2d(1,:) 
     389               ENDDO 
     390               cl1 = 'sopsteiv' 
     391               CALL iom_put( TRIM(cl1), z2d ) 
     392               IF( ln_subbas ) THEN 
     393                  DO jn=2,nptr 
     394                     z2d(1,:) = htr_eiv(:,jn) * rc_pwatt        !  (conversion in PW) 
     395                     DO ji = 1, jpi 
     396                        z2d(ji,:) = z2d(1,:) 
     397                     ENDDO 
     398                     cl1 = TRIM('sophteiv_'//clsubb(jn))                  
     399                     CALL iom_put( cl1, z2d ) 
     400                     z2d(1,:) = str_eiv(:,jn) * rc_ggram        ! (conversion in Gg) 
     401                     DO ji = 1, jpi 
     402                        z2d(ji,:) = z2d(1,:) 
     403                     ENDDO 
     404                     cl1 = TRIM('sopsteiv_'//clsubb(jn))  
     405                     CALL iom_put( cl1, z2d )               
     406                  ENDDO 
     407               ENDIF 
     408            ENDIF 
     409            IF( iom_use("zomsfeivglo") ) THEN 
     410               z3d(1,:,:) = ptr_sjk( v_eiv(:,:,:) )  ! zonal cumulative effective transport 
     411               DO jk = jpkm1,1,-1 
     412                 z3d(1,:,jk) = z3d(1,:,jk+1) - z3d(1,:,jk)   ! effective j-Stream-Function (MSF) 
     413               END DO 
     414               DO ji = 1, jpi 
     415                  z3d(ji,:,:) = z3d(1,:,:) 
     416               ENDDO 
     417               cl1 = TRIM('zomsfeiv'//clsubb(1) ) 
     418               CALL iom_put( cl1, z3d * rc_sv ) 
     419               IF( ln_subbas ) THEN 
     420                  DO jn = 2, nptr                                    ! by sub-basins 
     421                     z3d(1,:,:) =  ptr_sjk( v_eiv(:,:,:), btmsk(:,:,jn) )  
     422                     DO jk = jpkm1,1,-1 
     423                        z3d(1,:,jk) = z3d(1,:,jk+1) - z3d(1,:,jk)    ! effective j-Stream-Function (MSF) 
     424                     END DO 
     425                     DO ji = 1, jpi 
     426                        z3d(ji,:,:) = z3d(1,:,:) 
     427                     ENDDO 
     428                     cl1 = TRIM('zomsfeiv'//clsubb(jn) ) 
     429                     CALL iom_put( cl1, z3d * rc_sv ) 
     430                  END DO 
     431               ENDIF 
     432            ENDIF 
     433         ENDIF 
     434#endif 
    180435         ! 
    181436      ENDIF 
     
    256511         ! Initialise arrays to zero because diatpr is called before they are first calculated 
    257512         ! Note that this means diagnostics will not be exactly correct when model run is restarted. 
    258          htr_adv(:) = 0._wp  ;  str_adv(:) =  0._wp   
    259          htr_ldf(:) = 0._wp  ;  str_ldf(:) =  0._wp  
     513         htr_adv(:,:) = 0._wp  ;  str_adv(:,:) =  0._wp  
     514         htr_ldf(:,:) = 0._wp  ;  str_ldf(:,:) =  0._wp  
     515         htr_eiv(:,:) = 0._wp  ;  str_eiv(:,:) =  0._wp  
     516         htr_vt(:,:) = 0._wp  ;   str_vs(:,:) =  0._wp 
     517         htr_ove(:,:) = 0._wp  ;   str_ove(:,:) =  0._wp 
     518         htr_btr(:,:) = 0._wp  ;   str_btr(:,:) =  0._wp 
    260519         ! 
    261520      ENDIF  
     
    263522   END SUBROUTINE dia_ptr_init 
    264523 
     524   SUBROUTINE dia_ptr_ohst_components( ktra, cptr, pva )  
     525      !!---------------------------------------------------------------------- 
     526      !!                    ***  ROUTINE dia_ptr_ohst_components  *** 
     527      !!---------------------------------------------------------------------- 
     528      !! Wrapper for heat and salt transport calculations to calculate them for each basin 
     529      !! Called from all advection and/or diffusion routines 
     530      !!---------------------------------------------------------------------- 
     531      INTEGER                         , INTENT(in )  :: ktra  ! tracer index 
     532      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'/'eiv' 
     533      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pva   ! 3D input array of advection/diffusion 
     534      INTEGER                                        :: jn    ! 
     535 
     536      IF( cptr == 'adv' ) THEN 
     537         IF( ktra == jp_tem )  htr_adv(:,1) = ptr_sj( pva(:,:,:) ) 
     538         IF( ktra == jp_sal )  str_adv(:,1) = ptr_sj( pva(:,:,:) ) 
     539      ENDIF 
     540      IF( cptr == 'ldf' ) THEN 
     541         IF( ktra == jp_tem )  htr_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
     542         IF( ktra == jp_sal )  str_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
     543      ENDIF 
     544      IF( cptr == 'eiv' ) THEN 
     545         IF( ktra == jp_tem )  htr_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
     546         IF( ktra == jp_sal )  str_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
     547      ENDIF 
     548      IF( cptr == 'vts' ) THEN 
     549         IF( ktra == jp_tem )  htr_vt(:,1) = ptr_sj( pva(:,:,:) ) 
     550         IF( ktra == jp_sal )  str_vs(:,1) = ptr_sj( pva(:,:,:) ) 
     551      ENDIF 
     552      ! 
     553      IF( ln_subbas ) THEN 
     554         ! 
     555         IF( cptr == 'adv' ) THEN 
     556             IF( ktra == jp_tem ) THEN  
     557                DO jn = 2, nptr 
     558                   htr_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     559                END DO 
     560             ENDIF 
     561             IF( ktra == jp_sal ) THEN  
     562                DO jn = 2, nptr 
     563                   str_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     564                END DO 
     565             ENDIF 
     566         ENDIF 
     567         IF( cptr == 'ldf' ) THEN 
     568             IF( ktra == jp_tem ) THEN  
     569                DO jn = 2, nptr 
     570                    htr_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     571                 END DO 
     572             ENDIF 
     573             IF( ktra == jp_sal ) THEN  
     574                DO jn = 2, nptr 
     575                   str_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     576                END DO 
     577             ENDIF 
     578         ENDIF 
     579         IF( cptr == 'eiv' ) THEN 
     580             IF( ktra == jp_tem ) THEN  
     581                DO jn = 2, nptr 
     582                    htr_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     583                 END DO 
     584             ENDIF 
     585             IF( ktra == jp_sal ) THEN  
     586                DO jn = 2, nptr 
     587                   str_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     588                END DO 
     589             ENDIF 
     590         ENDIF 
     591         IF( cptr == 'vts' ) THEN 
     592             IF( ktra == jp_tem ) THEN  
     593                DO jn = 2, nptr 
     594                    htr_vt(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     595                 END DO 
     596             ENDIF 
     597             IF( ktra == jp_sal ) THEN  
     598                DO jn = 2, nptr 
     599                   str_vs(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     600                END DO 
     601             ENDIF 
     602         ENDIF 
     603         ! 
     604      ENDIF 
     605   END SUBROUTINE dia_ptr_ohst_components 
     606 
    265607 
    266608   FUNCTION dia_ptr_alloc() 
     
    273615      ierr(:) = 0 
    274616      ! 
    275       ALLOCATE( btmsk(jpi,jpj,nptr) ,           & 
    276          &      htr_adv(jpj) , str_adv(jpj) ,   & 
    277          &      htr_ldf(jpj) , str_ldf(jpj) , STAT=ierr(1)  ) 
     617      ALLOCATE( btmsk(jpi,jpj,nptr) ,              & 
     618         &      htr_adv(jpj,nptr) , str_adv(jpj,nptr) ,   & 
     619         &      htr_eiv(jpj,nptr) , str_eiv(jpj,nptr) ,   & 
     620         &      htr_vt(jpj,nptr)  , str_vs(jpj,nptr)  ,   & 
     621         &      htr_ove(jpj,nptr) , str_ove(jpj,nptr) ,   & 
     622         &      htr_btr(jpj,nptr) , str_btr(jpj,nptr) ,   & 
     623         &      htr_ldf(jpj,nptr) , str_ldf(jpj,nptr) , STAT=ierr(1)  ) 
    278624         ! 
    279625      ALLOCATE( p_fval1d(jpj), p_fval2d(jpj,jpk), Stat=ierr(2)) 
     
    402748#endif 
    403749      !!-------------------------------------------------------------------- 
    404       ! 
     750     ! 
    405751      p_fval => p_fval2d 
    406752 
     
    434780#endif 
    435781      ! 
     782 
    436783   END FUNCTION ptr_sjk 
    437784 
Note: See TracChangeset for help on using the changeset viewer.