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/IOM/iom.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/IOM/iom.F90

    r14986 r15540  
    127127      INTEGER           :: inum 
    128128      ! 
    129       REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zt_bnds, zw_bnds 
    130       REAL(wp), DIMENSION(2,jpkam1)         :: za_bnds   ! ABL vertical boundaries 
     129      REAL(dp), ALLOCATABLE, DIMENSION(:,:) :: zt_bnds, zw_bnds 
     130      REAL(dp), DIMENSION(2,jpkam1)         :: za_bnds   ! ABL vertical boundaries 
    131131      LOGICAL ::   ll_closedef 
    132132      LOGICAL ::   ll_exist 
     
    173173      ! 
    174174      IF( TRIM(cdname) == TRIM(cxios_context) ) THEN   
    175          CALL set_grid( "T", CASTWP(glamt), CASTWP(gphit), .FALSE., .FALSE. ) 
     175         CALL set_grid( "T", glamt, gphit, .FALSE., .FALSE. ) 
    176176         CALL set_grid( "U", glamu, gphiu, .FALSE., .FALSE. ) 
    177177         CALL set_grid( "V", glamv, gphiv, .FALSE., .FALSE. ) 
    178          CALL set_grid( "W", CASTWP(glamt), CASTWP(gphit), .FALSE., .FALSE. ) 
    179          CALL set_grid( "F", CASTWP(glamf), CASTWP(gphif), .FALSE., .FALSE. ) 
    180          CALL set_grid_znl( CASTWP(gphit) ) 
     178         CALL set_grid( "W", glamt, gphit, .FALSE., .FALSE. ) 
     179         CALL set_grid( "F", glamf, gphif, .FALSE., .FALSE. ) 
     180         CALL set_grid_znl( gphit ) 
    181181         ! 
    182182         IF( ln_cfmeta ) THEN   ! Add additional grid metadata 
     
    186186            CALL iom_set_domain_attr("grid_W", area = real( e1e2t(Nis0:Nie0, Njs0:Nje0), dp)) 
    187187            CALL iom_set_domain_attr("grid_F", area = real( e1e2f(Nis0:Nie0, Njs0:Nje0), dp)) 
    188             CALL set_grid_bounds( "T", CASTWP(glamf), CASTWP(gphif), CASTWP(glamt), CASTWP(gphit) ) 
     188            CALL set_grid_bounds( "T", glamf, gphif, glamt, gphit ) 
    189189            CALL set_grid_bounds( "U", glamv, gphiv, glamu, gphiu ) 
    190190            CALL set_grid_bounds( "V", glamu, gphiu, glamv, gphiv ) 
    191             CALL set_grid_bounds( "W", CASTWP(glamf), CASTWP(gphif), CASTWP(glamt), CASTWP(gphit) ) 
    192             CALL set_grid_bounds( "F", CASTWP(glamt), CASTWP(gphit), CASTWP(glamf), CASTWP(gphif) ) 
     191            CALL set_grid_bounds( "W", glamf, gphif, glamt, gphit ) 
     192            CALL set_grid_bounds( "F", glamt, gphit, glamf, gphif ) 
    193193         ENDIF 
    194194      ENDIF 
     
    232232         ENDIF 
    233233         CALL iom_set_axis_attr( "ght_abl", ght_abl(2:jpka) ) 
    234          CALL iom_set_axis_attr( "ghw_abl", ghw_abl(2:jpka) ) 
     234         CALL iom_set_axis_attr( "ghw_abl", CASTDP(ghw_abl(2:jpka)) ) 
    235235 
    236236         ! Add vertical grid bounds 
     
    255255         CALL iom_set_axis_attr( "ghw_abl", bounds=za_bnds ) 
    256256 
    257          CALL iom_set_axis_attr(  "nfloat", (/ (REAL(ji,wp), ji=1,jpnfl) /) ) 
     257         CALL iom_set_axis_attr(  "nfloat", (/ (REAL(ji,dp), ji=1,jpnfl) /) ) 
    258258# if defined key_si3 
    259          CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     259         CALL iom_set_axis_attr( "ncatice", (/ (REAL(ji,dp), ji=1,jpl) /) ) 
    260260         ! SIMIP diagnostics (4 main arctic straits) 
    261          CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,wp), ji=1,4) /) ) 
     261         CALL iom_set_axis_attr( "nstrait", (/ (REAL(ji,dp), ji=1,4) /) ) 
    262262# endif 
    263263#if defined key_top 
     
    265265#endif 
    266266         CALL iom_set_axis_attr( "icbcla", class_num ) 
    267          CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,wp) /) )   ! strange syntaxe and idea... 
    268          CALL iom_set_axis_attr( "iax_26C", (/ REAL(26,wp) /) )   ! strange syntaxe and idea... 
    269          CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,wp) /) )   ! strange syntaxe and idea... 
     267         CALL iom_set_axis_attr( "iax_20C", (/ REAL(20,dp) /) )   ! strange syntaxe and idea... 
     268         CALL iom_set_axis_attr( "iax_26C", (/ REAL(26,dp) /) )   ! strange syntaxe and idea... 
     269         CALL iom_set_axis_attr( "iax_28C", (/ REAL(28,dp) /) )   ! strange syntaxe and idea... 
    270270         ! for diaprt, we need to define an axis which size can be 1 (default) or 5 (if the file subbasins.nc exists) 
    271271         INQUIRE( FILE = 'subbasins.nc', EXIST = ll_exist ) 
    272272         nbasin = 1 + 4 * COUNT( (/ll_exist/) ) 
    273          CALL iom_set_axis_attr( "basin"  , (/ (REAL(ji,wp), ji=1,nbasin) /) ) 
     273         CALL iom_set_axis_attr( "basin"  , (/ (REAL(ji,dp), ji=1,nbasin) /) ) 
    274274      ENDIF 
    275275      ! 
     
    610610      CALL xios_get_handle("domain_definition",domaingroup_hdl) 
    611611      CALL xios_add_child(domaingroup_hdl, domain_hdl, "grid_N") 
    612       CALL set_grid("N", CASTWP(glamt), CASTWP(gphit), .TRUE., ld_rstr) 
     612      CALL set_grid("N", glamt, gphit, .TRUE., ld_rstr) 
    613613 
    614614      CALL xios_get_handle("axis_definition",axisgroup_hdl) 
     
    620620#if defined key_si3 
    621621      CALL xios_add_child(axisgroup_hdl, axis_hdl, "numcat") 
    622       CALL iom_set_axis_attr( "numcat", (/ (REAL(ji,wp), ji=1,jpl) /) ) 
     622      CALL iom_set_axis_attr( "numcat", (/ (REAL(ji,dp), ji=1,jpl) /) ) 
    623623#endif 
    624624      CALL xios_add_child(axisgroup_hdl, axis_hdl, "nav_hgt") 
    625       CALL iom_set_axis_attr( "nav_hgt", (/ (REAL(ji,wp), ji=1,jpka) /) ) 
     625      CALL iom_set_axis_attr( "nav_hgt", (/ (REAL(ji,dp), ji=1,jpka) /) ) 
    626626      CALL xios_get_handle("scalar_definition", scalargroup_hdl) 
    627627      CALL xios_add_child(scalargroup_hdl, scalar_hdl, "grid_scalar") 
     
    11961196      INTEGER, DIMENSION(jpmax_dims) ::   ishape      ! size of the dimensions of the variable 
    11971197      REAL(dp)                       ::   zscf, zofs  ! sacle_factor and add_offset 
    1198       REAL(wp)                       ::   zsgn        ! local value of psgn 
     1198      REAL(dp)                       ::   zsgn        ! local value of psgn 
    11991199      INTEGER                        ::   itmp        ! temporary integer 
    12001200      CHARACTER(LEN=256)             ::   clinfo      ! info character 
     
    13651365               !--- overlap areas and extra hallows (mpp) 
    13661366               IF(     PRESENT(pv_r2d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    1367                   CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill ) 
     1367                  CALL lbc_lnk( 'iom', pv_r2d, cl_type, CASTSP(zsgn), kfillmode = kfill ) 
    13681368               ELSEIF( PRESENT(pv_r3d) .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    1369                   CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill ) 
     1369                  CALL lbc_lnk( 'iom', pv_r3d, cl_type, CASTSP(zsgn), kfillmode = kfill ) 
    13701370               ENDIF 
    13711371               ! 
     
    13931393            CALL xios_recv_field( trim(cdvar), pv_r3d(:, :, :)) 
    13941394            IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    1395                CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill) 
     1395               CALL lbc_lnk( 'iom', pv_r3d, cl_type, CASTSP(zsgn), kfillmode = kfill) 
    13961396            ENDIF 
    13971397         ELSEIF( PRESENT(pv_r2d) ) THEN 
     
    13991399            CALL xios_recv_field( trim(cdvar), pv_r2d(:, :)) 
    14001400            IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN 
    1401                CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill) 
     1401               CALL lbc_lnk('iom', pv_r2d, cl_type, CASTSP(zsgn), kfillmode = kfill) 
    14021402            ENDIF 
    14031403         ELSEIF( PRESENT(pv_r1d) ) THEN 
     
    14341434   SUBROUTINE iom_get_var( cdname, z2d) 
    14351435      CHARACTER(LEN=*), INTENT(in ) ::   cdname 
    1436       REAL(wp), DIMENSION(jpi,jpj) ::   z2d 
     1436      REAL(dp), DIMENSION(jpi,jpj) ::   z2d 
    14371437#if defined key_xios 
    14381438      IF( xios_field_is_active( cdname, at_current_timestep_arg = .TRUE. ) ) THEN 
     
    15081508      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
    15091509      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
    1510       REAL(wp)              , INTENT(  out)           ::   patt0d    ! read field 
     1510      REAL(dp)              , INTENT(  out)           ::   patt0d    ! read field 
    15111511      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
    15121512      ! 
     
    15191519      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
    15201520      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
    1521       REAL(wp), DIMENSION(:), INTENT(  out)           ::   patt1d    ! read field 
     1521      REAL(dp), DIMENSION(:), INTENT(  out)           ::   patt1d    ! read field 
    15221522      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
    15231523      ! 
     
    15781578      INTEGER               , INTENT(in   )           ::   kiomid    ! Identifier of the file 
    15791579      CHARACTER(len=*)      , INTENT(in   )           ::   cdatt     ! Name of the attribute 
    1580       REAL(wp), DIMENSION(:), INTENT(in   )           ::   patt1d    ! written field 
     1580      REAL(dp), DIMENSION(:), INTENT(in   )           ::   patt1d    ! written field 
    15811581      CHARACTER(len=*)      , INTENT(in   ), OPTIONAL ::   cdvar     ! Name of the variable 
    15821582      ! 
     
    19381938      INTEGER  :: indim 
    19391939      LOGICAL  :: llattexist 
    1940       REAL(wp), ALLOCATABLE, DIMENSION(:) ::   zreal1d 
     1940      REAL(dp), ALLOCATABLE, DIMENSION(:) ::   zreal1d 
    19411941      !!--------------------------------------------------------------------- 
    19421942      ! 
     
    22022202      !!---------------------------------------------------------------------- 
    22032203      CHARACTER(LEN=*)      , INTENT(in) ::   cdid 
    2204       REAL(wp), DIMENSION(:)  , OPTIONAL, INTENT(in) ::   paxis 
    2205       REAL(wp), DIMENSION(:,:), OPTIONAL, INTENT(in) ::   bounds 
     2204      REAL(dp), DIMENSION(:)  , OPTIONAL, INTENT(in) ::   paxis 
     2205      REAL(dp), DIMENSION(:,:), OPTIONAL, INTENT(in) ::   bounds 
    22062206      !!---------------------------------------------------------------------- 
    22072207      IF( PRESENT(paxis) ) THEN 
     
    23192319      !!---------------------------------------------------------------------- 
    23202320      CHARACTER(LEN=1)            , INTENT(in) ::   cdgrd 
    2321       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plon 
    2322       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
    2323       ! 
    2324       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zmask 
     2321      REAL(dp), DIMENSION(jpi,jpj), INTENT(in) ::   plon 
     2322      REAL(dp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
     2323      ! 
     2324      REAL(dp), DIMENSION(jpi,jpj,jpk) ::   zmask 
    23252325      INTEGER :: jn 
    23262326      INTEGER, DIMENSION(nijtile) :: ini, inj, idb 
     
    23762376      !!---------------------------------------------------------------------- 
    23772377      CHARACTER(LEN=1)                      , INTENT(in) :: cdgrd 
    2378       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) :: plon_cnr, plat_cnr  ! Lat/lon coord. of a contiguous vertex of cell (i,j) 
    2379       REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) :: plon_pnt, plat_pnt  ! Lat/lon coord. of the point of cell (i,j) 
     2378      REAL(dp), DIMENSION(jpi,jpj)          , INTENT(in) :: plon_cnr, plat_cnr  ! Lat/lon coord. of a contiguous vertex of cell (i,j) 
     2379      REAL(dp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) :: plon_pnt, plat_pnt  ! Lat/lon coord. of the point of cell (i,j) 
    23802380      ! 
    23812381      INTEGER :: ji, jj, jn 
     
    23842384      !                                                 bottom-left corner of 
    23852385      !                                                 cell (i,j) 
    2386       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: z_bnds      ! Lat/lon coordinates of the vertices of cell (i,j) 
    2387       REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: z_fld       ! Working array to determine where to rotate cells 
    2388       REAL(wp), ALLOCATABLE, DIMENSION(:,:)     :: z_rot       ! Lat/lon working array for rotation of cells 
     2386      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:,:) :: z_bnds      ! Lat/lon coordinates of the vertices of cell (i,j) 
     2387      REAL(dp), ALLOCATABLE, DIMENSION(:,:)     :: z_fld       ! Working array to determine where to rotate cells 
     2388      REAL(dp), ALLOCATABLE, DIMENSION(:,:)     :: z_rot       ! Lat/lon working array for rotation of cells 
    23892389      !!---------------------------------------------------------------------- 
    23902390      ! 
     
    24362436      !! 
    24372437      !!---------------------------------------------------------------------- 
    2438       REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
     2438      REAL(dp), DIMENSION(jpi,jpj), INTENT(in) ::   plat 
    24392439      ! 
    24402440      INTEGER  :: ix, iy 
    2441       REAL(wp), DIMENSION(:), ALLOCATABLE  ::   zlon 
     2441      REAL(dp), DIMENSION(:), ALLOCATABLE  ::   zlon 
    24422442      !!---------------------------------------------------------------------- 
    24432443      ! 
     
    24902490      INTEGER                        ::   ji, jg                   ! loop counters 
    24912491      INTEGER                        ::   ix, iy                   ! i-,j- index 
    2492       REAL(wp)        ,DIMENSION(11) ::   zlontao                  ! longitudes of tao    moorings 
    2493       REAL(wp)        ,DIMENSION( 7) ::   zlattao                  ! latitudes  of tao    moorings 
    2494       REAL(wp)        ,DIMENSION( 4) ::   zlonrama                 ! longitudes of rama   moorings 
    2495       REAL(wp)        ,DIMENSION(11) ::   zlatrama                 ! latitudes  of rama   moorings 
    2496       REAL(wp)        ,DIMENSION( 3) ::   zlonpira                 ! longitudes of pirata moorings 
    2497       REAL(wp)        ,DIMENSION( 9) ::   zlatpira                 ! latitudes  of pirata moorings 
     2492      REAL(dp)        ,DIMENSION(11) ::   zlontao                  ! longitudes of tao    moorings 
     2493      REAL(dp)        ,DIMENSION( 7) ::   zlattao                  ! latitudes  of tao    moorings 
     2494      REAL(dp)        ,DIMENSION( 4) ::   zlonrama                 ! longitudes of rama   moorings 
     2495      REAL(dp)        ,DIMENSION(11) ::   zlatrama                 ! latitudes  of rama   moorings 
     2496      REAL(dp)        ,DIMENSION( 3) ::   zlonpira                 ! longitudes of pirata moorings 
     2497      REAL(dp)        ,DIMENSION( 9) ::   zlatpira                 ! latitudes  of pirata moorings 
    24982498      TYPE(xios_duration)            ::   f_op, f_of 
    24992499      !!---------------------------------------------------------------------- 
     
    25552555      !! 
    25562556      !!---------------------------------------------------------------------- 
    2557       REAL(wp), DIMENSION(:), INTENT(in) ::   plon, plat   ! longitudes/latitudes oft the mooring 
     2557      REAL(dp), DIMENSION(:), INTENT(in) ::   plon, plat   ! longitudes/latitudes oft the mooring 
    25582558      ! 
    25592559!!$      CHARACTER(len=1),DIMENSION(4) ::   clgrd = (/ 'T', 'U', 'V', 'W' /)   ! suffix name 
     
    25652565      INTEGER                       ::   ji, jj, jg               ! loop counters 
    25662566      INTEGER                       ::   ix, iy                   ! i-,j- index 
    2567       REAL(wp)                      ::   zlon, zlat 
     2567      REAL(dp)                      ::   zlon, zlat 
    25682568      !!---------------------------------------------------------------------- 
    25692569      DO jg = 1, SIZE(clgrd) 
     
    25862586               IF( zlon == -10. .AND. zlat ==  -8. )   zlat =  -6. 
    25872587               IF( zlon == -10. .AND. zlat ==   4. ) THEN   ;   zlon = 0.   ;   zlat = 0.   ;   ENDIF 
    2588                CALL dom_ngb( zlon, zlat, ix, iy, cl1 ) 
     2588               CALL dom_ngb( CASTSP(zlon), CASTSP(zlat), ix, iy, cl1 ) 
    25892589               IF( zlon >= 0. ) THEN 
    25902590                  IF( zlon == REAL(NINT(zlon), wp) ) THEN   ;   WRITE(clon, '(i3,  a)') NINT( zlon), 'e' 
     
    26342634      INTEGER            ::   itrlen 
    26352635      INTEGER            ::   iyear, imonth, iday, isec 
    2636       REAL(wp)           ::   zsec 
     2636      REAL(dp)           ::   zsec 
    26372637      LOGICAL            ::   llexist 
    26382638      TYPE(xios_duration)   ::   output_freq 
     
    28092809   SUBROUTINE iom_miss_val( cdname, pmiss_val ) 
    28102810      CHARACTER(LEN=*), INTENT(in ) ::   cdname 
    2811       REAL(wp)        , INTENT(out) ::   pmiss_val 
     2811      REAL(dp)        , INTENT(out) ::   pmiss_val 
    28122812      REAL(dp)                      ::   ztmp_pmiss_val 
    28132813#if defined key_xios 
Note: See TracChangeset for help on using the changeset viewer.