diff --git a/src/OCE/ASM/asminc.F90 b/src/OCE/ASM/asminc.F90
index 54371a62c3b73a6d626d97937dbbf52d20a565b8..850dfb0999d2e0eae94e34023068916aad36e46a 100644
--- a/src/OCE/ASM/asminc.F90
+++ b/src/OCE/ASM/asminc.F90
@@ -94,6 +94,7 @@ MODULE asminc
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -119,11 +120,11 @@ CONTAINS
       INTEGER :: ios             ! Local integer output status for namelist read
       INTEGER :: iiauper         ! Number of time steps in the IAU period
       INTEGER :: icycper         ! Number of time steps in the cycle
-      REAL(KIND=dp) :: ditend_date     ! Date YYYYMMDD.HHMMSS of final time step
-      REAL(KIND=dp) :: ditbkg_date     ! Date YYYYMMDD.HHMMSS of background time step for Jb term
-      REAL(KIND=dp) :: ditdin_date     ! Date YYYYMMDD.HHMMSS of background time step for DI
-      REAL(KIND=dp) :: ditiaustr_date  ! Date YYYYMMDD.HHMMSS of IAU interval start time step
-      REAL(KIND=dp) :: ditiaufin_date  ! Date YYYYMMDD.HHMMSS of IAU interval final time step
+      REAL(KIND=wp) :: ditend_date     ! Date YYYYMMDD.HHMMSS of final time step
+      REAL(KIND=wp) :: ditbkg_date     ! Date YYYYMMDD.HHMMSS of background time step for Jb term
+      REAL(KIND=wp) :: ditdin_date     ! Date YYYYMMDD.HHMMSS of background time step for DI
+      REAL(KIND=wp) :: ditiaustr_date  ! Date YYYYMMDD.HHMMSS of IAU interval start time step
+      REAL(KIND=wp) :: ditiaufin_date  ! Date YYYYMMDD.HHMMSS of IAU interval final time step
 
       REAL(wp) :: znorm        ! Normalization factor for IAU weights
       REAL(wp) :: ztotwgt      ! Value of time-integrated IAU weights (should be equal to one)
@@ -514,7 +515,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) :: kt             ! Current time step
       INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Krhs ! Time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers and RHS of tracer equation
       !
       INTEGER  :: ji, jj, jk
       INTEGER  :: it
@@ -526,7 +527,7 @@ CONTAINS
       ! used to prevent the applied increments taking the temperature below the local freezing point
       IF( ln_temnofreeze ) THEN
          DO jk = 1, jpkm1
-           CALL eos_fzp( pts(:,:,jk,jp_sal,Kmm), fzptnz(:,:,jk), gdept(:,:,jk,Kmm) )
+           CALL eos_fzp( CASTSP(pts(:,:,jk,jp_sal,Kmm)), fzptnz(:,:,jk), gdept(:,:,jk,Kmm) )
          END DO
       ENDIF
          !
@@ -648,7 +649,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt             ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv       ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv       ! ocean velocities and RHS of momentum equation
       !
       INTEGER :: ji, jj, jk
       INTEGER :: it
diff --git a/src/OCE/BDY/bdy_oce.F90 b/src/OCE/BDY/bdy_oce.F90
index d42f6a429ef0e5ad13aece5d8b910afc8e71f00e..177026bfee3ab5441d152404722b3aa33ee20b04 100644
--- a/src/OCE/BDY/bdy_oce.F90
+++ b/src/OCE/BDY/bdy_oce.F90
@@ -173,4 +173,3 @@ CONTAINS
 
    !!======================================================================
 END MODULE bdy_oce
-
diff --git a/src/OCE/BDY/bdydyn.F90 b/src/OCE/BDY/bdydyn.F90
index 61e4d378d12667ffb19f81dd40b40612c89c9e84..2a30046a26250e85c98175193f76b8412b927ab0 100644
--- a/src/OCE/BDY/bdydyn.F90
+++ b/src/OCE/BDY/bdydyn.F90
@@ -47,7 +47,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in)    ::   kt           ! Main time step counter
       INTEGER                             , INTENT(in)    ::   Kbb, Kaa     ! Ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv     ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv     ! Ocean velocities (to be updated at open boundaries)
       LOGICAL, OPTIONAL                   , INTENT(in)    ::   dyn3d_only   ! T => only update baroclinic velocities
       !
       INTEGER ::   jk, ii, ij, ib_bdy, ib, igrd     ! Loop counter
diff --git a/src/OCE/BDY/bdydyn2d.F90 b/src/OCE/BDY/bdydyn2d.F90
index f3971aea4d74d612d59d3acb0dd7906fa99cc860..1872bd06e343713df89b3af8ce5dde5617d398ba 100644
--- a/src/OCE/BDY/bdydyn2d.F90
+++ b/src/OCE/BDY/bdydyn2d.F90
@@ -46,7 +46,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pua2d, pva2d 
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pub2d, pvb2d
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: phur, phvr
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pssh
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(in   ) :: pssh
       !!
       INTEGER               ::   ib_bdy, ir     ! BDY set index, rim index
       INTEGER, DIMENSION(3) ::   idir3
@@ -183,7 +183,8 @@ CONTAINS
       TYPE(OBC_DATA),               INTENT(in) ::   dta  ! OBC external data
       INTEGER,                      INTENT(in) ::   ib_bdy  ! BDY set index
       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) :: pua2d, pva2d
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) ::   pssh, phur, phvr
+      REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: phur, phvr
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(in)  :: pssh
       LOGICAL                     , INTENT(in) ::   llrim0   ! indicate if rim 0 is treated
       INTEGER  ::   ibeg, iend                       ! length of rim to be treated (rim 0 or rim 1)
       INTEGER  ::   jb, igrd                         ! dummy loop indices
@@ -312,7 +313,7 @@ CONTAINS
       !! ** Purpose : Duplicate sea level across open boundaries
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,1), INTENT(inout) ::   zssh ! Sea level, need 3 dimensions to be used by bdy_nmn
+      REAL(dp), DIMENSION(jpi,jpj,1), INTENT(inout) ::   zssh ! Sea level, need 3 dimensions to be used by bdy_nmn
       !!
       INTEGER ::   ib_bdy, ir      ! bdy index, rim index
       INTEGER ::   ibeg, iend      ! length of rim to be treated (rim 0 or rim 1)
@@ -332,7 +333,7 @@ CONTAINS
          END DO
          IF( nn_hls > 1 .AND. ir == 1 ) CYCLE   ! at least 2 halos will be corrected -> no need to correct rim 1 before rim 0
          IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN   ! if need to send/recv in at least one direction
-            CALL lbc_lnk( 'bdydyn2d', zssh(:,:,1), 'T',  1.0_wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
+            CALL lbc_lnk( 'bdydyn2d', zssh(:,:,1), 'T',  1.0_dp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
          END IF
       END DO
       !
@@ -340,4 +341,3 @@ CONTAINS
 
    !!======================================================================
 END MODULE bdydyn2d
-
diff --git a/src/OCE/BDY/bdydyn3d.F90 b/src/OCE/BDY/bdydyn3d.F90
index 8b4bd77d39a793a058f71f28bc797589b66d90eb..db3d30485ad6badcf36bd01d5beb7ec5f41c715b 100644
--- a/src/OCE/BDY/bdydyn3d.F90
+++ b/src/OCE/BDY/bdydyn3d.F90
@@ -41,7 +41,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   kt        ! Main time step counter
       INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       !
       INTEGER               ::   ib_bdy, ir     ! BDY set index, rim index
       INTEGER, DIMENSION(6) ::   idir6
@@ -101,10 +101,10 @@ CONTAINS
          END DO
          !
          IF( ANY(llsend2) .OR. ANY(llrecv2) ) THEN   ! if need to send/recv in at least one direction
-            CALL lbc_lnk( 'bdydyn2d', puu(:,:,:,Kaa), 'U', -1.0_wp, kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 )
+            CALL lbc_lnk( 'bdydyn2d', puu(:,:,:,Kaa), 'U', -1.0_dp, kfillmode=jpfillnothing ,lsend=llsend2, lrecv=llrecv2 )
          END IF
          IF( ANY(llsend3) .OR. ANY(llrecv3) ) THEN   ! if need to send/recv in at least one direction
-            CALL lbc_lnk( 'bdydyn2d', pvv(:,:,:,Kaa), 'V', -1.0_wp, kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 )
+            CALL lbc_lnk( 'bdydyn2d', pvv(:,:,:,Kaa), 'V', -1.0_dp, kfillmode=jpfillnothing ,lsend=llsend3, lrecv=llrecv3 )
          END IF
       END DO   ! ir
       !
@@ -120,7 +120,7 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
       INTEGER                             , INTENT( in    ) ::   kt        ! Time step
@@ -159,7 +159,7 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
       INTEGER                             , INTENT( in    ) ::   kt
@@ -224,7 +224,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   kt        ! time step index
       INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
       INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
@@ -267,7 +267,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   kt        ! time step index
       INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
       INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
@@ -311,7 +311,7 @@ CONTAINS
       !! References:  Marchesiello, McWilliams and Shchepetkin, Ocean Modelling vol. 3 (2001)    
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   Kbb, Kaa  ! Time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       TYPE(OBC_DATA)                      , INTENT( in    ) ::   dta       ! OBC external data
       INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
@@ -343,7 +343,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   kt        ! time step
       INTEGER                             , INTENT( in    ) ::   Kbb, Krhs ! Time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities and trends (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities and trends (to be updated at open boundaries)
       !
       INTEGER  ::   jb, jk         ! dummy loop indices
       INTEGER  ::   ib_bdy         ! loop index
@@ -395,7 +395,7 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in    ) ::   Kaa       ! Time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT( inout ) ::   puu, pvv  ! Ocean velocities (to be updated at open boundaries)
       TYPE(OBC_INDEX)                     , INTENT( in    ) ::   idx       ! OBC indices
       INTEGER                             , INTENT( in    ) ::   ib_bdy    ! BDY set index
       LOGICAL                             , INTENT( in    ) ::   llrim0    ! indicate if rim 0 is treated
diff --git a/src/OCE/BDY/bdylib.F90 b/src/OCE/BDY/bdylib.F90
index e73eb3c4902b01580d3bd8b5223d8a826478112b..0cecd3850b81d432099c3f4249c01fe3991d35ee 100644
--- a/src/OCE/BDY/bdylib.F90
+++ b/src/OCE/BDY/bdylib.F90
@@ -44,7 +44,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices
       REAL(wp), DIMENSION(:,:), POINTER,   INTENT(in) ::   dta  ! OBC external data
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend
       !!
       REAL(wp) ::   zwgt           ! boundary weight
       INTEGER  ::   ib, ik, igrd   ! dummy loop indices
@@ -73,7 +73,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices
       REAL(wp), DIMENSION(:,:), POINTER,   INTENT(in) ::   dta  ! OBC external data
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   phia  ! tracer trend
       !!
       INTEGER  ::   ib, ik, igrd   ! dummy loop indices
       INTEGER  ::   ii, ij         ! 2D addresses
@@ -101,8 +101,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       TYPE(OBC_INDEX),                   INTENT(in   ) ::   idx  ! OBC indices
       REAL(wp), DIMENSION(:,:), POINTER, INTENT(in   ) ::   dta  ! OBC external data
-      REAL(wp), DIMENSION(jpi,jpj,jpk),  INTENT(inout) ::   phib  ! before tracer field
-      REAL(wp), DIMENSION(jpi,jpj,jpk),  INTENT(inout) ::   phia  ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk),  INTENT(inout) ::   phib  ! before tracer field
+      REAL(dp), DIMENSION(jpi,jpj,jpk),  INTENT(inout) ::   phia  ! tracer trend
       LOGICAL ,                          INTENT(in   ) ::   lrim0   ! indicate if rim 0 is treated
       LOGICAL ,                          INTENT(in   ) ::   ll_npo  ! switch for NPO version
       !!
@@ -145,14 +145,14 @@ CONTAINS
       REAL(wp) ::   zmask_x, zmask_y1, zmask_y2
       REAL(wp) ::   zex1, zex2, zey, zey1, zey2
       REAL(wp) ::   zdt, zdx, zdy, znor2, zrx, zry         ! intermediate calculations
-      REAL(wp) ::   zout, zwgt, zdy_centred
+      REAL(dp) ::   zout, zwgt, zdy_centred
       REAL(wp) ::   zdy_1, zdy_2, zsign_ups
       REAL(wp), PARAMETER :: zepsilon = 1.e-30                 ! local small value
       REAL(wp), POINTER, DIMENSION(:,:)          :: zmask      ! land/sea mask for field
       REAL(wp), POINTER, DIMENSION(:,:)          :: zmask_xdif ! land/sea mask for x-derivatives
       REAL(wp), POINTER, DIMENSION(:,:)          :: zmask_ydif ! land/sea mask for y-derivatives
-      REAL(wp), POINTER, DIMENSION(:,:)          :: pe_xdif    ! scale factors for x-derivatives
-      REAL(wp), POINTER, DIMENSION(:,:)          :: pe_ydif    ! scale factors for y-derivatives
+      REAL(dp), POINTER, DIMENSION(:,:)          :: pe_xdif    ! scale factors for x-derivatives
+      REAL(dp), POINTER, DIMENSION(:,:)          :: pe_ydif    ! scale factors for y-derivatives
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------!
@@ -291,8 +291,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       TYPE(OBC_INDEX),                     INTENT(in   ) ::   idx      ! BDY indices
       INTEGER ,                            INTENT(in   ) ::   igrd     ! grid index
-      REAL(wp), DIMENSION(:,:,:),          INTENT(in   ) ::   phib     ! model before 3D field
-      REAL(wp), DIMENSION(:,:,:),          INTENT(inout) ::   phia     ! model after 3D field (to be updated)
+      REAL(dp), DIMENSION(:,:,:),          INTENT(in   ) ::   phib     ! model before 3D field
+      REAL(dp), DIMENSION(:,:,:),          INTENT(inout) ::   phia     ! model after 3D field (to be updated)
       REAL(wp), DIMENSION(:,:  ), POINTER, INTENT(in   ) ::   phi_ext  ! external forcing data
       LOGICAL ,                            INTENT(in   ) ::   lrim0    ! indicate if rim 0 is treated
       LOGICAL ,                            INTENT(in   ) ::   ll_npo   ! switch for NPO version
@@ -307,14 +307,14 @@ CONTAINS
       REAL(wp) ::   zmask_x, zmask_y1, zmask_y2
       REAL(wp) ::   zex1, zex2, zey, zey1, zey2
       REAL(wp) ::   zdt, zdx, zdy, znor2, zrx, zry         ! intermediate calculations
-      REAL(wp) ::   zout, zwgt, zdy_centred
+      REAL(dp) ::   zout, zwgt, zdy_centred
       REAL(wp) ::   zdy_1, zdy_2,  zsign_ups
       REAL(wp), PARAMETER :: zepsilon = 1.e-30                 ! local small value
       REAL(wp), POINTER, DIMENSION(:,:,:)        :: zmask      ! land/sea mask for field
       REAL(wp), POINTER, DIMENSION(:,:,:)        :: zmask_xdif ! land/sea mask for x-derivatives
       REAL(wp), POINTER, DIMENSION(:,:,:)        :: zmask_ydif ! land/sea mask for y-derivatives
-      REAL(wp), POINTER, DIMENSION(:,:)          :: pe_xdif    ! scale factors for x-derivatives
-      REAL(wp), POINTER, DIMENSION(:,:)          :: pe_ydif    ! scale factors for y-derivatives
+      REAL(dp), POINTER, DIMENSION(:,:)          :: pe_xdif    ! scale factors for x-derivatives
+      REAL(dp), POINTER, DIMENSION(:,:)          :: pe_ydif    ! scale factors for y-derivatives
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------!
@@ -457,7 +457,7 @@ CONTAINS
       !!                                                   !      o      
       !!----------------------------------------------------------------------
       INTEGER,                    INTENT(in   )  ::   igrd     ! grid index
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout)  ::   phia     ! model after 3D field (to be updated), must be masked
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout)  ::   phia     ! model after 3D field (to be updated), must be masked
       TYPE(OBC_INDEX),            INTENT(in   )  ::   idx      ! OBC indices
       LOGICAL ,                   INTENT(in   )  ::   lrim0    ! indicate if rim 0 is treated
       !! 
diff --git a/src/OCE/BDY/bdytides.F90 b/src/OCE/BDY/bdytides.F90
index 731214e7f76a32f63f0e9e3296b512354761286e..0c14f5ba2dcef0e64e0ce5d8771194b8377a48ca 100644
--- a/src/OCE/BDY/bdytides.F90
+++ b/src/OCE/BDY/bdytides.F90
@@ -474,4 +474,3 @@ CONTAINS
 
    !!======================================================================
 END MODULE bdytides
-
diff --git a/src/OCE/BDY/bdytra.F90 b/src/OCE/BDY/bdytra.F90
index 333fdf7f3f21d73a24ff0642aef7d988020e46e1..a4cf4117beab1194b14813bdf20d3fa7eea8123e 100644
--- a/src/OCE/BDY/bdytra.F90
+++ b/src/OCE/BDY/bdytra.F90
@@ -49,7 +49,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: kt        ! Main time step counter
       INTEGER                                  , INTENT(in)    :: Kbb, Kaa  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! tracer fields
       !
       INTEGER                        :: ib_bdy, jn, igrd, ir   ! Loop indeces
       TYPE(ztrabdy), DIMENSION(jpts) :: zdta                   ! Temporary data structure
@@ -100,7 +100,7 @@ CONTAINS
             END SELECT
          END DO
          IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN   ! if need to send/recv in at least one direction
-            CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T',  1.0_wp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
+            CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T',  1.0_dp, kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 )
          ENDIF
          !
       END DO   ! ir
@@ -118,7 +118,7 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       TYPE(OBC_INDEX),                     INTENT(in) ::   idx      ! OBC indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt       ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt       ! tracer trend
       INTEGER,                             INTENT(in) ::   jpa      ! TRA index
       LOGICAL,                             INTENT(in) ::   llrim0   ! indicate if rim 0 is treated
       !
@@ -149,7 +149,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: kt        ! time step
       INTEGER                                  , INTENT(in)    :: Kbb, Krhs ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
       !
       REAL(wp) ::   zwgt           ! boundary weight
       REAL(wp) ::   zta, zsa, ztime
diff --git a/src/OCE/C1D/dtauvd.F90 b/src/OCE/C1D/dtauvd.F90
index fc64c2583bd213ec5dd3747470854a7ab020d2cc..b91d1a9960a990bc171e046b3ac8c3e5f6248c81 100644
--- a/src/OCE/C1D/dtauvd.F90
+++ b/src/OCE/C1D/dtauvd.F90
@@ -134,8 +134,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                           , INTENT(in   ) ::   kt     ! ocean time-step
       INTEGER                           , INTENT(in   ) ::   Kmm    ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk)  , INTENT(  out) ::   pud    ! U & V current data
-      REAL(wp), DIMENSION(jpi,jpj,jpk)  , INTENT(  out) ::   pvd    ! U & V current data
+      REAL(dp), DIMENSION(jpi,jpj,jpk)  , INTENT(  out) ::   pud    ! U & V current data
+      REAL(dp), DIMENSION(jpi,jpj,jpk)  , INTENT(  out) ::   pvd    ! U & V current data
       !
       INTEGER ::   ji, jj, jk, jl, jkk               ! dummy loop indicies
       INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1  ! local integers
diff --git a/src/OCE/C1D/dyndmp.F90 b/src/OCE/C1D/dyndmp.F90
index 5cfd953c9a7c36ab96d5847893a6c7ae151d5087..cc335dc780de2d0b7811d41ce7cb6f8c80767680 100644
--- a/src/OCE/C1D/dyndmp.F90
+++ b/src/OCE/C1D/dyndmp.F90
@@ -148,11 +148,11 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in   ) ::   kt             ! ocean time-step index
       INTEGER                             , INTENT(in   ) ::   Kbb, Kmm, Krhs ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv       ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv       ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zua, zva     ! local scalars
-      REAL(wp), DIMENSION(jpi,jpj,jpk,2) ::   zuv_dta   ! Read in data 
+      REAL(dp), DIMENSION(jpi,jpj,jpk,2) ::   zuv_dta   ! Read in data
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start( 'dyn_dmp' )
diff --git a/src/OCE/CRS/crs.F90 b/src/OCE/CRS/crs.F90
index 652c9f12a02d93301f0c3d2c7f99c085d4c7dd7b..a81f4b342e7e8ecc76d7a490ee73b3127bdb2c95 100644
--- a/src/OCE/CRS/crs.F90
+++ b/src/OCE/CRS/crs.F90
@@ -316,4 +316,3 @@ CONTAINS
    
    !!======================================================================
 END MODULE crs
-
diff --git a/src/OCE/CRS/crsdom.F90 b/src/OCE/CRS/crsdom.F90
index bd2225b3bb60937e1174f2c7980bd7ee5300f1fe..3cf4192128f02ae13fd97a874fefd1a2f5bec067 100644
--- a/src/OCE/CRS/crsdom.F90
+++ b/src/OCE/CRS/crsdom.F90
@@ -245,8 +245,8 @@ CONTAINS
       !!----------------------------------------------------------------
       !! 
       !!  Arguments
-      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(in)  :: p_e1     ! Parent grid U,V scale factors (e1)
-      REAL(wp), DIMENSION(jpi,jpj)        , INTENT(in)  :: p_e2     ! Parent grid U,V scale factors (e2)
+      REAL(dp), DIMENSION(jpi,jpj)        , INTENT(in)  :: p_e1     ! Parent grid U,V scale factors (e1)
+      REAL(dp), DIMENSION(jpi,jpj)        , INTENT(in)  :: p_e2     ! Parent grid U,V scale factors (e2)
       CHARACTER(len=1)                    , INTENT(in)  :: cd_type  ! grid type U,V 
 
       REAL(wp), DIMENSION(jpi_crs,jpj_crs), INTENT(out) :: p_e1_crs ! Coarse grid box 2D quantity
@@ -342,8 +342,8 @@ CONTAINS
       !!----------------------------------------------------------------
       CHARACTER(len=1),                         INTENT(in   ) ::   cd_type    ! grid type U,V 
       REAL(wp), DIMENSION(jpi,jpj,jpk)        , INTENT(in   ) ::   p_mask     ! Parent grid U,V mask
-      REAL(wp), DIMENSION(jpi,jpj)            , INTENT(in   ) ::   p_e1       ! Parent grid U,V scale factors (e1)
-      REAL(wp), DIMENSION(jpi,jpj)            , INTENT(in   ) ::   p_e2       ! Parent grid U,V scale factors (e2)
+      REAL(dp), DIMENSION(jpi,jpj)            , INTENT(in   ) ::   p_e1       ! Parent grid U,V scale factors (e1)
+      REAL(dp), DIMENSION(jpi,jpj)            , INTENT(in   ) ::   p_e2       ! Parent grid U,V scale factors (e2)
       REAL(wp), DIMENSION(jpi,jpj,jpk)        , INTENT(in   ) ::   p_e3       ! Parent grid vertical level thickness (e3u, e3v)
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(  out) ::   p_fld1_crs ! Coarse grid box 3D quantity 
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(  out) ::   p_fld2_crs ! Coarse grid box 3D quantity 
@@ -473,7 +473,7 @@ CONTAINS
       CHARACTER(len=3),                         INTENT(in)           :: cd_op      ! Operation SUM, MAX or MIN
       CHARACTER(len=1),                         INTENT(in)           :: cd_type    ! grid type U,V 
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in)           :: p_mask     ! Parent grid T,U,V mask
-      REAL(wp), DIMENSION(jpi,jpj),             INTENT(in), OPTIONAL :: p_e12      ! Parent grid T,U,V scale factors (e1 or e2)
+      REAL(dp), DIMENSION(jpi,jpj),             INTENT(in), OPTIONAL :: p_e12      ! Parent grid T,U,V scale factors (e1 or e2)
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in), OPTIONAL :: p_e3       ! Parent grid vertical level thickness (e3u, e3v)
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_surf_crs ! Coarse grid area-weighting denominator    
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_mask_crs ! Coarse grid T,U,V maska
@@ -1135,7 +1135,7 @@ CONTAINS
       CHARACTER(len=3),                         INTENT(in)           :: cd_op    ! Operation SUM, MAX or MIN
       CHARACTER(len=1),                         INTENT(in)           :: cd_type    ! grid type U,V 
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in)           :: p_mask    ! Parent grid T,U,V mask
-      REAL(wp), DIMENSION(jpi,jpj),             INTENT(in), OPTIONAL :: p_e12    ! Parent grid T,U,V scale factors (e1 or e2)
+      REAL(dp), DIMENSION(jpi,jpj),             INTENT(in), OPTIONAL :: p_e12    ! Parent grid T,U,V scale factors (e1 or e2)
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in), OPTIONAL :: p_e3     ! Parent grid vertical level thickness (e3u, e3v)
       REAL(wp), DIMENSION(jpi_crs,jpj_crs)    , INTENT(in), OPTIONAL :: p_surf_crs ! Coarse grid area-weighting denominator    
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in), OPTIONAL :: p_mask_crs    ! Coarse grid T,U,V mask
@@ -1630,7 +1630,7 @@ CONTAINS
       !!  Arguments
       CHARACTER(len=1),                         INTENT(in) :: cd_type      ! grid type T, W ( U, V, F)
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in) :: p_mask       ! Parent grid T mask
-      REAL(wp), DIMENSION(jpi,jpj)    ,         INTENT(in) :: p_e1, p_e2   ! 2D tracer T or W on parent grid
+      REAL(dp), DIMENSION(jpi,jpj)    ,         INTENT(in) :: p_e1, p_e2   ! 2D tracer T or W on parent grid
       REAL(wp), DIMENSION(jpi,jpj,jpk),         INTENT(in) :: p_e3         ! 3D tracer T or W on parent grid
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(in) :: p_sfc_crs ! Coarse grid box east or north face quantity
       REAL(wp), DIMENSION(jpi_crs,jpj_crs,jpk), INTENT(inout) :: p_e3_crs ! Coarse grid box east or north face quantity 
diff --git a/src/OCE/CRS/crsdomwri.F90 b/src/OCE/CRS/crsdomwri.F90
index 18be27381814986bc867e0c4191fd1ccc23d76e7..333e23b9e4af9feaa66657abda9b5e4db99886a6 100644
--- a/src/OCE/CRS/crsdomwri.F90
+++ b/src/OCE/CRS/crsdomwri.F90
@@ -201,5 +201,3 @@ CONTAINS
    !!======================================================================
 
 END MODULE crsdomwri
-
-
diff --git a/src/OCE/CRS/crsfld.F90 b/src/OCE/CRS/crsfld.F90
index b8115048d68e1faff79a13d65c186ca77fb2a250..b2cb6e734d6688c1f8421a50e7caa8e7ca9dc11f 100644
--- a/src/OCE/CRS/crsfld.F90
+++ b/src/OCE/CRS/crsfld.F90
@@ -32,6 +32,7 @@ MODULE crsfld
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -116,30 +117,30 @@ CONTAINS
       CALL iom_put( "sss"  , tsn_crs(:,:,1,jp_sal) )    ! sss
 
       !  U-velocity
-      CALL crs_dom_ope( uu(:,:,:,Kmm), 'SUM', 'U', umask, un_crs, p_e12=e2u, p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( CASTSP(uu(:,:,:,Kmm)), 'SUM', 'U', umask, un_crs, p_e12=CASTDP(e2u), p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
       !
       zt(:,:,:) = 0._wp     ;    zs(:,:,:) = 0._wp  ;   zt_crs(:,:,:) = 0._wp   ;    zs_crs(:,:,:) = 0._wp
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          zt(ji,jj,jk)  = uu(ji,jj,jk,Kmm) * 0.5 * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji+1,jj,jk,jp_tem,Kmm) ) 
          zs(ji,jj,jk)  = uu(ji,jj,jk,Kmm) * 0.5 * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji+1,jj,jk,jp_sal,Kmm) ) 
       END_3D
-      CALL crs_dom_ope( zt, 'SUM', 'U', umask, zt_crs, p_e12=e2u, p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
-      CALL crs_dom_ope( zs, 'SUM', 'U', umask, zs_crs, p_e12=e2u, p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( zt, 'SUM', 'U', umask, zt_crs, p_e12=CASTDP(e2u), p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( zs, 'SUM', 'U', umask, zs_crs, p_e12=CASTDP(e2u), p_e3=ze3u, p_surf_crs=e2e3u_msk, psgn=-1.0_wp )
 
       CALL iom_put( "uoce"  , un_crs )   ! i-current 
       CALL iom_put( "uocet" , zt_crs )   ! uT
       CALL iom_put( "uoces" , zs_crs )   ! uS
 
       !  V-velocity
-      CALL crs_dom_ope( vv(:,:,:,Kmm), 'SUM', 'V', vmask, vn_crs, p_e12=e1v, p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( CASTSP(vv(:,:,:,Kmm)), 'SUM', 'V', vmask, vn_crs, p_e12=CASTDP(e1v), p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
       !                                                                                 
       zt(:,:,:) = 0._wp     ;    zs(:,:,:) = 0._wp  ;   zt_crs(:,:,:) = 0._wp   ;    zs_crs(:,:,:) = 0._wp
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
          zt(ji,jj,jk)  = vv(ji,jj,jk,Kmm) * 0.5 * ( ts(ji,jj,jk,jp_tem,Kmm) + ts(ji,jj+1,jk,jp_tem,Kmm) ) 
          zs(ji,jj,jk)  = vv(ji,jj,jk,Kmm) * 0.5 * ( ts(ji,jj,jk,jp_sal,Kmm) + ts(ji,jj+1,jk,jp_sal,Kmm) ) 
       END_3D
-      CALL crs_dom_ope( zt, 'SUM', 'V', vmask, zt_crs, p_e12=e1v, p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
-      CALL crs_dom_ope( zs, 'SUM', 'V', vmask, zs_crs, p_e12=e1v, p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( zt, 'SUM', 'V', vmask, zt_crs, p_e12=CASTDP(e1v), p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
+      CALL crs_dom_ope( zs, 'SUM', 'V', vmask, zs_crs, p_e12=CASTDP(e1v), p_e3=ze3v, p_surf_crs=e1e3v_msk, psgn=-1.0_wp )
  
       CALL iom_put( "voce"  , vn_crs )   ! i-current 
       CALL iom_put( "vocet" , zt_crs )   ! vT
@@ -210,9 +211,9 @@ CONTAINS
       CALL iom_put( "avs", avs_crs )   !  Kz on S
       
       !  sbc fields  
-      CALL crs_dom_ope( ssh(:,:,Kmm) , 'VOL', 'T', tmask, sshn_crs , p_e12=e1e2t, p_e3=ze3t           , psgn=1.0_wp )  
-      CALL crs_dom_ope( utau , 'SUM', 'U', umask, utau_crs , p_e12=e2u  , p_surf_crs=e2u_crs  , psgn=1.0_wp )
-      CALL crs_dom_ope( vtau , 'SUM', 'V', vmask, vtau_crs , p_e12=e1v  , p_surf_crs=e1v_crs  , psgn=1.0_wp )
+      CALL crs_dom_ope( CASTSP(ssh(:,:,Kmm)) , 'VOL', 'T', tmask, sshn_crs , p_e12=e1e2t, p_e3=ze3t   , psgn=1.0_wp )
+      CALL crs_dom_ope( utau , 'SUM', 'U', umask, utau_crs , p_e12=CASTDP(e2u)  , p_surf_crs=e2u_crs  , psgn=1.0_wp )
+      CALL crs_dom_ope( vtau , 'SUM', 'V', vmask, vtau_crs , p_e12=CASTDP(e1v)  , p_surf_crs=e1v_crs  , psgn=1.0_wp )
       CALL crs_dom_ope( wndm , 'SUM', 'T', tmask, wndm_crs , p_e12=e1e2t, p_surf_crs=e1e2t_crs, psgn=1.0_wp )
       CALL crs_dom_ope( rnf  , 'MAX', 'T', tmask, rnf_crs                                     , psgn=1.0_wp )
       CALL crs_dom_ope( qsr  , 'SUM', 'T', tmask, qsr_crs  , p_e12=e1e2t, p_surf_crs=e1e2t_crs, psgn=1.0_wp )
diff --git a/src/OCE/CRS/crsini.F90 b/src/OCE/CRS/crsini.F90
index f31fad263d538d1250f320ac6614b5d6429179a1..9f551b52ee71cce536e8cb96d2ecffab20e8f874 100644
--- a/src/OCE/CRS/crsini.F90
+++ b/src/OCE/CRS/crsini.F90
@@ -28,6 +28,7 @@ MODULE crsini
    PUBLIC   crs_init   ! called by nemogcm.F90 module
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -153,8 +154,8 @@ CONTAINS
      !      3.c.1 Horizontal scale factors
 
      CALL crs_dom_hgr( e1t, e2t, 'T', e1t_crs, e2t_crs )
-     CALL crs_dom_hgr( e1u, e2u, 'U', e1u_crs, e2u_crs )
-     CALL crs_dom_hgr( e1v, e2v, 'V', e1v_crs, e2v_crs )
+     CALL crs_dom_hgr( e1u, CASTDP(e2u), 'U', e1u_crs, e2u_crs )
+     CALL crs_dom_hgr( CASTDP(e1v), e2v, 'V', e1v_crs, e2v_crs )
      CALL crs_dom_hgr( e1f, e2f, 'F', e1f_crs, e2f_crs )
 
      e1e2t_crs(:,:) = e1t_crs(:,:) * e2t_crs(:,:)
@@ -183,7 +184,7 @@ CONTAINS
      END DO  
 
      !    3.d.2   Surfaces 
-     CALL crs_dom_sfc( tmask, 'W', e1e2w_crs, e1e2w_msk, p_e1=e1t, p_e2=e2t  )
+     CALL crs_dom_sfc( tmask, 'W', e1e2w_crs, e1e2w_msk, p_e1=CASTSP(e1t), p_e2=CASTSP(e2t)  )
      CALL crs_dom_sfc( umask, 'U', e2e3u_crs, e2e3u_msk, p_e2=e2u, p_e3=ze3u )
      CALL crs_dom_sfc( vmask, 'V', e1e3v_crs, e1e3v_msk, p_e1=e1v, p_e3=ze3v )
    
@@ -193,8 +194,8 @@ CONTAINS
      !    3.d.3   Vertical scale factors
      !
      CALL crs_dom_e3( e1t, e2t, ze3t, e1e2w_crs, 'T', tmask, e3t_crs, e3t_max_crs)
-     CALL crs_dom_e3( e1u, e2u, ze3u, e2e3u_crs, 'U', umask, e3u_crs, e3u_max_crs)
-     CALL crs_dom_e3( e1v, e2v, ze3v, e1e3v_crs, 'V', vmask, e3v_crs, e3v_max_crs)
+     CALL crs_dom_e3( e1u, CASTDP(e2u), ze3u, e2e3u_crs, 'U', umask, e3u_crs, e3u_max_crs)
+     CALL crs_dom_e3( CASTDP(e1v), e2v, ze3v, e1e3v_crs, 'V', vmask, e3v_crs, e3v_max_crs)
      CALL crs_dom_e3( e1t, e2t, ze3w, e1e2w_crs, 'W', tmask, e3w_crs, e3w_max_crs)
 
      ! Replace 0 by e3t_0 or e3w_0
diff --git a/src/OCE/DIA/dia25h.F90 b/src/OCE/DIA/dia25h.F90
index 418f54d16f9f13a50034b29ad5f07fc8dbd43e4b..8c3161eabb8b50f6526cb30502b56be55b23f4ee 100644
--- a/src/OCE/DIA/dia25h.F90
+++ b/src/OCE/DIA/dia25h.F90
@@ -140,7 +140,7 @@ CONTAINS
       INTEGER ::   ji, jj, jk
       INTEGER                          ::   iyear0, nimonth0,iday0            ! start year,imonth,day
       LOGICAL ::   ll_print = .FALSE.    ! =T print and flush numout
-      REAL(wp)                         ::   zsto, zout, zmax, zjulian, zmdi   ! local scalars
+      REAL(dp)                         ::   zsto, zout, zmax, zjulian, zmdi   ! local scalars
       INTEGER                          ::   i_steps                           ! no of timesteps per hour
       REAL(wp), DIMENSION(A2D(0)    )  ::   zw2d, un_dm, vn_dm                ! workspace
       REAL(wp), DIMENSION(A2D(0),jpk)  ::   zw3d                              ! workspace
diff --git a/src/OCE/DIA/diaar5.F90 b/src/OCE/DIA/diaar5.F90
index d54e24b06874668d7b6a97ce09950718b529f6d2..38e70c73fef6886972f9b99e797e3d63eb3e4cb8 100644
--- a/src/OCE/DIA/diaar5.F90
+++ b/src/OCE/DIA/diaar5.F90
@@ -38,6 +38,7 @@ MODULE diaar5
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -117,7 +118,7 @@ CONTAINS
       !
       IF( iom_use( 'voltot' ) .OR. iom_use( 'sshtot' )  .OR. iom_use( 'sshdyn' )  ) THEN
          !                                         ! total volume of liquid seawater
-         zvolssh = glob_sum( 'diaar5', zarea_ssh(:,:) )
+         zvolssh =glob_sum( 'diaar5', CASTDP(zarea_ssh(:,:)) )
          zvol    = vol0 + zvolssh
 
          CALL iom_put( 'voltot', zvol               )
@@ -134,7 +135,7 @@ CONTAINS
          DO jk = 1, jpk
             zgdept(:,:,jk) = gdept(:,:,jk,Kmm)
          END DO
-         CALL eos( ztsn, zrhd, zgdept)                       ! now in situ density using initial salinity
+         CALL eos( CASTDP(ztsn), zrhd, zgdept)                       ! now in situ density using initial salinity
          !
          zbotpres(:,:) = 0._wp                        ! no atmospheric surface pressure, levitating sea-ice
          DO jk = 1, jpkm1
@@ -212,8 +213,8 @@ CONTAINS
             END IF
          ENDIF
          !
-         ztemp = glob_sum( 'diaar5', ztsn(:,:,1,jp_tem) )
-         zsal  = glob_sum( 'diaar5', ztsn(:,:,1,jp_sal) )
+         ztemp =glob_sum( 'diaar5', CASTDP(ztsn(:,:,1,jp_tem)) )
+         zsal  =glob_sum( 'diaar5', CASTDP(ztsn(:,:,1,jp_sal)) )
          zmass = rho0 * ( zarho + zvol )
          !
          CALL iom_put( 'masstot', zmass )
@@ -229,7 +230,7 @@ CONTAINS
             ALLOCATE( ztpot(jpi,jpj,jpk) )
             ztpot(:,:,jpk) = 0._wp
             DO jk = 1, jpkm1
-               ztpot(:,:,jk) = eos_pt_from_ct( ts(:,:,jk,jp_tem,Kmm), ts(:,:,jk,jp_sal,Kmm) )
+               ztpot(:,:,jk) =eos_pt_from_ct( CASTSP(ts(:,:,jk,jp_tem,Kmm)), CASTSP(ts(:,:,jk,jp_sal,Kmm)) )
             END DO
             !
             CALL iom_put( 'toce_pot', ztpot(:,:,:) )  ! potential temperature (TEOS-10 case)
@@ -240,7 +241,7 @@ CONTAINS
                DO jk = 1, jpkm1
                  z2d(:,:) = z2d(:,:) + e1e2t(:,:) * e3t(:,:,jk,Kmm) * ztpot(:,:,jk)
                END DO
-               ztemp = glob_sum( 'diaar5', z2d(:,:)  )
+               ztemp =glob_sum( 'diaar5', CASTDP(z2d(:,:))  )
                CALL iom_put( 'temptot_pot', ztemp / zvol )
              ENDIF
              !
@@ -388,7 +389,7 @@ CONTAINS
             zvol0 (ji,jj) = zvol0 (ji,jj) + zztmp * e1e2t(ji,jj)
             thick0(ji,jj) = thick0(ji,jj) + zztmp
          END_3D
-         vol0 = glob_sum( 'diaar5', zvol0 )
+         vol0 =glob_sum( 'diaar5', CASTDP(zvol0) )
          DEALLOCATE( zvol0 )
 
          IF( iom_use( 'sshthster' ) ) THEN
diff --git a/src/OCE/DIA/diacfl.F90 b/src/OCE/DIA/diacfl.F90
index e35764b3b7894d41c45d1d7098dc640d0b5b97f8..ce855a17eb5b9e3d166f9e5df099875dd8587d86 100644
--- a/src/OCE/DIA/diacfl.F90
+++ b/src/OCE/DIA/diacfl.F90
@@ -33,6 +33,7 @@ MODULE diacfl
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -87,11 +88,11 @@ CONTAINS
 
       !                    ! calculate maximum values and locations
       llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
-      CALL mpp_maxloc( 'diacfl', zCu_cfl, llmsk, zCu_max, iloc_u )
+      CALL mpp_maxloc( 'diacfl', CASTDP(zCu_cfl), llmsk, zCu_max, iloc_u )
       llmsk(Nis0:Nie0,Njs0:Nje0,:) = vmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
-      CALL mpp_maxloc( 'diacfl', zCv_cfl, llmsk, zCv_max, iloc_v )
+      CALL mpp_maxloc( 'diacfl', CASTDP(zCv_cfl), llmsk, zCv_max, iloc_v )
       llmsk(Nis0:Nie0,Njs0:Nje0,:) = wmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
-      CALL mpp_maxloc( 'diacfl', zCw_cfl, llmsk, zCw_max, iloc_w )
+      CALL mpp_maxloc( 'diacfl', CASTDP(zCw_cfl), llmsk, zCw_max, iloc_w )
       !
       IF( lwp ) THEN       ! write out to file
          WRITE(numcfl,FMT='(2x,i6,3x,a6,4x,f7.4,1x,i4,1x,i4,1x,i4)') kt, 'Max Cu', zCu_max, iloc_u(1), iloc_u(2), iloc_u(3)
diff --git a/src/OCE/DIA/diadct.F90 b/src/OCE/DIA/diadct.F90
index 4fa5479f4bd09776fc96de18b9919e0a569515f7..8b3d04026d3244e40b9b7a1a3c05234017c68a66 100644
--- a/src/OCE/DIA/diadct.F90
+++ b/src/OCE/DIA/diadct.F90
@@ -90,6 +90,7 @@ MODULE diadct
 
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -678,13 +679,13 @@ CONTAINS
                   ztn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_tem,Kmm) ) 
                   zsn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) ) 
                   zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop) 
-                  zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rho0+rho0) 
+                  zrhoi =interp(Kmm,k%I,k%J,jk,'V',CASTDP(rhd*rho0+rho0))
                   zsshn =  0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I,k%J+1,Kmm)    ) * vmask(k%I,k%J,1) 
                CASE(2,3) 
                   ztn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_tem,Kmm) ) 
                   zsn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) ) 
                   zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop) 
-                  zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rho0+rho0) 
+                  zrhoi =interp(Kmm,k%I,k%J,jk,'U',CASTDP(rhd*rho0+rho0))
                   zsshn =  0.5*( ssh(k%I,k%J,Kmm) + ssh(k%I+1,k%J,Kmm)    ) * umask(k%I,k%J,1)  
                END SELECT 
                !
@@ -851,13 +852,13 @@ CONTAINS
                  ztn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_tem,Kmm) ) 
                  zsn   = interp(Kmm,k%I,k%J,jk,'V',ts(:,:,:,jp_sal,Kmm) ) 
                  zrhop = interp(Kmm,k%I,k%J,jk,'V',rhop) 
-                 zrhoi = interp(Kmm,k%I,k%J,jk,'V',rhd*rho0+rho0) 
+                 zrhoi =interp(Kmm,k%I,k%J,jk,'V',CASTDP(rhd*rho0+rho0))
 
               CASE(2,3) 
                  ztn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_tem,Kmm) ) 
                  zsn   = interp(Kmm,k%I,k%J,jk,'U',ts(:,:,:,jp_sal,Kmm) ) 
                  zrhop = interp(Kmm,k%I,k%J,jk,'U',rhop) 
-                 zrhoi = interp(Kmm,k%I,k%J,jk,'U',rhd*rho0+rho0) 
+                 zrhoi =interp(Kmm,k%I,k%J,jk,'U',CASTDP(rhd*rho0+rho0))
                  zsshn =  0.5*( ssh(k%I,k%J,Kmm)    + ssh(k%I+1,k%J,Kmm)    ) * umask(k%I,k%J,1)  
               END SELECT 
  
@@ -1168,7 +1169,7 @@ CONTAINS
   INTEGER, INTENT(IN)                          :: Kmm          ! time level index
   INTEGER, INTENT(IN)                          :: ki, kj, kk   ! coordinate of point
   CHARACTER(len=1), INTENT(IN)                 :: cd_point     ! type of point (U, V)
-  REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: ptab         ! variable to compute at (ki, kj, kk )
+  REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(IN) :: ptab         ! variable to compute at (ki, kj, kk )
   REAL(wp)                                     :: interp       ! interpolated variable 
 
   !*local declations
diff --git a/src/OCE/DIA/diadetide.F90 b/src/OCE/DIA/diadetide.F90
index 9d6760039a2f2443cab467c820fbe58863e3eac1..fffe40cd3080d3214421c8b2371d87a1e782d12c 100644
--- a/src/OCE/DIA/diadetide.F90
+++ b/src/OCE/DIA/diadetide.F90
@@ -5,6 +5,7 @@ MODULE diadetide
    !!======================================================================
    !! History :       !  2019  (S. Mueller)
    !!----------------------------------------------------------------------
+   USE par_kind
    USE par_oce        , ONLY :   wp, jpi, jpj
    USE in_out_manager , ONLY :   lwp, numout
    USE iom            , ONLY :   iom_put
diff --git a/src/OCE/DIA/diahsb.F90 b/src/OCE/DIA/diahsb.F90
index f9307c0af070e90c518583828d0158fa46ea0a0f..b6e85fae76aa75300da1260234006ca85f8b089c 100644
--- a/src/OCE/DIA/diahsb.F90
+++ b/src/OCE/DIA/diahsb.F90
@@ -40,17 +40,21 @@ MODULE diahsb
    LOGICAL, PUBLIC ::   ln_diahsb   !: check the heat and salt budgets
 
    REAL(wp) ::   surf_tot              ! ocean surface
-   REAL(wp) ::   frc_t, frc_s, frc_v   ! global forcing trends
+   REAL(wp)  :: frc_s! global forcing trends
+   REAL(dp)  :: frc_t, frc_v! global forcing trends
    REAL(wp) ::   frc_wn_t, frc_wn_s    ! global forcing trends
    !
-   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf
-   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   surf_ini      , ssh_ini          !
+   REAL(dp), DIMENSION(:,:)  , ALLOCATABLE ::   surf
+   REAL(wp), DIMENSION(:,:)  , ALLOCATABLE  :: ssh_ini!
+   REAL(dp), DIMENSION(:,:)  , ALLOCATABLE  :: surf_ini!
    REAL(wp), DIMENSION(:,:)  , ALLOCATABLE ::   ssh_hc_loc_ini, ssh_sc_loc_ini   !
-   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   hc_loc_ini, sc_loc_ini, e3t_ini  !
+   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE  :: hc_loc_ini!
+   REAL(dp), DIMENSION(:,:,:), ALLOCATABLE  :: sc_loc_ini, e3t_ini!
    REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   tmask_ini
 
    !! * Substitutions
 #  include "domzgr_substitute.h90"
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: diahsb.F90 15062 2021-06-28 11:19:48Z jchanut $
@@ -75,16 +79,16 @@ CONTAINS
       INTEGER    ::   ji, jj, jk                  ! dummy loop indice
       REAL(wp)   ::   zdiff_hc    , zdiff_sc      ! heat and salt content variations
       REAL(wp)   ::   zdiff_hc1   , zdiff_sc1     !  -         -     -        -
-      REAL(wp)   ::   zdiff_v1    , zdiff_v2      ! volume variation
+      REAL(dp)   ::   zdiff_v1    , zdiff_v2      ! volume variation
       REAL(wp)   ::   zerr_hc1    , zerr_sc1      ! heat and salt content misfit
       REAL(wp)   ::   zvol_tot                    ! volume
       REAL(wp)   ::   z_frc_trd_t , z_frc_trd_s   !    -     -
-      REAL(wp)   ::   z_frc_trd_v                 !    -     -
+      REAL(dp)   ::   z_frc_trd_v                 !    -     -
       REAL(wp)   ::   z_wn_trd_t , z_wn_trd_s     !    -     -
       REAL(wp)   ::   z_ssh_hc , z_ssh_sc         !    -     -
-      REAL(wp), DIMENSION(jpi,jpj,13)      ::   ztmp
-      REAL(wp), DIMENSION(jpi,jpj,jpkm1,4) ::   ztmpk
-      REAL(wp), DIMENSION(17)              ::   zbg          
+      REAL(dp), DIMENSION(jpi,jpj,13)      ::   ztmp
+      REAL(dp), DIMENSION(jpi,jpj,jpkm1,4) ::   ztmpk
+      REAL(dp), DIMENSION(17)              ::   zbg
       !!---------------------------------------------------------------------------
       IF( ln_timing )   CALL timing_start('dia_hsb')
       !
diff --git a/src/OCE/DIA/diahth.F90 b/src/OCE/DIA/diahth.F90
index 0b8650acf6c31eacf0ef56eb870ebf898a7aee5f..26c97b7dff6b7fffa247c568d1fc887c811d6741 100644
--- a/src/OCE/DIA/diahth.F90
+++ b/src/OCE/DIA/diahth.F90
@@ -342,7 +342,7 @@ CONTAINS
       !
       INTEGER , INTENT(in) ::   Kmm      ! ocean time level index
       REAL(wp), INTENT(in) ::   pdep     ! depth over the heat content
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)    ::   pt   
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in)    ::   pt
       REAL(wp), DIMENSION(jpi,jpj),     INTENT(inout) ::   phtc  
       !
       INTEGER  ::   ji, jj, jk, ik
diff --git a/src/OCE/DIA/diamlr.F90 b/src/OCE/DIA/diamlr.F90
index edd8e19f99b0b6da90be9c07bc91a6aa73108144..0b3010d1b019d082cd33136d30fdf66c31d568fd 100644
--- a/src/OCE/DIA/diamlr.F90
+++ b/src/OCE/DIA/diamlr.F90
@@ -5,7 +5,7 @@ MODULE diamlr
    !!======================================================================
    !! History :  4.0  !  2019  (S. Mueller)   Original code
    !!----------------------------------------------------------------------
-
+   USE par_kind
    USE par_oce        , ONLY :   wp, jpi, jpj
    USE phycst         , ONLY :   rpi
    USE dom_oce        , ONLY :   adatrj
diff --git a/src/OCE/DIA/dianam.F90 b/src/OCE/DIA/dianam.F90
index a3b3bfb92cba961498bc3a18c534cbaf376775cd..2d0df4f4f147ac1d7a69d534f6782cac9bb0a881 100644
--- a/src/OCE/DIA/dianam.F90
+++ b/src/OCE/DIA/dianam.F90
@@ -60,8 +60,8 @@ CONTAINS
       INTEGER            ::   inbday, inbmo, inbyr             ! output frequency in days, months and years
       INTEGER            ::   iyyss, iddss, ihhss, immss       ! number of seconds in 1 year, 1 day, 1 hour and 1 minute
       INTEGER            ::   iyymo                            ! number of months in 1 year
-      REAL(wp)           ::   zsec1, zsec2                     ! not used
-      REAL(wp)           ::   zdrun, zjul                      ! temporary scalars
+      REAL(dp)           ::   zsec1, zsec2                     ! not used
+      REAL(dp)           ::   zdrun, zjul                      ! temporary scalars
       !!----------------------------------------------------------------------
 
       ! name for output frequency
diff --git a/src/OCE/DIA/diaptr.F90 b/src/OCE/DIA/diaptr.F90
index 501e54f637e7d9ea4b48e51f6cf080dfb3ac659a..6cbbd447d480a2541fbd6c8f29adee7f18e18253 100644
--- a/src/OCE/DIA/diaptr.F90
+++ b/src/OCE/DIA/diaptr.F90
@@ -87,13 +87,14 @@ CONTAINS
       IF( l_diaptr ) THEN
          ! Calculate zonal integrals
          IF( PRESENT( pvtr ) ) THEN
-            CALL dia_ptr_zint( Kmm, pvtr )
+            CALL dia_ptr_zint( Kmm, pvtr)
          ELSE
             CALL dia_ptr_zint( Kmm )
          ENDIF
 
          ! Calculate diagnostics only when zonal integrals have finished
          IF( .NOT. l_istiled .OR. ntile == nijtile ) CALL dia_ptr_iom(kt, Kmm, pvtr)
+
       ENDIF
 
       IF( ln_timing )   CALL timing_stop('dia_ptr')
diff --git a/src/OCE/DIA/diawri.F90 b/src/OCE/DIA/diawri.F90
index db5da93a7cc7f9a1d61498a55c689bc90aa7c231..3d851bd220fbf446f8495c117e4d2d0149b9e6af 100644
--- a/src/OCE/DIA/diawri.F90
+++ b/src/OCE/DIA/diawri.F90
@@ -580,7 +580,7 @@ CONTAINS
       INTEGER  ::   iimi, iima, ipk, it, itmod, ijmi, ijma   ! local integers
       INTEGER  ::   ipka                                     ! ABL
       INTEGER  ::   jn, ierror                               ! local integers
-      REAL(wp) ::   zsto, zout, zmax, zjulian                ! local scalars
+      REAL(dp) ::   zsto, zout, zmax, zjulian                ! local scalars
       !
       REAL(wp), DIMENSION(jpi,jpj    ) :: z2d     ! 2D workspace
       REAL(wp), DIMENSION(jpi,jpj,jpk) :: z3d     ! 3D workspace
diff --git a/src/OCE/DIU/diu_bulk.F90 b/src/OCE/DIU/diu_bulk.F90
index af1e5adfe07324c0879beae01aab78fab3d9ab9a..28e321f151f4b99fda3647084790af1d0c4756d1 100644
--- a/src/OCE/DIU/diu_bulk.F90
+++ b/src/OCE/DIU/diu_bulk.F90
@@ -96,9 +96,9 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   psolflux       ! solar flux (Watts)
       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   pqflux         ! heat (non-solar) flux (Watts)
       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   ptauflux       ! wind stress  (kg/ m s^2)
-      REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in) ::   prho           ! water density  (kg/m^3)
+      REAL(dp), DIMENSION(jpi,jpj)          , INTENT(in) ::   prho           ! water density  (kg/m^3)
       REAL(wp)                              , INTENT(in) ::   p_rdt          ! time-step
-      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pLa            ! Langmuir number
+      REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pla            ! Langmuir number
       REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pthick         ! warm layer thickness (m)
       REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pcoolthick     ! cool skin thickness (m)
       REAL(wp), DIMENSION(jpi,jpj), OPTIONAL, INTENT(in) ::   pmu            ! mu parameter
@@ -185,7 +185,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: p_fla      ! Langmuir number
       REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: pmu        ! Structure parameter
       REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: pthick     ! Layer thickness
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(IN) :: prho       ! Water density
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(IN) :: prho       ! Water density
    
       ! Local variables
       REAL(wp) :: z_olength          ! Obukhov length
diff --git a/src/OCE/DIU/diu_coolskin.F90 b/src/OCE/DIU/diu_coolskin.F90
index 594a8b13ade4ae1d7739574244cd3f5b547a1e73..2ba2c21b1a4487a7fa2e56e81d5ef7191d4b5b13 100644
--- a/src/OCE/DIU/diu_coolskin.F90
+++ b/src/OCE/DIU/diu_coolskin.F90
@@ -79,7 +79,7 @@ MODULE diu_coolskin
       ! Dummy variables
       REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: psqflux     ! Heat (non-solar)(Watts)
       REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: pstauflux   ! Wind stress (kg/ m s^2)
-      REAL(wp), INTENT(IN), DIMENSION(jpi,jpj) :: psrho       ! Water density (kg/m^3)
+      REAL(dp), INTENT(IN), DIMENSION(jpi,jpj) :: psrho       ! Water density (kg/m^3)
       REAL(wp), INTENT(IN) :: pDt                             ! Time-step
 
       ! Local variables
diff --git a/src/OCE/DIU/solfrac_mod.F90 b/src/OCE/DIU/solfrac_mod.F90
index 4df5c6eca640461a07dc7bfe828a08f7f44e6a57..d5af825addc5cad16efd8e9042f71d87258cb2a8 100644
--- a/src/OCE/DIU/solfrac_mod.F90
+++ b/src/OCE/DIU/solfrac_mod.F90
@@ -51,6 +51,6 @@ CONTAINS
             &                                 - exp ( -pbottom / pp_len(jt) ) )
       END DO
       
-   END FUNCTION
+   END FUNCTION solfrac
    
 END MODULE solfrac_mod
diff --git a/src/OCE/DOM/closea.F90 b/src/OCE/DOM/closea.F90
index eb523c63cc6067ec513a5d2cf23378fcc2b2d80f..98386a3597646fcd0e9829844575c6d94b3083ce 100644
--- a/src/OCE/DOM/closea.F90
+++ b/src/OCE/DOM/closea.F90
@@ -258,6 +258,6 @@ CONTAINS
       ALLOCATE( kmask(jpi,jpj) , STAT=ierr )
       IF( ierr /= 0 )   CALL ctl_stop( 'STOP', 'alloc_csmask: failed to allocate surf array')
       !
-   END SUBROUTINE
+   END SUBROUTINE alloc_csmask
 
 END MODULE closea
diff --git a/src/OCE/DOM/daymod.F90 b/src/OCE/DOM/daymod.F90
index fd59353dcac70b753c241bc29f441f4826ac7147..39e2db30aac49b48c8b8235742d8451e0d909f5e 100644
--- a/src/OCE/DOM/daymod.F90
+++ b/src/OCE/DOM/daymod.F90
@@ -68,7 +68,7 @@ CONTAINS
       !!              - nmonth_len, nyear_len, nmonth_beg through day_mth
       !!----------------------------------------------------------------------
       INTEGER  ::   inbday, imonday, isecrst   ! local integers
-      REAL(wp) ::   zjul             ! local scalar
+      REAL(dp) ::   zjul             ! local scalar
       !!----------------------------------------------------------------------
       !
       ! max number of seconds between each restart
@@ -93,7 +93,7 @@ CONTAINS
       nminute = ( nn_time0 - nhour * 100 )
       isecrst = ( nhour * NINT(rhhmm) + nminute ) * NINT(rmmss)
 
-      CALL ymds2ju( nyear, nmonth, nday, REAL(isecrst,wp), fjulday )
+      CALL ymds2ju( nyear, nmonth, nday, REAL(isecrst,dp), fjulday )
       IF( ABS(fjulday - REAL(NINT(fjulday),wp)) < 0.1 / rday )   fjulday = REAL(NINT(fjulday),wp)   ! avoid truncation error
       IF( nhour*NINT(rhhmm*rmmss) + nminute*NINT(rmmss) - ndt05 .LT. 0 ) fjulday = fjulday+1.       ! move back to the day at nit000 (and not at nit000 - 1)
 
@@ -115,7 +115,8 @@ CONTAINS
       nday_year = nday + SUM( nmonth_len(1:nmonth - 1) )
 
       !compute number of days between last Monday and today
-      CALL ymds2ju( 1900, 01, 01, 0.0_wp, zjul )     ! compute julian day value of 01.01.1900 (our reference that was a Monday)
+      CALL ymds2ju( 1900, 01, 01, 0.0_dp, zjul )     ! compute julian day value of 01.01.1900 (our reference that was a Monday)
+
       inbday = FLOOR(fjulday - zjul)              ! compute nb day between  01.01.1900 and start of current day
       imonday = MOD(inbday, 7)                    ! compute nb day between last monday and current day
       IF (imonday .LT. 0) imonday = imonday + 7   ! Avoid negative values for dates before 01.01.1900
@@ -198,7 +199,7 @@ CONTAINS
          nmonth_beg(jm) = nmonth_beg(jm+1) - nsecd * nmonth_len(jm)
       END DO
       !
-   END SUBROUTINE
+   END SUBROUTINE day_mth
 
 
    SUBROUTINE day( kt )
@@ -220,7 +221,7 @@ CONTAINS
       INTEGER, INTENT(in) ::   kt        ! ocean time-step indices
       !
       CHARACTER (len=25) ::   charout
-      REAL(wp)           ::   zprec      ! fraction of day corresponding to 0.1 second
+      REAL(dp)           ::   zprec      ! fraction of day corresponding to 0.1 second
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('day')
@@ -259,7 +260,7 @@ CONTAINS
          ndastp = nyear * 10000 + nmonth * 100 + nday   ! New date
          !
          !compute first day of the year in julian days
-         CALL ymds2ju( nyear, 01, 01, 0.0_wp, fjulstartyear )
+         CALL ymds2ju( nyear, 01, 01, 0.0_dp, fjulstartyear )
          !
          IF(lwp) WRITE(numout,'(a,i8,a,i4.4,a,i2.2,a,i2.2,a,i3.3)') '======>> time-step =', kt,   &
               &   '      New day, DATE Y/M/D = ', nyear, '/', nmonth, '/', nday, '      nday_year = ', nday_year
@@ -310,7 +311,7 @@ CONTAINS
       INTEGER         , INTENT(in) ::   kt         ! ocean time-step
       CHARACTER(len=*), INTENT(in) ::   cdrw       ! "READ"/"WRITE" flag
       !
-      REAL(wp) ::   zkt, zndastp, zdayfrac, ksecs, ktime
+      REAL(dp) ::   zkt, zndastp, zdayfrac, ksecs, ktime
       INTEGER  ::   ihour, iminute, isecond
       !!----------------------------------------------------------------------
 
diff --git a/src/OCE/DOM/depth_e3.F90 b/src/OCE/DOM/depth_e3.F90
index d4fec2f420ed9c70eebe78cc5f0a5739f260a30f..6b2090dd3e564aa7e845220ffc97c08bb9b2279c 100644
--- a/src/OCE/DOM/depth_e3.F90
+++ b/src/OCE/DOM/depth_e3.F90
@@ -143,7 +143,8 @@ CONTAINS
       !!
       !! ** Action  : - pe3t_1d, pe3w_1d : scale factor of t- and w-point (m)
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pe3t_3d , pe3w_3d    ! vert. scale factors   [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(in   )  :: pe3w_3d! vert. scale factors   [m]
+      REAL(dp), DIMENSION(:,:,:), INTENT(in   )  :: pe3t_3d! vert. scale factors   [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pdept_3d, pdepw_3d   ! depth = SUM( e3 )     [m]
       !
       INTEGER  ::   jk           ! dummy loop indices
diff --git a/src/OCE/DOM/dom_oce.F90 b/src/OCE/DOM/dom_oce.F90
index d61ac9bb059de44ef249a9b3c9318b473d7b6a7e..32379ee0df99ac027a04d23a12a7cb4ba51036f9 100644
--- a/src/OCE/DOM/dom_oce.F90
+++ b/src/OCE/DOM/dom_oce.F90
@@ -100,12 +100,16 @@ MODULE dom_oce
    !! ---------------------------------------------------------------------
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   glamt , glamu, glamv , glamf    !: longitude at t, u, v, f-points [degree]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   gphit , gphiu, gphiv , gphif    !: latitude  at t, u, v, f-points [degree]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1t   , e2t  , r1_e1t, r1_e2t   !: t-point horizontal scale factors    [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1u   , e2u  , r1_e1u, r1_e2u   !: horizontal scale factors at u-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1v   , e2v  , r1_e1v, r1_e2v   !: horizontal scale factors at v-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1f   , e2f  , r1_e1f, r1_e2f   !: horizontal scale factors at f-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: r1_e1t, r1_e2t!: t-point horizontal scale factors    [m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e1t, e2t!: t-point horizontal scale factors    [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e2u, r1_e1u, r1_e2u!: horizontal scale factors at u-point [m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e1u!: horizontal scale factors at u-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e1v, r1_e1v, r1_e2v!: horizontal scale factors at v-point [m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e2v!: horizontal scale factors at v-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: r1_e1f, r1_e2f!: horizontal scale factors at f-point [m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:)  :: e1f, e2f!: horizontal scale factors at f-point [m]
    !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2u , r1_e1e2u , e2_e1u       !: associated metrics at u-point
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2v , r1_e1e2v , e1_e2v       !: associated metrics at v-point
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2f , r1_e1e2f                !: associated metrics at f-point
@@ -130,7 +134,7 @@ MODULE dom_oce
    LOGICAL, PUBLIC ::   ln_sco       !: s-coordinate or hybrid z-s coordinate
    LOGICAL, PUBLIC ::   ln_isfcav    !: presence of ISF
    !                                                        !  reference scale factors
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3t_0   !: t- vert. scale factor [m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3t_0   !: t- vert. scale factor [m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3u_0   !: u- vert. scale factor [m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3v_0   !: v- vert. scale factor [m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3f_0   !: f- vert. scale factor [m]
@@ -145,9 +149,11 @@ MODULE dom_oce
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   e3f                             !: F-point vert. scale factor [m]
 #endif
    !                                                        !  time-dependent ratio ssh / h_0   (domqco)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v                   !: time-dependent    ratio at t-, u- and v-point [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)    :: r3u, r3v!: time-dependent    ratio at t-, u- and v-point [-]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)    :: r3t!: time-dependent    ratio at t-, u- and v-point [-]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3f                             !: mid-time-level    ratio at f-point            [-]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3t_f, r3u_f, r3v_f             !: now time-filtered ratio at t-, u- and v-point [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)      :: r3u_f, r3v_f!: now time-filtered ratio at t-, u- and v-point [-]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)      :: r3t_f!: now time-filtered ratio at t-, u- and v-point [-]
 
    !                                                        !  reference depths of cells
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdept_0  !: t- depth              [m]
@@ -161,7 +167,7 @@ MODULE dom_oce
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::  gde3w
 #endif
    !                                                        !  reference heights of ocean water column and its inverse
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht_0, r1_ht_0   !: t-depth        [m] and [1/m]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht_0, r1_ht_0   !: t-depth        [m] and [1/m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hu_0, r1_hu_0   !: u-depth        [m] and [1/m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hv_0, r1_hv_0   !: v-depth        [m] and [1/m]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hf_0, r1_hf_0   !: f-depth        [m] and [1/m]
@@ -216,8 +222,8 @@ MODULE dom_oce
    INTEGER , PUBLIC ::   nsec_month    !: seconds between 00h 1st day of the current month and half of the current time step
    INTEGER , PUBLIC ::   nsec_monday   !: seconds between 00h         of the last Monday   and half of the current time step
    INTEGER , PUBLIC ::   nsec_day      !: seconds between 00h         of the current   day and half of the current time step
-   REAL(wp), PUBLIC ::   fjulday       !: current julian day
-   REAL(wp), PUBLIC ::   fjulstartyear !: first day of the current year in julian days
+   REAL(dp), PUBLIC ::   fjulday       !: current julian day
+   REAL(dp), PUBLIC ::   fjulstartyear !: first day of the current year in julian days
    REAL(wp), PUBLIC ::   adatrj        !: number of elapsed days since the begining of the whole simulation
    !                                   !: (cumulative duration of previous runs that may have used different time-step size)
    INTEGER , PUBLIC, DIMENSION(  0: 2) ::   nyear_len     !: length in days of the previous/current/next year
diff --git a/src/OCE/DOM/domain.F90 b/src/OCE/DOM/domain.F90
index a0982afaeee311ddeb7ec3ac2aa6b5bd0e982cf0..a7f4b6fbda945abff27ae884f78afcb18be3da59 100644
--- a/src/OCE/DOM/domain.F90
+++ b/src/OCE/DOM/domain.F90
@@ -64,6 +64,7 @@ MODULE domain
    PUBLIC   domain_cfg   ! called by nemogcm.F90
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "do_loop_substitute.h90"
    !!-------------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -545,12 +546,12 @@ CONTAINS
       !
       llmsk = tmask_i(:,:) == 1._wp
       !
-      CALL mpp_minloc( 'domain', glamt(:,:), llmsk, zglmin, imil )
-      CALL mpp_minloc( 'domain', gphit(:,:), llmsk, zgpmin, imip )
-      CALL mpp_minloc( 'domain',   e1t(:,:), llmsk, ze1min, imi1 )
-      CALL mpp_minloc( 'domain',   e2t(:,:), llmsk, ze2min, imi2 )
-      CALL mpp_maxloc( 'domain', glamt(:,:), llmsk, zglmax, imal )
-      CALL mpp_maxloc( 'domain', gphit(:,:), llmsk, zgpmax, imap )
+      CALL mpp_minloc( 'domain', CASTDP(glamt(:,:)), llmsk, zglmin, imil )
+      CALL mpp_minloc( 'domain', CASTDP(gphit(:,:)), llmsk, zgpmin, imip )
+      CALL mpp_minloc( 'domain',   CASTDP(e1t(:,:)), llmsk, ze1min, imi1 )
+      CALL mpp_minloc( 'domain',   CASTDP(e2t(:,:)), llmsk, ze2min, imi2 )
+      CALL mpp_maxloc( 'domain', CASTDP(glamt(:,:)), llmsk, zglmax, imal )
+      CALL mpp_maxloc( 'domain', CASTDP(gphit(:,:)), llmsk, zgpmax, imap )
       CALL mpp_maxloc( 'domain',   e1t(:,:), llmsk, ze1max, ima1 )
       CALL mpp_maxloc( 'domain',   e2t(:,:), llmsk, ze2max, ima2 )
       !
diff --git a/src/OCE/DOM/domhgr.F90 b/src/OCE/DOM/domhgr.F90
index 4f07a01f8c81be0f55d8d5864072b2744b8df3eb..e6f9ddaba785150ce278d7112951b414bd1cab00 100644
--- a/src/OCE/DOM/domhgr.F90
+++ b/src/OCE/DOM/domhgr.F90
@@ -114,9 +114,9 @@ CONTAINS
          ! make sure that periodicities are properly applied 
          CALL lbc_lnk( 'dom_hgr', glamt, 'T', 1._wp, glamu, 'U', 1._wp, glamv, 'V', 1._wp, glamf, 'F', 1._wp,   &
             &                     gphit, 'T', 1._wp, gphiu, 'U', 1._wp, gphiv, 'V', 1._wp, gphif, 'F', 1._wp,   &
-            &                       e1t, 'T', 1._wp,   e1u, 'U', 1._wp,   e1v, 'V', 1._wp,   e1f, 'F', 1._wp,   &   
-            &                       e2t, 'T', 1._wp,   e2u, 'U', 1._wp,   e2v, 'V', 1._wp,   e2f, 'F', 1._wp,   &
-            &                     kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+            &                     e2u, 'U', 1._wp, e1v, 'V', 1._wp, kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+         CALL lbc_lnk( 'dom_hgr', e1t, 'T', 1._dp, e2t, 'T', 1._dp, e1u, 'U', 1._dp, e2v, 'V', 1._dp, &
+            &                     e1f, 'F', 1._dp, e2f, 'F', 1._dp, kfillmode = jpfillcopy)
          !
       ENDIF
       !
@@ -184,8 +184,10 @@ CONTAINS
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pphit, pphiu, pphiv, pphif   ! latitude outputs
       INTEGER                 , INTENT(out) ::   kff                          ! =1 Coriolis parameter read here, =0 otherwise
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pff_f, pff_t                 ! Coriolis factor at f-point (if found in file)
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1t, pe1u, pe1v, pe1f       ! i-scale factors 
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe2t, pe2u, pe2v, pe2f       ! j-scale factors
+      REAL(wp), DIMENSION(:,:), INTENT(out)  :: pe1v! i-scale factors
+      REAL(dp), DIMENSION(:,:), INTENT(out)  :: pe1t, pe1u, pe1f! i-scale factors
+      REAL(wp), DIMENSION(:,:), INTENT(out)  :: pe2u! j-scale factors
+      REAL(dp), DIMENSION(:,:), INTENT(out)  :: pe2t, pe2v, pe2f! j-scale factors
       INTEGER                 , INTENT(out) ::   ke1e2u_v                     ! =1 u- & v-surfaces read here, =0 otherwise 
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1e2u, pe1e2v              ! u- & v-surfaces (if found in file)
       !
@@ -210,15 +212,15 @@ CONTAINS
       CALL iom_get( inum, jpdom_global, 'gphiv', pphiv, cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
       CALL iom_get( inum, jpdom_global, 'gphif', pphif, cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
       !
-      CALL iom_get( inum, jpdom_global, 'e1t'  , pe1t , cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )
-      CALL iom_get( inum, jpdom_global, 'e1u'  , pe1u , cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e1t'  , pe1t , cd_type = 'T', psgn = 1._dp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e1u'  , pe1u , cd_type = 'U', psgn = 1._dp, kfill = jpfillcopy )
       CALL iom_get( inum, jpdom_global, 'e1v'  , pe1v , cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
-      CALL iom_get( inum, jpdom_global, 'e1f'  , pe1f , cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e1f'  , pe1f , cd_type = 'F', psgn = 1._dp, kfill = jpfillcopy )
       !
-      CALL iom_get( inum, jpdom_global, 'e2t'  , pe2t , cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e2t'  , pe2t , cd_type = 'T', psgn = 1._dp, kfill = jpfillcopy )
       CALL iom_get( inum, jpdom_global, 'e2u'  , pe2u , cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
-      CALL iom_get( inum, jpdom_global, 'e2v'  , pe2v , cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
-      CALL iom_get( inum, jpdom_global, 'e2f'  , pe2f , cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e2v'  , pe2v , cd_type = 'V', psgn = 1._dp, kfill = jpfillcopy )
+      CALL iom_get( inum, jpdom_global, 'e2f'  , pe2f , cd_type = 'F', psgn = 1._dp, kfill = jpfillcopy )
       !
       IF(  iom_varid( inum, 'ff_f', ldstop = .FALSE. ) > 0  .AND.  &
          & iom_varid( inum, 'ff_t', ldstop = .FALSE. ) > 0    ) THEN
diff --git a/src/OCE/DOM/domqco.F90 b/src/OCE/DOM/domqco.F90
index 82a94386aab4cace92a074e03acedbdb1e1c76e1..92f5ae0bd7bdc72abc55cda6adb18cfb3a1868ca 100644
--- a/src/OCE/DOM/domqco.F90
+++ b/src/OCE/DOM/domqco.F90
@@ -146,8 +146,9 @@ CONTAINS
       !!                   Flux   Form : simple           averaging
       !!              - compute the ratio ssh/h_0 at t-,u-,v-pts, (f-pt optional)
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:)          , INTENT(in   )  ::   pssh               ! sea surface height   [m]
-      REAL(wp), DIMENSION(:,:)          , INTENT(  out)  ::   pr3t, pr3u, pr3v   ! ssh/h0 ratio at t-, u-, v-,points  [-]
+      REAL(dp), DIMENSION(:,:)          , INTENT(in   )  ::   pssh               ! sea surface height   [m]
+      REAL(wp), DIMENSION(:,:)          , INTENT(  out)   :: pr3u, pr3v! ssh/h0 ratio at t-, u-, v-,points  [-]
+      REAL(dp), DIMENSION(:,:)          , INTENT(  out)   :: pr3t! ssh/h0 ratio at t-, u-, v-,points  [-]
       REAL(wp), DIMENSION(:,:), OPTIONAL, INTENT(  out)  ::   pr3f               ! ssh/h0 ratio at f-point   [-]
       !
       INTEGER ::   ji, jj   ! dummy loop indices
diff --git a/src/OCE/DOM/domutl.F90 b/src/OCE/DOM/domutl.F90
index 0c56f8f1f62c20228376775406b3d356d5529d0b..7b3095952da73453736338a3d798906ca0c34643 100644
--- a/src/OCE/DOM/domutl.F90
+++ b/src/OCE/DOM/domutl.F90
@@ -28,6 +28,8 @@ MODULE domutl
    PUBLIC dom_uniq   ! Called by dommsk and domwri
    PUBLIC is_tile
 
+   !! * Substitutions
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.2 , NEMO Consortium (2020)
    !! $Id: domutl.F90 14834 2021-05-11 09:24:44Z hadcv $
@@ -75,7 +77,7 @@ CONTAINS
       zgphi(:,:) = zgphi(:,:) - plat
       zdist(:,:) = zglam(:,:) * zglam(:,:) + zgphi(:,:) * zgphi(:,:)
       !
-      CALL mpp_minloc( 'domngb', zdist(:,:), llmsk, zmini, iloc, ldhalo = .TRUE. )
+      CALL mpp_minloc( 'domngb', CASTDP(zdist(:,:)), llmsk, zmini, iloc, ldhalo = .TRUE. )
       kii = iloc(1)
       kjj = iloc(2)
       !
@@ -107,7 +109,7 @@ CONTAINS
       ztstref(:,:) = RESHAPE( (/ (zshift + REAL(ji,wp), ji = 1, jpi*jpj) /), (/ jpi, jpj /) )
       !
       puniq(:,:) = ztstref(:,:)                    ! default definition
-      CALL lbc_lnk( 'domwri', puniq, cdgrd, 1. )   ! apply boundary conditions
+      CALL lbc_lnk( 'domwri', puniq, cdgrd, 1._wp )   ! apply boundary conditions
       lluniq(:,:,1) = puniq(:,:) == ztstref(:,:)   ! check which values have not been changed
       !
       puniq(:,:) = REAL( COUNT( lluniq(:,:,:), dim = 3 ), wp )
diff --git a/src/OCE/DOM/domzgr.F90 b/src/OCE/DOM/domzgr.F90
index 0d63bbb168b69d9059e9691181e5c13e49b7da69..e6036a5c5315c000c8a271cc607c17bd1959b9e5 100644
--- a/src/OCE/DOM/domzgr.F90
+++ b/src/OCE/DOM/domzgr.F90
@@ -113,10 +113,11 @@ CONTAINS
             &              k_top   , k_bot            )                  ! 1st & last ocean level
          !
          ! make sure that periodicities are properly applied 
-         CALL lbc_lnk( 'dom_zgr', gdept_0, 'T', 1._wp, gdepw_0, 'W', 1._wp,                                         &
-            &                       e3t_0, 'T', 1._wp,   e3u_0, 'U', 1._wp,  e3v_0, 'V', 1._wp, e3f_0, 'F', 1._wp,   &
+         CALL lbc_lnk( 'dom_zgr', gdept_0, 'T', 1._wp, gdepw_0, 'W', 1._wp,                     &
+            &                       e3u_0, 'U', 1._wp,  e3v_0, 'V', 1._wp, e3f_0, 'F', 1._wp,   &
             &                       e3w_0, 'W', 1._wp,  e3uw_0, 'U', 1._wp, e3vw_0, 'V', 1._wp,   &   
             &                     kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
+         CALL lbc_lnk( 'dom_zgr', e3t_0, 'T', 1._dp, kfillmode = jpfillcopy )
          ztopbot(:,:,1) = REAL(k_top, wp)
          ztopbot(:,:,2) = REAL(k_bot, wp)
          CALL lbc_lnk( 'dom_zgr', ztopbot, 'T', 1._wp, kfillmode = jpfillcopy )   ! do not put 0 over closed boundaries
@@ -235,7 +236,8 @@ CONTAINS
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth       [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D vertical scale factors [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth          [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors    [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(out)  :: pe3u, pe3v, pe3f! vertical scale factors    [m]
+      REAL(dp), DIMENSION(:,:,:), INTENT(out)  :: pe3t! vertical scale factors    [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         !    -       -      -
       INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top , k_bot               ! first & last ocean level
       INTEGER                   , INTENT(out) ::   k_mbkuvf                    ! ==1 if mbku, mbkv, mbkf are in file
@@ -286,7 +288,7 @@ CONTAINS
       CALL iom_get( inum, jpdom_unknown, 'e3t_1d'  , pe3t_1d  )                     ! 1D reference coordinate
       CALL iom_get( inum, jpdom_unknown, 'e3w_1d'  , pe3w_1d  )
       !
-      CALL iom_get( inum, jpdom_global, 'e3t_0'  , pe3t , cd_type = 'T', psgn = 1._wp, kfill = jpfillcopy )    ! 3D coordinate
+      CALL iom_get( inum, jpdom_global, 'e3t_0'  , pe3t , cd_type = 'T', psgn = 1._dp, kfill = jpfillcopy )    ! 3D coordinate
       CALL iom_get( inum, jpdom_global, 'e3u_0'  , pe3u , cd_type = 'U', psgn = 1._wp, kfill = jpfillcopy )
       CALL iom_get( inum, jpdom_global, 'e3v_0'  , pe3v , cd_type = 'V', psgn = 1._wp, kfill = jpfillcopy )
       CALL iom_get( inum, jpdom_global, 'e3f_0'  , pe3f , cd_type = 'F', psgn = 1._wp, kfill = jpfillcopy )
diff --git a/src/OCE/DOM/domzgr_substitute.h90 b/src/OCE/DOM/domzgr_substitute.h90
index 35e60fa876232325883d5c7bc5cd2fb49effd4d3..35173ccb8d24651892c617e16bedbf25ad59a67f 100644
--- a/src/OCE/DOM/domzgr_substitute.h90
+++ b/src/OCE/DOM/domzgr_substitute.h90
@@ -51,4 +51,3 @@
 #   define  gde3w(i,j,k)   gdept_0(i,j,k)
 #endif
 !!----------------------------------------------------------------------
-
diff --git a/src/OCE/DOM/dtatsd.F90 b/src/OCE/DOM/dtatsd.F90
index 5863789cc4d8e4c1f09657a00610197ef9c7c599..8e35fdef591c803b7db509e035cfdb877fd93e0f 100644
--- a/src/OCE/DOM/dtatsd.F90
+++ b/src/OCE/DOM/dtatsd.F90
@@ -135,13 +135,13 @@ CONTAINS
       !! ** Action  :   ptsd   T-S data on medl mesh and interpolated at time-step kt
       !!----------------------------------------------------------------------
       INTEGER                          , INTENT(in   ) ::   kt     ! ocean time-step
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data
       !
       INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies
       INTEGER ::   ik, il0, il1, ii0, ii1, ij0, ij1   ! local integers
       INTEGER, DIMENSION(jpts), SAVE :: irec_b, irec_n
-      REAL(wp)::   zl, zi                             ! local scalars
-      REAL(wp), DIMENSION(jpk) ::  ztp, zsp   ! 1D workspace
+      REAL(dp)::   zl, zi                             ! local scalars
+      REAL(dp), DIMENSION(jpk) ::  ztp, zsp   ! 1D workspace
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                                         ! Do only for the full domain
diff --git a/src/OCE/DOM/istate.F90 b/src/OCE/DOM/istate.F90
index 9d708a3c7e3a421bc04901d8ac9a5c4bcab60b39..f9d2163393334da683bad84dab1d2f9cab841976 100644
--- a/src/OCE/DOM/istate.F90
+++ b/src/OCE/DOM/istate.F90
@@ -132,8 +132,8 @@ CONTAINS
                END DO
                CALL usr_def_istate( zgdept, tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb) )
                ! make sure that periodicities are properly applied 
-               CALL lbc_lnk( 'istate', ts(:,:,:,jp_tem,Kbb), 'T',  1._wp, ts(:,:,:,jp_sal,Kbb), 'T',  1._wp,   &
-                  &                    uu(:,:,:,       Kbb), 'U', -1._wp, vv(:,:,:,       Kbb), 'V', -1._wp )
+               CALL lbc_lnk( 'istate', ts(:,:,:,jp_tem,Kbb), 'T',  1._dp, ts(:,:,:,jp_sal,Kbb), 'T',  1._dp,   &
+                  &                    uu(:,:,:,       Kbb), 'U', -1._dp, vv(:,:,:,       Kbb), 'V', -1._dp )
             ENDIF
             ts  (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb)       ! set now values from to before ones
             uu    (:,:,:,Kmm) = uu   (:,:,:,Kbb)
diff --git a/src/OCE/DYN/dynadv.F90 b/src/OCE/DYN/dynadv.F90
index 1df6b9522caeb9cd86a7523adb125ee7565fd55e..c1500fd412e4a6040f54850d7fb4bf2fa72dd306 100644
--- a/src/OCE/DYN/dynadv.F90
+++ b/src/OCE/DYN/dynadv.F90
@@ -65,7 +65,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start( 'dyn_adv' )
diff --git a/src/OCE/DYN/dynadv_cen2.F90 b/src/OCE/DYN/dynadv_cen2.F90
index c3cd13226e9bffae79ae0aaad6beb43f8480cb12..3016f129b39bfda34405af3135169cac9d3f5173 100644
--- a/src/OCE/DYN/dynadv_cen2.F90
+++ b/src/OCE/DYN/dynadv_cen2.F90
@@ -48,11 +48,13 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt           ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs    ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv     ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv     ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zfu_t, zfu_f, zfu_uw, zfu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zfv_t, zfv_f, zfv_vw, zfv, zfw
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  :: zfu_f, zfu
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)  :: zfu_t, zfu_uw
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  :: zfv_f, zfv, zfw
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)  :: zfv_t, zfv_vw
       !!----------------------------------------------------------------------
       !
       IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
diff --git a/src/OCE/DYN/dynadv_ubs.F90 b/src/OCE/DYN/dynadv_ubs.F90
index 50f73f6d4b899a22e15c51d165f205b7f7329b69..302f95a0055b19a164bb7512518cca5be5901d36 100644
--- a/src/OCE/DYN/dynadv_ubs.F90
+++ b/src/OCE/DYN/dynadv_ubs.F90
@@ -70,12 +70,14 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt              ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs  ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv        ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv        ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zui, zvj, zfuj, zfvi, zl_u, zl_v   ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfu_t, zfu_f, zfu_uw, zfu
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)   ::   zfv_t, zfv_f, zfv_vw, zfv, zfw
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    :: zfu_f, zfu
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)    :: zfu_t, zfu_uw
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    :: zfv_f, zfv, zfw
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)    :: zfv_t, zfv_vw
       REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlu_uu, zlu_uv
       REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   zlv_vv, zlv_vu
       !!----------------------------------------------------------------------
diff --git a/src/OCE/DYN/dynatf.F90 b/src/OCE/DYN/dynatf.F90
index 997692694ddf1bf7dd1fa04a5c50e96759b4e3c2..f95e33ac2f03c562427d2836cc4b80a1fa584579 100644
--- a/src/OCE/DYN/dynatf.F90
+++ b/src/OCE/DYN/dynatf.F90
@@ -80,6 +80,7 @@ CONTAINS
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: dynatf.F90 14834 2021-05-11 09:24:44Z hadcv $
@@ -354,8 +355,8 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Kaa), clinfo1=' nxt  - puu(:,:,:,Kaa): ', mask1=umask,   &
-         &                                  tab3d_2=pvv(:,:,:,Kaa), clinfo2=' pvv(:,:,:,Kaa): '       , mask2=vmask )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(puu(:,:,:,Kaa)), clinfo1=' nxt  - puu(:,:,:,Kaa): ', mask1=umask,   &
+         &                                  tab3d_2=CASTDP(pvv(:,:,:,Kaa)), clinfo2=' pvv(:,:,:,Kaa): '       , mask2=vmask )
       !
       IF( ln_dynspg_ts )   DEALLOCATE( zue, zve )
       IF( l_trddyn     )   DEALLOCATE( zua, zva )
diff --git a/src/OCE/DYN/dynatf_qco.F90 b/src/OCE/DYN/dynatf_qco.F90
index f9ed9f4644d525d233b884f53ad0e7f37760253c..fd858f2d5a39dbb1eb7a5255faa8fe65dbefad15 100644
--- a/src/OCE/DYN/dynatf_qco.F90
+++ b/src/OCE/DYN/dynatf_qco.F90
@@ -94,13 +94,13 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in   ) :: kt               ! ocean time-step index
       INTEGER                             , INTENT(in   ) :: Kbb, Kmm, Kaa    ! before and after time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) :: puu, pvv         ! velocities to be time filtered
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zue3a, zue3n, zue3b, zcoef    ! local scalars
       REAL(wp) ::   zve3a, zve3n, zve3b           !   -      -
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zue, zve
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zua, zva
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::   zua, zva
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   zutau, zvtau
       !!----------------------------------------------------------------------
       !
@@ -195,7 +195,7 @@ CONTAINS
       ENDIF ! .NOT. l_1st_euler
       !
       ! This is needed for dyn_ldf_blp to be restartable
-      IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatfqco', puu(:,:,:,Kmm), 'U', -1.0_wp, pvv(:,:,:,Kmm), 'V', -1.0_wp )
+      IF( nn_hls == 2 ) CALL lbc_lnk( 'dynatfqco', puu(:,:,:,Kmm), 'U', -1.0_dp, pvv(:,:,:,Kmm), 'V', -1.0_dp )
 
       ! Set "now" and "before" barotropic velocities for next time step:
       ! JC: Would be more clever to swap variables than to make a full vertical
diff --git a/src/OCE/DYN/dynhpg.F90 b/src/OCE/DYN/dynhpg.F90
index b64bc83c7903ba68a67d276b6a808b95e1c0323a..7a4b35c9affc5c99da865d3aed6dc52cbe0dc52f 100644
--- a/src/OCE/DYN/dynhpg.F90
+++ b/src/OCE/DYN/dynhpg.F90
@@ -100,9 +100,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_hpg')
@@ -256,7 +256,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk       ! dummy loop indices
       REAL(wp) ::   zcoef0, zcoef1   ! temporary scalars
@@ -309,7 +309,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk                       ! dummy loop indices
       INTEGER  ::   iku, ikv                         ! temporary integers
@@ -403,7 +403,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk, jii, jjj           ! dummy loop indices
       REAL(wp) ::   zcoef0, zuap, zvap, ztmp       ! local scalars
@@ -541,7 +541,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk             ! dummy loop indices
       INTEGER  ::   ikt ,  ikti1,  iktj1   ! local integer
@@ -629,7 +629,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk          ! dummy loop indices
       INTEGER  ::   iktb, iktt          ! jk indices at tracer points for top and bottom points 
@@ -953,7 +953,7 @@ CONTAINS
       INTEGER, PARAMETER  :: polynomial_type = 1    ! 1: cubic spline, 2: linear
       INTEGER                             , INTENT( in )  ::  kt          ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv    ! ocean velocities and RHS of momentum equation
       !!
       INTEGER  ::   ji, jj, jk, jkk                 ! dummy loop indices
       REAL(wp) ::   zcoef0, znad                    ! local scalars
@@ -1270,7 +1270,7 @@ CONTAINS
       INTEGER  ::   ji, jj, jk                 ! dummy loop indices
       REAL(wp) ::   zdf1, zdf2, zddf1, zddf2, ztmp1, ztmp2, zdxtmp
       REAL(wp) ::   zdxtmp1, zdxtmp2, zalpha
-      REAL(wp) ::   zdf(jpk)
+      REAL(wp), DIMENSION(jpk) ::   zdf
       !!----------------------------------------------------------------------
       !
       IF (polynomial_type == 1) THEN     ! Constrained Cubic Spline
@@ -1355,7 +1355,8 @@ CONTAINS
       !! ** Method  :   interpolation is straight forward
       !!                extrapolation is also permitted (no value limit)
       !!----------------------------------------------------------------------
-      REAL(wp), INTENT(in) ::  x, xl, xr, fl, fr
+      REAL(wp), INTENT(in)  :: fl, fr
+      REAL(dp), INTENT(in)  :: x, xl, xr
       REAL(wp)             ::  f ! result of the interpolation (extrapolation)
       REAL(wp)             ::  zdeltx
       !!----------------------------------------------------------------------
diff --git a/src/OCE/DYN/dynkeg.F90 b/src/OCE/DYN/dynkeg.F90
index d751899d0de9266477ed7f9ecc26941906cba84d..e34c02ef9e42d2dcf9f4834d3b27134c98c99575 100644
--- a/src/OCE/DYN/dynkeg.F90
+++ b/src/OCE/DYN/dynkeg.F90
@@ -73,12 +73,12 @@ CONTAINS
       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  kscheme          ! =0/1   type of KEG scheme 
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk             ! dummy loop indices
       REAL(wp) ::   zu, zv                   ! local scalars
       REAL(wp), DIMENSION(A2D(nn_hls),jpk)    ::   zhke
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_keg')
diff --git a/src/OCE/DYN/dynldf.F90 b/src/OCE/DYN/dynldf.F90
index da8705afa39587639c9f56495ccfbe9956300fb1..bb67d21c70c97bb3a6fd9be93c2a0cb8b982d171 100644
--- a/src/OCE/DYN/dynldf.F90
+++ b/src/OCE/DYN/dynldf.F90
@@ -33,6 +33,8 @@ MODULE dynldf
    PUBLIC   dyn_ldf       ! called by step module 
    PUBLIC   dyn_ldf_init  ! called by opa  module 
 
+   !! * Substitutions
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: dynldf.F90 12377 2020-02-12 14:39:06Z acc $
@@ -48,9 +50,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
       !
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_ldf')
diff --git a/src/OCE/DYN/dynldf_iso.F90 b/src/OCE/DYN/dynldf_iso.F90
index 891d8842cc5955dd9f3ea41c56aaf819a160d321..0936ddfb19956ac90a38e15b2dd901c0cf32cace 100644
--- a/src/OCE/DYN/dynldf_iso.F90
+++ b/src/OCE/DYN/dynldf_iso.F90
@@ -107,7 +107,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zabe1, zmskt, zmkt, zuav, zuwslpi, zuwslpj   ! local scalars
diff --git a/src/OCE/DYN/dynldf_iso_lf.F90 b/src/OCE/DYN/dynldf_iso_lf.F90
index 07b38792080db5a019c312c40b9fbf989a43b710..5448515fbb96473989b2a79e0886faa898d9bdbb 100644
--- a/src/OCE/DYN/dynldf_iso_lf.F90
+++ b/src/OCE/DYN/dynldf_iso_lf.F90
@@ -38,6 +38,7 @@ MODULE dynldf_iso_lf
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -286,8 +287,8 @@ CONTAINS
       !                                                ! ===============
 
       ! print sum trends (used for debugging)
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' ldfh - Ua: ', mask1=umask, &
-         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(puu(:,:,:,Krhs)), clinfo1=' ldfh - Ua: ', mask1=umask, &
+         &                                  tab3d_2=CASTDP(pvv(:,:,:,Krhs)), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
 
 
       !                                                ! ===============
diff --git a/src/OCE/DYN/dynldf_lap_blp.F90 b/src/OCE/DYN/dynldf_lap_blp.F90
index 09ae6fe78b107e89def6af8016a01409dffc6dea..b67f70cae5c6ed3f2efabf46b41f689fe1ddab9c 100644
--- a/src/OCE/DYN/dynldf_lap_blp.F90
+++ b/src/OCE/DYN/dynldf_lap_blp.F90
@@ -46,8 +46,8 @@ CONTAINS
       INTEGER                   , INTENT(in   ) ::   kt               ! ocean time-step index
       INTEGER                   , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices
       INTEGER                   , INTENT(in   ) ::   kpass            ! =1/2 first or second passage
-      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
+      REAL(dp), DIMENSION(:,:,:), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
       !!
 #if defined key_loop_fusion
       CALL dyn_ldf_lap_lf( kt, Kbb, Kmm, pu, pv, pu_rhs, pv_rhs, kpass )
@@ -76,8 +76,8 @@ CONTAINS
       INTEGER                                 , INTENT(in   ) ::   Kbb, Kmm         ! ocean time level indices
       INTEGER                                 , INTENT(in   ) ::   kpass            ! =1/2 first or second passage
       INTEGER                                 , INTENT(in   ) ::   ktuv, ktuv_rhs
-      REAL(wp), DIMENSION(A2D_T(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
-      REAL(wp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
+      REAL(dp), DIMENSION(A2D_T(ktuv)    ,JPK), INTENT(in   ) ::   pu, pv           ! before velocity  [m/s]
+      REAL(dp), DIMENSION(A2D_T(ktuv_rhs),JPK), INTENT(inout) ::   pu_rhs, pv_rhs   ! velocity trend   [m/s2]
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   iij
@@ -197,10 +197,10 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kbb, Kmm   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu, pv     ! before velocity fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! momentum trend
       !
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk) ::   zulap, zvlap   ! laplacian at u- and v-point
       !!----------------------------------------------------------------------
       !
 #if defined key_loop_fusion
@@ -219,7 +219,7 @@ CONTAINS
       !
       CALL dyn_ldf_lap( kt, Kbb, Kmm, pu, pv, zulap, zvlap, 1 )   ! rotated laplacian applied to pt (output in zlap,Kbb)
       !
-      IF (nn_hls==1) CALL lbc_lnk( 'dynldf_lap_blp', zulap, 'U', -1.0_wp, zvlap, 'V', -1.0_wp )             ! Lateral boundary conditions
+      IF (nn_hls==1) CALL lbc_lnk( 'dynldf_lap_blp', zulap, 'U', -1.0_dp, zvlap, 'V', -1.0_dp )             ! Lateral boundary conditions
       !
       CALL dyn_ldf_lap( kt, Kbb, Kmm, zulap, zvlap, pu_rhs, pv_rhs, 2 )   ! rotated laplacian applied to zlap (output in pt(:,:,:,:,Krhs))
       !
diff --git a/src/OCE/DYN/dynspg.F90 b/src/OCE/DYN/dynspg.F90
index 24cd9455acb11a63ad9f8a46392e210eb1f9864d..2c46cf101a44c4f42d4776240f80676f84fd5066 100644
--- a/src/OCE/DYN/dynspg.F90
+++ b/src/OCE/DYN/dynspg.F90
@@ -76,15 +76,16 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
-      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout) ::  pssh, puu_b, pvv_b  ! SSH and barotropic velocities at main time levels
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
+      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout)  :: puu_b, pvv_b! SSH and barotropic velocities at main time levels
+      REAL(dp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout)  :: pssh! SSH and barotropic velocities at main time levels
       INTEGER , OPTIONAL                  , INTENT( in )  ::  k_only_ADV          ! only Advection in the RHS
       !
       INTEGER  ::   ji, jj, jk                   ! dummy loop indices
       REAL(wp) ::   z2dt, zg_2, zintp, zgrho0r, zld   ! local scalars
       REAL(wp)             , DIMENSION(jpi,jpj) ::   zpgu, zpgv   ! 2D workspace
       REAL(wp), ALLOCATABLE, DIMENSION(:,:)     ::   zpice
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   ztrdu, ztrdv
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:)   ::   ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_spg')
diff --git a/src/OCE/DYN/dynspg_exp.F90 b/src/OCE/DYN/dynspg_exp.F90
index 8d59e3f977cf444b6fd504813b296c0aa2d1f547..89c1c14c4768d0e675f2c9d26f5301722e0e5525 100644
--- a/src/OCE/DYN/dynspg_exp.F90
+++ b/src/OCE/DYN/dynspg_exp.F90
@@ -56,7 +56,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt        ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv  ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv  ! ocean velocities and RHS of momentum equation
       !!
       INTEGER ::   ji, jj, jk   ! dummy loop indices
       REAL(wp), DIMENSION(jpi,jpj) ::   zpgu, zpgv   ! 2D workspace
diff --git a/src/OCE/DYN/dynspg_ts.F90 b/src/OCE/DYN/dynspg_ts.F90
index c41e6f167c04cc45edd7ce6c2ea69b5be256b7e3..2168a9bb16ed327620a8fdc615414819ebc61199 100644
--- a/src/OCE/DYN/dynspg_ts.F90
+++ b/src/OCE/DYN/dynspg_ts.F90
@@ -72,9 +72,10 @@ MODULE dynspg_ts
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step
    !
    INTEGER, SAVE :: icycle      ! Number of barotropic sub-steps for each internal step nn_e <= 2.5 nn_e
-   REAL(wp),SAVE :: rDt_e       ! Barotropic time step
+   REAL(dp),SAVE :: rDt_e       ! Barotropic time step
    !
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields
+   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)    :: wgtbtp2! 1st & 2nd weights used in time filtering of barotropic fields
+   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:)    :: wgtbtp1! 1st & 2nd weights used in time filtering of barotropic fields
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   zwz                ! ff_f/h at F points
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ftnw, ftne         ! triad of coriolis parameter
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ftsw, ftse         ! (only used with een vorticity scheme)
@@ -86,6 +87,7 @@ MODULE dynspg_ts
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -143,8 +145,9 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
-      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout) ::  pssh, puu_b, pvv_b  ! SSH and barotropic velocities at main time levels
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
+      REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout)  :: puu_b, pvv_b! SSH and barotropic velocities at main time levels
+      REAL(dp), DIMENSION(jpi,jpj,jpt)    , INTENT(inout)  :: pssh! SSH and barotropic velocities at main time levels
       INTEGER , OPTIONAL                  , INTENT( in )  ::  k_only_ADV          ! only Advection in the RHS
       !
       INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices
@@ -152,16 +155,19 @@ CONTAINS
       LOGICAL  ::   ll_init               ! =T : special startup of 2d equations
       INTEGER  ::   noffset               ! local integers  : time offset for bdy update
       REAL(wp) ::   r1_Dt_b, z1_hu, z1_hv          ! local scalars
-      REAL(wp) ::   za0, za1, za2, za3              !   -      -
+      REAL(wp)  :: za0, za2, za3!   -      -
+      REAL(dp)  :: za1!   -      -
       REAL(wp) ::   zztmp, zldg               !   -      -
-      REAL(wp) ::   zhu_bck, zhv_bck, zhdiv         !   -      -
+      REAL(wp)  :: zhu_bck, zhv_bck!   -      -
+      REAL(dp)  :: zhdiv!   -      -
       REAL(wp) ::   zun_save, zvn_save              !   -      -
       REAL(wp), DIMENSION(jpi,jpj) :: zu_trd, zu_frc, zu_spg
       REAL(wp), DIMENSION(jpi,jpj) :: zv_trd, zv_frc, zv_spg
       REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhtp2_e
       REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zsshp2_e
       REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points
-      REAL(wp), DIMENSION(jpi,jpj) :: zhU, zhV         ! fluxes
+      REAL(wp), DIMENSION(jpi,jpj)  :: zhV! fluxes
+      REAL(dp), DIMENSION(jpi,jpj)  :: zhU! fluxes
 !!st#if defined key_qco 
 !!st      REAL(wp), DIMENSION(jpi, jpj, jpk) :: ze3u, ze3v
 !!st#endif
@@ -259,7 +265,7 @@ CONTAINS
          zhU(:,:) = puu_b(:,:,Kmm) * hu(:,:,Kmm) * e2u(:,:)        ! now fluxes 
          zhV(:,:) = pvv_b(:,:,Kmm) * hv(:,:,Kmm) * e1v(:,:)        ! NB: FULL domain : put a value in last row and column
          !
-         CALL dyn_cor_2d( ht(:,:), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
+         CALL dyn_cor_2d( CASTSP(ht(:,:)), hu(:,:,Kmm), hv(:,:,Kmm), puu_b(:,:,Kmm), pvv_b(:,:,Kmm), zhU, zhV,  &   ! <<== in
             &                                                                          zu_trd, zv_trd   )   ! ==>> out
          !
          DO_2D( 0, 0, 0, 0 )                          ! Remove coriolis term (and possibly spg) from barotropic trend
@@ -527,7 +533,8 @@ CONTAINS
             ssha_e(ji,jj) = (  sshn_e(ji,jj) - rDt_e * ( ssh_frc(ji,jj) + zhdiv )  ) * ssmask(ji,jj)
          END_2D
          !
-         CALL lbc_lnk( 'dynspg_ts', ssha_e, 'T', 1._wp,  zhU, 'U', -1._wp,  zhV, 'V', -1._wp )
+         CALL lbc_lnk( 'dynspg_ts', ssha_e, 'T', 1._dp,  zhU, 'U', -1._dp)
+         CALL lbc_lnk( 'dynspg_ts',  zhV, 'V', -1._wp )
          !
          ! Duplicate sea level across open boundaries (this is only cosmetic if linssh=T)
          IF( ln_bdy )   CALL bdy_ssh( ssha_e )
@@ -855,11 +862,13 @@ CONTAINS
       LOGICAL, INTENT(in) ::   ll_av      ! temporal averaging=.true.
       LOGICAL, INTENT(in) ::   ll_fw      ! forward time splitting =.true.
       INTEGER, INTENT(inout) :: jpit      ! cycle length    
-      REAL(wp), DIMENSION(3*nn_e), INTENT(inout) ::   zwgt1, & ! Primary weights
-                                                         zwgt2    ! Secondary weights
+      REAL(wp), DIMENSION(3*nn_e), INTENT(inout)  :: zwgt2
+      REAL(dp), DIMENSION(3*nn_e), INTENT(inout)  :: zwgt1
+
       
       INTEGER ::  jic, jn, ji                      ! temporary integers
-      REAL(wp) :: za1, za2
+      REAL(wp)  :: za2
+      REAL(dp)  :: za1
       !!----------------------------------------------------------------------
 
       zwgt1(:) = 0._wp
@@ -1028,7 +1037,7 @@ CONTAINS
       ! Estimate number of iterations to satisfy a max courant number= rn_bt_cmax
       IF( ln_bt_auto )   nn_e = CEILING( rn_Dt / rn_bt_cmax * zcmax)
       
-      rDt_e = rn_Dt / REAL( nn_e , wp )
+      rDt_e = rn_Dt / REAL( nn_e , dp )
       zcmax = zcmax * rDt_e
       ! Print results
       IF(lwp) WRITE(numout,*)
@@ -1167,7 +1176,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER  ::   ji ,jj                             ! dummy loop indices
       REAL(wp) ::   zx1, zx2, zy1, zy2, z1_hu, z1_hv   !   -      -
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pht, phu, phv, punb, pvnb, zhU, zhV
+      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )  :: pht, phu, phv, punb, pvnb, zhV
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(in   )  :: zhU
       REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: zu_trd, zv_trd
       !!----------------------------------------------------------------------
       SELECT CASE( nvor_scheme )
@@ -1273,7 +1283,8 @@ CONTAINS
       !! ** Action  :  ptmsk : wetting & drying t-mask
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) ::   pTmsk              ! W & D t-mask
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   phU, phV, pu, pv   ! ocean velocities and transports
+      REAL(wp), DIMENSION(jpi,jpj), INTENT(inout)  :: phV, pu, pv! ocean velocities and transports
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(inout)  :: phU! ocean velocities and transports
       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   pUmsk, pVmsk       ! W & D u- and v-mask
       !
       INTEGER  ::   ji, jj   ! dummy loop indices
@@ -1362,7 +1373,7 @@ CONTAINS
       !! ** Method  :   computation done over the INNER domain only 
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in   ) ::  Kbb, Kmm           ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in   ) ::  puu, pvv           ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(in   ) ::  puu, pvv           ! ocean velocities and RHS of momentum equation
       REAL(wp), DIMENSION(jpi,jpj,jpt)    , INTENT(in   ) ::  puu_b, pvv_b       ! barotropic velocities at main time levels
       REAL(wp), DIMENSION(jpi,jpj)        , INTENT(inout) ::  pu_RHSi, pv_RHSi   ! baroclinic part of the barotropic RHS
       REAL(wp), DIMENSION(jpi,jpj)        , INTENT(  out) ::  pCdU_u , pCdU_v    ! barotropic drag coefficients
@@ -1462,7 +1473,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER ,INTENT(in   ) ::   jn                   ! index of sub time step
       LOGICAL ,INTENT(in   ) ::   ll_init              !
-      REAL(wp),INTENT(  out) ::   za0, za1, za2, za3   ! Half-step back interpolation coefficient
+      REAL(wp),INTENT(  out)  :: za0, za2, za3! Half-step back interpolation coefficient
+      REAL(dp),INTENT(  out)  :: za1! Half-step back interpolation coefficient
       !
       REAL(wp) ::   zepsilon, zgamma                   !   -      -
       !!----------------------------------------------------------------------
diff --git a/src/OCE/DYN/dynvor.F90 b/src/OCE/DYN/dynvor.F90
index 36f2d4b3fc6b8ed9ea570a7ba598a2234ed9785c..bf350a0fdc60bbe9a40586083c8e4414d9ef6e00 100644
--- a/src/OCE/DYN/dynvor.F90
+++ b/src/OCE/DYN/dynvor.F90
@@ -115,9 +115,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in  ) ::   kt          ! ocean time-step index
       INTEGER                             , INTENT( in  ) ::   Kmm, Krhs   ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! ocean velocity field and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! ocean velocity field and RHS of momentum equation
       !
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdu, ztrdv
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:) ::  ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_vor')
@@ -234,8 +234,8 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   kt               ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index
       INTEGER                         , INTENT(in   ) ::   kvor             ! total, planetary, relative, or metric
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv           ! now velocities
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! total v-trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv           ! now velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! total v-trend
       !
       INTEGER  ::   ji, jj, jk           ! dummy loop indices
       REAL(wp) ::   zx1, zy1, zx2, zy2   ! local scalars
@@ -354,8 +354,8 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index
       INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
       !
       INTEGER  ::   ji, jj, jk           ! dummy loop indices
       REAL(wp) ::   zx1, zy1, zx2, zy2, ze3f, zmsk   ! local scalars
@@ -487,8 +487,8 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index
       INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zuav, zvau, ze3f, zmsk   ! local scalars
@@ -617,8 +617,8 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   kt          ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index
       INTEGER                         , INTENT(in   ) ::   kvor        ! total, planetary, relative, or metric
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv    ! now velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs    ! total v-trend
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ierr         ! local integer
@@ -816,8 +816,8 @@ CONTAINS
       INTEGER                         , INTENT(in   ) ::   kt               ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm              ! ocean time level index
       INTEGER                         , INTENT(in   ) ::   kvor             ! total, planetary, relative, or metric
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv           ! now velocities
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! total v-trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu, pv           ! now velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu_rhs, pv_rhs   ! total v-trend
       !
       INTEGER  ::   ji, jj, jk     ! dummy loop indices
       INTEGER  ::   ierr           ! local integer
diff --git a/src/OCE/DYN/dynzad.F90 b/src/OCE/DYN/dynzad.F90
index 5e6a59ded6271c882b86ff87436de51dc1052ecf..85a81aeb7b17cc5b8a0afcd87d38411de0368e42 100644
--- a/src/OCE/DYN/dynzad.F90
+++ b/src/OCE/DYN/dynzad.F90
@@ -55,13 +55,13 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step inedx
       INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       REAL(wp) ::   zua, zva     ! local scalars
       REAL(wp), DIMENSION(A2D(nn_hls))     ::   zww
       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwuw, zwvw
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
+      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_zad')
diff --git a/src/OCE/DYN/dynzdf.F90 b/src/OCE/DYN/dynzdf.F90
index d8046188ca9c2c03852b65fde2d32af36ea8f997..7207759e673ebfd5dc61be7e58293dcf13cef035 100644
--- a/src/OCE/DYN/dynzdf.F90
+++ b/src/OCE/DYN/dynzdf.F90
@@ -71,7 +71,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER                             , INTENT( in )  ::  kt                  ! ocean time-step index
       INTEGER                             , INTENT( in )  ::  Kbb, Kmm, Krhs, Kaa ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv            ! ocean velocities and RHS of momentum equation
       !
       INTEGER  ::   ji, jj, jk         ! dummy loop indices
       INTEGER  ::   iku, ikv           ! local integers
@@ -82,7 +82,7 @@ CONTAINS
       REAL(wp) ::   zWui, zWvi         !   -      -
       REAL(wp) ::   zWus, zWvs         !   -      -
       REAL(wp), DIMENSION(A2D(nn_hls),jpk)        ::  zwi, zwd, zws   ! 3D workspace
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   !  -      -
+      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   !  -      -
       !!---------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('dyn_zdf')
diff --git a/src/OCE/DYN/sshwzv.F90 b/src/OCE/DYN/sshwzv.F90
index bbe83c8c29241917583873e6c73b783e54c75362..82219d8e4f69008b640d0700075a452d4af5bb3f 100644
--- a/src/OCE/DYN/sshwzv.F90
+++ b/src/OCE/DYN/sshwzv.F90
@@ -75,7 +75,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   kt             ! time step
       INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height
+      REAL(dp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height
       ! 
       INTEGER  ::   ji, jj, jk      ! dummy loop index
       REAL(wp) ::   zcoef   ! local scalar
@@ -113,7 +113,7 @@ CONTAINS
          pssh(ji,jj,Kaa) = (  pssh(ji,jj,Kbb) - rDt * ( zcoef * ( emp_b(ji,jj) + emp(ji,jj) ) + zhdiv(ji,jj) )  ) * ssmask(ji,jj)
       END_2D
       ! pssh must be defined everywhere (true for dyn_spg_ts, not for dyn_spg_exp)
-      IF ( .NOT. ln_dynspg_ts .AND. nn_hls == 2 ) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )
+      IF ( .NOT. ln_dynspg_ts .AND. nn_hls == 2 ) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_dp )
       !
 #if defined key_agrif
       Kbb_a = Kbb   ;   Kmm_a = Kmm   ;   Krhs_a = Kaa
@@ -122,7 +122,7 @@ CONTAINS
       !
       IF ( .NOT.ln_dynspg_ts ) THEN
          IF( ln_bdy ) THEN
-            IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )    ! Not sure that's necessary
+            IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_dp )    ! Not sure that's necessary
             CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries
          ENDIF
       ENDIF
@@ -285,7 +285,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! SSH field
+      REAL(dp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! SSH field
       !
       REAL(wp) ::   zcoef   ! local scalar
       !!----------------------------------------------------------------------
diff --git a/src/OCE/DYN/wet_dry.F90 b/src/OCE/DYN/wet_dry.F90
index 465134503a2995b5d1544e27f1ee7727011e42ea..b21148a86cfda7225419e3f6316c09e5835124d3 100644
--- a/src/OCE/DYN/wet_dry.F90
+++ b/src/OCE/DYN/wet_dry.F90
@@ -132,11 +132,11 @@ CONTAINS
       !!
       !! ** Action  : - calculate flux limiter and W/D flag
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:)            , INTENT(inout) ::   psshb1
+      REAL(dp), DIMENSION(:,:)            , INTENT(inout) ::   psshb1
       REAL(wp), DIMENSION(:,:)            , INTENT(in   ) ::   psshemp
       REAL(wp)                            , INTENT(in   ) ::   z2dt
       INTEGER                             , INTENT(in   ) ::   Kmm       ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv  ! velocity arrays
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv  ! velocity arrays
       !
       INTEGER  ::   ji, jj, jk, jk1     ! dummy loop indices
       INTEGER  ::   jflag               ! local scalar
@@ -258,7 +258,7 @@ CONTAINS
       vv_b(:,:,Kmm) = vv_b(:,:,Kmm) * zwdlmtv(:, :)
       !
 !!gm TO BE SUPPRESSED ?  these lbc_lnk are useless since zwdlmtu and zwdlmtv are defined everywhere !
-      CALL lbc_lnk( 'wet_dry', puu(:,:,:,Kmm)  , 'U', -1.0_wp, pvv(:,:,:,Kmm)  , 'V', -1.0_wp )
+      CALL lbc_lnk( 'wet_dry', puu(:,:,:,Kmm)  , 'U', -1.0_dp, pvv(:,:,:,Kmm)  , 'V', -1.0_dp )
       CALL lbc_lnk( 'wet_dry', uu_b(:,:,Kmm), 'U', -1.0_wp, vv_b(:,:,Kmm), 'V', -1.0_wp )
 !!gm
       !
@@ -281,8 +281,9 @@ CONTAINS
       !!
       !! ** Action  : - calculate flux limiter and W/D flag
       !!----------------------------------------------------------------------
-      REAL(wp)                , INTENT(in   ) ::   rDt_e    ! ocean time-step index
-      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   zflxu,  zflxv, sshn_e, zssh_frc  
+      REAL(dp)                , INTENT(in   ) ::   rDt_e    ! ocean time-step index
+      REAL(wp), DIMENSION(:,:), INTENT(inout)  :: zflxv
+      REAL(dp), DIMENSION(:,:), INTENT(inout)  :: zflxu, sshn_e, zssh_frc
       !
       INTEGER  ::   ji, jj, jk, jk1     ! dummy loop indices
       INTEGER  ::   jflag               ! local integer
@@ -379,7 +380,8 @@ CONTAINS
       zflxv(:,:) = zflxv(:,:) * zwdlmtv(:, :) 
       !
 !!gm THIS lbc_lnk is useless since it is already done at the end of the jk1-loop
-      CALL lbc_lnk( 'wet_dry', zflxu, 'U', -1.0_wp, zflxv, 'V', -1.0_wp )
+      CALL lbc_lnk( 'wet_dry', zflxu, 'U', -1.0_dp)
+      CALL lbc_lnk( 'wet_dry', zflxv, 'V', -1.0_wp)
 !!gm end
       !
       IF( jflag == 1 .AND. lwp )   WRITE(numout,*) 'Need more iterations in wad_lmt_bt!!!'
diff --git a/src/OCE/FLO/floblk.F90 b/src/OCE/FLO/floblk.F90
index 4d7450719ab228425db24064880ac5da1d0ec18a..c49320b7372e991655f3e3410491699afb5e4bfb 100644
--- a/src/OCE/FLO/floblk.F90
+++ b/src/OCE/FLO/floblk.F90
@@ -383,4 +383,4 @@ CONTAINS
    END SUBROUTINE flo_blk
 
    !!======================================================================
-END MODULE floblk 
+END MODULE floblk
diff --git a/src/OCE/ICB/icbtrj.F90 b/src/OCE/ICB/icbtrj.F90
index 7991cfa8724704abf74853071db1383656f9d309..170a9d6f8b1815565a2d135775d87ab46d1a7bb0 100644
--- a/src/OCE/ICB/icbtrj.F90
+++ b/src/OCE/ICB/icbtrj.F90
@@ -62,7 +62,7 @@ CONTAINS
       !
       INTEGER                ::   iret, iyear, imonth, iday
       INTEGER                ::   idg  ! number of digits
-      REAL(wp)               ::   zfjulday, zsec
+      REAL(dp)               ::   zfjulday, zsec
       CHARACTER(len=80)      ::   cl_filename
       CHARACTER(LEN=12)      ::   clfmt            ! writing format
       CHARACTER(LEN=8 )      ::   cldate_ini, cldate_end
diff --git a/src/OCE/ICB/icbutl.F90 b/src/OCE/ICB/icbutl.F90
index 873245fcd6b19d8f83119228191153f9cf2b3198..9c14ba654361552cc78bfa4e59bc74be3eee8b4c 100644
--- a/src/OCE/ICB/icbutl.F90
+++ b/src/OCE/ICB/icbutl.F90
@@ -57,6 +57,7 @@ MODULE icbutl
    PUBLIC   icb_utl_heat          ! routine called in icbdia module
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -181,8 +182,8 @@ CONTAINS
       CALL icb_utl_pos( pi, pj, 'F', iiF, ijF, zwF, zmskF )
       !
       ! metrics and coordinates
-      IF ( PRESENT(pe1 ) ) pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj )      ! scale factors
-      IF ( PRESENT(pe2 ) ) pe2 = icb_utl_bilin_e( e2t, e2u, e2v, e2f, pi, pj )
+      IF ( PRESENT(pe1 ) ) pe1 = icb_utl_bilin_e( e1t, CASTSP(e1u), e1v, e1f, pi, pj )      ! scale factors
+      IF ( PRESENT(pe2 ) ) pe2 = icb_utl_bilin_e( e2t, e2u, CASTSP(e2v), e2f, pi, pj )
       IF ( PRESENT(plon) ) plon= icb_utl_bilin_h( rlon_e, iiT, ijT, zwT, .true.  )
       IF ( PRESENT(plat) ) plat= icb_utl_bilin_h( rlat_e, iiT, ijT, zwT, .false. )
       !
@@ -214,17 +215,17 @@ CONTAINS
       !
       ! Estimate SSH gradient in i- and j-direction (centred evaluation)
       IF ( PRESENT(pssh_i) .AND. PRESENT(pssh_j) ) THEN
-         CALL icb_utl_pos( pi+0.1, pj    , 'T', iiTp, ijTp, zwTp, zmskTp )
-         CALL icb_utl_pos( pi-0.1, pj    , 'T', iiTm, ijTm, zwTm, zmskTm )
+         CALL icb_utl_pos( pi+0.1_wp, pj    , 'T', iiTp, ijTp, zwTp, zmskTp )
+         CALL icb_utl_pos( pi-0.1_wp, pj    , 'T', iiTm, ijTm, zwTm, zmskTm )
          !
-         IF ( .NOT. PRESENT(pe1) ) pe1 = icb_utl_bilin_e( e1t, e1u, e1v, e1f, pi, pj )
+         IF ( .NOT. PRESENT(pe1) ) pe1 = icb_utl_bilin_e( e1t, CASTSP(e1u), e1v, e1f, pi, pj )
          pssh_i = ( icb_utl_bilin_h( ssh_e, iiTp, ijTp, zwTp*zmskTp, .false. ) -   &
             &       icb_utl_bilin_h( ssh_e, iiTm, ijTm, zwTm*zmskTm, .false. )  ) / ( 0.2_wp * pe1 )
          !
-         CALL icb_utl_pos( pi    , pj+0.1, 'T', iiTp, ijTp, zwTp, zmskTp )
-         CALL icb_utl_pos( pi    , pj-0.1, 'T', iiTm, ijTm, zwTm, zmskTm )
+         CALL icb_utl_pos( pi    , pj+0.1_wp, 'T', iiTp, ijTp, zwTp, zmskTp )
+         CALL icb_utl_pos( pi    , pj-0.1_wp, 'T', iiTm, ijTm, zwTm, zmskTm )
          !
-         IF ( .NOT. PRESENT(pe2) ) pe2 = icb_utl_bilin_e( e2t, e2u, e2v, e2f, pi, pj )
+         IF ( .NOT. PRESENT(pe2) ) pe2 = icb_utl_bilin_e( e2t, e2u, CASTSP(e2v), e2f, pi, pj )
          pssh_j = ( icb_utl_bilin_h( ssh_e, iiTp, ijTp, zwTp*zmskTp, .false. ) -   &
             &       icb_utl_bilin_h( ssh_e, iiTm, ijTm, zwTm*zmskTm, .false. )  ) / ( 0.2_wp * pe2 )
       END IF
@@ -437,7 +438,8 @@ CONTAINS
       !! ** Method  :   interpolation done using the 4 nearest grid points among
       !!                t-, u-, v-, and f-points.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   pet, peu, pev, pef   ! horizontal scale factor to be interpolated at t-,u-,v- & f-pts
+      REAL(wp), DIMENSION(:,:), INTENT(in)  :: peu, pev! horizontal scale factor to be interpolated at t-,u-,v- & f-pts
+      REAL(dp), DIMENSION(:,:), INTENT(in)  :: pet, pef! horizontal scale factor to be interpolated at t-,u-,v- & f-pts
       REAL(wp)                , INTENT(IN) ::   pi , pj              ! iceberg position
       !
       ! weights corresponding to corner points of a T cell quadrant
@@ -521,7 +523,7 @@ CONTAINS
          kb = kb + 1
       END DO
       kb = MIN(kb - 1,jpk)
-   END SUBROUTINE
+   END SUBROUTINE icb_utl_getkb
 
    SUBROUTINE icb_utl_zavg(pzavg, pdat, pe3, pD, kb )
       !!----------------------------------------------------------------------
@@ -546,7 +548,7 @@ CONTAINS
       ! if kb is limited by mbkt  => bottom value is used between bathy and icb tail
       ! if kb not limited by mbkt => ocean value over mask is used (ie 0.0 for u, v)
       pzavg = ( pzavg + (pD - zdep)*pdat(kb)) / pD
-   END SUBROUTINE
+   END SUBROUTINE icb_utl_zavg
 
    SUBROUTINE icb_utl_add( bergvals, ptvals )
       !!----------------------------------------------------------------------
@@ -750,7 +752,7 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       CHARACTER(len=*)       :: cd_label
-      INTEGER                :: kt             ! timestep number
+      INTEGER, INTENT(IN)                :: kt             ! timestep number
       ! 
       INTEGER                :: ibergs, inbergs
       TYPE(iceberg), POINTER :: this
@@ -916,7 +918,8 @@ CONTAINS
       !! ** Comments : not called, if needed a CALL test_icb_utl_getkb need to be added in icb_step
       !!----------------------------------------------------------------------
       INTEGER :: ikb
-      REAL(wp) :: zD, zout
+      REAL(wp) :: zout
+      REAL(wp) :: zD
       REAL(wp), DIMENSION(jpk) :: ze3, zin
       WRITE(numout,*) 'Test icb_utl_getkb : '
       zD = 0.0 ; ze3= 20.0
diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index 1c78c9021fea692a2d1e337a2b70666483190543..bfbad0845e30eb04b138c5a447d7157bba3fbc51 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -2568,7 +2568,7 @@ CONTAINS
       INTEGER            ::   jn, iln
       INTEGER            ::   itrlen
       INTEGER            ::   iyear, imonth, iday, isec
-      REAL(wp)           ::   zsec
+      REAL(dp)           ::   zsec
       LOGICAL            ::   llexist
       TYPE(xios_duration)   ::   output_freq
       !!----------------------------------------------------------------------
@@ -2668,14 +2668,14 @@ CONTAINS
       !!
       !! ** Purpose :   send back the date corresponding to the given julian day
       !!----------------------------------------------------------------------
-      REAL(wp), INTENT(in   )           ::   pjday    ! julian day
+      REAL(dp), INTENT(in   )           ::   pjday    ! julian day
       LOGICAL , INTENT(in   ), OPTIONAL ::   ld24     ! true to force 24:00 instead of 00:00
       LOGICAL , INTENT(in   ), OPTIONAL ::   ldfull   ! true to get the compleate date: yyyymmdd_hh:mm:ss
       !
       CHARACTER(LEN=20) ::   iom_sdate
       CHARACTER(LEN=50) ::   clfmt                         !  format used to write the date
       INTEGER           ::   iyear, imonth, iday, ihour, iminute, isec
-      REAL(wp)          ::   zsec
+      REAL(dp)          ::   zsec
       LOGICAL           ::   ll24, llfull
       !!----------------------------------------------------------------------
       !
diff --git a/src/OCE/IOM/prtctl.F90 b/src/OCE/IOM/prtctl.F90
index fae7c0d8041cfef5ebb1e57b6e1b6e3026ae14f2..26e330872224a2223b93a21945ba3ecd13f254e7 100644
--- a/src/OCE/IOM/prtctl.F90
+++ b/src/OCE/IOM/prtctl.F90
@@ -38,11 +38,11 @@ CONTAINS
    SUBROUTINE prt_ctl (tab2d_1, tab3d_1, tab4d_1, tab2d_2, tab3d_2, mask1, mask2,   &
       &                 clinfo, clinfo1, clinfo2, clinfo3, kdim )
       !!
-      REAL(wp),         DIMENSION(:,:)    , INTENT(in), OPTIONAL ::   tab2d_1
-      REAL(wp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   tab3d_1
-      REAL(wp),         DIMENSION(:,:,:,:), INTENT(in), OPTIONAL ::   tab4d_1
-      REAL(wp),         DIMENSION(:,:)    , INTENT(in), OPTIONAL ::   tab2d_2
-      REAL(wp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   tab3d_2
+      REAL(dp),         DIMENSION(:,:)    , INTENT(in), OPTIONAL ::   tab2d_1
+      REAL(dp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   tab3d_1
+      REAL(dp),         DIMENSION(:,:,:,:), INTENT(in), OPTIONAL ::   tab4d_1
+      REAL(dp),         DIMENSION(:,:)    , INTENT(in), OPTIONAL ::   tab2d_2
+      REAL(dp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   tab3d_2
       REAL(wp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask1
       REAL(wp),         DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask2
       CHARACTER(len=*), DIMENSION(:)      , INTENT(in), OPTIONAL ::   clinfo    ! information about the tab3d array
@@ -53,29 +53,29 @@ CONTAINS
       !
       IF(     PRESENT(tab2d_2) ) THEN
          CALL prt_ctl_t(ktab2d_1 = is_tile(tab2d_1), ktab3d_1 = 0, ktab4d_1 = 0, ktab2d_2 = is_tile(tab2d_2), ktab3d_2 = 0,   &
-            &            tab2d_1 =    REAL(tab2d_1, 2*wp),                        tab2d_2 =    REAL(tab2d_2, 2*wp),           &
+            &            tab2d_1 =    REAL(tab2d_1, dp),                        tab2d_2 =    REAL(tab2d_2, dp),           &
             &           mask1 = mask1, mask2 = mask2, &
             &           clinfo = clinfo, clinfo1 = clinfo1, clinfo2 = clinfo2, clinfo3 = clinfo3 )
       ELSEIF( PRESENT(tab3d_2) ) THEN     
          CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = is_tile(tab3d_1), ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = is_tile(tab3d_2),       &
-            &                          tab3d_1 = REAL(tab3d_1, 2*wp),                           tab3d_2 =    REAL(tab3d_2, 2*wp), &
+            &                          tab3d_1 = REAL(tab3d_1, dp),                           tab3d_2 =    REAL(tab3d_2, dp), &
             &           mask1 = mask1, mask2 = mask2, &
             &           clinfo = clinfo, clinfo1 = clinfo1, clinfo2 = clinfo2, clinfo3 = clinfo3, kdim = kdim )
       ELSEIF( PRESENT(tab2d_1) ) THEN     
          CALL prt_ctl_t(ktab2d_1 = is_tile(tab2d_1), ktab3d_1 = 0, ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &           tab2d_1 = REAL(tab2d_1,2*wp),  &
+            &           tab2d_1 = REAL(tab2d_1,dp),  &
             &           mask1 = mask1,  &
             &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3 )
       ELSEIF( PRESENT(tab3d_1) ) THEN     
          CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = is_tile(tab3d_1), ktab4d_1 = 0, ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &                          tab3d_1 =    REAL(tab3d_1, 2*wp),  &
+            &                          tab3d_1 =    REAL(tab3d_1, dp),  &
             &           mask1 = mask1,  &
             &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3, kdim = kdim )
       ELSEIF( PRESENT(tab4d_1) ) THEN     
          CALL prt_ctl_t(ktab2d_1 = 0, ktab3d_1 = 0, ktab4d_1 = is_tile(tab4d_1), ktab2d_2 = 0, ktab3d_2 = 0,   &
-            &                                        tab4d_1 =    REAL(tab4d_1, 2*wp),  &
+            &                                        tab4d_1 =    REAL(tab4d_1, dp),  &
             &           mask1 = mask1,  &
-            &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3, kdim = kdim )
+           &           clinfo = clinfo, clinfo1 = clinfo1, clinfo3 = clinfo3, kdim = kdim )
       ENDIF
 
    END SUBROUTINE prt_ctl
@@ -119,11 +119,11 @@ CONTAINS
       !!                    clinfo3 : additional information
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in)           ::   ktab2d_1, ktab3d_1, ktab4d_1, ktab2d_2, ktab3d_2
-      REAL(2*wp),         DIMENSION(A2D_T(ktab2d_1))    , INTENT(in), OPTIONAL ::   tab2d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab3d_1),:)  , INTENT(in), OPTIONAL ::   tab3d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab4d_1),:,:), INTENT(in), OPTIONAL ::   tab4d_1
-      REAL(2*wp),         DIMENSION(A2D_T(ktab2d_2))    , INTENT(in), OPTIONAL ::   tab2d_2
-      REAL(2*wp),         DIMENSION(A2D_T(ktab3d_2),:)  , INTENT(in), OPTIONAL ::   tab3d_2
+      REAL(dp),         DIMENSION(A2D_T(ktab2d_1))    , INTENT(in), OPTIONAL ::   tab2d_1
+      REAL(dp),         DIMENSION(A2D_T(ktab3d_1),:)  , INTENT(in), OPTIONAL ::   tab3d_1
+      REAL(dp),         DIMENSION(A2D_T(ktab4d_1),:,:), INTENT(in), OPTIONAL ::   tab4d_1
+      REAL(dp),         DIMENSION(A2D_T(ktab2d_2))    , INTENT(in), OPTIONAL ::   tab2d_2
+      REAL(dp),         DIMENSION(A2D_T(ktab3d_2),:)  , INTENT(in), OPTIONAL ::   tab3d_2
       REAL(wp),           DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask1
       REAL(wp),           DIMENSION(:,:,:)  , INTENT(in), OPTIONAL ::   mask2
       CHARACTER(len=*), DIMENSION(:)      , INTENT(in), OPTIONAL ::   clinfo    ! information about the tab3d array
@@ -137,7 +137,7 @@ CONTAINS
       INTEGER ::  jn, jl, kdir
       INTEGER ::  iis, iie, jjs, jje
       INTEGER ::  itra, inum
-      REAL(2*wp) :: zsum1, zsum2, zvctl1, zvctl2
+      REAL(wp) :: zsum1, zsum2, zvctl1, zvctl2
       !!----------------------------------------------------------------------
       !
       ! Arrays, scalars initialization
diff --git a/src/OCE/IOM/restart.F90 b/src/OCE/IOM/restart.F90
index 7052cb16436354077a6fc4637e03a6dd1430eafe..9ae044782e6d0198c4c53e443c2ae30d3d939c53 100644
--- a/src/OCE/IOM/restart.F90
+++ b/src/OCE/IOM/restart.F90
@@ -294,8 +294,8 @@ CONTAINS
 #else
       !                             !*  Read Kmm fields   (MLF only)
       IF(lwp) WRITE(numout,*)    '           Kmm u, v and T-S fields read in the restart file'
-      CALL iom_get( numror, jpdom_auto, 'un', uu(:,:,:       ,Kmm), cd_type = 'U', psgn = -1._wp )
-      CALL iom_get( numror, jpdom_auto, 'vn', vv(:,:,:       ,Kmm), cd_type = 'V', psgn = -1._wp )
+      CALL iom_get( numror, jpdom_auto, 'un', uu(:,:,:       ,Kmm), cd_type = 'U', psgn = -1._dp )
+      CALL iom_get( numror, jpdom_auto, 'vn', vv(:,:,:       ,Kmm), cd_type = 'V', psgn = -1._dp )
       CALL iom_get( numror, jpdom_auto, 'tn', ts(:,:,:,jp_tem,Kmm) )
       CALL iom_get( numror, jpdom_auto, 'sn', ts(:,:,:,jp_sal,Kmm) )
       !
@@ -307,8 +307,8 @@ CONTAINS
          !
       ELSE                          !* Leap frog restart   (MLF only)
          IF(lwp) WRITE(numout,*) '           Kbb u, v and T-S fields read in the restart file'
-         CALL iom_get( numror, jpdom_auto, 'ub', uu(:,:,:       ,Kbb), cd_type = 'U', psgn = -1._wp )
-         CALL iom_get( numror, jpdom_auto, 'vb', vv(:,:,:       ,Kbb), cd_type = 'V', psgn = -1._wp )
+         CALL iom_get( numror, jpdom_auto, 'ub', uu(:,:,:       ,Kbb), cd_type = 'U', psgn = -1._dp )
+         CALL iom_get( numror, jpdom_auto, 'vb', vv(:,:,:       ,Kbb), cd_type = 'V', psgn = -1._dp )
          CALL iom_get( numror, jpdom_auto, 'tb', ts(:,:,:,jp_tem,Kbb) )
          CALL iom_get( numror, jpdom_auto, 'sb', ts(:,:,:,jp_sal,Kbb) )
       ENDIF
diff --git a/src/OCE/ISF/isf_oce.F90 b/src/OCE/ISF/isf_oce.F90
index 16ff46027734df283a16c60d2e0c74ecfba4646a..6ddd20daa29a6276c0accf3d77305054ce2cd099 100644
--- a/src/OCE/ISF/isf_oce.F90
+++ b/src/OCE/ISF/isf_oce.F90
@@ -12,7 +12,7 @@ MODULE isf_oce
    !!----------------------------------------------------------------------
    !!   isf          : define and allocate ice shelf variables
    !!----------------------------------------------------------------------
-
+   USE par_kind
    USE par_oce       , ONLY: jpi, jpj, jpk
    USE in_out_manager, ONLY: wp, jpts ! I/O manager
    USE lib_mpp       , ONLY: ctl_stop, mpp_sum      ! MPP library
diff --git a/src/OCE/ISF/isfcavmlt.F90 b/src/OCE/ISF/isfcavmlt.F90
index 665d75bbc60ca44af283e8ee5f7ead3aa319ea3e..74ddbdfe8140c4046a0c4f2efae8d250b71349e8 100644
--- a/src/OCE/ISF/isfcavmlt.F90
+++ b/src/OCE/ISF/isfcavmlt.F90
@@ -32,6 +32,7 @@ MODULE isfcavmlt
    PUBLIC   isfcav_mlt
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -112,7 +113,7 @@ CONTAINS
       !!--------------------------------------------------------------------
       !
       ! Compute freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
+      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), CASTDP(risfdep(:,:)) )
       !
       ! read input file of fwf (from isf to oce; ie melt)
       CALL fld_read ( kt, 1, sf_isfcav_fwf )
@@ -157,7 +158,7 @@ CONTAINS
       !!--------------------------------------------------------------------
       !
       ! Calculate freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
+      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), CASTDP(risfdep(:,:)) )
       !
       ! thermal driving
       zthd (:,:) = ( pttbl(:,:) - ztfrz(:,:) ) * mskisf_cav(:,:)
@@ -281,7 +282,7 @@ CONTAINS
       !!--------------------------------------------------------------------
       !
       ! Calculate freezing temperature
-      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), risfdep(:,:) )
+      CALL eos_fzp( pstbl(:,:), ztfrz(:,:), CASTDP(risfdep(:,:)) )
       !
       ! read input file of fwf from isf to oce
       CALL fld_read ( kt, 1, sf_isfcav_fwf )
diff --git a/src/OCE/ISF/isfcpl.F90 b/src/OCE/ISF/isfcpl.F90
index b035cd5e6095a4206dedf0ccd81f612125a55e3c..5a70f9f9f1c82ee6efead92fd46c5c786ba195c5 100644
--- a/src/OCE/ISF/isfcpl.F90
+++ b/src/OCE/ISF/isfcpl.F90
@@ -48,6 +48,7 @@ MODULE isfcpl
    !
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -200,7 +201,8 @@ CONTAINS
                zssmask_b(ji,jj) = 1._wp
             ENDIF
          END_2D
-         CALL lbc_lnk( 'isfcpl', ssh(:,:,Kmm), 'T', 1.0_wp, zssmask_b(:,:), 'T', 1.0_wp )
+         CALL lbc_lnk( 'isfcpl', ssh(:,:,Kmm), 'T', 1.0_dp)
+         CALL lbc_lnk( 'isfcpl', zssmask_b(:,:), 'T', 1.0_wp )
          !
          zssh(:,:) = ssh(:,:,Kmm)
          zssmask0(:,:) = zssmask_b(:,:)
@@ -213,7 +215,7 @@ CONTAINS
       !
       ssh(:,:,Kbb) = ssh(:,:,Kmm)
       !
-      IF ( ln_isfdebug ) CALL debug('isfcpl_ssh: sshn',ssh(:,:,Kmm))
+      IF ( ln_isfdebug ) CALL debug('isfcpl_ssh: sshn',CASTSP(ssh(:,:,Kmm)))
       !
       ! recompute the vertical scale factor, depth and water thickness
       IF(lwp) write(numout,*) 'isfcpl_ssh : recompute scale factor from ssh (new wet cell,Kmm)'
@@ -358,7 +360,8 @@ CONTAINS
             END_2D
          END DO
          !
-         CALL lbc_lnk( 'isfcpl', ts(:,:,:,jp_tem,Kmm), 'T', 1.0_wp, ts(:,:,:,jp_sal,Kmm), 'T', 1.0_wp, ztmask1, 'T', 1.0_wp)
+         CALL lbc_lnk( 'isfcpl', ts(:,:,:,jp_tem,Kmm), 'T', 1.0_dp, ts(:,:,:,jp_sal,Kmm), 'T', 1.0_dp)
+         CALL lbc_lnk( 'isfcpl', ztmask1, 'T', 1.0_wp)
          !
          ! update temperature and salinity and mask
          zts0(:,:,:,:)  = ts(:,:,:,:,Kmm)
diff --git a/src/OCE/ISF/isfdiags.F90 b/src/OCE/ISF/isfdiags.F90
index b9f97736462037f2497b7722ffe64a890895dddd..b6732bc6c11bde416ab4638c79e5a2207a28d767 100644
--- a/src/OCE/ISF/isfdiags.F90
+++ b/src/OCE/ISF/isfdiags.F90
@@ -72,7 +72,7 @@ CONTAINS
       IF ( iom_use( TRIM(cvarqlat3d) ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqlat3d) , pqoce(:,:))
       IF ( iom_use( TRIM(cvarqhc3d)  ) ) CALL isf_diags_2dto3d( Kmm, ktop, kbot, phtbl, pfrac, TRIM(cvarqhc3d)  , pqhc (:,:))
       !
-   END SUBROUTINE
+   END SUBROUTINE isf_diags_flx
 
    SUBROUTINE isf_diags_2dto3d(Kmm, ktop, kbot, phtbl, pfrac, cdvar, pvar2d)
       !!---------------------------------------------------------------------
diff --git a/src/OCE/ISF/isfload.F90 b/src/OCE/ISF/isfload.F90
index a069cdf5d126bb61db99c67ae358bca283062d9e..4278c55f19219f835795ecceadcfc85714325973 100644
--- a/src/OCE/ISF/isfload.F90
+++ b/src/OCE/ISF/isfload.F90
@@ -26,6 +26,7 @@ MODULE isfload
    !
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -87,7 +88,7 @@ CONTAINS
 #if defined key_qco && key_isf
          CALL eos( zts_top(:,:,:), gdept_0(:,:,jk), zrhd(:,:,jk) )
 #else 
-         CALL eos( zts_top(:,:,:), gdept(:,:,jk,Kmm), zrhd(:,:,jk) )
+         CALL eos( zts_top(:,:,:), CASTSP(gdept(:,:,jk,Kmm)), zrhd(:,:,jk) )
 #endif
       END DO
       !
diff --git a/src/OCE/ISF/isfparmlt.F90 b/src/OCE/ISF/isfparmlt.F90
index 237e3bee3b9cf5ad4c03b0f10c48be235440d9ae..d36699100e7b35b6a15002c89cdf33f90b6b10d1 100644
--- a/src/OCE/ISF/isfparmlt.F90
+++ b/src/OCE/ISF/isfparmlt.F90
@@ -30,6 +30,7 @@ MODULE isfparmlt
 
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"   
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -110,9 +111,9 @@ CONTAINS
       ! compute ptfrz
       ! 1. ------------Mean freezing point
       DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
+         CALL eos_fzp(CASTSP(ts(:,:,jk,jp_sal,Kmm)), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
       END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
+      CALL isf_tbl(Kmm, CASTDP(ztfrz3d), ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
       !
       pqfwf(:,:) =   sf_isfpar_fwf(1)%fnow(:,:,1)      ! fresh water flux from the isf (fwfisf <0 mean melting)       ( > 0 from isf to oce)
       pqoce(:,:) = - pqfwf(:,:) * rLfusisf             ! ocean/ice shelf flux assume to be equal to latent heat flux  ( > 0 from isf to oce)
@@ -151,9 +152,9 @@ CONTAINS
       !
       ! 0. ------------Mean freezing point
       DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
+         CALL eos_fzp(CASTSP(ts(:,:,jk,jp_sal,Kmm)), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
       END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
+      CALL isf_tbl(Kmm, CASTDP(ztfrz3d), ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
       !
       ! 1. ------------Mean temperature
       CALL isf_tbl(Kmm, ts(:,:,:,jp_tem,Kmm), ztavg, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
@@ -204,9 +205,9 @@ CONTAINS
       !
       ! 1. ------------Mean freezing point (needed for heat content flux)
       DO jk = 1,jpk
-         CALL eos_fzp(ts(:,:,jk,jp_sal,Kmm), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
+         CALL eos_fzp(CASTSP(ts(:,:,jk,jp_sal,Kmm)), ztfrz3d(:,:,jk), gdept(:,:,jk,Kmm))
       END DO
-      CALL isf_tbl(Kmm, ztfrz3d, ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
+      CALL isf_tbl(Kmm, CASTDP(ztfrz3d), ztfrz, 'T', misfkt_par, rhisf_tbl_par, misfkb_par, rfrac_tbl_par )
       !
       ! 2. ------------Scale isf melt pattern with total amount from oasis
       ! ice shelf 2d map of fwf from isf to oce
diff --git a/src/OCE/ISF/isfstp.F90 b/src/OCE/ISF/isfstp.F90
index cef91bb94f49dc3e2d2fe816186adcea610f6294..e774910949c0c330a7c24373c4fc8e660c0199ee 100644
--- a/src/OCE/ISF/isfstp.F90
+++ b/src/OCE/ISF/isfstp.F90
@@ -35,6 +35,7 @@ MODULE isfstp
    PUBLIC   isf_stp, isf_init, isf_nam  ! routine called in sbcmod and divhor
 
    !! * Substitutions
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -86,7 +87,7 @@ CONTAINS
          DO jk = 1, jpk
             ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
          END DO 
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
+         CALL isf_tbl_lvl( CASTSP(ht(:,:)), ze3t           , misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
 #else
          CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_cav, misfkb_cav, rhisf_tbl_cav, rfrac_tbl_cav )
 #endif
@@ -115,7 +116,7 @@ CONTAINS
          DO jk = 1, jpk
             ze3t(:,:,jk) = e3t(:,:,jk,Kmm)
          END DO
-         CALL isf_tbl_lvl( ht(:,:), ze3t           , misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
+         CALL isf_tbl_lvl( CASTSP(ht(:,:)), ze3t           , misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
 #else
          CALL isf_tbl_lvl( ht(:,:),  e3t(:,:,:,Kmm), misfkt_par, misfkb_par, rhisf_tbl_par, rfrac_tbl_par )
 #endif
diff --git a/src/OCE/ISF/isftbl.F90 b/src/OCE/ISF/isftbl.F90
index c6b3adc3bea892cb74f29764f47d0e6c65f2d9a6..efa2ed79b5afadafed9e074becf1bfe69196c038 100644
--- a/src/OCE/ISF/isftbl.F90
+++ b/src/OCE/ISF/isftbl.F90
@@ -44,7 +44,7 @@ CONTAINS
       !!-------------------------- IN  -------------------------------------
       INTEGER                               , INTENT(in   ) :: Kmm           ! ocean time level index
       CHARACTER(len=1)                      , INTENT(in   ) :: cd_ptin       ! point of variable in/out
-      REAL(wp), DIMENSION(jpi,jpj,jpk)      , INTENT(in   ) :: pvarin        ! 3d variable to average over the tbl
+      REAL(dp), DIMENSION(jpi,jpj,jpk)      , INTENT(in   ) :: pvarin        ! 3d variable to average over the tbl
       INTEGER,  DIMENSION(jpi,jpj)          , INTENT(in   ) :: ktop          ! top level
       REAL(wp), DIMENSION(jpi,jpj)          , INTENT(in   ) :: phtbl         ! tbl thickness
       !!-------------------------- IN OPTIONAL -----------------------------
@@ -130,7 +130,7 @@ CONTAINS
       INTEGER,  DIMENSION(jpi,jpj)    , INTENT(in   ) :: ktop, kbot   ! top and bottom level of the top boundary layer
       REAL(wp), DIMENSION(jpi,jpj)    , INTENT(in   ) :: phtbl, pfrac ! fraction of bottom level to be affected by the tbl
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pe3          ! vertical scale factor
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvarin       ! tbl property to average between ktop, kbot over phtbl
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvarin       ! tbl property to average between ktop, kbot over phtbl
       !!--------------------------------------------------------------------
       INTEGER  :: ji,jj,jk                    ! loop indices
       INTEGER  :: ikt, ikb                    ! top and bottom levels
diff --git a/src/OCE/ISF/isfutils.F90 b/src/OCE/ISF/isfutils.F90
index 63c489c59abba9230949223abe4a93736a340fcb..3d6e4183074d31ed1262131fe307f3f825feeb5a 100644
--- a/src/OCE/ISF/isfutils.F90
+++ b/src/OCE/ISF/isfutils.F90
@@ -10,12 +10,12 @@ MODULE isfutils
    !!   isfutils       : - read_2dcstdta to read a constant input file with iom_get
    !!                    - debug to print array sum, min, max in ocean.output
    !!----------------------------------------------------------------------
-
+   USE par_kind
    USE iom           , ONLY: iom_open, iom_get, iom_close, jpdom_global      ! read input file
    USE lib_fortran   , ONLY: glob_sum, glob_min, glob_max                    ! compute global value
    USE par_oce       , ONLY: jpi,jpj,jpk, jpnij, Nis0, Nie0, Njs0, Nje0      ! domain size
    USE dom_oce       , ONLY: narea                                           ! local domain
-   USE in_out_manager, ONLY: i8, wp, lwp, numout                             ! miscelenious
+   USE in_out_manager, ONLY: lwp, numout                             ! miscelenious
    USE lib_mpp
 
    IMPLICIT NONE
@@ -28,6 +28,7 @@ MODULE isfutils
 
    PUBLIC read_2dcstdta, debug
 
+#  include "single_precision_substitute.h90"
 CONTAINS
 
    SUBROUTINE read_2dcstdta(cdfile, cdvar, pvar)
@@ -70,9 +71,9 @@ CONTAINS
       !!--------------------------------------------------------------------
       !
       ! global min/max/sum to check data range and NaN
-      zsum = glob_sum( 'debug', pvar(:,:) )
-      zmin = glob_min( 'debug', pvar(:,:) )
-      zmax = glob_max( 'debug', pvar(:,:) )
+      zsum =glob_sum( 'debug', CASTDP(pvar(:,:)) )
+      zmin = glob_min( 'debug', CASTDP(pvar(:,:)) )
+      zmax = glob_max( 'debug', CASTDP(pvar(:,:)) )
       !
       ! basic check sum to check reproducibility
       ! TRANSFER function find out the integer corresponding to pvar(i,j) bit pattern
@@ -112,7 +113,7 @@ CONTAINS
       !!
       !!-------------------------- IN  -------------------------------------
       CHARACTER(LEN=*)                , INTENT(in   ) :: cdtxt
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvar
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvar
       !!--------------------------------------------------------------------
       REAL(wp)    :: zmin, zmax, zsum
       INTEGER(i8) :: imodd, ip
diff --git a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
index 3ce416fe1fbf4ed39abd342c0ec78d204abc82d7..4da6498a1bf24c7432434e7a3212931b9c961249 100644
--- a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
@@ -1,5 +1,4 @@
-
-   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -270,4 +269,3 @@
       ENDIF
       !
    END SUBROUTINE lbc_lnk_neicoll_/**/PRECISION
-
diff --git a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
index 395a3e93c037cf53ac82eb911726c24926168d3b..c832081a37b2da5f37fafdf3f3f239828251090c 100644
--- a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
@@ -1,4 +1,3 @@
-  
 #if ! defined BLOCK_ISEND && ! defined BLOCK_FILL
    SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
diff --git a/src/OCE/LBC/lbc_nfd_ext_generic.h90 b/src/OCE/LBC/lbc_nfd_ext_generic.h90
index 22e7ee348d86deb94129b3a4ef3be9e1703f1106..f825953ce155c12c69fbfdd4ed45e8387c54c7a5 100644
--- a/src/OCE/LBC/lbc_nfd_ext_generic.h90
+++ b/src/OCE/LBC/lbc_nfd_ext_generic.h90
@@ -1,5 +1,4 @@
-
-   SUBROUTINE lbc_nfd_ext_/**/PRECISION( ptab, cd_nat, psgn, kextj )
+SUBROUTINE lbc_nfd_ext_/**/PRECISION( ptab, cd_nat, psgn, kextj )
       !!----------------------------------------------------------------------
       REAL(PRECISION), DIMENSION(:,1-kextj:),INTENT(inout) ::   ptab
       CHARACTER(len=1), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -117,4 +116,3 @@
       ENDIF   ! c_NFtype == 'F'
       !
    END SUBROUTINE lbc_nfd_ext_/**/PRECISION
-
diff --git a/src/OCE/LBC/lbc_nfd_generic.h90 b/src/OCE/LBC/lbc_nfd_generic.h90
index 18ae89738204699f95b59a2dd15ad27419865f7b..87c7b70e530fc91fb1f426432541731b89435780 100644
--- a/src/OCE/LBC/lbc_nfd_generic.h90
+++ b/src/OCE/LBC/lbc_nfd_generic.h90
@@ -1,5 +1,4 @@
-
-   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld )
+SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
       REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
@@ -388,4 +387,3 @@
       END DO   ! ipf
       !
    END SUBROUTINE lbc_nfd_/**/PRECISION
-
diff --git a/src/OCE/LBC/mpp_lnk_icb_generic.h90 b/src/OCE/LBC/mpp_lnk_icb_generic.h90
index 8798f3e0c3e71217ced192fbb3c1f1879c0640fd..0be8c51df1e0781293adfd3c016f8150c072f4da 100644
--- a/src/OCE/LBC/mpp_lnk_icb_generic.h90
+++ b/src/OCE/LBC/mpp_lnk_icb_generic.h90
@@ -180,4 +180,4 @@
 #    undef LBCNORTH
 #    undef PRECISION 
 #    undef SENDROUTINE 
-#    undef RECVROUTINE 
+#    undef RECVROUTINE
diff --git a/src/OCE/LBC/mpp_loc_generic.h90 b/src/OCE/LBC/mpp_loc_generic.h90
index 1bce8df2d3c2fb7e677f68185a5309346e764450..21783b85eea64eaa65a897d7311082636e390d82 100644
--- a/src/OCE/LBC/mpp_loc_generic.h90
+++ b/src/OCE/LBC/mpp_loc_generic.h90
@@ -1,6 +1,6 @@
-                          !==  IN: ptab is an array  ==!
+!==  IN: ptab is an array  ==!
 #   if defined SINGLE_PRECISION
-#      define ARRAY_TYPE(i,j,k)    REAL(sp)        , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)        , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #if ! defined key_mpi_off
 #      define MPI_TYPE MPI_2REAL
 #endif
diff --git a/src/OCE/LBC/mpp_nfd_generic.h90 b/src/OCE/LBC/mpp_nfd_generic.h90
index fd45035fe4f651ae275d26a3c83f08f2bd192911..d6e6101842cd62c1fdb3699a724742dfdc3e652e 100644
--- a/src/OCE/LBC/mpp_nfd_generic.h90
+++ b/src/OCE/LBC/mpp_nfd_generic.h90
@@ -1,5 +1,4 @@
-
-   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, khls, kfld )
+SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, khls, kfld )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
       REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
@@ -395,4 +394,3 @@
       ENDIF   ! ln_nnogather
       !
    END SUBROUTINE mpp_nfd_/**/PRECISION
-
diff --git a/src/OCE/LDF/ldfslp.F90 b/src/OCE/LDF/ldfslp.F90
index 1b5b09ea5a0ae83a5205a5cac4a56a7b9f87f492..a777f670a48b6e04cd52144b0d8f6a5579dbfad0 100644
--- a/src/OCE/LDF/ldfslp.F90
+++ b/src/OCE/LDF/ldfslp.F90
@@ -74,6 +74,7 @@ MODULE ldfslp
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -320,8 +321,8 @@ CONTAINS
       CALL lbc_lnk( 'ldfslp', uslp , 'U', -1.0_wp , vslp , 'V', -1.0_wp , wslpi, 'W', -1.0_wp, wslpj, 'W', -1.0_wp )
 
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl(tab3d_1=uslp , clinfo1=' slp  - u : ', tab3d_2=vslp,  clinfo2=' v : ')
-         CALL prt_ctl(tab3d_1=wslpi, clinfo1=' slp  - wi: ', tab3d_2=wslpj, clinfo2=' wj: ')
+         CALL prt_ctl(tab3d_1=CASTDP(uslp), clinfo1=' slp  - u : ', tab3d_2=CASTDP(vslp),  clinfo2=' v : ')
+         CALL prt_ctl(tab3d_1=CASTDP(wslpi), clinfo1=' slp  - wi: ', tab3d_2=CASTDP(wslpj), clinfo2=' wj: ')
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('ldf_slp')
diff --git a/src/OCE/LDF/ldftra.F90 b/src/OCE/LDF/ldftra.F90
index 5aaeecd83377adecee77293f3be7b023a3a7c4cb..cfa3f05aa0fd4cc4c0a7e42958e4e3879120c0de 100644
--- a/src/OCE/LDF/ldftra.F90
+++ b/src/OCE/LDF/ldftra.F90
@@ -730,7 +730,7 @@ CONTAINS
       CHARACTER(len=3)            , INTENT(in   ) ::   cdtype    ! =TRA or TRC (tracer indicator)
       ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu        ! in : 3 ocean transport components   [m3/s]
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv        ! out: 3 ocean transport components   [m3/s]
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv        ! out: 3 ocean transport components   [m3/s]
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw        ! increased by the eiv                [m3/s]
       !!
       INTEGER  ::   ji, jj, jk                 ! dummy loop indices
@@ -867,7 +867,7 @@ CONTAINS
       CALL iom_put( "veiv_heattr"  , zztmp * zw2d )                  !  heat transport in j-direction
       CALL iom_put( "veiv_heattr3d", zztmp * zw3d )                  !  heat transport in j-direction
       !
-      IF( iom_use( 'sophteiv' ) )   CALL dia_ptr_hst( jp_tem, 'eiv', 0.5 * zw3d )
+      IF( iom_use( 'sophteiv' ) )   CALL dia_ptr_hst( jp_tem, 'eiv', 0.5_wp * zw3d )
       !
       zztmp = 0.5_wp * 0.5
       IF( iom_use('ueiv_salttr') .OR. iom_use('ueiv_salttr3d')) THEN
@@ -891,7 +891,7 @@ CONTAINS
       CALL iom_put( "veiv_salttr"  , zztmp * zw2d )                  !  salt transport in j-direction
       CALL iom_put( "veiv_salttr3d", zztmp * zw3d )                  !  salt transport in j-direction
       !
-      IF( iom_use( 'sopsteiv' ) ) CALL dia_ptr_hst( jp_sal, 'eiv', 0.5 * zw3d )
+      IF( iom_use( 'sopsteiv' ) ) CALL dia_ptr_hst( jp_sal, 'eiv', 0.5_wp * zw3d )
       !
       !
    END SUBROUTINE ldf_eiv_dia
diff --git a/src/OCE/OBS/ddatetoymdhms.h90 b/src/OCE/OBS/ddatetoymdhms.h90
index 3cd21f1e0dc9cb58fababa676d7faaede7c5604e..f114e601bdd742cfb5a36fb30bcb3a44537d9dfa 100644
--- a/src/OCE/OBS/ddatetoymdhms.h90
+++ b/src/OCE/OBS/ddatetoymdhms.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: ddatetoymdhms.h90 13226 2020-07-02 14:24:31Z orioltp $
    !! Software governed by the CeCILL license (see ./LICENSE)
@@ -20,7 +20,7 @@
       !! * Modules used
 
       !! * Arguments
-      real(dp), INTENT(IN) :: ddate
+      real(wp), INTENT(IN) :: ddate
       INTEGER, INTENT(OUT) :: kyea
       INTEGER, INTENT(OUT) :: kmon
       INTEGER, INTENT(OUT) :: kday
diff --git a/src/OCE/OBS/diaobs.F90 b/src/OCE/OBS/diaobs.F90
index 7d6b84576804423b710a091f2d34165945722200..1e831ab8a14936d743163c261ef4fbb39ba5e07b 100644
--- a/src/OCE/OBS/diaobs.F90
+++ b/src/OCE/OBS/diaobs.F90
@@ -161,8 +161,8 @@ CONTAINS
       LOGICAL, DIMENSION(:), ALLOCATABLE :: llvar   ! Logical for profile variable read
       LOGICAL, DIMENSION(jpmaxnfiles) :: lmask ! Used for finding number of sstbias files
       !
-      REAL(dp) :: rn_dobsini      ! Obs window start date YYYYMMDD.HHMMSS
-      REAL(dp) :: rn_dobsend      ! Obs window end date   YYYYMMDD.HHMMSS
+      REAL(wp) :: rn_dobsini      ! Obs window start date YYYYMMDD.HHMMSS
+      REAL(wp) :: rn_dobsend      ! Obs window end date   YYYYMMDD.HHMMSS
       REAL(wp) :: ztype_avglamscl ! Local version of rn_*_avglamscl
       REAL(wp) :: ztype_avgphiscl ! Local version of rn_*_avgphiscl
       REAL(wp), DIMENSION(:,:,:),   ALLOCATABLE :: zglam   ! Model longitudes for profile variables
@@ -902,8 +902,8 @@ CONTAINS
       IMPLICIT NONE
 
       !! * Arguments
-      REAL(KIND=dp), INTENT(OUT) :: ddobs                        ! Date in YYYYMMDD.HHMMSS
-      INTEGER :: kstp
+      REAL(KIND=wp), INTENT(OUT) :: ddobs                        ! Date in YYYYMMDD.HHMMSS
+      INTEGER, INTENT(IN) :: kstp
 
       !! * Local declarations
       INTEGER :: iyea        ! date - (year, month, day, hour, minute)
@@ -986,7 +986,7 @@ CONTAINS
       IMPLICIT NONE
 
       !! * Arguments
-      REAL(KIND=dp), INTENT(OUT) :: ddobsini                   ! Initial date in YYYYMMDD.HHMMSS
+      REAL(KIND=wp), INTENT(OUT) :: ddobsini                   ! Initial date in YYYYMMDD.HHMMSS
 
       CALL calc_date( nit000 - 1, ddobsini )
 
@@ -1013,7 +1013,7 @@ CONTAINS
       IMPLICIT NONE
 
       !! * Arguments
-      REAL(dp), INTENT(OUT) :: ddobsfin ! Final date in YYYYMMDD.HHMMSS
+      REAL(wp), INTENT(OUT) :: ddobsfin ! Final date in YYYYMMDD.HHMMSS
 
       CALL calc_date( nitend, ddobsfin )
 
diff --git a/src/OCE/OBS/find_obs_proc.h90 b/src/OCE/OBS/find_obs_proc.h90
index 605d339575b3d7f08517e2df27eea97dce28916f..077f3ce583374482ea97588110acacf175ed6729 100644
--- a/src/OCE/OBS/find_obs_proc.h90
+++ b/src/OCE/OBS/find_obs_proc.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: find_obs_proc.h90 13286 2020-07-09 15:48:29Z smasson $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/OBS/greg2jul.h90 b/src/OCE/OBS/greg2jul.h90
index 5bef12f84639d4ffe9a61b21a339945276a46344..59560cc3c409f5cbf62f41feddc7d251f90d4229 100644
--- a/src/OCE/OBS/greg2jul.h90
+++ b/src/OCE/OBS/greg2jul.h90
@@ -1,4 +1,4 @@
-   SUBROUTINE greg2jul( ksec, kmin, khour, kday, kmonth, kyear, pjulian, &
+SUBROUTINE greg2jul( ksec, kmin, khour, kday, kmonth, kyear, pjulian, &
       &                 krefdate )
       !!-----------------------------------------------------------------------
       !!
diff --git a/src/OCE/OBS/grt_cir_dis.h90 b/src/OCE/OBS/grt_cir_dis.h90
index b797b45c70dd25b223edd9c9624355de9f01cd97..df94da030a8d2b1bad969bf69d2a0e5eb60ee477 100644
--- a/src/OCE/OBS/grt_cir_dis.h90
+++ b/src/OCE/OBS/grt_cir_dis.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: grt_cir_dis.h90 13226 2020-07-02 14:24:31Z orioltp $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/OBS/grt_cir_dis_saa.h90 b/src/OCE/OBS/grt_cir_dis_saa.h90
index 794193e134a05f1a8d3b15108318cb5ffbd98bb4..f6b39a5f016254f9fe7294d752c0f248169c469b 100644
--- a/src/OCE/OBS/grt_cir_dis_saa.h90
+++ b/src/OCE/OBS/grt_cir_dis_saa.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: grt_cir_dis_saa.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
@@ -29,4 +29,3 @@
       grt_cir_dis_saa = SQRT( pa * pa + ( pb * pc )**2 )
 
    END FUNCTION grt_cir_dis_saa
- 
diff --git a/src/OCE/OBS/jul2greg.h90 b/src/OCE/OBS/jul2greg.h90
index f9b2823974633741900123d956e99b8831ac8dbc..ec75a986c7eab7bbfcecd125d7e654b155cafcd7 100644
--- a/src/OCE/OBS/jul2greg.h90
+++ b/src/OCE/OBS/jul2greg.h90
@@ -1,4 +1,4 @@
-   RECURSIVE SUBROUTINE jul2greg( ksec, kminut, khour, kday, kmonth, kyear, &
+RECURSIVE SUBROUTINE jul2greg( ksec, kminut, khour, kday, kmonth, kyear, &
       &                           prelday, krefdate )
       !!-----------------------------------------------------------------------
       !!
diff --git a/src/OCE/OBS/linquad.h90 b/src/OCE/OBS/linquad.h90
index 0dafa16e6d4ff09c0e4a113348c2db9e41924029..428793c106a236325724779939719a4ece1c15f5 100644
--- a/src/OCE/OBS/linquad.h90
+++ b/src/OCE/OBS/linquad.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: linquad.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
@@ -56,4 +56,3 @@
       ENDIF
 
    END FUNCTION linquad
-
diff --git a/src/OCE/OBS/maxdist.h90 b/src/OCE/OBS/maxdist.h90
index 47f535fe71c03cf1fe42f41eee45e4bf8313dadd..89420f2ef4c198e41fc0c7d0d7bd90a6cabc40c0 100644
--- a/src/OCE/OBS/maxdist.h90
+++ b/src/OCE/OBS/maxdist.h90
@@ -1,10 +1,10 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: maxdist.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
    !!----------------------------------------------------------------------
 
-   REAL FUNCTION maxdist( pxv, pyv )
+   REAL(wp) FUNCTION maxdist( pxv, pyv )
       !!----------------------------------------------------------------------
       !!                    ***  FUNCTION maxdist ***
       !!
diff --git a/src/OCE/OBS/obs_const.F90 b/src/OCE/OBS/obs_const.F90
index d75941bf4df2a0d29612e74ba40aeeb95c220fd1..0887e3e1b60f2e174b47ebb8293e13b3fbb692a6 100644
--- a/src/OCE/OBS/obs_const.F90
+++ b/src/OCE/OBS/obs_const.F90
@@ -20,4 +20,3 @@ MODULE obs_const
    REAL(kind=sp), PARAMETER :: obfillflt=99999.
 
 END MODULE obs_const
-
diff --git a/src/OCE/OBS/obs_conv.F90 b/src/OCE/OBS/obs_conv.F90
index b84e5bc2c77b85d289f84b7616d12d624905a936..9c08464f40a2c9d2b13345a01eabc5f888975ccf 100644
--- a/src/OCE/OBS/obs_conv.F90
+++ b/src/OCE/OBS/obs_conv.F90
@@ -18,8 +18,7 @@ MODULE obs_conv
    !!              (approximate version)
    !!---------------------------------------------------------------------
    !! * Modules used
-   USE par_kind, ONLY : & ! Precision variables
-      & wp   
+   USE par_kind
    IMPLICIT NONE
  
    !! * Function accessibility
diff --git a/src/OCE/OBS/obs_conv_functions.h90 b/src/OCE/OBS/obs_conv_functions.h90
index c89d80170fdd6d96a9c61d638ed8c5287f99dcb2..a74f65e9278d5f2a03c3d48aa0610f91e18c6742 100644
--- a/src/OCE/OBS/obs_conv_functions.h90
+++ b/src/OCE/OBS/obs_conv_functions.h90
@@ -1,4 +1,4 @@
-    !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: obs_conv_functions.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/OBS/obs_fbm.F90 b/src/OCE/OBS/obs_fbm.F90
index 9e591bf56c7898cae0f0ef4b46f80993f2675f8c..5c7df75b6f1431a5ca2dfb0c29f810907a8e226a 100644
--- a/src/OCE/OBS/obs_fbm.F90
+++ b/src/OCE/OBS/obs_fbm.F90
@@ -1544,7 +1544,7 @@ CONTAINS
       CHARACTER(len=*) :: cdlongname       ! Long name for variable
       CHARACTER(len=*), OPTIONAL :: cdunits       ! Units for variable
       CHARACTER(len=*), OPTIONAL :: cfillvalue    ! Fill value for character variables
-      INTEGER, OPTIONAL :: ifillvalue             ! Fill value for integer variables
+      INTEGER, OPTIONAL, INTENT(IN) :: ifillvalue             ! Fill value for integer variables
       REAL(kind=fbsp), OPTIONAL :: rfillvalue     ! Fill value for real variables
       CHARACTER(len=*), OPTIONAL :: conventions   ! Conventions for variable
       !! * Local variables
@@ -1611,7 +1611,7 @@ CONTAINS
       !! * Arguments
       CHARACTER(len=*) :: cdfilename  ! Input filename
       TYPE(obfbdata)   :: fbdata      ! obsfbdata structure
-      LOGICAL, OPTIONAL :: ldgrid     ! Allow forcing of grid info
+      LOGICAL, OPTIONAL, INTENT(IN) :: ldgrid     ! Allow forcing of grid info
       !! * Local variables
       CHARACTER(LEN=14), PARAMETER :: cpname = 'read_obfbdata'
       INTEGER :: idfile
diff --git a/src/OCE/OBS/obs_grd_bruteforce.h90 b/src/OCE/OBS/obs_grd_bruteforce.h90
index 5a41fa312c864dc2245e8f3a519f6a6de84fa55e..7340e336164d62bd1065633e9a44ff4236bb22cb 100644
--- a/src/OCE/OBS/obs_grd_bruteforce.h90
+++ b/src/OCE/OBS/obs_grd_bruteforce.h90
@@ -1,4 +1,4 @@
-   SUBROUTINE obs_grd_bruteforce( kpi, kpj, kpiglo, kpjglo,       &
+SUBROUTINE obs_grd_bruteforce( kpi, kpj, kpiglo, kpjglo,       &
       &                            kldi, klei, kldj, klej,         &
       &                            kmyproc, ktotproc,              &
       &                            pglam, pgphi, pmask,            &
diff --git a/src/OCE/OBS/obs_grid.F90 b/src/OCE/OBS/obs_grid.F90
index 7157416234e257342c5fd610b1c5a0023fc4a57b..428ab5e3ab6b6a62861a3d181c1aed31167b7574 100644
--- a/src/OCE/OBS/obs_grid.F90
+++ b/src/OCE/OBS/obs_grid.F90
@@ -51,7 +51,7 @@ MODULE obs_grid
    !!* Module variables
 
    !! Default values
-   REAL, PUBLIC :: rn_gridsearchres = 0.5   ! Resolution of grid
+   REAL(wp), PUBLIC :: rn_gridsearchres = 0.5   ! Resolution of grid
    INTEGER, PRIVATE :: gsearch_nlons_def    ! Num of longitudes
    INTEGER, PRIVATE :: gsearch_nlats_def    ! Num of latitudes
    REAL(wp), PRIVATE :: gsearch_lonmin_def  ! Min longitude
@@ -680,7 +680,7 @@ CONTAINS
       INTEGER, PARAMETER :: histsize=90
       INTEGER, DIMENSION(histsize) :: &
          & histx1, histx2, histy1, histy2
-      REAL, DIMENSION(histsize) :: &
+      REAL(wp), DIMENSION(histsize) :: &
          & fhistx1, fhistx2, fhisty1, fhisty2
       REAL(wp) :: histtol
       CHARACTER(LEN=26) :: clfmt            ! writing format
@@ -1182,4 +1182,3 @@ CONTAINS
 #include "find_obs_proc.h90"
 
 END MODULE obs_grid
-
diff --git a/src/OCE/OBS/obs_inter_sup.F90 b/src/OCE/OBS/obs_inter_sup.F90
index d8116276d3a5bcbf7cb2b5ebb187e1b2a427a575..4f96b738c43b8caf404d3ac7be3d045e6cadabae 100644
--- a/src/OCE/OBS/obs_inter_sup.F90
+++ b/src/OCE/OBS/obs_inter_sup.F90
@@ -383,4 +383,3 @@ CONTAINS
    END SUBROUTINE obs_int_comm_3d_local
 
 END MODULE obs_inter_sup
- 
diff --git a/src/OCE/OBS/obs_inter_z1d.F90 b/src/OCE/OBS/obs_inter_z1d.F90
index 9aa7dba5617dcd867f28773d125390263443bacc..a25b5814c9efdcbd08c05bc2b67e2d9f0cd20c17 100644
--- a/src/OCE/OBS/obs_inter_z1d.F90
+++ b/src/OCE/OBS/obs_inter_z1d.F90
@@ -11,8 +11,7 @@ MODULE obs_inter_z1d
    !!                     interpolating function for a cubic spline (n1dint=1)
    !!----------------------------------------------------------------------
    !! * Modules used
-   USE par_kind, ONLY : &  ! Precision variables
-      & wp
+   USE par_kind
 
    IMPLICIT NONE
 
@@ -34,4 +33,3 @@ CONTAINS
 #include "obsinter_z1d.h90"
 
 END MODULE obs_inter_z1d
-
diff --git a/src/OCE/OBS/obs_level_search.h90 b/src/OCE/OBS/obs_level_search.h90
index 8eb3a6b0d6bca24e7f806d9cb760770f3730c624..bd1b7aa713893f2ed2f22da923707b15f50bd9c9 100644
--- a/src/OCE/OBS/obs_level_search.h90
+++ b/src/OCE/OBS/obs_level_search.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: obs_level_search.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/OBS/obs_mpp.F90 b/src/OCE/OBS/obs_mpp.F90
index 907421cb9c27c6bb133be92112fe9f477435f74c..7daaaf7688b5fefc4db4a03d89930ef7f69b227f 100644
--- a/src/OCE/OBS/obs_mpp.F90
+++ b/src/OCE/OBS/obs_mpp.F90
@@ -351,7 +351,7 @@ INCLUDE 'mpif.h'
       !!----------------------------------------------------------------------
       INTEGER                   , INTENT(in) :: knoin
       INTEGER                   , INTENT(in) :: knoout
-      INTEGER, DIMENSION(jpnij)                 ::   kinv, koutv
+      INTEGER, DIMENSION(jpnij), INTENT(IN)  ::   kinv, koutv
       INTEGER, DIMENSION(knoin) , INTENT(in   ) ::   kvalsin
       INTEGER, DIMENSION(knoout), INTENT(  out) ::   kvalsout
       !!
diff --git a/src/OCE/OBS/obs_prep.F90 b/src/OCE/OBS/obs_prep.F90
index aa330063b974da9bdc38ee640a13c0d6e698a193..b1f2a26100c2c8e391385cb8a655faeac661cfe8 100644
--- a/src/OCE/OBS/obs_prep.F90
+++ b/src/OCE/OBS/obs_prep.F90
@@ -734,7 +734,7 @@ CONTAINS
          imonth_len(:) = nleapy   ! all months with nleapy days per year
       ENDIF
 
-   END SUBROUTINE
+   END SUBROUTINE calc_month_len
 
    SUBROUTINE obs_coo_tim_prof( kcycle,                                   &
       &                    kyea0,   kmon0,   kday0,   khou0,   kmin0,     &
diff --git a/src/OCE/OBS/obs_profiles_def.F90 b/src/OCE/OBS/obs_profiles_def.F90
index 9f6352ac92219a434a3656f4beed573b292e5906..805b89f9c22524436658d9771aae3d3cf94161af 100644
--- a/src/OCE/OBS/obs_profiles_def.F90
+++ b/src/OCE/OBS/obs_profiles_def.F90
@@ -563,7 +563,7 @@ CONTAINS
       !! * Arguments
       TYPE(obs_prof), INTENT(IN)    :: prof      ! Original profile
       TYPE(obs_prof), INTENT(INOUT) :: newprof   ! New profile with the copy of the data
-      LOGICAL :: lallocate                ! Allocate newprof data
+      LOGICAL, INTENT(IN) :: lallocate                ! Allocate newprof data
       INTEGER,INTENT(IN) :: kumout        ! Fortran unit for messages
       TYPE(obs_prof_valid), OPTIONAL, INTENT(in) :: &
          & lvalid        ! Valid profiles
@@ -804,7 +804,7 @@ CONTAINS
       !! * Arguments
       TYPE(obs_prof),INTENT(INOUT) :: prof      ! Updated profile data
       TYPE(obs_prof),INTENT(INOUT) :: oldprof   ! Original profile data
-      LOGICAL :: ldeallocate         ! Deallocate the updated data of insertion
+      LOGICAL, INTENT(IN) :: ldeallocate         ! Deallocate the updated data of insertion
       INTEGER,INTENT(in) :: kumout   ! Output unit
       
       !!* Local variables
@@ -925,4 +925,3 @@ CONTAINS
    END SUBROUTINE obs_prof_staend
    
 END MODULE obs_profiles_def
-
diff --git a/src/OCE/OBS/obs_read_prof.F90 b/src/OCE/OBS/obs_read_prof.F90
index de1287bde3c2ee1e4096e0a8beacc14baba8c04a..afa62732295a4e8c5e8f8efb7c8bea506b0a42ca 100644
--- a/src/OCE/OBS/obs_read_prof.F90
+++ b/src/OCE/OBS/obs_read_prof.F90
@@ -77,8 +77,8 @@ CONTAINS
       LOGICAL, INTENT(IN) :: ldignmis   ! Ignore missing files
       LOGICAL, INTENT(IN) :: ldsatt     ! Compute salinity at all temperature points
       LOGICAL, INTENT(IN) :: ldmod      ! Initialize model from input data
-      REAL(dp), INTENT(IN) :: ddobsini  ! Obs. ini time in YYYYMMDD.HHMMSS
-      REAL(dp), INTENT(IN) :: ddobsend  ! Obs. end time in YYYYMMDD.HHMMSS
+      REAL(wp), INTENT(IN) :: ddobsini  ! Obs. ini time in YYYYMMDD.HHMMSS
+      REAL(wp), INTENT(IN) :: ddobsend  ! Obs. end time in YYYYMMDD.HHMMSS
       CHARACTER(len=8), DIMENSION(kvars), INTENT(IN) :: cdvars
       INTEGER, DIMENSION(imaxavtypes), OPTIONAL :: &
          & kdailyavtypes                ! Types of daily average observations
diff --git a/src/OCE/OBS/obs_read_surf.F90 b/src/OCE/OBS/obs_read_surf.F90
index 8c7e044672a1e98e6ff4203da4b0b079d25d57f0..6e3da280f08d7f0a9778e2cdfcec30bb78a64620 100644
--- a/src/OCE/OBS/obs_read_surf.F90
+++ b/src/OCE/OBS/obs_read_surf.F90
@@ -70,8 +70,8 @@ CONTAINS
       LOGICAL, INTENT(IN) :: ldignmis   ! Ignore missing files
       LOGICAL, INTENT(IN) :: ldmod      ! Initialize model from input data
       LOGICAL, INTENT(IN) :: ldnightav  ! Observations represent a night-time average
-      REAL(dp), INTENT(IN) :: ddobsini   ! Obs. ini time in YYYYMMDD.HHMMSS
-      REAL(dp), INTENT(IN) :: ddobsend   ! Obs. end time in YYYYMMDD.HHMMSS
+      REAL(wp), INTENT(IN) :: ddobsini   ! Obs. ini time in YYYYMMDD.HHMMSS
+      REAL(wp), INTENT(IN) :: ddobsend   ! Obs. end time in YYYYMMDD.HHMMSS
       CHARACTER(len=8), DIMENSION(kvars), INTENT(IN) :: cdvars
 
       !! * Local declarations
diff --git a/src/OCE/OBS/obs_rot_vel.F90 b/src/OCE/OBS/obs_rot_vel.F90
index 4330018f1ef6077fa89650de61e2174437c89172..46490d6ea56aab624a140ceea655aca81dac4572 100644
--- a/src/OCE/OBS/obs_rot_vel.F90
+++ b/src/OCE/OBS/obs_rot_vel.F90
@@ -57,7 +57,7 @@ CONTAINS
       !! * Arguments
       TYPE(obs_prof), INTENT(INOUT) :: profdata    ! Profile data to be read
       INTEGER, INTENT(IN) :: k2dint     ! Horizontal interpolation methed
-      REAL(wp), DIMENSION(*) :: &
+      REAL(wp), DIMENSION(:) :: &
          & pu, &
          & pv
       !! * Local declarations
diff --git a/src/OCE/OBS/obs_sort.F90 b/src/OCE/OBS/obs_sort.F90
index f5b14f059702c1ea7d14aaf9e2384a9b7d823a28..978274bc8b1c0bcb114b0ec93a7550ff2dfd5273 100644
--- a/src/OCE/OBS/obs_sort.F90
+++ b/src/OCE/OBS/obs_sort.F90
@@ -144,4 +144,3 @@ CONTAINS
    END SUBROUTINE index_sort
 
 END MODULE obs_sort
- 
diff --git a/src/OCE/OBS/obs_surf_def.F90 b/src/OCE/OBS/obs_surf_def.F90
index 54cb6a737a0b01b735005079683a2e93439428d4..4494c97877c5946d6585f90469a4412a4bf5ac96 100644
--- a/src/OCE/OBS/obs_surf_def.F90
+++ b/src/OCE/OBS/obs_surf_def.F90
@@ -333,7 +333,7 @@ CONTAINS
       !! * Arguments
       TYPE(obs_surf), INTENT(IN)    :: surf      ! Original surface data
       TYPE(obs_surf), INTENT(INOUT) :: newsurf   ! New surface data with a subset of the original data
-      LOGICAL :: lallocate     ! Allocate newsurf data
+      LOGICAL, INTENT(IN) :: lallocate     ! Allocate newsurf data
       INTEGER,INTENT(IN) :: kumout        ! Fortran unit for messages
       LOGICAL, OPTIONAL, INTENT(in), DIMENSION(:) :: &
          & lvalid         ! Valid of surface observations
@@ -462,7 +462,7 @@ CONTAINS
       !! * Arguments
       TYPE(obs_surf),INTENT(INOUT) :: surf       ! Updated surface data
       TYPE(obs_surf),INTENT(INOUT) :: oldsurf    ! Original surface data
-      LOGICAL :: ldeallocate ! Deallocate the updated data of insertion
+      LOGICAL, INTENT(IN) :: ldeallocate ! Deallocate the updated data of insertion
       INTEGER,INTENT(in) :: kumout      ! Output unit
       
       !!* Local variables
@@ -527,4 +527,3 @@ CONTAINS
    END SUBROUTINE obs_surf_decompress
    
 END MODULE obs_surf_def
-
diff --git a/src/OCE/OBS/obs_utils.F90 b/src/OCE/OBS/obs_utils.F90
index 8e1fd17e7519a58f065d275ef44edcdac724a59b..6298ec97ea10bbd787a725ff10bdbbc5320860ad 100644
--- a/src/OCE/OBS/obs_utils.F90
+++ b/src/OCE/OBS/obs_utils.F90
@@ -67,9 +67,9 @@ CONTAINS
       USE netcdf             ! NetCDF library
 
       !! * Arguments
-      INTEGER :: kstatus
-      INTEGER :: klineno
-      CHARACTER(LEN=*) :: cd_name
+      INTEGER, INTENT(IN) :: kstatus
+      INTEGER, INTENT(IN) :: klineno
+      CHARACTER(LEN=*), INTENT(IN) :: cd_name
       
       !! * Local declarations
       CHARACTER(len=200) :: clineno
@@ -166,7 +166,7 @@ CONTAINS
       !! * Modules used
 
       !! * Arguments
-      INTEGER :: klineno
+      INTEGER, INTENT(IN) :: klineno
       CHARACTER(LEN=*) :: cd_name
       !! * Local declarations
       CHARACTER(len=200) :: clineno
@@ -193,7 +193,7 @@ CONTAINS
       !! * Modules used
 
       !! * Arguments
-      INTEGER :: klineno
+      INTEGER, INTENT(IN) :: klineno
       CHARACTER(LEN=*) :: cd_name
       !! * Local declarations
       CHARACTER(len=200) :: clineno
diff --git a/src/OCE/OBS/obsinter_h2d.h90 b/src/OCE/OBS/obsinter_h2d.h90
index 1328477b06aca36def378255cb3cbefa703f9d84..409d85fa483811a9b5cdcbbaeda85d34f0804f59 100644
--- a/src/OCE/OBS/obsinter_h2d.h90
+++ b/src/OCE/OBS/obsinter_h2d.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: obsinter_h2d.h90 10353 2018-11-21 16:04:47Z mathiot $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/OBS/obsinter_z1d.h90 b/src/OCE/OBS/obsinter_z1d.h90
index 6cba566572fc57828c3b5bbb61398c4c620d5a6d..b1812b46dba2fe46c3741ba4855a3480c869b507 100644
--- a/src/OCE/OBS/obsinter_z1d.h90
+++ b/src/OCE/OBS/obsinter_z1d.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: obsinter_z1d.h90 13226 2020-07-02 14:24:31Z orioltp $
    !! Software governed by the CeCILL license (see ./LICENSE)
@@ -191,5 +191,3 @@
       END DO
  
   END SUBROUTINE obs_int_z1d_spl
-
-
diff --git a/src/OCE/OBS/str_c_to_for.h90 b/src/OCE/OBS/str_c_to_for.h90
index 6c575f95c7131515bc610a55a4c88863f645fa5d..64ac14f49488a216f5542c3738b24d4dcbdc868f 100644
--- a/src/OCE/OBS/str_c_to_for.h90
+++ b/src/OCE/OBS/str_c_to_for.h90
@@ -1,4 +1,4 @@
-   !!----------------------------------------------------------------------
+!!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: str_c_to_for.h90 10068 2018-08-28 14:09:04Z nicolasmartin $
    !! Software governed by the CeCILL license (see ./LICENSE)
diff --git a/src/OCE/SBC/fldread.F90 b/src/OCE/SBC/fldread.F90
index f7a6d90fa6949a2144e762b1a8634f939fcaf8a3..1385e42007af8e70421135d692c4e5a419f72526 100644
--- a/src/OCE/SBC/fldread.F90
+++ b/src/OCE/SBC/fldread.F90
@@ -129,6 +129,7 @@ MODULE fldread
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -1100,7 +1101,7 @@ CONTAINS
       CHARACTER (len=5) ::   clname   !
       INTEGER , DIMENSION(4) ::   ddims
       INTEGER                ::   isrc
-      REAL(wp), DIMENSION(jpi,jpj) ::   data_tmp
+      REAL(dp), DIMENSION(jpi,jpj) ::   data_tmp
       !!----------------------------------------------------------------------
       !
       IF( nxt_wgt > tot_wgts ) THEN
diff --git a/src/OCE/SBC/sbc_oce.F90 b/src/OCE/SBC/sbc_oce.F90
index 3098b5865b6719eb5250180257f7d9e1ab143c75..17aefe7e1e0717af98655a98952d80b683ef3d61 100644
--- a/src/OCE/SBC/sbc_oce.F90
+++ b/src/OCE/SBC/sbc_oce.F90
@@ -126,7 +126,7 @@ MODULE sbc_oce
    !!
    !!
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
diff --git a/src/OCE/SBC/sbc_phy.F90 b/src/OCE/SBC/sbc_phy.F90
index cabec70fcfda4a096d045c62979b86cb029f02a8..6fec2ddf342be29bb7e21145a6d87862cc0d97a9 100644
--- a/src/OCE/SBC/sbc_phy.F90
+++ b/src/OCE/SBC/sbc_phy.F90
@@ -864,7 +864,7 @@ CONTAINS
          zCh = zz0*ptst(ji,jj)/zdt
          zCe = zz0*pqst(ji,jj)/zdq
 
-         CALL BULK_FORMULA( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), zCd, zCh, zCe, &
+         CALL bulk_formula( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), zCd, zCh, zCe, &
             &              pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj), prhoa(ji,jj), &
             &              pTau(ji,jj), zQsen, zQlat )
 
@@ -879,7 +879,7 @@ CONTAINS
    END SUBROUTINE UPDATE_QNSOL_TAU
 
 
-   SUBROUTINE BULK_FORMULA_SCLR( pzu, pTs, pqs, pTa, pqa, &
+   SUBROUTINE bulk_formula_sclr( pzu, pTs, pqs, pTa, pqa, &
       &                          pCd, pCh, pCe,           &
       &                          pwnd, pUb, ppa, prhoa,   &
       &                          pTau, pQsen, pQlat,      &
@@ -921,9 +921,9 @@ CONTAINS
 
       IF( PRESENT(pEvap) ) pEvap = - zfact_evap * zevap
 
-   END SUBROUTINE BULK_FORMULA_SCLR
+   END SUBROUTINE bulk_formula_sclr
 
-   SUBROUTINE BULK_FORMULA_VCTR( pzu, pTs, pqs, pTa, pqa, &
+   SUBROUTINE bulk_formula_vctr( pzu, pTs, pqs, pTa, pqa, &
       &                          pCd, pCh, pCe,           &
       &                          pwnd, pUb, ppa, prhoa,   &
       &                          pTau, pQsen, pQlat,      &
@@ -957,7 +957,7 @@ CONTAINS
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
 
-         CALL BULK_FORMULA_SCLR( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), &
+         CALL bulk_formula_sclr( pzu, pTs(ji,jj), pqs(ji,jj), pTa(ji,jj), pqa(ji,jj), &
             &                    pCd(ji,jj), pCh(ji,jj), pCe(ji,jj),                  &
             &                    pwnd(ji,jj), pUb(ji,jj), ppa(ji,jj), prhoa(ji,jj),   &
             &                    pTau(ji,jj), pQsen(ji,jj), pQlat(ji,jj),             &
@@ -966,7 +966,7 @@ CONTAINS
          IF( PRESENT(pEvap) ) pEvap(ji,jj) = zevap
       END_2D
 
-   END SUBROUTINE BULK_FORMULA_VCTR
+   END SUBROUTINE bulk_formula_vctr
 
 
    FUNCTION alpha_sw_vctr( psst )
diff --git a/src/OCE/SBC/sbcblk.F90 b/src/OCE/SBC/sbcblk.F90
index aa3668c3300bb8d3a46998a76f2f56014332d540..035a25146745544a7d6f187bbb649bfb5ce7176e 100644
--- a/src/OCE/SBC/sbcblk.F90
+++ b/src/OCE/SBC/sbcblk.F90
@@ -117,7 +117,7 @@ MODULE sbcblk
    REAL(wp) ::   rn_stau_a      ! Alpha and Beta coefficients of Renault et al. 2020, eq. 10: Stau = Alpha * Wnd + Beta
    REAL(wp) ::   rn_stau_b      !
    !
-   REAL(wp)         ::   rn_pfac   ! multiplication factor for precipitation
+   REAL(dp)         ::   rn_pfac   ! multiplication factor for precipitation
    REAL(wp), PUBLIC ::   rn_efac   ! multiplication factor for evaporation
    REAL(wp)         ::   rn_zqt    ! z(q,t) : height of humidity and temperature measurements
    REAL(wp)         ::   rn_zu     ! z(u)   : height of wind measurements
@@ -169,6 +169,7 @@ MODULE sbcblk
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcblk.F90 15551 2021-11-28 20:19:36Z gsamson $
@@ -575,7 +576,7 @@ CONTAINS
 
          CALL blk_oce_2(     theta_air_zt(:,:),                                    &   !   <<= in
             &                sf(jp_qlw  )%fnow(:,:,1), sf(jp_prec )%fnow(:,:,1),   &   !   <<= in
-            &                sf(jp_snow )%fnow(:,:,1), tsk_m,                      &   !   <<= in
+            &                CASTDP(sf(jp_snow )%fnow(:,:,1)), tsk_m,                      &   !   <<= in
             &                zsen, zlat, zevp )                                        !   <=> in out
       ENDIF
       !
@@ -808,7 +809,7 @@ CONTAINS
             rhoa(ji,jj) = rho_air( ztabs(ji,jj), q_zu(ji,jj), zpre(ji,jj) )
          END_2D
 
-         CALL BULK_FORMULA( rn_zu, zsspt(:,:), pssq(:,:), theta_zu(:,:), q_zu(:,:), &
+         CALL bulk_formula( rn_zu, zsspt(:,:), pssq(:,:), theta_zu(:,:), q_zu(:,:), &
             &               zcd_oce(:,:), zch_oce(:,:), zce_oce(:,:),          &
             &               wndm(:,:), zU_zu(:,:), pslp(:,:), rhoa(:,:),       &
             &               taum(:,:), psen(:,:), plat(:,:),                   &
@@ -868,11 +869,11 @@ CONTAINS
          CALL iom_put( "vtau_oce", ztau_j(:,:)*tmask(:,:,1) )  ! vtau at T-points!
 
          IF(sn_cfctl%l_prtctl) THEN
-            CALL prt_ctl( tab2d_1=pssq   , clinfo1=' blk_oce_1: pssq   : ', mask1=tmask )
-            CALL prt_ctl( tab2d_1=wndm   , clinfo1=' blk_oce_1: wndm   : ', mask1=tmask )
-            CALL prt_ctl( tab2d_1=utau   , clinfo1=' blk_oce_1: utau   : ', mask1=umask,   &
-               &          tab2d_2=vtau   , clinfo2='            vtau   : ', mask2=vmask )
-            CALL prt_ctl( tab2d_1=zcd_oce, clinfo1=' blk_oce_1: Cd     : ', mask1=tmask )
+            CALL prt_ctl( tab2d_1=CASTDP(pssq), clinfo1=' blk_oce_1: pssq   : ', mask1=tmask )
+            CALL prt_ctl( tab2d_1=CASTDP(wndm), clinfo1=' blk_oce_1: wndm   : ', mask1=tmask )
+            CALL prt_ctl( tab2d_1=CASTDP(utau), clinfo1=' blk_oce_1: utau   : ', mask1=umask,   &
+               &          tab2d_2=CASTDP(vtau), clinfo2='            vtau   : ', mask2=vmask )
+            CALL prt_ctl( tab2d_1=CASTDP(zcd_oce), clinfo1=' blk_oce_1: Cd     : ', mask1=tmask )
          ENDIF
          !
       ENDIF ! ln_blk / ln_abl
@@ -907,7 +908,7 @@ CONTAINS
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptair   ! potential temperature of air #LB: confirm!
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   pdqlw   ! downwelling longwave radiation at surface [W/m^2]
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   pprec
-      REAL(wp), INTENT(in), DIMENSION(:,:) ::   psnow
+      REAL(dp), INTENT(in), DIMENSION(:,:) ::   psnow
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptsk   ! SKIN surface temperature   [Celsius]
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   psen
       REAL(wp), INTENT(in), DIMENSION(:,:) ::   plat
@@ -969,11 +970,11 @@ CONTAINS
       ENDIF
       !
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl(tab2d_1=zqlw , clinfo1=' blk_oce_2: zqlw  : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=psen , clinfo1=' blk_oce_2: psen  : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=plat , clinfo1=' blk_oce_2: plat  : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=qns  , clinfo1=' blk_oce_2: qns   : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=emp  , clinfo1=' blk_oce_2: emp   : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(zqlw), clinfo1=' blk_oce_2: zqlw  : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(psen), clinfo1=' blk_oce_2: psen  : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(plat), clinfo1=' blk_oce_2: plat  : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(qns), clinfo1=' blk_oce_2: qns   : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(emp), clinfo1=' blk_oce_2: emp   : ', mask1=tmask )
       ENDIF
       !
    END SUBROUTINE blk_oce_2
@@ -1096,8 +1097,8 @@ CONTAINS
          END_2D
          CALL lbc_lnk( 'sbcblk', putaui, 'U', -1._wp, pvtaui, 'V', -1._wp )
          !
-         IF(sn_cfctl%l_prtctl)  CALL prt_ctl( tab2d_1=putaui  , clinfo1=' blk_ice: putaui : ', mask1=umask   &
-            &                               , tab2d_2=pvtaui  , clinfo2='          pvtaui : ', mask2=vmask )
+         IF(sn_cfctl%l_prtctl)  CALL prt_ctl( tab2d_1=CASTDP(putaui), clinfo1=' blk_ice: putaui : ', mask1=umask   &
+            &                               , tab2d_2=CASTDP(pvtaui), clinfo2='          pvtaui : ', mask2=vmask )
       ELSE ! ln_abl
 
          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
@@ -1109,7 +1110,7 @@ CONTAINS
 
       ENDIF ! ln_blk  / ln_abl
       !
-      IF(sn_cfctl%l_prtctl)  CALL prt_ctl(tab2d_1=wndm_ice  , clinfo1=' blk_ice: wndm_ice : ', mask1=tmask )
+      IF(sn_cfctl%l_prtctl)  CALL prt_ctl(tab2d_1=CASTDP(wndm_ice), clinfo1=' blk_ice: wndm_ice : ', mask1=tmask )
       !
    END SUBROUTINE blk_ice_1
 
@@ -1310,18 +1311,18 @@ CONTAINS
          DO jl = 1, jpl
             zmsk(:,:,jl) = tmask(:,:,1)
          END DO
-         CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice: qla_ice  : ', mask1=zmsk,   &
-            &         tab3d_2=z_qsb   , clinfo2=' z_qsb    : '         , mask2=zmsk, kdim=jpl)
-         CALL prt_ctl(tab3d_1=z_qlw   , clinfo1=' blk_ice: z_qlw    : ', mask1=zmsk,   &
-            &         tab3d_2=dqla_ice, clinfo2=' dqla_ice : '         , mask2=zmsk, kdim=jpl)
-         CALL prt_ctl(tab3d_1=z_dqsb  , clinfo1=' blk_ice: z_dqsb   : ', mask1=zmsk,   &
-            &         tab3d_2=z_dqlw  , clinfo2=' z_dqlw   : '         , mask2=zmsk, kdim=jpl)
-         CALL prt_ctl(tab3d_1=dqns_ice, clinfo1=' blk_ice: dqns_ice : ', mask1=zmsk,   &
-            &         tab3d_2=qsr_ice , clinfo2=' qsr_ice  : '         , mask2=zmsk, kdim=jpl)
-         CALL prt_ctl(tab3d_1=ptsu    , clinfo1=' blk_ice: ptsu     : ', mask1=zmsk,   &
-            &         tab3d_2=qns_ice , clinfo2=' qns_ice  : '         , mask2=zmsk, kdim=jpl)
-         CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice: tprecip  : ', mask1=tmask,   &
-            &         tab2d_2=sprecip , clinfo2=' sprecip  : '         , mask2=tmask         )
+         CALL prt_ctl(tab3d_1=CASTDP(qla_ice) , clinfo1=' blk_ice: qla_ice  : ', mask1=zmsk,   &
+            &         tab3d_2=CASTDP(z_qsb)   , clinfo2=' z_qsb    : '         , mask2=zmsk, kdim=jpl)
+         CALL prt_ctl(tab3d_1=CASTDP(z_qlw)   , clinfo1=' blk_ice: z_qlw    : ', mask1=zmsk,   &
+            &         tab3d_2=CASTDP(dqla_ice), clinfo2=' dqla_ice : '         , mask2=zmsk, kdim=jpl)
+         CALL prt_ctl(tab3d_1=CASTDP(z_dqsb)  , clinfo1=' blk_ice: z_dqsb   : ', mask1=zmsk,   &
+            &         tab3d_2=CASTDP(z_dqlw)  , clinfo2=' z_dqlw   : '         , mask2=zmsk, kdim=jpl)
+         CALL prt_ctl(tab3d_1=CASTDP(dqns_ice), clinfo1=' blk_ice: dqns_ice : ', mask1=zmsk,   &
+            &         tab3d_2=CASTDP(qsr_ice) , clinfo2=' qsr_ice  : '         , mask2=zmsk, kdim=jpl)
+         CALL prt_ctl(tab3d_1=CASTDP(ptsu)    , clinfo1=' blk_ice: ptsu     : ', mask1=zmsk,   &
+            &         tab3d_2=CASTDP(qns_ice) , clinfo2=' qns_ice  : '         , mask2=zmsk, kdim=jpl)
+         CALL prt_ctl(tab2d_1=CASTDP(tprecip) , clinfo1=' blk_ice: tprecip  : ', mask1=tmask,   &
+            &         tab2d_2=CASTDP(sprecip) , clinfo2=' sprecip  : '         , mask2=tmask         )
          DEALLOCATE(zmsk)
       ENDIF
 
diff --git a/src/OCE/SBC/sbcblk_algo_coare3p0.F90 b/src/OCE/SBC/sbcblk_algo_coare3p0.F90
index 2ad244fcb4d788a921e25c502cfd966d479db70f..5c9e6d02f4ad4b52b552fd29efa88b0c38146067 100644
--- a/src/OCE/SBC/sbcblk_algo_coare3p0.F90
+++ b/src/OCE/SBC/sbcblk_algo_coare3p0.F90
@@ -169,9 +169,9 @@ CONTAINS
       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
       !
       INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cdn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Chn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cen
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
diff --git a/src/OCE/SBC/sbcblk_algo_coare3p6.F90 b/src/OCE/SBC/sbcblk_algo_coare3p6.F90
index cb7fff12b99999e0c740d5d8a23393f8dcfec3e7..58a0624d98ff1db00de058ec675fbd841f19b273 100644
--- a/src/OCE/SBC/sbcblk_algo_coare3p6.F90
+++ b/src/OCE/SBC/sbcblk_algo_coare3p6.F90
@@ -159,9 +159,9 @@ CONTAINS
       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
       !
       INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cdn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Chn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cen
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
diff --git a/src/OCE/SBC/sbcblk_algo_ecmwf.F90 b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
index e4075308d8b329c03c61e516479c6323938221b5..74ccc356ae787a586ab7288ee385b7c2ee213327 100644
--- a/src/OCE/SBC/sbcblk_algo_ecmwf.F90
+++ b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
@@ -165,9 +165,9 @@ CONTAINS
       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   Ubzu    ! bulk wind speed at zu                     [m/s]
       !
       INTEGER , INTENT(in   ), OPTIONAL                     :: nb_iter  ! number of iterations
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CdN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   ChN
-      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   CeN
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cdn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Chn
+      REAL(wp), INTENT(  out), OPTIONAL, DIMENSION(jpi,jpj) ::   Cen
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   Qsw      !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   rad_lw   !             [W/m^2]
       REAL(wp), INTENT(in   ), OPTIONAL, DIMENSION(jpi,jpj) ::   slp      !             [Pa]
diff --git a/src/OCE/SBC/sbcclo.F90 b/src/OCE/SBC/sbcclo.F90
index ba956f5e32dfa77dfea9106ee2855e2b2659d716..7238507f5e4c17f17ace2e40b09198098f386b19 100644
--- a/src/OCE/SBC/sbcclo.F90
+++ b/src/OCE/SBC/sbcclo.F90
@@ -159,7 +159,7 @@ MODULE sbcclo
          !
       END DO  ! jcs
 
-   END SUBROUTINE
+   END SUBROUTINE get_cssrcsurf
 
    SUBROUTINE get_cstrgsurf(kncs, kmaskcs, kmaskcsgrp, psurftrg, kcsgrp )
       !!-----------------------------------------------------------------------
@@ -211,7 +211,7 @@ MODULE sbcclo
          !
       END DO ! jcs
 
-   END SUBROUTINE
+   END SUBROUTINE get_cstrgsurf
 
    SUBROUTINE prt_csctl(kncs, psurfsrc, psurftrg, kcsgrp, cdcstype)
       !!-----------------------------------------------------------------------
@@ -245,7 +245,7 @@ MODULE sbcclo
          WRITE(numout,*)''
       END IF
 
-   END SUBROUTINE
+   END SUBROUTINE prt_csctl
 
    SUBROUTINE sbc_csupdate(kncs, kcsgrp, kmsk_src, kmsk_grp, psurfsrc, psurftrg, cdcstype, kmsk_opnsea, psurf_opnsea, pwcs, pqcs)
       !!-----------------------------------------------------------------------
@@ -319,7 +319,7 @@ MODULE sbcclo
          !
       END DO ! jcs
 
-   END SUBROUTINE
+   END SUBROUTINE sbc_csupdate
 
    SUBROUTINE alloc_csarr( klen, pvarsrc, pvartrg, kvargrp )
       !!-----------------------------------------------------------------------
@@ -347,6 +347,6 @@ MODULE sbcclo
       pvarsrc(:) = 0.e0_wp
       pvartrg(:) = 0.e0_wp
       kvargrp(:) = 0
-   END SUBROUTINE
+   END SUBROUTINE alloc_csarr
 
 END MODULE
diff --git a/src/OCE/SBC/sbccpl.F90 b/src/OCE/SBC/sbccpl.F90
index 79602758f20f23e2ab645ed1e224474d44d0c1aa..fb6f2a2baecd05c04e207912a357031696a3ebcf 100644
--- a/src/OCE/SBC/sbccpl.F90
+++ b/src/OCE/SBC/sbccpl.F90
@@ -223,6 +223,7 @@ MODULE sbccpl
 
    !! Substitution
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -2316,7 +2317,7 @@ CONTAINS
             ztmp1(:,:) = ts(:,:,1,jp_tem,Kmm)   ! send temperature as it is (potential or conservative) -> use of l_useCT on the received part
          ELSE
             ! we must send the surface potential temperature
-            IF( l_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm) )
+            IF( l_useCT )  THEN    ;   ztmp1(:,:) =eos_pt_from_ct( CASTSP(ts(:,:,1,jp_tem,Kmm)), CASTSP(ts(:,:,1,jp_sal,Kmm)) )
             ELSE                   ;   ztmp1(:,:) = ts(:,:,1,jp_tem,Kmm)
             ENDIF
             !
@@ -2750,11 +2751,11 @@ CONTAINS
       ENDIF
       !                                                        ! SSS
       IF( ssnd(jps_soce  )%laction )  THEN
-         CALL cpl_snd( jps_soce  , isec, RESHAPE ( ts(:,:,1,jp_sal,Kmm), (/jpi,jpj,1/) ), info )
+         CALL cpl_snd( jps_soce  , isec, CASTSP(RESHAPE ( ts(:,:,1,jp_sal,Kmm), (/jpi,jpj,1/) )), info )
       ENDIF
       !                                                        ! first T level thickness
       IF( ssnd(jps_e3t1st )%laction )  THEN
-         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( e3t(:,:,1,Kmm)   , (/jpi,jpj,1/) ), info )
+ CALL cpl_snd( jps_e3t1st, isec, CASTSP(RESHAPE ( e3t(:,:,1,Kmm) , (/jpi,jpj,1/) )), info )
       ENDIF
       !                                                        ! Qsr fraction
       IF( ssnd(jps_fraqsr)%laction )  THEN
diff --git a/src/OCE/SBC/sbcmod.F90 b/src/OCE/SBC/sbcmod.F90
index 6811e617be39177fd63249666eb699b5ae4f818d..65f4495fab1bb4c8095f2fa6b7e426676c6e6d2e 100644
--- a/src/OCE/SBC/sbcmod.F90
+++ b/src/OCE/SBC/sbcmod.F90
@@ -75,6 +75,7 @@ MODULE sbcmod
    INTEGER ::   nsbc   ! type of surface boundary condition (deduced from namsbc informations)
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: sbcmod.F90 15372 2021-10-14 15:47:24Z davestorkey $
@@ -607,16 +608,16 @@ CONTAINS
       ENDIF
       !
       IF(sn_cfctl%l_prtctl) THEN     ! print mean trends (used for debugging)
-         CALL prt_ctl(tab2d_1=fr_i                , clinfo1=' fr_i     - : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=(emp-rnf)           , clinfo1=' emp-rnf  - : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=(sfx-rnf)           , clinfo1=' sfx-rnf  - : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=qns                 , clinfo1=' qns      - : ', mask1=tmask )
-         CALL prt_ctl(tab2d_1=qsr                 , clinfo1=' qsr      - : ', mask1=tmask )
-         CALL prt_ctl(tab3d_1=tmask               , clinfo1=' tmask    - : ', mask1=tmask, kdim=jpk )
+         CALL prt_ctl(tab2d_1=CASTDP(fr_i)                , clinfo1=' fr_i     - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP((emp-rnf))           , clinfo1=' emp-rnf  - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP((sfx-rnf))           , clinfo1=' sfx-rnf  - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(qns)                 , clinfo1=' qns      - : ', mask1=tmask )
+         CALL prt_ctl(tab2d_1=CASTDP(qsr)                , clinfo1=' qsr      - : ', mask1=tmask )
+         CALL prt_ctl(tab3d_1=CASTDP(tmask)              , clinfo1=' tmask    - : ', mask1=tmask, kdim=jpk )
          CALL prt_ctl(tab3d_1=ts(:,:,:,jp_tem,Kmm), clinfo1=' sst      - : ', mask1=tmask, kdim=1   )
          CALL prt_ctl(tab3d_1=ts(:,:,:,jp_sal,Kmm), clinfo1=' sss      - : ', mask1=tmask, kdim=1   )
-         CALL prt_ctl(tab2d_1=utau                , clinfo1=' utau     - : ', mask1=umask,                      &
-            &         tab2d_2=vtau                , clinfo2=' vtau     - : ', mask2=vmask )
+         CALL prt_ctl(tab2d_1=CASTDP(utau)               , clinfo1=' utau     - : ', mask1=umask,                      &
+            &         tab2d_2=CASTDP(vtau)               , clinfo2=' vtau     - : ', mask2=vmask )
       ENDIF
 
       IF( kt == nitend )   CALL sbc_final         ! Close down surface module if necessary
diff --git a/src/OCE/SBC/sbcssm.F90 b/src/OCE/SBC/sbcssm.F90
index 95e64875363eb85952e4b5b8c5a1dbd72963b9e8..39fc06d26959af3be52b97c36967f987330e737d 100644
--- a/src/OCE/SBC/sbcssm.F90
+++ b/src/OCE/SBC/sbcssm.F90
@@ -31,6 +31,7 @@ MODULE sbcssm
 
    LOGICAL, SAVE ::   l_ssm_mean = .FALSE.   ! keep track of whether means have been read from restart file
 
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -241,7 +242,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) '   default initialisation of ss._m arrays'
          ssu_m(:,:) = uu(:,:,1,Kbb)
          ssv_m(:,:) = vv(:,:,1,Kbb)
-         IF( l_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( ts(:,:,1,jp_tem,Kmm), ts(:,:,1,jp_sal,Kmm) )
+         IF( l_useCT )  THEN    ;   sst_m(:,:) =eos_pt_from_ct( CASTSP(ts(:,:,1,jp_tem,Kmm)), CASTSP(ts(:,:,1,jp_sal,Kmm)) )
          ELSE                   ;   sst_m(:,:) = ts(:,:,1,jp_tem,Kmm)
          ENDIF
          sss_m(:,:) = ts  (:,:,1,jp_sal,Kmm)
diff --git a/src/OCE/SBC/sbcwave.F90 b/src/OCE/SBC/sbcwave.F90
index 2264938d72a9f274537fd9378d55ba6e458c38c4..a9435f96251a143a86725800e3fa6f72d65c0c9e 100644
--- a/src/OCE/SBC/sbcwave.F90
+++ b/src/OCE/SBC/sbcwave.F90
@@ -71,7 +71,8 @@ MODULE sbcwave
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tsd2d           !: Surface Stokes Drift module at t-point
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   div_sd          !: barotropic stokes drift divergence
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   ut0sd, vt0sd    !: surface Stokes drift velocities at t-point
-   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   usd, vsd, wsd   !: Stokes drift velocities at u-, v- & w-points, resp.u
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  :: wsd!: Stokes drift velocities at u-, v- & w-points, resp.u
+   REAL(dp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)  :: usd, vsd!: Stokes drift velocities at u-, v- & w-points, resp.u
 !
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   charn           !: charnock coefficient at t-point
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tawx            !: Net wave-supported stress, u
@@ -211,7 +212,7 @@ CONTAINS
          END_3D
       ENDIF
 
-      CALL lbc_lnk( 'sbcwave', usd, 'U', -1.0_wp, vsd, 'V', -1.0_wp )
+      CALL lbc_lnk( 'sbcwave', usd, 'U', -1.0_dp, vsd, 'V', -1.0_dp )
 
       !
       !                       !==  vertical Stokes Drift 3D velocity  ==!
diff --git a/src/OCE/STO/stopar.F90 b/src/OCE/STO/stopar.F90
index 91cc93bb7947fc67569fd6b092b8a97fd33d1e63..2ba74a5c5661e9de3dc3d09246bc354cda65316a 100644
--- a/src/OCE/STO/stopar.F90
+++ b/src/OCE/STO/stopar.F90
@@ -915,4 +915,3 @@ CONTAINS
 
 
 END MODULE stopar
-
diff --git a/src/OCE/STO/stopts.F90 b/src/OCE/STO/stopts.F90
index 6573a4fef53baf4cd3f2802b589c75776b2f299b..aeb80e519862432718b901ee54c3bbd01b7aae87 100644
--- a/src/OCE/STO/stopts.F90
+++ b/src/OCE/STO/stopts.F90
@@ -43,7 +43,7 @@ CONTAINS
       !!                around every model grid point
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) ::   pts   ! 1 : potential temperature  [Celsius]
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) ::   pts   ! 1 : potential temperature  [Celsius]
       !                                                               ! 2 : salinity               [psu]
       INTEGER  ::   ji, jj, jk, jts, jdof ! dummy loop indices
       INTEGER  ::   jim1, jjm1, jkm1  ! incremented indices
@@ -53,7 +53,7 @@ CONTAINS
       !!----------------------------------------------------------------------
 
       DO jts = 1, jpts
-        CALL lbc_lnk( 'stopts', pts(:,:,:,jts), 'T' , 1._wp )
+        CALL lbc_lnk( 'stopts', pts(:,:,:,jts), 'T' , 1._dp )
       ENDDO
 
       DO jdof = 1, nn_sto_eos
diff --git a/src/OCE/TDE/tide.h90 b/src/OCE/TDE/tide.h90
index 80872889cff89884aab6d8a6335eb3be79bfe0bf..6eb43a4d61a1abf58d4d0c2fcb104f897919356d 100644
--- a/src/OCE/TDE/tide.h90
+++ b/src/OCE/TDE/tide.h90
@@ -1,4 +1,4 @@
-   !!=====================================================================
+!!=====================================================================
    !!                  ***  Include file tide.h90  ***
    !!======================================================================
    !! History :  3.2  !  2007  (O. Le Galloudec)  Original code
diff --git a/src/OCE/TRA/eosbn2.F90 b/src/OCE/TRA/eosbn2.F90
index 1c461517e7ddc65b16ca2e32bd40f6a18d789361..e13b4c933c489690888c2db1f391b0ab41f5d3f8 100644
--- a/src/OCE/TRA/eosbn2.F90
+++ b/src/OCE/TRA/eosbn2.F90
@@ -178,6 +178,7 @@ MODULE eosbn2
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -188,7 +189,7 @@ CONTAINS
 
    SUBROUTINE eos_insitu( pts, prd, pdep )
       !!
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
       !                                                      ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd   ! in situ density            [-]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep  ! depth                      [m]
@@ -231,14 +232,16 @@ CONTAINS
       !!                TEOS-10 Manual, 2010
       !!----------------------------------------------------------------------
       INTEGER                                 , INTENT(in   ) ::   ktts, ktrd, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
+      REAL(dp), DIMENSION(A2D_T(ktts) ,JPK,JPTS), INTENT(in   ) ::   pts   ! 1 : potential temperature  [Celsius]
       !                                                                  ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(A2D_T(ktrd) ,JPK     ), INTENT(  out) ::   prd   ! in situ density            [-]
       REAL(wp), DIMENSION(A2D_T(ktdep),JPK     ), INTENT(in   ) ::   pdep  ! depth                      [m]
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
-      REAL(wp) ::   zt , zh , zs , ztm        ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3   !   -      -
+      REAL(wp)  :: zt, zh, ztm! local scalars
+      REAL(dp)  :: zs! local scalars
+      REAL(wp)  :: zn1, zn2!   -      -
+      REAL(dp)  :: zn, zn0, zn3!   -      -
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('eos-insitu')
@@ -298,7 +301,7 @@ CONTAINS
          !
       END SELECT
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-insitu  : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(prd), clinfo1=' eos-insitu  : ' )
       !
       IF( ln_timing )   CALL timing_stop('eos-insitu')
       !
@@ -307,10 +310,10 @@ CONTAINS
 
    SUBROUTINE eos_insitu_pot( pts, prd, prhop, pdep )
       !!
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
       !                                                       ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prd    ! in situ density            [-]
-      REAL(wp), DIMENSION(:,:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      REAL(dp), DIMENSION(:,:,:)  , INTENT(  out) ::   prhop  ! potential density (surface referenced)
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pdep   ! depth                      [m]
       !!
       CALL eos_insitu_pot_t( pts, is_tile(pts), prd, is_tile(prd), prhop, is_tile(prhop), pdep, is_tile(pdep) )
@@ -331,16 +334,18 @@ CONTAINS
       !!
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) ::   ktts, ktrd, ktrhop, ktdep
-      REAL(wp), DIMENSION(A2D_T(ktts)  ,JPK,JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
+      REAL(dp), DIMENSION(A2D_T(ktts)  ,JPK,JPTS), INTENT(in   ) ::   pts    ! 1 : potential temperature  [Celsius]
       !                                                                    ! 2 : salinity               [psu]
       REAL(wp), DIMENSION(A2D_T(ktrd)  ,JPK     ), INTENT(  out) ::   prd    ! in situ density            [-]
-      REAL(wp), DIMENSION(A2D_T(ktrhop),JPK     ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
+      REAL(dp), DIMENSION(A2D_T(ktrhop),JPK     ), INTENT(  out) ::   prhop  ! potential density (surface referenced)
       REAL(wp), DIMENSION(A2D_T(ktdep) ,JPK     ), INTENT(in   ) ::   pdep   ! depth                      [m]
       !
       INTEGER  ::   ji, jj, jk, jsmp             ! dummy loop indices
       INTEGER  ::   jdof
-      REAL(wp) ::   zt , zh , zstemp, zs , ztm   ! local scalars
-      REAL(wp) ::   zn , zn0, zn1, zn2, zn3      !   -      -
+      REAL(wp)  :: zt, zh, zstemp, ztm! local scalars
+      REAL(dp)  :: zs! local scalars
+      REAL(wp)  :: zn1, zn2, zn3!   -      -
+      REAL(dp)  :: zn, zn0!   -      -
       REAL(wp), DIMENSION(:), ALLOCATABLE :: zn0_sto, zn_sto, zsign    ! local vectors
       !!----------------------------------------------------------------------
       !
@@ -466,7 +471,7 @@ CONTAINS
          !
       END SELECT
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=prd, clinfo1=' eos-pot: ', tab3d_2=prhop, clinfo2=' pot : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(prd), clinfo1=' eos-pot: ', tab3d_2=prhop, clinfo2=' pot : ' )
       !
       IF( ln_timing )   CALL timing_stop('eos-pot')
       !
@@ -565,7 +570,7 @@ CONTAINS
          !
       END SELECT
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prd, clinfo1=' eos2d: ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=CASTDP(prd), clinfo1=' eos2d: ' )
       !
       IF( ln_timing )   CALL timing_stop('eos2d')
       !
@@ -647,9 +652,9 @@ CONTAINS
          END_2D
          !
       END SELECT
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prhop, clinfo1=' pot: ', kdim=1 )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=CASTDP(prhop), clinfo1=' pot: ', kdim=1 )
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=prhop, clinfo1=' eos-pot: ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=CASTDP(prhop), clinfo1=' eos-pot: ' )
       !
       IF( ln_timing )   CALL timing_stop('eos-pot')
       !
@@ -659,7 +664,7 @@ CONTAINS
    SUBROUTINE rab_3d( pts, pab, Kmm )
       !!
       INTEGER                     , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! pot. temperature & salinity
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pts   ! pot. temperature & salinity
       REAL(wp), DIMENSION(:,:,:,:), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
       !!
       CALL rab_3d_t( pts, is_tile(pts), pab, is_tile(pab), Kmm )
@@ -678,7 +683,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                , INTENT(in   ) ::   Kmm   ! time level index
       INTEGER                                , INTENT(in   ) ::   ktts, ktab
-      REAL(wp), DIMENSION(A2D_T(ktts),JPK,JPTS), INTENT(in   ) ::   pts   ! pot. temperature & salinity
+      REAL(dp), DIMENSION(A2D_T(ktts),JPK,JPTS), INTENT(in   ) ::   pts   ! pot. temperature & salinity
       REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(  out) ::   pab   ! thermal/haline expansion ratio
       !
       INTEGER  ::   ji, jj, jk                ! dummy loop indices
@@ -765,8 +770,8 @@ CONTAINS
          !
       END SELECT
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pab(:,:,:,jp_tem), clinfo1=' rab_3d_t: ', &
-         &                                  tab3d_2=pab(:,:,:,jp_sal), clinfo2=' rab_3d_s : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(pab(:,:,:,jp_tem)), clinfo1=' rab_3d_t: ', &
+         &                                  tab3d_2=CASTDP(pab(:,:,:,jp_sal)), clinfo2=' rab_3d_s : ' )
       !
       IF( ln_timing )   CALL timing_stop('rab_3d')
       !
@@ -884,8 +889,8 @@ CONTAINS
          !
       END SELECT
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pab(:,:,jp_tem), clinfo1=' rab_2d_t: ', &
-         &                                  tab2d_2=pab(:,:,jp_sal), clinfo2=' rab_2d_s : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=CASTDP(pab(:,:,jp_tem)), clinfo1=' rab_2d_t: ', &
+         &                                  tab2d_2=CASTDP(pab(:,:,jp_sal)), clinfo2=' rab_2d_s : ' )
       !
       IF( ln_timing )   CALL timing_stop('rab_2d')
       !
@@ -992,7 +997,7 @@ CONTAINS
    SUBROUTINE bn2( pts, pab, pn2, Kmm )
       !!
       INTEGER                              , INTENT(in   ) ::  Kmm   ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
       REAL(wp), DIMENSION(:,:,:,:)         , INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
       REAL(wp), DIMENSION(:,:,:)           , INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
       !!
@@ -1016,7 +1021,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                , INTENT(in   ) ::  Kmm   ! time level index
       INTEGER                                , INTENT(in   ) ::  ktab, ktn2
-      REAL(wp), DIMENSION(jpi,jpj,  jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
+      REAL(dp), DIMENSION(jpi,jpj,  jpk,jpts), INTENT(in   ) ::  pts   ! pot. temperature and salinity   [Celsius,psu]
       REAL(wp), DIMENSION(A2D_T(ktab),JPK,JPTS), INTENT(in   ) ::  pab   ! thermal/haline expansion coef.  [Celsius-1,psu-1]
       REAL(wp), DIMENSION(A2D_T(ktn2),JPK     ), INTENT(  out) ::  pn2   ! Brunt-Vaisala frequency squared [1/s^2]
       !
@@ -1038,7 +1043,7 @@ CONTAINS
             &            / e3w(ji,jj,jk,Kmm) * wmask(ji,jj,jk)
       END_3D
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pn2, clinfo1=' bn2  : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=CASTDP(pn2), clinfo1=' bn2  : ' )
       !
       IF( ln_timing )   CALL timing_stop('bn2')
       !
@@ -1105,7 +1110,7 @@ CONTAINS
    SUBROUTINE eos_fzp_2d( psal, ptf, pdep )
       !!
       REAL(wp), DIMENSION(jpi,jpj), INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(dp), DIMENSION(jpi,jpj), INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
       REAL(wp), DIMENSION(:,:)    , INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
       !!
       CALL eos_fzp_2d_t( psal, ptf, is_tile(ptf), pdep )
@@ -1126,7 +1131,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                       , INTENT(in   )           ::   kttf
       REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   )           ::   psal   ! salinity   [psu]
-      REAL(wp), DIMENSION(jpi,jpj)  , INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
+      REAL(dp), DIMENSION(jpi,jpj)  , INTENT(in   ), OPTIONAL ::   pdep   ! depth      [m]
       REAL(wp), DIMENSION(A2D_T(kttf)), INTENT(out  )           ::   ptf    ! freezing temperature [Celsius]
       !
       INTEGER  ::   ji, jj          ! dummy loop indices
@@ -1230,7 +1235,7 @@ CONTAINS
       !!                    pab_pe(:,:,:,jp_sal) is beta_pe
       !!----------------------------------------------------------------------
       INTEGER                              , INTENT(in   ) ::   Kmm   ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts     ! pot. temperature & salinity
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) ::   pts     ! pot. temperature & salinity
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pab_pe  ! alpha_pe and beta_pe
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   ppen     ! potential energy anomaly
       !
diff --git a/src/OCE/TRA/traadv.F90 b/src/OCE/TRA/traadv.F90
index aa9d4de26a5624edcc030029f14838f984b2312a..2c6dcdd099802f3c639dff4c5d167446a84a70b9 100644
--- a/src/OCE/TRA/traadv.F90
+++ b/src/OCE/TRA/traadv.F90
@@ -69,6 +69,7 @@ MODULE traadv
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -87,11 +88,12 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: kt             ! ocean time-step index
       INTEGER                                  , INTENT(in)    :: Kbb, Kmm, Krhs ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers and RHS of tracer equation
       !
       INTEGER ::   ji, jj, jk   ! dummy loop index
       ! TEMP: [tiling] This change not necessary and can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zuu, zvv, zww   ! 3D workspace
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zuu, zww   ! 3D workspace
+      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE, SAVE :: zvv
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ztrdt, ztrds
       ! TEMP: [tiling] This change not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       LOGICAL :: lskip
@@ -143,7 +145,7 @@ CONTAINS
          !
          DO_2D_OVR( nn_hls, nn_hls-1, nn_hls, nn_hls-1 )
             zuu(ji,jj,jpk) = 0._wp                                                      ! no transport trough the bottom
-            zvv(ji,jj,jpk) = 0._wp
+            zvv(ji,jj,jpk) = 0._dp
             zww(ji,jj,jpk) = 0._wp
          END_2D
          !
@@ -161,7 +163,7 @@ CONTAINS
          !
 !!gm ???
          ! TEMP: [tiling] This copy-in not necessary after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
-         CALL dia_ptr( kt, Kmm, zvv(A2D(nn_hls),:) )                                    ! diagnose the effective MSF
+         CALL dia_ptr( kt, Kmm, CASTSP(zvv(A2D(nn_hls),:)) )                                    ! diagnose the effective MSF
 !!gm ???
          !
 
@@ -174,15 +176,15 @@ CONTAINS
          SELECT CASE ( nadv )                      !==  compute advection trend and add it to general trend  ==!
          !
          CASE ( np_CEN )                                 ! Centered scheme : 2nd / 4th order
-            CALL tra_adv_cen    ( kt, nit000, 'TRA',      zuu, zvv, zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v      )
+            CALL tra_adv_cen    ( kt, nit000, 'TRA',      zuu, CASTSP(zvv), zww, Kmm, pts, jpts, Krhs, nn_cen_h, nn_cen_v      )
          CASE ( np_FCT )                                 ! FCT scheme      : 2nd / 4th order
-               CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v )
+               CALL tra_adv_fct ( kt, nit000, 'TRA', rDt, zuu, CASTSP(zvv), zww, Kbb, Kmm, pts, jpts, Krhs, nn_fct_h, nn_fct_v )
          CASE ( np_MUS )                                 ! MUSCL
-                CALL tra_adv_mus( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups         )
+                CALL tra_adv_mus( kt, nit000, 'TRA', rDt, zuu, CASTSP(zvv), zww, Kbb, Kmm, pts, jpts, Krhs, ln_mus_ups         )
          CASE ( np_UBS )                                 ! UBS
-            CALL tra_adv_ubs    ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v           )
+            CALL tra_adv_ubs    ( kt, nit000, 'TRA', rDt, zuu, CASTSP(zvv), zww, Kbb, Kmm, pts, jpts, Krhs, nn_ubs_v           )
          CASE ( np_QCK )                                 ! QUICKEST
-            CALL tra_adv_qck    ( kt, nit000, 'TRA', rDt, zuu, zvv, zww, Kbb, Kmm, pts, jpts, Krhs                     )
+            CALL tra_adv_qck    ( kt, nit000, 'TRA', rDt, zuu, CASTSP(zvv), zww, Kbb, Kmm, pts, jpts, Krhs                     )
          !
          END SELECT
          !
diff --git a/src/OCE/TRA/traadv_cen.F90 b/src/OCE/TRA/traadv_cen.F90
index 8f42bb87a14d2bb9654b8182b85900260358679e..c17aeffccff9f2129873181d8b4826ec22abc86c 100644
--- a/src/OCE/TRA/traadv_cen.F90
+++ b/src/OCE/TRA/traadv_cen.F90
@@ -75,7 +75,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kn_cen_v        ! =2/4 (2nd or 4th order scheme)
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       INTEGER  ::   ierr             ! local integer
diff --git a/src/OCE/TRA/traadv_cen_lf.F90 b/src/OCE/TRA/traadv_cen_lf.F90
index 6d1f08fb9aaafc6fbc9f7f6c7077d1328c9b958f..17d86953031b819706834d4a851d01ea0e2f7664 100644
--- a/src/OCE/TRA/traadv_cen_lf.F90
+++ b/src/OCE/TRA/traadv_cen_lf.F90
@@ -36,6 +36,7 @@ MODULE traadv_cen_lf
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -142,7 +143,7 @@ CONTAINS
             END_3D
             !
          CASE(  4  )                         !* 4th order compact
-            CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw )      ! ztw = interpolated value of T at w-point
+            CALL interp_4th_cpt( CASTDP(pt(:,:,:,jn,Kmm)) , ztw )      ! ztw = interpolated value of T at w-point
             DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                zwz(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)
             END_3D
@@ -170,9 +171,9 @@ CONTAINS
          END_3D
          !                               ! trend diagnostics
          IF( l_trd ) THEN
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) )
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) )
-            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) )
+            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, CASTDP(pt(:,:,:,jn,Kmm)) )
+            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, CASTDP(pt(:,:,:,jn,Kmm)) )
+            CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, CASTDP(pt(:,:,:,jn,Kmm)) )
          ENDIF
          !                                 ! "Poleward" heat and salt transports
          IF( l_ptr )   CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
diff --git a/src/OCE/TRA/traadv_fct.F90 b/src/OCE/TRA/traadv_fct.F90
index bfc80b893c91c2349d8ae39911195b062df5c6cb..44daa0aae0aa5e98b84dd0416c3b9d7a27f9c57f 100644
--- a/src/OCE/TRA/traadv_fct.F90
+++ b/src/OCE/TRA/traadv_fct.F90
@@ -80,13 +80,14 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn                           ! dummy loop indices
       REAL(wp) ::   ztra                                     ! local scalar
       REAL(wp) ::   zfp_ui, zfp_vj, zfp_wk, zC2t_u, zC4t_u   !   -      -
       REAL(wp) ::   zfm_ui, zfm_vj, zfm_wk, zC2t_v, zC4t_v   !   -      -
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk)        ::   zwi, zwx, zwy, zwz, ztu, ztv, zltu, zltv, ztw
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)         :: zwi, zwz, ztu, ztv, zltu, zltv, ztw
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)         :: zwx, zwy
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdx, ztrdy, ztrdz, zptry
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   zwinf, zwdia, zwsup
       LOGICAL  ::   ll_zAimp                                 ! flag to apply adaptive implicit vertical advection
@@ -274,7 +275,7 @@ CONTAINS
                zwx(ji,jj,jk) =  0.5_wp * pU(ji,jj,jk) * zC4t_u - zwx(ji,jj,jk)
                zwy(ji,jj,jk) =  0.5_wp * pV(ji,jj,jk) * zC4t_v - zwy(ji,jj,jk)
             END_3D
-            IF (nn_hls==2) CALL lbc_lnk( 'traadv_fct', zwx, 'U', -1.0_wp , zwy, 'V', -1.0_wp )   ! Lateral boundary cond. (unchanged sgn)
+            IF (nn_hls==2) CALL lbc_lnk( 'traadv_fct', zwx, 'U', -1.0_dp , zwy, 'V', -1.0_dp )   ! Lateral boundary cond. (unchanged sgn)
             !
          END SELECT
          !
@@ -298,7 +299,8 @@ CONTAINS
          ENDIF
          !
          IF (nn_hls==1) THEN
-            CALL lbc_lnk( 'traadv_fct', zwi, 'T', 1.0_wp, zwx, 'U', -1.0_wp , zwy, 'V', -1.0_wp, zwz, 'T', 1.0_wp )
+            CALL lbc_lnk( 'traadv_fct', zwx, 'U', -1.0_dp , zwy, 'V', -1.0_dp)
+            CALL lbc_lnk( 'traadv_fct', zwi, 'T', 1.0_wp , zwz, 'T', 1.0_wp )
          ELSE
             CALL lbc_lnk( 'traadv_fct', zwi, 'T', 1.0_wp)
          END IF
@@ -399,9 +401,10 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   Kmm             ! time level index
       REAL(wp)                        , INTENT(in   ) ::   p2dt            ! tracer time-step
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pbef            ! before field
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pbef            ! before field
       REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(in   ) ::   paft            ! after field
-      REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(inout) ::   paa, pbb, pcc   ! monotonic fluxes in the 3 directions
+      REAL(wp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(inout)  :: pcc! monotonic fluxes in the 3 directions
+      REAL(dp), DIMENSION(A2D(nn_hls)    ,jpk), INTENT(inout)  :: paa, pbb! monotonic fluxes in the 3 directions
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikm1         ! local integer
@@ -551,7 +554,7 @@ CONTAINS
       !!
       !! **  Method  :   4th order compact interpolation
       !!----------------------------------------------------------------------
-      REAL(wp),DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt_in    ! field at t-point
+      REAL(dp),DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt_in    ! field at t-point
       REAL(wp),DIMENSION(A2D(nn_hls)    ,jpk), INTENT(  out) ::   pt_out   ! field interpolated at w-point
       !
       INTEGER ::   ji, jj, jk   ! dummy loop integers
@@ -641,7 +644,7 @@ CONTAINS
       !!        The solution is pta.
       !!        The 3d array zwt is used as a work space array.
       !!----------------------------------------------------------------------
-      REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pD, pU, PL    ! 3-diagonal matrix
+      REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pD, pU, pL    ! 3-diagonal matrix
       REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pRHS          ! Right-Hand-Side
       REAL(wp),DIMENSION(A2D(nn_hls),jpk), INTENT(  out) ::   pt_out        !!gm field at level=F(klev)
       INTEGER                    , INTENT(in   ) ::   klev          ! =1 pt_out at w-level
diff --git a/src/OCE/TRA/traadv_mus.F90 b/src/OCE/TRA/traadv_mus.F90
index 42db0c909605ab3e3ec5301eda94fdd2bdf606fb..13b1c2d21ec87722f99c559543d3cebe35d56c00 100644
--- a/src/OCE/TRA/traadv_mus.F90
+++ b/src/OCE/TRA/traadv_mus.F90
@@ -82,7 +82,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume flux components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       INTEGER  ::   ierr             ! local integer
diff --git a/src/OCE/TRA/traadv_qck.F90 b/src/OCE/TRA/traadv_qck.F90
index cdb96902b43fea6bb976a8b0f55b4b4cad5bb74a..7282d60159992463ffa352e933120ff659d9f3fc 100644
--- a/src/OCE/TRA/traadv_qck.F90
+++ b/src/OCE/TRA/traadv_qck.F90
@@ -95,7 +95,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !!----------------------------------------------------------------------
       !
 #if defined key_loop_fusion
@@ -137,7 +137,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU        ! i-velocity components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztra, zbtr, zdir, zdx, zmsk   ! local scalars
@@ -222,7 +222,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pV        ! j-velocity components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !!
       INTEGER  :: ji, jj, jk, jn                ! dummy loop indices
       REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk   ! local scalars
@@ -318,7 +318,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pW      ! vertical velocity
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwz   ! 3D workspace
diff --git a/src/OCE/TRA/traadv_qck_lf.F90 b/src/OCE/TRA/traadv_qck_lf.F90
index e866bd80944f4aef98bc4cafd829acda452d085e..ad15ccc31556f3270e7b4618aeb08e63db660123 100644
--- a/src/OCE/TRA/traadv_qck_lf.F90
+++ b/src/OCE/TRA/traadv_qck_lf.F90
@@ -40,6 +40,7 @@ MODULE traadv_qck_lf
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -188,7 +189,7 @@ CONTAINS
             pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra
          END_3D
          !                                 ! trend diagnostics
-         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) )
+         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, CASTDP(pt(:,:,:,jn,Kmm)) )
          !
       END DO
       !
@@ -266,7 +267,7 @@ CONTAINS
             pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra
          END_3D
          !                                 ! trend diagnostics
-         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) )
+         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, CASTDP(pt(:,:,:,jn,Kmm)) )
          !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes)
          IF( l_ptr )   CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
          !
@@ -318,7 +319,7 @@ CONTAINS
                &                                * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
          END_3D
          !                                 ! Send trends for diagnostic
-         IF( l_trd )  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) )
+         IF( l_trd )  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, CASTDP(pt(:,:,:,jn,Kmm)) )
          !
       END DO
       !
diff --git a/src/OCE/TRA/traadv_ubs.F90 b/src/OCE/TRA/traadv_ubs.F90
index 6a254d775c23c7277794f72b0553d4bbf93c1f4f..b834ca4890f64573c61a27a01cc0ddf3823c9bd9 100644
--- a/src/OCE/TRA/traadv_ubs.F90
+++ b/src/OCE/TRA/traadv_ubs.F90
@@ -96,7 +96,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
       ! TEMP: [tiling] This can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztra, zbtr, zcoef                       ! local scalars
@@ -284,7 +284,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER , INTENT(in   )                         ::   Kmm    ! time level index
       REAL(wp), INTENT(in   )                         ::   p2dt   ! tracer time-step
-      REAL(wp),                DIMENSION(jpi,jpj,jpk) ::   pbef   ! before field
+      REAL(dp),                DIMENSION(jpi,jpj,jpk) ::   pbef   ! before field
       REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   paft   ! after field
       REAL(wp), INTENT(inout), DIMENSION(A2D(nn_hls)    ,jpk) ::   pcc    ! monotonic flux in the k direction
       !
diff --git a/src/OCE/TRA/traadv_ubs_lf.F90 b/src/OCE/TRA/traadv_ubs_lf.F90
index 034512641488d99d8ebf4e78638b1ca792941a84..a7908e1ae76b1b381b78329b7bdc7ac7a3a0d323 100644
--- a/src/OCE/TRA/traadv_ubs_lf.F90
+++ b/src/OCE/TRA/traadv_ubs_lf.F90
@@ -38,6 +38,7 @@ MODULE traadv_ubs_lf
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -185,8 +186,8 @@ CONTAINS
          END_3D                                                     ! and/or in trend diagnostic (l_trd=T)
          !
          IF( l_trd ) THEN                  ! trend diagnostics
-             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztu, pU, pt(:,:,:,jn,Kmm) )
-             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztv, pV, pt(:,:,:,jn,Kmm) )
+             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, ztu, pU, CASTDP(pt(:,:,:,jn,Kmm)) )
+             CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, ztv, pV, CASTDP(pt(:,:,:,jn,Kmm)) )
          END IF
          !
          !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes)
@@ -243,7 +244,7 @@ CONTAINS
             CALL nonosc_z( Kmm, pt(:,:,:,jn,Kbb), ztw, zti, p2dt )      !  monotonicity algorithm
             !
          CASE(  4  )                               ! 4th order COMPACT
-            CALL interp_4th_cpt( pt(:,:,:,jn,Kmm) , ztw )         ! 4th order compact interpolation of T at w-point
+            CALL interp_4th_cpt( CASTDP(pt(:,:,:,jn,Kmm)) , ztw )         ! 4th order compact interpolation of T at w-point
             DO_3D( 0, 0, 0, 0, 2, jpkm1 )
                ztw(ji,jj,jk) = pW(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)
             END_3D
diff --git a/src/OCE/TRA/traatf.F90 b/src/OCE/TRA/traatf.F90
index 12b280fc30b53bdbc1894691411ee1600aeb2359..a0e04e5af85f6177d69c798b108121cf80e319f5 100644
--- a/src/OCE/TRA/traatf.F90
+++ b/src/OCE/TRA/traatf.F90
@@ -88,7 +88,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) :: kt             ! ocean time-step index
       INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Kaa  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
       !!
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   zfact            ! local scalars
@@ -109,7 +109,7 @@ CONTAINS
       CALL Agrif_tra                     ! AGRIF zoom boundaries
 #endif
       !                                              ! local domain boundaries  (T-point, unchanged sign)
-      CALL lbc_lnk( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1.0_wp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_wp )
+      CALL lbc_lnk( 'traatf', pts(:,:,:,jp_tem,Kaa), 'T', 1.0_dp, pts(:,:,:,jp_sal,Kaa), 'T', 1.0_dp )
       !
       IF( ln_bdy )   CALL bdy_tra( kt, Kbb, pts, Kaa )  ! BDY open boundaries
 
@@ -155,7 +155,7 @@ CONTAINS
          ELSE                   ;   CALL tra_atf_vvl( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface
          ENDIF
          !
-         CALL lbc_lnk( 'traatf',  pts(:,:,:,jp_tem,Kmm) , 'T', 1.0_wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1.0_wp )
+         CALL lbc_lnk( 'traatf',  pts(:,:,:,jp_tem,Kmm) , 'T', 1.0_dp, pts(:,:,:,jp_sal,Kmm) , 'T', 1.0_dp )
 
       ENDIF
       !
@@ -193,7 +193,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::  kit000        ! first time step index
       CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype        ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::  kjpt          ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztn, ztd         ! local scalars
@@ -237,7 +237,7 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::  p2dt      ! time-step
       CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::  kjpt      ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
       REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
       REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
       !
diff --git a/src/OCE/TRA/traatf_qco.F90 b/src/OCE/TRA/traatf_qco.F90
index 2b6333683a4ccaf96d8c006f72317ea5b8257eef..0235627957e2e3870cb67f001f2bc4812bfa2245 100644
--- a/src/OCE/TRA/traatf_qco.F90
+++ b/src/OCE/TRA/traatf_qco.F90
@@ -85,10 +85,10 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) :: kt             ! ocean time-step index
       INTEGER                                  , INTENT(in   ) :: Kbb, Kmm, Kaa  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts            ! active tracers
       !!
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp) ::   zfact            ! local scalars
+      REAL(dp) ::   zfact            ! local scalars
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
       !!----------------------------------------------------------------------
       !
@@ -145,7 +145,7 @@ CONTAINS
          ELSE                    ;   CALL tra_atf_qco_lf( kt, Kbb, Kmm, Kaa, nit000, rn_Dt, 'TRA', pts, sbc_tsc, sbc_tsc_b, jpts )  ! non-linear free surface
          ENDIF
          !
-         CALL lbc_lnk( 'traatfqco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._wp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._wp )
+         CALL lbc_lnk( 'traatfqco', pts(:,:,:,jp_tem,Kmm) , 'T', 1._dp, pts(:,:,:,jp_sal,Kmm) , 'T', 1._dp )
          !
       ENDIF
       !
@@ -183,7 +183,7 @@ CONTAINS
       INTEGER                                  , INTENT(in   ) ::  kit000        ! first time step index
       CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype        ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::  kjpt          ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt            ! tracer fields
       !
       INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
       REAL(wp) ::   ztn, ztd         ! local scalars
@@ -227,14 +227,14 @@ CONTAINS
       REAL(wp)                                 , INTENT(in   ) ::  p2dt      ! time-step
       CHARACTER(len=3)                         , INTENT(in   ) ::  cdtype    ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::  kjpt      ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::  pt        ! tracer fields
       REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc   ! surface tracer content
       REAL(wp), DIMENSION(jpi,jpj    ,kjpt)    , INTENT(in   ) ::  psbc_tc_b ! before surface tracer content
       !
       LOGICAL  ::   ll_traqsr, ll_rnf, ll_isf   ! local logical
       INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices
-      REAL(wp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar
-      REAL(wp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f                  !   -      -
+      REAL(dp) ::   zfact, zfact1, ztc_a , ztc_n , ztc_b , ztc_f , ztc_d    ! local scalar
+      REAL(dp) ::   zfact2, ze3t_b, ze3t_n, ze3t_a, ze3t_f                  !   -      -
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ztrd_atf
       !!----------------------------------------------------------------------
       !
diff --git a/src/OCE/TRA/trabbc.F90 b/src/OCE/TRA/trabbc.F90
index 7e2372b1e674841d138078d45953027843bc3c8d..12d2091a4f754aa8c99ca02579bc4e3482d34c66 100644
--- a/src/OCE/TRA/trabbc.F90
+++ b/src/OCE/TRA/trabbc.F90
@@ -77,7 +77,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt         ! ocean time-step index
       INTEGER,                                   INTENT(in   ) :: Kmm, Krhs  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts        ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts        ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk    ! dummy loop indices
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt   ! 3D workspace
@@ -104,7 +104,7 @@ CONTAINS
       CALL iom_put ( "hfgeou" , rho0_rcp * qgh_trd0(:,:) )
 
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' bbc  - Ta: ', mask1=tmask, clinfo3='tra-ta' )
-      !
+      
       IF( ln_timing )   CALL timing_stop('tra_bbc')
       !
    END SUBROUTINE tra_bbc
diff --git a/src/OCE/TRA/trabbl.F90 b/src/OCE/TRA/trabbl.F90
index 71ccf284170581efed99358325d0bde8b8b35987..f8afe449b0148200e8e5cc4a6bdcabea7c0d005d 100644
--- a/src/OCE/TRA/trabbl.F90
+++ b/src/OCE/TRA/trabbl.F90
@@ -101,7 +101,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step
       INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk   ! Dummy loop indices
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
@@ -172,8 +172,8 @@ CONTAINS
       !!              Campin, J.-M., and H. Goosse, 1999, Tellus, 412-430.
       !!----------------------------------------------------------------------
       INTEGER                              , INTENT(in   ) ::   kjpt   ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt     ! before and now tracer fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt     ! before and now tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs ! tracer trend
       INTEGER                              , INTENT(in   ) ::   Kmm    ! time level indices
       !
       INTEGER  ::   ji, jj, jn   ! dummy loop indices
@@ -221,8 +221,8 @@ CONTAINS
       !!              Campin, J.-M., and H. Goosse, 1999, Tellus, 412-430.
       !!----------------------------------------------------------------------
       INTEGER                              , INTENT(in   ) ::   kjpt   ! number of tracers
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt     ! before and now tracer fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt     ! before and now tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs ! tracer trend
       INTEGER                              , INTENT(in   ) ::   Kmm    ! time level indices
       !
       INTEGER  ::   ji, jj, jk, jn           ! dummy loop indices
diff --git a/src/OCE/TRA/tradmp.F90 b/src/OCE/TRA/tradmp.F90
index 16cab127eece4aed8c9dd7378ce67a2090acccc2..67760bfe1a4236f4f08cf6cf40ee5a109ab73374 100644
--- a/src/OCE/TRA/tradmp.F90
+++ b/src/OCE/TRA/tradmp.F90
@@ -91,10 +91,10 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index
       INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !
       INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,jpts)     ::  zts_dta
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk,jpts)     ::  zts_dta
       REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE ::  zwrk
       REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::  ztrdts
       !!----------------------------------------------------------------------
diff --git a/src/OCE/TRA/traisf.F90 b/src/OCE/TRA/traisf.F90
index 0abba863ee67267e6a598be8ecca360c4a6c4304..bb276fcaef7bf5e43daa796e227ea635fe78aa35 100644
--- a/src/OCE/TRA/traisf.F90
+++ b/src/OCE/TRA/traisf.F90
@@ -41,7 +41,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) :: kt        ! ocean time step
       INTEGER                                  , INTENT(in   ) :: Kmm, Krhs ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
       !!----------------------------------------------------------------------
       !
       IF( ln_timing )   CALL timing_start('tra_isf')
@@ -97,7 +97,7 @@ CONTAINS
       !! *** Action :: Update pts(:,:,:,:,Krhs) with the surface boundary condition trend
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) :: pts
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) :: pts
       !!----------------------------------------------------------------------
       INTEGER , DIMENSION(jpi,jpj)     , INTENT(in   ) :: ktop , kbot
       REAL(wp), DIMENSION(jpi,jpj)     , INTENT(in   ) :: phtbl, pfrac
@@ -138,7 +138,7 @@ CONTAINS
       !! *** Action :: Update pts(:,:,:,:,Krhs) with the ice shelf coupling trend
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) :: ptsa
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(inout) :: ptsa
       !!----------------------------------------------------------------------
       INTEGER                              , INTENT(in   ) :: Kmm   ! ocean time level index
       REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(in   ) :: ptsc
diff --git a/src/OCE/TRA/traldf.F90 b/src/OCE/TRA/traldf.F90
index fc22984261f8e975db9c86a92e92d20bb83d0227..c8cfa4cd6d71c4c32c9dc30ced07e58ab4f5eca5 100644
--- a/src/OCE/TRA/traldf.F90
+++ b/src/OCE/TRA/traldf.F90
@@ -52,7 +52,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index
       INTEGER,                                   INTENT(in   ) :: Kbb, Kmm, Krhs  ! ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !!
       REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdt, ztrds
       !!----------------------------------------------------------------------
diff --git a/src/OCE/TRA/traldf_iso.F90 b/src/OCE/TRA/traldf_iso.F90
index d91b67eab805faab7f06fe9c63b44dd843c46945..36e5f9dcdb8576313ac488231508277d52ca5acd 100644
--- a/src/OCE/TRA/traldf_iso.F90
+++ b/src/OCE/TRA/traldf_iso.F90
@@ -62,9 +62,9 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
       !!
       CALL tra_ldf_iso_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                             &
          &                                         pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui),  &
@@ -125,9 +125,9 @@ CONTAINS
       REAL(wp), DIMENSION(A2D_T(ktah)   ,JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(A2D_T(ktg)        ,KJPT), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(A2D_T(ktgi)       ,KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt)    ,JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt2)   ,JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(A2D_T(ktt)    ,JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
+      REAL(dp), DIMENSION(A2D_T(ktt2)   ,JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
+      REAL(dp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
       !
       INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices
       INTEGER  ::  ikt
diff --git a/src/OCE/TRA/traldf_lap_blp.F90 b/src/OCE/TRA/traldf_lap_blp.F90
index 16e5df16cdfb7ca8c542f8fc40d6061a84979c13..176b52209693aa8d4b42d2de9da423bcddc84763 100644
--- a/src/OCE/TRA/traldf_lap_blp.F90
+++ b/src/OCE/TRA/traldf_lap_blp.F90
@@ -59,8 +59,8 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! before tracer fields
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! before tracer fields
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
       !!
       CALL tra_ldf_lap_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                            &
       &                                            pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui), &
@@ -98,8 +98,8 @@ CONTAINS
       REAL(wp), DIMENSION(A2D_T(ktah),   JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(A2D_T(ktg),        KJPT), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(A2D_T(ktgi),       KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! before tracer fields
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! before tracer fields
+      REAL(dp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
       !
       INTEGER  ::   ji, jj, jk, jn      ! dummy loop indices
       INTEGER  ::   iij
@@ -205,11 +205,11 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(jpi,jpj    ,kjpt), INTENT(in   ) ::   pgu, pgv   ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(jpi,jpj,    kjpt), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top levels
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt         ! before and now tracer fields
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   pt         ! before and now tracer fields
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pt_rhs     ! tracer trend
       !
       INTEGER ::   ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk,kjpt) :: zlap         ! laplacian at t-point
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk,kjpt) :: zlap         ! laplacian at t-point
       REAL(wp), DIMENSION(A2D(nn_hls),    kjpt) :: zglu, zglv   ! bottom GRADh of the laplacian (u- and v-points)
       REAL(wp), DIMENSION(A2D(nn_hls),    kjpt) :: zgui, zgvi   ! top    GRADh of the laplacian (u- and v-points)
       !!---------------------------------------------------------------------
@@ -238,7 +238,7 @@ CONTAINS
          CALL tra_ldf_triad( kt, Kmm, kit000, cdtype, pahu, pahv, pgu, pgv, pgui, pgvi, pt, pt, zlap, kjpt, 1 )
       END SELECT
       !
-      IF (nn_hls==1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_wp )     ! Lateral boundary conditions (unchanged sign)
+      IF (nn_hls==1) CALL lbc_lnk( 'traldf_lap_blp', zlap(:,:,:,:) , 'T', 1.0_dp )     ! Lateral boundary conditions (unchanged sign)
       !                                               ! Partial top/bottom cell: GRADh( zlap )
       IF( ln_isfcav .AND. ln_zps ) THEN   ;   CALL zps_hde_isf( kt, kjpt, zlap, zglu, zglv, zgui, zgvi )  ! both top & bottom
       ELSEIF(             ln_zps ) THEN   ;   CALL zps_hde    ( kt, kjpt, zlap, zglu, zglv )              ! only bottom
diff --git a/src/OCE/TRA/traldf_triad.F90 b/src/OCE/TRA/traldf_triad.F90
index 70eddec54f8399bc0e4531d1198843206aa64952..cb5c6cce5f8fba065557a3cb55f2343e008075b5 100644
--- a/src/OCE/TRA/traldf_triad.F90
+++ b/src/OCE/TRA/traldf_triad.F90
@@ -59,9 +59,9 @@ CONTAINS
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgu , pgv  ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt_rhs     ! tracer trend
       !!
       CALL tra_ldf_triad_t( kt, Kmm, kit000, cdtype, pahu, pahv, is_tile(pahu),                            &
       &                                              pgu , pgv , is_tile(pgu) , pgui, pgvi, is_tile(pgui), &
@@ -101,9 +101,9 @@ CONTAINS
       REAL(wp), DIMENSION(A2D_T(ktah),   JPK)     , INTENT(in   ) ::   pahu, pahv ! eddy diffusivity at u- and v-points  [m2/s]
       REAL(wp), DIMENSION(A2D_T(ktg),        KJPT), INTENT(in   ) ::   pgu , pgv  ! tracer gradient at pstep levels
       REAL(wp), DIMENSION(A2D_T(ktgi),       KJPT), INTENT(in   ) ::   pgui, pgvi ! tracer gradient at top   levels
-      REAL(wp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt2),   JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
-      REAL(wp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
+      REAL(dp), DIMENSION(A2D_T(ktt),    JPK,KJPT), INTENT(in   ) ::   pt         ! tracer (kpass=1) or laplacian of tracer (kpass=2)
+      REAL(dp), DIMENSION(A2D_T(ktt2),   JPK,KJPT), INTENT(in   ) ::   pt2        ! tracer (only used in kpass=2)
+      REAL(dp), DIMENSION(A2D_T(ktt_rhs),JPK,KJPT), INTENT(inout) ::   pt_rhs     ! tracer trend
       !
       INTEGER  ::  ji, jj, jk, jn, kp, iij   ! dummy loop indices
       REAL(wp) ::  zcoef0, ze3w_2, zsign          !   -      -
diff --git a/src/OCE/TRA/tramle.F90 b/src/OCE/TRA/tramle.F90
index a6f00b0bf72866c66e504760e7b3a4c00a1eae2e..8ad7587d17640fc01999c2016e466ad23f9752e9 100644
--- a/src/OCE/TRA/tramle.F90
+++ b/src/OCE/TRA/tramle.F90
@@ -88,7 +88,7 @@ CONTAINS
       CHARACTER(len=3)            , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
       ! TEMP: [tiling] Can be A2D(nn_hls) after all lbc_lnks removed in the nn_hls = 2 case in tra_adv_fct
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pu         ! in : 3 ocean transport components
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv         ! out: same 3  transport components
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pv         ! out: same 3  transport components
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pw         !   increased by the MLE induced transport
       !
       INTEGER  ::   ji, jj, jk          ! dummy loop indices
diff --git a/src/OCE/TRA/tranpc.F90 b/src/OCE/TRA/tranpc.F90
index d1e9c1c79a8fbac9dcf752eec9452eeb5ab1925a..33d0af1b12bff7be823d75bb1b9e3ceb3575777d 100644
--- a/src/OCE/TRA/tranpc.F90
+++ b/src/OCE/TRA/tranpc.F90
@@ -62,7 +62,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt              ! ocean time-step index
       INTEGER,                                   INTENT(in   ) :: Kmm, Krhs, Kaa  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts             ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   jiter, ikbot, ikp, ikup, ikdown, ilayer, ik_low   ! local integers
diff --git a/src/OCE/TRA/traqsr.F90 b/src/OCE/TRA/traqsr.F90
index 0bde7adce5679affb5d610bbf82171cc27ea23d9..397eb91c4444fc19a4c6fe38dfc0d4d0c18a85d5 100644
--- a/src/OCE/TRA/traqsr.F90
+++ b/src/OCE/TRA/traqsr.F90
@@ -104,7 +104,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) :: kt            ! ocean time-step
       INTEGER,                                   INTENT(in   ) :: Kmm, Krhs     ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts           ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts           ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk               ! dummy loop indices
       INTEGER  ::   irgb                     ! local integers
@@ -316,7 +316,7 @@ CONTAINS
       ENDIF
       !                       ! print mean trends (used for debugging)
       IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=pts(:,:,:,jp_tem,Krhs), clinfo1=' qsr  - Ta: ', mask1=tmask, clinfo3='tra-ta' )
-      !
+      
       IF( ln_timing )   CALL timing_stop('tra_qsr')
       !
    END SUBROUTINE tra_qsr
diff --git a/src/OCE/TRA/trasbc.F90 b/src/OCE/TRA/trasbc.F90
index 556be0c26a1818c375fd6a4893abfc5028e28be9..7fc57b704aee062a930fc335d386faa4aeede568 100644
--- a/src/OCE/TRA/trasbc.F90
+++ b/src/OCE/TRA/trasbc.F90
@@ -73,7 +73,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER,                                   INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER,                                   INTENT(in   ) ::   Kmm, Krhs  ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts        ! active tracers and RHS of tracer Eq.
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts        ! active tracers and RHS of tracer Eq.
       !
       INTEGER  ::   ji, jj, jk, jn               ! dummy loop indices
       INTEGER  ::   ikt, ikb                     ! local integers
diff --git a/src/OCE/TRA/trazdf.F90 b/src/OCE/TRA/trazdf.F90
index 8280d3181b6b2731e8616a0a24a938bd15b4d759..a376ad8d44bdbb4811ed4153593b168b11f34d33 100644
--- a/src/OCE/TRA/trazdf.F90
+++ b/src/OCE/TRA/trazdf.F90
@@ -54,7 +54,7 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: kt                  ! ocean time-step index
       INTEGER                                  , INTENT(in)    :: Kbb, Kmm, Krhs, Kaa ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts                 ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts                 ! active tracers and RHS of tracer equation
       !
       INTEGER  ::   ji, jj, jk   ! Dummy loop indices
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace
@@ -142,11 +142,13 @@ CONTAINS
       CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator)
       INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
       REAL(wp)                                 , INTENT(in   ) ::   p2dt     ! tracer time-step
-      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt       ! tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt       ! tracers and RHS of tracer equation
       !
       INTEGER  ::  ji, jj, jk, jn   ! dummy loop indices
-      REAL(wp) ::  zrhs, zzwi, zzws ! local scalars
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::  zwi, zwt, zwd, zws
+      REAL(wp)  :: zzwi, zzws! local scalars
+      REAL(dp)  :: zrhs! local scalars
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk)  :: zws
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk)  :: zwi, zwt, zwd
       !!---------------------------------------------------------------------
       !
       !                                               ! ============= !
diff --git a/src/OCE/TRA/zpshde.F90 b/src/OCE/TRA/zpshde.F90
index 0591067f9e804265264b6aae3adb49d98dbfa6eb..6a19742dfb15903af3d6c6ac9fc88eb97ddefe6e 100644
--- a/src/OCE/TRA/zpshde.F90
+++ b/src/OCE/TRA/zpshde.F90
@@ -44,7 +44,7 @@ CONTAINS
       !!
       INTEGER                     , INTENT(in   )           ::  kt          ! ocean time-step index
       INTEGER                     , INTENT(in   )           ::  kjpt        ! number of tracers
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta         ! 4D tracers fields
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta         ! 4D tracers fields
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtu, pgtv  ! hor. grad. of ptra at u- & v-pts
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ), OPTIONAL ::  prd         ! 3D density anomaly fields
       REAL(wp), DIMENSION(:,:)    , INTENT(  out), OPTIONAL ::  pgru, pgrv  ! hor. grad of prd at u- & v-pts (bottom)
@@ -107,7 +107,7 @@ CONTAINS
       INTEGER                                , INTENT(in   )           ::  kt          ! ocean time-step index
       INTEGER                                , INTENT(in   )           ::  kjpt        ! number of tracers
       INTEGER                                , INTENT(in   )           ::  ktta, ktgt, ktrd, ktgr
-      REAL(wp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta         ! 4D tracers fields
+      REAL(dp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta         ! 4D tracers fields
       REAL(wp), DIMENSION(A2D_T(ktgt)    ,KJPT), INTENT(  out)           ::  pgtu, pgtv  ! hor. grad. of ptra at u- & v-pts
       REAL(wp), DIMENSION(A2D_T(ktrd),JPK     ), INTENT(in   ), OPTIONAL ::  prd         ! 3D density anomaly fields
       REAL(wp), DIMENSION(A2D_T(ktgr)         ), INTENT(  out), OPTIONAL ::  pgru, pgrv  ! hor. grad of prd at u- & v-pts (bottom)
@@ -211,7 +211,7 @@ CONTAINS
       !!
       INTEGER                     , INTENT(in   )           ::  kt           ! ocean time-step index
       INTEGER                     , INTENT(in   )           ::  kjpt         ! number of tracers
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta          ! 4D tracers fields
+      REAL(dp), DIMENSION(:,:,:,:), INTENT(in   )           ::  pta          ! 4D tracers fields
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtu, pgtv   ! hor. grad. of ptra at u- & v-pts
       REAL(wp), DIMENSION(:,:,:)  , INTENT(  out)           ::  pgtui, pgtvi ! hor. grad. of stra at u- & v-pts (ISF)
       REAL(wp), DIMENSION(:,:,:)  , INTENT(in   ), OPTIONAL ::  prd          ! 3D density anomaly fields
@@ -280,7 +280,7 @@ CONTAINS
       INTEGER                                , INTENT(in   )           ::  kt           ! ocean time-step index
       INTEGER                                , INTENT(in   )           ::  kjpt         ! number of tracers
       INTEGER                                , INTENT(in   )           ::  ktta, ktgt, ktgti, ktrd, ktgr, ktgri
-      REAL(wp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta          ! 4D tracers fields
+      REAL(dp), DIMENSION(A2D_T(ktta),JPK,KJPT), INTENT(in   )           ::  pta          ! 4D tracers fields
       REAL(wp), DIMENSION(A2D_T(ktgt)    ,KJPT), INTENT(  out)           ::  pgtu, pgtv   ! hor. grad. of ptra at u- & v-pts
       REAL(wp), DIMENSION(A2D_T(ktgti)   ,KJPT), INTENT(  out)           ::  pgtui, pgtvi ! hor. grad. of stra at u- & v-pts (ISF)
       REAL(wp), DIMENSION(A2D_T(ktrd),JPK     ), INTENT(in   ), OPTIONAL ::  prd          ! 3D density anomaly fields
diff --git a/src/OCE/TRD/trddyn.F90 b/src/OCE/TRD/trddyn.F90
index 8816056e52b877dbd4118eaba52ceb326bc1c8b4..78dd5ecdb007e0a8eb6248545956f9fe3ae888e6 100644
--- a/src/OCE/TRD/trddyn.F90
+++ b/src/OCE/TRD/trddyn.F90
@@ -52,7 +52,7 @@ CONTAINS
       !!              integral constraints, barotropic vorticity, kinetic enrgy, 
       !!              and/or mixed layer budget.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends 
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends 
       INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
       INTEGER                   , INTENT(in   ) ::   kt             ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
@@ -98,7 +98,7 @@ CONTAINS
       !! 
       !! ** Purpose :   output 3D trends using IOM
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
       INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
       INTEGER                   , INTENT(in   ) ::   kt             ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
diff --git a/src/OCE/TRD/trdglo.F90 b/src/OCE/TRD/trdglo.F90
index 0e4a2aea0f1d16b4f7299c6d414d292d8b45b027..bc787379549713e5b4fad389e343edbbe1914f62 100644
--- a/src/OCE/TRD/trdglo.F90
+++ b/src/OCE/TRD/trdglo.F90
@@ -45,12 +45,13 @@ MODULE trdglo
 
    !                     !!! domain averaged trends
    REAL(wp), DIMENSION(jptot_tra) ::   tmo, smo   ! temperature and salinity trends 
-   REAL(wp), DIMENSION(jptot_tra) ::   t2 , s2    ! T^2 and S^2 trends 
-   REAL(wp), DIMENSION(jptot_dyn) ::   umo, vmo   ! momentum trends 
+   REAL(wp), DIMENSION(jptot_tra) ::   t2 , s2    ! T^2 and S^2 trends
+   REAL(wp), DIMENSION(jptot_dyn) ::   umo, vmo   ! momentum trends
    REAL(wp), DIMENSION(jptot_dyn) ::   hke        ! kinetic energy trends (u^2+v^2) 
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -67,8 +68,8 @@ CONTAINS
       !!              T, T^2, momentum, KE, and KE<->PE
       !!
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend 
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
       INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
       CHARACTER(len=3)          , INTENT(in   ) ::   ctype   ! momentum or tracers trends type (='DYN'/'TRA')
       INTEGER                   , INTENT(in   ) ::   kt      ! time step
@@ -201,7 +202,7 @@ CONTAINS
          zkz  (:,:,:) = 0._wp
          zkepe(:,:,:) = 0._wp
    
-         CALL eos( ts(:,:,:,:,Kmm), rhd, rhop )       ! now potential density
+         CALL eos( ts(:,:,:,:,Kmm), rhd, CASTSP(rhop) )       ! now potential density
 
          zcof = 0.5_wp / rho0             ! Density flux at w-point
          zkz(:,:,1) = 0._wp
diff --git a/src/OCE/TRD/trdken.F90 b/src/OCE/TRD/trdken.F90
index d97b3eb80a37e9db31884014b55435e2ba3547cc..b23a4d68901e78a23b93ad8de63b6e0f1ad18c19 100644
--- a/src/OCE/TRD/trdken.F90
+++ b/src/OCE/TRD/trdken.F90
@@ -77,7 +77,7 @@ CONTAINS
       !
       !
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V masked trends
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V masked trends
       INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
       INTEGER                   , INTENT(in   ) ::   kt             ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
@@ -89,7 +89,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj,jpk)      ::   zke                 ! 3D workspace 
       !!----------------------------------------------------------------------
       !
-      CALL lbc_lnk( 'trdken', putrd, 'U', -1.0_wp , pvtrd, 'V', -1.0_wp )      ! lateral boundary conditions
+      CALL lbc_lnk( 'trdken', putrd, 'U', -1.0_dp , pvtrd, 'V', -1.0_dp )      ! lateral boundary conditions
       !
       nkstp = kt
       DO jk = 1, jpkm1
diff --git a/src/OCE/TRD/trdmxl.F90 b/src/OCE/TRD/trdmxl.F90
index bce0dd5367ca329c9588297506059ddc4f662177..cd711fecda37948799472cd3b339cbec51c1a58b 100644
--- a/src/OCE/TRD/trdmxl.F90
+++ b/src/OCE/TRD/trdmxl.F90
@@ -69,6 +69,7 @@ MODULE trdmxl
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -249,8 +250,8 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                         , INTENT( in ) ::   ktrd       ! ocean trend index
       CHARACTER(len=2)                , INTENT( in ) ::   ctype      ! 2D surface/bottom or 3D interior physics
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pttrdmxl   ! temperature trend 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pstrdmxl   ! salinity trend 
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pttrdmxl   ! temperature trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT( in ) ::   pstrdmxl   ! salinity trend
       !
       INTEGER ::   ji, jj, jk, isum
       REAL(wp), DIMENSION(jpi,jpj)  :: zvlmsk 
@@ -374,9 +375,9 @@ CONTAINS
 
          IF( sn_cfctl%l_prtctl ) THEN
             WRITE(numout,*) '             we reach kt == nit000 + 1 = ', nit000+1
-            CALL prt_ctl(tab2d_1=tmlbb   , clinfo1=' tmlbb   -   : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tmlbn   , clinfo1=' tmlbn   -   : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlbb)  , clinfo1=' tmlbb   -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlbn)  , clinfo1=' tmlbn   -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlatfb), clinfo1=' tmlatfb -   : ', mask1=tmask)
          END IF
          !
       END IF
@@ -384,16 +385,16 @@ CONTAINS
       IF( ( ln_rstart ) .AND. ( kt == nit000 ) .AND. sn_cfctl%l_prtctl ) THEN
          IF( ln_trdmxl_instant ) THEN
             WRITE(numout,*) '             restart from kt == nit000 = ', nit000
-            CALL prt_ctl(tab2d_1=tmlbb   , clinfo1=' tmlbb   -   : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tmlbn   , clinfo1=' tmlbn   -   : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlbb  ) , clinfo1=' tmlbb   -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlbn  ) , clinfo1=' tmlbn   -   : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlatfb ), clinfo1=' tmlatfb -   : ', mask1=tmask)
          ELSE
             WRITE(numout,*) '             restart from kt == nit000 = ', nit000
-            CALL prt_ctl(tab2d_1=tmlbn          , clinfo1=' tmlbn           -  : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=hmxlbn         , clinfo1=' hmxlbn          -  : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tml_sumb       , clinfo1=' tml_sumb        -  : ', mask1=tmask)
-            CALL prt_ctl(tab2d_1=tmltrd_atf_sumb, clinfo1=' tmltrd_atf_sumb -  : ', mask1=tmask)
-            CALL prt_ctl(tab3d_1=tmltrd_csum_ub , clinfo1=' tmltrd_csum_ub  -  : ', mask1=tmask, kdim=1)
+            CALL prt_ctl(tab2d_1=CASTDP(tmlbn)        , clinfo1=' tmlbn           -  : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(hmxlbn)       , clinfo1=' hmxlbn          -  : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tml_sumb)      , clinfo1=' tml_sumb        -  : ', mask1=tmask)
+            CALL prt_ctl(tab2d_1=CASTDP(tmltrd_atf_sumb), clinfo1=' tmltrd_atf_sumb -  : ', mask1=tmask)
+            CALL prt_ctl(tab3d_1=CASTDP(tmltrd_csum_ub) , clinfo1=' tmltrd_csum_ub  -  : ', mask1=tmask, kdim=1)
          END IF
       END IF
 
@@ -551,15 +552,15 @@ CONTAINS
          
          IF( sn_cfctl%l_prtctl ) THEN
             IF( ln_trdmxl_instant ) THEN
-               CALL prt_ctl(tab2d_1=tmlbb   , clinfo1=' tmlbb   -   : ', mask1=tmask)
-               CALL prt_ctl(tab2d_1=tmlbn   , clinfo1=' tmlbn   -   : ', mask1=tmask)
-               CALL prt_ctl(tab2d_1=tmlatfb , clinfo1=' tmlatfb -   : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(tmlbb)   , clinfo1=' tmlbb   -   : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(tmlbn )  , clinfo1=' tmlbn   -   : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(tmlatfb) , clinfo1=' tmlatfb -   : ', mask1=tmask)
             ELSE
-               CALL prt_ctl(tab2d_1=tmlbn          , clinfo1=' tmlbn           -  : ', mask1=tmask)
-               CALL prt_ctl(tab2d_1=hmxlbn         , clinfo1=' hmxlbn          -  : ', mask1=tmask)
-               CALL prt_ctl(tab2d_1=tml_sumb       , clinfo1=' tml_sumb        -  : ', mask1=tmask)
-               CALL prt_ctl(tab2d_1=tmltrd_atf_sumb, clinfo1=' tmltrd_atf_sumb -  : ', mask1=tmask)
-               CALL prt_ctl(tab3d_1=tmltrd_csum_ub , clinfo1=' tmltrd_csum_ub  -  : ', mask1=tmask, kdim=1)
+               CALL prt_ctl(tab2d_1=CASTDP(tmlbn)        , clinfo1=' tmlbn           -  : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(hmxlbn)      , clinfo1=' hmxlbn          -  : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(tml_sumb)     , clinfo1=' tml_sumb        -  : ', mask1=tmask)
+               CALL prt_ctl(tab2d_1=CASTDP(tmltrd_atf_sumb), clinfo1=' tmltrd_atf_sumb -  : ', mask1=tmask)
+               CALL prt_ctl(tab3d_1=CASTDP(tmltrd_csum_ub), clinfo1=' tmltrd_csum_ub  -  : ', mask1=tmask, kdim=1)
             END IF
          END IF
 
@@ -725,7 +726,7 @@ CONTAINS
       INTEGER  ::   jl     ! dummy loop indices
       INTEGER  ::   inum   ! logical unit
       INTEGER  ::   ios    ! local integer
-      REAL(wp) ::   zjulian, zsto, zout
+      REAL(dp) ::   zjulian, zsto, zout
       CHARACTER (LEN=40) ::   clop
       CHARACTER (LEN=12) ::   clmxl, cltu, clsu
       !!
diff --git a/src/OCE/TRD/trdpen.F90 b/src/OCE/TRD/trdpen.F90
index 0c356f841b8ef2122ddc847db98675675c1d8eaf..a6cdc8ee3fb2451c283f8476a37ee4e137e71f54 100644
--- a/src/OCE/TRD/trdpen.F90
+++ b/src/OCE/TRD/trdpen.F90
@@ -63,7 +63,7 @@ CONTAINS
       !!                constraints, barotropic vorticity, kinetic enrgy, 
       !!                potential energy, and/or mixed layer budget.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   ptrdx, ptrdy   ! Temperature & Salinity trends
+      REAL(dp), DIMENSION(:,:,:), INTENT(in) ::   ptrdx, ptrdy   ! Temperature & Salinity trends
       INTEGER                   , INTENT(in) ::   ktrd           ! tracer trend index
       INTEGER                   , INTENT(in) ::   kt             ! time step index
       INTEGER                   , INTENT(in) ::   Kmm            ! time level index
@@ -78,7 +78,7 @@ CONTAINS
       !
       IF( kt /= nkstp ) THEN     ! full eos: set partial derivatives at the 1st call of kt time step
          nkstp = kt
-         CALL eos_pen( ts(:,:,:,:,Kmm), rab_PE, zpe, Kmm )
+         CALL eos_pen( ts(:,:,:,:,Kmm), rab_pe, zpe, Kmm )
          CALL iom_put( "alphaPE", rab_pe(:,:,:,jp_tem) )
          CALL iom_put( "betaPE" , rab_pe(:,:,:,jp_sal) )
          CALL iom_put( "PEanom" , zpe )
diff --git a/src/OCE/TRD/trdtra.F90 b/src/OCE/TRD/trdtra.F90
index a3377863268e3c79e108bfaebad9e761281bfac5..4c7d90d3ea1aa31d71f9cca5e2654424ddd78071 100644
--- a/src/OCE/TRD/trdtra.F90
+++ b/src/OCE/TRD/trdtra.F90
@@ -36,7 +36,7 @@ MODULE trdtra
 
    PUBLIC   trd_tra   ! called by all tra_... modules
 
-   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   trdtx, trdty, trdt   ! use to store the temperature trends
+   REAL(dp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   trdtx, trdty, trdt   ! use to store the temperature trends
    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   avt_evd  ! store avt_evd to calculate EVD trend
 
    !! * Substitutions
@@ -80,12 +80,13 @@ CONTAINS
       INTEGER                         , INTENT(in)           ::   Kmm, Krhs ! time level indices
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in)           ::   ptrd    ! tracer trend  or flux
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   pu      ! now velocity 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   ptra    ! now tracer variable
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in), OPTIONAL ::   ptra    ! now tracer variable
       !
       INTEGER ::   jk    ! loop indices
       INTEGER ::   i01   ! 0 or 1
-      REAL(wp),        DIMENSION(jpi,jpj,jpk) ::   ztrds             ! 3D workspace
-      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zwt, zws, ztrdt   ! 3D workspace
+      REAL(dp),        DIMENSION(jpi,jpj,jpk) ::   ztrds             ! 3D workspace
+      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)  :: zwt, zws! 3D workspace
+      REAL(dp), ALLOCATABLE, DIMENSION(:,:,:)  :: ztrdt! 3D workspace
       !!----------------------------------------------------------------------
       !      
       IF( .NOT. ALLOCATED( trdtx ) ) THEN      ! allocate trdtra arrays
@@ -201,9 +202,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pf      ! advective flux in one direction
       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pu      ! now velocity   in one direction
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt      ! now or before tracer 
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) ::   pt      ! now or before tracer
       CHARACTER(len=1)                , INTENT(in   ) ::   cdir    ! X/Y/Z direction
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   ptrd    ! advective trend in one direction
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(  out) ::   ptrd    ! advective trend in one direction
       INTEGER,  INTENT(in)                            ::   Kmm     ! time level index
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
@@ -238,8 +239,8 @@ CONTAINS
       !!                integral constraints, potential energy, and/or 
       !!                mixed layer budget.
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend 
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
       INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
       INTEGER                   , INTENT(in   ) ::   kt      ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm     ! time level index
@@ -299,8 +300,8 @@ CONTAINS
       !! 
       !! ** Purpose :   output 3D tracer trends using IOM
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend 
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
       INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
       INTEGER                   , INTENT(in   ) ::   kt      ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm     ! time level index
diff --git a/src/OCE/TRD/trdtrc.F90 b/src/OCE/TRD/trdtrc.F90
index f825ddd8a854909ef9ff2b6c82892472b77f73d8..f4200feed859135894a873c13d7cc1c02aec7c72 100644
--- a/src/OCE/TRD/trdtrc.F90
+++ b/src/OCE/TRD/trdtrc.F90
@@ -12,7 +12,7 @@ CONTAINS
    SUBROUTINE trd_trc( ptrtrd, kjn, ktrd, kt, Kmm )
       INTEGER ::   kt, kjn, ktrd   
       INTEGER ::   Kmm            ! time level index
-      REAL(wp)::   ptrtrd(:,:,:)  
+      REAL(dp), DIMENSION(:,:,:) :: ptrtrd
       WRITE(*,*) 'trd_trc : You should not have seen this print! error?', ptrtrd(1,1,1)
       WRITE(*,*) '  "      "      : You should not have seen this print! error?', kjn, ktrd, kt
    END SUBROUTINE trd_trc
diff --git a/src/OCE/TRD/trdvor.F90 b/src/OCE/TRD/trdvor.F90
index 974f5b1a9b06f1a16fcdbee8d7457b71f9a5ea6c..346d697c3b6e9e14260b8c10b32b0028dc81a3e8 100644
--- a/src/OCE/TRD/trdvor.F90
+++ b/src/OCE/TRD/trdvor.F90
@@ -50,12 +50,13 @@ MODULE trdvor
    REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   rotot        ! begining of the NN_WRITE-1 timesteps
    REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrtot   !
    REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:)   ::   vor_avrres   !
-   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   vortrd       ! curl of trends
+   REAL(dp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   vortrd       ! curl of trends
          
    CHARACTER(len=12) ::   cvort
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -85,7 +86,7 @@ CONTAINS
       !! ** Purpose :  computation of cumulated trends over analysis period
       !!               and make outputs (NetCDF format)
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends 
+      REAL(dp), DIMENSION(:,:,:), INTENT(inout) ::   putrd, pvtrd   ! U and V trends
       INTEGER                   , INTENT(in   ) ::   ktrd           ! trend index
       INTEGER                   , INTENT(in   ) ::   kt             ! time step
       INTEGER                   , INTENT(in   ) ::   Kmm            ! time level index
@@ -94,7 +95,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj) ::   ztswu, ztswv    ! 2D workspace 
       !!----------------------------------------------------------------------
 
-      CALL lbc_lnk( 'trdvor', putrd, 'U', -1.0_wp , pvtrd, 'V', -1.0_wp )      ! lateral boundary condition
+      CALL lbc_lnk( 'trdvor', putrd, 'U', -1.0_dp , pvtrd, 'V', -1.0_dp )      ! lateral boundary condition
 
       SELECT CASE( ktrd ) 
       CASE( jpdyn_hpg )   ;   CALL trd_vor_zint( putrd, pvtrd, jpvor_prg, Kmm )   ! Hydrostatique Pressure Gradient 
@@ -227,8 +228,8 @@ CONTAINS
       !
       INTEGER                         , INTENT(in) ::   ktrd       ! ocean trend index
       INTEGER                         , INTENT(in) ::   Kmm        ! time level index
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   putrdvor   ! u vorticity trend 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   pvtrdvor   ! v vorticity trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   putrdvor   ! u vorticity trend
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(in) ::   pvtrdvor   ! v vorticity trend
       !
       INTEGER ::   ji, jj, jk   ! dummy loop indices
       REAL(wp), DIMENSION(jpi,jpj) :: zudpvor, zvdpvor  ! total cmulative trends
@@ -403,8 +404,8 @@ CONTAINS
          CALL histwrite( nidvor,"sovortbv",it,vortrd(:,:,jpvor_bev),ndimvor1,ndexvor1)  ! beta.V
          CALL histwrite( nidvor,"sovowind",it,vortrd(:,:,jpvor_swf),ndimvor1,ndexvor1) ! wind stress
          CALL histwrite( nidvor,"sovobfri",it,vortrd(:,:,jpvor_bfr),ndimvor1,ndexvor1) ! bottom friction
-         CALL histwrite( nidvor,"1st_mbre",it,vor_avrtot    ,ndimvor1,ndexvor1) ! First membre
-         CALL histwrite( nidvor,"sovorgap",it,vor_avrres    ,ndimvor1,ndexvor1) ! gap between 1st and 2 nd mbre
+         CALL histwrite( nidvor,"1st_mbre",it,CASTDP(vor_avrtot)    ,ndimvor1,ndexvor1) ! First membre
+         CALL histwrite( nidvor,"sovorgap",it,CASTDP(vor_avrres)    ,ndimvor1,ndexvor1) ! gap between 1st and 2 nd mbre
          !
          IF( ndebug /= 0 ) THEN
             WRITE(numout,*) ' debuging trd_vor: III.4 done'
@@ -427,7 +428,7 @@ CONTAINS
       !! ** Purpose :   computation of vertically integrated T and S budgets
       !!      from ocean surface down to control surface (NetCDF output)
       !!----------------------------------------------------------------------
-      REAL(wp) ::   zjulian, zsto, zout
+      REAL(dp) ::   zjulian, zsto, zout
       CHARACTER (len=40) ::   clhstnam
       CHARACTER (len=40) ::   clop
       !!----------------------------------------------------------------------
@@ -490,7 +491,7 @@ CONTAINS
 
       ! II.2 Compute julian date from starting date of the run
       ! ------------------------
-      CALL ymds2ju( nyear, nmonth, nday, rn_Dt, zjulian )
+      CALL ymds2ju( nyear, nmonth, nday, CASTDP(rn_Dt), zjulian )
       zjulian = zjulian - adatrj   !   set calendar origin to the beginning of the experiment
       IF(lwp) WRITE(numout,*)' '  
       IF(lwp) WRITE(numout,*)'               Date 0 used :',nit000,    &
@@ -501,8 +502,8 @@ CONTAINS
       ! ---------------------------------
       CALL dia_nam( clhstnam, nn_trd, 'vort' )                  ! filename
       IF(lwp) WRITE(numout,*) ' Name of NETCDF file ', clhstnam
-      CALL histbeg( clhstnam, jpi, glamf, jpj, gphif,1, jpi,   &  ! Horizontal grid : glamt and gphit
-         &          1, jpj, nit000-1, zjulian, rn_Dt, nh_t, nidvor, domain_id=nidom, snc4chunks=snc4set )
+      CALL histbeg( clhstnam, jpi, CASTDP(glamf), jpj, CASTDP(gphif),1, jpi,   &  ! Horizontal grid : glamt and gphit
+         &          1, jpj, nit000-1, zjulian, CASTDP(rn_Dt), nh_t, nidvor, domain_id=nidom, snc4chunks=snc4set )
       CALL wheneq( jpi*jpj, fmask, 1, 1., ndexvor1, ndimvor1 )    ! surface
 
       ! Declare output fields as netCDF variables
diff --git a/src/OCE/USR/usrdef_hgr.F90 b/src/OCE/USR/usrdef_hgr.F90
index 2f617b552235a7b19c9cad93e777a785bcca0884..f96e7b6ae5362afe0c0edb915f4f69b986e469c1 100644
--- a/src/OCE/USR/usrdef_hgr.F90
+++ b/src/OCE/USR/usrdef_hgr.F90
@@ -62,8 +62,10 @@ CONTAINS
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pphit, pphiu, pphiv, pphif   ! latitude outputs                      [degrees]
       INTEGER                 , INTENT(out) ::   kff                          ! =1 Coriolis parameter computed here, =0 otherwise
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pff_f, pff_t                 ! Coriolis factor at f-point                [1/s]
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1t, pe1u, pe1v, pe1f       ! i-scale factors                             [m]
-      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe2t, pe2u, pe2v, pe2f       ! j-scale factors                             [m]
+      REAL(wp), DIMENSION(:,:), INTENT(out)  :: pe1v! i-scale factors                             [m]
+      REAL(dp), DIMENSION(:,:), INTENT(out)  :: pe1t, pe1u, pe1f! i-scale factors                             [m]
+      REAL(wp), DIMENSION(:,:), INTENT(out)  :: pe2u! j-scale factors                             [m]
+      REAL(dp), DIMENSION(:,:), INTENT(out)  :: pe2t, pe2v, pe2f! j-scale factors                             [m]
       INTEGER                 , INTENT(out) ::   ke1e2u_v                     ! =1 u- & v-surfaces computed here, =0 otherwise 
       REAL(wp), DIMENSION(:,:), INTENT(out) ::   pe1e2u, pe1e2v               ! u- & v-surfaces (if reduction in strait)   [m2]
       !
diff --git a/src/OCE/USR/usrdef_istate.F90 b/src/OCE/USR/usrdef_istate.F90
index 7ae061b03b669ca94ec9c82fa69d5d0a90847521..57d844cbbc1e192ffc9aace0eadc0ac7e7a4f484 100644
--- a/src/OCE/USR/usrdef_istate.F90
+++ b/src/OCE/USR/usrdef_istate.F90
@@ -46,9 +46,9 @@ CONTAINS
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask             [m]
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s] 
-      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s] 
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
+      REAL(dp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s]
+      REAL(dp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s]
       !
       INTEGER :: ji, jj, jk  ! dummy loop indices
       !!----------------------------------------------------------------------
@@ -89,7 +89,7 @@ CONTAINS
       !! ** Method  :   Set ssh as null, ptmask is required for test cases
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask   [m]
-      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height   [m]
+      REAL(dp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height   [m]
       !!----------------------------------------------------------------------
       !
       IF(lwp) WRITE(numout,*)
diff --git a/src/OCE/USR/usrdef_sbc.F90 b/src/OCE/USR/usrdef_sbc.F90
index ce5b785a973082a9dd81b952667d965cd21a2bfc..d04070744cdb0986c68a35845f809ea784d191b4 100644
--- a/src/OCE/USR/usrdef_sbc.F90
+++ b/src/OCE/USR/usrdef_sbc.F90
@@ -31,6 +31,7 @@ MODULE usrdef_sbc
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
    !! $Id: usrdef_sbc.F90 15145 2021-07-26 16:16:45Z smasson $
@@ -67,7 +68,7 @@ CONTAINS
       REAL(wp) ::   ztimemax1, ztimemin1   ! 21th June, and 21th decem. if date0 = 1st january
       REAL(wp) ::   ztimemax2, ztimemin2   ! 21th June, and 21th decem. if date0 = 1st january
       REAL(wp) ::   ztaun                  ! intensity
-      REAL(wp) ::   zemp_s, zemp_n, zemp_sais, ztstar
+      REAL(wp) ::   zemp_S, zemp_N, zemp_sais, zTstar
       REAL(wp) ::   zcos_sais1, zcos_sais2, ztrp, zconv, t_star
       REAL(wp) ::   zsumemp, zsurf
       REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
@@ -130,8 +131,8 @@ CONTAINS
          ENDIF
       END_2D
 
-      zsumemp = GLOB_SUM( 'usrdef_sbc', emp  (:,:)   ) 
-      zsurf   = GLOB_SUM( 'usrdef_sbc', tmask(:,:,1) ) 
+      zsumemp = GLOB_SUM( 'usrdef_sbc', CASTDP(emp  (:,:))   )
+      zsurf   = GLOB_SUM( 'usrdef_sbc', CASTDP(tmask(:,:,1)) )
       zsumemp = zsumemp / zsurf         ! Default GYRE configuration
 
       ! freshwater (mass flux) and update of qns with heat content of emp
diff --git a/src/OCE/USR/usrdef_zgr.F90 b/src/OCE/USR/usrdef_zgr.F90
index 99916151b849bf1bf43cda85df0c902111b48ed8..4e2d11f59ad230b8988e33e87c67db44fe07c802 100644
--- a/src/OCE/USR/usrdef_zgr.F90
+++ b/src/OCE/USR/usrdef_zgr.F90
@@ -52,7 +52,8 @@ CONTAINS
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D grid-point depth     [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth        [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors  [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(out)  :: pe3u, pe3v, pe3f! vertical scale factors  [m]
+      REAL(dp), DIMENSION(:,:,:), INTENT(out)  :: pe3t! vertical scale factors  [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         ! i-scale factors 
       INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top, k_bot                ! first & last ocean level
       !
@@ -220,7 +221,8 @@ CONTAINS
       REAL(wp), DIMENSION(:)    , INTENT(in   ) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth       [m]
       REAL(wp), DIMENSION(:)    , INTENT(in   ) ::   pe3t_1d , pe3w_1d           ! 1D vertical scale factors [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pdept, pdepw                ! grid-point depth          [m]
-      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors    [m]
+      REAL(wp), DIMENSION(:,:,:), INTENT(  out)  :: pe3u, pe3v, pe3f! vertical scale factors    [m]
+      REAL(dp), DIMENSION(:,:,:), INTENT(  out)  :: pe3t! vertical scale factors    [m]
       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pe3w , pe3uw, pe3vw         !    -       -      -
       !
       INTEGER  ::   jk
diff --git a/src/OCE/ZDF/zdfddm.F90 b/src/OCE/ZDF/zdfddm.F90
index 4cfc6ead2360d0b6ed209be7e13c8c347bfb7596..8b96fb64a1598649719680ac747fa75173a8fcdc 100644
--- a/src/OCE/ZDF/zdfddm.F90
+++ b/src/OCE/ZDF/zdfddm.F90
@@ -30,6 +30,7 @@ MODULE zdfddm
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -158,7 +159,7 @@ CONTAINS
       !                                                   ! ===============
       !
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl(tab3d_1=avt , clinfo1=' ddm  - t: ', tab3d_2=avs , clinfo2=' s: ')
+         CALL prt_ctl(tab3d_1=CASTDP(avt), clinfo1=' ddm  - t: ', tab3d_2=CASTDP(avs) , clinfo2=' s: ')
       ENDIF
       !
    END SUBROUTINE zdf_ddm
diff --git a/src/OCE/ZDF/zdfdrg.F90 b/src/OCE/ZDF/zdfdrg.F90
index 7c866594d4d6e9a06a3be206caa898d2eb2f7686..a8916a1727aeef5e3d0aad1280e17a111c2abb1c 100644
--- a/src/OCE/ZDF/zdfdrg.F90
+++ b/src/OCE/ZDF/zdfdrg.F90
@@ -74,6 +74,7 @@ MODULE zdfdrg
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -137,7 +138,7 @@ CONTAINS
          END_2D
       ENDIF
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pCdU, clinfo1=' Cd*U ')
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=CASTDP(pCdU), clinfo1=' Cd*U ')
       !
    END SUBROUTINE zdf_drg
 
@@ -156,14 +157,14 @@ CONTAINS
       !!---------------------------------------------------------------------
       INTEGER                         , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                         , INTENT(in   ) ::   Kmm        ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pub, pvb   ! the two components of the before velocity
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! the two components of the velocity tendency
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pub, pvb   ! the two components of the before velocity
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pua, pva   ! the two components of the velocity tendency
       !! 
       INTEGER  ::   ji, jj       ! dummy loop indexes
       INTEGER  ::   ikbu, ikbv   ! local integers
       REAL(wp) ::   zm1_2dt      ! local scalar
       REAL(wp) ::   zCdu, zCdv   !   -      -
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
+      REAL(dp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
       !!---------------------------------------------------------------------
       !
 !!gm bug : time step is only rn_Dt (not 2 rn_Dt if euler start !)
diff --git a/src/OCE/ZDF/zdfgls.F90 b/src/OCE/ZDF/zdfgls.F90
index b37cdb9e14b9d3476ead8d3866bb22fe34005a39..61cc05ecb5cda078108a1edc00d43e051ac8dda9 100644
--- a/src/OCE/ZDF/zdfgls.F90
+++ b/src/OCE/ZDF/zdfgls.F90
@@ -114,6 +114,7 @@ MODULE zdfgls
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -856,8 +857,8 @@ CONTAINS
       p_avt(A2D(nn_hls),1) = 0._wp
       !
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl( tab3d_1=en   , clinfo1=' gls  - e: ', tab3d_2=p_avt, clinfo2=' t: ' )
-         CALL prt_ctl( tab3d_1=p_avm, clinfo1=' gls  - m: ' )
+         CALL prt_ctl( tab3d_1=CASTDP(en )  , clinfo1=' gls  - e: ', tab3d_2=CASTDP(p_avt), clinfo2=' t: ' )
+         CALL prt_ctl( tab3d_1=CASTDP(p_avm), clinfo1=' gls  - m: ' )
       ENDIF
       !
    END SUBROUTINE zdf_gls
diff --git a/src/OCE/ZDF/zdfiwm.F90 b/src/OCE/ZDF/zdfiwm.F90
index d0a9540eaa619d70c6eff3ba70b4c417f26f84d1..7a8ba8dc626abcde4e0d25a2ec2900e71c4ca84b 100644
--- a/src/OCE/ZDF/zdfiwm.F90
+++ b/src/OCE/ZDF/zdfiwm.F90
@@ -53,6 +53,7 @@ MODULE zdfiwm
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -299,7 +300,7 @@ CONTAINS
          ENDIF
       ENDIF
 
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ')
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl(tab3d_1=CASTDP(zav_wave) , clinfo1=' iwm - av_wave: ', tab3d_2=CASTDP(avt), clinfo2=' avt: ')
       !
    END SUBROUTINE zdf_iwm
 
@@ -423,7 +424,7 @@ CONTAINS
       ztmp(:,:,3) = e1e2t(:,:) * ensq_iwm(:,:)
       ztmp(:,:,4) = e1e2t(:,:) * esho_iwm(:,:)
 
-      zdia(1:4) = glob_sum_vec( 'zdfiwm', ztmp(:,:,1:4) )
+      zdia(1:4) =glob_sum_vec( 'zdfiwm', CASTDP(ztmp(:,:,1:4)) )
 
       IF(lwp) THEN
          WRITE(numout,*) '      Dissipation above abyssal hills:        ', zdia(1) * 1.e-12_wp, 'TW'
diff --git a/src/OCE/ZDF/zdfmfc.F90 b/src/OCE/ZDF/zdfmfc.F90
index f984b2bfa425f1ceb62b6c249dff7a5a3fca0a98..095b2c0a8b4e770325661b78001fc2341d68093b 100644
--- a/src/OCE/ZDF/zdfmfc.F90
+++ b/src/OCE/ZDF/zdfmfc.F90
@@ -1,4 +1,4 @@
- MODULE zdfmfc
+MODULE zdfmfc
    !!======================================================================
    !!                       ***  MODULE  zdfmfc  ***
    !! Ocean physics: Mass-Flux scheme parameterization of Convection:
@@ -57,6 +57,7 @@
    !
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.2 , NEMO Consortium (2018)
@@ -94,7 +95,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in)    :: Kmm, Krhs ! time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! active tracers and RHS of tracer equation
       REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   ztsp         ! T/S of the plume
       REAL(wp), DIMENSION(A2D(nn_hls),jpk,2) ::   ztse         ! T/S at W point
       REAL(wp), DIMENSION(A2D(nn_hls),jpk) :: zrwp          !
@@ -211,7 +212,7 @@ CONTAINS
 
          ! Compute the buoyancy acceleration on T-points at jk-1
          zrautbm1(:,:) = zrautb(:,:)
-         CALL eos( pts (:,:,jk  ,:,Kmm) ,  zrautb(:,:)   )
+ CALL eos( CASTSP(pts (:,:,jk ,:,Kmm)) , zrautb(:,:) )
          CALL eos( ztsp(:,:,jk-1,:    ) ,  zraupl(:,:)   )
 
          DO_2D( 0, 0, 0, 0 )
@@ -395,7 +396,8 @@ CONTAINS
    
    SUBROUTINE diag_mfc( zdiagi, zdiagd, zdiags, p2dt, Kaa )
 
-      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::  zdiagi, zdiagd, zdiags  ! inout: tridaig. terms
+      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout)  :: zdiags! inout: tridaig. terms
+      REAL(dp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout)  :: zdiagi, zdiagd! inout: tridaig. terms
       REAL(wp)                            , INTENT(in   ) ::   p2dt                   ! tracer time-step
       INTEGER                             , INTENT(in   ) ::   Kaa                    ! ocean time level indices
 
@@ -411,7 +413,7 @@ CONTAINS
 
    SUBROUTINE rhs_mfc( zrhs, jjn )
 
-      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   zrhs                   ! inout: rhs trend 
+      REAL(dp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   zrhs                   ! inout: rhs trend
       INTEGER                         , INTENT(in   ) ::   jjn                    ! tracer indices
 
       INTEGER  ::   ji, jj, jk  ! dummy  loop arguments   
@@ -483,6 +485,3 @@ CONTAINS
  
    !!======================================================================
 END MODULE zdfmfc
-
-
-
diff --git a/src/OCE/ZDF/zdfmxl.F90 b/src/OCE/ZDF/zdfmxl.F90
index c387bdb14eb18cced95ea452b9f8f7c4906ce06a..a2510884cdf25bfeca911ec303e9978a03ea7a77 100644
--- a/src/OCE/ZDF/zdfmxl.F90
+++ b/src/OCE/ZDF/zdfmxl.F90
@@ -37,6 +37,7 @@ MODULE zdfmxl
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -115,7 +116,7 @@ CONTAINS
          ENDIF
       ENDIF
       !
-      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=REAL(nmln,wp), clinfo1=' nmln : ', tab2d_2=hmlp, clinfo2=' hmlp : ' )
+      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=REAL(nmln,dp), clinfo1=' nmln : ', tab2d_2=CASTDP(hmlp), clinfo2=' hmlp : ' )
       !
    END SUBROUTINE zdf_mxl
 
diff --git a/src/OCE/ZDF/zdfosm.F90 b/src/OCE/ZDF/zdfosm.F90
index 1a4bfabbce4a561a1f9e95b51ba55e24dc339a86..73d7f2026a8692ccaa96a544f58e9f76b7d866c3 100644
--- a/src/OCE/ZDF/zdfosm.F90
+++ b/src/OCE/ZDF/zdfosm.F90
@@ -1711,7 +1711,7 @@ CONTAINS
       REAL(wp) ::   zari, ztau, zdh_ref, zddhdt, zvel_max
       REAL(wp) ::   ztmp   ! Auxiliary variable
       !!
-      REAL, PARAMETER ::   pp_ddh = 2.5_wp, pp_ddh_2 = 3.5_wp   ! Also in pycnocline_depth
+      REAL(wp), PARAMETER ::   pp_ddh = 2.5_wp, pp_ddh_2 = 3.5_wp   ! Also in pycnocline_depth
       !!----------------------------------------------------------------------
       !
       DO_2D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
@@ -3335,7 +3335,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                                  , INTENT(in   ) ::   kt          ! Time step index
       INTEGER                                  , INTENT(in   ) ::   Kmm, Krhs   ! Time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts         ! Active tracers and RHS of tracer equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts         ! Active tracers and RHS of tracer equation
       !!
       INTEGER                                 ::   ji, jj, jk
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdt, ztrds   ! 3D workspace
@@ -3409,7 +3409,7 @@ CONTAINS
       !!----------------------------------------------------------------------
       INTEGER                             , INTENT(in   ) ::   kt          ! Ocean time step index
       INTEGER                             , INTENT(in   ) ::   Kmm, Krhs   ! Ocean time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! Ocean velocities and RHS of momentum equation
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv    ! Ocean velocities and RHS of momentum equation
       !!
       INTEGER :: ji, jj, jk   ! dummy loop indices
       !!----------------------------------------------------------------------
diff --git a/src/OCE/ZDF/zdftke.F90 b/src/OCE/ZDF/zdftke.F90
index 5680ec1e20176e01de75677426a40208fdf571f2..6e3e6b93fb9d2207d66068e57693f20df20fe787 100644
--- a/src/OCE/ZDF/zdftke.F90
+++ b/src/OCE/ZDF/zdftke.F90
@@ -102,6 +102,7 @@ MODULE zdftke
 
    !! * Substitutions
 #  include "do_loop_substitute.h90"
+#  include "single_precision_substitute.h90"
 #  include "domzgr_substitute.h90"
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
@@ -701,8 +702,8 @@ CONTAINS
       ENDIF
       !
       IF(sn_cfctl%l_prtctl) THEN
-         CALL prt_ctl( tab3d_1=en   , clinfo1=' tke  - e: ', tab3d_2=p_avt, clinfo2=' t: ' )
-         CALL prt_ctl( tab3d_1=p_avm, clinfo1=' tke  - m: ' )
+         CALL prt_ctl( tab3d_1=CASTDP(en) , clinfo1=' tke  - e: ', tab3d_2=CASTDP(p_avt), clinfo2=' t: ' )
+         CALL prt_ctl( tab3d_1=CASTDP(p_avm), clinfo1=' tke  - m: ' )
       ENDIF
       !
    END SUBROUTINE tke_avn
diff --git a/src/OCE/lib_fortran.F90 b/src/OCE/lib_fortran.F90
index 9929defb47e3b42cb645dae8d2488fff8d1e0f97..299a7c0047f4dc4eda95f0e50bae3cc381135057 100644
--- a/src/OCE/lib_fortran.F90
+++ b/src/OCE/lib_fortran.F90
@@ -113,13 +113,13 @@ CONTAINS
 
    FUNCTION local_sum_2d( ptab )
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:), INTENT(in) ::   ptab ! array on which operation is applied
-      COMPLEX(dp)                          ::   local_sum_2d
+      REAL(dp), DIMENSION(:,:),  INTENT(in   ) ::   ptab ! array on which operation is applied
+      COMPLEX(dp)              ::  local_sum_2d
       !
       !!-----------------------------------------------------------------------
       !
       COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
+      REAL(dp)   ::   ztmp
       INTEGER    ::   ji, jj    ! dummy loop indices
       INTEGER    ::   ipi, ipj  ! dimensions
       !!-----------------------------------------------------------------------
@@ -127,12 +127,12 @@ CONTAINS
       ipi = SIZE(ptab,1)   ! 1st dimension
       ipj = SIZE(ptab,2)   ! 2nd dimension
       !
-      ctmp = CMPLX( 0._dp, 0._dp, dp )   ! warning ctmp is cumulated
+      ctmp = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
 
       DO jj = 1, ipj
          DO ji = 1, ipi
             ztmp =  ptab(ji,jj) * tmask_i(ji,jj)
-            CALL DDPDD( CMPLX( ztmp, 0._dp, dp ), ctmp )
+            CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
          END DO
       END DO
       !
@@ -142,13 +142,13 @@ CONTAINS
 
    FUNCTION local_sum_3d( ptab )
       !!----------------------------------------------------------------------
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   ptab ! array on which operation is applied
-      COMPLEX(dp)                            ::   local_sum_3d
+      REAL(wp), DIMENSION(:,:,:),  INTENT(in   ) ::   ptab ! array on which operation is applied
+      COMPLEX(dp)              ::  local_sum_3d
       !
       !!-----------------------------------------------------------------------
       !
       COMPLEX(dp)::   ctmp
-      REAL(wp)   ::   ztmp
+      REAL(dp)   ::   ztmp
       INTEGER    ::   ji, jj, jk   ! dummy loop indices
       INTEGER    ::   ipi, ipj, ipk    ! dimensions
       !!-----------------------------------------------------------------------
@@ -157,13 +157,13 @@ CONTAINS
       ipj = SIZE(ptab,2)   ! 2nd dimension
       ipk = SIZE(ptab,3)   ! 3rd dimension
       !
-      ctmp = CMPLX( 0._dp, 0._dp, dp )   ! warning ctmp is cumulated
+      ctmp = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
 
       DO jk = 1, ipk
         DO jj = 1, ipj
           DO ji = 1, ipi
              ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
-             CALL DDPDD( CMPLX( ztmp, 0._dp, dp ), ctmp )
+             CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp )
           END DO
         END DO
       END DO
@@ -286,12 +286,12 @@ CONTAINS
 
    FUNCTION glob_sum_vec_3d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),           INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3))      ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname      ! name of the calling subroutine
+      REAL(dp), DIMENSION(:,:,:),         INTENT(in) ::   ptab ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,3)) ::   ptmp
       !
       COMPLEX(dp), DIMENSION(:), ALLOCATABLE ::   ctmp
-      REAL(wp)    ::   ztmp
+      REAL(dp)    ::   ztmp
       INTEGER     ::   ji , jj , jk     ! dummy loop indices
       INTEGER     ::   ipi, ipj, ipk    ! dimensions
       INTEGER     ::   iis, iie, ijs, ije   ! loop start and end
@@ -312,17 +312,17 @@ CONTAINS
       ALLOCATE( ctmp(ipk) )
       !
       DO jk = 1, ipk
-         ctmp(jk) = CMPLX( 0._dp, 0._dp, dp )   ! warning ctmp is cumulated
+         ctmp(jk) = CMPLX( 0.e0, 0.e0, dp )   ! warning ctmp is cumulated
          DO jj = ijs, ije
             DO ji = iis, iie
                ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
-               CALL DDPDD( CMPLX( ztmp, 0._dp, dp ), ctmp(jk) )
+               CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp(jk) )
             END DO
          END DO
       END DO
       CALL mpp_sum( cdname, ctmp(:) )   ! sum over the global domain
       !
-      ptmp = REAL( ctmp(:), wp )
+      ptmp = REAL( ctmp(:), dp )
       !
       DEALLOCATE( ctmp )
       !
@@ -330,12 +330,12 @@ CONTAINS
 
    FUNCTION glob_sum_vec_4d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),             INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4))        ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
+      REAL(dp),  DIMENSION(:,:,:,:),        INTENT(in) ::   ptab ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,4)) ::   ptmp
       !
       COMPLEX(dp), DIMENSION(:), ALLOCATABLE ::   ctmp
-      REAL(wp)    ::   ztmp
+      REAL(dp)    ::   ztmp
       INTEGER     ::   ji , jj , jk , jl     ! dummy loop indices
       INTEGER     ::   ipi, ipj, ipk, ipl    ! dimensions
       INTEGER     ::   iis, iie, ijs, ije    ! loop start and end
@@ -362,14 +362,14 @@ CONTAINS
             DO jj = ijs, ije
                DO ji = iis, iie
                   ztmp =  ptab(ji,jj,jk,jl) * tmask_i(ji,jj)
-                  CALL DDPDD( CMPLX( ztmp, 0._dp, dp ), ctmp(jl) )
+                  CALL DDPDD( CMPLX( ztmp, 0.e0, dp ), ctmp(jl) )
                END DO
             END DO
          END DO
       END DO
       CALL mpp_sum( cdname, ctmp(:) )   ! sum over the global domain
       !
-      ptmp = REAL( ctmp(:), wp )
+      ptmp = REAL( ctmp(:), dp )
       !
       DEALLOCATE( ctmp )
       !
@@ -377,9 +377,9 @@ CONTAINS
 
    FUNCTION glob_min_vec_3d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),           INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3))      ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
+      REAL(wp), DIMENSION(:,:,:),         INTENT(in) ::   ptab   ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,3)) ::   ptmp
       !
       INTEGER     ::   jk    ! dummy loop indice & dimension
       INTEGER     ::   ipk   ! dimension
@@ -396,9 +396,9 @@ CONTAINS
 
    FUNCTION glob_min_vec_4d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),             INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4))        ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname          ! name of the calling subroutine
+      REAL(wp), DIMENSION(:,:,:,:),         INTENT(in) ::   ptab   ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,4)) ::   ptmp
       !
       INTEGER     ::   jk , jl    ! dummy loop indice & dimension
       INTEGER     ::   ipk, ipl   ! dimension
@@ -419,9 +419,9 @@ CONTAINS
    
    FUNCTION glob_max_vec_3d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),           INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,3))      ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname        ! name of the calling subroutine
+      REAL(wp), DIMENSION(:,:,:),         INTENT(in) ::   ptab   ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,3)) ::   ptmp
       !
       INTEGER     ::   jk    ! dummy loop indice & dimension
       INTEGER     ::   ipk   ! dimension
@@ -438,9 +438,9 @@ CONTAINS
 
    FUNCTION glob_max_vec_4d( cdname, ptab ) RESULT( ptmp )
       !!----------------------------------------------------------------------
-      CHARACTER(len=*),             INTENT(in) ::   cdname   ! name of the calling subroutine
-      REAL(wp), DIMENSION(:,:,:,:), INTENT(in) ::   ptab     ! array on which operation is applied
-      REAL(wp), DIMENSION(SIZE(ptab,4))        ::   ptmp
+      CHARACTER(len=*),  INTENT(in) ::   cdname          ! name of the calling subroutine
+      REAL(wp), DIMENSION(:,:,:,:),         INTENT(in) ::   ptab   ! array on which operation is applied
+      REAL(dp), DIMENSION(SIZE(ptab,4)) ::   ptmp
       !
       INTEGER     ::   jk , jl    ! dummy loop indice & dimension
       INTEGER     ::   ipk, ipl   ! dimension
@@ -467,7 +467,7 @@ CONTAINS
       !!
       !!
       !! ** Method  : The code uses the compensated summation with doublet
-      !!              (sum,error) emulated useing complex numbers. ydda is the
+      !!              (sum,error) emulated using complex numbers. ydda is the
       !!               scalar to add to the summ yddb
       !!
       !! ** Action  : This does only work for MPI.
diff --git a/src/OCE/lib_fortran_generic.h90 b/src/OCE/lib_fortran_generic.h90
index e09d498522c066fc408a7d5e6d1c22a0aa3cc270..35dc7edc765231c8e092c1b145bd964ce28824f2 100644
--- a/src/OCE/lib_fortran_generic.h90
+++ b/src/OCE/lib_fortran_generic.h90
@@ -2,7 +2,7 @@
 !                          ! FUNCTION FUNCTION_GLOBSUM !
 #   if defined DIM_1d
 #      define XD                1d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #      define ARRAY_IN(i,j,k)   ptab(i)
 #      define ARRAY2_IN(i,j,k)  ptab2(i)
 #      define J_SIZE(ptab)      1
@@ -11,7 +11,7 @@
 #   endif
 #   if defined DIM_2d
 #      define XD                2d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #      define ARRAY_IN(i,j,k)   ptab(i,j)
 #      define ARRAY2_IN(i,j,k)  ptab2(i,j)
 #      define J_SIZE(ptab)      SIZE(ptab,2)
@@ -20,7 +20,7 @@
 #   endif
 #   if defined DIM_3d
 #      define XD                3d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #      define ARRAY_IN(i,j,k)   ptab(i,j,k)
 #      define ARRAY2_IN(i,j,k)  ptab2(i,j,k)
 #      define J_SIZE(ptab)      SIZE(ptab,2)
@@ -83,14 +83,14 @@
 !                          ! FUNCTION FUNCTION_GLOBMINMAX !
 #   if defined DIM_2d
 #      define XD                2d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #      define ARRAY_IN(i,j,k)   ptab(i,j)
 #      define ARRAY2_IN(i,j,k)  ptab2(i,j)
 #      define K_SIZE(ptab)      1
 #   endif
 #   if defined DIM_3d
 #      define XD                3d
-#      define ARRAY_TYPE(i,j,k)    REAL(wp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
+#      define ARRAY_TYPE(i,j,k)    REAL(dp)                 , INTENT(in   ) ::   ARRAY_IN(i,j,k)
 #      define ARRAY_IN(i,j,k)   ptab(i,j,k)
 #      define ARRAY2_IN(i,j,k)  ptab2(i,j,k)
 #      define K_SIZE(ptab)      SIZE(ptab,3)
diff --git a/src/OCE/module_example.F90 b/src/OCE/module_example.F90
index 76a25caeb4c6be4e1ecf2535d3ab383e5a059f5c..0cfd06aef0d5d973fa503fe614a5b12af48228cb 100644
--- a/src/OCE/module_example.F90
+++ b/src/OCE/module_example.F90
@@ -16,6 +16,7 @@ MODULE exampl
    !!   exa_mpl_init  : name of the module for a routine)
    !!   exa_mpl_stp   : Please try to use 3 letter block for routine names
    !!----------------------------------------------------------------------
+   USE par_kind
    USE module_name1   ! brief description of the used module
    USE module_name2   ! ....
 
diff --git a/src/OCE/oce.F90 b/src/OCE/oce.F90
index db45ce295f45f0577c01c50a9f84a48dd6cde58d..8047bad4dab58e195616bbbe27291e59d5c3f117 100644
--- a/src/OCE/oce.F90
+++ b/src/OCE/oce.F90
@@ -20,27 +20,29 @@ MODULE oce
 
    !! dynamics and tracer fields
    !! --------------------------                            
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)   ::   uu   ,  vv     !: horizontal velocities        [m/s]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)   ::   uu   ,  vv     !: horizontal velocities        [m/s]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   ww             !: vertical velocity            [m/s]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   wi             !: vertical vel. (adaptive-implicit) [m/s]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   hdiv           !: horizontal divergence        [s-1]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:,:) ::   ts             !: 4D T-S fields                  [Celsius,psu] 
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:,:) ::   ts             !: 4D T-S fields                  [Celsius,psu]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:)   ::   rab_b,  rab_n  !: thermal/haline expansion coef. [Celsius-1,psu-1]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)     ::   rn2b ,  rn2    !: brunt-vaisala frequency**2     [s-2]
    !
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rhd    !: in situ density anomalie rhd=(rho-rho0)/rho0  [no units]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rhop   !: potential volumic mass                           [kg/m3]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rhop   !: potential volumic mass                           [kg/m3]
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   Cu_adv                   !: vertical Courant number (adaptive-implicit)
 
    !! free surface
    !! ------------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   ssh, uu_b,  vv_b           !: SSH [m] and barotropic velocities [m/s]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ssh_frc                    !: Forcing term in external mode for SSH [m/s] 
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  :: uu_b, vv_b!: SSH [m] and barotropic velocities [m/s]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)  :: ssh!: SSH [m] and barotropic velocities [m/s]
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   ssh_frc                    !: Forcing term in external mode for SSH [m/s]
 
    !! Arrays at barotropic time step:                   ! befbefore! before !  now   ! after  !
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ubb_e  ,  ub_e  ,  un_e  , ua_e   !: u-external velocity
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vbb_e  ,  vb_e  ,  vn_e  , va_e   !: v-external velocity
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sshbb_e,  sshb_e,  sshn_e, ssha_e !: external ssh
+   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)  :: sshbb_e, sshb_e!: external ssh
+   REAL(dp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)  :: sshn_e, ssha_e!: external ssh
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hu_e   !: external u-depth
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hv_e   !: external v-depth
    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::                              hur_e  !: inverse of u-depth
diff --git a/src/OCE/par_kind.F90 b/src/OCE/par_kind.F90
index 2a750c1645db739ef8333145d40e86cf25a2518e..9226b96f2ac9b4a2c5f839ee2cfbe2cc3831a0d6 100644
--- a/src/OCE/par_kind.F90
+++ b/src/OCE/par_kind.F90
@@ -30,7 +30,7 @@ MODULE par_kind
    INTEGER, PUBLIC, PARAMETER ::   i4 = SELECTED_INT_KIND( 9)        !: single precision (integer 4)
    INTEGER, PUBLIC, PARAMETER ::   i8 = SELECTED_INT_KIND(14)        !: double precision (integer 8)
    
-   !                                                                !!** Integer **
+   !                                                               !!** Integer **
    INTEGER, PUBLIC, PARAMETER ::   lc  = 256                          !: Lenght of Character strings
    INTEGER, PUBLIC, PARAMETER ::   lca = 400                          !: Lenght of Character arrays
 
diff --git a/src/OCE/single_precision_substitute.h90 b/src/OCE/single_precision_substitute.h90
new file mode 100644
index 0000000000000000000000000000000000000000..02e78ecb11e60e4ab596a382882f4bf55028e654
--- /dev/null
+++ b/src/OCE/single_precision_substitute.h90
@@ -0,0 +1,8 @@
+#if defined key_single
+#   define CASTSP(x) REAL(x,sp)
+#   define CASTDP(x) REAL(x,dp)
+#else
+#   define CASTSP(x) x
+#   define CASTDP(x) x
+#endif
+
diff --git a/src/OCE/stpctl.F90 b/src/OCE/stpctl.F90
index 96358bf94048c1bae16bd72d84b1f7cfb50e748d..a736dd7a90b173ec8c296dd32b2b9718af163d57 100644
--- a/src/OCE/stpctl.F90
+++ b/src/OCE/stpctl.F90
@@ -40,6 +40,8 @@ MODULE stpctl
    !! $Id: stpctl.F90 15023 2021-06-18 14:35:25Z gsamson $
    !! Software governed by the CeCILL license (see ./LICENSE)
    !!----------------------------------------------------------------------
+#  include "single_precision_substitute.h90"
+#  include "single_precision_substitute.h90"
 CONTAINS
 
    SUBROUTINE stp_ctl( kt, Kmm )
@@ -66,9 +68,9 @@ CONTAINS
       INTEGER                         ::   idtime, istatus
       INTEGER , DIMENSION(jptst)      ::   iareasum, iareamin, iareamax
       INTEGER , DIMENSION(3,jptst)    ::   iloc                                  ! min/max loc indices
-      REAL(wp)                        ::   zzz, zminsal, zmaxsal                 ! local real 
-      REAL(wp), DIMENSION(jpvar+1)    ::   zmax
-      REAL(wp), DIMENSION(jptst)      ::   zmaxlocal
+      REAL(dp)                        ::   zzz, zminsal, zmaxsal                 ! local real
+      REAL(dp), DIMENSION(jpvar+1)    ::   zmax
+      REAL(dp), DIMENSION(jptst)      ::   zmaxlocal
       LOGICAL                         ::   ll_wrtstp, ll_colruns, ll_wrtruns, ll_0oce
       LOGICAL, DIMENSION(jpi,jpj,jpk) ::   llmsk
       CHARACTER(len=20)               ::   clname
@@ -207,10 +209,10 @@ CONTAINS
             llmsk(Nis0:Nie0,Njs0:Nje0,1) = ssmask(Nis0:Nie0,Njs0:Nje0 ) == 1._wp         ! define only the inner domain
             CALL mpp_maxloc( 'stpctl', ABS(ssh(:,:,         Kmm)), llmsk(:,:,1), zzz, iloc(1:2,1) )   ! mpp_maxloc ok if mask = F 
             llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
-            CALL mpp_maxloc( 'stpctl', ABS( uu(:,:,:,       Kmm)), llmsk(:,:,:), zzz, iloc(1:3,2) )
+ CALL mpp_maxloc( 'stpctl', CASTDP(ABS( uu(:,:,:, Kmm))), llmsk(:,:,:), zzz, iloc(1:3,2) )
             llmsk(Nis0:Nie0,Njs0:Nje0,:) = tmask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
             CALL mpp_minloc( 'stpctl',      ts(:,:,:,jp_sal,Kmm) , llmsk(:,:,:), zzz, iloc(1:3,3) )
-            CALL mpp_maxloc( 'stpctl',      ts(:,:,:,jp_sal,Kmm) , llmsk(:,:,:), zzz, iloc(1:3,4) )
+            CALL mpp_maxloc( 'stpctl',      CASTDP(ts(:,:,:,jp_sal,Kmm)) , llmsk(:,:,:), zzz, iloc(1:3,4) )
             ! find which subdomain has the max.
             iareamin(:) = jpnij+1   ;   iareamax(:) = 0   ;   iareasum(:) = 0
             DO ji = 1, jptst
@@ -237,10 +239,10 @@ CONTAINS
          ENDIF
          !
          WRITE(ctmp1,*) ' stp_ctl: |ssh| > 20 m  or  |U| > 10 m/s  or  S <= 0  or  S >= 100  or  NaN encounter in the tests'
-         CALL wrt_line( ctmp2, kt, '|ssh| max', zmax(1), iloc(:,1), iareasum(1), iareamin(1), iareamax(1) )
-         CALL wrt_line( ctmp3, kt, '|U|   max', zmax(2), iloc(:,2), iareasum(2), iareamin(2), iareamax(2) )
-         CALL wrt_line( ctmp4, kt, 'Sal   min', zmax(3), iloc(:,3), iareasum(3), iareamin(3), iareamax(3) )
-         CALL wrt_line( ctmp5, kt, 'Sal   max', zmax(4), iloc(:,4), iareasum(4), iareamin(4), iareamax(4) )
+         CALL wrt_line( ctmp2, kt, '|ssh| max', CASTSP(zmax(1)), iloc(:,1), iareasum(1), iareamin(1), iareamax(1) )
+         CALL wrt_line( ctmp3, kt, '|U|   max', CASTSP(zmax(2)), iloc(:,2), iareasum(2), iareamin(2), iareamax(2) )
+         CALL wrt_line( ctmp4, kt, 'Sal   min', CASTSP(zmax(3)), iloc(:,3), iareasum(3), iareamin(3), iareamax(3) )
+         CALL wrt_line( ctmp5, kt, 'Sal   max', CASTSP(zmax(4)), iloc(:,4), iareasum(4), iareamin(4), iareamax(4) )
          IF( Agrif_Root() ) THEN
             WRITE(ctmp6,*) '      ===> output of last computed fields in output.abort* files'
          ELSE
diff --git a/src/OCE/stpmlf.F90 b/src/OCE/stpmlf.F90
index f20dc3e5df907e2e9724e0540c40dc7eca52bd48..17e44e46e363fcce36bcb1fc77c5c85fdb6efa51 100644
--- a/src/OCE/stpmlf.F90
+++ b/src/OCE/stpmlf.F90
@@ -71,6 +71,7 @@ CONTAINS
 #if defined key_agrif
    RECURSIVE SUBROUTINE stp_MLF( )
       INTEGER             ::   kstp   ! ocean time-step index
+
 #else
    SUBROUTINE stp_MLF( kstp )
       INTEGER, INTENT(in) ::   kstp   ! ocean time-step index
@@ -464,7 +465,6 @@ CONTAINS
       !
    END SUBROUTINE stp_MLF
 
-
    SUBROUTINE mlf_baro_corr( Kmm, Kaa, puu, pvv )
       !!----------------------------------------------------------------------
       !!                  ***  ROUTINE mlf_baro_corr  ***
@@ -480,7 +480,7 @@ CONTAINS
       USE dynspg_ts, ONLY : un_adv, vn_adv   ! updated Kmm barotropic transport 
       !!
       INTEGER                             , INTENT(in   ) ::   Kmm, Kaa   ! before and after time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv   ! velocities
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::   puu, pvv   ! velocities
       !
       INTEGER  ::   ji,jj, jk   ! dummy loop indices
       REAL(wp), DIMENSION(jpi,jpj) ::   zue, zve
@@ -539,8 +539,8 @@ CONTAINS
       !!
       INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
       INTEGER                                  , INTENT(in   ) ::   Kbb, Kaa   ! before and after time level indices
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt)     , INTENT(inout) ::   puu, pvv   ! velocities to be time filtered
-      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts        ! active tracers
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpt)     , INTENT(inout) ::   puu, pvv   ! velocities to be time filtered
+      REAL(dp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) ::   pts        ! active tracers
       !!----------------------------------------------------------------------
       !
       ! Update after tracer and velocity on domain lateral boundaries
@@ -550,8 +550,8 @@ CONTAINS
             CALL Agrif_dyn( kt )
 # endif
       !                                        ! local domain boundaries  (T-point, unchanged sign)
-      CALL lbc_lnk( 'finalize_lbc', puu(:,:,:,       Kaa), 'U', -1._wp, pvv(:,:,:       ,Kaa), 'V', -1._wp   &
-                       &          , pts(:,:,:,jp_tem,Kaa), 'T',  1._wp, pts(:,:,:,jp_sal,Kaa), 'T',  1._wp )
+      CALL lbc_lnk( 'finalize_lbc', puu(:,:,:,       Kaa), 'U', -1._dp, pvv(:,:,:       ,Kaa), 'V', -1._dp   &
+                       &          , pts(:,:,:,jp_tem,Kaa), 'T',  1._dp, pts(:,:,:,jp_sal,Kaa), 'T',  1._dp )
       !
       ! lbc_lnk needed for zdf_sh2 when using nn_hls = 2, moved here to allow tiling in zdf_phy
       IF( nn_hls == 2 .AND. l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp )