diff --git a/ext/AGRIF/AGRIF_FILES/modbcfunction.F90 b/ext/AGRIF/AGRIF_FILES/modbcfunction.F90
index e6add0329e709fbd64311d119d638024a7ad141d..ae7de45aa4f67ad6544725c894575005c8d1f88c 100644
--- a/ext/AGRIF/AGRIF_FILES/modbcfunction.F90
+++ b/ext/AGRIF/AGRIF_FILES/modbcfunction.F90
@@ -447,14 +447,14 @@ subroutine Agrif_Find_Nearest ( tabvarsindic, fineloc, parentloc )
     type(Agrif_Variable), pointer :: parent_var
     type(Agrif_Variable), pointer :: child_var
     integer :: i
-    integer, dimension(6)           :: nb_child     !< Number of cells on the child grid
-    integer, dimension(6)           :: ub_child     !< Upper bound on the child grid
-    integer, dimension(6)           :: lb_child     !< Lower bound on the child grid
-    integer, dimension(6)           :: lb_parent    !< Lower bound on the parent grid
-    real, dimension(6)              :: s_child      !< Child  grid position (s_root = 0)
-    real, dimension(6)              :: s_parent     !< Parent grid position (s_root = 0)
-    real, dimension(6)              :: ds_child     !< Child  grid dx (ds_root = 1)
-    real, dimension(6)              :: ds_parent    !< Parent grid dx (ds_root = 1)
+    integer,      dimension(6)      :: nb_child     !< Number of cells on the child grid
+    integer,      dimension(6)      :: ub_child     !< Upper bound on the child grid
+    integer,      dimension(6)      :: lb_child     !< Lower bound on the child grid
+    integer,      dimension(6)      :: lb_parent    !< Lower bound on the parent grid
+    real(kind=8), dimension(6)      :: s_child      !< Child  grid position (s_root = 0)
+    real(kind=8), dimension(6)      :: s_parent     !< Parent grid position (s_root = 0)
+    real(kind=8), dimension(6)      :: ds_child     !< Child  grid dx (ds_root = 1)
+    real(kind=8), dimension(6)      :: ds_parent    !< Parent grid dx (ds_root = 1)
     integer                         :: nbdim        !< Number of dimensions
     real, dimension(6) :: xfineloc
 !
diff --git a/ext/AGRIF/AGRIF_FILES/modupdate.F90 b/ext/AGRIF/AGRIF_FILES/modupdate.F90
index 3bdb5b1b32c32a04011776637e240d6645e4d5c5..c647fcb7930460be33cc07e7cb3b51fdb5f3e63d 100644
--- a/ext/AGRIF/AGRIF_FILES/modupdate.F90
+++ b/ext/AGRIF/AGRIF_FILES/modupdate.F90
@@ -1904,8 +1904,8 @@ subroutine Agrif_Update_1D_Recursive ( type_update,         &
     integer,                            intent(in)  :: type_update            !< Type of update (copy or average)
     integer,                            intent(in)  :: indmin, indmax
     integer,                            intent(in)  :: lb_child, ub_child
-    real(kind=8),                               intent(in)  ::  s_child,  s_parent
-    real(kind=8),                               intent(in)  :: ds_child, ds_parent
+    real(kind=8),                       intent(in)  ::  s_child,  s_parent
+    real(kind=8),                       intent(in)  :: ds_child, ds_parent
     real, dimension(indmin:indmax),     intent(out) :: tempP
     real, dimension(lb_child:ub_child), intent(in)  :: tempC
 !---------------------------------------------------------------------------------------------------
@@ -1933,11 +1933,11 @@ subroutine Agrif_Update_2D_Recursive ( type_update,         &
                                         s_child,  s_parent, &
                                        ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    integer, dimension(2),          intent(in)  :: type_update            !< Type of update (copy or average)
-    integer, dimension(2),          intent(in)  :: indmin, indmax
-    integer, dimension(2),          intent(in)  :: lb_child, ub_child
-    real(kind=8),    dimension(2),          intent(in)  ::  s_child,  s_parent
-    real(kind=8),    dimension(2),          intent(in)  :: ds_child, ds_parent
+    integer,     dimension(2),      intent(in)  :: type_update            !< Type of update (copy or average)
+    integer,     dimension(2),      intent(in)  :: indmin, indmax
+    integer,     dimension(2),      intent(in)  :: lb_child, ub_child
+    real(kind=8),dimension(2),      intent(in)  ::  s_child,  s_parent
+    real(kind=8),dimension(2),      intent(in)  :: ds_child, ds_parent
     real,    dimension(          &
         indmin(1):indmax(1),     &
         indmin(2):indmax(2)),       intent(out) :: tempP
@@ -2047,11 +2047,11 @@ subroutine Agrif_Update_2D_Recursive_ok ( type_update, &
                                        lb_child, ub_child,                    &
                                        s_child, s_parent, ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    INTEGER, DIMENSION(2), intent(in)   :: type_update            !< Type of update (copy or average)
-    INTEGER, DIMENSION(2), intent(in)   :: indmin, indmax
-    INTEGER, DIMENSION(2), intent(in)   :: lb_child, ub_child
-    REAL,    DIMENSION(2), intent(in)   :: s_child,  s_parent
-    REAL,    DIMENSION(2), intent(in)   :: ds_child, ds_parent
+    INTEGER,     DIMENSION(2), intent(in)   :: type_update            !< Type of update (copy or average)
+    INTEGER,     DIMENSION(2), intent(in)   :: indmin, indmax
+    INTEGER,     DIMENSION(2), intent(in)   :: lb_child, ub_child
+    REAL(kind=8),DIMENSION(2), intent(in)   :: s_child,  s_parent
+    REAL(kind=8),DIMENSION(2), intent(in)   :: ds_child, ds_parent
     REAL,    DIMENSION(                 &
                 indmin(1):indmax(1),    &
                 indmin(2):indmax(2)),           intent(out) :: tempP
@@ -2101,11 +2101,11 @@ subroutine Agrif_Update_3D_Recursive ( type_update,         &
                                         s_child,  s_parent, &
                                        ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    integer, dimension(3),          intent(in)  :: type_update            !< Type of update (copy or average)
-    integer, dimension(3),          intent(in)  :: indmin, indmax
-    integer, dimension(3),          intent(in)  :: lb_child, ub_child
-    real,    dimension(3),          intent(in)  ::  s_child,  s_parent
-    real,    dimension(3),          intent(in)  :: ds_child, ds_parent
+    integer,     dimension(3),      intent(in)  :: type_update            !< Type of update (copy or average)
+    integer,     dimension(3),      intent(in)  :: indmin, indmax
+    integer,     dimension(3),      intent(in)  :: lb_child, ub_child
+    real(kind=8),dimension(3),      intent(in)  ::  s_child,  s_parent
+    real(kind=8),dimension(3),      intent(in)  :: ds_child, ds_parent
     real,    dimension(          &
         indmin(1):indmax(1),     &
         indmin(2):indmax(2),     &
@@ -2213,11 +2213,11 @@ subroutine Agrif_Update_4D_Recursive ( type_update,         &
                                         s_child,  s_parent, &
                                        ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    integer, dimension(4),          intent(in)  :: type_update            !< Type of update (copy or average)
-    integer, dimension(4),          intent(in)  :: indmin, indmax
-    integer, dimension(4),          intent(in)  :: lb_child, ub_child
-    real,    dimension(4),          intent(in)  ::  s_child,  s_parent
-    real,    dimension(4),          intent(in)  :: ds_child, ds_parent
+    integer,     dimension(4),      intent(in)  :: type_update            !< Type of update (copy or average)
+    integer,     dimension(4),      intent(in)  :: indmin, indmax
+    integer,     dimension(4),      intent(in)  :: lb_child, ub_child
+    real(kind=8),dimension(4),      intent(in)  ::  s_child,  s_parent
+    real(kind=8),dimension(4),      intent(in)  :: ds_child, ds_parent
     real,    dimension(          &
         indmin(1):indmax(1),     &
         indmin(2):indmax(2),     &
@@ -2285,11 +2285,11 @@ subroutine Agrif_Update_5D_Recursive ( type_update,         &
                                         s_child,  s_parent, &
                                        ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    integer, dimension(5),          intent(in)  :: type_update            !< Type of update (copy or average)
-    integer, dimension(5),          intent(in)  :: indmin, indmax
-    integer, dimension(5),          intent(in)  :: lb_child, ub_child
-    real,    dimension(5),          intent(in)  ::  s_child,  s_parent
-    real,    dimension(5),          intent(in)  :: ds_child, ds_parent
+    integer,     dimension(5),      intent(in)  :: type_update            !< Type of update (copy or average)
+    integer,     dimension(5),      intent(in)  :: indmin, indmax
+    integer,     dimension(5),      intent(in)  :: lb_child, ub_child
+    real(kind=8),dimension(5),      intent(in)  ::  s_child,  s_parent
+    real(kind=8),dimension(5),      intent(in)  :: ds_child, ds_parent
     real,    dimension(          &
         indmin(1):indmax(1),     &
         indmin(2):indmax(2),     &
@@ -2364,11 +2364,11 @@ subroutine Agrif_Update_6D_Recursive ( type_update,         &
                                         s_child,  s_parent, &
                                        ds_child, ds_parent )
 !---------------------------------------------------------------------------------------------------
-    integer, dimension(6),          intent(in)  :: type_update            !< Type of update (copy or average)
-    integer, dimension(6),          intent(in)  :: indmin, indmax
-    integer, dimension(6),          intent(in)  :: lb_child, ub_child
-    real,    dimension(6),          intent(in)  ::  s_child,  s_parent
-    real,    dimension(6),          intent(in)  :: ds_child, ds_parent
+    integer,     dimension(6),      intent(in)  :: type_update            !< Type of update (copy or average)
+    integer,     dimension(6),      intent(in)  :: indmin, indmax
+    integer,     dimension(6),      intent(in)  :: lb_child, ub_child
+    real(kind=8),dimension(6),      intent(in)  ::  s_child,  s_parent
+    real(kind=8),dimension(6),      intent(in)  :: ds_child, ds_parent
     real,    dimension(          &
         indmin(1):indmax(1),     &
         indmin(2):indmax(2),     &
@@ -2454,8 +2454,8 @@ subroutine Agrif_UpdateBase ( type_update,              &
     integer,                            intent(in) :: lb_child, ub_child
     real, dimension(indmin:indmax),     intent(out):: parent_tab
     real, dimension(lb_child:ub_child), intent(in) :: child_tab
-    real,                               intent(in) :: s_parent,  s_child
-    real,                               intent(in) :: ds_parent, ds_child
+    real(kind=8),                       intent(in) :: s_parent,  s_child
+    real(kind=8),                       intent(in) :: ds_parent, ds_child
 !---------------------------------------------------------------------------------------------------
     integer :: np       ! Length of parent array
     integer :: nc       ! Length of child  array
diff --git a/ext/AGRIF/AGRIF_FILES/modupdatebasic.F90 b/ext/AGRIF/AGRIF_FILES/modupdatebasic.F90
index 900f0386f97c1dc62b574a4172085baf9759eb9d..76367bcfe79fbba0a5831ad285fd57b26f351332 100644
--- a/ext/AGRIF/AGRIF_FILES/modupdatebasic.F90
+++ b/ext/AGRIF/AGRIF_FILES/modupdatebasic.F90
@@ -231,16 +231,15 @@ subroutine Agrif_basicupdate_max1d ( x, y, np, nc, s_parent, s_child, ds_parent,
     REAL, DIMENSION(np), intent(out)    :: x
     REAL, DIMENSION(nc), intent(in)     :: y
     INTEGER,             intent(in)     :: np,nc
-    REAL,                intent(in)     :: s_parent,  s_child
-    REAL,                intent(in)     :: ds_parent, ds_child
+    REAL(kind=8),        intent(in)     :: s_parent,  s_child
+    REAL(kind=8),        intent(in)     :: ds_parent, ds_child
 !
     INTEGER :: i, ii, locind_child_left, coeffraf
-    REAL    :: xpos, invcoeffraf
+    REAL(kind=8) :: xpos
     INTEGER :: nbnonnuls
     INTEGER :: diffmod
 !
     coeffraf = nint(ds_parent/ds_child)
-    invcoeffraf = 1./coeffraf
 !
     if (coeffraf == 1) then
         locind_child_left = 1 + nint((s_parent - s_child)/ds_child)
diff --git a/ext/PPR/src/bfun1d.h90 b/ext/PPR/src/bfun1d.h90
index 279634678bb4805d2e674e5479a3e09bbaa0b257..1a40a981c6d3a4d69449580957363d1507761767 100644
--- a/ext/PPR/src/bfun1d.h90
+++ b/ext/PPR/src/bfun1d.h90
@@ -59,46 +59,46 @@
     !------------------------------------ -1th-order basis !
             select case (ndof)
             case (+1)
-                bfun(1) = sval**1 / 1.e0
+                bfun(1) = sval**1 / 1.e0_8
                 
             case (+2)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
                 
             case (+3)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
-                bfun(3) = sval**3 / 3.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
+                bfun(3) = sval**3 / 3.e0_8
                 
             case (+4)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
-                bfun(3) = sval**3 / 3.e0
-                bfun(4) = sval**4 / 4.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
+                bfun(3) = sval**3 / 3.e0_8
+                bfun(4) = sval**4 / 4.e0_8
                 
             case (+5)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
-                bfun(3) = sval**3 / 3.e0
-                bfun(4) = sval**4 / 4.e0
-                bfun(5) = sval**5 / 5.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
+                bfun(3) = sval**3 / 3.e0_8
+                bfun(4) = sval**4 / 4.e0_8
+                bfun(5) = sval**5 / 5.e0_8
                 
             case (+6)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
-                bfun(3) = sval**3 / 3.e0
-                bfun(4) = sval**4 / 4.e0
-                bfun(5) = sval**5 / 5.e0
-                bfun(6) = sval**6 / 6.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
+                bfun(3) = sval**3 / 3.e0_8
+                bfun(4) = sval**4 / 4.e0_8
+                bfun(5) = sval**5 / 5.e0_8
+                bfun(6) = sval**6 / 6.e0_8
                 
             case (+7)
-                bfun(1) = sval**1 / 1.e0
-                bfun(2) = sval**2 / 2.e0
-                bfun(3) = sval**3 / 3.e0
-                bfun(4) = sval**4 / 4.e0
-                bfun(5) = sval**5 / 5.e0
-                bfun(6) = sval**6 / 6.e0
-                bfun(7) = sval**7 / 7.e0
+                bfun(1) = sval**1 / 1.e0_8
+                bfun(2) = sval**2 / 2.e0_8
+                bfun(3) = sval**3 / 3.e0_8
+                bfun(4) = sval**4 / 4.e0_8
+                bfun(5) = sval**5 / 5.e0_8
+                bfun(6) = sval**6 / 6.e0_8
+                bfun(7) = sval**7 / 7.e0_8
             
             end select
 
@@ -106,46 +106,46 @@
     !------------------------------------ +0th-order basis !
             select case (ndof)
             case (+1)
-                bfun(1) =           1.e0
+                bfun(1) =           1.e0_8
                 
             case (+2)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
                 
             case (+3)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
-                bfun(3) = sval**2 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
+                bfun(3) = sval**2 * 1.e0_8
                 
             case (+4)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
-                bfun(3) = sval**2 * 1.e0
-                bfun(4) = sval**3 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
+                bfun(3) = sval**2 * 1.e0_8
+                bfun(4) = sval**3 * 1.e0_8
                 
             case (+5)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
-                bfun(3) = sval**2 * 1.e0
-                bfun(4) = sval**3 * 1.e0
-                bfun(5) = sval**4 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
+                bfun(3) = sval**2 * 1.e0_8
+                bfun(4) = sval**3 * 1.e0_8
+                bfun(5) = sval**4 * 1.e0_8
                 
             case (+6)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
-                bfun(3) = sval**2 * 1.e0
-                bfun(4) = sval**3 * 1.e0
-                bfun(5) = sval**4 * 1.e0
-                bfun(6) = sval**5 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
+                bfun(3) = sval**2 * 1.e0_8
+                bfun(4) = sval**3 * 1.e0_8
+                bfun(5) = sval**4 * 1.e0_8
+                bfun(6) = sval**5 * 1.e0_8
                 
             case (+7)
-                bfun(1) =           1.e0
-                bfun(2) = sval**1 * 1.e0
-                bfun(3) = sval**2 * 1.e0
-                bfun(4) = sval**3 * 1.e0
-                bfun(5) = sval**4 * 1.e0
-                bfun(6) = sval**5 * 1.e0
-                bfun(7) = sval**6 * 1.e0
+                bfun(1) =           1.e0_8
+                bfun(2) = sval**1 * 1.e0_8
+                bfun(3) = sval**2 * 1.e0_8
+                bfun(4) = sval**3 * 1.e0_8
+                bfun(5) = sval**4 * 1.e0_8
+                bfun(6) = sval**5 * 1.e0_8
+                bfun(7) = sval**6 * 1.e0_8
             
             end select
 
@@ -153,46 +153,46 @@
     !------------------------------------ +1st-order basis !
             select case (ndof)
             case (+1)
-                bfun(1) =           0.e0
+                bfun(1) =           0.e0_8
                 
             case (+2)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
                 
             case (+3)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
-                bfun(3) = sval**1 * 2.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
+                bfun(3) = sval**1 * 2.e0_8
                 
             case (+4)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
-                bfun(3) = sval**1 * 2.e0
-                bfun(4) = sval**2 * 3.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
+                bfun(3) = sval**1 * 2.e0_8
+                bfun(4) = sval**2 * 3.e0_8
                 
             case (+5)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
-                bfun(3) = sval**1 * 2.e0
-                bfun(4) = sval**2 * 3.e0
-                bfun(5) = sval**3 * 4.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
+                bfun(3) = sval**1 * 2.e0_8
+                bfun(4) = sval**2 * 3.e0_8
+                bfun(5) = sval**3 * 4.e0_8
                 
             case (+6)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
-                bfun(3) = sval**1 * 2.e0
-                bfun(4) = sval**2 * 3.e0
-                bfun(5) = sval**3 * 4.e0
-                bfun(6) = sval**4 * 5.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
+                bfun(3) = sval**1 * 2.e0_8
+                bfun(4) = sval**2 * 3.e0_8
+                bfun(5) = sval**3 * 4.e0_8
+                bfun(6) = sval**4 * 5.e0_8
                 
             case (+7)
-                bfun(1) =           0.e0
-                bfun(2) =           1.e0
-                bfun(3) = sval**1 * 2.e0
-                bfun(4) = sval**2 * 3.e0
-                bfun(5) = sval**3 * 4.e0
-                bfun(6) = sval**4 * 5.e0
-                bfun(7) = sval**5 * 6.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           1.e0_8
+                bfun(3) = sval**1 * 2.e0_8
+                bfun(4) = sval**2 * 3.e0_8
+                bfun(5) = sval**3 * 4.e0_8
+                bfun(6) = sval**4 * 5.e0_8
+                bfun(7) = sval**5 * 6.e0_8
             
             end select
 
@@ -200,46 +200,46 @@
     !------------------------------------ +2nd-order basis !
             select case (ndof)
             case (+1)
-                bfun(1) =           0.e0
+                bfun(1) =           0.e0_8
                 
             case (+2)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
                 
             case (+3)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
-                bfun(3) =           2.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
+                bfun(3) =           2.e0_8
                 
             case (+4)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
-                bfun(3) =           2.e0
-                bfun(4) = sval**1 * 6.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
+                bfun(3) =           2.e0_8
+                bfun(4) = sval**1 * 6.e0_8
                 
             case (+5)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
-                bfun(3) =           2.e0
-                bfun(4) = sval**1 * 6.e0
-                bfun(5) = sval**2 *12.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
+                bfun(3) =           2.e0_8
+                bfun(4) = sval**1 * 6.e0_8
+                bfun(5) = sval**2 *12.e0_8
                 
             case (+6)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
-                bfun(3) =           2.e0
-                bfun(4) = sval**1 * 6.e0
-                bfun(5) = sval**2 *12.e0
-                bfun(6) = sval**3 *20.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
+                bfun(3) =           2.e0_8
+                bfun(4) = sval**1 * 6.e0_8
+                bfun(5) = sval**2 *12.e0_8
+                bfun(6) = sval**3 *20.e0_8
                 
             case (+7)
-                bfun(1) =           0.e0
-                bfun(2) =           0.e0
-                bfun(3) =           2.e0
-                bfun(4) = sval**1 * 6.e0
-                bfun(5) = sval**2 *12.e0
-                bfun(6) = sval**3 *20.e0
-                bfun(7) = sval**4 *30.e0
+                bfun(1) =           0.e0_8
+                bfun(2) =           0.e0_8
+                bfun(3) =           2.e0_8
+                bfun(4) = sval**1 * 6.e0_8
+                bfun(5) = sval**2 *12.e0_8
+                bfun(6) = sval**3 *20.e0_8
+                bfun(7) = sval**4 *30.e0_8
             
             end select
 
diff --git a/ext/PPR/src/ffsl1d.h90 b/ext/PPR/src/ffsl1d.h90
index c2a3d9fa438ce31622a1c4cf17391e5f4ee350b7..45b140740af61bcfc6180e43774b324d121e93b0 100644
--- a/ext/PPR/src/ffsl1d.h90
+++ b/ext/PPR/src/ffsl1d.h90
@@ -250,7 +250,7 @@
         
         do  ipos = +2 , npos - 1
         
-            if (uvel(ipos) .gt. +0.e0) then
+            if (uvel(ipos) .gt. +0.e0_8) then
             
     !----------- integrate profile over upwind cell IPOS-1 !
  
@@ -264,8 +264,8 @@
         &        * tDEL / SPAC(    +1)
             end if
  
-            ss11 = +1.e0 - 2.e0 * uCFL
-            ss22 = +1.e0
+            ss11 = +1.e0_8 - 2.e0_8 * uCFL
+            ss22 = +1.e0_8
 
             call bfun1d(-1,mdof,ss11,vv11)
             call bfun1d(-1,mdof,ss22,vv22)
@@ -285,7 +285,7 @@
             end do
                       
             else &
-        &   if (uvel(ipos) .lt. -0.e0) then
+        &   if (uvel(ipos) .lt. -0.e0_8) then
             
     !----------- integrate profile over upwind cell IPOS+0 !
             
@@ -299,8 +299,8 @@
         &        * tDEL / SPAC(    +1)
             end if
 
-            ss11 = -1.e0 - 2.e0 * uCFL
-            ss22 = -1.e0
+            ss11 = -1.e0_8 - 2.e0_8 * uCFL
+            ss22 = -1.e0_8
         
             call bfun1d(-1,mdof,ss11,vv11)
             call bfun1d(-1,mdof,ss22,vv22)
diff --git a/ext/PPR/src/inv.h90 b/ext/PPR/src/inv.h90
index daceabb9a808cc6348e29c44604b21daedda93e4..491a1192322ec33479ce35ec93e9f73aa8f7f2f8 100644
--- a/ext/PPR/src/inv.h90
+++ b/ext/PPR/src/inv.h90
@@ -139,7 +139,7 @@
 
     !-------------------------------- C = C + scal * A * B !
 
-        if (scal .eq. +1.e0) then
+        if (scal .eq. +1.e0_8) then
 
         cmat(1,1) = cmat(1,1) & 
              + ( amat(1,1) * bmat(1,1) &
@@ -156,7 +156,7 @@
                + amat(2,2) * bmat(2,2) )
 
         else &
-        if (scal .eq. -1.e0) then
+        if (scal .eq. -1.e0_8) then
 
         cmat(1,1) = cmat(1,1) & 
              - ( amat(1,1) * bmat(1,1) &
@@ -210,7 +210,7 @@
 
     !-------------------------------- C = C + scal * A * B !
 
-        if (scal .eq. +1.e0) then
+        if (scal .eq. +1.e0_8) then
 
         cmat(1,1) = cmat(1,1) &
              + ( amat(1,1) * bmat(1,1) &
@@ -252,7 +252,7 @@
                + amat(3,3) * bmat(3,3) )
 
         else &
-        if (scal .eq. -1.e0) then
+        if (scal .eq. -1.e0_8) then
 
         cmat(1,1) = cmat(1,1) &
              - ( amat(1,1) * bmat(1,1) &
@@ -499,23 +499,23 @@
 
     !---------------------------------------- L = C * A^-1 !
 
-        lmat(1,1) = +0.e0
-        lmat(1,2) = +0.e0
-        lmat(2,1) = +0.e0
-        lmat(2,2) = +0.e0
+        lmat(1,1) = +0.e0_8
+        lmat(1,2) = +0.e0_8
+        lmat(2,1) = +0.e0_8
+        lmat(2,2) = +0.e0_8
 
         call mul_2x2(amat(3,1),adim,ainv,LDIM, &
-                    +1.e0,lmat,LDIM)
+                    +1.e0_8,lmat,LDIM)
         
     !---------------------------------------- U = A^-1 * B !       
 
-        umat(1,1) = +0.e0
-        umat(1,2) = +0.e0
-        umat(2,1) = +0.e0
-        umat(2,2) = +0.e0
+        umat(1,1) = +0.e0_8
+        umat(1,2) = +0.e0_8
+        umat(2,1) = +0.e0_8
+        umat(2,2) = +0.e0_8
  
         call mul_2x2(ainv,LDIM,amat(1,3),adim, &
-                    +1.e0,umat,LDIM)
+                    +1.e0_8,umat,LDIM)
         
     !-------------------------------- S = D - C * A^-1 * B !
 
@@ -525,7 +525,7 @@
         smat(2,2) = amat(4,4)
 
         call mul_2x2(lmat,LDIM,amat(1,3),adim, &
-                    -1.e0/adet,smat,LDIM)
+                    -1.e0_8/adet,smat,LDIM)
 
         call inv_2x2(smat,LDIM,sinv,LDIM,sdet)
 
@@ -640,33 +640,33 @@
 
     !---------------------------------------- L = C * A^-1 !
 
-        lmat(1,1) = +0.e0
-        lmat(1,2) = +0.e0
-        lmat(1,3) = +0.e0
-        lmat(2,1) = +0.e0
-        lmat(2,2) = +0.e0
-        lmat(2,3) = +0.e0
-        lmat(3,1) = +0.e0
-        lmat(3,2) = +0.e0
-        lmat(3,3) = +0.e0
+        lmat(1,1) = +0.e0_8
+        lmat(1,2) = +0.e0_8
+        lmat(1,3) = +0.e0_8
+        lmat(2,1) = +0.e0_8
+        lmat(2,2) = +0.e0_8
+        lmat(2,3) = +0.e0_8
+        lmat(3,1) = +0.e0_8
+        lmat(3,2) = +0.e0_8
+        lmat(3,3) = +0.e0_8
 
         call mul_3x3(amat(4,1),adim,ainv,LDIM, &
-                    +1.e0,lmat,LDIM)
+                    +1.e0_8,lmat,LDIM)
         
     !---------------------------------------- U = A^-1 * B !       
 
-        umat(1,1) = +0.e0
-        umat(1,2) = +0.e0
-        umat(1,3) = +0.e0
-        umat(2,1) = +0.e0
-        umat(2,2) = +0.e0
-        umat(2,3) = +0.e0
-        umat(3,1) = +0.e0
-        umat(3,2) = +0.e0
-        umat(3,3) = +0.e0
+        umat(1,1) = +0.e0_8
+        umat(1,2) = +0.e0_8
+        umat(1,3) = +0.e0_8
+        umat(2,1) = +0.e0_8
+        umat(2,2) = +0.e0_8
+        umat(2,3) = +0.e0_8
+        umat(3,1) = +0.e0_8
+        umat(3,2) = +0.e0_8
+        umat(3,3) = +0.e0_8
  
         call mul_3x3(ainv,LDIM,amat(1,4),adim, &
-                    +1.e0,umat,LDIM)
+                    +1.e0_8,umat,LDIM)
         
     !-------------------------------- S = D - C * A^-1 * B !
 
@@ -681,7 +681,7 @@
         smat(3,3) = amat(6,6)
 
         call mul_3x3(lmat,LDIM,amat(1,4),adim, &
-                    -1.e0/adet,smat,LDIM)
+                    -1.e0_8/adet,smat,LDIM)
 
         call inv_3x3(smat,LDIM,sinv,LDIM,sdet)
 
diff --git a/ext/PPR/src/oscl1d.h90 b/ext/PPR/src/oscl1d.h90
index 30f50982f55c0bb862f73334e0219a6102f4621a..178365709b2fe1245ff5ee2055fff8f3dd79802b 100644
--- a/ext/PPR/src/oscl1d.h90
+++ b/ext/PPR/src/oscl1d.h90
@@ -66,8 +66,8 @@
     !------------------------------- at least 3 grid-cells !
         do  ipos = +1, npos-1
         do  ivar = +1, nvar-0
-            oscl(1,ivar,ipos) = +0.e0
-            oscl(2,ivar,ipos) = +0.e0
+            oscl(1,ivar,ipos) = +0.e0_8
+            oscl(2,ivar,ipos) = +0.e0_8
         end do
         end do
         end if
@@ -143,25 +143,25 @@
         hhlc = hhll + hhcc
         hhmm = hhll + hhcc + hhrr
 
-        cmat(1,1) = -(hhcc+2.e0*hhrr)/(hhlc*hhmm)
+        cmat(1,1) = -(hhcc+2.e0_8*hhrr)/(hhlc*hhmm)
         cmat(1,2) = -(hhll-hhrr)* &
-        &          (3.e0*hhcc+2.e0*(hhll+hhrr))/&
+        &          (3.e0_8*hhcc+2.e0_8*(hhll+hhrr))/&
         &            (hhlc*hhrc*hhmm)
-        cmat(1,3) = +(hhcc+2.e0*hhll)/(hhrc*hhmm)
+        cmat(1,3) = +(hhcc+2.e0_8*hhll)/(hhrc*hhmm)
 
-        cmat(2,1) = +3.e0/(hhlc*hhmm)
-        cmat(2,2) = -3.e0*(2.e0*hhcc+hhll+hhrr)/&
+        cmat(2,1) = +3.e0_8/(hhlc*hhmm)
+        cmat(2,2) = -3.e0_8*(2.e0_8*hhcc+hhll+hhrr)/&
         &            (hhlc*hhrc*hhmm)
-        cmat(2,3) = +3.e0/(hhrc*hhmm)
+        cmat(2,3) = +3.e0_8/(hhrc*hhmm)
 
         do  ivar = 1, nvar
 
-            oscl(1,ivar,ipos) = +1.e0 * ( &
+            oscl(1,ivar,ipos) = +1.e0_8 * ( &
         & + cmat(1,1)*fdat(1,ivar,ipos-1) &
         & + cmat(1,2)*fdat(1,ivar,ipos+0) &
         & + cmat(1,3)*fdat(1,ivar,ipos+1) )
 
-            oscl(2,ivar,ipos) = +2.e0 * ( &
+            oscl(2,ivar,ipos) = +2.e0_8 * ( &
         & + cmat(2,1)*fdat(1,ivar,ipos-1) &
         & + cmat(2,2)*fdat(1,ivar,ipos+0) &
         & + cmat(2,3)*fdat(1,ivar,ipos+1) )
@@ -176,8 +176,8 @@
         hhcc = max(delx(head+1),dmin)
         hhrr = max(delx(head+2),dmin)
 
-        cmat(1,1) = -2.e0 / (hhll+hhcc)
-        cmat(1,2) = +2.e0 / (hhll+hhcc)
+        cmat(1,1) = -2.e0_8 / (hhll+hhcc)
+        cmat(1,2) = +2.e0_8 / (hhll+hhcc)
 
         do  ivar = 1, nvar
 
@@ -185,7 +185,7 @@
         & + cmat(1,1)*fdat(1,ivar,head+0) &
         & + cmat(1,2)*fdat(1,ivar,head+1)
              
-            oscl(2,ivar,head) = +0.e0
+            oscl(2,ivar,head) = +0.e0_8
 
         end do
 
@@ -195,8 +195,8 @@
         hhcc = max(delx(tail-1),dmin)
         hhrr = max(delx(tail-0),dmin)
 
-        cmat(1,2) = -2.e0 / (hhrr+hhcc)
-        cmat(1,3) = +2.e0 / (hhrr+hhcc)
+        cmat(1,2) = -2.e0_8 / (hhrr+hhcc)
+        cmat(1,3) = +2.e0_8 / (hhrr+hhcc)
 
         do  ivar = 1, nvar
 
@@ -204,7 +204,7 @@
         & + cmat(1,2)*fdat(1,ivar,tail-1) &
         & + cmat(1,3)*fdat(1,ivar,tail+0)
 
-            oscl(2,ivar,tail) = +0.e0
+            oscl(2,ivar,tail) = +0.e0_8
 
         end do
         
@@ -268,7 +268,7 @@
         & + .50d+0 * fdat(1,ivar,head+1) &
         & - .50d+0 * fdat(1,ivar,head+0)
         
-            oscl(2,ivar,head) = +0.e0
+            oscl(2,ivar,head) = +0.e0_8
 
         end do
 
@@ -280,7 +280,7 @@
         & + .50d+0 * fdat(1,ivar,tail+0) &
         & - .50d+0 * fdat(1,ivar,tail-1)
             
-            oscl(2,ivar,tail) = +0.e0
+            oscl(2,ivar,tail) = +0.e0_8
 
         end do
         
diff --git a/ext/PPR/src/p1e.h90 b/ext/PPR/src/p1e.h90
index 39b639357f49aceba928005a09220803a9a00830..467c3507f633ecdcadbe178ac532a353a7fad249 100644
--- a/ext/PPR/src/p1e.h90
+++ b/ext/PPR/src/p1e.h90
@@ -83,10 +83,10 @@
         do  ivar = 1,nvar
         
             edge(ivar,1) = fdat(1,ivar,1)
-            dfdx(ivar,1) = 0.e0
+            dfdx(ivar,1) = 0.e0_8
             
             edge(ivar,2) = fdat(1,ivar,1)
-            dfdx(ivar,2) = 0.e0
+            dfdx(ivar,2) = 0.e0_8
             
         end do
         end if
@@ -103,7 +103,7 @@
     
     !--------------- reconstruction: constant grid-spacing !
             
-            dd10 = delx(+1) * 2.e0
+            dd10 = delx(+1) * 2.e0_8
             
             do  ivar = +1, nvar
 
@@ -175,8 +175,8 @@
             edge(ivar,tail+1) = &
         &       fdat(+1,ivar,tail+0)
         
-            dfdx(ivar,head-1) = 0.e0
-            dfdx(ivar,tail+1) = 0.e0
+            dfdx(ivar,head-1) = 0.e0_8
+            dfdx(ivar,tail+1) = 0.e0_8
 
         end do
     
diff --git a/ext/PPR/src/p3e.h90 b/ext/PPR/src/p3e.h90
index 6becd63358c1a4c9d1538386b65f59e91d164aea..a651873433e6cfbbc90e9242501c086b4af7bb57 100644
--- a/ext/PPR/src/p3e.h90
+++ b/ext/PPR/src/p3e.h90
@@ -120,24 +120,24 @@
             do  ivar = 1, nvar
 
                 edge(ivar,ipos) = ( &
-        &     -      1.e0 * &
+        &     -      1.e0_8 * &
         &       fdat(1,ivar,ipos-2) &
-        &     +      7.e0 * &
+        &     +      7.e0_8 * &
         &       fdat(1,ivar,ipos-1) &
-        &     +      7.e0 * &
+        &     +      7.e0_8 * &
         &       fdat(1,ivar,ipos+0) &
-        &     -      1.e0 * &
-        &       fdat(1,ivar,ipos+1) ) / 12.e0
+        &     -      1.e0_8 * &
+        &       fdat(1,ivar,ipos+1) ) / 12.e0_8
             
                 dfdx(ivar,ipos) = ( &
-        &     +      1.e0 * &
+        &     +      1.e0_8 * &
         &       fdat(1,ivar,ipos-2) &
-        &     -     15.e0 * &
+        &     -     15.e0_8 * &
         &       fdat(1,ivar,ipos-1) &
-        &     +     15.e0 * &
+        &     +     15.e0_8 * &
         &       fdat(1,ivar,ipos+0) &
-        &     -      1.e0 * &
-        &       fdat(1,ivar,ipos+1) ) / 12.e0
+        &     -      1.e0_8 * &
+        &       fdat(1,ivar,ipos+1) ) / 12.e0_8
 
                 dfdx(ivar,ipos) = &
         &       dfdx(ivar,ipos) / delx(+1)
@@ -165,7 +165,7 @@
             xmap(-2) = -( delh(-2) &
         &              +  delh(-1) ) / xhat
             xmap(-1) = -  delh(-1)   / xhat
-            xmap(+0) = +  0.e0
+            xmap(+0) = +  0.e0_8
             xmap(+1) = +  delh(+0)   / xhat
             xmap(+2) = +( delh(+0) &
         &              +  delh(+1) ) / xhat
diff --git a/ext/PPR/src/p5e.h90 b/ext/PPR/src/p5e.h90
index fe4b446f7c1beec2e8a120c8902510a805d3c421..1e3f65fe93b366ec1d75b1948232e19474bc66a0 100644
--- a/ext/PPR/src/p5e.h90
+++ b/ext/PPR/src/p5e.h90
@@ -120,31 +120,31 @@
             do  ivar = 1, nvar
 
                 edge(ivar,ipos) = &
-        &     + ( 1.e0 / 60.e0) * & 
+        &     + ( 1.e0_8 / 60.e0_8) * & 
         &       fdat(1,ivar,ipos-3) &
-        &     - ( 8.e0 / 60.e0) * &
+        &     - ( 8.e0_8 / 60.e0_8) * &
         &       fdat(1,ivar,ipos-2) &
-        &     + (37.e0 / 60.e0) * &
+        &     + (37.e0_8 / 60.e0_8) * &
         &       fdat(1,ivar,ipos-1) &
-        &     + (37.e0 / 60.e0) * &
+        &     + (37.e0_8 / 60.e0_8) * &
         &       fdat(1,ivar,ipos+0) &
-        &     - ( 8.e0 / 60.e0) * &
+        &     - ( 8.e0_8 / 60.e0_8) * &
         &       fdat(1,ivar,ipos+1) &
-        &     + ( 1.e0 / 60.e0) * &
+        &     + ( 1.e0_8 / 60.e0_8) * &
         &       fdat(1,ivar,ipos+2)
             
                 dfdx(ivar,ipos) = &
-        &     - ( 1.e0 / 90.e0) * & 
+        &     - ( 1.e0_8 / 90.e0_8) * & 
         &       fdat(1,ivar,ipos-3) &
-        &     + ( 5.e0 / 36.e0) * &
+        &     + ( 5.e0_8 / 36.e0_8) * &
         &       fdat(1,ivar,ipos-2) &
-        &     - (49.e0 / 36.e0) * &
+        &     - (49.e0_8 / 36.e0_8) * &
         &       fdat(1,ivar,ipos-1) &
-        &     + (49.e0 / 36.e0) * &
+        &     + (49.e0_8 / 36.e0_8) * &
         &       fdat(1,ivar,ipos+0) &
-        &     - ( 5.e0 / 36.e0) * &
+        &     - ( 5.e0_8 / 36.e0_8) * &
         &       fdat(1,ivar,ipos+1) &
-        &     + ( 1.e0 / 90.e0) * &
+        &     + ( 1.e0_8 / 90.e0_8) * &
         &       fdat(1,ivar,ipos+2)
 
                 dfdx(ivar,ipos) = &
@@ -184,7 +184,7 @@
             xmap(-2) = -( delh(-2) &
         &              +  delh(-1) ) / xhat
             xmap(-1) = -  delh(-1)   / xhat
-            xmap(+0) = +  0.e0
+            xmap(+0) = +  0.e0_8
             xmap(+1) = +  delh(+0)   / xhat
             xmap(+2) = +( delh(+0) &
         &              +  delh(+1) ) / xhat
diff --git a/ext/PPR/src/pbc.h90 b/ext/PPR/src/pbc.h90
index 1d09e3a9bc810bec8824ca176c579f7117e94339..13debd46f9e7adc0162e57b36b5c8e920f473370 100644
--- a/ext/PPR/src/pbc.h90
+++ b/ext/PPR/src/pbc.h90
@@ -244,8 +244,8 @@
 
         xmap(-1) =-(delh(-1) + &
         &           delh(+0)*0.5d0)/xhat
-        xmap(+0) = -1.e0
-        xmap(+1) = +1.e0
+        xmap(+0) = -1.e0_8
+        xmap(+1) = +1.e0_8
         xmap(+2) = (delh(+1) + &
         &           delh(+0)*0.5d0)/xhat
 
@@ -453,7 +453,7 @@
         if (bcon(ivar)%bcopt.eq.bopt)  then
 
             eval(-1) = &
-        &   fdat(1,ivar,head-1) * 1.e0
+        &   fdat(1,ivar,head-1) * 1.e0_8
             eval(+0) = &
         &   fdat(1,ivar,head-1) * .5d0 + &
         &   fdat(1,ivar,head+0) * .5d0
@@ -575,8 +575,8 @@
 
         xmap(-1) =-(delh(-1) + &
         &           delh(+0)*0.5d0)/xhat
-        xmap(+0) = -1.e0
-        xmap(+1) = +1.e0
+        xmap(+0) = -1.e0_8
+        xmap(+1) = +1.e0_8
         xmap(+2) = (delh(+1) + &
         &           delh(+0)*0.5d0)/xhat
 
@@ -790,7 +790,7 @@
         &   fdat(1,ivar,tail+0) * .5d0 + &
         &   fdat(1,ivar,tail+1) * .5d0
             eval(+2) = &
-        &   fdat(1,ivar,tail+1) * 1.e0
+        &   fdat(1,ivar,tail+1) * 1.e0_8
    
             gval(+0) = &
         &   fdat(1,ivar,tail+0) * .5d0 - &
diff --git a/ext/PPR/src/ppm.h90 b/ext/PPR/src/ppm.h90
index f8158111cfd1c1e9b6a285e4ed357fe433e51124..923c80f956f0e3f296a11efca8380d84397127eb 100644
--- a/ext/PPR/src/ppm.h90
+++ b/ext/PPR/src/ppm.h90
@@ -94,8 +94,8 @@
         do  ivar = +1, nvar
             fhat(1,ivar,+1) = &
         &   fdat(1,ivar,+1)
-            fhat(2,ivar,+1) = 0.e0
-            fhat(3,ivar,+1) = 0.e0
+            fhat(2,ivar,+1) = 0.e0_8
+            fhat(3,ivar,+1) = 0.e0_8
         end do
         end if
 
@@ -275,8 +275,8 @@
             mono = +1
 
             lhat(1) = ff00
-            lhat(2) = 0.e0
-            lhat(3) = 0.e0
+            lhat(2) = 0.e0_8
+            lhat(3) = 0.e0_8
              
             return
               
diff --git a/ext/PPR/src/pqm.h90 b/ext/PPR/src/pqm.h90
index c834c3daa5886871c672841bd99239ce62c09ce2..19db6503c361f0e99950fb726fae12fa237cec60 100644
--- a/ext/PPR/src/pqm.h90
+++ b/ext/PPR/src/pqm.h90
@@ -99,10 +99,10 @@
     !----- default to reduced order if insufficient points !
         do  ivar = +1, nvar
             fhat(1,ivar,+1) = fdat(1,ivar,+1)
-            fhat(2,ivar,+1) = 0.e0
-            fhat(3,ivar,+1) = 0.e0
-            fhat(4,ivar,+1) = 0.e0
-            fhat(5,ivar,+1) = 0.e0
+            fhat(2,ivar,+1) = 0.e0_8
+            fhat(3,ivar,+1) = 0.e0_8
+            fhat(4,ivar,+1) = 0.e0_8
+            fhat(5,ivar,+1) = 0.e0_8
         end do
         end if
 
@@ -313,10 +313,10 @@
             mono = +1
 
             lhat(1) = ff00
-            lhat(2) = 0.e0
-            lhat(3) = 0.e0
-            lhat(4) = 0.e0
-            lhat(5) = 0.e0
+            lhat(2) = 0.e0_8
+            lhat(3) = 0.e0_8
+            lhat(4) = 0.e0_8
+            lhat(5) = 0.e0_8
              
             return
               
diff --git a/ext/PPR/src/rmap1d.h90 b/ext/PPR/src/rmap1d.h90
index fa3486e8b022199df66f9d71fb53aa52e3515c41..dc10cd74ee1530d390157a00135a916d2076ef52 100644
--- a/ext/PPR/src/rmap1d.h90
+++ b/ext/PPR/src/rmap1d.h90
@@ -244,8 +244,8 @@
 
     !------------------------------------- initializations !
 
-        vvlo(+1:+5) = 0.e0
-        vvhi(+1:+5) = 0.e0
+        vvlo(+1:+5) = 0.e0_8
+        vvhi(+1:+5) = 0.e0_8
 
     !------------- remap FDAT from XPOS to XNEW using FHAT !
 
@@ -285,7 +285,7 @@
             do  idof = +1,ndof
             do  ivar = +1,nvar
                 
-                fnew(idof,ivar,kpos) = 0.e0
+                fnew(idof,ivar,kpos) = 0.e0_8
             
             end do
             end do
@@ -374,7 +374,7 @@
     !   wrt. column-wise conservation. Use KBN approach to
     !   account for FP roundoff.
 
-        sdat = 0.e0; serr = 0.e0
+        sdat = 0.e0_8; serr = 0.e0_8
         do  ipos = +1, npos-1
         do  ivar = +1, nvar-0
         
@@ -407,7 +407,7 @@
 
         sdat =  sdat + serr
 
-        snew = 0.e0; serr = 0.e0
+        snew = 0.e0_8; serr = 0.e0_8
         do  ipos = +1, nnew-1
         do  ivar = +1, nvar-0
         
@@ -450,7 +450,7 @@
     
         do  ivar = +1, nvar-0
 
-            if (serr(ivar) .gt. 0.e0) then
+            if (serr(ivar) .gt. 0.e0_8) then
 
                 vmin = kmin(ivar)
 
@@ -459,7 +459,7 @@
         &  serr(ivar)/(xnew(vmin+1)-xnew(vmin+0))
 
             else &
-        &   if (serr(ivar) .lt. 0.e0) then
+        &   if (serr(ivar) .lt. 0.e0_8) then
 
                 vmax = kmax(ivar)
 
diff --git a/ext/PPR/src/util1d.h90 b/ext/PPR/src/util1d.h90
index 6b4353ba76ee5c76aaf0541e8f191770ba0ecfd1..10cd4c58c573e501145b647580300ee00ff85160 100644
--- a/ext/PPR/src/util1d.h90
+++ b/ext/PPR/src/util1d.h90
@@ -110,7 +110,7 @@
 
             call random_number (rand)
 
-            rand = 2.e0 * (rand-.5d0)
+            rand = 2.e0_8 * (rand-.5d0)
             
             move = rand *  move
 
diff --git a/ext/PPR/src/weno1d.h90 b/ext/PPR/src/weno1d.h90
index d74c76faa23d142eba27ced7929cb5dc4e017c46..e65272ee7e9fd89709fc53cf1d0cb05fa94e1ca7 100644
--- a/ext/PPR/src/weno1d.h90
+++ b/ext/PPR/src/weno1d.h90
@@ -111,7 +111,7 @@
         wsum = wval(1) + wval(2) + ZERO
         wval(1) = wval(1) / wsum
     !   wval(2) = wval(2) / wsum
-        wval(2) =-wval(1) + 1.e0 ! wval(2)/wsum but robust !
+        wval(2) =-wval(1) + 1.e0_8 ! wval(2)/wsum but robust !
 
         return
 
@@ -168,15 +168,15 @@
         
         if (ipos-halo.lt.head) then
         
-            omax = 1.e0 
-            omin = 0.e0 ; return
+            omax = 1.e0_8 
+            omin = 0.e0_8 ; return
         
         end if
         
         if (ipos+halo.gt.tail) then
             
-            omax = 1.e0 
-            omin = 0.e0 ; return
+            omax = 1.e0_8 
+            omin = 0.e0_8 ; return
         
         end if
 
@@ -203,7 +203,7 @@
       
     !---------------------------------------- "lower" part !
       
-        delh = 0.e0
+        delh = 0.e0_8
 
         do  hpos = ipos-1, imin, -1
         
@@ -235,7 +235,7 @@
       
     !---------------------------------------- "upper" part !     
       
-        delh = 0.e0
+        delh = 0.e0_8
         
         do  hpos = ipos+1, imax, +1
         
@@ -319,15 +319,15 @@
         
         if (ipos-halo.lt.head) then
         
-            omax = 1.e0 
-            omin = 0.e0 ; return
+            omax = 1.e0_8 
+            omin = 0.e0_8 ; return
         
         end if
         
         if (ipos+halo.gt.tail) then
             
-            omax = 1.e0 
-            omin = 0.e0 ; return
+            omax = 1.e0_8 
+            omin = 0.e0_8 ; return
         
         end if
 
@@ -343,21 +343,21 @@
         dfx1 = oscl(1,ivar,ipos)
         dfx2 = oscl(2,ivar,ipos)
       
-        oval = (2.e0**1*dfx1)**2 &
-        &    + (2.e0**2*dfx2)**2
+        oval = (2.e0_8**1*dfx1)**2 &
+        &    + (2.e0_8**2*dfx2)**2
       
         omin = oval
         omax = oval
       
     !---------------------------------------- "lower" part !
       
-        delh = 0.e0
+        delh = 0.e0_8
 
         do  hpos = ipos-1, imin, -1
         
     !------------------ calc. derivatives centred on IPOS. !     
 
-        delh = delh + 2.e0
+        delh = delh + 2.e0_8
         
         dfx1 = oscl(1,ivar,hpos)
         dfx2 = oscl(2,ivar,hpos)
@@ -366,8 +366,8 @@
 
     !------------------ indicator: NORM(H^N * D^N/DX^N(F)) !
 
-        oval = (2.e0**1*dfx1)**2 &
-    &        + (2.e0**2*dfx2)**2
+        oval = (2.e0_8**1*dfx1)**2 &
+    &        + (2.e0_8**2*dfx2)**2
 
         if (oval .lt. omin) then
             omin = oval 
@@ -380,13 +380,13 @@
       
     !---------------------------------------- "upper" part !     
       
-        delh = 0.e0
+        delh = 0.e0_8
         
         do  hpos = ipos+1, imax, +1
         
     !------------------ calc. derivatives centred on IPOS. !     
 
-        delh = delh - 2.e0
+        delh = delh - 2.e0_8
         
         dfx1 = oscl(1,ivar,hpos)
         dfx2 = oscl(2,ivar,hpos)
@@ -395,8 +395,8 @@
     
     !------------------ indicator: NORM(H^N * D^N/DX^N(F)) !
 
-        oval = (2.e0**1*dfx1)**2 &
-    &        + (2.e0**2*dfx2)**2
+        oval = (2.e0_8**1*dfx1)**2 &
+    &        + (2.e0_8**2*dfx2)**2
   
         if (oval .lt. omin) then
             omin = oval 
diff --git a/src/ICE/icedyn_adv_umx.F90 b/src/ICE/icedyn_adv_umx.F90
index 2aa6a5eb7983c14b9485aeee34b4f18d4d70b41c..755c002cb80be72346220f854dc0c99ce8d5d8ae 100644
--- a/src/ICE/icedyn_adv_umx.F90
+++ b/src/ICE/icedyn_adv_umx.F90
@@ -1165,7 +1165,7 @@ CONTAINS
       REAL(wp), DIMENSION(jpi,jpj    ) :: zbup, zbdo
       REAL(wp), DIMENSION(jpi,jpj,jpl) :: zbetup, zbetdo, zti_ups, ztj_ups
       !!----------------------------------------------------------------------
-      zbig = 1.e+40_wp
+      zbig = 1.e+20_wp   ! works ok with simple/double precison
 
       ! antidiffusive flux : high order minus low order
       ! --------------------------------------------------
diff --git a/src/ICE/icedyn_rhg_vp.F90 b/src/ICE/icedyn_rhg_vp.F90
index 3486e77cd349c835d0f38f6c419b60cbe2f05ea9..81e636c94cb2f2aa859823483b90591d3b938bda 100644
--- a/src/ICE/icedyn_rhg_vp.F90
+++ b/src/ICE/icedyn_rhg_vp.F90
@@ -1124,7 +1124,7 @@ CONTAINS
 
          END_2D
 
-!!$         CALL lbc_lnk( 'icedyn_rhg_vp', zs1, 'T', 1., zs2, 'T', 1., zs12, 'T', 1. )
+!!$         CALL lbc_lnk( 'icedyn_rhg_vp', zs1, 'T', 1._wp, zs2, 'T', 1._wp, zs12, 'T', 1._wp )
       
       ENDIF
       
@@ -1141,7 +1141,7 @@ CONTAINS
                
          END_2D
 
-         CALL lbc_lnk( 'icedyn_rhg_vp', zs12f, 'F', 1. )
+         CALL lbc_lnk( 'icedyn_rhg_vp', zs12f, 'F', 1._wp )
          
       ENDIF
       
@@ -1178,8 +1178,8 @@ CONTAINS
             
          END_2D
          !
-         CALL lbc_lnk( 'icedyn_rhg_vp', ztaux_oi, 'U', -1., ztauy_oi, 'V', -1., ztaux_ai, 'U', -1., ztauy_ai, 'V', -1. ) !, &
-!            &                          ztaux_bi, 'U', -1., ztauy_bi, 'V', -1. )
+         CALL lbc_lnk( 'icedyn_rhg_vp', ztaux_oi, 'U', -1._wp, ztauy_oi, 'V', -1._wp, ztaux_ai, 'U', -1._wp, ztauy_ai, 'V', -1._wp ) !, &
+!            &                          ztaux_bi, 'U', -1._wp, ztauy_bi, 'V', -1._wp )
          !
          CALL iom_put( 'utau_oi' , ztaux_oi * zmsk00 )
          CALL iom_put( 'vtau_oi' , ztauy_oi * zmsk00 )
@@ -1209,7 +1209,7 @@ CONTAINS
             zsig_II(ji,jj)   =   0.5_wp * SQRT ( zs2(ji,jj) * zs2(ji,jj) + 4. * zs12(ji,jj) * zs12(ji,jj) )
          END_2D
 
-!!$         CALL lbc_lnk( 'icedyn_rhg_vp', zsig_I, 'T', 1., zsig_II, 'T', 1.)
+!!$         CALL lbc_lnk( 'icedyn_rhg_vp', zsig_I, 'T', 1._wp, zsig_II, 'T', 1._wp)
          
          IF( iom_use('normstr') )   CALL iom_put( 'normstr' ,   zsig_I(:,:)  * zmsk00(:,:) ) ! Normal stress
          IF( iom_use('sheastr') )   CALL iom_put( 'sheastr' ,   zsig_II(:,:) * zmsk00(:,:) ) ! Maximum shear stress
@@ -1250,7 +1250,7 @@ CONTAINS
                
          END_2D
          !
-         ! CALL lbc_lnk( 'icedyn_rhg_vp', zsig1_p, 'T', 1., zsig2_p, 'T', 1.)
+         ! CALL lbc_lnk( 'icedyn_rhg_vp', zsig1_p, 'T', 1._wp, zsig2_p, 'T', 1._wp)
          !
          CALL iom_put( 'sig1_pnorm' , zsig1_p ) 
          CALL iom_put( 'sig2_pnorm' , zsig2_p ) 
@@ -1274,8 +1274,8 @@ CONTAINS
                            &             + zmf(ji,jj+1) * ( e2u(ji,jj+1) * u_ice(ji,jj+1) + e2u(ji-1,jj+1) * u_ice(ji-1,jj+1) ) )
          END_2D
          !
-         CALL lbc_lnk( 'icedyn_rhg_vp', zspgU, 'U', -1., zspgV, 'V', -1., &
-            &                           zCorU, 'U', -1., zCorV, 'V', -1. )
+         CALL lbc_lnk( 'icedyn_rhg_vp', zspgU, 'U', -1._wp, zspgV, 'V', -1._wp, &
+            &                           zCorU, 'U', -1._wp, zCorV, 'V', -1._wp )
          !
          CALL iom_put( 'dssh_dx' , zspgU * zmsk00 )   ! Sea-surface tilt term in force balance (x)
          CALL iom_put( 'dssh_dy' , zspgV * zmsk00 )   ! Sea-surface tilt term in force balance (y)
@@ -1305,7 +1305,7 @@ CONTAINS
 
          END_2D
             
-         CALL lbc_lnk( 'icedyn_rhg_vp', zfU, 'U', -1., zfV, 'V', -1. )
+         CALL lbc_lnk( 'icedyn_rhg_vp', zfU, 'U', -1._wp, zfV, 'V', -1._wp )
          
          CALL iom_put( 'intstrx' , zfU   * zmsk00 )   ! Internal force term in force balance (x)
          CALL iom_put( 'intstry' , zfV   * zmsk00 )   ! Internal force term in force balance (y)
@@ -1335,9 +1335,9 @@ CONTAINS
 
          END_2D
          
-         CALL lbc_lnk( 'icedyn_rhg_vp', zdiag_xmtrp_ice, 'U', -1., zdiag_ymtrp_ice, 'V', -1., &
-            &                           zdiag_xmtrp_snw, 'U', -1., zdiag_ymtrp_snw, 'V', -1., &
-            &                           zdiag_xatrp    , 'U', -1., zdiag_yatrp    , 'V', -1. )
+         CALL lbc_lnk( 'icedyn_rhg_vp', zdiag_xmtrp_ice, 'U', -1._wp, zdiag_ymtrp_ice, 'V', -1._wp, &
+            &                           zdiag_xmtrp_snw, 'U', -1._wp, zdiag_ymtrp_snw, 'V', -1._wp, &
+            &                           zdiag_xatrp    , 'U', -1._wp, zdiag_yatrp    , 'V', -1._wp )
 
          CALL iom_put( 'xmtrpice' , zdiag_xmtrp_ice )   ! X-component of sea-ice mass transport (kg/s)
          CALL iom_put( 'ymtrpice' , zdiag_ymtrp_ice )   ! Y-component of sea-ice mass transport 
@@ -1628,7 +1628,7 @@ CONTAINS
                pvel_res(ji,jj) = 0.25_wp * ( ( zu_res(ji-1,jj) + zu_res(ji,jj) ) + ( zv_res(ji,jj-1) + zv_res(ji,jj) ) )
          
          END_2D
-         CALL lbc_lnk( 'icedyn_rhg_cvg_vp', pvel_res, 'T', 1. )
+         CALL lbc_lnk( 'icedyn_rhg_cvg_vp', pvel_res, 'T', 1._wp )
 
       ELSE
 
diff --git a/src/ICE/icethd.F90 b/src/ICE/icethd.F90
index ddc4ddf2b6fdce2307bbf7f398c74e17f34c0b17..8408ab9891c9e055cb94a327629ef66a588e2461 100644
--- a/src/ICE/icethd.F90
+++ b/src/ICE/icethd.F90
@@ -345,11 +345,22 @@ CONTAINS
          CALL tab_2d_1d( npti, nptidx(1:npti), oa_i_1d(1:npti), oa_i(:,:,kl) )
          !
          ! --- Change units of e_i, e_s from J/m2 to J/m3 --- !
+         ! Here we make sure that we don't divide by very small, but physically
+         ! meaningless, products of sea ice thicknesses/snow depths and sea ice
+         ! concentration
          DO jk = 1, nlay_i
-            WHERE( h_i_1d(1:npti)>0._wp ) e_i_1d(1:npti,jk) = e_i_1d(1:npti,jk) / (h_i_1d(1:npti) * a_i_1d(1:npti)) * nlay_i
+            WHERE( (h_i_1d(1:npti) * a_i_1d(1:npti)) > epsi20 )
+               e_i_1d(1:npti,jk) = e_i_1d(1:npti,jk) / (h_i_1d(1:npti) * a_i_1d(1:npti)) * nlay_i
+            ELSEWHERE
+               e_i_1d(1:npti,jk) = 0._wp
+            ENDWHERE
          END DO
          DO jk = 1, nlay_s
-            WHERE( h_s_1d(1:npti)>0._wp ) e_s_1d(1:npti,jk) = e_s_1d(1:npti,jk) / (h_s_1d(1:npti) * a_i_1d(1:npti)) * nlay_s
+            WHERE( (h_s_1d(1:npti) * a_i_1d(1:npti)) > epsi20 )
+               e_s_1d(1:npti,jk) = e_s_1d(1:npti,jk) / (h_s_1d(1:npti) * a_i_1d(1:npti)) * nlay_s
+            ELSEWHERE
+               e_s_1d(1:npti,jk) = 0._wp
+            ENDWHERE
          END DO
          !
          !                 !---------------------!
diff --git a/src/NST/vremap.F90 b/src/NST/vremap.F90
index 6e3853bff00e1117653109e5c839ae2d31aab04e..a16b1f83d21dd9e6666c5ebe9f6e0faf26b9c0fb 100644
--- a/src/NST/vremap.F90
+++ b/src/NST/vremap.F90
@@ -292,8 +292,8 @@ CONTAINS
       !
       INTEGER, PARAMETER :: ndof = 1
       INTEGER  :: jk, jn
-      REAL(wp) ::  zwin(kjpk_in+1) ,  ztin(ndof, kn_var, kjpk_in)
-      REAL(wp) :: zwout(kjpk_out+1), ztout(ndof, kn_var, kjpk_out)
+      REAL(dp) ::  zwin(kjpk_in+1) ,  ztin(ndof, kn_var, kjpk_in)    ! rmap1d uses dp
+      REAL(dp) :: zwout(kjpk_out+1), ztout(ndof, kn_var, kjpk_out)   ! rmap1d uses dp
       TYPE(rmap_work) :: work
       TYPE(rmap_opts) :: opts
       TYPE(rcon_ends) :: bc_l(kn_var)
diff --git a/src/OCE/DOM/domzgr.F90 b/src/OCE/DOM/domzgr.F90
index a151f2f46ab25b4a05bfdbe81b034e5a5d32f0b5..9029c88e79b3b0c632127c5457550a0b69de71df 100644
--- a/src/OCE/DOM/domzgr.F90
+++ b/src/OCE/DOM/domzgr.F90
@@ -293,7 +293,7 @@ CALL FLUSH(numout)
       IF( .NOT. ( l_Jperio .OR. l_NFold ) ) THEN                   ! N closed:
          zmsk(:,mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)  ) = 0._wp   ! last    line of inner global domain at 0
       ENDIF
-      CALL lbc_lnk( 'usrdef_zgr', zmsk, 'T', 1. )             ! set halos
+      CALL lbc_lnk( 'usrdef_zgr', zmsk, 'T', 1._wp )             ! set halos
       k_top(:,:) = k_top(:,:) * NINT( zmsk(:,:) )
       !
       ! Any closed seas (defined by closea_mask > 0 in domain_cfg file) to be filled 
diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index 6244df8c386c83acc0df99ac11ce873ba98783d7..382e158778991789c23b4adb1d0ab732ad4e975e 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -363,6 +363,7 @@ CONTAINS
       CHARACTER(LEN=nf90_max_name), ALLOCATABLE  :: indimnames(:)
       CHARACTER(LEN=nf90_max_name)               :: dimname, varname
       INTEGER                                    :: iln
+      INTEGER                                    :: iprec
       CHARACTER(LEN=lc)                          :: fname
       LOGICAL                                    :: lmeta
 !metadata in restart file for restart read with XIOS
@@ -385,7 +386,7 @@ CONTAINS
       clinfo = '          iom_set_vars_active, file: '//TRIM(iom_file(idnum)%name)
 
       iln = INDEX( iom_file(idnum)%name, '.nc' )
-!XIOS doee not need .nc
+!XIOS does not need .nc
       IF(iln > 0) THEN
         fname =  iom_file(idnum)%name(1:iln-1)
       ELSE
@@ -419,29 +420,33 @@ CONTAINS
          ENDDO
          IF(.NOT.lmeta) THEN
             CALL xios_add_child(file_hdl, field_hdl, varname)
-            mdims = ndims
 
-            IF(ANY(dimids(1:ndims) == unlimitedDimId)) THEN
-               mdims = mdims - 1
+            IF(     xtype == NF90_FLOAT  ) THEN   ;   iprec = sp
+            ELSEIF( xtype == NF90_DOUBLE ) THEN   ;   iprec = dp
+            ELSE
+               WRITE(ctmp1,*) 'iom_set_vars_active: variable ', TRIM(varname) ,' wrong type : ', xtype
+               CALL ctl_stop( 'iom_set_vars_active:', ctmp1 )
             ENDIF
+               
+            mdims = ndims - COUNT( (/ ANY(dimids(1:ndims) == unlimitedDimId) /) )
 
-            IF(mdims == 3) THEN
-               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname,   &
-                                   domain_ref="grid_N",                           &
-                                   axis_ref=iom_axis(indimlens(dimids(mdims))),   &
-                                   prec = 8, operation = "instant"                )
+            IF(    mdims == 3) THEN
+               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, &
+                                   domain_ref="grid_N",                         &
+                                   axis_ref=iom_axis(indimlens(dimids(mdims))), &
+                                   prec = iprec, operation = "instant"          )
             ELSEIF(mdims == 2) THEN
-               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname,  &
-                                   domain_ref="grid_N", prec = 8,                &
-                                   operation = "instant"                         )
+               CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, &
+                                   domain_ref="grid_N",                         &
+                                   prec = iprec, operation = "instant"          )
             ELSEIF(mdims == 1) THEN
                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, &
                                    axis_ref=iom_axis(indimlens(dimids(mdims))), &
