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 15540 for NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/DIA/diaptr.F90 – NEMO

Ignore:
Timestamp:
2021-11-26T12:27:56+01:00 (3 years ago)
Author:
sparonuz
Message:

Mixed precision version, tested up to 30 years on ORCA2.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/DIA/diaptr.F90

    r14986 r15540  
    4444   PUBLIC   dia_ptr_hst    ! called from tra_ldf/tra_adv routines 
    4545 
    46    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hstr_adv, hstr_ldf, hstr_eiv   !: Heat/Salt TRansports(adv, diff, Bolus.) 
    47    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hstr_ove, hstr_btr, hstr_vtr   !: heat Salt TRansports(overturn, baro, merional) 
    48    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   pvtr_int, pzon_int             !: Other zonal integrals 
     46   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hstr_adv, hstr_ldf, hstr_eiv   !: Heat/Salt TRansports(adv, diff, Bolus.) 
     47   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hstr_ove, hstr_btr, hstr_vtr   !: heat Salt TRansports(overturn, baro, merional) 
     48   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   pvtr_int, pzon_int             !: Other zonal integrals 
    4949 
    5050   LOGICAL, PUBLIC    ::   l_diaptr       !: tracers  trend flag 
     
    5252   INTEGER, PARAMETER ::   jp_vtr = 4 
    5353 
    54    REAL(wp) ::   rc_sv    = 1.e-6_wp   ! conversion from m3/s to Sverdrup 
    55    REAL(wp) ::   rc_pwatt = 1.e-15_wp  ! conversion from W    to PW (further x rho0 x Cp) 
    56    REAL(wp) ::   rc_ggram = 1.e-9_wp   ! conversion from g    to Gg  (further x rho0) 
    57  
    58    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk   ! T-point basin interior masks 
    59    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk34 ! mask out Southern Ocean (=0 south of 34°S) 
     54   REAL(dp) ::   rc_sv    = 1.e-6_wp   ! conversion from m3/s to Sverdrup 
     55   REAL(dp) ::   rc_pwatt = 1.e-15_wp  ! conversion from W    to PW (further x rho0 x Cp) 
     56   REAL(dp) ::   rc_ggram = 1.e-9_wp   ! conversion from g    to Gg  (further x rho0) 
     57 
     58   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk   ! T-point basin interior masks 
     59   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: btmsk34 ! mask out Southern Ocean (=0 south of 34°S) 
    6060 
    6161   LOGICAL ::   ll_init = .TRUE.        !: tracers  trend flag 
     
    6363   !! * Substitutions 
    6464#  include "do_loop_substitute.h90" 
     65#  include "single_precision_substitute.h90" 
    6566#  include "domzgr_substitute.h90" 
    6667   !!---------------------------------------------------------------------- 
     
    113114      ! 
    114115      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    115       REAL(wp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace 
    116       REAL(wp), DIMENSION(jpj)      ::  zvsum, ztsum, zssum   ! 1D workspace 
     116      REAL(dp), DIMENSION(jpi,jpj)     ::  z2d   ! 2D workspace 
     117      REAL(dp), DIMENSION(jpj)      ::  zvsum, ztsum, zssum   ! 1D workspace 
    117118      ! 
    118119      !overturning calculation 
    119       REAL(wp), DIMENSION(:,:,:  ), ALLOCATABLE ::   sjk, r1_sjk, v_msf  ! i-mean i-k-surface and its inverse 
    120       REAL(wp), DIMENSION(:,:,:  ), ALLOCATABLE ::   zt_jk, zs_jk        ! i-mean T and S, j-Stream-Function 
    121  
    122       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   z4d1, z4d2 
    123       REAL(wp), DIMENSION(:,:,:  ), ALLOCATABLE ::   z3dtr 
     120      REAL(dp), DIMENSION(:,:,:  ), ALLOCATABLE ::   sjk, r1_sjk, v_msf  ! i-mean i-k-surface and its inverse 
     121      REAL(dp), DIMENSION(:,:,:  ), ALLOCATABLE ::   zt_jk, zs_jk        ! i-mean T and S, j-Stream-Function 
     122 
     123      REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE ::   z4d1, z4d2 
     124      REAL(dp), DIMENSION(:,:,:  ), ALLOCATABLE ::   z3dtr 
    124125      !!---------------------------------------------------------------------- 
    125126      ! 
     
    349350      INTEGER                     , INTENT(in)           :: Kmm          ! time level index 
    350351      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in), OPTIONAL :: pvtr         ! j-effective transport 
    351       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE            :: zmask        ! 3D workspace 
    352       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE          :: zts          ! 4D workspace 
    353       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE            :: sjk, v_msf   ! Zonal sum: i-k surface area, j-effective transport 
    354       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE            :: zt_jk, zs_jk ! Zonal sum: i-k surface area * (T, S) 
    355       REAL(wp)                                           :: zsfc, zvfc   ! i-k surface area 
     352      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE            :: zmask        ! 3D workspace 
     353      REAL(dp), DIMENSION(:,:,:,:), ALLOCATABLE          :: zts          ! 4D workspace 
     354      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE            :: sjk, v_msf   ! Zonal sum: i-k surface area, j-effective transport 
     355      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE            :: zt_jk, zs_jk ! Zonal sum: i-k surface area * (T, S) 
     356      REAL(dp)                                           :: zsfc, zvfc   ! i-k surface area 
    356357      INTEGER  ::   ji, jj, jk, jn                                       ! dummy loop indices 
    357358      !!---------------------------------------------------------------------- 
     
    363364 
    364365            DO jn = 1, nbasin 
    365                v_msf(:,:,jn) = ptr_sjk( pvtr(:,:,:), btmsk34(:,:,jn) ) 
     366               v_msf(:,:,jn) =ptr_sjk( CASTDP(pvtr(:,:,:)), btmsk34(:,:,jn) ) 
    366367            ENDDO 
    367368 
     
    538539      INTEGER                         , INTENT(in )  :: ktra  ! tracer index 
    539540      CHARACTER(len=3)                , INTENT(in)   :: cptr  ! transport type  'adv'/'ldf'/'eiv' 
    540       REAL(wp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in)   :: pvflx ! 3D input array of advection/diffusion 
    541       REAL(wp), DIMENSION(A1Dj(nn_hls),nbasin)                 :: zsj   ! 
     541      REAL(dp), DIMENSION(A2D(nn_hls),jpk)    , INTENT(in)   :: pvflx ! 3D input array of advection/diffusion 
     542      REAL(dp), DIMENSION(A1Dj(nn_hls),nbasin)                 :: zsj   ! 
    542543      INTEGER                                        :: jn    ! 
    543544 
     
    574575      !! ** Action  : phstr 
    575576      !!---------------------------------------------------------------------- 
    576       REAL(wp), DIMENSION(jpj,nbasin) , INTENT(inout)         ::  phstr  ! 
    577       REAL(wp), DIMENSION(A1Dj(nn_hls),nbasin), INTENT(in)            ::  pva    ! 
     577      REAL(dp), DIMENSION(jpj,nbasin) , INTENT(inout)         ::  phstr  ! 
     578      REAL(dp), DIMENSION(A1Dj(nn_hls),nbasin), INTENT(in)            ::  pva    ! 
    578579      INTEGER                                               ::  jj 
    579580#if ! defined key_mpi_off 
    580581      INTEGER, DIMENSION(1)           ::  ish1d 
    581582      INTEGER, DIMENSION(2)           ::  ish2d 
    582       REAL(wp), DIMENSION(jpj*nbasin) ::  zwork 
     583      REAL(dp), DIMENSION(jpj*nbasin) ::  zwork 
    583584#endif 
    584585 
     
    610611      !! ** Action  : phstr 
    611612      !!---------------------------------------------------------------------- 
    612       REAL(wp), DIMENSION(jpj,jpk,nbasin) , INTENT(inout)     ::  phstr  ! 
    613       REAL(wp), DIMENSION(A1Dj(nn_hls),jpk,nbasin), INTENT(in)        ::  pva    ! 
     613      REAL(dp), DIMENSION(jpj,jpk,nbasin) , INTENT(inout)     ::  phstr  ! 
     614      REAL(dp), DIMENSION(A1Dj(nn_hls),jpk,nbasin), INTENT(in)        ::  pva    ! 
    614615      INTEGER                                               ::  jj, jk 
    615616#if ! defined key_mpi_off 
    616617      INTEGER, DIMENSION(1)              ::  ish1d 
    617618      INTEGER, DIMENSION(3)              ::  ish3d 
    618       REAL(wp), DIMENSION(jpj*jpk*nbasin)  ::  zwork 
     619      REAL(dp), DIMENSION(jpj*jpk*nbasin)  ::  zwork 
    619620#endif 
    620621 
     
    675676      !! ** Action  : - p_fval: i-k-mean poleward flux of pvflx 
    676677      !!---------------------------------------------------------------------- 
    677       REAL(wp), INTENT(in), DIMENSION(A2D(nn_hls),jpk)  ::   pvflx  ! mask flux array at V-point 
    678       REAL(wp), INTENT(in), DIMENSION(jpi,jpj)  ::   pmsk   ! Optional 2D basin mask 
     678      REAL(dp), INTENT(in), DIMENSION(A2D(nn_hls),jpk)  ::   pvflx  ! mask flux array at V-point 
     679      REAL(dp), INTENT(in), DIMENSION(jpi,jpj)  ::   pmsk   ! Optional 2D basin mask 
    679680      ! 
    680681      INTEGER                  ::   ji, jj, jk   ! dummy loop arguments 
    681       REAL(wp), DIMENSION(A1Dj(nn_hls)) :: p_fval  ! function value 
     682      REAL(dp), DIMENSION(A1Dj(nn_hls)) :: p_fval  ! function value 
    682683      !!-------------------------------------------------------------------- 
    683684      ! 
     
    704705      ! 
    705706      INTEGER                  ::   ji,jj       ! dummy loop arguments 
    706       REAL(wp), DIMENSION(A1Dj(nn_hls)) :: p_fval ! function value 
     707      REAL(dp), DIMENSION(A1Dj(nn_hls)) :: p_fval ! function value 
    707708      !!-------------------------------------------------------------------- 
    708709      ! 
     
    723724      !! ** Action  : - p_fval: j-cumulated sum of pva 
    724725      !!---------------------------------------------------------------------- 
    725       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj)  ::   pva   ! mask flux array at V-point 
     726      REAL(dp) , INTENT(in), DIMENSION(jpi,jpj)  ::   pva   ! mask flux array at V-point 
    726727      ! 
    727728      INTEGER                  ::   ji,jj,jc       ! dummy loop arguments 
    728729      INTEGER                  ::   ijpj        ! ??? 
    729       REAL(wp), DIMENSION(jpi,jpj) :: p_fval ! function value 
     730      REAL(dp), DIMENSION(jpi,jpj) :: p_fval ! function value 
    730731      !!-------------------------------------------------------------------- 
    731732      ! 
     
    754755      !! 
    755756      IMPLICIT none 
    756       REAL(wp) , INTENT(in), DIMENSION(A2D(nn_hls),jpk) ::   pta    ! mask flux array at V-point 
    757       REAL(wp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask 
     757      REAL(dp) , INTENT(in), DIMENSION(A2D(nn_hls),jpk) ::   pta    ! mask flux array at V-point 
     758      REAL(dp) , INTENT(in), DIMENSION(jpi,jpj) ::   pmsk   ! Optional 2D basin mask 
    758759      !! 
    759760      INTEGER                           :: ji, jj, jk ! dummy loop arguments 
    760       REAL(wp), DIMENSION(A1Dj(nn_hls),jpk) :: p_fval     ! return function value 
     761      REAL(dp), DIMENSION(A1Dj(nn_hls),jpk) :: p_fval     ! return function value 
    761762      !!-------------------------------------------------------------------- 
    762763      ! 
Note: See TracChangeset for help on using the changeset viewer.