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 7646 for trunk/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

Ignore:
Timestamp:
2017-02-06T10:25:03+01:00 (7 years ago)
Author:
timgraham
Message:

Merge of dev_merge_2016 into trunk. UPDATE TO ARCHFILES NEEDED for XIOS2.
LIM_SRC_s/limrhg.F90 to follow in next commit due to change of kind (I'm unable to do it in this commit).
Merged using the following steps:

1) svn merge --reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk .
2) Resolve minor conflicts in sette.sh and namelist_cfg for ORCA2LIM3 (due to a change in trunk after branch was created)
3) svn commit
4) svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
5) svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2016/dev_merge_2016 .
6) At this stage I checked out a clean copy of the branch to compare against what is about to be committed to the trunk.
6) svn commit #Commit code to the trunk

In this commit I have also reverted a change to Fcheck_archfile.sh which was causing problems on the Paris machine.

Location:
trunk/NEMOGCM/NEMO/OPA_SRC/TRA
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/eosbn2.F90

    r6505 r7646  
    204204      !! 
    205205      !!     ln_teos10 : polynomial TEOS-10 equation of state is used for rho(t,s,z). 
    206       !!         Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celcius, sa=35.5 g/kg 
     206      !!         Check value: rho = 1028.21993233072 kg/m^3 for z=3000 dbar, ct=3 Celsius, sa=35.5 g/kg 
    207207      !! 
    208208      !!     ln_eos80 : polynomial EOS-80 equation of state is used for rho(t,s,z). 
    209       !!         Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celcius, sp=35.5 psu 
     209      !!         Check value: rho = 1028.35011066567 kg/m^3 for z=3000 dbar, pt=3 Celsius, sp=35.5 psu 
    210210      !! 
    211211      !!     ln_seos : simplified equation of state 
     
    221221      !!                TEOS-10 Manual, 2010 
    222222      !!---------------------------------------------------------------------- 
    223       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celcius] 
     223      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius] 
    224224      !                                                               ! 2 : salinity               [psu] 
    225225      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::   prd   ! in situ density            [-] 
     
    316316      !! 
    317317      !!---------------------------------------------------------------------- 
    318       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celcius] 
     318      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius] 
    319319      !                                                                ! 2 : salinity               [psu] 
    320320      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::   prd    ! in situ density            [-] 
     
    481481      !! 
    482482      !!---------------------------------------------------------------------- 
    483       REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celcius] 
     483      REAL(wp), DIMENSION(jpi,jpj,jpts), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius] 
    484484      !                                                           ! 2 : salinity               [psu] 
    485485      REAL(wp), DIMENSION(jpi,jpj)     , INTENT(in   ) ::   pdep  ! depth                      [m] 
     
    907907      !! 
    908908      !!---------------------------------------------------------------------- 
    909       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celcius,psu] 
    910       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celcius-1,psu-1] 
     909      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu] 
     910      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1] 
    911911      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2] 
    912912      ! 
     
    944944      !!                 ***  ROUTINE eos_pt_from_ct  *** 
    945945      !! 
    946       !! ** Purpose :   Compute pot.temp. from cons. temp. [Celcius] 
     946      !! ** Purpose :   Compute pot.temp. from cons. temp. [Celsius] 
    947947      !! 
    948948      !! ** Method  :   rational approximation (5/3th order) of TEOS-10 algorithm 
     
    952952      !!                Rational approximation to TEOS10 algorithm (rms error on WOA13 values: 4.0e-5 degC) 
    953953      !!---------------------------------------------------------------------- 
    954       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ctmp   ! Cons. Temp [Celcius] 
    955       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   psal   ! salinity   [psu] 
     954      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   ctmp   ! Cons. Temp   [Celsius] 
     955      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   psal   ! salinity     [psu] 
    956956      ! Leave result array automatic rather than making explicitly allocated 
    957       REAL(wp), DIMENSION(jpi,jpj) ::   ptmp   ! potential temperature [Celcius] 
     957      REAL(wp), DIMENSION(jpi,jpj) ::   ptmp   ! potential temperature [Celsius] 
    958958      ! 
    959959      INTEGER  ::   ji, jj               ! dummy loop indices 
     
    10031003      !!                 ***  ROUTINE eos_fzp  *** 
    10041004      !! 
    1005       !! ** Purpose :   Compute the freezing point temperature [Celcius] 
    1006       !! 
    1007       !! ** Method  :   UNESCO freezing point (ptf) in Celcius is given by 
     1005      !! ** Purpose :   Compute the freezing point temperature [Celsius] 
     1006      !! 
     1007      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by 
    10081008      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z 
    10091009      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m 
     
    10131013      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   psal   ! salinity   [psu] 
    10141014      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m] 
    1015       REAL(wp), DIMENSION(jpi,jpj), INTENT(out  )           ::   ptf    ! freezing temperature [Celcius] 
     1015      REAL(wp), DIMENSION(jpi,jpj), INTENT(out  )           ::   ptf    ! freezing temperature [Celsius] 
    10161016      ! 
    10171017      INTEGER  ::   ji, jj          ! dummy loop indices 
     
    10561056      !!                 ***  ROUTINE eos_fzp  *** 
    10571057      !! 
    1058       !! ** Purpose :   Compute the freezing point temperature [Celcius] 
    1059       !! 
    1060       !! ** Method  :   UNESCO freezing point (ptf) in Celcius is given by 
     1058      !! ** Purpose :   Compute the freezing point temperature [Celsius] 
     1059      !! 
     1060      !! ** Method  :   UNESCO freezing point (ptf) in Celsius is given by 
    10611061      !!       ptf(t,z) = (-.0575+1.710523e-3*sqrt(abs(s))-2.154996e-4*s)*s - 7.53e-4*z 
    10621062      !!       checkvalue: tf=-2.588567 Celsius for s=40psu, z=500m 
     
    10661066      REAL(wp), INTENT(in )           ::   psal         ! salinity   [psu] 
    10671067      REAL(wp), INTENT(in ), OPTIONAL ::   pdep         ! depth      [m] 
    1068       REAL(wp), INTENT(out)           ::   ptf          ! freezing temperature [Celcius] 
     1068      REAL(wp), INTENT(out)           ::   ptf          ! freezing temperature [Celsius] 
    10691069      ! 
    10701070      REAL(wp) :: zs   ! local scalars 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv.F90

    r6140 r7646  
    99   !!            3.7  !  2014-05  (G. Madec)  Add 2nd/4th order cases for CEN and FCT schemes  
    1010   !!             -   !  2014-12  (G. Madec) suppression of cross land advection option 
     11   !!            3.6  !  2015-06  (E. Clementi) Addition of Stokes drift in case of wave coupling 
    1112   !!---------------------------------------------------------------------- 
    1213 
     
    2627   USE ldftra         ! lateral diffusion: eddy diffusivity & EIV coeff. 
    2728   USE ldfslp         ! Lateral diffusion: slopes of neutral surfaces 
     29   USE trd_oce         ! trends: ocean variables 
     30   USE trdtra          ! trends manager: tracers  
    2831   ! 
    2932   USE in_out_manager ! I/O manager 
     
    3336   USE wrk_nemo       ! Memory Allocation 
    3437   USE timing         ! Timing 
    35  
    36    USE diaptr          ! Poleward heat transport  
     38   USE sbcwave        ! wave module 
     39   USE sbc_oce        ! surface boundary condition: ocean 
     40   USE diaptr         ! Poleward heat transport  
    3741 
    3842   IMPLICIT NONE 
     
    8690      INTEGER ::   jk   ! dummy loop index 
    8791      REAL(wp), POINTER, DIMENSION(:,:,:) :: zun, zvn, zwn 
     92      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrdt, ztrds   ! 3D workspace 
    8893      !!---------------------------------------------------------------------- 
    8994      ! 
     
    9398      ! 
    9499      !                                          ! set time step 
     100      zun(:,:,:) = 0.0 
     101      zvn(:,:,:) = 0.0 
     102      zwn(:,:,:) = 0.0 
     103      !     
    95104      IF( neuler == 0 .AND. kt == nit000 ) THEN     ! at nit000 
    96105         r2dt = rdt                                 ! = rdt (restarting with Euler time stepping) 
     
    100109      ! 
    101110      !                                         !==  effective transport  ==! 
    102       DO jk = 1, jpkm1 
    103          zun(:,:,jk) = e2u  (:,:) * e3u_n(:,:,jk) * un(:,:,jk)                  ! eulerian transport only 
    104          zvn(:,:,jk) = e1v  (:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
    105          zwn(:,:,jk) = e1e2t(:,:)                 * wn(:,:,jk) 
    106       END DO 
     111      IF( ln_wave .AND. ln_sdw )  THEN 
     112         DO jk = 1, jpkm1                                                       ! eulerian transport + Stokes Drift 
     113            zun(:,:,jk) = e2u  (:,:) * e3u_n(:,:,jk) * ( un(:,:,jk) + usd(:,:,jk) ) 
     114            zvn(:,:,jk) = e1v  (:,:) * e3v_n(:,:,jk) * ( vn(:,:,jk) + vsd(:,:,jk) ) 
     115            zwn(:,:,jk) = e1e2t(:,:)                 * ( wn(:,:,jk) + wsd(:,:,jk) ) 
     116         END DO 
     117      ELSE 
     118         DO jk = 1, jpkm1 
     119            zun(:,:,jk) = e2u  (:,:) * e3u_n(:,:,jk) * un(:,:,jk)               ! eulerian transport only 
     120            zvn(:,:,jk) = e1v  (:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
     121            zwn(:,:,jk) = e1e2t(:,:)                 * wn(:,:,jk) 
     122         END DO 
     123      ENDIF 
    107124      ! 
    108125      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN                                ! add z-tilde and/or vvl corrections 
     
    127144      IF( ln_diaptr )   CALL dia_ptr( zvn )                                    ! diagnose the effective MSF  
    128145!!gm ??? 
     146      ! 
     147      IF( l_trdtra )   THEN                    !* Save ta and sa trends 
     148         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
     149         ztrdt(:,:,:) = tsa(:,:,:,jp_tem) 
     150         ztrds(:,:,:) = tsa(:,:,:,jp_sal) 
     151      ENDIF 
    129152      ! 
    130153      SELECT CASE ( nadv )                      !==  compute advection trend and add it to general trend  ==! 
     
    145168      END SELECT 
    146169      ! 
    147       !                                         ! print mean trends (used for debugging) 
     170      IF( l_trdtra )   THEN                      ! save the advective trends for further diagnostics 
     171         DO jk = 1, jpkm1 
     172            ztrdt(:,:,jk) = tsa(:,:,jk,jp_tem) - ztrdt(:,:,jk) 
     173            ztrds(:,:,jk) = tsa(:,:,jk,jp_sal) - ztrds(:,:,jk) 
     174         END DO 
     175         CALL trd_tra( kt, 'TRA', jp_tem, jptra_totad, ztrdt ) 
     176         CALL trd_tra( kt, 'TRA', jp_sal, jptra_totad, ztrds ) 
     177         CALL wrk_dealloc( jpi, jpj, jpk, ztrdt, ztrds ) 
     178      ENDIF 
     179      !                                              ! print mean trends (used for debugging) 
    148180      IF(ln_ctl)   CALL prt_ctl( tab3d_1=tsa(:,:,:,jp_tem), clinfo1=' adv  - Ta: ', mask1=tmask,               & 
    149181         &                       tab3d_2=tsa(:,:,:,jp_sal), clinfo2=       ' Sa: ', mask2=tmask, clinfo3='tra' ) 
     
    255287         WRITE(numout,*) 
    256288         SELECT CASE ( nadv ) 
    257          CASE( np_NO_adv  )   ;   WRITE(numout,*) '         NO T-S advection' 
    258          CASE( np_CEN     )   ;   WRITE(numout,*) '         CEN      scheme is used. Horizontal order: ', nn_cen_h,   & 
     289         CASE( np_NO_adv  )   ;   WRITE(numout,*) '      ===>>   NO T-S advection' 
     290         CASE( np_CEN     )   ;   WRITE(numout,*) '      ===>>   CEN      scheme is used. Horizontal order: ', nn_cen_h,   & 
    259291            &                                                                     ' Vertical   order: ', nn_cen_v 
    260          CASE( np_FCT     )   ;   WRITE(numout,*) '         FCT      scheme is used. Horizontal order: ', nn_fct_h,   & 
     292         CASE( np_FCT     )   ;   WRITE(numout,*) '      ===>>   FCT      scheme is used. Horizontal order: ', nn_fct_h,   & 
    261293            &                                                                      ' Vertical   order: ', nn_fct_v 
    262          CASE( np_FCT_zts )   ;   WRITE(numout,*) '         use 2nd order FCT with ', nn_fct_zts,'vertical sub-timestepping' 
    263          CASE( np_MUS     )   ;   WRITE(numout,*) '         MUSCL    scheme is used' 
    264          CASE( np_UBS     )   ;   WRITE(numout,*) '         UBS      scheme is used' 
    265          CASE( np_QCK     )   ;   WRITE(numout,*) '         QUICKEST scheme is used' 
     294         CASE( np_FCT_zts )   ;   WRITE(numout,*) '      ===>>   use 2nd order FCT with ', nn_fct_zts,'vertical sub-timestepping' 
     295         CASE( np_MUS     )   ;   WRITE(numout,*) '      ===>>   MUSCL    scheme is used' 
     296         CASE( np_UBS     )   ;   WRITE(numout,*) '      ===>>   UBS      scheme is used' 
     297         CASE( np_QCK     )   ;   WRITE(numout,*) '      ===>>   QUICKEST scheme is used' 
    266298         END SELECT 
    267299      ENDIF 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_cen.F90

    r6140 r7646  
    1818   USE trdtra         ! trends manager: tracers  
    1919   USE diaptr         ! poleward transport diagnostics 
     20   USE diaar5         ! AR5 diagnostics 
    2021   ! 
    2122   USE in_out_manager ! I/O manager 
     
    3334   REAL(wp) ::   r1_6 = 1._wp / 6._wp   ! =1/6 
    3435 
     36   LOGICAL :: l_trd   ! flag to compute trends 
     37   LOGICAL :: l_ptr   ! flag to compute poleward transport 
     38   LOGICAL :: l_hst   ! flag to compute heat/salt transport 
     39 
    3540   !! * Substitutions 
    3641#  include "vectopt_loop_substitute.h90" 
    3742   !!---------------------------------------------------------------------- 
    3843   !! NEMO/OPA 3.7 , NEMO Consortium (2014) 
    39    !! $Id: traadv_cen2.F90 5737 2015-09-13 07:42:41Z gm $ 
     44   !! $Id$ 
    4045   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4146   !!---------------------------------------------------------------------- 
     
    8893      ENDIF 
    8994      ! 
     95      l_trd = .FALSE. 
     96      l_hst = .FALSE. 
     97      l_ptr = .FALSE. 
     98      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )        l_trd = .TRUE. 
     99      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                                 l_ptr = .TRUE.  
     100      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     101         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )   l_hst = .TRUE. 
     102      ! 
    90103      !                     
    91104      zwz(:,:, 1 ) = 0._wp       ! surface & bottom vertical flux set to zero for all tracers 
     
    184197         END DO 
    185198         !                             ! trend diagnostics 
    186          IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) THEN 
     199         IF( l_trd ) THEN 
    187200            CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 
    188201            CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 
    189202            CALL trd_tra( kt, cdtype, jn, jptra_zad, zwz, pwn, ptn(:,:,:,jn) ) 
    190203         END IF 
    191          !                             ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    192          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    193            IF( jn == jp_tem )   htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    194            IF( jn == jp_sal )   str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    195          ENDIF 
     204         !                                 ! "Poleward" heat and salt transports  
     205         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 
     206         !                                 !  heat and salt transport 
     207         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) ) 
    196208         ! 
    197209      END DO 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_fct.F90

    r6771 r7646  
    2020   USE trdtra         ! tracers trends 
    2121   USE diaptr         ! poleward transport diagnostics 
     22   USE diaar5         ! AR5 diagnostics 
     23   USE phycst, ONLY: rau0_rcp 
    2224   ! 
    2325   USE in_out_manager ! I/O manager 
     26   USE iom 
    2427   USE lib_mpp        ! MPP library 
    2528   USE lbclnk         ! ocean lateral boundary condition (or mpp link)  
     
    3639 
    3740   LOGICAL  ::   l_trd   ! flag to compute trends 
     41   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     42   LOGICAL  ::   l_hst   ! flag to compute heat/salt transport 
    3843   REAL(wp) ::   r1_6 = 1._wp / 6._wp   ! =1/6 
     44 
     45   !                                        ! tridiag solver associated indices: 
     46   INTEGER, PARAMETER ::   np_NH   = 0   ! Neumann homogeneous boundary condition 
     47   INTEGER, PARAMETER ::   np_CEN2 = 1   ! 2nd order centered  boundary condition 
    3948 
    4049   !! * Substitutions 
     
    8089      REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v   !   -      - 
    8190      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw 
    82       REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrdx, ztrdy, ztrdz 
     91      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztrdx, ztrdy, ztrdz, zptry 
     92      REAL(wp), POINTER, DIMENSION(:,:)   :: z2d 
    8393      !!---------------------------------------------------------------------- 
    8494      ! 
     
    94104      ! 
    95105      l_trd = .FALSE. 
    96       IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )   l_trd = .TRUE. 
    97       ! 
    98       IF( l_trd )  THEN 
     106      l_hst = .FALSE. 
     107      l_ptr = .FALSE. 
     108      IF( ( cdtype == 'TRA'   .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )     l_trd = .TRUE. 
     109      IF(   cdtype == 'TRA'   .AND. ln_diaptr )                                              l_ptr = .TRUE.  
     110      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     111         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE. 
     112      ! 
     113      IF( l_trd .OR. l_hst )  THEN 
    99114         CALL wrk_alloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
    100115         ztrdx(:,:,:) = 0._wp   ;    ztrdy(:,:,:) = 0._wp   ;   ztrdz(:,:,:) = 0._wp 
    101116      ENDIF 
    102117      ! 
     118      IF( l_ptr ) THEN   
     119         CALL wrk_alloc( jpi, jpj, jpk, zptry ) 
     120         zptry(:,:,:) = 0._wp 
     121      ENDIF 
    103122      !                          ! surface & bottom value : flux set to zero one for all 
    104123      zwz(:,:, 1 ) = 0._wp             
     
    161180         CALL lbc_lnk( zwi, 'T', 1. )  ! Lateral boundary conditions on zwi  (unchanged sign) 
    162181         !                 
    163          IF( l_trd )  THEN             ! trend diagnostics (contribution of upstream fluxes) 
     182         IF( l_trd .OR. l_hst )  THEN             ! trend diagnostics (contribution of upstream fluxes) 
    164183            ztrdx(:,:,:) = zwx(:,:,:)   ;   ztrdy(:,:,:) = zwy(:,:,:)   ;   ztrdz(:,:,:) = zwz(:,:,:) 
    165184         END IF 
    166185         !                             ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    167          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    168            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    169            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    170          ENDIF 
     186         IF( l_ptr )  zptry(:,:,:) = zwy(:,:,:)  
    171187         ! 
    172188         !        !==  anti-diffusive flux : high order minus low order  ==! 
     
    292308         END DO 
    293309         ! 
    294          IF( l_trd ) THEN     ! trend diagnostics (contribution of upstream fluxes) 
     310         IF( l_trd .OR. l_hst ) THEN     ! trend diagnostics (contribution of upstream fluxes) 
    295311            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< Add to previously computed 
    296312            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
    297313            ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:)  ! <<< Add to previously computed 
    298             ! 
     314         ENDIF 
     315            ! 
     316         IF( l_trd ) THEN  
    299317            CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 
    300318            CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 
    301319            CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 
    302320            ! 
    303             CALL wrk_dealloc( jpi,jpj,jpk,   ztrdx, ztrdy, ztrdz ) 
    304321         END IF 
    305          !                    ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    306          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    307            IF( jn == jp_tem )   htr_adv(:) = htr_adv(:) + ptr_sj( zwy(:,:,:) ) 
    308            IF( jn == jp_sal )   str_adv(:) = str_adv(:) + ptr_sj( zwy(:,:,:) ) 
     322         !                                !  heat/salt transport 
     323         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 
     324 
     325         !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     326         IF( l_ptr ) THEN   
     327            zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
     328            CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) ) 
    309329         ENDIF 
    310330         ! 
    311331      END DO                     ! end of tracer loop 
    312332      ! 
    313       CALL wrk_dealloc( jpi,jpj,jpk,    zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 
     333                              CALL wrk_dealloc( jpi,jpj,jpk,    zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw ) 
     334      IF( l_trd .OR. l_hst )  CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
     335      IF( l_ptr )             CALL wrk_dealloc( jpi, jpj, jpk, zptry ) 
    314336      ! 
    315337      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_fct') 
     
    357379      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zwi, zwx, zwy, zwz, zhdiv, zwzts, zwz_sav 
    358380      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   ztrdx, ztrdy, ztrdz 
     381      REAL(wp), POINTER, DIMENSION(:,:,:) :: zptry 
    359382      REAL(wp), POINTER, DIMENSION(:,:,:,:) ::   ztrs 
    360383      !!---------------------------------------------------------------------- 
     
    373396      ! 
    374397      l_trd = .FALSE. 
    375       IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )   l_trd = .TRUE. 
    376       ! 
    377       IF( l_trd )  THEN 
     398      l_hst = .FALSE. 
     399      l_ptr = .FALSE. 
     400      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
     401      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                               l_ptr = .TRUE.  
     402      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     403         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) ) l_hst = .TRUE. 
     404      ! 
     405      IF( l_trd .OR. l_hst )  THEN 
    378406         CALL wrk_alloc( jpi,jpj,jpk,   ztrdx, ztrdy, ztrdz ) 
    379407         ztrdx(:,:,:) = 0._wp  ;    ztrdy(:,:,:) = 0._wp  ;   ztrdz(:,:,:) = 0._wp 
    380408      ENDIF 
    381409      ! 
     410      IF( l_ptr ) THEN   
     411         CALL wrk_alloc( jpi, jpj,jpk, zptry ) 
     412         zptry(:,:,:) = 0._wp 
     413      ENDIF 
    382414      zwi(:,:,:) = 0._wp 
    383415      z_rzts = 1._wp / REAL( kn_fct_zts, wp ) 
     
    445477         CALL lbc_lnk( zwi, 'T', 1. )     ! Lateral boundary conditions on zwi  (unchanged sign) 
    446478         !                 
    447          IF( l_trd )  THEN                ! trend diagnostics (contribution of upstream fluxes) 
     479         IF( l_trd .OR. l_hst )  THEN                ! trend diagnostics (contribution of upstream fluxes) 
    448480            ztrdx(:,:,:) = zwx(:,:,:)   ;    ztrdy(:,:,:) = zwy(:,:,:)  ;   ztrdz(:,:,:) = zwz(:,:,:) 
    449481         END IF 
    450482         !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    451          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    452            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    453            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    454          ENDIF 
     483         IF( l_ptr )  zptry(:,:,:) = zwy(:,:,:) 
    455484 
    456485         ! 3. anti-diffusive flux : high order minus low order 
     
    568597         END DO 
    569598 
    570          !                                 ! trend diagnostics (contribution of upstream fluxes) 
    571          IF( l_trd )  THEN  
     599        ! 
     600         IF( l_trd .OR. l_hst ) THEN     ! trend diagnostics (contribution of upstream fluxes) 
    572601            ztrdx(:,:,:) = ztrdx(:,:,:) + zwx(:,:,:)  ! <<< Add to previously computed 
    573602            ztrdy(:,:,:) = ztrdy(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
    574603            ztrdz(:,:,:) = ztrdz(:,:,:) + zwz(:,:,:)  ! <<< Add to previously computed 
    575             ! 
    576             CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) )    
    577             CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) )   
    578             CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) )  
    579             ! 
    580             CALL wrk_dealloc( jpi,jpj,jpk,   ztrdx, ztrdy, ztrdz ) 
     604         ENDIF 
     605            ! 
     606         IF( l_trd ) THEN  
     607            CALL trd_tra( kt, cdtype, jn, jptra_xad, ztrdx, pun, ptn(:,:,:,jn) ) 
     608            CALL trd_tra( kt, cdtype, jn, jptra_yad, ztrdy, pvn, ptn(:,:,:,jn) ) 
     609            CALL trd_tra( kt, cdtype, jn, jptra_zad, ztrdz, pwn, ptn(:,:,:,jn) ) 
     610            ! 
    581611         END IF 
    582          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    583          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    584            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) + htr_adv(:) 
    585            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) + str_adv(:) 
     612         !                                             ! heat/salt transport 
     613         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', ztrdx(:,:,:), ztrdy(:,:,:) ) 
     614 
     615         !                                            ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     616         IF( l_ptr ) THEN   
     617            zptry(:,:,:) = zptry(:,:,:) + zwy(:,:,:)  ! <<< Add to previously computed 
     618            CALL dia_ptr_hst( jn, 'adv', zptry(:,:,:) ) 
    586619         ENDIF 
    587620         ! 
    588621      END DO 
    589622      ! 
    590       CALL wrk_alloc( jpi,jpj,             zwx_sav, zwy_sav ) 
    591       CALL wrk_alloc( jpi,jpj, jpk,        zwx, zwy, zwz, zwi, zhdiv, zwzts, zwz_sav ) 
    592       CALL wrk_alloc( jpi,jpj,jpk,kjpt+1,  ztrs ) 
     623                              CALL wrk_alloc( jpi,jpj,             zwx_sav, zwy_sav ) 
     624                              CALL wrk_alloc( jpi,jpj, jpk,        zwx, zwy, zwz, zwi, zhdiv, zwzts, zwz_sav ) 
     625                              CALL wrk_alloc( jpi,jpj,jpk,kjpt+1,  ztrs ) 
     626      IF( l_trd .OR. l_hst )  CALL wrk_dealloc( jpi, jpj, jpk, ztrdx, ztrdy, ztrdz ) 
     627      IF( l_ptr )             CALL wrk_dealloc( jpi, jpj, jpk, zptry ) 
    593628      ! 
    594629      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_fct_zts') 
     
    706741 
    707742 
    708    SUBROUTINE interp_4th_cpt( pt_in, pt_out ) 
    709       !!---------------------------------------------------------------------- 
    710       !!                  ***  ROUTINE interp_4th_cpt  *** 
     743   SUBROUTINE interp_4th_cpt_org( pt_in, pt_out ) 
     744      !!---------------------------------------------------------------------- 
     745      !!                  ***  ROUTINE interp_4th_cpt_org  *** 
    711746      !!  
    712747      !! **  Purpose :   Compute the interpolation of tracer at w-point 
     
    739774      END DO 
    740775      ! 
    741       jk=2                                            ! Switch to second order centered at top 
    742       DO jj=1,jpj 
    743          DO ji=1,jpi 
     776      jk = 2                                          ! Switch to second order centered at top 
     777      DO jj = 1, jpj 
     778         DO ji = 1, jpi 
    744779            zwd (ji,jj,jk) = 1._wp 
    745780            zwi (ji,jj,jk) = 0._wp 
     
    789824      END DO 
    790825      !     
     826   END SUBROUTINE interp_4th_cpt_org 
     827    
     828 
     829   SUBROUTINE interp_4th_cpt( pt_in, pt_out ) 
     830      !!---------------------------------------------------------------------- 
     831      !!                  ***  ROUTINE interp_4th_cpt  *** 
     832      !!  
     833      !! **  Purpose :   Compute the interpolation of tracer at w-point 
     834      !! 
     835      !! **  Method  :   4th order compact interpolation 
     836      !!---------------------------------------------------------------------- 
     837      REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt_in    ! field at t-point 
     838      REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point 
     839      ! 
     840      INTEGER ::   ji, jj, jk   ! dummy loop integers 
     841      INTEGER ::   ikt, ikb     ! local integers 
     842      REAL(wp),DIMENSION(jpi,jpj,jpk) :: zwd, zwi, zws, zwrm, zwt 
     843      !!---------------------------------------------------------------------- 
     844      ! 
     845      !                      !==  build the three diagonal matrix & the RHS  ==! 
     846      ! 
     847      DO jk = 3, jpkm1                 ! interior (from jk=3 to jpk-1) 
     848         DO jj = 2, jpjm1 
     849            DO ji = fs_2, fs_jpim1 
     850               zwd (ji,jj,jk) = 3._wp * wmask(ji,jj,jk) + 1._wp                 !       diagonal 
     851               zwi (ji,jj,jk) =         wmask(ji,jj,jk)                         ! lower diagonal 
     852               zws (ji,jj,jk) =         wmask(ji,jj,jk)                         ! upper diagonal 
     853               zwrm(ji,jj,jk) = 3._wp * wmask(ji,jj,jk)                     &   ! RHS 
     854                  &           *       ( pt_in(ji,jj,jk) + pt_in(ji,jj,jk-1) ) 
     855            END DO 
     856         END DO 
     857      END DO 
     858      ! 
     859!!gm 
     860!      SELECT CASE( kbc )               !* boundary condition 
     861!      CASE( np_NH   )   ! Neumann homogeneous at top & bottom 
     862!      CASE( np_CEN2 )   ! 2nd order centered  at top & bottom 
     863!      END SELECT 
     864!!gm   
     865      ! 
     866      DO jj = 2, jpjm1                 ! 2nd order centered at top & bottom 
     867         DO ji = fs_2, fs_jpim1 
     868            ikt = mikt(ji,jj) + 1            ! w-point below the 1st  wet point 
     869            ikb = mbkt(ji,jj)                !     -   above the last wet point 
     870            ! 
     871            zwd (ji,jj,ikt) = 1._wp          ! top 
     872            zwi (ji,jj,ikt) = 0._wp 
     873            zws (ji,jj,ikt) = 0._wp 
     874            zwrm(ji,jj,ikt) = 0.5_wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) ) 
     875            ! 
     876            zwd (ji,jj,ikb) = 1._wp          ! bottom 
     877            zwi (ji,jj,ikb) = 0._wp 
     878            zws (ji,jj,ikb) = 0._wp 
     879            zwrm(ji,jj,ikb) = 0.5_wp * ( pt_in(ji,jj,jk-1) + pt_in(ji,jj,jk) )             
     880         END DO 
     881      END DO    
     882      ! 
     883      !                       !==  tridiagonal solver  ==! 
     884      ! 
     885      DO jj = 2, jpjm1              !* 1st recurrence:   Tk = Dk - Ik Sk-1 / Tk-1 
     886         DO ji = fs_2, fs_jpim1 
     887            zwt(ji,jj,2) = zwd(ji,jj,2) 
     888         END DO 
     889      END DO 
     890      DO jk = 3, jpkm1 
     891         DO jj = 2, jpjm1 
     892            DO ji = fs_2, fs_jpim1 
     893               zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) /zwt(ji,jj,jk-1) 
     894            END DO 
     895         END DO 
     896      END DO 
     897      ! 
     898      DO jj = 2, jpjm1              !* 2nd recurrence:    Zk = Yk - Ik / Tk-1  Zk-1 
     899         DO ji = fs_2, fs_jpim1 
     900            pt_out(ji,jj,2) = zwrm(ji,jj,2) 
     901         END DO 
     902      END DO 
     903      DO jk = 3, jpkm1 
     904         DO jj = 2, jpjm1 
     905            DO ji = fs_2, fs_jpim1 
     906               pt_out(ji,jj,jk) = zwrm(ji,jj,jk) - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1)              
     907            END DO 
     908         END DO 
     909      END DO 
     910 
     911      DO jj = 2, jpjm1              !* 3d recurrence:    Xk = (Zk - Sk Xk+1 ) / Tk 
     912         DO ji = fs_2, fs_jpim1 
     913            pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 
     914         END DO 
     915      END DO 
     916      DO jk = jpk-2, 2, -1 
     917         DO jj = 2, jpjm1 
     918            DO ji = fs_2, fs_jpim1 
     919               pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - zws(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 
     920            END DO 
     921         END DO 
     922      END DO 
     923      !     
    791924   END SUBROUTINE interp_4th_cpt 
    792     
     925 
     926 
     927   SUBROUTINE tridia_solver( pD, pU, pL, pRHS, pt_out , klev ) 
     928      !!---------------------------------------------------------------------- 
     929      !!                  ***  ROUTINE tridia_solver  *** 
     930      !!  
     931      !! **  Purpose :   solve a symmetric 3diagonal system 
     932      !! 
     933      !! **  Method  :   solve M.t_out = RHS(t)  where M is a tri diagonal matrix ( jpk*jpk ) 
     934      !!      
     935      !!             ( D_1 U_1  0   0   0  )( t_1 )   ( RHS_1 ) 
     936      !!             ( L_2 D_2 U_2  0   0  )( t_2 )   ( RHS_2 ) 
     937      !!             (  0  L_3 D_3 U_3  0  )( t_3 ) = ( RHS_3 ) 
     938      !!             (        ...          )( ... )   ( ...  ) 
     939      !!             (  0   0   0  L_k D_k )( t_k )   ( RHS_k ) 
     940      !!      
     941      !!        M is decomposed in the product of an upper and lower triangular matrix. 
     942      !!        The tri-diagonals matrix is given as input 3D arrays:   pD, pU, pL  
     943      !!        (i.e. the Diagonal, the Upper diagonal, and the Lower diagonal). 
     944      !!        The solution is pta. 
     945      !!        The 3d array zwt is used as a work space array. 
     946      !!---------------------------------------------------------------------- 
     947      REAL(wp),DIMENSION(:,:,:), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix 
     948      REAL(wp),DIMENSION(:,:,:), INTENT(in   ) ::   pRHS          ! Right-Hand-Side 
     949      REAL(wp),DIMENSION(:,:,:), INTENT(  out) ::   pt_out        !!gm field at level=F(klev) 
     950      INTEGER                  , INTENT(in   ) ::   klev          ! =1 pt_out at w-level  
     951      !                                                           ! =0 pt at t-level 
     952      INTEGER ::   ji, jj, jk   ! dummy loop integers 
     953      INTEGER ::   kstart       ! local indices 
     954      REAL(wp),DIMENSION(jpi,jpj,jpk) ::   zwt   ! 3D work array 
     955      !!---------------------------------------------------------------------- 
     956      ! 
     957      kstart =  1  + klev 
     958      ! 
     959      DO jj = 2, jpjm1              !* 1st recurrence:   Tk = Dk - Ik Sk-1 / Tk-1 
     960         DO ji = fs_2, fs_jpim1 
     961            zwt(ji,jj,kstart) = pD(ji,jj,kstart) 
     962         END DO 
     963      END DO 
     964      DO jk = kstart+1, jpkm1 
     965         DO jj = 2, jpjm1 
     966            DO ji = fs_2, fs_jpim1 
     967               zwt(ji,jj,jk) = pD(ji,jj,jk) - pL(ji,jj,jk) * pU(ji,jj,jk-1) /zwt(ji,jj,jk-1) 
     968            END DO 
     969         END DO 
     970      END DO 
     971      ! 
     972      DO jj = 2, jpjm1              !* 2nd recurrence:    Zk = Yk - Ik / Tk-1  Zk-1 
     973         DO ji = fs_2, fs_jpim1 
     974            pt_out(ji,jj,kstart) = pRHS(ji,jj,kstart) 
     975         END DO 
     976      END DO 
     977      DO jk = kstart+1, jpkm1 
     978         DO jj = 2, jpjm1 
     979            DO ji = fs_2, fs_jpim1 
     980               pt_out(ji,jj,jk) = pRHS(ji,jj,jk) - pL(ji,jj,jk) / zwt(ji,jj,jk-1) *pt_out(ji,jj,jk-1)              
     981            END DO 
     982         END DO 
     983      END DO 
     984 
     985      DO jj = 2, jpjm1              !* 3d recurrence:    Xk = (Zk - Sk Xk+1 ) / Tk 
     986         DO ji = fs_2, fs_jpim1 
     987            pt_out(ji,jj,jpkm1) = pt_out(ji,jj,jpkm1) / zwt(ji,jj,jpkm1) 
     988         END DO 
     989      END DO 
     990      DO jk = jpk-2, kstart, -1 
     991         DO jj = 2, jpjm1 
     992            DO ji = fs_2, fs_jpim1 
     993               pt_out(ji,jj,jk) = ( pt_out(ji,jj,jk) - pU(ji,jj,jk) * pt_out(ji,jj,jk+1) ) / zwt(ji,jj,jk) 
     994            END DO 
     995         END DO 
     996      END DO 
     997      ! 
     998   END SUBROUTINE tridia_solver 
     999 
    7931000   !!====================================================================== 
    7941001END MODULE traadv_fct 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mle.F90

    r6140 r7646  
    308308         WRITE(numout,*) 
    309309         IF( ln_mle ) THEN 
    310             WRITE(numout,*) '   Mixed Layer Eddy induced transport added to tracer advection' 
    311             IF( nn_mle == 0 )   WRITE(numout,*) '   Fox-Kemper et al 2010 formulation' 
    312             IF( nn_mle == 1 )   WRITE(numout,*) '   New formulation' 
     310            WRITE(numout,*) '      ===>>   Mixed Layer Eddy induced transport added to tracer advection' 
     311            IF( nn_mle == 0 )   WRITE(numout,*) '              Fox-Kemper et al 2010 formulation' 
     312            IF( nn_mle == 1 )   WRITE(numout,*) '              New formulation' 
    313313         ELSE 
    314             WRITE(numout,*) '   Mixed Layer Eddy parametrisation NOT used' 
     314            WRITE(numout,*) '      ===>>   Mixed Layer Eddy parametrisation NOT used' 
    315315         ENDIF 
    316316      ENDIF 
     
    329329            DO jj = 2, jpj                           ! "coriolis+ time^-1" at u- & v-points 
    330330               DO ji = fs_2, jpi   ! vector opt. 
    331                   zfu = ( ff(ji,jj) + ff(ji,jj-1) ) * 0.5_wp 
    332                   zfv = ( ff(ji,jj) + ff(ji-1,jj) ) * 0.5_wp 
     331                  zfu = ( ff_f(ji,jj) + ff_f(ji,jj-1) ) * 0.5_wp 
     332                  zfv = ( ff_f(ji,jj) + ff_f(ji-1,jj) ) * 0.5_wp 
    333333                  rfu(ji,jj) = SQRT(  zfu * zfu + z1_t2 ) 
    334334                  rfv(ji,jj) = SQRT(  zfv * zfv + z1_t2 ) 
     
    347347         ! 
    348348         z1_t2 = 1._wp / ( rn_time * rn_time ) 
    349          r1_ft(:,:) = 2._wp * omega * SIN( rad * gphit(:,:) ) 
    350          r1_ft(:,:) = 1._wp / SQRT(  r1_ft(:,:) * r1_ft(:,:) + z1_t2 ) 
     349         r1_ft(:,:) = 1._wp / SQRT(  ff_t(:,:) * ff_t(:,:) + z1_t2  ) 
    351350         ! 
    352351      ENDIF 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_mus.F90

    r6140 r7646  
    2323   USE sbcrnf         ! river runoffs 
    2424   USE diaptr         ! poleward transport diagnostics 
     25   USE diaar5         ! AR5 diagnostics 
     26 
    2527   ! 
     28   USE iom 
    2629   USE wrk_nemo       ! Memory Allocation 
    2730   USE timing         ! Timing 
     
    3740    
    3841   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   upsmsk   !: mixed upstream/centered scheme near some straits 
    39    !                                                           !  and in closed seas (orca 2 and 4 configurations) 
     42   !                                                           !  and in closed seas (orca 2 and 1 configurations) 
    4043   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   xind     !: mixed upstream/centered index 
    4144    
     45   LOGICAL  ::   l_trd   ! flag to compute trends 
     46   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     47   LOGICAL  ::   l_hst   ! flag to compute heat/salt transport 
     48 
    4249   !! * Substitutions 
    4350#  include "vectopt_loop_substitute.h90" 
     
    116123      ENDIF  
    117124      !       
     125      l_trd = .FALSE. 
     126      l_hst = .FALSE. 
     127      l_ptr = .FALSE. 
     128      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
     129      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                               l_ptr = .TRUE.  
     130      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     131         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) ) l_hst = .TRUE. 
     132      ! 
    118133      DO jn = 1, kjpt            !==  loop over the tracers  ==! 
    119134         ! 
     
    192207         END DO         
    193208         !                                ! trend diagnostics 
    194          IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR.   & 
    195             &( cdtype == 'TRC' .AND. l_trdtrc )      )  THEN 
     209         IF( l_trd )  THEN 
    196210            CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptb(:,:,:,jn) ) 
    197211            CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptb(:,:,:,jn) ) 
    198212         END IF 
    199          !                                ! "Poleward" heat and salt transports 
    200          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    201             IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    202             IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    203          ENDIF 
     213         !                                 ! "Poleward" heat and salt transports  
     214         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 
     215         !                                 !  heat transport 
     216         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', zwx(:,:,:), zwy(:,:,:) ) 
    204217         ! 
    205218         !                          !* Vertical advective fluxes 
     
    262275         END DO 
    263276         !                                ! send trends for diagnostic 
    264          IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR.     & 
    265             &( cdtype == 'TRC' .AND. l_trdtrc )      )   & 
    266             CALL trd_tra( kt, cdtype, jn, jptra_zad, zwx, pwn, ptb(:,:,:,jn) ) 
     277         IF( l_trd )  CALL trd_tra( kt, cdtype, jn, jptra_zad, zwx, pwn, ptb(:,:,:,jn) ) 
    267278         ! 
    268279      END DO                     ! end of tracer loop 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_qck.F90

    r6140 r7646  
    3434   PUBLIC   tra_adv_qck   ! routine called by step.F90 
    3535 
    36    LOGICAL  :: l_trd           ! flag to compute trends 
    3736   REAL(wp) :: r1_6 = 1./ 6.   ! 1/6 ratio 
     37 
     38   LOGICAL  ::   l_trd   ! flag to compute trends 
     39   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     40 
    3841 
    3942   !! * Substitutions 
     
    103106      ! 
    104107      l_trd = .FALSE. 
    105       IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )   l_trd = .TRUE. 
     108      l_ptr = .FALSE. 
     109      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
     110      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                               l_ptr = .TRUE.  
     111      ! 
    106112      ! 
    107113      !        ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme 
     
    224230         END DO 
    225231         !                                 ! trend diagnostics 
    226          IF( l_trd )   CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 
     232         IF( l_trd )                     CALL trd_tra( kt, cdtype, jn, jptra_xad, zwx, pun, ptn(:,:,:,jn) ) 
    227233         ! 
    228234      END DO 
     
    347353         END DO 
    348354         !                                 ! trend diagnostics 
    349          IF( l_trd )   CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 
     355         IF( l_trd )                     CALL trd_tra( kt, cdtype, jn, jptra_yad, zwy, pvn, ptn(:,:,:,jn) ) 
    350356         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    351          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    352            IF( jn == jp_tem )  htr_adv(:) = ptr_sj( zwy(:,:,:) ) 
    353            IF( jn == jp_sal )  str_adv(:) = ptr_sj( zwy(:,:,:) ) 
    354          ENDIF 
     357         IF( l_ptr )                     CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) ) 
    355358         ! 
    356359      END DO 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90

    r6140 r7646  
    1919   USE trdtra         ! trends manager: tracers  
    2020   USE diaptr         ! poleward transport diagnostics 
     21   USE diaar5         ! AR5 diagnostics 
     22 
    2123   ! 
     24   USE iom 
    2225   USE lib_mpp        ! I/O library 
    2326   USE lbclnk         ! ocean lateral boundary condition (or mpp link) 
     
    3235   PUBLIC   tra_adv_ubs   ! routine called by traadv module 
    3336 
    34    LOGICAL :: l_trd  ! flag to compute trends or not 
     37   LOGICAL :: l_trd   ! flag to compute trends 
     38   LOGICAL :: l_ptr   ! flag to compute poleward transport 
     39   LOGICAL :: l_hst   ! flag to compute heat transport 
     40 
    3541 
    3642   !! * Substitutions 
     
    109115      ! 
    110116      l_trd = .FALSE. 
    111       IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) ) l_trd = .TRUE. 
     117      l_hst = .FALSE. 
     118      l_ptr = .FALSE. 
     119      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE. 
     120      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                               l_ptr = .TRUE.  
     121      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     122         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) ) l_hst = .TRUE. 
    112123      ! 
    113124      ztw (:,:, 1 ) = 0._wp      ! surface & bottom value : set to zero for all tracers 
     
    176187             CALL trd_tra( kt, cdtype, jn, jptra_yad, ztv, pvn, ptn(:,:,:,jn) ) 
    177188         END IF 
    178          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
    179          IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN   
    180             IF( jn == jp_tem )  htr_adv(:) = ptr_sj( ztv(:,:,:) ) 
    181             IF( jn == jp_sal )  str_adv(:) = ptr_sj( ztv(:,:,:) ) 
    182          ENDIF 
     189         !      
     190         !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes) 
     191         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', ztv(:,:,:) ) 
     192         !                                !  heati/salt transport 
     193         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', ztu(:,:,:), ztv(:,:,:) ) 
     194         ! 
    183195         ! 
    184196         !                       !== vertical advective trend  ==! 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/trabbc.F90

    r6140 r7646  
    176176            ! fill sf_chl with sn_chl and control print 
    177177            CALL fld_fill( sf_qgh, (/ sn_qgh /), cn_dir, 'tra_bbc_init',   & 
    178                &          'bottom temperature boundary condition', 'nambbc' ) 
     178               &          'bottom temperature boundary condition', 'nambbc', no_print ) 
    179179 
    180180            CALL fld_read( nit000, 1, sf_qgh )                         ! Read qgh data 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/trabbl.F90

    r6140 r7646  
    519519         WRITE(numout,*) 'tra_bbl_init : bottom boundary layer initialisation' 
    520520         WRITE(numout,*) '~~~~~~~~~~~~' 
    521          WRITE(numout,*) '       Namelist nambbl : set bbl parameters' 
    522          WRITE(numout,*) '          diffusive bbl (=1)   or not (=0)    nn_bbl_ldf = ', nn_bbl_ldf 
    523          WRITE(numout,*) '          advective bbl (=1/2) or not (=0)    nn_bbl_adv = ', nn_bbl_adv 
    524          WRITE(numout,*) '          diffusive bbl coefficient           rn_ahtbbl  = ', rn_ahtbbl, ' m2/s' 
    525          WRITE(numout,*) '          advective bbl coefficient           rn_gambbl  = ', rn_gambbl, ' s' 
     521         WRITE(numout,*) '   Namelist nambbl : set bbl parameters' 
     522         WRITE(numout,*) '      diffusive bbl (=1)   or not (=0)    nn_bbl_ldf = ', nn_bbl_ldf 
     523         WRITE(numout,*) '      advective bbl (=1/2) or not (=0)    nn_bbl_adv = ', nn_bbl_adv 
     524         WRITE(numout,*) '      diffusive bbl coefficient           rn_ahtbbl  = ', rn_ahtbbl, ' m2/s' 
     525         WRITE(numout,*) '      advective bbl coefficient           rn_gambbl  = ', rn_gambbl, ' s' 
    526526      ENDIF 
    527527 
     
    545545      CALL wrk_dealloc( jpi, jpj, zmbk ) 
    546546 
    547                                         !* sign of grad(H) at u- and v-points 
     547      !                                 !* sign of grad(H) at u- and v-points 
    548548      mgrhu(jpi,:) = 0   ;   mgrhu(:,jpj) = 0   ;   mgrhv(jpi,:) = 0   ;   mgrhv(:,jpj) = 0 
    549549      DO jj = 1, jpjm1 
     
    553553         END DO 
    554554      END DO 
    555  
     555      ! 
    556556      DO jj = 1, jpjm1              !* bbl thickness at u- (v-) point 
    557557         DO ji = 1, jpim1                 ! minimum of top & bottom e3u_0 (e3v_0) 
     
    561561      END DO 
    562562      CALL lbc_lnk( e3u_bbl_0, 'U', 1. )   ;   CALL lbc_lnk( e3v_bbl_0, 'V', 1. )      ! lateral boundary conditions 
    563  
     563      ! 
    564564      !                             !* masked diffusive flux coefficients 
    565565      ahu_bbl_0(:,:) = rn_ahtbbl * e2_e1u(:,:) * e3u_bbl_0(:,:) * umask(:,:,1) 
    566566      ahv_bbl_0(:,:) = rn_ahtbbl * e1_e2v(:,:) * e3v_bbl_0(:,:) * vmask(:,:,1) 
    567567 
    568  
    569       IF( cp_cfg == "orca" ) THEN   !* ORCA configuration : regional enhancement of ah_bbl 
    570          ! 
    571          SELECT CASE ( jp_cfg ) 
    572          CASE ( 2 )                          ! ORCA_R2 
    573             ij0 = 102   ;   ij1 = 102              ! Gibraltar enhancement of BBL 
    574             ii0 = 139   ;   ii1 = 140 
    575             ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) =  4.e0*ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    576             ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) =  4.e0*ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    577             ! 
    578             ij0 =  88   ;   ij1 =  88              ! Red Sea enhancement of BBL 
    579             ii0 = 161   ;   ii1 = 162 
    580             ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) = 10.e0*ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    581             ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) = 10.e0*ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    582             ! 
    583          CASE ( 4 )                          ! ORCA_R4 
    584             ij0 =  52   ;   ij1 =  52              ! Gibraltar enhancement of BBL 
    585             ii0 =  70   ;   ii1 =  71 
    586             ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) =  4.e0*ahu_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    587             ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) =  4.e0*ahv_bbl_0(mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1)) 
    588          END SELECT 
    589          ! 
    590       ENDIF 
    591568      ! 
    592569      IF( nn_timing == 1 )  CALL timing_stop( 'tra_bbl_init') 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/tradmp.F90

    r6140 r7646  
    192192         WRITE(numout,*) 
    193193         WRITE(numout,*) 'tra_dmp_init : T and S newtonian relaxation' 
    194          WRITE(numout,*) '~~~~~~~~~~~' 
     194         WRITE(numout,*) '~~~~~~~~~~~~' 
    195195         WRITE(numout,*) '   Namelist namtra_dmp : set relaxation parameters' 
    196196         WRITE(numout,*) '      Apply relaxation   or not       ln_tradmp = ', ln_tradmp 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf.F90

    r6352 r7646  
    110110         WRITE(numout,*) 
    111111         WRITE(numout,*) 'tra_ldf_init : lateral tracer diffusive operator' 
    112          WRITE(numout,*) '~~~~~~~~~~~' 
     112         WRITE(numout,*) '~~~~~~~~~~~~' 
    113113         WRITE(numout,*) '   Namelist namtra_ldf: already read in ldftra module' 
    114114         WRITE(numout,*) '      see ldf_tra_init report for lateral mixing parameters' 
    115          WRITE(numout,*) 
    116115      ENDIF 
    117116      !                                   ! use of lateral operator or not 
     
    187186         WRITE(numout,*) 
    188187         SELECT CASE( nldf ) 
    189          CASE( np_no_ldf )   ;   WRITE(numout,*) '   NO lateral diffusion' 
    190          CASE( np_lap    )   ;   WRITE(numout,*) '   laplacian iso-level operator' 
    191          CASE( np_lap_i  )   ;   WRITE(numout,*) '   Rotated laplacian operator (standard)' 
    192          CASE( np_lap_it )   ;   WRITE(numout,*) '   Rotated laplacian operator (triad)' 
    193          CASE( np_blp    )   ;   WRITE(numout,*) '   bilaplacian iso-level operator' 
    194          CASE( np_blp_i  )   ;   WRITE(numout,*) '   Rotated bilaplacian operator (standard)' 
    195          CASE( np_blp_it )   ;   WRITE(numout,*) '   Rotated bilaplacian operator (triad)' 
     188         CASE( np_no_ldf )   ;   WRITE(numout,*) '      ===>>   NO lateral diffusion' 
     189         CASE( np_lap    )   ;   WRITE(numout,*) '      ===>>   laplacian iso-level operator' 
     190         CASE( np_lap_i  )   ;   WRITE(numout,*) '      ===>>   Rotated laplacian operator (standard)' 
     191         CASE( np_lap_it )   ;   WRITE(numout,*) '      ===>>   Rotated laplacian operator (triad)' 
     192         CASE( np_blp    )   ;   WRITE(numout,*) '      ===>>   bilaplacian iso-level operator' 
     193         CASE( np_blp_i  )   ;   WRITE(numout,*) '      ===>>   Rotated bilaplacian operator (standard)' 
     194         CASE( np_blp_it )   ;   WRITE(numout,*) '      ===>>   Rotated bilaplacian operator (triad)' 
    196195         END SELECT 
    197196      ENDIF 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_iso.F90

    r6140 r7646  
    2424   USE ldfslp         ! iso-neutral slopes 
    2525   USE diaptr         ! poleward transport diagnostics 
     26   USE diaar5         ! AR5 diagnostics 
    2627   ! 
    2728   USE in_out_manager ! I/O manager 
     
    3637 
    3738   PUBLIC   tra_ldf_iso   ! routine called by step.F90 
     39 
     40   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     41   LOGICAL  ::   l_hst   ! flag to compute heat transport 
    3842 
    3943   !! * Substitutions 
     
    107111      REAL(wp) ::  zmskv, zahv_w, zabe2, zcof2, zcoef4   !   -      - 
    108112      REAL(wp) ::  zcoef0, ze3w_2, zsign, z2dt, z1_2dt   !   -      - 
    109 #if defined key_diaar5 
    110       REAL(wp) ::   zztmp   ! local scalar 
    111 #endif 
    112113      REAL(wp), POINTER, DIMENSION(:,:)   ::   zdkt, zdk1t, z2d 
    113114      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdit, zdjt, zftu, zftv, ztfw  
     
    127128         ah_wslp2(:,:,:) = 0._wp 
    128129      ENDIF 
    129       !                                               ! set time step size (Euler/Leapfrog) 
     130      !    
     131      l_hst = .FALSE. 
     132      l_ptr = .FALSE. 
     133      IF( cdtype == 'TRA' .AND. ln_diaptr )                                                 l_ptr = .TRUE.  
     134      IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     135         &                        iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )   l_hst = .TRUE. 
     136      ! 
     137      !                                            ! set time step size (Euler/Leapfrog) 
    130138      IF( neuler == 0 .AND. kt == nit000 ) THEN   ;   z2dt =     rdt      ! at nit000   (Euler) 
    131139      ELSE                                        ;   z2dt = 2.* rdt      !             (Leapfrog) 
     
    369377            ! 
    370378            !                             ! "Poleward" diffusive heat or salt transports (T-S case only) 
    371             IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN 
    372                ! note sign is reversed to give down-gradient diffusive transports (#1043) 
    373                IF( jn == jp_tem)   htr_ldf(:) = ptr_sj( -zftv(:,:,:) ) 
    374                IF( jn == jp_sal)   str_ldf(:) = ptr_sj( -zftv(:,:,:) ) 
    375             ENDIF 
    376             ! 
    377             IF( iom_use("udiff_heattr") .OR. iom_use("vdiff_heattr") ) THEN 
    378               ! 
    379               IF( cdtype == 'TRA' .AND. jn == jp_tem  ) THEN 
    380                   z2d(:,:) = zftu(ji,jj,1)  
    381                   DO jk = 2, jpkm1 
    382                      DO jj = 2, jpjm1 
    383                         DO ji = fs_2, fs_jpim1   ! vector opt. 
    384                            z2d(ji,jj) = z2d(ji,jj) + zftu(ji,jj,jk)  
    385                         END DO 
    386                      END DO 
    387                   END DO 
    388 !!gm CAUTION I think there is an error of sign when using BLP operator.... 
    389 !!gm         a multiplication by zsign is required (to be checked twice !) 
    390                   z2d(:,:) = - rau0_rcp * z2d(:,:)     ! note sign is reversed to give down-gradient diffusive transports (#1043) 
    391                   CALL lbc_lnk( z2d, 'U', -1. ) 
    392                   CALL iom_put( "udiff_heattr", z2d )                  ! heat transport in i-direction 
    393                   ! 
    394                   z2d(:,:) = zftv(ji,jj,1)  
    395                   DO jk = 2, jpkm1 
    396                      DO jj = 2, jpjm1 
    397                         DO ji = fs_2, fs_jpim1   ! vector opt. 
    398                            z2d(ji,jj) = z2d(ji,jj) + zftv(ji,jj,jk)  
    399                         END DO 
    400                      END DO 
    401                   END DO 
    402                   z2d(:,:) = - rau0_rcp * z2d(:,:)     ! note sign is reversed to give down-gradient diffusive transports (#1043) 
    403                   CALL lbc_lnk( z2d, 'V', -1. ) 
    404                   CALL iom_put( "vdiff_heattr", z2d )                  !  heat transport in i-direction 
    405                END IF 
    406                ! 
    407             ENDIF 
     379               ! note sign is reversed to give down-gradient diffusive transports ) 
     380            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -zftv(:,:,:)  ) 
     381            !                          ! Diffusive heat transports 
     382            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -zftu(:,:,:), -zftv(:,:,:) ) 
    408383            ! 
    409384         ENDIF                                                    !== end pass selection  ==! 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_lap_blp.F90

    r6140 r7646  
    1717   USE traldf_triad   ! iso-neutral lateral diffusion (triad    operator)     (tra_ldf_triad routine) 
    1818   USE diaptr         ! poleward transport diagnostics 
     19   USE diaar5         ! AR5 diagnostics 
    1920   USE trc_oce        ! share passive tracers/Ocean variables 
    2021   USE zpshde         ! partial step: hor. derivative     (zps_hde routine) 
     
    2526   USE timing         ! Timing 
    2627   USE wrk_nemo       ! Memory allocation 
     28   USE iom 
    2729 
    2830   IMPLICIT NONE 
     
    3941   INTEGER, PARAMETER, PUBLIC ::   np_lap_i  = 11   ,   np_blp_i  = 21  ! standard iso-neutral or geopotential operator 
    4042   INTEGER, PARAMETER, PUBLIC ::   np_lap_it = 12   ,   np_blp_it = 22  ! triad    iso-neutral or geopotential operator 
     43 
     44   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     45   LOGICAL  ::   l_hst   ! flag to compute heat transport 
    4146 
    4247   !! * Substitutions 
     
    95100      CALL wrk_alloc( jpi,jpj,jpk,   ztu, ztv, zaheeu, zaheev )  
    96101      ! 
     102      l_hst = .FALSE. 
     103      l_ptr = .FALSE. 
     104      IF( cdtype == 'TRA' .AND. ln_diaptr )                                                l_ptr = .TRUE.  
     105      IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     106         &                        iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )  l_hst = .TRUE. 
     107      ! 
    97108      !                                !==  Initialization of metric arrays used for all tracers  ==! 
    98109      IF( kpass == 1 ) THEN   ;   zsign =  1._wp      ! bilaplacian operator require a minus sign (eddy diffusivity >0) 
     
    150161         IF( ( kpass == 1 .AND. .NOT.ln_traldf_blp ) .OR.  &     !==  first pass only (  laplacian)  ==! 
    151162             ( kpass == 2 .AND.      ln_traldf_blp ) ) THEN      !==  2nd   pass only (bilaplacian)  ==! 
    152             IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN 
    153                IF( jn  == jp_tem)   htr_ldf(:) = ptr_sj( -ztv(:,:,:) ) 
    154                IF( jn  == jp_sal)   str_ldf(:) = ptr_sj( -ztv(:,:,:) ) 
    155             ENDIF 
     163 
     164            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', -ztv(:,:,:)  ) 
     165            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', -ztu(:,:,:), -ztv(:,:,:) ) 
    156166         ENDIF 
    157167         !                          ! ================== 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traldf_triad.F90

    r6140 r7646  
    2020   USE traldf_iso     ! lateral diffusion (Madec operator)         (tra_ldf_iso routine) 
    2121   USE diaptr         ! poleward transport diagnostics 
     22   USE diaar5         ! AR5 diagnostics 
    2223   USE zpshde         ! partial step: hor. derivative     (zps_hde routine) 
    2324   ! 
     
    3536 
    3637   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE ::   zdkt3d   !: vertical tracer gradient at 2 levels 
     38 
     39   LOGICAL  ::   l_ptr   ! flag to compute poleward transport 
     40   LOGICAL  ::   l_hst   ! flag to compute heat transport 
     41 
    3742 
    3843   !! * Substitutions 
     
    8994      REAL(wp) ::   ze1ur, ze2vr, ze3wr, zdxt, zdyt, zdzt 
    9095      REAL(wp) ::   zah, zah_slp, zaei_slp 
    91 #if defined key_diaar5 
    92       REAL(wp) ::   zztmp              ! local scalar 
    93 #endif 
    9496      REAL(wp), POINTER, DIMENSION(:,:  ) :: z2d                                            ! 2D workspace 
    9597      REAL(wp), POINTER, DIMENSION(:,:,:) :: zdit, zdjt, zftu, zftv, ztfw, zpsi_uw, zpsi_vw   ! 3D     - 
     
    112114         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~' 
    113115      ENDIF 
    114       !                                               ! set time step size (Euler/Leapfrog) 
     116      !    
     117      l_hst = .FALSE. 
     118      l_ptr = .FALSE. 
     119      IF( cdtype == 'TRA' .AND. ln_diaptr )                                                 l_ptr = .TRUE.  
     120      IF( cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. & 
     121         &                        iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) )   l_hst = .TRUE. 
     122      ! 
     123      !                                                        ! set time step size (Euler/Leapfrog) 
    115124      IF( neuler == 0 .AND. kt == kit000 ) THEN   ;   z2dt =     rdt      ! at nit000   (Euler) 
    116125      ELSE                                        ;   z2dt = 2.* rdt      !             (Leapfrog) 
     
    416425            ! 
    417426            !                          ! "Poleward" diffusive heat or salt transports (T-S case only) 
    418             IF( cdtype == 'TRA' .AND. ln_diaptr ) THEN 
    419                IF( jn == jp_tem)   htr_ldf(:) = ptr_sj( zftv(:,:,:) )        ! 3.3  names 
    420                IF( jn == jp_sal)   str_ldf(:) = ptr_sj( zftv(:,:,:) ) 
    421             ENDIF 
    422             ! 
    423             IF( iom_use("udiff_heattr") .OR. iom_use("vdiff_heattr") ) THEN 
    424               ! 
    425               IF( cdtype == 'TRA' .AND. jn == jp_tem  ) THEN 
    426                   z2d(:,:) = zftu(ji,jj,1)  
    427                   DO jk = 2, jpkm1 
    428                      DO jj = 2, jpjm1 
    429                         DO ji = fs_2, fs_jpim1   ! vector opt. 
    430                            z2d(ji,jj) = z2d(ji,jj) + zftu(ji,jj,jk)  
    431                         END DO 
    432                      END DO 
    433                   END DO 
    434                   z2d(:,:) = rau0_rcp * z2d(:,:)  
    435                   CALL lbc_lnk( z2d, 'U', -1. ) 
    436                   CALL iom_put( "udiff_heattr", z2d )                  ! heat i-transport 
    437                   ! 
    438                   z2d(:,:) = zftv(ji,jj,1)  
    439                   DO jk = 2, jpkm1 
    440                      DO jj = 2, jpjm1 
    441                         DO ji = fs_2, fs_jpim1   ! vector opt. 
    442                            z2d(ji,jj) = z2d(ji,jj) + zftv(ji,jj,jk)  
    443                         END DO 
    444                      END DO 
    445                   END DO 
    446                   z2d(:,:) = rau0_rcp * z2d(:,:)      
    447                   CALL lbc_lnk( z2d, 'V', -1. ) 
    448                   CALL iom_put( "vdiff_heattr", z2d )                  !  heat j-transport 
    449                ENDIF 
    450                ! 
    451             ENDIF 
     427            IF( l_ptr )  CALL dia_ptr_hst( jn, 'ldf', zftv(:,:,:)  ) 
     428            !                          ! Diffusive heat transports 
     429            IF( l_hst )  CALL dia_ar5_hst( jn, 'ldf', zftu(:,:,:), zftv(:,:,:) ) 
    452430            ! 
    453431         ENDIF                                                    !== end pass selection  ==! 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/tranxt.F90

    r6140 r7646  
    3737   USE ldftra          ! lateral physics on tracers 
    3838   USE ldfslp 
    39    USE bdy_oce         ! BDY open boundary condition variables 
     39   USE bdy_oce   , ONLY: ln_bdy 
    4040   USE bdytra          ! open boundary condition (bdy_tra routine) 
    4141   ! 
     
    7979      !!              - Apply lateral boundary conditions on (ta,sa)  
    8080      !!             at the local domain   boundaries through lbc_lnk call,  
    81       !!             at the one-way open boundaries (lk_bdy=T),  
     81      !!             at the one-way open boundaries (ln_bdy=T),  
    8282      !!             at the AGRIF zoom   boundaries (lk_agrif=T) 
    8383      !! 
     
    111111      CALL lbc_lnk( tsa(:,:,:,jp_sal), 'T', 1._wp ) 
    112112      ! 
    113 #if defined key_bdy  
    114       IF( lk_bdy )   CALL bdy_tra( kt )  ! BDY open boundaries 
    115 #endif 
     113      IF( ln_bdy )   CALL bdy_tra( kt )  ! BDY open boundaries 
    116114  
    117115      ! set time step size (Euler/Leapfrog) 
     
    121119 
    122120      ! trends computation initialisation 
    123       IF( l_trdtra )   THEN                    ! store now fields before applying the Asselin filter 
     121      IF( l_trdtra )   THEN                     
    124122         CALL wrk_alloc( jpi, jpj, jpk, ztrdt, ztrds ) 
    125          ztrdt(:,:,:) = tsn(:,:,:,jp_tem)  
    126          ztrds(:,:,:) = tsn(:,:,:,jp_sal) 
     123         ztrdt(:,:,jk) = 0._wp 
     124         ztrds(:,:,jk) = 0._wp 
    127125         IF( ln_traldf_iso ) THEN              ! diagnose the "pure" Kz diffusive trend  
    128126            CALL trd_tra( kt, 'TRA', jp_tem, jptra_zdfp, ztrdt ) 
    129127            CALL trd_tra( kt, 'TRA', jp_sal, jptra_zdfp, ztrds ) 
    130128         ENDIF 
     129         ! total trend for the non-time-filtered variables.  
     130            zfact = 1.0 / rdt 
     131         DO jk = 1, jpkm1 
     132            ztrdt(:,:,jk) = ( tsa(:,:,jk,jp_tem) - tsn(:,:,jk,jp_tem) ) * zfact  
     133            ztrds(:,:,jk) = ( tsa(:,:,jk,jp_sal) - tsn(:,:,jk,jp_sal) ) * zfact  
     134         END DO 
     135         CALL trd_tra( kt, 'TRA', jp_tem, jptra_tot, ztrdt ) 
     136         CALL trd_tra( kt, 'TRA', jp_sal, jptra_tot, ztrds ) 
     137         ! Store now fields before applying the Asselin filter  
     138         ! in order to calculate Asselin filter trend later. 
     139         ztrdt(:,:,:) = tsn(:,:,:,jp_tem)  
     140         ztrds(:,:,:) = tsn(:,:,:,jp_sal) 
    131141      ENDIF 
    132142 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/traqsr.F90

    r6403 r7646  
    406406            !                                        ! fill sf_chl with sn_chl and control print 
    407407            CALL fld_fill( sf_chl, (/ sn_chl /), cn_dir, 'tra_qsr_init',   & 
    408                &           'Solar penetration function of read chlorophyll', 'namtra_qsr' ) 
     408               &           'Solar penetration function of read chlorophyll', 'namtra_qsr' , no_print ) 
    409409         ENDIF 
    410410         IF( nqsr == np_RGB ) THEN                 ! constant Chl 
     
    422422         ! 
    423423         IF(lwp) WRITE(numout,*) '   bio-model light penetration' 
    424          IF( .NOT.lk_qsr_bio )   CALL ctl_stop( 'No bio model : ln_qsr_bio = true impossible ' ) 
     424         IF( .NOT.lk_top )   CALL ctl_stop( 'No bio model : ln_qsr_bio = true impossible ' ) 
    425425         ! 
    426426      END SELECT 
  • trunk/NEMOGCM/NEMO/OPA_SRC/TRA/trazdf.F90

    r6140 r7646  
    141141         WRITE(numout,*) 'tra_zdf_init : vertical tracer physics scheme' 
    142142         WRITE(numout,*) '~~~~~~~~~~~' 
    143          IF( nzdf ==  0 )   WRITE(numout,*) '              Explicit time-splitting scheme' 
    144          IF( nzdf ==  1 )   WRITE(numout,*) '              Implicit (euler backward) scheme' 
     143         IF( nzdf ==  0 )   WRITE(numout,*) '      ===>>   Explicit time-splitting scheme' 
     144         IF( nzdf ==  1 )   WRITE(numout,*) '      ===>>   Implicit (euler backward) scheme' 
    145145      ENDIF 
    146146      ! 
Note: See TracChangeset for help on using the changeset viewer.