-                                   prec = 8, operation = "instant"              )
+                                   prec = iprec, operation = "instant"          )
             ELSEIF(mdims == 0) THEN
                CALL xios_set_attr (field_hdl, enabled = .TRUE., name = varname, &
-                                   scalar_ref = "grid_scalar", prec = 8,        &
-                                   operation = "instant"                        )
+                                   scalar_ref = "grid_scalar",                  &
+                                   prec = iprec, operation = "instant"          )
             ELSE
                WRITE(ctmp1,*) 'iom_set_vars_active: variable ', TRIM(varname) ,' incorrect number of dimensions'
                CALL ctl_stop( 'iom_set_vars_active:', ctmp1 )
@@ -534,40 +539,40 @@ CONTAINS
          CALL ctl_stop(ctmp1, ctmp2)
       ENDIF
 
-      IF(PRESENT(rd3)) THEN
+      IF(    PRESENT(rd3)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
                              domain_ref = "grid_N"//TRIM(clgsuf),           &
                              axis_ref = iom_axis(size(rd3, 3)),             &
-                             prec = 8, operation = "instant"                )
+                             prec = dp, operation = "instant"               )
       ELSEIF(PRESENT(rs3)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
                              domain_ref = "grid_N"//TRIM(clgsuf),           &
                              axis_ref = iom_axis(size(rd3, 3)),             &
-                             prec = 4, operation = "instant"                )
+                             prec = sp, operation = "instant"               )
       ELSEIF(PRESENT(rd2)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
-                             domain_ref = "grid_N"//TRIM(clgsuf), prec = 8, &
-                             operation = "instant"                          )
+                             domain_ref = "grid_N"//TRIM(clgsuf),           &
+                             prec = dp, operation = "instant"               )
       ELSEIF(PRESENT(rs2)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
-                             domain_ref = "grid_N"//TRIM(clgsuf), prec = 4, &
-                             operation = "instant"                          )
+                             domain_ref = "grid_N"//TRIM(clgsuf),           &
+                             prec = sp, operation = "instant"               )
       ELSEIF(PRESENT(rd1)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
                              axis_ref = iom_axis(size(rd1, 1)),             &
-                             prec = 8, operation = "instant"                )
+                             prec = dp, operation = "instant"               )
       ELSEIF(PRESENT(rs1)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
                              axis_ref = iom_axis(size(rd1, 1)),             &
-                             prec = 4, operation = "instant"                )
+                             prec = sp, operation = "instant"               )
       ELSEIF(PRESENT(rd0)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
-                             scalar_ref = "grid_scalar", prec = 8,          &
-                             operation = "instant"                          )
+                             scalar_ref = "grid_scalar",                    &
+                             prec = dp, operation = "instant"               )
       ELSEIF(PRESENT(rs0)) THEN
          CALL xios_set_attr (field_hdl, enabled = .TRUE., name = sdfield,   &
-                             scalar_ref = "grid_scalar", prec = 4,          &
-                             operation = "instant"                          )
+                             scalar_ref = "grid_scalar",                    &
+                             prec = sp, operation = "instant"               )
       ENDIF
 #endif
    END SUBROUTINE iom_set_rstw_active
@@ -1077,19 +1082,13 @@ CONTAINS
       INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read
       CHARACTER(len=*), INTENT(in   )                         ::   cdvar     ! Name of the variable
       REAL(sp)        , INTENT(  out), DIMENSION(:)           ::   pvar      ! read field
-      REAL(dp)        , ALLOCATABLE  , DIMENSION(:)           ::   ztmp_pvar ! tmp var to read field
       INTEGER         , INTENT(in   )              , OPTIONAL ::   ktime     ! record number
       INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kstart    ! start axis position of the reading
       INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) THEN
-            ALLOCATE(ztmp_pvar(size(pvar,1)))
-            CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=ztmp_pvar,   &
-              &                                                     ktime=ktime, kstart=kstart, kcount=kcount )
-            pvar = ztmp_pvar
-            DEALLOCATE(ztmp_pvar)
-         END IF
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvsp1d = pvar,   &
+               &                                            ktime = ktime, kstart = kstart, kcount = kcount )
       ENDIF
    END SUBROUTINE iom_g1d_sp
 
@@ -1104,8 +1103,8 @@ CONTAINS
       INTEGER         , INTENT(in   ), DIMENSION(1), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom       , cdvar        , pv_r1d=pvar,   &
-              &                                                     ktime=ktime, kstart=kstart, kcount=kcount)
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvdp1d = pvar,   &
+            &                                               ktime = ktime, kstart = kstart, kcount = kcount)
       ENDIF
    END SUBROUTINE iom_g1d_dp
 
@@ -1114,23 +1113,17 @@ CONTAINS
       INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read
       CHARACTER(len=*), INTENT(in   )                         ::   cdvar     ! Name of the variable
       REAL(sp)        , INTENT(  out), DIMENSION(:,:)         ::   pvar      ! read field
-      REAL(dp)        , ALLOCATABLE  , DIMENSION(:,:)         ::   ztmp_pvar ! tmp var to read field
       INTEGER         , INTENT(in   )              , OPTIONAL ::   ktime     ! record number
       CHARACTER(len=1), INTENT(in   )              , OPTIONAL ::   cd_type   ! nature of grid-points (T, U, V, F, W)
-      REAL(dp)        , INTENT(in   )              , OPTIONAL ::   psgn      ! -1.(1.): (not) change sign across the north fold
+      REAL(sp)        , INTENT(in   )              , OPTIONAL ::   psgn      ! -1.(1.): (not) change sign across the north fold
       INTEGER         , INTENT(in   )              , OPTIONAL ::   kfill     ! value of kfillmode in lbc_lbk
       INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kstart    ! start axis position of the reading
       INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) THEN
-            ALLOCATE(ztmp_pvar(size(pvar,1), size(pvar,2)))
-            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r2d = ztmp_pvar  , ktime = ktime,   &
-             &                                                      cd_type = cd_type, psgn   = psgn  , kfill = kfill,   &
-             &                                                      kstart  = kstart , kcount = kcount  )
-            pvar = ztmp_pvar
-            DEALLOCATE(ztmp_pvar)
-         ENDIF
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvsp2d = pvar,                 &
+            &                                               cd_type = cd_type, psgn_sp = psgn, kfill = kfill,   &
+            &                                               ktime = ktime, kstart = kstart, kcount = kcount )
       ENDIF
    END SUBROUTINE iom_g2d_sp
 
@@ -1147,9 +1140,9 @@ CONTAINS
       INTEGER         , INTENT(in   ), DIMENSION(2), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r2d = pvar  , ktime = ktime,   &
-            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   &
-            &                                                       kstart  = kstart , kcount = kcount                )
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvdp2d = pvar,                 &
+            &                                               cd_type = cd_type, psgn_dp = psgn, kfill = kfill,   &
+            &                                               ktime = ktime, kstart = kstart, kcount = kcount )
       ENDIF
    END SUBROUTINE iom_g2d_dp
 
@@ -1158,23 +1151,17 @@ CONTAINS
       INTEGER         , INTENT(in   )                         ::   kdom      ! Type of domain to be read
       CHARACTER(len=*), INTENT(in   )                         ::   cdvar     ! Name of the variable
       REAL(sp)        , INTENT(  out), DIMENSION(:,:,:)       ::   pvar      ! read field
-      REAL(dp)        , ALLOCATABLE  , DIMENSION(:,:,:)       ::   ztmp_pvar ! tmp var to read field
       INTEGER         , INTENT(in   )              , OPTIONAL ::   ktime     ! record number
       CHARACTER(len=1), INTENT(in   )              , OPTIONAL ::   cd_type   ! nature of grid-points (T, U, V, F, W)
-      REAL(dp)        , INTENT(in   )              , OPTIONAL ::   psgn      ! -1.(1.) : (not) change sign across the north fold
+      REAL(sp)        , INTENT(in   )              , OPTIONAL ::   psgn      ! -1.(1.) : (not) change sign across the north fold
       INTEGER         , INTENT(in   )              , OPTIONAL ::   kfill     ! value of kfillmode in lbc_lbk
       INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kstart    ! start axis position of the reading
       INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) THEN
-            ALLOCATE(ztmp_pvar(size(pvar,1), size(pvar,2), size(pvar,3)))
-            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r3d = ztmp_pvar  , ktime = ktime,   &
-            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   &
-            &                                                       kstart  = kstart , kcount = kcount                )
-            pvar = ztmp_pvar
-            DEALLOCATE(ztmp_pvar)
-         END IF
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvsp3d = pvar,                 &
+            &                                               cd_type = cd_type, psgn_sp = psgn, kfill = kfill,   &
+            &                                               ktime = ktime, kstart = kstart, kcount = kcount )
       ENDIF
    END SUBROUTINE iom_g3d_sp
 
@@ -1191,18 +1178,16 @@ CONTAINS
       INTEGER         , INTENT(in   ), DIMENSION(3), OPTIONAL ::   kcount    ! number of points in each axis
       !
       IF( kiomid > 0 ) THEN
-         IF( iom_file(kiomid)%nfid > 0 ) THEN
-            CALL iom_get_123d( kiomid, kdom, cdvar      , pv_r3d = pvar  , ktime = ktime,   &
-            &                                                       cd_type = cd_type, psgn   = psgn  , kfill = kfill,   &
-            &                                                       kstart  = kstart , kcount = kcount                )
-         END IF
+         IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom, cdvar, pvdp3d = pvar,                 &
+            &                                               cd_type = cd_type, psgn_dp = psgn, kfill = kfill,   &
+            &                                               ktime = ktime, kstart = kstart, kcount = kcount )
       ENDIF
    END SUBROUTINE iom_g3d_dp
 
    !!----------------------------------------------------------------------
 
-   SUBROUTINE iom_get_123d( kiomid , kdom, cdvar, pv_r1d, pv_r2d, pv_r3d, ktime ,   &
-         &                  cd_type, psgn, kfill, kstart, kcount )
+   SUBROUTINE iom_get_123d( kiomid , kdom, cdvar, pvsp1d, pvsp2d, pvsp3d, pvdp1d, pvdp2d, pvdp3d,   &
+         &                  ktime , cd_type, psgn_sp, psgn_dp, kfill, kstart, kcount )
       !!-----------------------------------------------------------------------
       !!                  ***  ROUTINE  iom_get_123d  ***
       !!
@@ -1213,12 +1198,16 @@ CONTAINS
       INTEGER                    , INTENT(in   )           ::   kiomid    ! Identifier of the file
       INTEGER                    , INTENT(in   )           ::   kdom      ! Type of domain to be read
       CHARACTER(len=*)           , INTENT(in   )           ::   cdvar     ! Name of the variable
