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 10965 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DIA/diaptr.F90 – NEMO

Ignore:
Timestamp:
2019-05-10T18:02:51+02:00 (5 years ago)
Author:
davestorkey
Message:

2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps : DIA and stpctl.F90. Just testing in ORCA1 so far.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/DIA/diaptr.F90

    r10425 r10965  
    7171CONTAINS 
    7272 
    73    SUBROUTINE dia_ptr( pvtr ) 
     73   SUBROUTINE dia_ptr( Kmm, pvtr ) 
    7474      !!---------------------------------------------------------------------- 
    7575      !!                  ***  ROUTINE dia_ptr  *** 
    7676      !!---------------------------------------------------------------------- 
     77      INTEGER                         , INTENT(in)           ::   Kmm    ! time level index 
    7778      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pvtr   ! j-effective transport 
    7879      ! 
     
    9091      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   sjk  , r1_sjk ! i-mean i-k-surface and its inverse 
    9192      REAL(wp), DIMENSION(jpj,jpk,nptr) ::   v_msf, sn_jk  , tn_jk ! i-mean T and S, j-Stream-Function 
    92       REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zvn   ! 3D workspace 
     93      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  zvv   ! 3D workspace 
    9394 
    9495 
     
    126127            zmask(:,:,:) = 0._wp 
    127128            zts(:,:,:,:) = 0._wp 
    128             zvn(:,:,:) = 0._wp 
     129            zvv(:,:,:) = 0._wp 
    129130            DO jk = 1, jpkm1 
    130131               DO jj = 1, jpjm1 
    131132                  DO ji = 1, jpi 
    132                      zvfc = e1v(ji,jj) * e3v_n(ji,jj,jk) 
     133                     zvfc = e1v(ji,jj) * e3v(ji,jj,jk,Kmm) 
    133134                     zmask(ji,jj,jk)      = vmask(ji,jj,jk)      * zvfc 
    134                      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 
    135                      zts(ji,jj,jk,jp_sal) = (tsn(ji,jj,jk,jp_sal)+tsn(ji,jj+1,jk,jp_sal)) * 0.5 * zvfc 
    136                      zvn(ji,jj,jk)        = vn(ji,jj,jk)         * zvfc 
     135                     zts(ji,jj,jk,jp_tem) = (ts(ji,jj,jk,jp_tem,Kmm)+ts(ji,jj+1,jk,jp_tem,Kmm)) * 0.5 * zvfc  !Tracers averaged onto V grid 
     136                     zts(ji,jj,jk,jp_sal) = (ts(ji,jj,jk,jp_sal,Kmm)+ts(ji,jj+1,jk,jp_sal,Kmm)) * 0.5 * zvfc 
     137                     zvv(ji,jj,jk)        = vv(ji,jj,jk,Kmm)         * zvfc 
    137138                  ENDDO 
    138139               ENDDO 
     
    147148             tn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_tem) ) * r1_sjk(:,:,1) 
    148149             sn_jk(:,:,1) = ptr_sjk( zts(:,:,:,jp_sal) ) * r1_sjk(:,:,1) 
    149              v_msf(:,:,1) = ptr_sjk( zvn(:,:,:) ) 
     150             v_msf(:,:,1) = ptr_sjk( zvv(:,:,:) ) 
    150151 
    151152             htr_ove(:,1) = SUM( v_msf(:,:,1)*tn_jk(:,:,1) ,2 ) 
     
    173174                    tn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
    174175                    sn_jk(:,:,jn) = ptr_sjk( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) * r1_sjk(:,:,jn) 
    175                     v_msf(:,:,jn) = ptr_sjk( zvn(:,:,:), btmsk(:,:,jn) )  
     176                    v_msf(:,:,jn) = ptr_sjk( zvv(:,:,:), btmsk(:,:,jn) )  
    176177                    htr_ove(:,jn) = SUM( v_msf(:,:,jn)*tn_jk(:,:,jn) ,2 ) 
    177178                    str_ove(:,jn) = SUM( v_msf(:,:,jn)*sn_jk(:,:,jn) ,2 ) 
     
    198199             WHERE( sjk(:,1,1) /= 0._wp )   r1_sjk(:,1,1) = 1._wp / sjk(:,1,1) 
    199200             
    200             vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,1)) 
     201            vsum = ptr_sj( zvv(:,:,:), btmsk(:,:,1)) 
    201202            tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,1) ) 
    202203            tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,1) ) 
     
    220221                    r1_sjk(:,1,jn) = 0._wp 
    221222                    WHERE( sjk(:,1,jn) /= 0._wp )   r1_sjk(:,1,jn) = 1._wp / sjk(:,1,jn) 
    222                     vsum = ptr_sj( zvn(:,:,:), btmsk(:,:,jn)) 
     223                    vsum = ptr_sj( zvv(:,:,:), btmsk(:,:,jn)) 
    223224                    tssum(:,jp_tem) = ptr_sj( zts(:,:,:,jp_tem), btmsk(:,:,jn) ) 
    224225                    tssum(:,jp_sal) = ptr_sj( zts(:,:,:,jp_sal), btmsk(:,:,jn) ) 
     
    247248               DO jj = 1, jpj 
    248249                  DO ji = 1, jpi 
    249                      zsfc = e1t(ji,jj) * e3t_n(ji,jj,jk) 
     250                     zsfc = e1t(ji,jj) * e3t(ji,jj,jk,Kmm) 
    250251                     zmask(ji,jj,jk)      = tmask(ji,jj,jk)      * zsfc 
    251                      zts(ji,jj,jk,jp_tem) = tsn(ji,jj,jk,jp_tem) * zsfc 
    252                      zts(ji,jj,jk,jp_sal) = tsn(ji,jj,jk,jp_sal) * zsfc 
     252                     zts(ji,jj,jk,jp_tem) = ts(ji,jj,jk,jp_tem,Kmm) * zsfc 
     253                     zts(ji,jj,jk,jp_sal) = ts(ji,jj,jk,jp_sal,Kmm) * zsfc 
    253254                  END DO 
    254255               END DO 
     
    459460 
    460461 
    461    SUBROUTINE dia_ptr_hst( ktra, cptr, pva )  
     462   SUBROUTINE dia_ptr_hst( ktra, cptr, pvflx )  
    462463      !!---------------------------------------------------------------------- 
    463464      !!                    ***  ROUTINE dia_ptr_hst *** 
     
    468469      INTEGER                         , INTENT(in )  :: ktra  ! tracer index 
    469470      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'/'eiv' 
    470       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pva   ! 3D input array of advection/diffusion 
     471      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)   :: pvflx   ! 3D input array of advection/diffusion 
    471472      INTEGER                                        :: jn    ! 
    472473 
    473474      IF( cptr == 'adv' ) THEN 
    474          IF( ktra == jp_tem )  htr_adv(:,1) = ptr_sj( pva(:,:,:) ) 
    475          IF( ktra == jp_sal )  str_adv(:,1) = ptr_sj( pva(:,:,:) ) 
     475         IF( ktra == jp_tem )  htr_adv(:,1) = ptr_sj( pvflx ) 
     476         IF( ktra == jp_sal )  str_adv(:,1) = ptr_sj( pvflx ) 
    476477      ENDIF 
    477478      IF( cptr == 'ldf' ) THEN 
    478          IF( ktra == jp_tem )  htr_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
    479          IF( ktra == jp_sal )  str_ldf(:,1) = ptr_sj( pva(:,:,:) ) 
     479         IF( ktra == jp_tem )  htr_ldf(:,1) = ptr_sj( pvflx ) 
     480         IF( ktra == jp_sal )  str_ldf(:,1) = ptr_sj( pvflx ) 
    480481      ENDIF 
    481482      IF( cptr == 'eiv' ) THEN 
    482          IF( ktra == jp_tem )  htr_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
    483          IF( ktra == jp_sal )  str_eiv(:,1) = ptr_sj( pva(:,:,:) ) 
     483         IF( ktra == jp_tem )  htr_eiv(:,1) = ptr_sj( pvflx ) 
     484         IF( ktra == jp_sal )  str_eiv(:,1) = ptr_sj( pvflx ) 
    484485      ENDIF 
    485486      ! 
     
    489490             IF( ktra == jp_tem ) THEN  
    490491                DO jn = 2, nptr 
    491                    htr_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     492                   htr_adv(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    492493                END DO 
    493494             ENDIF 
    494495             IF( ktra == jp_sal ) THEN  
    495496                DO jn = 2, nptr 
    496                    str_adv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     497                   str_adv(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    497498                END DO 
    498499             ENDIF 
     
    501502             IF( ktra == jp_tem ) THEN  
    502503                DO jn = 2, nptr 
    503                     htr_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     504                    htr_ldf(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    504505                 END DO 
    505506             ENDIF 
    506507             IF( ktra == jp_sal ) THEN  
    507508                DO jn = 2, nptr 
    508                    str_ldf(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     509                   str_ldf(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    509510                END DO 
    510511             ENDIF 
     
    513514             IF( ktra == jp_tem ) THEN  
    514515                DO jn = 2, nptr 
    515                     htr_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     516                    htr_eiv(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    516517                 END DO 
    517518             ENDIF 
    518519             IF( ktra == jp_sal ) THEN  
    519520                DO jn = 2, nptr 
    520                    str_eiv(:,jn) = ptr_sj( pva(:,:,:), btmsk(:,:,jn) ) 
     521                   str_eiv(:,jn) = ptr_sj( pvflx, btmsk(:,:,jn) ) 
    521522                END DO 
    522523             ENDIF 
     
    554555 
    555556 
    556    FUNCTION ptr_sj_3d( pva, pmsk )   RESULT ( p_fval ) 
     557   FUNCTION ptr_sj_3d( pvflx, pmsk )   RESULT ( p_fval ) 
    557558      !!---------------------------------------------------------------------- 
    558559      !!                    ***  ROUTINE ptr_sj_3d  *** 
     
    560561      !! ** Purpose :   i-k sum computation of a j-flux array 
    561562      !! 
    562       !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i). 
    563       !!              pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
    564       !! 
    565       !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    566       !!---------------------------------------------------------------------- 
    567       REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)       ::   pva   ! mask flux array at V-point 
     563      !! ** Method  : - i-k sum of pvflx using the interior 2D vmask (vmask_i). 
     564      !!              pvflx is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
     565      !! 
     566      !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx 
     567      !!---------------------------------------------------------------------- 
     568      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk)       ::   pvflx   ! mask flux array at V-point 
    568569      REAL(wp), INTENT(in), DIMENSION(jpi,jpj), OPTIONAL ::   pmsk   ! Optional 2D basin mask 
    569570      ! 
     
    581582            DO jj = 2, jpjm1 
    582583               DO ji = fs_2, fs_jpim1   ! Vector opt. 
    583                   p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * tmask_i(ji,jj) * pmsk(ji,jj) 
     584                  p_fval(jj) = p_fval(jj) + pvflx(ji,jj,jk) * tmask_i(ji,jj) * pmsk(ji,jj) 
    584585               END DO 
    585586            END DO 
     
    589590            DO jj = 2, jpjm1 
    590591               DO ji = fs_2, fs_jpim1   ! Vector opt. 
    591                   p_fval(jj) = p_fval(jj) + pva(ji,jj,jk) * tmask_i(ji,jj)  
     592                  p_fval(jj) = p_fval(jj) + pvflx(ji,jj,jk) * tmask_i(ji,jj)  
    592593               END DO 
    593594            END DO 
     
    601602 
    602603 
    603    FUNCTION ptr_sj_2d( pva, pmsk )   RESULT ( p_fval ) 
     604   FUNCTION ptr_sj_2d( pvflx, pmsk )   RESULT ( p_fval ) 
    604605      !!---------------------------------------------------------------------- 
    605606      !!                    ***  ROUTINE ptr_sj_2d  *** 
    606607      !! 
    607       !! ** Purpose :   "zonal" and vertical sum computation of a i-flux array 
    608       !! 
    609       !! ** Method  : - i-k sum of pva using the interior 2D vmask (vmask_i). 
    610       !!      pva is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
    611       !! 
    612       !! ** Action  : - p_fval: i-k-mean poleward flux of pva 
    613       !!---------------------------------------------------------------------- 
    614       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)           ::   pva   ! mask flux array at V-point 
     608      !! ** Purpose :   "zonal" and vertical sum computation of a j-flux array 
     609      !! 
     610      !! ** Method  : - i-k sum of pvflx using the interior 2D vmask (vmask_i). 
     611      !!      pvflx is supposed to be a masked flux (i.e. * vmask*e1v*e3v) 
     612      !! 
     613      !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx 
     614      !!---------------------------------------------------------------------- 
     615      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)           ::   pvflx   ! mask flux array at V-point 
    615616      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj), OPTIONAL ::   pmsk   ! Optional 2D basin mask 
    616617      ! 
     
    627628         DO jj = 2, jpjm1 
    628629            DO ji = nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    629                p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj) * pmsk(ji,jj) 
     630               p_fval(jj) = p_fval(jj) + pvflx(ji,jj) * tmask_i(ji,jj) * pmsk(ji,jj) 
    630631            END DO 
    631632         END DO 
     
    633634         DO jj = 2, jpjm1 
    634635            DO ji = nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    635                p_fval(jj) = p_fval(jj) + pva(ji,jj) * tmask_i(ji,jj) 
     636               p_fval(jj) = p_fval(jj) + pvflx(ji,jj) * tmask_i(ji,jj) 
    636637            END DO 
    637638         END DO 
     
    644645 
    645646 
    646    FUNCTION ptr_sjk( pta, pmsk )   RESULT ( p_fval ) 
     647   FUNCTION ptr_sjk( pfld, pmsk )   RESULT ( p_fval ) 
    647648      !!---------------------------------------------------------------------- 
    648649      !!                    ***  ROUTINE ptr_sjk  *** 
     
    650651      !! ** Purpose :   i-sum computation of an array 
    651652      !! 
    652       !! ** Method  : - i-sum of pva using the interior 2D vmask (vmask_i). 
    653       !! 
    654       !! ** Action  : - p_fval: i-mean poleward flux of pva 
     653      !! ** Method  : - i-sum of field using the interior 2D vmask (pmsk). 
     654      !! 
     655      !! ** Action  : - p_fval: i-sum of masked field 
    655656      !!---------------------------------------------------------------------- 
    656657      !! 
    657658      IMPLICIT none 
    658       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk)           ::   pta    ! mask flux array at V-point 
     659      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj,jpk)           ::   pfld   ! input field to be summed 
    659660      REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)    , OPTIONAL ::   pmsk   ! Optional 2D basin mask 
    660661      !! 
     
    678679!!gm here, use of tmask_i  ==> no need of loop over nldi, nlei.... 
    679680               DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    680                   p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * pmsk(ji,jj) 
     681                  p_fval(jj,jk) = p_fval(jj,jk) + pfld(ji,jj,jk) * pmsk(ji,jj) 
    681682               END DO 
    682683            END DO 
     
    686687            DO jj = 2, jpjm1 
    687688               DO ji =  nldi, nlei   ! No vector optimisation here. Better use a mask ? 
    688                   p_fval(jj,jk) = p_fval(jj,jk) + pta(ji,jj,jk) * tmask_i(ji,jj) 
     689                  p_fval(jj,jk) = p_fval(jj,jk) + pfld(ji,jj,jk) * tmask_i(ji,jj) 
    689690               END DO 
    690691            END DO 
Note: See TracChangeset for help on using the changeset viewer.