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/ICB/icbutl.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/ICB/icbutl.F90

    r14652 r15540  
    7575      !! ** Method  : - blah blah 
    7676      !!---------------------------------------------------------------------- 
    77       REAL(wp), DIMENSION(0:jpi+1,0:jpj+1) :: ztmp 
     77      REAL(dp), DIMENSION(0:jpi+1,0:jpj+1) :: ztmp 
    7878#if defined key_si3 
    7979      REAL(wp), DIMENSION(jpi,jpj) :: zssh_lead_m    !    ocean surface (ssh_m) if ice is not embedded 
     
    159159      !! 
    160160      !!---------------------------------------------------------------------- 
    161       REAL(wp), INTENT(in   ) ::   pi , pj                        ! position in (i,j) referential 
    162       REAL(wp), INTENT(  out), OPTIONAL ::   pe1, pe2                       ! i- and j scale factors 
    163       REAL(wp), INTENT(  out), OPTIONAL ::   pssu, pssv, pui, pvi, pua, pva ! ocean, ice and wind speeds 
    164       REAL(wp), INTENT(  out), OPTIONAL ::   pssh_i, pssh_j                 ! ssh i- & j-gradients 
    165       REAL(wp), INTENT(  out), OPTIONAL ::   psst, psss, pcn, phi, pff      ! SST, SSS, ice concentration, ice thickness, Coriolis 
    166       REAL(wp), INTENT(  out), OPTIONAL ::   plat, plon                     ! position 
    167       REAL(wp), DIMENSION(jpk), INTENT(  out), OPTIONAL ::   ptoce, puoce, pvoce, pe3t   ! 3D variables 
    168       ! 
    169       REAL(wp), DIMENSION(4) :: zwT  , zwU  , zwV  , zwF   ! interpolation weight 
    170       REAL(wp), DIMENSION(4) :: zmskF, zmskU, zmskV, zmskT ! mask 
    171       REAL(wp), DIMENSION(4) :: zwTp, zmskTp, zwTm, zmskTm 
    172       REAL(wp), DIMENSION(4,jpk) :: zw1d 
     161      REAL(dp), INTENT(in   ) ::   pi , pj                        ! position in (i,j) referential 
     162      REAL(dp), INTENT(  out), OPTIONAL ::   pe1, pe2                       ! i- and j scale factors 
     163      REAL(dp), INTENT(  out), OPTIONAL ::   pssu, pssv, pui, pvi, pua, pva ! ocean, ice and wind speeds 
     164      REAL(dp), INTENT(  out), OPTIONAL ::   pssh_i, pssh_j                 ! ssh i- & j-gradients 
     165      REAL(dp), INTENT(  out), OPTIONAL ::   psst, psss, pcn, phi, pff      ! SST, SSS, ice concentration, ice thickness, Coriolis 
     166      REAL(dp), INTENT(  out), OPTIONAL ::   plat, plon                     ! position 
     167      REAL(dp), DIMENSION(jpk), INTENT(  out), OPTIONAL ::   ptoce, puoce, pvoce, pe3t   ! 3D variables 
     168      ! 
     169      REAL(dp), DIMENSION(4) :: zwT  , zwU  , zwV  , zwF   ! interpolation weight 
     170      REAL(dp), DIMENSION(4) :: zmskF, zmskU, zmskV, zmskT ! mask 
     171      REAL(dp), DIMENSION(4) :: zwTp, zmskTp, zwTm, zmskTm 
     172      REAL(dp), DIMENSION(4,jpk) :: zw1d 
    173173      INTEGER                :: iiT, iiU, iiV, iiF, ijT, ijU, ijV, ijF ! bottom left corner 
    174174      INTEGER                :: iiTp, iiTm, ijTp, ijTm 
    175       REAL(wp) ::   zcd, zmod       ! local scalars 
     175      REAL(dp) ::   zcd, zmod       ! local scalars 
    176176      !!---------------------------------------------------------------------- 
    177177      ! 
     
    183183      ! 
    184184      ! metrics and coordinates 
    185       IF ( PRESENT(pe1 ) ) pe1 = icb_utl_bilin_e( CASTWP(e1t), CASTWP(e1u), e1v, CASTWP(e1f), pi, pj )      ! scale factors 
    186       IF ( PRESENT(pe2 ) ) pe2 = icb_utl_bilin_e( CASTWP(e2t), e2u, CASTWP(e2v), CASTWP(e2f), pi, pj ) 
     185      IF ( PRESENT(pe1 ) ) pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj )      ! scale factors 
     186      IF ( PRESENT(pe2 ) ) pe2 = icb_utl_bilin_e( e2t, e2u, e2v, e2f, pi, pj ) 
    187187      IF ( PRESENT(plon) ) plon= icb_utl_bilin_h( rlon_e, iiT, ijT, zwT, .true.  ) 
    188188      IF ( PRESENT(plat) ) plat= icb_utl_bilin_h( rlat_e, iiT, ijT, zwT, .false. ) 
     
    219219         CALL icb_utl_pos( pi-0.1_wp, pj    , 'T', iiTm, ijTm, zwTm, zmskTm ) 
    220220         ! 
    221          IF ( .NOT. PRESENT(pe1) ) pe1 = icb_utl_bilin_e( CASTWP(e1t), CASTWP(e1u), e1v, CASTWP(e1f), pi, pj ) 
     221         IF ( .NOT. PRESENT(pe1) ) pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj ) 
    222222         pssh_i = ( icb_utl_bilin_h( ssh_e, iiTp, ijTp, zwTp*zmskTp, .false. ) -   & 
    223223            &       icb_utl_bilin_h( ssh_e, iiTm, ijTm, zwTm*zmskTm, .false. )  ) / ( 0.2_wp * pe1 ) 
     
    226226         CALL icb_utl_pos( pi    , pj-0.1_wp, 'T', iiTm, ijTm, zwTm, zmskTm ) 
    227227         ! 
    228          IF ( .NOT. PRESENT(pe2) ) pe2 = icb_utl_bilin_e( CASTWP(e2t), e2u, CASTWP(e2v), CASTWP(e2f), pi, pj ) 
     228         IF ( .NOT. PRESENT(pe2) ) pe2 = icb_utl_bilin_e( e2t, e2u, e2v, e2f, pi, pj ) 
    229229         pssh_j = ( icb_utl_bilin_h( ssh_e, iiTp, ijTp, zwTp*zmskTp, .false. ) -   & 
    230230            &       icb_utl_bilin_h( ssh_e, iiTm, ijTm, zwTm*zmskTm, .false. )  ) / ( 0.2_wp * pe2 ) 
     
    266266      !! 
    267267      !!---------------------------------------------------------------------- 
    268       REAL(wp)              , INTENT(IN)  ::   pi, pj    ! targeted coordinates in (i,j) referential 
     268      REAL(dp)              , INTENT(IN)  ::   pi, pj    ! targeted coordinates in (i,j) referential 
    269269      CHARACTER(len=1)      , INTENT(IN)  ::   cd_type   ! point type 
    270       REAL(wp), DIMENSION(4), INTENT(OUT) ::   pw, pmsk  ! weight and mask 
     270      REAL(dp), DIMENSION(4), INTENT(OUT) ::   pw, pmsk  ! weight and mask 
    271271      INTEGER ,               INTENT(OUT) ::   kii, kij  ! bottom left corner position in local domain 
    272272      ! 
    273       REAL(wp) :: zwi, zwj ! distance to bottom left corner 
     273      REAL(dp) :: zwi, zwj ! distance to bottom left corner 
    274274      INTEGER  :: ierr  
    275275      ! 
     
    359359   END SUBROUTINE icb_utl_pos 
    360360 
    361    REAL(wp) FUNCTION icb_utl_bilin_2d_h( pfld, pii, pij, pw, pllon ) 
     361   REAL(dp) FUNCTION icb_utl_bilin_2d_h( pfld, pii, pij, pw, pllon ) 
    362362      !!---------------------------------------------------------------------- 
    363363      !!                  ***  FUNCTION icb_utl_bilin  *** 
     
    370370      !! 
    371371      !!---------------------------------------------------------------------- 
    372       REAL(wp), DIMENSION(0:jpi+1,0:jpj+1), INTENT(in) ::   pfld      ! field to be interpolated 
    373       REAL(wp), DIMENSION(4)              , INTENT(in) ::   pw        ! weight 
     372      REAL(dp), DIMENSION(0:jpi+1,0:jpj+1), INTENT(in) ::   pfld      ! field to be interpolated 
     373      REAL(dp), DIMENSION(4)              , INTENT(in) ::   pw        ! weight 
    374374      LOGICAL                             , INTENT(in) ::   pllon     ! input data is a longitude 
    375375      INTEGER ,                             INTENT(in) ::   pii, pij  ! bottom left corner 
    376376      ! 
    377       REAL(wp), DIMENSION(4) :: zdat ! input data 
     377      REAL(dp), DIMENSION(4) :: zdat ! input data 
    378378      !!---------------------------------------------------------------------- 
    379379      ! 
     
    406406      !! 
    407407      !!---------------------------------------------------------------------- 
    408       REAL(wp), DIMENSION(0:jpi+1,0:jpj+1, jpk), INTENT(in) ::   pfld      ! field to be interpolated 
    409       REAL(wp), DIMENSION(4,jpk)               , INTENT(in) ::   pw        ! weight 
     408      REAL(dp), DIMENSION(0:jpi+1,0:jpj+1, jpk), INTENT(in) ::   pfld      ! field to be interpolated 
     409      REAL(dp), DIMENSION(4,jpk)               , INTENT(in) ::   pw        ! weight 
    410410      INTEGER ,                                  INTENT(in) ::   pii, pij  ! bottom left corner 
    411       REAL(wp), DIMENSION(jpk) :: icb_utl_bilin_3d_h 
    412       ! 
    413       REAL(wp), DIMENSION(4,jpk) :: zdat ! input data 
     411      REAL(dp), DIMENSION(jpk) :: icb_utl_bilin_3d_h 
     412      ! 
     413      REAL(dp), DIMENSION(4,jpk) :: zdat ! input data 
    414414      INTEGER :: jk 
    415415      !!---------------------------------------------------------------------- 
     
    429429   END FUNCTION icb_utl_bilin_3d_h 
    430430 
    431    REAL(wp) FUNCTION icb_utl_bilin_e( pet, peu, pev, pef, pi, pj ) 
     431   REAL(dp) FUNCTION icb_utl_bilin_e( pet, peu, pev, pef, pi, pj ) 
    432432      !!---------------------------------------------------------------------- 
    433433      !!                  ***  FUNCTION dom_init  *** 
     
    437437      !!                t-, u-, v-, and f-points. 
    438438      !!---------------------------------------------------------------------- 
    439       REAL(wp), DIMENSION(:,:), INTENT(in) ::   pet, peu, pev, pef   ! horizontal scale factor to be interpolated at t-,u-,v- & f-pts 
    440       REAL(wp)                , INTENT(IN) ::   pi , pj              ! iceberg position 
     439      REAL(dp), DIMENSION(:,:), INTENT(in) ::   pet, peu, pev, pef   ! horizontal scale factor to be interpolated at t-,u-,v- & f-pts 
     440      REAL(dp)                , INTENT(IN) ::   pi , pj              ! iceberg position 
    441441      ! 
    442442      ! weights corresponding to corner points of a T cell quadrant 
    443       REAL(wp) ::   zi, zj          ! local real 
     443      REAL(dp) ::   zi, zj          ! local real 
    444444      INTEGER  ::   ii, ij          ! bottom left corner coordinate in local domain 
    445445      ! 
    446446      ! values at corner points of a T cell quadrant 
    447447      ! 00 = bottom left, 10 = bottom right, 01 = top left, 11 = top right 
    448       REAL(wp) ::   ze00, ze10, ze01, ze11 
     448      REAL(dp) ::   ze00, ze10, ze01, ze11 
    449449      !!---------------------------------------------------------------------- 
    450450      ! 
     
    508508      !!---------------------------------------------------------------------- 
    509509      INTEGER,                INTENT(out):: kb 
    510       REAL(wp), DIMENSION(:), INTENT(in) :: pe3 
    511       REAL(wp),               INTENT(in) :: pD 
     510      REAL(dp), DIMENSION(:), INTENT(in) :: pe3 
     511      REAL(dp),               INTENT(in) :: pD 
    512512      !! 
    513513      INTEGER  :: jk 
    514       REAL(wp) :: zdepw 
     514      REAL(dp) :: zdepw 
    515515      !!---------------------------------------------------------------------- 
    516516      !! 
     
    531531      !!---------------------------------------------------------------------- 
    532532      INTEGER,                INTENT(in ) :: kb        ! deepest level affected by icb 
    533       REAL(wp), DIMENSION(:), INTENT(in ) :: pe3, pdat ! vertical profile 
    534       REAL(wp),               INTENT(in ) :: pD        ! draft 
    535       REAL(wp),               INTENT(out) :: pzavg     ! z average 
     533      REAL(dp), DIMENSION(:), INTENT(in ) :: pe3, pdat ! vertical profile 
     534      REAL(dp),               INTENT(in ) :: pD        ! draft 
     535      REAL(dp),               INTENT(out) :: pzavg     ! z average 
    536536      !!---------------------------------------------------------------------- 
    537537      INTEGER  :: jk 
    538       REAL(wp) :: zdep 
     538      REAL(dp) :: zdep 
    539539      !!---------------------------------------------------------------------- 
    540540      pzavg = 0.0 ; zdep = 0.0 
     
    627627 
    628628 
    629    REAL(wp) FUNCTION icb_utl_yearday(kmon, kday, khr, kmin, ksec) 
     629   REAL(dp) FUNCTION icb_utl_yearday(kmon, kday, khr, kmin, ksec) 
    630630      !!---------------------------------------------------------------------- 
    631631      !!                 ***  FUNCTION icb_utl_yearday  *** 
     
    830830 
    831831 
    832    REAL(wp) FUNCTION icb_utl_mass( first, justbits, justbergs ) 
     832   REAL(dp) FUNCTION icb_utl_mass( first, justbits, justbergs ) 
    833833      !!---------------------------------------------------------------------- 
    834834      !!                 ***  FUNCTION icb_utl_mass  *** 
     
    868868 
    869869 
    870    REAL(wp) FUNCTION icb_utl_heat( first, justbits, justbergs ) 
     870   REAL(dp) FUNCTION icb_utl_heat( first, justbits, justbergs ) 
    871871      !!---------------------------------------------------------------------- 
    872872      !!                 ***  FUNCTION icb_utl_heat  *** 
     
    916916      !!---------------------------------------------------------------------- 
    917917      INTEGER :: ikb 
    918       REAL(wp) :: zD, zout 
    919       REAL(wp), DIMENSION(jpk) :: ze3, zin 
     918      REAL(dp) :: zD, zout 
     919      REAL(dp), DIMENSION(jpk) :: ze3, zin 
    920920      WRITE(numout,*) 'Test icb_utl_getkb : ' 
    921921      zD = 0.0 ; ze3= 20.0 
Note: See TracChangeset for help on using the changeset viewer.