-      REAL(dp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d    ! read field (1D case)
-      REAL(dp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d    ! read field (2D case)
-      REAL(dp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pv_r3d    ! read field (3D case)
+      REAL(sp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pvsp1d    ! read field (1D case), single precision
+      REAL(sp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pvsp2d    ! read field (2D case), single precision
+      REAL(sp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pvsp3d    ! read field (3D case), single precision
+      REAL(dp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pvdp1d    ! read field (1D case), double precision
+      REAL(dp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pvdp2d    ! read field (2D case), double precision
+      REAL(dp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pvdp3d    ! read field (3D case), double precision
       INTEGER                    , INTENT(in   ), OPTIONAL ::   ktime     ! record number
       CHARACTER(len=1)           , INTENT(in   ), OPTIONAL ::   cd_type   ! nature of grid-points (T, U, V, F, W)
-      REAL(dp)                   , INTENT(in   ), OPTIONAL ::   psgn      ! -1.(1.) : (not) change sign across the north fold
+      REAL(sp)                   , INTENT(in   ), OPTIONAL ::   psgn_sp   ! -1.(1.) : (not) change sign across the north fold
+      REAL(dp)                   , INTENT(in   ), OPTIONAL ::   psgn_dp   ! -1.(1.) : (not) change sign across the north fold
       INTEGER                    , INTENT(in   ), OPTIONAL ::   kfill     ! value of kfillmode in lbc_lbk
       INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kstart    ! start position of the reading in each axis
       INTEGER , DIMENSION(:)     , INTENT(in   ), OPTIONAL ::   kcount    ! number of points to be read in each axis
@@ -1240,35 +1229,38 @@ CONTAINS
       INTEGER, DIMENSION(jpmax_dims) ::   icnt        ! number of value to read along each axis
       INTEGER, DIMENSION(jpmax_dims) ::   idimsz      ! size of the dimensions of the variable
       INTEGER, DIMENSION(jpmax_dims) ::   ishape      ! size of the dimensions of the variable
-      REAL(dp)                       ::   zscf, zofs  ! sacle_factor and add_offset
-      REAL(wp)                       ::   zsgn        ! local value of psgn
+      REAL(sp)                       ::   zscf_sp, zofs_sp  ! sacle_factor and add_offset, single precision
+      REAL(dp)                       ::   zscf_dp, zofs_dp  ! sacle_factor and add_offset, double precision
+      REAL(sp)                       ::   zsgn_sp     ! local value of psgn, single precision
+      REAL(dp)                       ::   zsgn_dp     ! local value of psgn, double precision
       INTEGER                        ::   itmp        ! temporary integer
       CHARACTER(LEN=256)             ::   clinfo      ! info character
       CHARACTER(LEN=256)             ::   clname      ! file name
       CHARACTER(LEN=1)               ::   clrankpv, cldmspc      !
       CHARACTER(LEN=1)               ::   cl_type     ! local value of cd_type
       LOGICAL                        ::   ll_only3rd  ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension.
+      LOGICAL                        ::   llis1d, llis2d, llis3d
+      LOGICAL                        ::   llsp        ! use single precision
       INTEGER                        ::   inlev       ! number of levels for 3D data
-      REAL(dp)                       ::   gma, gmi
       REAL(dp), DIMENSION(:,:),   ALLOCATABLE  ::   zwrk2d  ! temporary arrays for reading into an array
       REAL(dp), DIMENSION(:,:,:), ALLOCATABLE  ::   zwrk3d  ! smaller than jpi-jpj (XIOS only)
       !---------------------------------------------------------------------
       CHARACTER(LEN=lc)                               ::   context
       !
       CALL set_xios_context(kiomid, context)
-      ! Array shape information
-      inlev = -1
-      IF( PRESENT(pv_r1d) ) THEN
-         irankpv = 1
-         ishape(1:1) = SHAPE(pv_r1d)
-      ELSE IF( PRESENT(pv_r2d) ) THEN
-         irankpv = 2
-         ishape(1:2) = SHAPE(pv_r2d)
-      ELSE IF( PRESENT(pv_r3d) ) THEN
-         irankpv = 3
-         ishape(1:3) = SHAPE(pv_r3d)
-         inlev = ishape(3)
+      !
+      llsp = PRESENT(pvsp1d) .OR. PRESENT(pvsp2d) .OR. PRESENT(pvsp3d)
+      IF( llsp ) THEN 
+         llis1d = PRESENT(pvsp1d)   ;   IF( llis1d )   ishape(1:1) = SHAPE(pvsp1d)
+         llis2d = PRESENT(pvsp2d)   ;   IF( llis2d )   ishape(1:2) = SHAPE(pvsp2d)
+         llis3d = PRESENT(pvsp3d)   ;   IF( llis3d )   ishape(1:3) = SHAPE(pvsp3d)
+      ELSE
+         llis1d = PRESENT(pvdp1d)   ;   IF( llis1d )   ishape(1:1) = SHAPE(pvdp1d)
+         llis2d = PRESENT(pvdp2d)   ;   IF( llis2d )   ishape(1:2) = SHAPE(pvdp2d)
+         llis3d = PRESENT(pvdp3d)   ;   IF( llis3d )   ishape(1:3) = SHAPE(pvdp3d)
       ENDIF
+      inlev = -1
+      IF( llis3d )   inlev = ishape(3)
       !
       idom = kdom
       istop = nstop
@@ -1301,7 +1293,9 @@ CONTAINS
                ! else: if the file name finishes with _xxxx.nc with xxxx any number
                ind1 = INDEX( clname, '_', back = .TRUE. ) + 1
                ind2 = INDEX( clname, '.', back = .TRUE. ) - 1
-               IF( ind2 > ind1 ) THEN   ;   IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local   ;   ENDIF
+               IF( ind2 > ind1 ) THEN
+                  IF( VERIFY( clname(ind1:ind2), '0123456789' ) == 0 )   idom = jpdom_local
+               ENDIF
             ENDIF
             !
             ! check the consistency between input array and data rank in the file
@@ -1310,36 +1304,37 @@ CONTAINS
             itime = 1
             IF( PRESENT(ktime) ) itime = ktime
             !
+            irankpv = 1 * COUNT( (/ llis1d /) ) + 2 * COUNT( (/ llis2d /) ) + 3 * COUNT( (/ llis3d /) )
             WRITE(clrankpv, fmt='(i1)') irankpv
             WRITE(cldmspc , fmt='(i1)') idmspc
             !
             IF(     idmspc <  irankpv ) THEN                     ! it seems we want to read more than we can...
-               IF(     irankpv == 3 .AND. idmspc == 2 ) THEN     !   3D input array from 2D spatial data in the file:
+               IF(     llis3d .AND. idmspc == 2 ) THEN           !   3D input array from 2D spatial data in the file:
                   llok = inlev == 1                              !     -> 3rd dimension must be equal to 1
-               ELSEIF( irankpv == 3 .AND. idmspc == 1 ) THEN     !   3D input array from 1D spatial data in the file:
-                  llok = inlev == 1 .AND. SIZE(pv_r3d, 2) == 1   !     -> 2nd and 3rd dimensions must be equal to 1
-               ELSEIF( irankpv == 2 .AND. idmspc == 2 ) THEN     !   2D input array from 1D spatial data in the file:
-                  llok = SIZE(pv_r2d, 2) == 1                    !     -> 2nd dimension must be equal to 1
+               ELSEIF( llis3d .AND. idmspc == 1 ) THEN           !   3D input array from 1D spatial data in the file:
+                  llok = inlev == 1 .AND. ishape(2) == 1         !     -> 2nd and 3rd dimensions must be equal to 1
+               ELSEIF( llis3d .AND. idmspc == 2 ) THEN           !   2D input array from 1D spatial data in the file:
+                  llok = ishape(2) == 1                          !     -> 2nd dimension must be equal to 1
                ELSE
                   llok = .FALSE.
                ENDIF
                IF( .NOT. llok )   CALL ctl_stop( TRIM(clinfo), 'The file has only '//cldmspc//' spatial dimension',   &
                   &                                            '=> cannot read a true '//clrankpv//'D array from this file...' )
             ELSEIF( idmspc == irankpv ) THEN
-               IF( PRESENT(pv_r1d) .AND. idom /= jpdom_unknown )   &
+               IF( llis1d .AND. idom /= jpdom_unknown )   &
                   &   CALL ctl_stop( TRIM(clinfo), 'case not coded...You must use jpdom_unknown' )
             ELSEIF( idmspc >  irankpv ) THEN                     ! it seems we want to read less than we should...
-                  IF( PRESENT(pv_r2d) .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN
-                     CALL ctl_warn( TRIM(clinfo), '2D array input but 3 spatial dimensions in the file...'              ,   &
-                           &         'As the size of the z dimension is 1 and as we try to read the first record, ',   &
-                           &         'we accept this case, even if there is a possible mix-up between z and time dimension' )
-                     idmspc = idmspc - 1
+               IF( llis2d .AND. itime == 1 .AND. idimsz(3) == 1 .AND. idmspc == 3 ) THEN
+                  CALL ctl_warn( TRIM(clinfo), '2D array input but 3 spatial dimensions in the file...'              ,   &
+                     &         'As the size of the z dimension is 1 and as we try to read the first record, ',   &
+                     &         'we accept this case, even if there is a possible mix-up between z and time dimension' )
+                  idmspc = idmspc - 1
                   !!GS: possibility to read 3D ABL atmopsheric forcing and use 1st level to force BULK simulation
                   !ELSE
                   !   CALL ctl_stop( TRIM(clinfo), 'To keep iom lisibility, when reading a '//clrankpv//'D array,',   &
                   !      &                         'we do not accept data with '//cldmspc//' spatial dimensions'  ,   &
                   !      &                         'Use ncwa -a to suppress the unnecessary dimensions' )
-                  ENDIF
+               ENDIF
             ENDIF
             !
             ! definition of istart and icnt
@@ -1355,11 +1350,11 @@ CONTAINS
                ELSE
                   icnt  (1:idmspc) = idimsz(1:idmspc)
                ENDIF
-            ELSE   !   not a 1D array as pv_r1d requires jpdom_unknown
+            ELSE   !   not a 1D array as pv(sd)p1d requires jpdom_unknown
                ! we do not read the overlap and the extra-halos -> from Nis0 to Nie0 and from Njs0 to Nje0
                IF( idom == jpdom_global )   istart(1:2) = (/ mig(Nis0,0), mjg(Njs0,0) /)
                icnt(1:2) = (/ Ni_0, Nj_0 /)
-               IF( PRESENT(pv_r3d) ) THEN
+               IF( llis3d ) THEN
                   IF( idom == jpdom_auto_xy ) THEN
                      istart(3) = kstart(3)
                      icnt  (3) = kcount(3)
@@ -1404,7 +1399,11 @@ CONTAINS
             ENDIF
             DO jl = 1, irankpv
                WRITE( ctmp2, FMT="(', ', i1,'): ', i5,' /= icnt(', i1,'):', i5)" ) jl, ishape(jl), jl, icnt(jl)
-               IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pv_r'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) )
+               IF( llsp ) THEN
+                  IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pvsp'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) )
+               ELSE
+                  IF( ishape(jl) /= icnt(jl) )   CALL ctl_stop( TRIM(clinfo), 'size(pvdp'//clrankpv//TRIM(ctmp1)//TRIM(ctmp2) )
+               ENDIF
             END DO
 
          ENDIF
@@ -1413,21 +1412,30 @@ CONTAINS
          !-
          IF( idvar > 0 .AND. istop == nstop ) THEN   ! no additional errors until this point...
             !
-            CALL iom_nf90_get( kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2, pv_r1d, pv_r2d, pv_r3d )
+            CALL iom_nf90_get( kiomid, idvar, inbdim, istart, icnt, ix1, ix2, iy1, iy2,   &
+               &               pvsp1d, pvsp2d, pvsp3d, pvdp1d, pvdp2d, pvdp3d )
 
             IF( istop == nstop ) THEN   ! no additional errors until this point...
                IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name)
 
+               !--- overlap areas and extra hallows (mpp)
                cl_type = 'T'
                IF( PRESENT(cd_type) )   cl_type = cd_type
-               !--- halos and NP folding (NP folding to be done even if no halos)
-               IF( idom /= jpdom_unknown .AND. cl_type /= 'Z' .AND. ( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) ) THEN
-                  zsgn = 1._wp
-                  IF( PRESENT(psgn   ) )   zsgn    = psgn
-                  IF(     PRESENT(pv_r2d) ) THEN
-                     CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
-                  ELSEIF( PRESENT(pv_r3d) ) THEN
-                     CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
+               IF( llsp ) THEN
+                  zsgn_sp = 1._sp
+                  IF( PRESENT(psgn_sp) )   zsgn_sp = psgn_sp
+                  IF(     llis2d .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
+                     CALL lbc_lnk( 'iom', pvsp2d, cl_type, zsgn_sp, kfillmode = kfill, ldfull = .TRUE. )
+                  ELSEIF( llis3d .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
+                     CALL lbc_lnk( 'iom', pvsp3d, cl_type, zsgn_sp, kfillmode = kfill, ldfull = .TRUE. )
+                  ENDIF
+               ELSE
+                  zsgn_dp = 1._dp
+                  IF( PRESENT(psgn_dp) )   zsgn_dp = psgn_dp
+                  IF(     llis2d .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
+                     CALL lbc_lnk( 'iom', pvdp2d, cl_type, zsgn_dp, kfillmode = kfill, ldfull = .TRUE. )
+                  ELSEIF( llis3d .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
+                     CALL lbc_lnk( 'iom', pvdp3d, cl_type, zsgn_dp, kfillmode = kfill, ldfull = .TRUE. )
                   ENDIF
                ENDIF
                !
@@ -1442,52 +1450,69 @@ CONTAINS
          !
       ELSE        ! read using XIOS. Only if key_xios is defined
 #if defined key_xios
-!would be good to be able to check which context is active and swap only if current is not restart
+         !would be good to be able to check which context is active and swap only if current is not restart
          idvar = iom_varid( kiomid, cdvar )
          CALL iom_swap(context)
-         zsgn = 1._wp
-         IF( PRESENT(psgn   ) )   zsgn    = psgn
+         IF( llsp ) THEN
+            zsgn_sp = 1._sp   ;   IF( PRESENT(psgn_sp) )   zsgn_sp = psgn_sp
+         ELSE
+            zsgn_dp = 1._dp   ;   IF( PRESENT(psgn_dp) )   zsgn_dp = psgn_dp
+         ENDIF
          cl_type = 'T'
          IF( PRESENT(cd_type) )   cl_type = cd_type
 
-         ! We do not know whether pv_r[23]d will have halo points during context initialisation in iom_set_vars_active,
-         ! so we must always read to an array on the full grid (1:jpi,1:jpj), then copy the correct part to pv_r[23]d
+         ! We do not know whether pv[sd]p[23]d will have halo points during context initialisation in iom_set_vars_active,
+         ! so we must always read to an array on the full grid (1:jpi,1:jpj), then copy the correct part to pv[sd]p[23]d
          IF( irankpv > 1 .AND. idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-            llok = (ishape(1) == jpi) .AND. (ishape(2) == jpj)
+            llok = ishape(1) == jpi .AND. ishape(2) == jpj
             ihls = arr_hls( ishape(1), ishape(2), ldtile=.FALSE., ldsize=.TRUE. )
          ELSE
             llok = .TRUE.
          ENDIF
 
-         IF( PRESENT(pv_r3d) ) THEN
+         IF(     llis3d ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (3D): ',TRIM(cdvar)
             IF( .NOT. llok ) THEN
                ALLOCATE( zwrk3d(jpi,jpj,inlev) )
                CALL xios_recv_field( trim(cdvar), zwrk3d(:,:,:) )
-               pv_r3d(:,:,:) = zwrk3d(A1Di(ihls(1)),A1Dj(ihls(2)),:)
+               IF( llsp ) THEN   ;   pvsp3d(:,:,:) = zwrk3d(A1Di(ihls(1)),A1Dj(ihls(2)),:)
+               ELSE              ;   pvdp3d(:,:,:) = zwrk3d(A1Di(ihls(1)),A1Dj(ihls(2)),:)
+               ENDIF
                DEALLOCATE( zwrk3d )
             ELSE
-               CALL xios_recv_field( trim(cdvar), pv_r3d(:,:,:) )
+               IF( llsp ) THEN   ;   CALL xios_recv_field( TRIM(cdvar), pvsp3d )
+               ELSE              ;   CALL xios_recv_field( TRIM(cdvar), pvdp3d )
+               ENDIF
             ENDIF
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-               CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
+               IF( llsp ) THEN   ;   CALL lbc_lnk( 'iom', pvsp3d, cl_type, zsgn_sp, kfillmode = kfill, ldfull = .TRUE. )
+               ELSE              ;   CALL lbc_lnk( 'iom', pvdp3d, cl_type, zsgn_dp, kfillmode = kfill, ldfull = .TRUE. )
+               ENDIF
             ENDIF
-         ELSEIF( PRESENT(pv_r2d) ) THEN
+         ELSEIF( llis2d ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (2D): ', TRIM(cdvar)
             IF( .NOT. llok ) THEN
                ALLOCATE( zwrk2d(jpi,jpj) )
-               CALL xios_recv_field( trim(cdvar), zwrk2d(:,:) )
-               pv_r2d(:,:) = zwrk2d(A1Di(ihls(1)),A1Dj(ihls(2)))
+               CALL xios_recv_field( TRIM(cdvar), zwrk2d(:,:) )
+               IF( llsp ) THEN   ;   pvsp2d(:,:) = zwrk2d(A1Di(ihls(1)),A1Dj(ihls(2)))
+               ELSE              ;   pvdp2d(:,:) = zwrk2d(A1Di(ihls(1)),A1Dj(ihls(2)))
+               ENDIF
                DEALLOCATE( zwrk2d )
             ELSE
-               CALL xios_recv_field( trim(cdvar), pv_r2d(:,:) )
+               IF( llsp ) THEN   ;   CALL xios_recv_field( TRIM(cdvar), pvsp2d )
+               ELSE              ;   CALL xios_recv_field( TRIM(cdvar), pvdp2d )
+               ENDIF
             ENDIF
             IF(idom /= jpdom_unknown .AND. cl_type /= 'Z' ) THEN
-               CALL lbc_lnk('iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, ldfull = .TRUE. )
+               IF( llsp ) THEN   ;   CALL lbc_lnk('iom', pvsp2d, cl_type, zsgn_sp, kfillmode = kfill, ldfull = .TRUE. )
+               ELSE              ;   CALL lbc_lnk('iom', pvdp2d, cl_type, zsgn_dp, kfillmode = kfill, ldfull = .TRUE. )
+               ENDIF
             ENDIF
-         ELSEIF( PRESENT(pv_r1d) ) THEN
+         ELSEIF( llis1d ) THEN
             IF(lwp) WRITE(numout,*) 'XIOS RST READ (1D): ', TRIM(cdvar)
-            CALL xios_recv_field( TRIM(cdvar), pv_r1d)
+            IF( llsp ) THEN   ;   CALL xios_recv_field( TRIM(cdvar), pvsp1d )
+            ELSE              ;   CALL xios_recv_field( TRIM(cdvar), pvdp1d )
+            ENDIF
          ENDIF
          CALL iom_swap(cxios_context)
 #else
@@ -1497,17 +1522,32 @@ CONTAINS
       ENDIF
 
       !--- Apply scale_factor and offset
-      zscf = iom_file(kiomid)%scf(idvar)      ! scale factor
-      zofs = iom_file(kiomid)%ofs(idvar)      ! offset
-      IF(     PRESENT(pv_r1d) ) THEN
-         IF( zscf /= 1._wp )   pv_r1d(:) = pv_r1d(:) * zscf
-         IF( zofs /= 0._wp )   pv_r1d(:) = pv_r1d(:) + zofs
-      ELSEIF( PRESENT(pv_r2d) ) THEN
-         IF( zscf /= 1._wp)   pv_r2d(:,:) = pv_r2d(:,:) * zscf
-         IF( zofs /= 0._wp)   pv_r2d(:,:) = pv_r2d(:,:) + zofs
-      ELSEIF( PRESENT(pv_r3d) ) THEN
-         IF( zscf /= 1._wp)   pv_r3d(:,:,:) = pv_r3d(:,:,:) * zscf
-         IF( zofs /= 0._wp)   pv_r3d(:,:,:) = pv_r3d(:,:,:) + zofs
+      IF( llsp ) THEN
+         zscf_sp = iom_file(kiomid)%scf(idvar)      ! scale factor
+         zofs_sp = iom_file(kiomid)%ofs(idvar)      ! offset
+         IF(     llis1d ) THEN
+            IF( zscf_sp /= 1._sp )   pvsp1d(:    ) = pvsp1d(:    ) * zscf_sp
+            IF( zofs_sp /= 0._sp )   pvsp1d(:    ) = pvsp1d(:    ) + zofs_sp
+         ELSEIF( llis2d ) THEN
+            IF( zscf_sp /= 1._sp )   pvsp2d(:,:  ) = pvsp2d(:,:  ) * zscf_sp
+            IF( zofs_sp /= 0._sp )   pvsp2d(:,:  ) = pvsp2d(:,:  ) + zofs_sp
+         ELSEIF( llis3d ) THEN
+            IF( zscf_sp /= 1._sp )   pvsp3d(:,:,:) = pvsp3d(:,:,:) * zscf_sp
+            IF( zofs_sp /= 0._sp )   pvsp3d(:,:,:) = pvsp3d(:,:,:) + zofs_sp
+         ENDIF
+      ELSE
+         zscf_dp = iom_file(kiomid)%scf(idvar)      ! scale factor
+         zofs_dp = iom_file(kiomid)%ofs(idvar)      ! offset
+         IF(     llis1d ) THEN
+            IF( zscf_dp /= 1._dp )   pvdp1d(:    ) = pvdp1d(:    ) * zscf_dp
+            IF( zofs_dp /= 0._dp )   pvdp1d(:    ) = pvdp1d(:    ) + zofs_dp
+         ELSEIF( llis2d ) THEN
+            IF( zscf_dp /= 1._dp )   pvdp2d(:,:  ) = pvdp2d(:,:  ) * zscf_dp
+            IF( zofs_dp /= 0._dp )   pvdp2d(:,:  ) = pvdp2d(:,:  ) + zofs_dp
+         ELSEIF( llis3d ) THEN
+            IF( zscf_dp /= 1._dp )   pvdp3d(:,:,:) = pvdp3d(:,:,:) * zscf_dp
+            IF( zofs_dp /= 0._dp )   pvdp3d(:,:,:) = pvdp3d(:,:,:) + zofs_dp
+         ENDIF
       ENDIF
       !
    END SUBROUTINE iom_get_123d
@@ -1693,32 +1733,8 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rs0 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = real(pvar, dp) )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvsp0d = pvar )
+      !
    END SUBROUTINE iom_rp0d_sp
 
    SUBROUTINE iom_rp0d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype )
@@ -1733,32 +1749,8 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 0D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rd0 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvdp0d = pvar )
+      !
    END SUBROUTINE iom_rp0d_dp
 
 
@@ -1774,32 +1766,8 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rs1 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = real(pvar, dp) )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvsp1d = pvar )
+      !
    END SUBROUTINE iom_rp1d_sp
 
    SUBROUTINE iom_rp1d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype )
@@ -1814,35 +1782,11 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 1D)',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rd1 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvdp1d = pvar )
+      !
    END SUBROUTINE iom_rp1d_dp
 
-
+   
    SUBROUTINE iom_rp2d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype )
       INTEGER         , INTENT(in)                         ::   kt       ! ocean time-step
       INTEGER         , INTENT(in)                         ::   kwrite   ! writing time-step
@@ -1855,32 +1799,8 @@ CONTAINS
       INTEGER            :: ivid   ! variable id
       CHARACTER(LEN=lc)  :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rs2 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = real(pvar, dp) )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvsp2d = pvar )
+      !
    END SUBROUTINE iom_rp2d_sp
 
    SUBROUTINE iom_rp2d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype )
@@ -1895,32 +1815,8 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 2D)',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rd2 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvdp2d = pvar )
+      !
    END SUBROUTINE iom_rp2d_dp
 
 
@@ -1936,32 +1832,8 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
-      CALL set_xios_context(kiomid, context)
-
-      llx = .NOT. (context == "NONE")
-
-      IF( llx ) THEN
-#ifdef key_xios
-         IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
-            CALL iom_swap(cxios_context)
-         ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',TRIM(cdvar)
-            CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rs3 = pvar )
-            CALL iom_swap(cxios_context)
-         ENDIF
-#endif
-      ELSE
-         IF( kiomid > 0 ) THEN
-            IF( iom_file(kiomid)%nfid > 0 ) THEN
-               ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = real(pvar, dp) )
-            ENDIF
-         ENDIF
-      ENDIF
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvsp3d = pvar )
+      !
    END SUBROUTINE iom_rp3d_sp
 
    SUBROUTINE iom_rp3d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype )
@@ -1976,6 +1848,29 @@ CONTAINS
       INTEGER           :: ivid   ! variable id
       CHARACTER(LEN=lc) :: context
       !
+      CALL iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvdp3d = pvar )
+      !
+   END SUBROUTINE iom_rp3d_dp
+
+   SUBROUTINE iom_rp0123d( kt, kwrite, kiomid, cdvar, ktype, pvsp0d, pvsp1d, pvsp2d, pvsp3d, pvdp0d, pvdp1d, pvdp2d, pvdp3d )
+      INTEGER                    , INTENT(in)           ::   kt       ! ocean time-step
+      INTEGER                    , INTENT(in)           ::   kwrite   ! writing time-step
+      INTEGER                    , INTENT(in)           ::   kiomid   ! Identifier of the file
+      CHARACTER(len=*)           , INTENT(in)           ::   cdvar    ! time axis name
+      INTEGER                    , INTENT(in), OPTIONAL ::   ktype    ! variable external type
+      REAL(sp)                   , INTENT(in), OPTIONAL ::   pvsp0d    ! read field (0D case), single precision
+      REAL(sp), DIMENSION(:)     , INTENT(in), OPTIONAL ::   pvsp1d    ! read field (1D case), single precision
+      REAL(sp), DIMENSION(:,:)   , INTENT(in), OPTIONAL ::   pvsp2d    ! read field (2D case), single precision
+      REAL(sp), DIMENSION(:,:,:) , INTENT(in), OPTIONAL ::   pvsp3d    ! read field (3D case), single precision
+      REAL(dp)                   , INTENT(in), OPTIONAL ::   pvdp0d    ! read field (0D case), double precision
+      REAL(dp), DIMENSION(:)     , INTENT(in), OPTIONAL ::   pvdp1d    ! read field (1D case), double precision
+      REAL(dp), DIMENSION(:,:)   , INTENT(in), OPTIONAL ::   pvdp2d    ! read field (2D case), double precision
+      REAL(dp), DIMENSION(:,:,:) , INTENT(in), OPTIONAL ::   pvdp3d    ! read field (3D case), double precision
+      !
+      LOGICAL           :: llx                 ! local xios write flag
+      INTEGER           :: ivid   ! variable id
+      CHARACTER(LEN=lc) :: context
+      !
       CALL set_xios_context(kiomid, context)
 
       llx = .NOT. (context == "NONE")
@@ -1983,14 +1878,22 @@ CONTAINS
       IF( llx ) THEN
 #ifdef key_xios
          IF( kt == kwrite ) THEN
-            IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',TRIM(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: write (XIOS) ',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_put(TRIM(cdvar), pvar)
+            IF( PRESENT(pvsp0d) )   CALL iom_put(TRIM(cdvar), pvsp0d)
+            IF( PRESENT(pvsp1d) )   CALL iom_put(TRIM(cdvar), pvsp1d)
+            IF( PRESENT(pvsp2d) )   CALL iom_put(TRIM(cdvar), pvsp2d)
+            IF( PRESENT(pvsp3d) )   CALL iom_put(TRIM(cdvar), pvsp3d)
+            IF( PRESENT(pvdp0d) )   CALL iom_put(TRIM(cdvar), pvdp0d)
+            IF( PRESENT(pvdp1d) )   CALL iom_put(TRIM(cdvar), pvdp1d)
+            IF( PRESENT(pvdp2d) )   CALL iom_put(TRIM(cdvar), pvdp2d)
+            IF( PRESENT(pvdp3d) )   CALL iom_put(TRIM(cdvar), pvdp3d)
             CALL iom_swap(cxios_context)
          ELSE
-            IF(lwp) write(numout,*) 'RESTART: define (XIOS 3D)',TRIM(cdvar)
+            IF(lwp) write(numout,*) 'RESTART: define (XIOS)',TRIM(cdvar)
             CALL iom_swap(context)
-            CALL iom_set_rstw_active( TRIM(cdvar), rd3 = pvar )
+            CALL iom_set_rstw_active( TRIM(cdvar), rs0 = pvsp0d, rs1 = pvsp1d, rs2 = pvsp2d, rs3 = pvsp3d   &
+               &                                 , rd0 = pvdp0d, rd1 = pvdp1d, rd2 = pvdp2d, rd3 = pvdp3d )
             CALL iom_swap(cxios_context)
          ENDIF
 #endif
@@ -1998,12 +1901,12 @@ CONTAINS
          IF( kiomid > 0 ) THEN
             IF( iom_file(kiomid)%nfid > 0 ) THEN
                ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. )
