Index: /trunk/LMDZ.GENERIC/changelog.txt
===================================================================
--- /trunk/LMDZ.GENERIC/changelog.txt	(revision 4178)
+++ /trunk/LMDZ.GENERIC/changelog.txt	(revision 4179)
@@ -2268,2 +2268,6 @@
 == 10/04/2026 == EM
 Code cleanup: remove unused surface_nature.F and scopyi.F
+
+== 10/04/2026 == EM
+Clean up code: put inter_line.F in a module util_linear_interpolation.F90 and
+also turn soil.F and soil_settings.F into modules.
Index: /trunk/LMDZ.GENERIC/libf/dynphy_lonlat/phygeneric/lect_start_archive.F
===================================================================
--- /trunk/LMDZ.GENERIC/libf/dynphy_lonlat/phygeneric/lect_start_archive.F	(revision 4178)
+++ /trunk/LMDZ.GENERIC/libf/dynphy_lonlat/phygeneric/lect_start_archive.F	(revision 4179)
@@ -14,4 +14,5 @@
       USE comvert_mod, ONLY: ap,bp,aps,bps,preff
       USE comconst_mod, ONLY: kappa,g,pi
+      USE util_linear_interpolation_mod, ONLY: interp_line
 
 c=======================================================================
Index: unk/LMDZ.GENERIC/libf/phygeneric/interp_line.F
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/interp_line.F	(revision 4178)
+++ 	(revision )
@@ -1,55 +1,0 @@
-      subroutine interp_line(x1,y1,len1,x2,y2,len2)
-      implicit none
-!-----------------------------------------------------------------------
-!
-!  Purpose: Do a series of linear interpolations
-!  Data sets are organized as vectors (see below)
-!  If x2(:), and abscissa at which interpolation is requiered, lies
-!  outside of the interval covered by x1(:), instead of doing an
-!  extrapolation, y2() is set to the value y1() corresponding to
-!  the nearby x1(:) point
-!  
-c-----------------------------------------------------------------------
-!  arguments
-!  ---------
-!  inputs:
-      real x1(len1) ! ordered list of abscissas
-      real y1(len1) ! values at x1(:)
-      integer len1  ! length of x1(:) and y1(:)
-      real x2(len2) !ordered list of abscissas at which interpolation is done
-      integer len2  ! length of x2(:) and y2(:)
-!  outputs:
-      real y2(len2) ! interpolated values
-!-----------------------------------------------------------------------
-
-! local variables:
-      integer i,j
-      
-
-      do i=1,len2
-        ! check if x2(i) lies outside of the interval covered by x1()
-        if(((x2(i).le.x1(1)).and.(x2(i).le.x1(len1))).or.
-     &     ((x2(i).ge.x1(1)).and.(x2(i).ge.x1(len1)))) then
-	  ! set y2(i) to y1(1) or y1(len1)
-	  if (abs(x2(i)-x1(1)).lt.abs(x2(i)-x1(len1))) then
-	    ! x2(i) lies closest to x1(1)
-	    y2(i)=y1(1)
-	  else
-	    ! x2(i) lies closest to x1(len1)
-	    y2(i)=y1(len1)
-	  endif
-
-	else
-        ! find the nearest neigbours and do a linear interpolation
-	 do j=1,len1-1
-          if(((x2(i).ge.x1(j)).and.(x2(i).le.x1(j+1))).or.
-     &       ((x2(i).le.x1(j)).and.(x2(i).ge.x1(j+1)))) then
-	    y2(i)=((x2(i)-x1(j))/(x1(j+1)-x1(j)))*y1(j+1)+
-     &            ((x2(i)-x1(j+1))/(x1(j)-x1(j+1)))*y1(j)
-	  endif
-	 enddo
-	endif
-
-      enddo
-
-      end
Index: /trunk/LMDZ.GENERIC/libf/phygeneric/phyetat0_mod.F90
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/phyetat0_mod.F90	(revision 4178)
+++ /trunk/LMDZ.GENERIC/libf/phygeneric/phyetat0_mod.F90	(revision 4179)
@@ -32,4 +32,5 @@
   USE ocean_slab_mod, ONLY: nslay
   use callkeys_mod, only: CLFvarying,surfalbedo,surfemis, callsoil
+  use soil_settings_mod, only: soil_settings
   use nonoro_gwd_ran_mod, only: du_nonoro_gwd, dv_nonoro_gwd, &
                                 east_gwstress, west_gwstress
Index: /trunk/LMDZ.GENERIC/libf/phygeneric/physiq_mod.F90
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/physiq_mod.F90	(revision 4178)
+++ /trunk/LMDZ.GENERIC/libf/phygeneric/physiq_mod.F90	(revision 4179)
@@ -35,4 +35,5 @@
       use comsaison_h, only: mu0, fract, dist_star, declin, right_ascen
       use comsoil_h, only: nsoilmx, layer, mlayer, inertiedat
