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/DYN/dynhpg.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/DYN/dynhpg.F90

    r14986 r15540  
    7676   ! 
    7777   LOGICAL          ::   ln_hpg_djc_vnh, ln_hpg_djc_vnv                 ! flag to specify hpg_djc boundary condition type 
    78    REAL(wp), PUBLIC ::   aco_bc_hor, bco_bc_hor, aco_bc_vrt, bco_bc_vrt !: coefficients for hpg_djc hor and vert boundary conditions 
     78   REAL(dp), PUBLIC ::   aco_bc_hor, bco_bc_hor, aco_bc_vrt, bco_bc_vrt !: coefficients for hpg_djc hor and vert boundary conditions 
    7979 
    8080   !! * Substitutions 
     
    131131      ENDIF 
    132132      ! 
    133       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTWP(puu(:,:,:,Krhs)), clinfo1=' hpg  - Ua: ', mask1=umask,   & 
    134          &                                  tab3d_2=CASTWP(pvv(:,:,:,Krhs)), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     133      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' hpg  - Ua: ', mask1=umask,   & 
     134         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    135135      ! 
    136136      IF( ln_timing )   CALL timing_stop('dyn_hpg') 
     
    155155      !! 
    156156      INTEGER  ::   ji, jj, jk, ikt    ! dummy loop indices      ISF 
    157       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  zts_top, zrhd   ! hypothesys on isf density 
    158       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  zrhdtop_isf    ! density at bottom of ISF 
    159       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::  ziceload       ! density at bottom of ISF 
     157      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::  zts_top, zrhd   ! hypothesys on isf density 
     158      REAL(dp), ALLOCATABLE, DIMENSION(:,:)   ::  zrhdtop_isf    ! density at bottom of ISF 
     159      REAL(dp), ALLOCATABLE, DIMENSION(:,:)   ::  ziceload       ! density at bottom of ISF 
    160160      !! 
    161161      NAMELIST/namdyn_hpg/ ln_hpg_zco, ln_hpg_zps, ln_hpg_sco,     & 
     
    266266      ! 
    267267      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    268       REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars 
    269       REAL(wp), DIMENSION(A2D(nn_hls)) ::  zhpi, zhpj 
     268      REAL(dp) ::   zcoef0, zcoef1   ! temporary scalars 
     269      REAL(dp), DIMENSION(A2D(nn_hls)) ::  zhpi, zhpj 
    270270      !!---------------------------------------------------------------------- 
    271271      ! 
     
    320320      INTEGER  ::   ji, jj, jk                       ! dummy loop indices 
    321321      INTEGER  ::   iku, ikv                         ! temporary integers 
    322       REAL(wp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
    323       REAL(wp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj 
    324       REAL(wp), DIMENSION(A2D(nn_hls),jpts) :: zgtsu, zgtsv 
    325       REAL(wp), DIMENSION(A2D(nn_hls)     ) :: zgru, zgrv 
     322      REAL(dp) ::   zcoef0, zcoef1, zcoef2, zcoef3   ! temporary scalars 
     323      REAL(dp), DIMENSION(A2D(nn_hls),jpk ) :: zhpi, zhpj 
     324      REAL(dp), DIMENSION(A2D(nn_hls),jpts) :: zgtsu, zgtsv 
     325      REAL(dp), DIMENSION(A2D(nn_hls)     ) :: zgru, zgrv 
    326326      !!---------------------------------------------------------------------- 
    327327      ! 
     
    413413      !! 
    414414      INTEGER  ::   ji, jj, jk, jii, jjj           ! dummy loop indices 
    415       REAL(wp) ::   zcoef0, zuap, zvap, ztmp       ! local scalars 
     415      REAL(wp)  :: zcoef0, zuap, zvap! local scalars 
     416      REAL(dp)  :: ztmp! local scalars 
    416417      LOGICAL  ::   ll_tmp1, ll_tmp2               ! local logical variables 
    417418      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  ::   zhpi, zhpj 
     
    552553      INTEGER  ::   ji, jj, jk             ! dummy loop indices 
    553554      INTEGER  ::   ikt ,  ikti1,  iktj1   ! local integer 
    554       REAL(wp) ::   ze3w, ze3wi1, ze3wj1   ! local scalars 
    555       REAL(wp) ::   zcoef0, zuap, zvap     !   -      - 
    556       REAL(wp), DIMENSION(A2D(nn_hls),jpk ) ::  zhpi, zhpj 
    557       REAL(wp), DIMENSION(A2D(nn_hls),jpts) ::  zts_top 
    558       REAL(wp), DIMENSION(A2D(nn_hls))      ::  zrhdtop_oce 
     555      REAL(dp) ::   ze3w, ze3wi1, ze3wj1   ! local scalars 
     556      REAL(dp) ::   zcoef0, zuap, zvap     !   -      - 
     557      REAL(dp), DIMENSION(A2D(nn_hls),jpk ) ::  zhpi, zhpj 
     558      REAL(dp), DIMENSION(A2D(nn_hls),jpts) ::  zts_top 
     559      REAL(dp), DIMENSION(A2D(nn_hls))      ::  zrhdtop_oce 
    559560      !!---------------------------------------------------------------------- 
    560561      ! 
     
    571572         zts_top(ji,jj,2) = ts(ji,jj,ikt,2,Kmm) 
    572573      END_2D 
    573       CALL eos( zts_top, risfdep, zrhdtop_oce ) 
     574      CALL eos( zts_top, CASTDP(risfdep), zrhdtop_oce ) 
    574575 
    575576      !                     !===========================! 
     
    639640      INTEGER  ::   ji, jj, jk          ! dummy loop indices 
    640641      INTEGER  ::   iktb, iktt          ! jk indices at tracer points for top and bottom points  
    641       REAL(wp) ::   zcoef0, zep, cffw   ! temporary scalars 
    642       REAL(wp) ::   z_grav_10, z1_12, z1_cff 
    643       REAL(wp) ::   cffu, cffx          !    "         " 
    644       REAL(wp) ::   cffv, cffy          !    "         " 
     642      REAL(dp) ::   zcoef0, zep, cffw   ! temporary scalars 
     643      REAL(dp) ::   z_grav_10, z1_12, z1_cff 
     644      REAL(dp) ::   cffu, cffx          !    "         " 
     645      REAL(dp) ::   cffv, cffy          !    "         " 
    645646      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    646       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zhpj 
    647  
    648       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz') 
    649       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz') 
    650       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho') 
    651       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho') 
    652       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals 
    653       REAL(wp), DIMENSION(A2D(nn_hls))     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays 
     647      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zhpj 
     648 
     649      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zdzx, zdzy, zdzz                          ! Primitive grid differences ('delta_xyz') 
     650      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zdz_i, zdz_j, zdz_k                       ! Harmonic average of primitive grid differences ('d_xyz') 
     651      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zdrhox, zdrhoy, zdrhoz                    ! Primitive rho differences ('delta_rho') 
     652      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zdrho_i, zdrho_j, zdrho_k                 ! Harmonic average of primitive rho differences ('d_rho') 
     653      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   z_rho_i, z_rho_j, z_rho_k                 ! Face intergrals 
     654      REAL(dp), DIMENSION(A2D(nn_hls))     ::   zz_dz_i, zz_dz_j, zz_drho_i, zz_drho_j    ! temporary arrays 
    654655      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    655656      !!---------------------------------------------------------------------- 
     
    962963      !! 
    963964      INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices 
    964       REAL(wp) ::   zcoef0, znad                    ! local scalars 
     965      REAL(dp) ::   zcoef0, znad                    ! local scalars 
    965966      ! 
    966967      !! The local variables for the correction term 
    967968      INTEGER  :: jk1, jis, jid, jjs, jjd 
    968969      LOGICAL  :: ll_tmp1, ll_tmp2                  ! local logical variables 
    969       REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 
    970       REAL(wp) :: zrhdt1 
    971       REAL(wp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
    972       REAL(wp), DIMENSION(A2D(nn_hls))     ::   zpgu, zpgv   ! 2D workspace 
    973       REAL(wp), DIMENSION(A2D(nn_hls))     ::   zsshu_n, zsshv_n 
    974       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zdept, zrhh 
    975       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
     970      REAL(dp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 
     971      REAL(dp) :: zrhdt1 
     972      REAL(dp) :: zdpdx1, zdpdx2, zdpdy1, zdpdy2 
     973      REAL(dp), DIMENSION(A2D(nn_hls))     ::   zpgu, zpgv   ! 2D workspace 
     974      REAL(dp), DIMENSION(A2D(nn_hls))     ::   zsshu_n, zsshv_n 
     975      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zdept, zrhh 
     976      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
    976977      REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   zcpx, zcpy   !W/D pressure filter 
    977978      !!---------------------------------------------------------------------- 
     
    10521053         ELSEIF( jk < jpkm1 ) THEN 
    10531054            DO jkk = jk+1, jpk 
    1054                zrhh(ji,jj,jkk) = interp1(CASTWP(gde3w(ji,jj,jkk  )), CASTWP(gde3w(ji,jj,jkk-1)),   & 
    1055                   &                      CASTWP(gde3w(ji,jj,jkk-2)), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
     1055               zrhh(ji,jj,jkk) = interp1(gde3w(ji,jj,jkk  ), gde3w(ji,jj,jkk-1),   & 
     1056                  &                      gde3w(ji,jj,jkk-2), zrhh (ji,jj,jkk-1), zrhh(ji,jj,jkk-2)) 
    10561057            END DO 
    10571058         ENDIF 
     
    12691270      !! Reference: CJC Kruger, Constrained Cubic Spline Interpoltation 
    12701271      !!---------------------------------------------------------------------- 
    1271       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
    1272       REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
     1272      REAL(dp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   fsp, xsp           ! value and coordinate 
     1273      REAL(dp), DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   asp, bsp, csp, dsp ! coefficients of the interpoated function 
    12731274      INTEGER                             , INTENT(in   ) ::   polynomial_type    ! 1: cubic spline   ;   2: Linear 
    12741275      ! 
    12751276      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    1276       REAL(wp) ::   zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp 
    1277       REAL(wp) ::   zdxtmp1, zdxtmp2, zalpha 
    1278       REAL(wp) ::   zdf(jpk) 
     1277      REAL(dp) ::   zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp 
     1278      REAL(dp) ::   zdxtmp1, zdxtmp2, zalpha 
     1279      REAL(dp) ::   zdf(jpk) 
    12791280      !!---------------------------------------------------------------------- 
    12801281      ! 
     
    13611362      !!                extrapolation is also permitted (no value limit) 
    13621363      !!---------------------------------------------------------------------- 
    1363       REAL(wp), INTENT(in) ::  x, xl, xr, fl, fr 
    1364       REAL(wp)             ::  f ! result of the interpolation (extrapolation) 
    1365       REAL(wp)             ::  zdeltx 
     1364      REAL(dp), INTENT(in) ::  x, xl, xr, fl, fr 
     1365      REAL(dp)             ::  f ! result of the interpolation (extrapolation) 
     1366      REAL(dp)             ::  zdeltx 
    13661367      !!---------------------------------------------------------------------- 
    13671368      ! 
     
    13861387      !!---------------------------------------------------------------------- 
    13871388      REAL(wp), INTENT(in) ::  x, a, b, c, d 
    1388       REAL(wp)             ::  f ! value from the interpolation 
     1389      REAL(dp)             ::  f ! value from the interpolation 
    13891390      !!---------------------------------------------------------------------- 
    13901391      ! 
     
    14041405      !! 
    14051406      !!---------------------------------------------------------------------- 
    1406       REAL(wp), INTENT(in) ::  x, a, b, c, d 
    1407       REAL(wp)             ::  f ! value from the interpolation 
     1407      REAL(dp), INTENT(in) ::  x, a, b, c, d 
     1408      REAL(dp)             ::  f ! value from the interpolation 
    14081409      !!---------------------------------------------------------------------- 
    14091410      ! 
     
    14221423      !! 
    14231424      !!---------------------------------------------------------------------- 
    1424       REAL(wp), INTENT(in) ::  xl, xr, a, b, c, d 
    1425       REAL(wp)             ::  za1, za2, za3 
    1426       REAL(wp)             ::  f                   ! integration result 
     1425      REAL(dp), INTENT(in) ::  xl, xr, a, b, c, d 
     1426      REAL(dp)             ::  za1, za2, za3 
     1427      REAL(dp)             ::  f                   ! integration result 
    14271428      !!---------------------------------------------------------------------- 
    14281429      ! 
Note: See TracChangeset for help on using the changeset viewer.