-               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar )
+               CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pvsp0d, pvsp1d, pvsp2d, pvsp3d,   &
+                  &                                                          pvdp0d, pvdp1d, pvdp2d, pvdp3d )
             ENDIF
          ENDIF
       ENDIF
-   END SUBROUTINE iom_rp3d_dp
-
+   END SUBROUTINE iom_rp0123d
 
 
   SUBROUTINE iom_delay_rst( cdaction, cdcpnt, kncid )
diff --git a/src/OCE/IOM/iom_nf90.F90 b/src/OCE/IOM/iom_nf90.F90
index 38d9943cd6de362e2e7beb650e2b0de87b7e2e57..a88ad855a517e68ea016dbd8b5962cf01fa58c0d 100644
--- a/src/OCE/IOM/iom_nf90.F90
+++ b/src/OCE/IOM/iom_nf90.F90
@@ -34,10 +34,7 @@ MODULE iom_nf90
 
    INTERFACE iom_nf90_get
       MODULE PROCEDURE iom_nf90_g0d_sp
-      MODULE PROCEDURE iom_nf90_g0d_dp, iom_nf90_g123d_dp
-   END INTERFACE
-   INTERFACE iom_nf90_rstput
-      MODULE PROCEDURE iom_nf90_rp0123d_dp
+      MODULE PROCEDURE iom_nf90_g0d_dp, iom_nf90_g123d
    END INTERFACE
 
    !! * Substitutions
@@ -312,8 +309,8 @@ CONTAINS
       CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo )
    END SUBROUTINE iom_nf90_g0d_dp
 
-   SUBROUTINE iom_nf90_g123d_dp( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2,   &
-         &                    pv_r1d, pv_r2d, pv_r3d )
+   SUBROUTINE iom_nf90_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2,   &
+         &                    pvsp1d, pvsp2d, pvsp3d, pvdp1d, pvdp2d, pvdp3d )
       !!-----------------------------------------------------------------------
       !!                  ***  ROUTINE  iom_nf90_g123d  ***
       !!
@@ -327,9 +324,12 @@ CONTAINS
       INTEGER , DIMENSION(:)     , INTENT(in   )           ::   kstart    ! start position of the reading in each axis
       INTEGER , DIMENSION(:)     , INTENT(in   )           ::   kcount    ! number of points to be read in each axis
       INTEGER ,                    INTENT(in   )           ::   kx1, kx2, ky1, ky2   ! subdomain indexes
-      REAL(dp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pv_r1d    ! read field (1D case)
-      REAL(dp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pv_r2d    ! read field (2D case)
-      REAL(dp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pv_r3d    ! read field (3D case)
+      REAL(sp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pvsp1d    ! read field (1D case), single precision
+      REAL(sp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pvsp2d    ! read field (2D case), single precision
+      REAL(sp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pvsp3d    ! read field (3D case), single precision
+      REAL(dp), DIMENSION(:)     , INTENT(  out), OPTIONAL ::   pvdp1d    ! read field (1D case), double precision
+      REAL(dp), DIMENSION(:,:)   , INTENT(  out), OPTIONAL ::   pvdp2d    ! read field (2D case), double precision
+      REAL(dp), DIMENSION(:,:,:) , INTENT(  out), OPTIONAL ::   pvdp3d    ! read field (3D case), double precision
       !
       CHARACTER(LEN=100) ::   clinfo               ! info character
       INTEGER            ::   if90id               ! nf90 identifier of the opened file
@@ -339,18 +339,27 @@ CONTAINS
       if90id = iom_file(kiomid)%nfid         ! get back NetCDF file id
       ivid   = iom_file(kiomid)%nvid(kvid)   ! get back NetCDF var id
       !
-      IF(     PRESENT(pv_r1d) ) THEN
-         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r1d(:                ), start = kstart(1:knbdim),   &
+      IF(     PRESENT(pvsp1d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvsp1d(:                ), start = kstart(1:knbdim),   &
+            &                                                                       count = kcount(1:knbdim)), clinfo )
+      ELSEIF( PRESENT(pvdp1d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvdp1d(:                ), start = kstart(1:knbdim),   &
+            &                                                                       count = kcount(1:knbdim)), clinfo )
+      ELSEIF( PRESENT(pvsp2d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvsp2d(kx1:kx2,ky1:ky2  ), start = kstart(1:knbdim),   &
+            &                                                                       count = kcount(1:knbdim)), clinfo )
+      ELSEIF( PRESENT(pvdp2d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvdp2d(kx1:kx2,ky1:ky2  ), start = kstart(1:knbdim),   &
             &                                                                       count = kcount(1:knbdim)), clinfo )
-      ELSEIF( PRESENT(pv_r2d) ) THEN
-         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r2d(kx1:kx2,ky1:ky2  ), start = kstart(1:knbdim),   &
+      ELSEIF( PRESENT(pvsp3d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvsp3d(kx1:kx2,ky1:ky2,:), start = kstart(1:knbdim),   &
             &                                                                       count = kcount(1:knbdim)), clinfo )
-      ELSEIF( PRESENT(pv_r3d) ) THEN
-         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pv_r3d(kx1:kx2,ky1:ky2,:), start = kstart(1:knbdim),   &
+      ELSEIF( PRESENT(pvdp3d) ) THEN
+         CALL iom_nf90_check( NF90_GET_VAR(if90id, ivid, pvdp3d(kx1:kx2,ky1:ky2,:), start = kstart(1:knbdim),   &
             &                                                                       count = kcount(1:knbdim)), clinfo )
       ENDIF
       !
-   END SUBROUTINE iom_nf90_g123d_dp
+   END SUBROUTINE iom_nf90_g123d
 
 
 
@@ -524,8 +533,9 @@ CONTAINS
       !
    END SUBROUTINE iom_nf90_putatt
 
-   SUBROUTINE iom_nf90_rp0123d_dp( kt, kwrite, kiomid, cdvar , kvid  , ktype,   &
-         &                                  pv_r0d, pv_r1d, pv_r2d, pv_r3d )
+   SUBROUTINE iom_nf90_rstput( kt, kwrite, kiomid, cdvar , kvid  , ktype ,   &
+         &                                 pvsp0d, pvsp1d, pvsp2d, pvsp3d,   &
+         &                                 pvdp0d, pvdp1d, pvdp2d, pvdp3d )
       !!--------------------------------------------------------------------
       !!                   ***  SUBROUTINE  iom_nf90_rstput  ***
       !!
@@ -537,10 +547,14 @@ CONTAINS
       CHARACTER(len=*)            , INTENT(in)           ::   cdvar    ! variable name
       INTEGER                     , INTENT(in)           ::   kvid     ! variable id
       INTEGER                     , INTENT(in), OPTIONAL ::   ktype    ! variable type (default R8)
-      REAL(dp)                    , INTENT(in), OPTIONAL ::   pv_r0d   ! written Od field
-      REAL(dp), DIMENSION(      :), INTENT(in), OPTIONAL ::   pv_r1d   ! written 1d field
-      REAL(dp), DIMENSION(:, :   ), INTENT(in), OPTIONAL ::   pv_r2d   ! written 2d field
-      REAL(dp), DIMENSION(:, :, :), INTENT(in), OPTIONAL ::   pv_r3d   ! written 3d field
+      REAL(sp)                    , INTENT(in), OPTIONAL ::   pvsp0d   ! written Od field
+      REAL(sp), DIMENSION(      :), INTENT(in), OPTIONAL ::   pvsp1d   ! written 1d field
+      REAL(sp), DIMENSION(:, :   ), INTENT(in), OPTIONAL ::   pvsp2d   ! written 2d field
+      REAL(sp), DIMENSION(:, :, :), INTENT(in), OPTIONAL ::   pvsp3d   ! written 3d field
+      REAL(dp)                    , INTENT(in), OPTIONAL ::   pvdp0d   ! written Od field
+      REAL(dp), DIMENSION(      :), INTENT(in), OPTIONAL ::   pvdp1d   ! written 1d field
+      REAL(dp), DIMENSION(:, :   ), INTENT(in), OPTIONAL ::   pvdp2d   ! written 2d field
+      REAL(dp), DIMENSION(:, :, :), INTENT(in), OPTIONAL ::   pvdp3d   ! written 3d field
       !
       INTEGER               :: idims                ! number of dimension
       INTEGER               :: idvar                ! variable id
@@ -555,12 +569,18 @@ CONTAINS
       !                                             ! nn_nchunks_[i,j,k,t] namelist parameters
       INTEGER               :: ichunkalg, ishuffle, ideflate, ideflate_level
       !                                             ! NetCDF4 internally fixed parameters
+      INTEGER               :: idlv                 ! local variable
       LOGICAL               :: lchunk               ! logical switch to activate chunking and compression
       !                                             ! when appropriate (currently chunking is applied to 4d fields only)
-      INTEGER               :: idlv                 ! local variable
+      LOGICAL               :: llis0d, llis1d, llis2d, llis3d
       CHARACTER(LEN=256)    :: ccname               ! local variable
       !---------------------------------------------------------------------
       !
+      llis0d = PRESENT(pvsp0d) .OR. PRESENT(pvdp0d)
+      llis1d = PRESENT(pvsp1d) .OR. PRESENT(pvdp1d)
+      llis2d = PRESENT(pvsp2d) .OR. PRESENT(pvdp2d)
+      llis3d = PRESENT(pvsp3d) .OR. PRESENT(pvdp3d)
+      !
       clinfo = '          iom_nf90_rp0123d, file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(cdvar)
       if90id = iom_file(kiomid)%nfid
       !
@@ -609,12 +629,12 @@ CONTAINS
             CALL iom_nf90_check(NF90_REDEF( if90id ), clinfo)   ;   iom_file(kiomid)%irec = -1
          ENDIF
          ! variable definition
-         IF(     PRESENT(pv_r0d) ) THEN   ;   idims = 0
-         ELSEIF( PRESENT(pv_r1d) ) THEN
-                                              idims = 2   ;   idimid(1:idims) = (/3,4/)
-         ELSEIF( PRESENT(pv_r2d) ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2,4/)
-         ELSEIF( PRESENT(pv_r3d) ) THEN
-                                              idims = 4   ;   idimid(1:idims) = (/1,2,3,4/)
+         IF(     llis0d ) THEN   ;   idims = 0
+         ELSEIF( llis1d ) THEN
+                                     idims = 2   ;   idimid(1:idims) = (/3,4/)
+         ELSEIF( llis2d ) THEN   ;   idims = 3   ;   idimid(1:idims) = (/1,2,4/)
+         ELSEIF( llis3d ) THEN
+                                     idims = 4   ;   idimid(1:idims) = (/1,2,3,4/)
          ENDIF
          IF( PRESENT(ktype) ) THEN   ! variable external type
             SELECT CASE (ktype)
@@ -628,7 +648,7 @@ CONTAINS
          ELSE
             itype = NF90_DOUBLE
          ENDIF
-         IF( PRESENT(pv_r0d) ) THEN
+         IF( llis0d ) THEN
             CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype,                  iom_file(kiomid)%nvid(idvar) ), clinfo )
          ELSE
             CALL iom_nf90_check(NF90_DEF_VAR( if90id, TRIM(cdvar), itype, idimid(1:idims), iom_file(kiomid)%nvid(idvar) ), clinfo )
@@ -641,9 +661,7 @@ CONTAINS
          iom_file(kiomid)%scf(idvar)    = 1.
          iom_file(kiomid)%ofs(idvar)    = 0.
          iom_file(kiomid)%ndims(idvar)  = idims
-         IF( .NOT. PRESENT(pv_r0d) ) THEN   ;   iom_file(kiomid)%luld(idvar) = .TRUE.
-         ELSE                               ;   iom_file(kiomid)%luld(idvar) = .FALSE.
-         ENDIF
+         iom_file(kiomid)%luld(idvar)   = .NOT. llis0d
          DO jd = 1, idims
             CALL iom_nf90_check(NF90_INQUIRE_DIMENSION( if90id, idimid(jd), len = iom_file(kiomid)%dimsz(jd,idvar) ), clinfo)
             IF ( lchunk ) ichunksz(jd) = iom_file(kiomid)%dimsz(jd,idvar)
@@ -672,7 +690,7 @@ CONTAINS
             CALL iom_nf90_check(NF90_ENDDEF( if90id ), clinfo)   ;   iom_file(kiomid)%irec = 0
          ENDIF
          ! on what kind of domain must the data be written?
-         IF( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) THEN
+         IF( llis2d .OR. llis3d ) THEN
 
             ! write dimension variables if it is not already done
             ! =============
@@ -695,8 +713,10 @@ CONTAINS
                IF(lwp) WRITE(numout,*) TRIM(clinfo)//' write dimension variables done'
             ENDIF
 
-            IF( PRESENT(pv_r2d) )  ishape(1:2) = SHAPE(pv_r2d)
-            IF( PRESENT(pv_r3d) )  ishape(1:3) = SHAPE(pv_r3d)
+            IF( PRESENT(pvsp2d) )  ishape(1:2) = SHAPE(pvsp2d)
+            IF( PRESENT(pvdp2d) )  ishape(1:2) = SHAPE(pvdp2d)
+            IF( PRESENT(pvsp3d) )  ishape(1:3) = SHAPE(pvsp3d)
+            IF( PRESENT(pvdp3d) )  ishape(1:3) = SHAPE(pvdp3d)
             IF(     ishape(1) == Ni_0   .AND. ishape(2) == Nj_0   ) THEN           ! array with 0 halo
                ix1 = 1      ;   ix2 = Ni_0     ;   iy1 = 1      ;   iy2 = Nj_0
             ELSEIF( ishape(1) == jpi    .AND. ishape(2) == jpj    ) THEN           ! array with nn_hls halos
@@ -711,14 +731,22 @@ CONTAINS
 
          ! write the data
          ! =============
-         IF(     PRESENT(pv_r0d) ) THEN
-            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r0d                    ), clinfo )
-         ELSEIF( PRESENT(pv_r1d) ) THEN
-            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r1d(:)                 ), clinfo )
-         ELSEIF( PRESENT(pv_r2d) ) THEN     
-            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r2d(ix1:ix2,iy1:iy2)   ), clinfo )
-         ELSEIF( PRESENT(pv_r3d) ) THEN
-            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pv_r3d(ix1:ix2,iy1:iy2,:) ), clinfo )
+         IF(     PRESENT(pvsp0d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvsp0d                    ), clinfo )
+         ELSEIF( PRESENT(pvdp0d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvdp0d                    ), clinfo )
+         ELSEIF( PRESENT(pvsp1d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvsp1d(:)                 ), clinfo )
+         ELSEIF( PRESENT(pvdp1d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvdp1d(:)                 ), clinfo )
+         ELSEIF( PRESENT(pvsp2d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvsp2d(ix1:ix2,iy1:iy2)   ), clinfo )
+         ELSEIF( PRESENT(pvdp2d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvdp2d(ix1:ix2,iy1:iy2)   ), clinfo )
+         ELSEIF( PRESENT(pvsp3d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvsp3d(ix1:ix2,iy1:iy2,:) ), clinfo )
+         ELSEIF( PRESENT(pvdp3d) ) THEN
+            CALL iom_nf90_check( NF90_PUT_VAR( if90id, idvar, pvdp3d(ix1:ix2,iy1:iy2,:) ), clinfo )
          ENDIF
          ! add 1 to the size of the temporal dimension (not really useful...)
          IF( iom_file(kiomid)%luld(idvar) )   iom_file(kiomid)%dimsz(iom_file(kiomid)%ndims(idvar), idvar)    &
@@ -726,7 +754,7 @@ CONTAINS
          IF(lwp) WRITE(numout,*) TRIM(clinfo)//' written ok'
       ENDIF
       !
-   END SUBROUTINE iom_nf90_rp0123d_dp
+   END SUBROUTINE iom_nf90_rstput
 
 
    SUBROUTINE iom_nf90_check( kstatus, cdinfo )
diff --git a/src/OCE/LBC/lib_mpp.F90 b/src/OCE/LBC/lib_mpp.F90
index 35d87d400327691fd366e0bc5e0932d8e9f73754..dfcb10a654ee4ded8ee82d80daa289b3187efef7 100644
--- a/src/OCE/LBC/lib_mpp.F90
+++ b/src/OCE/LBC/lib_mpp.F90
@@ -1234,7 +1234,7 @@ CONTAINS
                 + aimag(ydda(ji)) + aimag(yddb(ji))
 
          ! The result is zt1 + zt2, after normalization.
-         yddb(ji) = cmplx ( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1),wp )
+         yddb(ji) = cmplx ( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1), dp )
       END DO
       !
    END SUBROUTINE DDPDD_MPI
diff --git a/src/OCE/LDF/ldfslp.F90 b/src/OCE/LDF/ldfslp.F90
index 5a1fcf8ef324ef5d7cad1832d1df74cd7368b349..33d5957c26ad726ef3642871992dcd546c9ee425 100644
--- a/src/OCE/LDF/ldfslp.F90
+++ b/src/OCE/LDF/ldfslp.F90
@@ -610,7 +610,7 @@ CONTAINS
 !                  END DO
 !               END DO
 !            END DO
-!            CALL lbc_lnk( 'ldfslp', uslp , 'U', -1. ; CALL lbc_lnk( 'ldfslp', vslp , 'V', -1.,  wslpi, 'W', -1.,  wslpj, 'W', -1. )
+!            CALL lbc_lnk( 'ldfslp', uslp , 'U', -1. ; CALL lbc_lnk( 'ldfslp', vslp , 'V', -1._wp,  wslpi, 'W', -1._wp,  wslpj, 'W', -1._wp )
 !!gm         ENDIF
       ENDIF
       !
diff --git a/src/OCE/SBC/sbcblk_algo_ecmwf.F90 b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
index eb316c81a35d78dbbe837788e3d03a477cad8f03..252a19275feb0b2eba8ca4cb7cb3f5772b8cb9a3 100644
--- a/src/OCE/SBC/sbcblk_algo_ecmwf.F90
+++ b/src/OCE/SBC/sbcblk_algo_ecmwf.F90
@@ -417,27 +417,23 @@ CONTAINS
       REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj    ! dummy loop indices
-      REAL(wp) :: zta, zx2, zx, ztmp, zpsi_unst, zpsi_stab, zstab, zc
+      REAL(wp) :: zta, zx2, zx, ztmp, zc
       !!----------------------------------------------------------------------------------
       zc = 5._wp/0.35_wp
       DO_2D( 0, 0, 0, 0 )
             !
             zta = MIN( pzeta(ji,jj) , 5._wp ) !! Very stable conditions (L positif and big!):
-
-            ! *** Unstable (Paulson 1970)    [eq.3.20, Chap.3, p.33, IFS doc - Cy31r1] :
-            zx2 = SQRT( ABS(1._wp - 16._wp*zta) )  ! (1 - 16z)^0.5
-            zx  = SQRT(zx2)                          ! (1 - 16z)^0.25
-            ztmp = 1._wp + zx
-            zpsi_unst = LOG( 0.125_wp*ztmp*ztmp*(1._wp + zx2) ) - 2._wp*ATAN( zx ) + 0.5_wp*rpi
-
-            ! *** Stable                   [eq.3.22, Chap.3, p.33, IFS doc - Cy31r1] :
-            zpsi_stab = -2._wp/3._wp*(zta - zc)*EXP(-0.35_wp*zta) &
-               &       - zta - 2._wp/3._wp*zc
             !
-            zstab = 0.5_wp + SIGN(0.5_wp, zta) ! zta > 0 => zstab = 1
-            !
-            psi_m_ecmwf(ji,jj) =         zstab  * zpsi_stab &  ! (zta > 0) Stable
-               &              + (1._wp - zstab) * zpsi_unst    ! (zta < 0) Unstable
+            IF (zta < 0.0_wp) THEN
+               ! *** Unstable (Paulson 1970)    [eq.3.20, Chap.3, p.33, IFS doc - Cy31r1] :
+               zx2 = SQRT( ABS(1._wp - 16._wp*zta) )  ! (1 - 16z)^0.5
+               zx  = SQRT(zx2)                        ! (1 - 16z)^0.25
+               ztmp = 1._wp + zx
+               psi_m_ecmwf(ji,jj) = LOG(0.125_wp*ztmp*ztmp*(1._wp + zx2)) - 2._wp*ATAN(zx) + 0.5_wp*rpi
+            ELSE
+               ! *** Stable                   [eq.3.22, Chap.3, p.33, IFS doc - Cy31r1] :
+               psi_m_ecmwf(ji,jj) = -2._wp/3._wp*(zta - zc)*EXP(-0.35_wp*zta) - zta - 2._wp/3._wp*zc
+            ENDIF
             !
       END_2D
    END FUNCTION psi_m_ecmwf
@@ -458,7 +454,7 @@ CONTAINS
       REAL(wp), DIMENSION(A2D(0)), INTENT(in) :: pzeta
       !
       INTEGER  ::   ji, jj     ! dummy loop indices
-      REAL(wp) ::  zta, zx2, zpsi_unst, zpsi_stab, zstab, zc
+      REAL(wp) ::  zta, zx2, zc
       !!----------------------------------------------------------------------------------
       zc = 5._wp/0.35_wp
       !
@@ -466,20 +462,15 @@ CONTAINS
             !
             zta = MIN(pzeta(ji,jj) , 5._wp)   ! Very stable conditions (L positif and big!):
             !
-            ! *** Unstable (Paulson 1970)   [eq.3.20, Chap.3, p.33, IFS doc - Cy31r1] :
-            zx2 = SQRT( ABS(1._wp - 16._wp*zta) )  ! (1 -16z)^0.5
-            zpsi_unst = 2._wp*LOG( 0.5_wp*(1._wp + zx2) )
-            !
-            ! *** Stable [eq.3.22, Chap.3, p.33, IFS doc - Cy31r1] :
-            zpsi_stab = -2._wp/3._wp*(zta - zc)*EXP(-0.35_wp*zta) &
+            IF (zta < 0.0_wp) THEN
+               ! *** Unstable (Paulson 1970)   [eq.3.20, Chap.3, p.33, IFS doc - Cy31r1] :
+               zx2 = SQRT( ABS(1._wp - 16._wp*zta) )  ! (1 -16z)^0.5
+               psi_h_ecmwf(ji,jj) = 2._wp*LOG( 0.5_wp*(1._wp + zx2) )
+            ELSE
+               ! *** Stable [eq.3.22, Chap.3, p.33, IFS doc - Cy31r1] :
+               psi_h_ecmwf(ji,jj) = -2._wp/3._wp*(zta - zc)*EXP(-0.35_wp*zta) &
                &       - ABS(1._wp + 2._wp/3._wp*zta)**1.5_wp - 2._wp/3._wp*zc + 1._wp
-            !
-            ! LB: added ABS() to avoid NaN values when unstable, which contaminates the unstable solution...
-            !
-            zstab = 0.5_wp + SIGN(0.5_wp, zta) ! zta > 0 => zstab = 1
-            !
-            psi_h_ecmwf(ji,jj) =         zstab  * zpsi_stab &  ! (zta > 0) Stable
-               &              + (1._wp - zstab) * zpsi_unst    ! (zta < 0) Unstable
+            ENDIF
             !
       END_2D
    END FUNCTION psi_h_ecmwf
diff --git a/src/OCE/SBC/sbcice_cice.F90 b/src/OCE/SBC/sbcice_cice.F90
index d05ccfd32cd33c0624cdb6633335f1dc7bbd4967..2af309172c40eed8d8cc9455f9510a1973e16781 100644
--- a/src/OCE/SBC/sbcice_cice.F90
+++ b/src/OCE/SBC/sbcice_cice.F90
@@ -175,7 +175,7 @@ CONTAINS
       ! there is no restart file.
       ! Values from a CICE restart file would overwrite this
       IF( .NOT. ln_rstart ) THEN    
-         CALL nemo2cice( ts(:,:,1,jp_tem,Kmm) , sst , 'T' , 1.) 
+         CALL nemo2cice( ts(:,:,1,jp_tem,Kmm) , sst , 'T' , 1._wp) 
       ENDIF  
 #endif
 
@@ -207,10 +207,10 @@ CONTAINS
       fr_iu(:,:)=0.0
       fr_iv(:,:)=0.0
 
-      CALL cice2nemo(aice,fr_i, 'T', 1. )
+      CALL cice2nemo(aice,fr_i, 'T', 1._wp )
       IF( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN
          DO jl=1,ncat
-            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. )
+            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1._wp )
          ENDDO
       ENDIF
 
@@ -224,8 +224,8 @@ CONTAINS
       CALL lbc_lnk( 'sbcice_cice', fr_iu , 'U', 1.0_wp,  fr_iv , 'V', 1.0_wp )
 
       ! set the snow+ice mass
-      CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. )
-      CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. )
+      CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1._wp )
+      CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1._wp )
       snwice_mass  (:,:) = ( rhos * ztmp1(:,:) + rhoi * ztmp2(:,:)  )
       snwice_mass_b(:,:) = snwice_mass(:,:)
 