+      use soil_mod, only: soil
       use geometry_mod, only: latitude, longitude, cell_area, &
                           cell_area_for_lonlat_outputs
Index: /trunk/LMDZ.GENERIC/libf/phygeneric/soil.F
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/soil.F	(revision 4178)
+++ /trunk/LMDZ.GENERIC/libf/phygeneric/soil.F	(revision 4179)
@@ -1,2 +1,8 @@
+      module soil_mod
+      
+      implicit none
+      
+      contains
+      
       subroutine soil(ngrid,nsoil,firstcall,lastcall,
      &          therm_i,
@@ -222,4 +228,5 @@
       enddo
 
-      end
-
+      end subroutine soil
+
+      end module soil_mod
Index: /trunk/LMDZ.GENERIC/libf/phygeneric/soil_settings.F
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/soil_settings.F	(revision 4178)
+++ /trunk/LMDZ.GENERIC/libf/phygeneric/soil_settings.F	(revision 4179)
@@ -1,7 +1,13 @@
+      module soil_settings_mod
+      
+      implicit none
+      
+      contains
+      
       subroutine soil_settings(nid,ngrid,nsoil,tsurf,tsoil,indextime)
 
-!      use netcdf
       use comsoil_h, only: layer, mlayer, inertiedat, volcapa,
      &                     lay1_soil, alpha_soil
+      use util_linear_interpolation_mod, only: interp_line
       use iostart, only: inquire_field_ndims, get_var, get_field,
      &                   inquire_field, inquire_dimension_length
@@ -364,3 +370,6 @@
       xmax = MAXVAL(tsoil)
       write(*,*)'Soil temperature <tsoil>:',xmin,xmax
-      end
+      
+      end subroutine soil_settings
+      
+      end module soil_settings_mod
Index: /trunk/LMDZ.GENERIC/libf/phygeneric/util_linear_interpolation.F90
===================================================================
--- /trunk/LMDZ.GENERIC/libf/phygeneric/util_linear_interpolation.F90	(revision 4179)
+++ /trunk/LMDZ.GENERIC/libf/phygeneric/util_linear_interpolation.F90	(revision 4179)
@@ -0,0 +1,63 @@
+module util_linear_interpolation_mod
+
+implicit none
+
+contains
+
+    subroutine interp_line(x1,y1,len1,x2,y2,len2)
+      implicit none
+!-----------------------------------------------------------------------
+!
+!  Purpose: Do a series of linear interpolations
+!  Data sets are organized as vectors (see below)
+!  If x2(:), and abscissa at which interpolation is requiered, lies
+!  outside of the interval covered by x1(:), instead of doing an
+!  extrapolation, y2() is set to the value y1() corresponding to
+!  the nearby x1(:) point
+!  
+!-----------------------------------------------------------------------
+!  arguments
+!  ---------
+!  inputs:
+      real,intent(in) :: x1(len1) ! ordered list of abscissas
+      real,intent(in) :: y1(len1) ! values at x1(:)
+      integer,intent(in) :: len1  ! length of x1(:) and y1(:)
+      real,intent(in) :: x2(len2) ! ordered list of abscissas at which interpolation is done
+      integer,intent(in) :: len2  ! length of x2(:) and y2(:)
+!  outputs:
+      real,intent(out) :: y2(len2) ! interpolated values
+!-----------------------------------------------------------------------
+
+! local variables:
+      integer :: i,j
+      
+
+      do i=1,len2
+        ! check if x2(i) lies outside of the interval covered by x1()
+        if(((x2(i).le.x1(1)).and.(x2(i).le.x1(len1))).or. &
+           ((x2(i).ge.x1(1)).and.(x2(i).ge.x1(len1)))) then
+	  ! set y2(i) to y1(1) or y1(len1)
+	  if (abs(x2(i)-x1(1)).lt.abs(x2(i)-x1(len1))) then
+	    ! x2(i) lies closest to x1(1)
+	    y2(i)=y1(1)
+	  else
+	    ! x2(i) lies closest to x1(len1)
+	    y2(i)=y1(len1)
+	  endif
+
+	else
+        ! find the nearest neigbours and do a linear interpolation
+	 do j=1,len1-1
+          if(((x2(i).ge.x1(j)).and.(x2(i).le.x1(j+1))).or. &
+             ((x2(i).le.x1(j)).and.(x2(i).ge.x1(j+1)))) then
+	    y2(i)=((x2(i)-x1(j))/(x1(j+1)-x1(j)))*y1(j+1)+ &
+                  ((x2(i)-x1(j+1))/(x1(j)-x1(j+1)))*y1(j)
+	  endif
+	 enddo
+	endif
+
+      enddo ! of do i=1,len2
+
+    end subroutine interp_line
+
+end module util_linear_interpolation_mod