@@ -282,7 +282,7 @@ CONTAINS
             ztmp(ji,jj) = 0.5 * (  fr_iu(ji,jj) * utau(ji,jj)      &
                                  + fr_iu(ji,jj+1) * utau(ji,jj+1) ) * fmask(ji,jj,1)
          END_2D
-         CALL nemo2cice(ztmp,strax,'F', -1. )
+         CALL nemo2cice(ztmp,strax,'F', -1._wp )
 
 ! y comp of wind stress (CI_2)
 ! V point to F point
@@ -290,7 +290,7 @@ CONTAINS
             ztmp(ji,jj) = 0.5 * (  fr_iv(ji,jj) * vtau(ji,jj)      &
                                  + fr_iv(ji+1,jj) * vtau(ji+1,jj) ) * fmask(ji,jj,1)
          END_2D
-         CALL nemo2cice(ztmp,stray,'F', -1. )
+         CALL nemo2cice(ztmp,stray,'F', -1._wp )
 
 ! Surface downward latent heat flux (CI_5)
          IF(ksbc == jp_flx) THEN
@@ -316,7 +316,7 @@ CONTAINS
             END_2D
          ENDIF
          DO jl=1,ncat
-            CALL nemo2cice(ztmpn(:,:,jl),flatn_f(:,:,jl,:),'T', 1. )
+            CALL nemo2cice(ztmpn(:,:,jl),flatn_f(:,:,jl,:),'T', 1._wp )
 
 ! GBM conductive flux through ice (CI_6)
 !  Convert to GBM
@@ -325,7 +325,7 @@ CONTAINS
             ELSE
                ztmp(:,:) = botmelt(:,:,jl)
             ENDIF
-            CALL nemo2cice(ztmp,fcondtopn_f(:,:,jl,:),'T', 1. )
+            CALL nemo2cice(ztmp,fcondtopn_f(:,:,jl,:),'T', 1._wp )
 
 ! GBM surface heat flux (CI_7)
 !  Convert to GBM
@@ -334,7 +334,7 @@ CONTAINS
             ELSE
                ztmp(:,:) = (topmelt(:,:,jl)+botmelt(:,:,jl))
             ENDIF
-            CALL nemo2cice(ztmp,fsurfn_f(:,:,jl,:),'T', 1. )
+            CALL nemo2cice(ztmp,fsurfn_f(:,:,jl,:),'T', 1._wp )
          ENDDO
 
       ELSE IF(ksbc == jp_blk) THEN
@@ -342,39 +342,39 @@ CONTAINS
 ! Pass bulk forcing fields to CICE (which will calculate heat fluxes etc itself)
 ! x comp and y comp of atmosphere surface wind (CICE expects on T points)
          ztmp(:,:) = wndi_ice(:,:)
-         CALL nemo2cice(ztmp,uatm,'T', -1. )
+         CALL nemo2cice(ztmp,uatm,'T', -1._wp )
          ztmp(:,:) = wndj_ice(:,:)
-         CALL nemo2cice(ztmp,vatm,'T', -1. )
+         CALL nemo2cice(ztmp,vatm,'T', -1._wp )
          ztmp(:,:) = SQRT ( wndi_ice(:,:)**2 + wndj_ice(:,:)**2 )
-         CALL nemo2cice(ztmp,wind,'T', 1. )    ! Wind speed (m/s)
+         CALL nemo2cice(ztmp,wind,'T', 1._wp )    ! Wind speed (m/s)
          ztmp(:,:) = qsr_ice(:,:,1)
-         CALL nemo2cice(ztmp,fsw,'T', 1. )     ! Incoming short-wave (W/m^2)
+         CALL nemo2cice(ztmp,fsw,'T', 1._wp )     ! Incoming short-wave (W/m^2)
          ztmp(:,:) = qlw_ice(:,:,1)
-         CALL nemo2cice(ztmp,flw,'T', 1. )     ! Incoming long-wave (W/m^2)
+         CALL nemo2cice(ztmp,flw,'T', 1._wp )     ! Incoming long-wave (W/m^2)
          ztmp(:,:) = tatm_ice(:,:)
-         CALL nemo2cice(ztmp,Tair,'T', 1. )    ! Air temperature (K)
-         CALL nemo2cice(ztmp,potT,'T', 1. )    ! Potential temp (K)
+         CALL nemo2cice(ztmp,Tair,'T', 1._wp )    ! Air temperature (K)
+         CALL nemo2cice(ztmp,potT,'T', 1._wp )    ! Potential temp (K)
 ! Following line uses MAX(....) to avoid problems if tatm_ice has unset halo rows  
          ztmp(:,:) = 101000. / ( 287.04 * MAX(1.0,tatm_ice(:,:)) )    
                                                ! Constant (101000.) atm pressure assumed
-         CALL nemo2cice(ztmp,rhoa,'T', 1. )    ! Air density (kg/m^3)
+         CALL nemo2cice(ztmp,rhoa,'T', 1._wp )    ! Air density (kg/m^3)
          ztmp(:,:) = qatm_ice(:,:)
-         CALL nemo2cice(ztmp,Qa,'T', 1. )      ! Specific humidity (kg/kg)
+         CALL nemo2cice(ztmp,Qa,'T', 1._wp )      ! Specific humidity (kg/kg)
          ztmp(:,:)=10.0
-         CALL nemo2cice(ztmp,zlvl,'T', 1. )    ! Atmos level height (m)
+         CALL nemo2cice(ztmp,zlvl,'T', 1._wp )    ! Atmos level height (m)
 
 ! May want to check all values are physically realistic (as in CICE routine 
 ! prepare_forcing)?
 
 ! Divide shortwave into spectral bands (as in prepare_forcing)
          ztmp(:,:)=qsr_ice(:,:,1)*frcvdr       ! visible direct
-         CALL nemo2cice(ztmp,swvdr,'T', 1. )             
+         CALL nemo2cice(ztmp,swvdr,'T', 1._wp )             
          ztmp(:,:)=qsr_ice(:,:,1)*frcvdf       ! visible diffuse
-         CALL nemo2cice(ztmp,swvdf,'T', 1. )              
+         CALL nemo2cice(ztmp,swvdf,'T', 1._wp )              
          ztmp(:,:)=qsr_ice(:,:,1)*frcidr       ! near IR direct
-         CALL nemo2cice(ztmp,swidr,'T', 1. )
+         CALL nemo2cice(ztmp,swidr,'T', 1._wp )
          ztmp(:,:)=qsr_ice(:,:,1)*frcidf       ! near IR diffuse
-         CALL nemo2cice(ztmp,swidf,'T', 1. )
+         CALL nemo2cice(ztmp,swidf,'T', 1._wp )
 
       ENDIF
 
@@ -382,37 +382,37 @@ CONTAINS
 ! Ensure fsnow is positive (as in CICE routine prepare_forcing)
       IF( iom_use('snowpre') )   CALL iom_put('snowpre',MAX( (1.0-fr_i(:,:))*sprecip(:,:) ,0.0)) !!Joakim edit  
       ztmp(:,:)=MAX(fr_i(:,:)*sprecip(:,:),0.0)  
-      CALL nemo2cice(ztmp,fsnow,'T', 1. ) 
+      CALL nemo2cice(ztmp,fsnow,'T', 1._wp ) 
 
 ! Rainfall
       IF( iom_use('precip') )   CALL iom_put('precip', (1.0-fr_i(:,:))*(tprecip(:,:)-sprecip(:,:)) ) !!Joakim edit
       ztmp(:,:)=fr_i(:,:)*(tprecip(:,:)-sprecip(:,:))
-      CALL nemo2cice(ztmp,frain,'T', 1. ) 
+      CALL nemo2cice(ztmp,frain,'T', 1._wp ) 
 
 ! Freezing/melting potential
 ! Calculated over NEMO leapfrog timestep (hence 2*dt)
       nfrzmlt(:,:) = rho0 * rcp * e3t_m(:,:) * ( Tocnfrz-sst_m(:,:) ) / ( 2.0*dt )
 
       ztmp(:,:) = nfrzmlt(:,:)
-      CALL nemo2cice(ztmp,frzmlt,'T', 1. )
+      CALL nemo2cice(ztmp,frzmlt,'T', 1._wp )
 
 ! SST  and SSS
 
-      CALL nemo2cice(sst_m,sst,'T', 1. )
-      CALL nemo2cice(sss_m,sss,'T', 1. )
+      CALL nemo2cice(sst_m,sst,'T', 1._wp )
+      CALL nemo2cice(sss_m,sss,'T', 1._wp )
 
 ! x comp and y comp of surface ocean current
 ! U point to F point
       DO_2D( 1, 1, 1, 0 )
          ztmp(ji,jj)=0.5*(ssu_m(ji,jj)+ssu_m(ji,jj+1))*fmask(ji,jj,1)
       END_2D
-      CALL nemo2cice(ztmp,uocn,'F', -1. )
+      CALL nemo2cice(ztmp,uocn,'F', -1._wp )
 
 ! V point to F point
       DO_2D( 1, 0, 1, 1 )
          ztmp(ji,jj)=0.5*(ssv_m(ji,jj)+ssv_m(ji+1,jj))*fmask(ji,jj,1)
       END_2D
-      CALL nemo2cice(ztmp,vocn,'F', -1. )
+      CALL nemo2cice(ztmp,vocn,'F', -1._wp )
 
       IF( ln_ice_embd ) THEN             !== embedded sea ice: compute representative ice top surface ==!
           !
@@ -437,14 +437,14 @@ CONTAINS
          ztmp(ji,jj)=0.5 * (  (zpice(ji+1,jj  )-zpice(ji,jj  )) * r1_e1u(ji,jj  )    &
             &               + (zpice(ji+1,jj+1)-zpice(ji,jj+1)) * r1_e1u(ji,jj+1)  ) * fmask(ji,jj,1)
       END_2D
-      CALL nemo2cice( ztmp,ss_tltx,'F', -1. )
+      CALL nemo2cice( ztmp,ss_tltx,'F', -1._wp )
 
 ! T point to F point
       DO_2D( 1, 0, 1, 0 )
          ztmp(ji,jj)=0.5 * (  (zpice(ji  ,jj+1)-zpice(ji  ,jj)) * r1_e2v(ji  ,jj)    &
             &               + (zpice(ji+1,jj+1)-zpice(ji+1,jj)) * r1_e2v(ji+1,jj)  ) *  fmask(ji,jj,1)
       END_2D
-      CALL nemo2cice(ztmp,ss_tlty,'F', -1. )
+      CALL nemo2cice(ztmp,ss_tlty,'F', -1._wp )
       !
    END SUBROUTINE cice_sbc_in
 
@@ -466,7 +466,7 @@ CONTAINS
       ENDIF
       
 ! x comp of ocean-ice stress 
-      CALL cice2nemo(strocnx,ztmp1,'F', -1. )
+      CALL cice2nemo(strocnx,ztmp1,'F', -1._wp )
       ss_iou(:,:)=0.0
 ! F point to U point
       DO_2D( 0, 0, 0, 0 )
@@ -475,7 +475,7 @@ CONTAINS
       CALL lbc_lnk( 'sbcice_cice', ss_iou , 'U', -1.0_wp )
 
 ! y comp of ocean-ice stress 
-      CALL cice2nemo(strocny,ztmp1,'F', -1. )
+      CALL cice2nemo(strocny,ztmp1,'F', -1._wp )
       ss_iov(:,:)=0.0
 ! F point to V point
 
@@ -494,8 +494,8 @@ CONTAINS
  
 ! Also need ice/ocean stress on T points so that taum can be updated 
 ! This interpolation is already done in CICE so best to use those values 
-      CALL cice2nemo(strocnxT,ztmp1,'T',-1.) 
-      CALL cice2nemo(strocnyT,ztmp2,'T',-1.) 
+      CALL cice2nemo(strocnxT,ztmp1,'T',-1._wp) 
+      CALL cice2nemo(strocnyT,ztmp2,'T',-1._wp) 
  
 ! Update taum with modulus of ice-ocean stress 
 ! strocnxT and strocnyT are not weighted by ice fraction in CICE so must be done here 
@@ -518,11 +518,11 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
       ENDIF
 
 #if defined key_cice4
-      CALL cice2nemo(fresh_gbm,ztmp1,'T', 1. )
-      CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1. )
+      CALL cice2nemo(fresh_gbm,ztmp1,'T', 1._wp )
+      CALL cice2nemo(fsalt_gbm,ztmp2,'T', 1._wp )
 #else
-      CALL cice2nemo(fresh_ai,ztmp1,'T', 1. )
-      CALL cice2nemo(fsalt_ai,ztmp2,'T', 1. )
+      CALL cice2nemo(fresh_ai,ztmp1,'T', 1._wp )
+      CALL cice2nemo(fsalt_ai,ztmp2,'T', 1._wp )
 #endif
 
 ! Check to avoid unphysical expression when ice is forming (ztmp1 negative)
@@ -556,9 +556,9 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
 ! Now add in ice / snow related terms
 ! [fswthru will be zero unless running with calc_Tsfc=T in CICE]
 #if defined key_cice4
-      CALL cice2nemo(fswthru_gbm,ztmp1,'T', 1. )
+      CALL cice2nemo(fswthru_gbm,ztmp1,'T', 1._wp )
 #else
-      CALL cice2nemo(fswthru_ai,ztmp1,'T', 1. )
+      CALL cice2nemo(fswthru_ai,ztmp1,'T', 1._wp )
 #endif
       qsr(:,:)=qsr(:,:)+ztmp1(:,:)
       CALL lbc_lnk( 'sbcice_cice', qsr , 'T', 1.0_wp )
@@ -568,9 +568,9 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
       END_2D
 
 #if defined key_cice4
-      CALL cice2nemo(fhocn_gbm,ztmp1,'T', 1. )
+      CALL cice2nemo(fhocn_gbm,ztmp1,'T', 1._wp )
 #else
-      CALL cice2nemo(fhocn_ai,ztmp1,'T', 1. )
+      CALL cice2nemo(fhocn_ai,ztmp1,'T', 1._wp )
 #endif
       qns(:,:)=qns(:,:)+nfrzmlt(:,:)+ztmp1(:,:)
 
@@ -578,10 +578,10 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
 
 ! Prepare for the following CICE time-step
 
-      CALL cice2nemo(aice,fr_i,'T', 1. )
+      CALL cice2nemo(aice,fr_i,'T', 1._wp )
       IF( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN
          DO jl=1,ncat
-            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. )
+            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1._wp )
          ENDDO
       ENDIF
 
@@ -595,8 +595,8 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
       CALL lbc_lnk( 'sbcice_cice', fr_iu , 'U', 1.0_wp, fr_iv , 'V', 1.0_wp )
 
       ! set the snow+ice mass
-      CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1. )
-      CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1. )
+      CALL cice2nemo(vsno(:,:,:),ztmp1,'T', 1._wp )
+      CALL cice2nemo(vice(:,:,:),ztmp2,'T', 1._wp )
       snwice_mass  (:,:) = ( rhos * ztmp1(:,:) + rhoi * ztmp2(:,:)  )
       snwice_mass_b(:,:) = snwice_mass(:,:)
       snwice_fmass (:,:) = ( snwice_mass(:,:) - snwice_mass_b(:,:) ) / dt
@@ -628,16 +628,16 @@ taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1*ztmp1 + ztmp2*ztmp2)
       !
       ! x and y comp of ice velocity
       !
-      CALL cice2nemo(uvel,u_ice,'F', -1. )
-      CALL cice2nemo(vvel,v_ice,'F', -1. )
+      CALL cice2nemo(uvel,u_ice,'F', -1._wp )
+      CALL cice2nemo(vvel,v_ice,'F', -1._wp )
       !
       ! Ice concentration (CO_1) = a_i calculated at end of cice_sbc_out  
       !
       ! Snow and ice thicknesses (CO_2 and CO_3)
       !
       DO jl = 1, ncat
-         CALL cice2nemo( vsnon(:,:,jl,:), h_s(:,:,jl),'T', 1. )
-         CALL cice2nemo( vicen(:,:,jl,:), h_i(:,:,jl),'T', 1. )
+         CALL cice2nemo( vsnon(:,:,jl,:), h_s(:,:,jl),'T', 1._wp )
+         CALL cice2nemo( vicen(:,:,jl,:), h_i(:,:,jl),'T', 1._wp )
       END DO
       !
    END SUBROUTINE cice_sbc_hadgam
diff --git a/src/OCE/TRA/traadv_fct.F90 b/src/OCE/TRA/traadv_fct.F90
index ce6121a6ebbf686a009ea5431b5c24b976d6d412..d9b3eb5858e865dacc8182506e46c6c2da77a28c 100644
--- a/src/OCE/TRA/traadv_fct.F90
+++ b/src/OCE/TRA/traadv_fct.F90
@@ -391,23 +391,25 @@ CONTAINS
       !
       INTEGER  ::   ji, jj, jk   ! dummy loop indices
       INTEGER  ::   ikm1         ! local integer
-      REAL(dp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn    ! local scalars
-      REAL(dp) ::   zau, zbu, zcu, zav, zbv, zcv, zup, zdo            !   -      -
-      REAL(dp), DIMENSION(T2D(nn_hls),jpk) :: zbetup, zbetdo, zbup, zbdo
+      REAL(wp) ::   zpos, zneg, zbt, zbig                 ! local scalars
+      REAL(wp) ::   zup, zdo                              !   -      -
+      REAL(wp), DIMENSION(T2D(nn_hls),jpk) :: zbetup, zbetdo, zbup, zbdo
       !!----------------------------------------------------------------------
       !
-      zbig  = 1.e+40_dp
-      zrtrn = 1.e-15_dp
-      zbetup(:,:,:) = 0._dp   ;   zbetdo(:,:,:) = 0._dp
+      zbig = HUGE(1._wp)
+      zbetup(:,:,jpk) = zbig   ;   zbetdo(:,:,jpk) = zbig
 
       ! Search local extrema
       ! --------------------
       ! max/min of pbef & paft with large negative/positive value (-/+zbig) inside land
       DO_3D( nn_hls, nn_hls, nn_hls, nn_hls, 1, jpk )
-         zbup(ji,jj,jk) = MAX( pbef(ji,jj,jk) * tmask(ji,jj,jk) - zbig * ( 1._wp - tmask(ji,jj,jk) ),   &
-            &                  paft(ji,jj,jk) * tmask(ji,jj,jk) - zbig * ( 1._wp - tmask(ji,jj,jk) )  )
-         zbdo(ji,jj,jk) = MIN( pbef(ji,jj,jk) * tmask(ji,jj,jk) + zbig * ( 1._wp - tmask(ji,jj,jk) ),   &
-            &                  paft(ji,jj,jk) * tmask(ji,jj,jk) + zbig * ( 1._wp - tmask(ji,jj,jk) )  )
+         IF( tmask(ji,jj,jk) == 1._wp ) THEN
+            zbup(ji,jj,jk) = MAX( pbef(ji,jj,jk), paft(ji,jj,jk) )
+            zbdo(ji,jj,jk) = MIN( pbef(ji,jj,jk), paft(ji,jj,jk) )
+         ELSE
+            zbup(ji,jj,jk) = -zbig
+            zbdo(ji,jj,jk) =  zbig
+         ENDIF
       END_3D
 
       DO jk = 1, jpkm1
@@ -427,41 +429,38 @@ CONTAINS
                &        zbdo(ji  ,jj  ,ikm1), zbdo(ji  ,jj  ,jk+1)  )
 
             ! positive part of the flux
-            zpos = MAX( 0., paa(ji-1,jj  ,jk  ) ) - MIN( 0., paa(ji  ,jj  ,jk  ) )   &
-               & + MAX( 0., pbb(ji  ,jj-1,jk  ) ) - MIN( 0., pbb(ji  ,jj  ,jk  ) )   &
-               & + MAX( 0., pcc(ji  ,jj  ,jk+1) ) - MIN( 0., pcc(ji  ,jj  ,jk  ) )
+            zpos = MAX( 0._wp, paa(ji-1,jj  ,jk  ) ) - MIN( 0._wp, paa(ji  ,jj  ,jk  ) )   &
+               & + MAX( 0._wp, pbb(ji  ,jj-1,jk  ) ) - MIN( 0._wp, pbb(ji  ,jj  ,jk  ) )   &
+               & + MAX( 0._wp, pcc(ji  ,jj  ,jk+1) ) - MIN( 0._wp, pcc(ji  ,jj  ,jk  ) )
 
             ! negative part of the flux
-            zneg = MAX( 0., paa(ji  ,jj  ,jk  ) ) - MIN( 0., paa(ji-1,jj  ,jk  ) )   &
-               & + MAX( 0., pbb(ji  ,jj  ,jk  ) ) - MIN( 0., pbb(ji  ,jj-1,jk  ) )   &
-               & + MAX( 0., pcc(ji  ,jj  ,jk  ) ) - MIN( 0., pcc(ji  ,jj  ,jk+1) )
+            zneg = MAX( 0._wp, paa(ji  ,jj  ,jk  ) ) - MIN( 0._wp, paa(ji-1,jj  ,jk  ) )   &
+               & + MAX( 0._wp, pbb(ji  ,jj  ,jk  ) ) - MIN( 0._wp, pbb(ji  ,jj-1,jk  ) )   &
+               & + MAX( 0._wp, pcc(ji  ,jj  ,jk  ) ) - MIN( 0._wp, pcc(ji  ,jj  ,jk+1) )
 
             ! up & down beta terms
             zbt = e1e2t(ji,jj) * e3t(ji,jj,jk,Kaa) / p2dt
-            zbetup(ji,jj,jk) = ( zup            - paft(ji,jj,jk) ) / ( zpos + zrtrn ) * zbt
-            zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo            ) / ( zneg + zrtrn ) * zbt
+            IF( zup /= -zbig .AND. zpos /= 0._wp ) THEN   ;   zbetup(ji,jj,jk) = ( zup - paft(ji,jj,jk) ) / zpos * zbt
+            ELSE                                          ;   zbetup(ji,jj,jk) = zbig
+            ENDIF
+            IF( zdo /=  zbig .AND. zneg /= 0._wp ) THEN   ;   zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zdo ) / zneg * zbt
+            ELSE                                          ;   zbetdo(ji,jj,jk) = zbig
+            ENDIF
          END_2D
       END DO
 
-      ! 3. monotonic flux in the i & j direction (paa & pbb)
-      ! ----------------------------------------
+      ! 3. monotonic flux in the i, j and k direction (paa, pbb and pcc)
+      ! ----------------------------------------------------------------
       DO_3D( 1, 0, 1, 0, 1, jpkm1 )
-         zau = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) )
-         zbu = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) )
-         zcu =       ( 0.5  + SIGN( 0.5_wp , paa(ji,jj,jk) ) )
-         paa(ji,jj,jk) = paa(ji,jj,jk) * ( zcu * zau + ( 1._wp - zcu) * zbu )
-
-         zav = MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji,jj+1,jk) )
-         zbv = MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji,jj+1,jk) )
-         zcv =       ( 0.5  + SIGN( 0.5_wp , pbb(ji,jj,jk) ) )
-         pbb(ji,jj,jk) = pbb(ji,jj,jk) * ( zcv * zav + ( 1._wp - zcv) * zbv )
-
-      ! monotonic flux in the k direction, i.e. pcc
-      ! -------------------------------------------
-         za = MIN( 1., zbetdo(ji,jj,jk+1), zbetup(ji,jj,jk) )
-         zb = MIN( 1., zbetup(ji,jj,jk+1), zbetdo(ji,jj,jk) )
-         zc =       ( 0.5  + SIGN( 0.5_wp , pcc(ji,jj,jk+1) ) )
-         pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * ( zc * za + ( 1._wp - zc) * zb )
+         IF( paa(ji,jj,jk) > 0._wp ) THEN   ;   paa(ji,jj,jk) = paa(ji,jj,jk) * MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji+1,jj,jk) )
+         ELSE                               ;   paa(ji,jj,jk) = paa(ji,jj,jk) * MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji+1,jj,jk) )
+         ENDIF
+         IF( pbb(ji,jj,jk) > 0._wp ) THEN   ;   pbb(ji,jj,jk) = pbb(ji,jj,jk) * MIN( 1._wp, zbetdo(ji,jj,jk), zbetup(ji,jj+1,jk) )
+         ELSE                               ;   pbb(ji,jj,jk) = pbb(ji,jj,jk) * MIN( 1._wp, zbetup(ji,jj,jk), zbetdo(ji,jj+1,jk) )
+         ENDIF
+         IF( pcc(ji,jj,jk+1) > 0._wp ) THEN   ;   pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * MIN( 1._wp, zbetdo(ji,jj,jk+1), zbetup(ji,jj,jk) )
+         ELSE                                 ;   pcc(ji,jj,jk+1) = pcc(ji,jj,jk+1) * MIN( 1._wp, zbetup(ji,jj,jk+1), zbetdo(ji,jj,jk) )
+         ENDIF
       END_3D
       !
    END SUBROUTINE nonosc
diff --git a/src/OCE/TRA/traadv_ubs.F90 b/src/OCE/TRA/traadv_ubs.F90
index 02d4d064912b58a344d7b7a1e135b7d66eca3bef..0ebea711f769f6bc2e07a42986f7089ed3a021e6 100644
--- a/src/OCE/TRA/traadv_ubs.F90
+++ b/src/OCE/TRA/traadv_ubs.F90
@@ -285,7 +285,7 @@ CONTAINS
       REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
       !!----------------------------------------------------------------------
       !
-      zbig  = 1.e+38_wp
+      zbig  = 1.e+20_wp   ! works ok with simple/double precison
       zrtrn = 1.e-15_wp
       zbetup(:,:,:) = 0._wp   ;   zbetdo(:,:,:) = 0._wp
       !
diff --git a/src/OCE/TRA/traadv_ubs_lf.F90 b/src/OCE/TRA/traadv_ubs_lf.F90
index 4a2b696c755c35e9ca862ab4c7eb6522102a6d9b..56b5e26b6ede932b6dc51a1a01c0b8bcc1b1c364 100644
--- a/src/OCE/TRA/traadv_ubs_lf.F90
+++ b/src/OCE/TRA/traadv_ubs_lf.F90
@@ -298,7 +298,7 @@ CONTAINS
       REAL(wp), DIMENSION(T2D(nn_hls),jpk) ::   zbetup, zbetdo         ! 3D workspace
       !!----------------------------------------------------------------------
       !
-      zbig  = 1.e+38_wp
+      zbig  = 1.e+20_wp   ! works ok with simple/double precison
       zrtrn = 1.e-15_wp
       zbetup(:,:,:) = 0._wp   ;   zbetdo(:,:,:) = 0._wp
       !
diff --git a/src/OCE/TRA/traqsr.F90 b/src/OCE/TRA/traqsr.F90
index 765d7313e72ffba4c2e9facd34b42e58e1af38c0..0975038a9980457282ac657899511c3d80274c86 100644
--- a/src/OCE/TRA/traqsr.F90
+++ b/src/OCE/TRA/traqsr.F90
@@ -77,6 +77,7 @@ MODULE traqsr
    REAL(wp) ::   r1_si0                 ! all schemes : infrared  = 1/rn_si0 
    REAL(wp) ::   r1_si1                 ! 2 band      : mean RGB  = 1/rn_si1   
    REAL(wp) ::   r1_LR, r1_LG, r1_LB    ! RGB with constant Chl (np_RGB)
+   REAL(wp) ::   zz0
    !
    REAL(wp) , PUBLIC, DIMENSION(3,61)   ::   rkrgb    ! tabulated attenuation coefficients for RGB absorption
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_chl   ! structure of input Chl (file informations, fields read)
@@ -209,8 +210,9 @@ CONTAINS
       !
       ! sea-ice: store the 1st ocean level attenuation coefficient
       DO_2D( 0, 0, 0, 0 )
-         IF( qsr(ji,jj) /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / ( r1_rho0_rcp * qsr(ji,jj) )
-         ELSE                             ;   fraqsr_1lev(ji,jj) = 1._wp
+         zz0 = r1_rho0_rcp * qsr(ji,jj)   ! test zz0 and not qsr for rounding errors in single precision
+         IF( zz0 /= 0._wp ) THEN   ;   fraqsr_1lev(ji,jj) = qsr_hc(ji,jj,1) / zz0
+         ELSE                      ;   fraqsr_1lev(ji,jj) = 1._wp
          ENDIF
       END_2D
       !
diff --git a/src/OCE/ZDF/zdfddm.F90 b/src/OCE/ZDF/zdfddm.F90
index 5fa6c719accb7b97fe379cb548384b3245525110..6d02b23ce600b82f77031c6fbf6f3ea6c76b4463 100644
--- a/src/OCE/ZDF/zdfddm.F90
+++ b/src/OCE/ZDF/zdfddm.F90
@@ -142,7 +142,7 @@ CONTAINS
             ! salt fingering
             zrr = zrau(ji,jj) / rn_hsbfr
             zrr = zrr * zrr
-            zavfs = rn_avts / ( 1 + zrr*zrr*zrr ) * zmsks(ji,jj) * zmskf(ji,jj)
+            zavfs = rn_avts / ( 1. + zrr*zrr*zrr ) * zmsks(ji,jj) * zmskf(ji,jj)
             zavft = 0.7 * zavfs * zinr
             ! diffusive layering
             zavdt = 1.3635e-6 * EXP(  4.6 * EXP( -0.54*(zinr-1.) )  ) * zmsks(ji,jj) * zmskd1(ji,jj)
diff --git a/src/OCE/ZDF/zdftke.F90 b/src/OCE/ZDF/zdftke.F90
index 4435eb13ee1157b1542b58e7bf9444ed9080a3bc..f2499f8bce6d3f9efab346bfefe772db2ee2baca 100644
--- a/src/OCE/ZDF/zdftke.F90
+++ b/src/OCE/ZDF/zdftke.F90
@@ -218,6 +218,7 @@ CONTAINS
       REAL(wp), DIMENSION(T2D(0))     ::   zice_fra, zhlc, zus3, zWlc2
       REAL(wp), DIMENSION(T2D(0),jpk) ::   zpelc, zdiag, zd_up, zd_lw
       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztmp ! for diags
+      REAL(wp) :: zdiv
       !!--------------------------------------------------------------------
       !
       zbbrau  = rn_ebb / rho0       ! Local constant initialisation
@@ -369,7 +370,16 @@ CONTAINS
             IF (rn2b(ji,jj,jk) <= 0.0_wp) then
                 zri = 0.0_wp
             ELSE
-                zri = rn2b(ji,jj,jk) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear )
+                ! This logic is to avoid divide-by-zero errors which can occur for single-precision
+                ! The actual value you choose for the denominator instead of zero doesn't really
+                ! matter, as long as it is very small and so triggers the same logic below with the
+                ! inverse Prandtl number
+                zdiv = p_sh2(ji,jj,jk) + rn_bshear
+                IF (zdiv == 0.0_wp) THEN
+                   zri = rn2b(ji,jj,jk) * p_avm(ji,jj,jk) / rn_bshear
+                ELSE
+                   zri = rn2b(ji,jj,jk) * p_avm(ji,jj,jk) / zdiv
+                ENDIF
             ENDIF
             !                             ! inverse of Prandtl number
             apdlr(ji,jj,jk) = MAX(  0.1_wp,  ri_cri / MAX( ri_cri , zri )  )
diff --git a/src/OCE/lib_fortran.F90 b/src/OCE/lib_fortran.F90
index e7538e7c89cd3ee0a45db16bda946154de5e0ad3..0a4ac708ded389bce46657c7d4eb9ceef643c8c4 100644
--- a/src/OCE/lib_fortran.F90
+++ b/src/OCE/lib_fortran.F90
@@ -241,7 +241,7 @@ CONTAINS
          &   + AIMAG(ydda)         + AIMAG(yddb)
       !
       ! The result is t1 + t2, after normalization.
-      yddb = CMPLX( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1), wp )
+      yddb = CMPLX( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1), dp )
       !
    END SUBROUTINE DDPDD
 
diff --git a/src/OCE/module_example.F90 b/src/OCE/module_example.F90
index b0198f02333a07c85e03c7f7b54a742bca946536..fc9c8c8c9b334a5f1c6abefeb9e9356f6996694a 100644
--- a/src/OCE/module_example.F90
+++ b/src/OCE/module_example.F90
@@ -126,7 +126,7 @@ CONTAINS
       !
       ! WARNING! the lbc_lnk call could not be compatible with the tiling approach
       ! please refer to the manual for how to adapt your code
-      CALL lbc_lnk( 'module_example', avm, 'T', 1. )     ! Lateral boundary conditions (unchanged sign)
+      CALL lbc_lnk( 'module_example', avm, 'T', 1._wp )     ! Lateral boundary conditions (unchanged sign)
       !
    END SUBROUTINE exa_mpl
 
diff --git a/src/OCE/stpmlf.F90 b/src/OCE/stpmlf.F90
index 6a49213c47f818a2189ac110fa366df8d017f667..9d7c7c0adff311c450dc5c9bdccaa8cde095c9c9 100644
--- a/src/OCE/stpmlf.F90
+++ b/src/OCE/stpmlf.F90
@@ -538,8 +538,8 @@ CONTAINS
             CALL Agrif_dyn( kt )
 # endif
       !                                        ! local domain boundaries  (T-point, unchanged sign)
-      CALL lbc_lnk( 'finalize_lbc', puu(:,:,:,       Kaa), 'U', -1., pvv(:,:,:       ,Kaa), 'V', -1.   &
-                       &          , pts(:,:,:,jp_tem,Kaa), 'T',  1., pts(:,:,:,jp_sal,Kaa), 'T',  1. )
+      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 )
       !
       ! lbc_lnk needed for zdf_sh2, moved here to allow tiling in zdf_phy
       IF( l_zdfsh2 ) CALL lbc_lnk( 'stp', avm_k, 'W', 1.0_wp )
diff --git a/src/OCE/stprk3_stg.F90 b/src/OCE/stprk3_stg.F90
index d1c35aa965a955da0346005d378d7f854e9ae0db..d45a6c744a607faa3fd2312de00c2ccf694e299d 100644
--- a/src/OCE/stprk3_stg.F90
+++ b/src/OCE/stprk3_stg.F90
@@ -447,8 +447,8 @@ CONTAINS
             CALL Agrif_dyn( kstp, kstg )
 # endif
       !                                              !* local domain boundaries  (T-point, unchanged sign)
-      CALL lbc_lnk( 'stp_RK3_stg', uu(:,:,:,       Kaa), 'U', -1., vv(:,:,:       ,Kaa), 'V', -1.   &
-         &                       , ts(:,:,:,jp_tem,Kaa), 'T',  1., ts(:,:,:,jp_sal,Kaa), 'T',  1. )
+      CALL lbc_lnk( 'stp_RK3_stg', uu(:,:,:,       Kaa), 'U', -1._wp, vv(:,:,:       ,Kaa), 'V', -1._wp   &
+         &                       , ts(:,:,:,jp_tem,Kaa), 'T',  1._wp, ts(:,:,:,jp_sal,Kaa), 'T',  1._wp )
       !
       IF( l_zdfsh2 ) CALL lbc_lnk( 'stp_RK3_stg', avm_k, 'W', 1.0_wp )   !  lbc_lnk needed for zdf_sh2, moved here to allow tiling in zdf_phy
       !
diff --git a/src/OCE/timing.F90 b/src/OCE/timing.F90
index c63003d8b66e5ffb901c471502339be6d98c2eeb..4c1becfe14fdbb9d97515b9e884015d8842ccfa4 100644
--- a/src/OCE/timing.F90
+++ b/src/OCE/timing.F90
@@ -39,7 +39,7 @@ MODULE timing
       CHARACTER(LEN=20)  :: cname
       CHARACTER(LEN=20)  :: surname
       INTEGER :: rank
-      REAL(wp)  :: t_cpu, t_clock, tsum_cpu, tsum_clock, tmax_cpu, tmax_clock, tmin_cpu, tmin_clock, tsub_cpu, tsub_clock
+      REAL(dp)  :: t_cpu, t_clock, tsum_cpu, tsum_clock, tmax_cpu, tmax_clock, tmin_cpu, tmin_clock, tsub_cpu, tsub_clock
       INTEGER :: ncount, ncount_max, ncount_rate
       INTEGER :: niter
       LOGICAL :: l_tdone
@@ -50,8 +50,8 @@ MODULE timing
 
    TYPE alltimer
       CHARACTER(LEN=20), DIMENSION(:), POINTER :: cname => NULL()
-      REAL(wp), DIMENSION(:), POINTER :: tsum_cpu   => NULL()
-      REAL(wp), DIMENSION(:), POINTER :: tsum_clock => NULL()
+      REAL(dp), DIMENSION(:), POINTER :: tsum_cpu   => NULL()
+      REAL(dp), DIMENSION(:), POINTER :: tsum_clock => NULL()
       INTEGER, DIMENSION(:), POINTER :: niter => NULL()
       TYPE(alltimer), POINTER :: next => NULL()
       TYPE(alltimer), POINTER :: prev => NULL()
@@ -62,14 +62,14 @@ MODULE timing
    TYPE(timer), POINTER :: s_timer_old      => NULL()
 
    TYPE(timer), POINTER :: s_wrk        => NULL()
-   REAL(wp) :: t_overclock, t_overcpu
+   REAL(dp) :: t_overclock, t_overcpu
    LOGICAL :: l_initdone = .FALSE.
    INTEGER :: nsize
 
    ! Variables for coarse grain timing
-   REAL(wp) :: tot_etime, tot_ctime
-   REAL(kind=wp), DIMENSION(2)     :: t_elaps, t_cpu
-   REAL(wp), ALLOCATABLE, DIMENSION(:) :: all_etime, all_ctime
+   REAL(dp) :: tot_etime, tot_ctime
+   REAL(kind=dp), DIMENSION(2)     :: t_elaps, t_cpu
+   REAL(dp), ALLOCATABLE, DIMENSION(:) :: all_etime, all_ctime
    INTEGER :: nfinal_count, ncount, ncount_rate, ncount_max
    INTEGER, DIMENSION(8)           :: nvalues
    CHARACTER(LEN=8), DIMENSION(2)  :: cdate
@@ -136,7 +136,7 @@ CONTAINS
       CHARACTER(len=*), INTENT(in), OPTIONAL :: csection
       !
       INTEGER  :: ifinal_count, iperiods
-      REAL(wp) :: zcpu_end, zmpitime,zcpu_raw,zclock_raw
+      REAL(dp) :: zcpu_end, zmpitime,zcpu_raw,zclock_raw
       !
       s_wrk => NULL()
 
@@ -218,7 +218,7 @@ CONTAINS
       !! ** Purpose :   open timing output file
       !!----------------------------------------------------------------------
       INTEGER :: iperiods, istart_count, ifinal_count
-      REAL(wp) :: zdum
+      REAL(dp) :: zdum
       LOGICAL :: ll_f
       CHARACTER(len=*), INTENT(in), OPTIONAL :: clname
       CHARACTER(len=20)                      :: cln
@@ -295,9 +295,9 @@ CONTAINS
       INTEGER :: ji
       LOGICAL :: ll_ord, ll_averep
       CHARACTER(len=120) :: clfmt
-      REAL(wp), DIMENSION(:), ALLOCATABLE ::   timing_glob
-      REAL(wp) ::   zsypd   ! simulated years per day (Balaji 2017)
-      REAL(wp) ::   zperc, ztot
+      REAL(dp), DIMENSION(:), ALLOCATABLE ::   timing_glob
+      REAL(dp) ::   zsypd   ! simulated years per day (Balaji 2017)
+      REAL(dp) ::   zperc, ztot
 
       ll_averep = .TRUE.
 
@@ -387,16 +387,16 @@ CONTAINS
          WRITE(numtime,*) '    warning: includes restarts writing time if output before nitend... '
          WRITE(numtime,*) ' '
          DO ji = 1, jpnij
-            zperc = 0._wp ; zsypd = 0._wp
+            zperc = 0._dp ; zsypd = 0._dp
             ztot = SUM( timing_glob(4*ji-3:4*ji-1) )
             WRITE(numtime,'(A28,F11.6,            A34,I8)') 'Computing       time : ',timing_glob(4*ji-3), ' on MPI rank : ', ji
-            IF ( ztot /= 0._wp ) zperc = timing_glob(4*ji-2) / ztot * 100.
+            IF ( ztot /= 0._dp ) zperc = timing_glob(4*ji-2) / ztot * 100.
             WRITE(numtime,'(A28,F11.6,A2, F4.1,A3,A25,I8)') 'Waiting lbc_lnk time : ',timing_glob(4*ji-2)   &
                &                                                         , ' (',      zperc,' %)',   ' on MPI rank : ', ji
-            IF ( ztot /= 0._wp ) zperc = timing_glob(4*ji-1) / ztot * 100.
+            IF ( ztot /= 0._dp ) zperc = timing_glob(4*ji-1) / ztot * 100.
             WRITE(numtime,'(A28,F11.6,A2, F4.1,A3,A25,I8)') 'Waiting  global time : ',timing_glob(4*ji-1)   &
                &                                                         , ' (',      zperc,' %)',   ' on MPI rank : ', ji
-            IF ( timing_glob(4*ji) /= 0._wp ) zsypd = rn_Dt * REAL(nitend-nit000-1, wp) / (timing_glob(4*ji) * 365.)
+            IF ( timing_glob(4*ji) /= 0._dp ) zsypd = rn_Dt * REAL(nitend-nit000-1, dp) / (timing_glob(4*ji) * 365.)
             WRITE(numtime,'(A28,F11.6,A7,F10.3,A2,A15,I8)') 'Total           time : ',timing_glob(4*ji  )   &
                &                                                         , ' (SYPD: ', zsypd, ')',   ' on MPI rank : ', ji
          END DO
@@ -447,7 +447,7 @@ CONTAINS
       s_timer => s_timer_root
       clfmt = '(1x,a,4x,f12.3,6x,f12.3,x,f12.3,2x,f12.3,6x,f7.3,2x,i9)'
       DO WHILE ( ASSOCIATED(s_timer) )
-         IF( s_timer%tsum_clock > 0._wp )                                &
+         IF( s_timer%tsum_clock > 0._dp )                                &
             WRITE(numtime,TRIM(clfmt))   s_timer%cname,                  &
             &   s_timer%tsum_clock,s_timer%tsum_clock*100./t_elaps(2),   &
             &   s_timer%tsum_cpu  ,s_timer%tsum_cpu*100./t_cpu(2)    ,   &
@@ -489,8 +489,8 @@ CONTAINS
          RETURN
       END IF
       sl_timer_glob_root%cname(:)       = ''
-      sl_timer_glob_root%tsum_cpu(:)   = 0._wp
-      sl_timer_glob_root%tsum_clock(:) = 0._wp
+      sl_timer_glob_root%tsum_cpu(:)   = 0._dp
+      sl_timer_glob_root%tsum_clock(:) = 0._dp
       sl_timer_glob_root%niter(:)      = 0
       sl_timer_glob_root%next => NULL()
       sl_timer_glob_root%prev => NULL()
@@ -506,16 +506,16 @@ CONTAINS
       IF( narea .EQ. 1 ) THEN
          ALLOCATE(sl_timer_ave_root)
          sl_timer_ave_root%cname       = ''
-         sl_timer_ave_root%t_cpu      = 0._wp
-         sl_timer_ave_root%t_clock    = 0._wp
-         sl_timer_ave_root%tsum_cpu   = 0._wp
-         sl_timer_ave_root%tsum_clock = 0._wp
-         sl_timer_ave_root%tmax_cpu   = 0._wp
-         sl_timer_ave_root%tmax_clock = 0._wp
-         sl_timer_ave_root%tmin_cpu   = 0._wp
-         sl_timer_ave_root%tmin_clock = 0._wp
-         sl_timer_ave_root%tsub_cpu   = 0._wp
-         sl_timer_ave_root%tsub_clock = 0._wp
+         sl_timer_ave_root%t_cpu      = 0._dp
+         sl_timer_ave_root%t_clock    = 0._dp
+         sl_timer_ave_root%tsum_cpu   = 0._dp
+         sl_timer_ave_root%tsum_clock = 0._dp
+         sl_timer_ave_root%tmax_cpu   = 0._dp
+         sl_timer_ave_root%tmax_clock = 0._dp
+         sl_timer_ave_root%tmin_cpu   = 0._dp
+         sl_timer_ave_root%tmin_clock = 0._dp
+         sl_timer_ave_root%tsub_cpu   = 0._dp
+         sl_timer_ave_root%tsub_clock = 0._dp
          sl_timer_ave_root%ncount      = 0
          sl_timer_ave_root%ncount_rate = 0
          sl_timer_ave_root%ncount_max  = 0
@@ -642,10 +642,10 @@ CONTAINS
       !
       INTEGER                            :: idum, icode
       INTEGER, ALLOCATABLE, DIMENSION(:) :: iall_rank
-      REAL(wp) :: ztot_ratio
-      REAL(wp) :: zmax_etime, zmax_ctime, zmax_ratio, zmin_etime, zmin_ctime, zmin_ratio
-      REAL(wp) :: zavg_etime, zavg_ctime, zavg_ratio
-      REAL(wp), ALLOCATABLE, DIMENSION(:) :: zall_ratio
+      REAL(dp) :: ztot_ratio
+      REAL(dp) :: zmax_etime, zmax_ctime, zmax_ratio, zmin_etime, zmin_ctime, zmin_ratio
+      REAL(dp) :: zavg_etime, zavg_ctime, zavg_ratio
+      REAL(dp), ALLOCATABLE, DIMENSION(:) :: zall_ratio
       CHARACTER(LEN=128), dimension(8) :: cllignes
       CHARACTER(LEN=128)               :: clhline, clstart_date, clfinal_date
       CHARACTER(LEN=2048)              :: clfmt
@@ -656,19 +656,19 @@ CONTAINS
          iall_rank(:) = (/ (idum,idum=0,jpnij-1) /)
 
          ! Compute elapse user time
-         zavg_etime = tot_etime/REAL(jpnij,wp)
+         zavg_etime = tot_etime/REAL(jpnij,dp)
          zmax_etime = MAXVAL(all_etime(:))
          zmin_etime = MINVAL(all_etime(:))
 
          ! Compute CPU user time
-         zavg_ctime = tot_ctime/REAL(jpnij,wp)
+         zavg_ctime = tot_ctime/REAL(jpnij,dp)
          zmax_ctime = MAXVAL(all_ctime(:))
          zmin_ctime = MINVAL(all_ctime(:))
 
          ! Compute cpu/elapsed ratio
          zall_ratio(:) = all_ctime(:) / all_etime(:)
          ztot_ratio    = SUM(all_ctime(:))/SUM(all_etime(:))
-         zavg_ratio    = SUM(zall_ratio(:))/REAL(jpnij,wp)
+         zavg_ratio    = SUM(zall_ratio(:))/REAL(jpnij,dp)
          zmax_ratio    = MAXVAL(zall_ratio(:))
          zmin_ratio    = MINVAL(zall_ratio(:))
 
@@ -714,16 +714,16 @@ CONTAINS
       IF( .NOT. ASSOCIATED(s_timer_root) ) THEN
          ALLOCATE(s_timer_root)
          s_timer_root%cname       = cdinfo
-         s_timer_root%t_cpu      = 0._wp
-         s_timer_root%t_clock    = 0._wp
-         s_timer_root%tsum_cpu   = 0._wp
-         s_timer_root%tsum_clock = 0._wp
-         s_timer_root%tmax_cpu   = 0._wp
-         s_timer_root%tmax_clock = 0._wp
-         s_timer_root%tmin_cpu   = 0._wp
-         s_timer_root%tmin_clock = 0._wp
-         s_timer_root%tsub_cpu   = 0._wp
-         s_timer_root%tsub_clock = 0._wp
+         s_timer_root%t_cpu      = 0._dp
+         s_timer_root%t_clock    = 0._dp
+         s_timer_root%tsum_cpu   = 0._dp
+         s_timer_root%tsum_clock = 0._dp
+         s_timer_root%tmax_cpu   = 0._dp
+         s_timer_root%tmax_clock = 0._dp
+         s_timer_root%tmin_cpu   = 0._dp
+         s_timer_root%tmin_clock = 0._dp
+         s_timer_root%tsub_cpu   = 0._dp
+         s_timer_root%tsub_clock = 0._dp
          s_timer_root%ncount      = 0
          s_timer_root%ncount_rate = 0
          s_timer_root%ncount_max  = 0
@@ -738,16 +738,16 @@ CONTAINS
          !
          ALLOCATE(s_timer_old)
          s_timer_old%cname       = cdinfo
-         s_timer_old%t_cpu      = 0._wp
-         s_timer_old%t_clock    = 0._wp
-         s_timer_old%tsum_cpu   = 0._wp
-         s_timer_old%tsum_clock = 0._wp
-         s_timer_old%tmax_cpu   = 0._wp
-         s_timer_old%tmax_clock = 0._wp
-         s_timer_old%tmin_cpu   = 0._wp
-         s_timer_old%tmin_clock = 0._wp
-         s_timer_old%tsub_cpu   = 0._wp
-         s_timer_old%tsub_clock = 0._wp
+         s_timer_old%t_cpu      = 0._dp
+         s_timer_old%t_clock    = 0._dp
+         s_timer_old%tsum_cpu   = 0._dp
+         s_timer_old%tsum_clock = 0._dp
+         s_timer_old%tmax_cpu   = 0._dp
+         s_timer_old%tmax_clock = 0._dp
+         s_timer_old%tmin_cpu   = 0._dp
+         s_timer_old%tmin_clock = 0._dp
+         s_timer_old%tsub_cpu   = 0._dp
+         s_timer_old%tsub_clock = 0._dp
          s_timer_old%ncount      = 0
          s_timer_old%ncount_rate = 0
          s_timer_old%ncount_max  = 0
@@ -780,16 +780,16 @@ CONTAINS
     !     write(*,*) 'after allocation of next'
 
          s_timer%next%cname       = cdinfo
-         s_timer%next%t_cpu      = 0._wp
-         s_timer%next%t_clock    = 0._wp
-         s_timer%next%tsum_cpu   = 0._wp
-         s_timer%next%tsum_clock = 0._wp
-         s_timer%next%tmax_cpu   = 0._wp
-         s_timer%next%tmax_clock = 0._wp
-         s_timer%next%tmin_cpu   = 0._wp
-         s_timer%next%tmin_clock = 0._wp
-         s_timer%next%tsub_cpu   = 0._wp
-         s_timer%next%tsub_clock = 0._wp
+         s_timer%next%t_cpu      = 0._dp
+         s_timer%next%t_clock    = 0._dp
+         s_timer%next%tsum_cpu   = 0._dp
+         s_timer%next%tsum_clock = 0._dp
+         s_timer%next%tmax_cpu   = 0._dp
+         s_timer%next%tmax_clock = 0._dp
+         s_timer%next%tmin_cpu   = 0._dp
+         s_timer%next%tmin_clock = 0._dp
+         s_timer%next%tsub_cpu   = 0._dp
+         s_timer%next%tsub_clock = 0._dp
          s_timer%next%ncount      = 0
          s_timer%next%ncount_rate = 0
          s_timer%next%ncount_max  = 0
diff --git a/src/SWE/stpmlf.F90 b/src/SWE/stpmlf.F90
index 4c542fb18111582d1888d1f036758de17b59b3ea..f358a28269a2aa93c1a6b199071263b839c606ef 100644
--- a/src/SWE/stpmlf.F90
+++ b/src/SWE/stpmlf.F90
@@ -196,9 +196,9 @@ CONTAINS
          ENDIF
       ENDIF
 
-      CALL lbc_lnk( 'stp_MLF', uu (:,:,:,Nnn), 'U', -1., vv (:,:,:,Nnn), 'V', -1., &   !* local domain boundaries
-         &                     uu (:,:,:,Naa), 'U', -1., vv (:,:,:,Naa), 'V', -1.  )     
-      CALL lbc_lnk( 'stp_MLF', r3u(:,:,  Naa), 'U',  1., r3v(:,:,  Naa), 'V',  1.  )
+      CALL lbc_lnk( 'stp_MLF', uu (:,:,:,Nnn), 'U', -1._wp, vv (:,:,:,Nnn), 'V', -1._wp, &   !* local domain boundaries
+         &                     uu (:,:,:,Naa), 'U', -1._wp, vv (:,:,:,Naa), 'V', -1._wp  )     
+      CALL lbc_lnk( 'stp_MLF', r3u(:,:,  Naa), 'U',  1._wp, r3v(:,:,  Naa), 'V',  1._wp  )
 
       !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
       ! Set boundary conditions, time filter and swap time levels
diff --git a/src/SWE/stprk3.F90 b/src/SWE/stprk3.F90
index 0aa6cd2f7a22b14fa7ddf69adb2abaec2a5d975a..d0597b4451d55f0d433a4be1e95da292ddd00294 100644
--- a/src/SWE/stprk3.F90
+++ b/src/SWE/stprk3.F90
@@ -170,8 +170,8 @@ CONTAINS
          END_3D
       ENDIF
       !
-      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1., vv (:,:,:,Naa), 'V', -1. )
-      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1., r3v(:,:,  Naa), 'V',  1. )
+      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1._wp, vv (:,:,:,Naa), 'V', -1._wp )
+      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1._wp, r3v(:,:,  Naa), 'V',  1._wp )
       !
       !                                 !==  Swap time levels  ==!
       Nrhs= Nnn
@@ -236,8 +236,8 @@ CONTAINS
          END_3D
       ENDIF
       !
-      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1., vv (:,:,:,Naa), 'V', -1. )
-      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1., r3v(:,:,  Naa), 'V',  1. )
+      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1._wp, vv (:,:,:,Naa), 'V', -1._wp )
+      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1._wp, r3v(:,:,  Naa), 'V',  1._wp )
       !
       !                                 !==  Swap time levels  ==!
       Nrhs= Nnn
@@ -300,8 +300,8 @@ CONTAINS
          END_3D
       ENDIF
       !
-      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1., vv (:,:,:,Naa), 'V', -1. )
-      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1., r3v(:,:,  Naa), 'V',  1. )
+      CALL lbc_lnk( 'stp_RK3', uu (:,:,:,Naa), 'U', -1._wp, vv (:,:,:,Naa), 'V', -1._wp )
+      CALL lbc_lnk( 'stp_RK3', r3u(:,:,  Naa), 'U',  1._wp, r3v(:,:,  Naa), 'V',  1._wp )
       !
       !                                 !==  Swap time levels  ==!
       !
diff --git a/src/TOP/TRP/trdmxl_trc.F90 b/src/TOP/TRP/trdmxl_trc.F90
index 1d13a2e85c82820a74218d60de645400a3a02f6f..80f20b0fbbbf54a1a97d1998aed01e625ce3fed8 100644
--- a/src/TOP/TRP/trdmxl_trc.F90
+++ b/src/TOP/TRP/trdmxl_trc.F90
@@ -289,7 +289,7 @@ CONTAINS
          DO jn = 1, jptra
             IF( ln_trdtrc(jn) ) THEN
                DO jl = 1, jpltrd_trc
-                  CALL lbc_lnk( 'trdmxl_trc', tmltrd_trc(:,:,jl,jn), 'T', 1. )        ! lateral boundary conditions
+                  CALL lbc_lnk( 'trdmxl_trc', tmltrd_trc(:,:,jl,jn), 'T', 1._wp )        ! lateral boundary conditions
                END DO
             ENDIF
          END DO
@@ -424,8 +424,8 @@ CONTAINS
                
          !-- Lateral boundary conditions
                IF ( cn_cfg .NE. 'gyre' ) THEN
-                  CALL lbc_lnk( 'trdmxl_trc', ztmltot(:,:,jn) , 'T', 1. , ztmlres(:,:,jn) , 'T', 1., &
-                     &                        ztmlatf(:,:,jn) , 'T', 1. , ztmlrad(:,:,jn) , 'T', 1. )
+                  CALL lbc_lnk( 'trdmxl_trc', ztmltot(:,:,jn) , 'T', 1._wp , ztmlres(:,:,jn) , 'T', 1._wp, &
+                     &                        ztmlatf(:,:,jn) , 'T', 1._wp , ztmlrad(:,:,jn) , 'T', 1._wp )
                ENDIF
 
 
@@ -475,9 +475,9 @@ CONTAINS
 
          !-- Lateral boundary conditions 
                IF ( cn_cfg .NE. 'gyre' ) THEN            ! other than GYRE configuration    
-                  CALL lbc_lnk( 'trdmxl_trc', ztmltot2(:,:,jn), 'T', 1., ztmlres2(:,:,jn), 'T', 1. )
+                  CALL lbc_lnk( 'trdmxl_trc', ztmltot2(:,:,jn), 'T', 1._wp, ztmlres2(:,:,jn), 'T', 1._wp )
                   DO jl = 1, jpltrd_trc
-                     CALL lbc_lnk( 'trdmxl_trc', ztmltrd2(:,:,jl,jn), 'T', 1. )       ! will be output in the NetCDF trends file
+                     CALL lbc_lnk( 'trdmxl_trc', ztmltrd2(:,:,jl,jn), 'T', 1._wp )       ! will be output in the NetCDF trends file
                   END DO
                ENDIF
 
diff --git a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90 b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
index ed83f79c1c1020b8f309e0a2631672caf02665d1..892cf155ff02ce4d6f51725790f6290ec974bd1b 100644
--- a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
@@ -102,7 +102,7 @@ CONTAINS
       DO_2D(0,0,0,0)
          zhu(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji+1,jj) )
       END_2D
-      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
+      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1._wp )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
       DO ji = mi0(1,nn_hls), mi1(1,nn_hls)              ! first row of global domain only
          zhu(ji,2) = zht(ji,2)
@@ -121,7 +121,7 @@ CONTAINS
       ! no ocean cavities : top ocean level is ONE, except over land
       ! the ocean basin surrounded by land (1+nn_hls grid-points) set through lbc_lnk call
       z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
       !
       !                              
diff --git a/tests/BENCH/MY_SRC/usrdef_istate.F90 b/tests/BENCH/MY_SRC/usrdef_istate.F90
index bb35d7849422e2cc9f34673f677d4a8d5cc22af5..226b223969ecc63012c63bfc85c6c4affbf29592 100644
--- a/tests/BENCH/MY_SRC/usrdef_istate.F90
+++ b/tests/BENCH/MY_SRC/usrdef_istate.F90
@@ -82,9 +82,9 @@ CONTAINS
       pu( :,:,jpk  ) = 0._wp
       pv( :,:,jpk  ) = 0._wp
       !
-      CALL lbc_lnk('usrdef_istate',  pts, 'T',  1. )            ! apply boundary conditions
-      CALL lbc_lnk('usrdef_istate',   pu, 'U', -1. )            ! apply boundary conditions
-      CALL lbc_lnk('usrdef_istate',   pv, 'V', -1. )            ! apply boundary conditions
+      CALL lbc_lnk('usrdef_istate',  pts, 'T',  1._wp )            ! apply boundary conditions
+      CALL lbc_lnk('usrdef_istate',   pu, 'U', -1._wp )            ! apply boundary conditions
+      CALL lbc_lnk('usrdef_istate',   pv, 'V', -1._wp )            ! apply boundary conditions
       
    END SUBROUTINE usr_def_istate
 
@@ -111,7 +111,7 @@ CONTAINS
          pssh(ji,jj) = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
       END_2D
       !
-      CALL lbc_lnk('usrdef_istate', pssh, 'T',  1. )   ! apply boundary conditions
+      CALL lbc_lnk('usrdef_istate', pssh, 'T',  1._wp )   ! apply boundary conditions
       !
    END SUBROUTINE usr_def_istate_ssh
    
diff --git a/tests/BENCH/MY_SRC/usrdef_sbc.F90 b/tests/BENCH/MY_SRC/usrdef_sbc.F90
index 899c20bb3d6cfbdc8b273b08a7efb771a9fd4fc2..50ebfec3b58248a2aadcf942b8e99eb737da68f9 100644
--- a/tests/BENCH/MY_SRC/usrdef_sbc.F90
+++ b/tests/BENCH/MY_SRC/usrdef_sbc.F90
@@ -116,7 +116,7 @@ CONTAINS
          vtau_ice(mi0(  nn_hls+1,nn_hls):mi1(  nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
       ENDIF
 
-      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. )
+      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1._wp, vtau_ice, 'T', -1._wp, ldfull = .TRUE. )
 #endif
       !
    END SUBROUTINE usrdef_sbc_ice_tau
diff --git a/tests/CANAL/MY_SRC/usrdef_istate.F90 b/tests/CANAL/MY_SRC/usrdef_istate.F90
index fca0099da7637f80e53b9425d0112546370a13cb..498f8c49962883e5d31ead56f74cbc0542642bf4 100644
--- a/tests/CANAL/MY_SRC/usrdef_istate.F90
+++ b/tests/CANAL/MY_SRC/usrdef_istate.F90
@@ -237,8 +237,8 @@ CONTAINS
          !            
       END SELECT
       !
-      CALL lbc_lnk( 'usrdef_istate', pts , 'T',  1. )
-      CALL lbc_lnk( 'usrdef_istate', pu, 'U', -1., pv, 'V', -1. )
+      CALL lbc_lnk( 'usrdef_istate', pts , 'T',  1._wp )
+      CALL lbc_lnk( 'usrdef_istate', pu, 'U', -1._wp, pv, 'V', -1._wp )
 
    END SUBROUTINE usr_def_istate
 
@@ -322,7 +322,7 @@ CONTAINS
             DO_2D( 0, 0, 0, 0 )
                pssh(ji,jj) = pssh(ji,jj-1) - ff_t(ji,jj) / grav * rn_uzonal * EXP( - 0.5 * gphit(ji,jj)**2 / rn_lambda**2 ) * e2t(ji,jj)
             END_2D
-            CALL lbc_lnk( 'usrdef_istate_ssh', pssh, 'T',  1. )
+            CALL lbc_lnk( 'usrdef_istate_ssh', pssh, 'T',  1._wp )
          END DO
          !            
       CASE(4)                      !==  geostrophic zonal pulse !!st need to implement a way to separate ssh properly  ==!
@@ -374,7 +374,7 @@ CONTAINS
          CALL RANDOM_NUMBER(zrandom)
          pssh(:,:) = pssh(:,:) + ( 0.1  * zrandom(:,:) - 0.05 )
       ENDIF
-      CALL lbc_lnk( 'usrdef_istate_ssh', pssh, 'T',  1. )
+      CALL lbc_lnk( 'usrdef_istate_ssh', pssh, 'T',  1._wp )
       !
    END SUBROUTINE usr_def_istate_ssh
    
diff --git a/tests/CANAL/MY_SRC/usrdef_zgr.F90 b/tests/CANAL/MY_SRC/usrdef_zgr.F90
index e6438852a9db61a58dc973a7a369fe7dd4663979..82d03f4329b7dc9318beab770fd1f768f8312fc7 100644
--- a/tests/CANAL/MY_SRC/usrdef_zgr.F90
+++ b/tests/CANAL/MY_SRC/usrdef_zgr.F90
@@ -199,7 +199,7 @@ CONTAINS
          z2d(:,:) = REAL(jpkm1 - NINT( 0.5 * REAL(jpkm1,wp) * z2d(:,:) ), wp)
       END SELECT
       !
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )           ! set surrounding land to zero (closed boundaries)
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )           ! set surrounding land to zero (closed boundaries)
       !
       k_bot(:,:) = NINT( z2d(:,:) )          ! =jpkm1 over the ocean point, =0 elsewhere
       !
diff --git a/tests/DOME/MY_SRC/usrdef_zgr.F90 b/tests/DOME/MY_SRC/usrdef_zgr.F90
index 0fb7ecd0cfb333f9ec198dfd3e0f833f8bab3350..40bb48bd397c2ff01ad0ed15c626869ed284922e 100644
--- a/tests/DOME/MY_SRC/usrdef_zgr.F90
+++ b/tests/DOME/MY_SRC/usrdef_zgr.F90
@@ -103,7 +103,7 @@ CONTAINS
       WHERE (gphit(:,:)>0._wp) z2d(:,:) = 0._wp
       ! Dig inlet:
       WHERE ((gphit(:,:)>0._wp).AND.(glamt(:,:)>-50._wp).AND.(glamt(:,:)<50._wp)) z2d(:,:) = 1._wp
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
       !
       !                              
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
index 0b4f020abb72d3849d89ea5be6bac204539047c2..0a36b514e7c25022710760c3f572110821196eb6 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
@@ -140,8 +140,8 @@ CONTAINS
          utau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndi_t
          vtau_ice(ji,jj) = zrhoa * Cd_atm * wndm_ice(ji,jj) * zwndj_t
       END_2D
-      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1., vtau_ice, 'T', -1., ldfull = .TRUE. )
-
+      
+      CALL lbc_lnk( 'usrdef_sbc', utau_ice, 'T', -1._wp, vtau_ice, 'T', -1._wp, ldfull = .TRUE. )
       !
    END SUBROUTINE usrdef_sbc_ice_tau
 
diff --git a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90 b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
index 2c5879eba4bfe0e8a29626efe5258d9171da7b2b..5592ac6bfbca6ca0dbbd77fd087d3fe12c21350e 100644
--- a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
+++ b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_zgr.F90
@@ -86,7 +86,7 @@ CONTAINS
       ! no ocean cavities : top ocean level is ONE, except over land
       ! the ocean basin surrounded by land (1+nn_hls grid-points) set through lbc_lnk call
       z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
       !
       !                              
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90 b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
index 9a88ea58e0a6678fe1e608294ecf1be735e7a47b..af15e507485a2e38e5367ca4f77ce6c05a4894e4 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
@@ -94,7 +94,7 @@ CONTAINS
       DO_2D( nn_hls, nn_hls-1, nn_hls, nn_hls )
          zhu(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji+1,jj) )
       END_2D
-      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
+      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1._wp )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
       !     
       CALL zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d )   ! Reference z-coordinate system
@@ -105,7 +105,7 @@ CONTAINS
       ! no ocean cavities : top ocean level is ONE, except over land
       ! the ocean basin surrounded by land (1+nn_hls grid-points) set through lbc_lnk call
       z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
       !
       !                              
diff --git a/tests/SWG/MY_SRC/usrdef_zgr.F90 b/tests/SWG/MY_SRC/usrdef_zgr.F90
index 7da49f1f646f73fceb72a5d6b8e67917d523a537..9bfe7b8e061e1232e187ef2aa3c90aba160c1f72 100644
--- a/tests/SWG/MY_SRC/usrdef_zgr.F90
+++ b/tests/SWG/MY_SRC/usrdef_zgr.F90
@@ -191,7 +191,7 @@ CONTAINS
       !
       z2d(:,:) = REAL( jpkm1 , wp )          ! flat bottom
       !
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )           ! set surrounding land to zero (closed boundaries)
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )           ! set surrounding land to zero (closed boundaries)
       !
       zylim0 =   10000._wp    ! +10km 
       zylim1 = 2010000._wp    ! 2010km
diff --git a/tests/TSUNAMI/MY_SRC/usrdef_istate.F90 b/tests/TSUNAMI/MY_SRC/usrdef_istate.F90
index 0ca6c3492fd66504612e2c8f224d4c330d8eee84..69202f700203415cb384af1d7f562d3486fc8c27 100644
--- a/tests/TSUNAMI/MY_SRC/usrdef_istate.F90
+++ b/tests/TSUNAMI/MY_SRC/usrdef_istate.F90
@@ -103,7 +103,7 @@ CONTAINS
       END_2D
 
       !
-      CALL lbc_lnk('usrdef_istate', pssh, 'T',  1. )            ! apply boundary conditions
+      CALL lbc_lnk('usrdef_istate', pssh, 'T',  1._wp )            ! apply boundary conditions
       !
    END SUBROUTINE usr_def_istate_ssh
    
diff --git a/tests/VORTEX/MY_SRC/usrdef_istate.F90 b/tests/VORTEX/MY_SRC/usrdef_istate.F90
index 6de0b19191cffc5940d9cc6763bd90c93f90ec48..7694c43c9c5ec788f0a943a2615b431b2e0a1b4c 100644
--- a/tests/VORTEX/MY_SRC/usrdef_istate.F90
+++ b/tests/VORTEX/MY_SRC/usrdef_istate.F90
@@ -122,7 +122,7 @@ CONTAINS
          END DO
       END_2D
       !
-      CALL lbc_lnk( 'usrdef_istate', pu, 'U', -1., pv, 'V', -1. )
+      CALL lbc_lnk( 'usrdef_istate', pu, 'U', -1._wp, pv, 'V', -1._wp )
       !   
    END SUBROUTINE usr_def_istate
 
diff --git a/tests/VORTEX/MY_SRC/usrdef_zgr.F90 b/tests/VORTEX/MY_SRC/usrdef_zgr.F90
index 06c739ed22a38ec08ce54d3f9f7ed80b18c289a0..b733421b153a4b765377650a8abbb257547fa819 100644
--- a/tests/VORTEX/MY_SRC/usrdef_zgr.F90
+++ b/tests/VORTEX/MY_SRC/usrdef_zgr.F90
@@ -187,7 +187,7 @@ CONTAINS
       !
       z2d(:,:) = REAL( jpkm1 , wp )          ! flat bottom
       !
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )           ! set surrounding land to zero (closed boundaries)
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )           ! set surrounding land to zero (closed boundaries)
       !
       k_bot(:,:) = NINT( z2d(:,:) )          ! =jpkm1 over the ocean point, =0 elsewhere
       !
diff --git a/tests/WAD/MY_SRC/usrdef_zgr.F90 b/tests/WAD/MY_SRC/usrdef_zgr.F90
index df9970a0b289ce811f436720e5ef95cf711b0a36..3af894e85f6f7f40a00cabb3f43cfccfd95028b2 100644
--- a/tests/WAD/MY_SRC/usrdef_zgr.F90
+++ b/tests/WAD/MY_SRC/usrdef_zgr.F90
@@ -232,7 +232,7 @@ CONTAINS
       DO_2D( 0, 0, 0, 0 )
          zhu(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji+1,jj) )
       END_2D
-      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrounding grid-points
+      CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1._wp )     ! boundary condition: this mask the surrounding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
       DO ji = mi0(     1,nn_hls), mi1(     1,nn_hls)              ! first row of global domain only
          zhu(ji,:) = zht(1,:)
@@ -245,7 +245,7 @@ CONTAINS
       DO_2D( 0, 0, 0, 0 )
          zhv(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji,jj+1) )
       END_2D
-      CALL lbc_lnk( 'usrdef_zgr', zhv, 'V', 1. )     ! boundary condition: this mask the surrounding grid-points
+      CALL lbc_lnk( 'usrdef_zgr', zhv, 'V', 1._wp )    ! boundary condition: this mask the surrounding grid-points
       DO jj = mj0(     1,nn_hls), mj1(     1,nn_hls)   ! first  row of global domain only
          zhv(:,jj) = zht(:,jj)
       END DO
@@ -266,7 +266,7 @@ CONTAINS
       z2d(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = 0._wp
       z2d(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = 0._wp
 
-      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
+      CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
       !
       !                              
@@ -301,15 +301,15 @@ CONTAINS
                pe3vw(ji,jj,jk) = zwet * z1_jpkm1
             END DO
          END_2D     
-         CALL lbc_lnk( 'usrdef_zgr', pdept, 'T', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pdepw, 'T', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3t , 'T', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3w , 'T', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3u , 'U', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3uw, 'U', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3f , 'F', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3v , 'V', 1. )
-         CALL lbc_lnk( 'usrdef_zgr', pe3vw, 'V', 1. )
+         CALL lbc_lnk( 'usrdef_zgr', pdept, 'T', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pdepw, 'T', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3t , 'T', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3w , 'T', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3u , 'U', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3uw, 'U', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3f , 'F', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3v , 'V', 1._wp )
+         CALL lbc_lnk( 'usrdef_zgr', pe3vw, 'V', 1._wp )
          WHERE( pe3t (:,:,:) == 0._wp )   pe3t (:,:,:) = 1._wp
          WHERE( pe3u (:,:,:) == 0._wp )   pe3u (:,:,:) = 1._wp
          WHERE( pe3v (:,:,:) == 0._wp )   pe3v (:,:,:) = 1._wp
diff --git a/tools/MISCELLANEOUS/add_wp_in_call_lbc_lnk.sh b/tools/MISCELLANEOUS/add_wp_in_call_lbc_lnk.sh
new file mode 100755
index 0000000000000000000000000000000000000000..5739b9283aa5b0ef6db462c6358f4c3f0ddc0ff5
--- /dev/null
+++ b/tools/MISCELLANEOUS/add_wp_in_call_lbc_lnk.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+#
+# this sed makes sure that we alwas specify the _wp in the calls to lbc_lnk
+#
+for ff in $( find src -type f ) */*/MY_SRC/*  # for all nemo files
+do
+    # look for something like ", 'X', 1. )" and replace it by ", 'X', 1.wp )"
+    #   - X can be TUVFW
+    #   - the "1" can be followed by a "." or not. It must be followed by "," or ")" or "&"
+    #   - any number of blanks is acceptable.
+    sed -e "s/\(, *'[TUVFW]' *, *-*1\)\.*\( *[,)&]\)/\1._wp\2/g" $ff > tmp
+    mv tmp $ff
+done
+
+