Index: LMDZ5/trunk/libf/dyn3d/conf_gcm.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3d/conf_gcm.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3d/conf_gcm.F90	(revision 2665)
@@ -18,5 +18,5 @@
   USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
                        ok_guide, ok_limit, ok_strato, purmats, read_start, &
-                       ysinus
+                       ysinus, read_orop
   USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
                        alphax,alphay,taux,tauy
@@ -854,4 +854,12 @@
      CALL getin('ok_etat0',ok_etat0)
 
+     !Config  Key  = read_orop
+     !Config  Desc = lecture du fichier de params orographiques sous maille
+     !Config  Def  = f
+     !Config  Help = lecture fichier plutot que grid_noro
+
+     read_orop = .FALSE.
+     CALL getin('read_orop',read_orop)
+
      write(lunout,*)' #########################################'
      write(lunout,*)' Configuration des parametres de cel0' &
@@ -900,4 +908,5 @@
      write(lunout,*)' ok_limit = ', ok_limit
      write(lunout,*)' ok_etat0 = ', ok_etat0
+     write(lunout,*)' read_orop = ', read_orop
   end IF test_etatinit
 
Index: LMDZ5/trunk/libf/dyn3d/logic_mod.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3d/logic_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3d/logic_mod.F90	(revision 2665)
@@ -25,6 +25,7 @@
   LOGICAL ok_strato
   LOGICAL ok_gradsfile
-  LOGICAL ok_limit
-  LOGICAL ok_etat0
+  LOGICAL ok_limit  ! true for boundary conditions file creation (limit.nc)
+  LOGICAL ok_etat0  ! true for initial states creation (start.nc, startphy.nc)
+  LOGICAL read_orop ! true for sub-cell scales orographic params read in file
   LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
                  ! (only used if disvert_type==2)
Index: LMDZ5/trunk/libf/dyn3dmem/conf_gcm.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3dmem/conf_gcm.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3dmem/conf_gcm.F90	(revision 2665)
@@ -22,5 +22,5 @@
   USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
                        ok_guide, ok_limit, ok_strato, purmats, read_start, &
-                       ysinus
+                       ysinus, read_orop
   USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
                        alphax,alphay,taux,tauy
@@ -929,4 +929,12 @@
      CALL getin('ok_etat0',ok_etat0)
 
+     !Config  Key  = read_orop
+     !Config  Desc = lecture du fichier de params orographiques sous maille
+     !Config  Def  = f
+     !Config  Help = lecture fichier plutot que grid_noro
+
+     read_orop = .FALSE.
+     CALL getin('read_orop',read_orop)
+
      write(lunout,*)' #########################################'
      write(lunout,*)' Configuration des parametres de cel0' &
@@ -977,4 +985,5 @@
      write(lunout,*)' ok_limit = ', ok_limit
      write(lunout,*)' ok_etat0 = ', ok_etat0
+     write(lunout,*)' read_orop = ', read_orop
   end IF test_etatinit
 
Index: LMDZ5/trunk/libf/dyn3dmem/logic_mod.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3dmem/logic_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3dmem/logic_mod.F90	(revision 2665)
@@ -25,6 +25,7 @@
   LOGICAL ok_strato
   LOGICAL ok_gradsfile
-  LOGICAL ok_limit
-  LOGICAL ok_etat0
+  LOGICAL ok_limit  ! true for boundary conditions file creation (limit.nc)
+  LOGICAL ok_etat0  ! true for initial states creation (start.nc, startphy.nc)
+  LOGICAL read_orop ! true for sub-cell scales orographic params read in file
   LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
                  ! (only used if disvert_type==2)
Index: LMDZ5/trunk/libf/dyn3dpar/conf_gcm.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3dpar/conf_gcm.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3dpar/conf_gcm.F90	(revision 2665)
@@ -21,5 +21,5 @@
   USE logic_mod, ONLY: fxyhypb, iflag_phys, ok_etat0, ok_gradsfile, &
                        ok_guide, ok_limit, ok_strato, purmats, read_start, &
-                       ysinus
+                       ysinus, read_orop
   USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
                        alphax,alphay,taux,tauy
@@ -925,4 +925,12 @@
      CALL getin('ok_etat0',ok_etat0)
 
+     !Config  Key  = read_orop
+     !Config  Desc = lecture du fichier de params orographiques sous maille
+     !Config  Def  = f
+     !Config  Help = lecture fichier plutot que grid_noro
+
+     read_orop = .FALSE.
+     CALL getin('read_orop',read_orop)
+
      write(lunout,*)' #########################################'
      write(lunout,*)' Configuration des parametres de cel0' &
@@ -973,4 +981,5 @@
      write(lunout,*)' ok_limit = ', ok_limit
      write(lunout,*)' ok_etat0 = ', ok_etat0
+     write(lunout,*)' read_orop = ', read_orop
   end IF test_etatinit
 
Index: LMDZ5/trunk/libf/dyn3dpar/logic_mod.F90
===================================================================
--- LMDZ5/trunk/libf/dyn3dpar/logic_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dyn3dpar/logic_mod.F90	(revision 2665)
@@ -25,6 +25,7 @@
   LOGICAL ok_strato
   LOGICAL ok_gradsfile
-  LOGICAL ok_limit
-  LOGICAL ok_etat0
+  LOGICAL ok_limit  ! true for boundary conditions file creation (limit.nc)
+  LOGICAL ok_etat0  ! true for initial states creation (start.nc, startphy.nc)
+  LOGICAL read_orop ! true for sub-cell scales orographic params read in file
   LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
                  ! (only used if disvert_type==2)
Index: LMDZ5/trunk/libf/dynphy_lonlat/phylmd/ce0l.F90
===================================================================
--- LMDZ5/trunk/libf/dynphy_lonlat/phylmd/ce0l.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dynphy_lonlat/phylmd/ce0l.F90	(revision 2665)
@@ -12,4 +12,5 @@
 !     * "masque" can be:
 !       - read from file "o2a.nc"          (for coupled runs).
+!       - read from file "startphy0.nc"    (from a previous run).
 !       - created in etat0phys or etat0dyn (for forced  runs).
 !     It is then passed to limit_netcdf to ensure consistancy.
@@ -20,5 +21,6 @@
   USE etat0phys,      ONLY: etat0phys_netcdf
   USE limit,          ONLY: limit_netcdf
-  USE netcdf,         ONLY: NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR
+  USE netcdf,         ONLY: NF90_OPEN, NF90_NOWRITE, NF90_CLOSE, NF90_NOERR,    &
+         NF90_INQUIRE_DIMENSION, NF90_INQ_DIMID, NF90_INQ_VARID, NF90_GET_VAR
   USE infotrac,       ONLY: type_trac, infotrac_init
   USE dimphy,         ONLY: klon
@@ -60,4 +62,9 @@
   REAL, ALLOCATABLE  :: lat_omask(:,:), dlat_omask(:), ocetmp (:,:)
   REAL               :: date, lev(1)
+
+!--- Local variables for land mask from startphy0 file reading
+  INTEGER            :: nid_sta, nid_nph, nid_msk, nphys
+  REAL, ALLOCATABLE  :: masktmp(:)
+
 #ifndef CPP_PARA
 ! for iniphysiq in serial mode
@@ -133,15 +140,12 @@
   ENDIF
 
-!--- LAND MASK. TWO CASES:
+!--- LAND MASK. THREE CASES:
 !   1) read from ocean model    file "o2a.nc"    (coupled runs)
-!   2) computed from topography file "Relief.nc" (masque(:,:)=-99999.)
-! Coupled simulations (case 1) use the ocean model mask to compute the
+!   2) read from previous run   file="startphy0.nc"
+!   3) computed from topography file "Relief.nc" (masque(:,:)=-99999.)
+! In the first case, the mask from the ocean model is used compute the
 ! weights to ensure ocean fractions are the same for atmosphere and ocean.
 !*******************************************************************************
-  IF(NF90_OPEN("o2a.nc", NF90_NOWRITE, nid_o2a)/=NF90_NOERR) THEN
-    WRITE(lunout,*)'BEWARE !! No ocean mask "o2a.nc" file found'
-    WRITE(lunout,*)'Forced run.'
-    masque(:,:)=-99999.
-  ELSE
+  IF(NF90_OPEN("o2a.nc", NF90_NOWRITE, nid_o2a)==NF90_NOERR) THEN
     iret=NF90_CLOSE(nid_o2a)
     WRITE(lunout,*)'BEWARE !! Ocean mask "o2a.nc" file found'
@@ -175,4 +179,30 @@
     masque(iip1 ,:)=masque(1,:)
     DEALLOCATE(ocemask)
+  ELSE IF(NF90_OPEN("startphy0.nc", NF90_NOWRITE, nid_sta)==NF90_NOERR) THEN
+    WRITE(lunout,*)'BEWARE !! File "startphy0.nc" found.'
+    WRITE(lunout,*)'Getting the land mask from a previous run.'
+    iret=NF90_INQ_DIMID(nid_sta,'points_physiques',nid_nph)
+    iret=NF90_INQUIRE_DIMENSION(nid_sta,nid_nph,len=nphys)
+    IF(nphys/=klon) THEN
+      WRITE(lunout,*)'Mismatching dimensions for land mask'
+      WRITE(lunout,*)'nphys  = ',nphys ,' klon = ',klon
+      iret=NF90_CLOSE(nid_sta)
+      CALL abort_gcm(modname,'',1)
+    END IF
+    ALLOCATE(masktmp(klon))
+    iret=NF90_INQ_VARID(nid_sta,'masque',nid_msk)
+    iret=NF90_GET_VAR(nid_sta,nid_msk,masktmp)
+    iret=NF90_CLOSE(nid_sta)
+    CALL gr_fi_dyn(1,klon,iip1,jjp1,masktmp,masque)
+    IF(prt_level>=1) THEN
+      WRITE(fmt,"(i4,'i1)')")iip1 ; fmt='('//ADJUSTL(fmt)
+      WRITE(lunout,*)'LAND MASK :'
+      WRITE(lunout,fmt) NINT(masque)
+    END IF
+    DEALLOCATE(masktmp)
+  ELSE
+    WRITE(lunout,*)'BEWARE !! No ocean mask "o2a.nc" file or "startphy0.nc" file found'
+    WRITE(lunout,*)'Land mask will be built from the topography file.'
+    masque(:,:)=-99999.
   END IF
   phis(:,:)=-99999.
Index: LMDZ5/trunk/libf/dynphy_lonlat/phylmd/etat0phys_netcdf.F90
===================================================================
--- LMDZ5/trunk/libf/dynphy_lonlat/phylmd/etat0phys_netcdf.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dynphy_lonlat/phylmd/etat0phys_netcdf.F90	(revision 2665)
@@ -59,4 +59,5 @@
   INTEGER,            SAVE      :: iml_phys, jml_phys, llm_phys, ttm_phys, fid_phys
   REAL, ALLOCATABLE,  SAVE      :: lon_phys(:,:), lat_phys(:,:), levphys_ini(:)
+  CHARACTER(LEN=256), PARAMETER :: oroparam="oro_params.nc"
   CHARACTER(LEN=256), PARAMETER :: orofname="Relief.nc", orogvar="RELIEF"
   CHARACTER(LEN=256), PARAMETER :: phyfname="ECPHY.nc",  psrfvar="SP"
@@ -255,6 +256,9 @@
 !   This routine launch grid_noro, which computes parameters for SSO scheme as
 !   described in LOTT & MILLER (1997) and LOTT(1999).
+!   In case the file oroparam is present and the key read_orop is activated,
+!   grid_noro is bypassed and sub-cell parameters are read from the file.
 !===============================================================================
-  USE grid_noro_m, ONLY: grid_noro
+  USE grid_noro_m, ONLY: grid_noro, read_noro
+  USE logic_mod,   ONLY: read_orop
   IMPLICIT NONE
 !-------------------------------------------------------------------------------
@@ -266,4 +270,5 @@
   CHARACTER(LEN=256) :: modname
   INTEGER            :: fid, llm_tmp,ttm_tmp, iml,jml, iml_rel,jml_rel, itau(1)
+  INTEGER            :: ierr
   REAL               :: lev(1), date, dt
   REAL, ALLOCATABLE  :: lon_rad(:), lon_ini(:), lon_rel(:,:), relief_hi(:,:)
@@ -306,7 +311,15 @@
   ALLOCATE(zpic0(iml,jml),zval0(iml,jml)) !--- Peaks and valley heights
 
+!--- READ SUB-CELL SCALES PARAMETERS FROM A FILE (AT RIGHT RESOLUTION)
+  OPEN(UNIT=66,FILE=oroparam,STATUS='OLD',IOSTAT=ierr)
+  IF(ierr==0.AND.read_orop) THEN
+    CLOSE(UNIT=66)
+    CALL read_noro(lon_in,lat_in,oroparam,                                     &
+                   phis,zmea0,zstd0,zsig0,zgam0,zthe0,zpic0,zval0,masque)
+  ELSE
 !--- CALL OROGRAPHY MODULE TO COMPUTE FIELDS
-  CALL grid_noro(lon_rad,lat_rad,relief_hi,lon_in,lat_in,phis,zmea0,zstd0,     &
-                                      zsig0,zgam0,zthe0,zpic0,zval0,masque)
+    CALL grid_noro(lon_rad,lat_rad,relief_hi,lon_in,lat_in,                    &
+                   phis,zmea0,zstd0,zsig0,zgam0,zthe0,zpic0,zval0,masque)
+  END IF
   phis = phis * 9.81
   phis(iml,:) = phis(1,:)
Index: LMDZ5/trunk/libf/dynphy_lonlat/phylmd/limit_netcdf.F90
===================================================================
--- LMDZ5/trunk/libf/dynphy_lonlat/phylmd/limit_netcdf.F90	(revision 2664)
+++ LMDZ5/trunk/libf/dynphy_lonlat/phylmd/limit_netcdf.F90	(revision 2665)
@@ -71,4 +71,5 @@
   USE netcdf95,           ONLY: nf95_def_var, nf95_put_att, nf95_put_var
   USE comconst_mod, ONLY: pi
+  USE phys_cal_mod, ONLY: calend
   IMPLICIT NONE
 !-------------------------------------------------------------------------------
@@ -244,4 +245,5 @@
   !--- Attributes creation
   CALL ncerr(NF90_PUT_ATT(nid,id_tim, "title","Jour dans l annee"),fnam)
+  CALL ncerr(NF90_PUT_ATT(nid,id_tim, "calendar",calend),fnam)
   CALL ncerr(NF90_PUT_ATT(nid,id_FOCE,"title","Fraction ocean"),fnam)
   CALL ncerr(NF90_PUT_ATT(nid,id_FSIC,"title","Fraction glace de mer"),fnam)
@@ -405,7 +407,8 @@
       CASE('SIC', 'SST'); cal_in='gregorian'
     END SELECT
-  CALL msg(5,'WARNING: missing "calendar" attribute for "time" in '&
+    CALL msg(5,'WARNING: missing "calendar" attribute for "time" in '&
      &//TRIM(fnam)//'. Choosing default value.')
   END IF
+  CALL strclean(cal_in)                     !--- REMOVE (WEIRD) NULL CHARACTERS
   CALL msg(5,'var, calendar, dim: '//TRIM(dnam)//' '//TRIM(cal_in), lmdep)
   
@@ -477,5 +480,5 @@
   fnam_p=fnam(1:idx)//'_p.nc'
   IF(NF90_OPEN(fnam_p,NF90_NOWRITE,ncid)==NF90_NOERR) THEN
-    CALL msg(0,'Reading previous year file ("'//TRIM(fnam_p)//'") first record for '//TRIM(title))
+    CALL msg(0,'Reading next year file ("'//TRIM(fnam_p)//'") first record for '//TRIM(title))
     CALL ncerr(NF90_INQ_VARID(ncid, varname, varid),fnam_p)
     CALL ncerr(NF90_GET_VAR(ncid,varid,champ,[1,1,1],[imdep,jmdep,1]),fnam_p)
@@ -767,4 +770,26 @@
 !-------------------------------------------------------------------------------
 
+
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE strclean(s)
+!
+!-------------------------------------------------------------------------------
+  IMPLICIT NONE
+!-------------------------------------------------------------------------------
+! Purpose: Remove tail null characters from the input string.
+!-------------------------------------------------------------------------------
+! Parameters:
+  CHARACTER(LEN=*), INTENT(INOUT) :: s
+!-------------------------------------------------------------------------------
+! Local variable:
+  INTEGER :: k
+!-------------------------------------------------------------------------------
+  k=LEN_TRIM(s); DO WHILE(ICHAR(s(k:k))==0); s(k:k)=' '; k=LEN_TRIM(s); END DO
+
+END SUBROUTINE strclean
+!
+!-------------------------------------------------------------------------------
+
 #endif
 ! of #ifndef CPP_1D
Index: LMDZ5/trunk/libf/phylmd/acama_gwd_rando_m.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/acama_gwd_rando_m.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/acama_gwd_rando_m.F90	(revision 2665)
@@ -136,5 +136,5 @@
     RUWFRT=gwd_front_ruwmax  
     SATFRT=gwd_front_sat
-    CMAX = 40.    ! Characteristic phase speed
+    CMAX = 50.    ! Characteristic phase speed
 ! Phase speed test
 !   RUWFRT=0.01
@@ -145,5 +145,5 @@
 ! CRUCIAL PARAMETERS FOR THE WIND FILTERING
     XLAUNCH=0.95 ! Parameter that control launching altitude
-    RDISS = 1    ! Diffusion parameter 
+    RDISS = 0.5  ! Diffusion parameter 
 
     ! maximum of rain for which our theory applies (in kg/m^2/s)
@@ -377,5 +377,6 @@
        !  RESTORE DIMENSION OF A FLUX
        !     *RD*TR/PR
-             *1. + RUW0(JW, :)
+       !     *1. + RUW0(JW, :)
+             *1.
 
        ! Factor related to the characteristics of the waves: NONE
@@ -417,5 +418,5 @@
           ! No breaking (Eq.6)
           ! Dissipation (Eq. 8)
-          WWP(JW, :) = WWM(JW, :) * EXP(- 2. * RDISS * PR / (PH(:, LL + 1) &
+          WWP(JW, :) = WWM(JW, :) * EXP(- 4. * RDISS * PR / (PH(:, LL + 1) &
                + PH(:, LL)) * ((BV(:, LL + 1) + BV(:, LL)) / 2.)**3 &
                / MAX(ABS(ZOP(JW, :) + ZOM(JW, :)) / 2., ZOISEC)**4 &
Index: LMDZ5/trunk/libf/phylmd/flott_gwd_rando_m.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/flott_gwd_rando_m.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/flott_gwd_rando_m.F90	(revision 2665)
@@ -120,5 +120,5 @@
 
     
-    RDISS = 1. ! Diffusion parameter
+    RDISS = 0.5 ! Diffusion parameter
     ! ONLINE 
       RUWMAX=GWD_RANDO_RUWMAX
@@ -346,5 +346,5 @@
           ! No breaking (Eq.6)
           ! Dissipation (Eq. 8)
-          WWP(JW, :) = WWM(JW, :) * EXP(- 2. * RDISS * PR / (PH(:, LL + 1) &
+          WWP(JW, :) = WWM(JW, :) * EXP(- 4. * RDISS * PR / (PH(:, LL + 1) &
                + PH(:, LL)) * ((BV(:, LL + 1) + BV(:, LL)) / 2.)**3 &
                / MAX(ABS(ZOP(JW, :) + ZOM(JW, :)) / 2., ZOISEC)**4 &
Index: LMDZ5/trunk/libf/phylmd/grid_noro_m.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/grid_noro_m.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/grid_noro_m.F90	(revision 2665)
@@ -6,5 +6,5 @@
   USE assert_eq_m,       ONLY: assert_eq
   PRIVATE
-  PUBLIC :: grid_noro, grid_noro0
+  PUBLIC :: grid_noro, grid_noro0, read_noro
 
 
@@ -71,16 +71,15 @@
 ! CORRELATIONS OF USN OROGRAPHY GRADIENTS         ! dim (imar+2*iext,jmdp+2)
   REAL, ALLOCATABLE :: zxtzxusn(:,:), zytzyusn(:,:), zxtzyusn(:,:)
-  REAL, ALLOCATABLE :: mask_tmp(:,:), zmea0(:,:)  ! dim (imar+1,jmar)
-  REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax)
-  REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imax)
-  REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmax)
+  REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imar+1,jmar)
+  REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imar+1)
+  REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmar)
   LOGICAL :: masque_lu
   INTEGER :: i, ii, imdp, imar, iext
   INTEGER :: j, jj, jmdp, jmar, nn
-  REAL    :: xpi, zdeltax, zlenx, weighx, xincr,  zmeanor0
-  REAL    :: rad, zdeltay, zleny, weighy, masque, zmeasud0
-  REAL    :: zbordnor, zmeanor, zstdnor, zsignor, zweinor, zpicnor, zvalnor
-  REAL    :: zbordsud, zmeasud, zstdsud, zsigsud, zweisud, zpicsud, zvalsud
-  REAL    :: zbordest, zbordoue, xk, xl, xm, xp, xq, xw
+  REAL    :: xpi, zdeltax, zlenx, weighx, xincr,  zweinor, xk, xl, xm
+  REAL    :: rad, zdeltay, zleny, weighy, masque, zweisud, xp, xq, xw
+
+
+
 !-------------------------------------------------------------------------------
   imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp")
@@ -170,14 +169,14 @@
     DO jj = 1, jmar
       DO j = 2,jmdp+1 
-        zlenx  =zleny  *COS(yusn(j))
+        zlenx=zleny*COS(yusn(j))
         zdeltax=zdeltay*COS(yusn(j))
-        zbordnor=(xincr+c(jj)-yusn(j))*rad
-        zbordsud=(xincr-d(jj)+yusn(j))*rad
-        weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny))
+        weighy=(xincr+AMIN1(c(jj)-yusn(j),yusn(j)-d(jj)))*rad
+        weighy=AMAX1(0.,AMIN1(weighy,zleny))
+
         IF(weighy==0.) CYCLE
         DO i = 2, imdp+2*iext-1
-          zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j))
-          zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j))
-          weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx))
+          weighx=(xincr+AMIN1(xusn(i)-a(ii),b(ii)-xusn(i)))*rad*COS(yusn(j))
+          weighx=AMAX1(0.,AMIN1(weighx,zlenx))
+
           IF(weighx==0.) CYCLE
           num_tot(ii,jj)=num_tot(ii,jj)+1.0
@@ -198,7 +197,7 @@
 !--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME
   IF(.NOT.masque_lu) THEN
-    WHERE(weight(:,1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
+    WHERE(weight(:,:)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
   END IF
-  nn=COUNT(weight(:,1:jmar-1)==0.0)
+  nn=COUNT(weight(:,:)==0.0)
   IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn
   WHERE(weight(:,:)/=0.0)
@@ -224,43 +223,36 @@
 !--- FIRST FILTER, MOVING AVERAGE OVER 9 POINTS.
 !-------------------------------------------------------------------------------
-  ALLOCATE(zmea0(imar+1,jmar))
-  zmea0(:,:)=zmea(:,:)                           ! GK211005 (CG) UNSMOOTHED TOPO
+  zphi(:,:)=zmea(:,:)                           ! GK211005 (CG) UNSMOOTHED TOPO
+
   CALL MVA9(zmea);  CALL MVA9(zstd);  CALL MVA9(zpic);  CALL MVA9(zval)
   CALL MVA9(zxtzx); CALL MVA9(zxtzy); CALL MVA9(zytzy)
 
 !--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD. (SURFACE PARAMS MEANINGLESS)
-  ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0
-  WHERE(mask>=0.1) mask_tmp = 1.
-  WHERE(weight(:,:)/=0.0)
-!   zphi (:,:)= mask_tmp(:,:)*zmea (:,:) ! GK211005 (CG) not necessarly smoothed
-    zphi (:,:)= mask_tmp(:,:)*zmea0(:,:)
-    zmea0(:,:)= mask_tmp(:,:)*zmea0(:,:)
-    zmea (:,:)= mask_tmp(:,:)*zmea (:,:)
-    zpic (:,:)= mask_tmp(:,:)*zpic (:,:)
-    zval (:,:)= mask_tmp(:,:)*zval (:,:)
-    zstd (:,:)= mask_tmp(:,:)*zstd (:,:)
+  WHERE(weight(:,:)==0.0.OR.mask<0.1)
+    zphi(:,:)=0.0; zmea(:,:)=0.0; zpic(:,:)=0.0; zval(:,:)=0.0; zstd(:,:)=0.0
   END WHERE
   DO ii = 1, imar
     DO jj = 1, jmar
-      IF (weight(ii,jj)/=0.0) THEN
-      !--- Coefficients K, L et M:
-        xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
-        xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
-        xm=zxtzy(ii,jj)
-        xp=xk-SQRT(xl**2+xm**2)
-        xq=xk+SQRT(xl**2+xm**2)
-        xw=1.e-8
-        IF(xp<=xw) xp=0.
-        IF(xq<=xw) xq=xw
-        IF(ABS(xm)<=xw) xm=xw*SIGN(1.,xm)
-      !--- SLOPE
-        zsig(ii,jj)=SQRT(xq)*mask_tmp(ii,jj)
-      !---ISOTROPY
-        zgam(ii,jj)=xp/xq*mask_tmp(ii,jj)
-      !--- THETA ANGLE
-        zthe(ii,jj)=57.29577951*ATAN2(xm,xl)/2.*mask_tmp(ii,jj)
-      END IF
+      IF(weight(ii,jj)==0.0) CYCLE
+    !--- Coefficients K, L et M:
+      xk=(zxtzx(ii,jj)+zytzy(ii,jj))/2.
+      xl=(zxtzx(ii,jj)-zytzy(ii,jj))/2.
+      xm=zxtzy(ii,jj)
+      xp=xk-SQRT(xl**2+xm**2)
+      xq=xk+SQRT(xl**2+xm**2)
+      xw=1.e-8
+      IF(xp<=xw) xp=0.
+      IF(xq<=xw) xq=xw
+      IF(ABS(xm)<=xw) xm=xw*SIGN(1.,xm)
+    !--- SLOPE, ANISOTROPY AND THETA ANGLE
+      zsig(ii,jj)=SQRT(xq)
+      zgam(ii,jj)=xp/xq
+      zthe(ii,jj)=90.*ATAN2(xm,xl)/xpi
     END DO
   END DO
+  WHERE(weight(:,:)==0.0.OR.mask<0.1)
+    zsig(:,:)=0.0; zgam(:,:)=0.0; zthe(:,:)=0.0
+  END WHERE
+
   WRITE(lunout,*)'  MEAN ORO:' ,MAXVAL(zmea)
   WRITE(lunout,*)'  ST. DEV.:' ,MAXVAL(zstd)
@@ -271,39 +263,33 @@
   WRITE(lunout,*)'  val:'      ,MAXVAL(zval)
       
-!--- Values at poles
-  zmea0(imar+1,:)=zmea0(1,:)
-  zmea (imar+1,:)=zmea (1,:)
-  zphi (imar+1,:)=zphi (1,:)
-  zpic (imar+1,:)=zpic (1,:)
-  zval (imar+1,:)=zval (1,:)
-  zstd (imar+1,:)=zstd (1,:)
-  zsig (imar+1,:)=zsig (1,:)
-  zgam (imar+1,:)=zgam (1,:)
-  zthe (imar+1,:)=zthe (1,:)
-
-  zweinor =SUM(weight(1:imar,   1),DIM=1)
-  zweisud =SUM(weight(1:imar,jmar),DIM=1)
-  zmeanor0=SUM(weight(1:imar,   1)*zmea0(1:imar,   1),DIM=1)
-  zmeasud0=SUM(weight(1:imar,jmar)*zmea0(1:imar,jmar),DIM=1)
-  zmeanor =SUM(weight(1:imar,   1)*zmea (1:imar,   1),DIM=1)
-  zmeasud =SUM(weight(1:imar,jmar)*zmea (1:imar,jmar),DIM=1)
-  zstdnor =SUM(weight(1:imar,   1)*zstd (1:imar,   1),DIM=1)
-  zstdsud =SUM(weight(1:imar,jmar)*zstd (1:imar,jmar),DIM=1)
-  zsignor =SUM(weight(1:imar,   1)*zsig (1:imar,   1),DIM=1)
-  zsigsud =SUM(weight(1:imar,jmar)*zsig (1:imar,jmar),DIM=1)
-  zpicnor =SUM(weight(1:imar,   1)*zpic (1:imar,   1),DIM=1)
-  zpicsud =SUM(weight(1:imar,jmar)*zpic (1:imar,jmar),DIM=1)
-  zvalnor =SUM(weight(1:imar,   1)*zval (1:imar,   1),DIM=1)
-  zvalsud =SUM(weight(1:imar,jmar)*zval (1:imar,jmar),DIM=1)
-
-  zmea(:,1)=zmeanor /zweinor; zmea(:,jmar)=zmeasud /zweisud
-!  zphi(:,1)=zmeanor0/zweinor; zphi(:,jmar)=zmeasud0/zweisud   TO COMMIT
-  zphi(:,1)=zmeanor /zweinor; zphi(:,jmar)=zmeasud /zweisud
-  zpic(:,1)=zpicnor /zweinor; zpic(:,jmar)=zpicsud /zweisud
-  zval(:,1)=zvalnor /zweinor; zval(:,jmar)=zvalsud /zweisud
-  zstd(:,1)=zstdnor /zweinor; zstd(:,jmar)=zstdsud /zweisud
-  zsig(:,1)=zsignor /zweinor; zsig(:,jmar)=zsigsud /zweisud
-  zgam(:,1)=1.;               zgam(:,jmar)=1.
-  zthe(:,1)=0.;               zthe(:,jmar)=0.
+!--- Values at redundant longitude
+  zmea(imar+1,:)=zmea(1,:)
+  zphi(imar+1,:)=zphi(1,:)
+  zpic(imar+1,:)=zpic(1,:)
+  zval(imar+1,:)=zval(1,:)
+  zstd(imar+1,:)=zstd(1,:)
+  zsig(imar+1,:)=zsig(1,:)
+  zgam(imar+1,:)=zgam(1,:)
+  zthe(imar+1,:)=zthe(1,:)
+
+!--- Values at north pole
+  zweinor  =SUM(weight(1:imar,1))
+  zmea(:,1)=SUM(weight(1:imar,1)*zmea(1:imar,1))/zweinor
+  zphi(:,1)=SUM(weight(1:imar,1)*zphi(1:imar,1))/zweinor
+  zpic(:,1)=SUM(weight(1:imar,1)*zpic(1:imar,1))/zweinor
+  zval(:,1)=SUM(weight(1:imar,1)*zval(1:imar,1))/zweinor
+  zstd(:,1)=SUM(weight(1:imar,1)*zstd(1:imar,1))/zweinor
+  zsig(:,1)=SUM(weight(1:imar,1)*zsig(1:imar,1))/zweinor
+  zgam(:,1)=1.; zthe(:,1)=0.
+
+!--- Values at south pole
+  zweisud     =SUM(weight(1:imar,jmar),DIM=1)
+  zmea(:,jmar)=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar))/zweisud
+  zphi(:,jmar)=SUM(weight(1:imar,jmar)*zphi(1:imar,jmar))/zweisud
+  zpic(:,jmar)=SUM(weight(1:imar,jmar)*zpic(1:imar,jmar))/zweisud
+  zval(:,jmar)=SUM(weight(1:imar,jmar)*zval(1:imar,jmar))/zweisud
+  zstd(:,jmar)=SUM(weight(1:imar,jmar)*zstd(1:imar,jmar))/zweisud
+  zsig(:,jmar)=SUM(weight(1:imar,jmar)*zsig(1:imar,jmar))/zweisud
+  zgam(:,jmar)=1.; zthe(:,jmar)=0.
 
 END SUBROUTINE grid_noro
@@ -323,24 +309,24 @@
 !-------------------------------------------------------------------------------
 ! Arguments:
-  REAL, INTENT(IN)   :: xd(:), yd(:) !--- INPUT  COORDINATES     (imdp) (jmdp)
-  REAL, INTENT(IN)   :: zd(:,:)      !--- INPUT  FIELD           (imdp,jmdp)
-  REAL, INTENT(IN)   :: x(:), y(:)   !--- OUTPUT COORDINATES     (imar+1) (jmar)
-  REAL, INTENT(OUT)  :: zphi(:,:)    !--- GEOPOTENTIAL           (imar+1,jmar)
-  REAL, INTENT(INOUT):: mask(:,:)    !--- MASK                   (imar+1,jmar)
+  REAL, INTENT(IN)  :: xd(:), yd(:) !--- INPUT  COORDINATES     (imdp) (jmdp)
+  REAL, INTENT(IN)  :: zd(:,:)      !--- INPUT  FIELD           (imdp,  jmdp)
+  REAL, INTENT(IN)  :: x(:), y(:)   !--- OUTPUT COORDINATES     (imar+1) (jmar)
+  REAL, INTENT(OUT) :: zphi(:,:)    !--- GEOPOTENTIAL           (imar+1,jmar)
+  REAL, INTENT(OUT) :: mask(:,:)    !--- MASK                   (imar+1,jmar)
 !-------------------------------------------------------------------------------
 ! Local variables:
   CHARACTER(LEN=256) :: modname="grid_noro0"
   REAL, ALLOCATABLE :: xusn(:), yusn(:)           ! dim (imdp+2*iext) (jmdp+2)
-  REAL, ALLOCATABLE :: zusn(:,:)                  ! dim (imdp+2*iext,jmdp+2)
+  REAL, ALLOCATABLE :: zusn(:,:)                  ! dim (imdp+2*iext,  jmdp+2)
   REAL, ALLOCATABLE :: weight(:,:)                ! dim (imar+1,jmar)
-  REAL, ALLOCATABLE :: mask_tmp(:,:), zmea(:,:)   ! dim (imar+1,jmar)
-  REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imax,jmax)
-  REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imax)
-  REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmax)
+  REAL, ALLOCATABLE :: num_tot(:,:), num_lan(:,:) ! dim (imar+1,jmar)
+  REAL, ALLOCATABLE :: a(:), b(:)                 ! dim (imar+1)
+  REAL, ALLOCATABLE :: c(:), d(:)                 ! dim (jmar)
+
   LOGICAL :: masque_lu
   INTEGER :: i, ii, imdp, imar, iext
   INTEGER :: j, jj, jmdp, jmar, nn
-  REAL    :: xpi, zlenx, weighx, xincr,  zbordnor, zmeanor, zweinor, zbordest
-  REAL    :: rad, zleny, weighy, masque, zbordsud, zmeasud, zweisud, zbordoue
+  REAL    :: xpi, zlenx, zleny, weighx, weighy, xincr, masque, rad
+
 !-------------------------------------------------------------------------------
   imdp=assert_eq(SIZE(xd),SIZE(zd,1),TRIM(modname)//" imdp")
@@ -392,6 +378,5 @@
 
 !--- INITIALIZATIONS:
-  ALLOCATE(weight(imar+1,jmar)); weight(:,:)= 0.0
-  ALLOCATE(zmea  (imar+1,jmar)); zmea  (:,:)= 0.0
+  ALLOCATE(weight(imar+1,jmar)); weight(:,:)=0.0; zphi(:,:)=0.0
 
 !--- SUMMATION OVER GRIDPOINT AREA
@@ -403,21 +388,17 @@
     DO jj = 1, jmar
       DO j = 2,jmdp+1 
-        zlenx  =zleny  *COS(yusn(j))
-        zbordnor=(xincr+c(jj)-yusn(j))*rad
-        zbordsud=(xincr-d(jj)+yusn(j))*rad
-        weighy=AMAX1(0.,AMIN1(zbordnor,zbordsud,zleny))
-        IF(weighy/=0) THEN
-          DO i = 2, imdp+2*iext-1
-            zbordest=(xusn(i)-a(ii)+xincr)*rad*COS(yusn(j))
-            zbordoue=(b(ii)+xincr-xusn(i))*rad*COS(yusn(j))
-            weighx=AMAX1(0.,AMIN1(zbordest,zbordoue,zlenx))
-            IF(weighx/=0)THEN
-              num_tot(ii,jj)=num_tot(ii,jj)+1.0
-              IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
-              weight(ii,jj)=weight(ii,jj)+weighx*weighy
-              zmea  (ii,jj)=zmea  (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN
-            END IF
-          END DO
-        END IF
+        zlenx=zleny*COS(yusn(j))
+        weighy=(xincr+AMIN1(c(jj)-yusn(j),yusn(j)-d(jj)))*rad
+        weighy=AMAX1(0.,AMIN1(weighy,zleny))
+        IF(weighy/=0) CYCLE
+        DO i = 2, imdp+2*iext-1
+          weighx=(xincr+AMIN1(xusn(i)-a(ii),b(ii)-xusn(i)))*rad*COS(yusn(j))
+          weighx=AMAX1(0.,AMIN1(weighx,zlenx))
+          IF(weighx/=0) CYCLE
+          num_tot(ii,jj)=num_tot(ii,jj)+1.0
+          IF(zusn(i,j)>=1.)num_lan(ii,jj)=num_lan(ii,jj)+1.0
+          weight(ii,jj)=weight(ii,jj)+weighx*weighy
+          zphi  (ii,jj)=zphi  (ii,jj)+zusn(i,j)*weighx*weighy !--- MEAN
+        END DO
       END DO
     END DO
@@ -426,29 +407,130 @@
 !--- COMPUTE PARAMETERS NEEDED BY LOTT & MILLER (1997) AND LOTT (1999) SSO SCHEME
   IF(.NOT.masque_lu) THEN
-    WHERE(weight(:,1:jmar-1)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
+    WHERE(weight(:,:)/=0.0) mask=num_lan(:,:)/num_tot(:,:)
   END IF
-  nn=COUNT(weight(:,1:jmar-1)==0.0)
+  nn=COUNT(weight(:,:)==0.0)
   IF(nn/=0) WRITE(lunout,*)'Problem with weight ; vanishing occurrences: ',nn
-  WHERE(weight/=0.0) zmea(:,:)=zmea(:,:)/weight(:,:)
+  WHERE(weight/=0.0) zphi(:,:)=zphi(:,:)/weight(:,:)
 
 !--- MASK BASED ON GROUND MAXIMUM, 10% THRESHOLD (<10%: SURF PARAMS MEANINGLESS)
-  ALLOCATE(mask_tmp(imar+1,jmar)); mask_tmp(:,:)=0.0
-  WHERE(mask>=0.1) mask_tmp = 1.
-  WHERE(weight(:,:)/=0.0)
-    zphi(:,:)=mask_tmp(:,:)*zmea(:,:)
-    zmea(:,:)=mask_tmp(:,:)*zmea(:,:)
-  END WHERE
+  WHERE(weight(:,:)==0.0.OR.mask<0.1) zphi(:,:)=0.0
+  WRITE(lunout,*)'  MEAN ORO:' ,MAXVAL(zphi)
+
+!--- Values at redundant longitude and at poles
+  zphi(imar+1,:)=zphi(1,:)
+  zphi(:,   1)=SUM(weight(1:imar,   1)*zphi(1:imar,   1))/SUM(weight(1:imar,   1))
+  zphi(:,jmar)=SUM(weight(1:imar,jmar)*zphi(1:imar,jmar))/SUM(weight(1:imar,jmar))
+
+END SUBROUTINE grid_noro0
+!
+!-------------------------------------------------------------------------------
+
+
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE read_noro(x,y,fname,zphi,zmea,zstd,zsig,zgam,zthe,zpic,zval,mask)
+!
+!-------------------------------------------------------------------------------
+! Purpose: Read parameters usually determined with grid_noro from a file.
+!===============================================================================
+  USE netcdf, ONLY: NF90_OPEN,  NF90_INQ_DIMID, NF90_INQUIRE_DIMENSION,        &
+        NF90_NOERR, NF90_CLOSE, NF90_INQ_VARID, NF90_GET_VAR, NF90_STRERROR,   &
+        NF90_NOWRITE
+  IMPLICIT NONE 
+!-------------------------------------------------------------------------------
+! Arguments:
+  REAL, INTENT(IN)  :: x(:), y(:)    !--- OUTPUT COORDINATES     (imar+1) (jmar)
+  CHARACTER(LEN=*), INTENT(IN) :: fname ! PARAMETERS FILE NAME
+  REAL, INTENT(OUT) :: zphi(:,:)     !--- GEOPOTENTIAL           (imar+1,jmar)
+  REAL, INTENT(OUT) :: zmea(:,:)     !--- MEAN OROGRAPHY         (imar+1,jmar)
+  REAL, INTENT(OUT) :: zstd(:,:)     !--- STANDARD DEVIATION     (imar+1,jmar)
+  REAL, INTENT(OUT) :: zsig(:,:)     !--- SLOPE                  (imar+1,jmar)
+  REAL, INTENT(OUT) :: zgam(:,:)     !--- ANISOTROPY             (imar+1,jmar)
+  REAL, INTENT(OUT) :: zthe(:,:)     !--- SMALL AXIS ORIENTATION (imar+1,jmar)
+  REAL, INTENT(OUT) :: zpic(:,:)     !--- MAXIMUM ALTITUDE       (imar+1,jmar)
+  REAL, INTENT(OUT) :: zval(:,:)     !--- MINIMUM ALTITUDE       (imar+1,jmar)
+  REAL, INTENT(OUT) :: mask(:,:)     !--- MASK                   (imar+1,jmar)
+!-------------------------------------------------------------------------------
+! Local variables:
+  CHARACTER(LEN=256) :: modname="read_noro"
+  INTEGER :: imar, jmar, fid, did, vid
+  LOGICAL :: masque_lu
+  REAL :: xpi, d2r
+!-------------------------------------------------------------------------------
+  imar=assert_eq([SIZE(x),SIZE(zphi,1),SIZE(zmea,1),SIZE(zstd,1),SIZE(zsig,1), &
+                          SIZE(zgam,1),SIZE(zthe,1),SIZE(zpic,1),SIZE(zval,1), &
+                          SIZE(mask,1)],TRIM(modname)//" imar")-1
+  jmar=assert_eq([SIZE(y),SIZE(zphi,2),SIZE(zmea,2),SIZE(zstd,2),SIZE(zsig,2), &
+                          SIZE(zgam,2),SIZE(zthe,2),SIZE(zpic,2),SIZE(zval,2), &
+                          SIZE(mask,2)],TRIM(modname)//" jmar")
+  xpi=ACOS(-1.0); d2r=xpi/180.
+  WRITE(lunout,*)"*** Orography parameters at sub-cell scale from file ***"
+
+!--- ARE WE USING A READ MASK ?
+  masque_lu=ANY(mask/=-99999.); IF(.NOT.masque_lu) mask=0.0
+  WRITE(lunout,*)'Masque lu: ',masque_lu
+  CALL ncerr(NF90_OPEN(fname,NF90_NOWRITE,fid))
+  CALL check_dim('x','longitude',x(1:imar))
+  CALL check_dim('y','latitude' ,y(1:jmar))
+  IF(.NOT.masque_lu) CALL get_fld('mask',mask)
+  CALL get_fld('Zphi',zphi)
+  CALL get_fld('Zmea',zmea)
+  CALL get_fld('mu'  ,zstd)
+  CALL get_fld('Zsig',zsig)
+  CALL get_fld('Zgam',zgam)
+  CALL get_fld('Zthe',zthe)
+  zpic=zmea+2*zstd
+  zval=MAX(0.,zmea-2.*zstd)
+  CALL ncerr(NF90_CLOSE(fid))
   WRITE(lunout,*)'  MEAN ORO:' ,MAXVAL(zmea)
-
-!--- Values at poles
-  zphi(imar+1,:)=zphi(1,:)
-
-  zweinor=SUM(weight(1:imar,   1),DIM=1)
-  zweisud=SUM(weight(1:imar,jmar),DIM=1)
-  zmeanor=SUM(weight(1:imar,   1)*zmea(1:imar,   1),DIM=1)
-  zmeasud=SUM(weight(1:imar,jmar)*zmea(1:imar,jmar),DIM=1)
-  zphi(:,1)=zmeanor/zweinor; zphi(:,jmar)=zmeasud/zweisud
-
-END SUBROUTINE grid_noro0
+  WRITE(lunout,*)'  ST. DEV.:' ,MAXVAL(zstd)
+  WRITE(lunout,*)'  PENTE:'    ,MAXVAL(zsig)
+  WRITE(lunout,*)'  ANISOTROP:',MAXVAL(zgam)
+  WRITE(lunout,*)'  ANGLE:'    ,MINVAL(zthe),MAXVAL(zthe)
+  WRITE(lunout,*)'  pic:'      ,MAXVAL(zpic)
+  WRITE(lunout,*)'  val:'      ,MAXVAL(zval)
+
+CONTAINS
+
+
+SUBROUTINE get_fld(var,fld)
+  CHARACTER(LEN=*), INTENT(IN)    :: var
+  REAL,             INTENT(INOUT) :: fld(:,:)
+  CALL ncerr(NF90_INQ_VARID(fid,var,vid),var)
+  CALL ncerr(NF90_GET_VAR(fid,vid,fld(1:imar,:)),var)
+  fld(imar+1,:)=fld(1,:)
+END SUBROUTINE get_fld
+
+SUBROUTINE check_dim(dimd,nam,dimv)
+  CHARACTER(LEN=*), INTENT(IN) :: dimd
+  CHARACTER(LEN=*), INTENT(IN) :: nam
+  REAL,             INTENT(IN) :: dimv(:)
+  REAL, ALLOCATABLE :: tmp(:)
+  INTEGER :: n
+  CALL ncerr(NF90_INQ_DIMID(fid,dimd,did))
+  CALL ncerr(NF90_INQUIRE_DIMENSION(fid,did,len=n)); ALLOCATE(tmp(n))
+  CALL ncerr(NF90_INQ_VARID(fid,dimd,did))
+  CALL ncerr(NF90_GET_VAR(fid,did,tmp))
+  IF(MAXVAL(tmp)>xpi) tmp=tmp*d2r
+  IF(n/=SIZE(dimv).OR.ANY(ABS(tmp-dimv)>1E-6)) THEN
+    WRITE(lunout,*)'Problem with file "'//TRIM(fname)//'".'
+    CALL abort_physic(modname,'Grid differs from LMDZ for '//TRIM(nam)//'.',1)
+  END IF
+END SUBROUTINE check_dim
+
+SUBROUTINE ncerr(ncres,var)
+  IMPLICIT NONE
+  INTEGER,          INTENT(IN) :: ncres
+  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: var
+  CHARACTER(LEN=256) :: mess
+  IF(ncres/=NF90_NOERR) THEN
+    mess='Problem with file "'//TRIM(fname)//'"'
+    IF(PRESENT(var)) mess=TRIM(mess)//' and variable "'//TRIM(var)//'"'
+    WRITE(lunout,*)TRIM(mess)//'.'
+    CALL abort_physic(modname,NF90_STRERROR(ncres),1)
+  END IF
+END SUBROUTINE ncerr
+
+END SUBROUTINE read_noro
 !
 !-------------------------------------------------------------------------------
@@ -494,2 +576,3 @@
 END MODULE grid_noro_m
 
+
Index: LMDZ5/trunk/libf/phylmd/limit_read_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/limit_read_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/limit_read_mod.F90	(revision 2665)
@@ -148,4 +148,6 @@
     USE netcdf
     USE indice_sol_mod
+    USE phys_cal_mod, ONLY : calend, year_len
+    USE print_control_mod, ONLY: lunout, prt_level
 
     IMPLICIT NONE
@@ -170,5 +172,5 @@
 ! Locals variables
 !****************************************************************************************
-    INTEGER                                   :: nid, nvarid
+    INTEGER                                   :: nid, nvarid, ndimid, nn
     INTEGER                                   :: ii, ierr
     INTEGER, DIMENSION(2)                     :: start, epais
@@ -178,4 +180,5 @@
     REAL, DIMENSION(klon_glo)                 :: alb_glo  ! albedo at global grid
     CHARACTER(len=20)                         :: modname='limit_read_mod'     
+    CHARACTER(LEN=99)                         :: abort_message, calendar, str
 
 ! End declaration
@@ -207,4 +210,5 @@
 ! 1) Open the file limit.nc if it is the right moment to read, once a day.
 !    The file is read only by the master thread of the master mpi process(is_mpi_root)
+!    Check by the way if the number of records is correct.
 !
 !****************************************************************************************
@@ -220,5 +224,34 @@
           IF (ierr /= NF90_NOERR) CALL abort_physic(modname,&
                'Pb d''ouverture du fichier de conditions aux limites',1)
-          
+
+          !--- WARNING IF CALENDAR IS KNOWN AND DOES NOT MATCH THE ONE OF LMDZ
+          ierr=NF90_INQ_VARID(nid, 'TEMPS', nvarid)
+          ierr=NF90_GET_ATT(nid, nvarid, 'calendar', calendar)
+          IF(ierr==NF90_NOERR.AND.calendar/=calend.AND.prt_level>=1) THEN
+             WRITE(lunout,*)'BEWARE: gcm and limit.nc calendars differ: '
+             WRITE(lunout,*)'  '//TRIM(calend)//' for gcm'
+             WRITE(lunout,*)'  '//TRIM(calendar)//' for limit.nc file'
+          END IF
+
+          !--- ERROR IF FILE RECORDS NUMBER IS NOT EQUAL TO EXPECTED NUMBER OF DAYS
+          ierr=NF90_INQUIRE(nid, UnlimitedDimID=ndimid)
+          ierr=NF90_INQUIRE_DIMENSION(nid, ndimid, len=nn)
+          WRITE(str,'(i)')nn; str=ADJUSTL(str)
+          abort_message='limit.nc records number ('//TRIM(str)//') does'//&
+            ' not match year length ('
+          WRITE(str,'(i)')year_len; str=ADJUSTL(str)
+          abort_message=TRIM(abort_message)//TRIM(str)//')'
+          IF(nn/=year_len) CALL abort_physic(modname,abort_message,1)
+
+          !--- ERROR IF FILES AND LMDZ HORIZONTAL RESOLUTIONS DO NOT MATCH
+          ierr=NF90_INQ_DIMID(nid, 'points_physiques', ndimid)
+          ierr=NF90_INQUIRE_DIMENSION(nid, ndimid, len=nn)
+          WRITE(str,'(i)')nn; str=ADJUSTL(str)
+          abort_message='limit.nc horizontal number of cells ('//TRIM(str)//') does'//&
+            ' not match LMDZ klon_glo ('
+          WRITE(str,'(i)')klon_glo; str=ADJUSTL(str)
+          abort_message=TRIM(abort_message)//TRIM(str)//')'
+          IF(nn/=klon_glo) CALL abort_physic(modname,abort_message,1)
+
           ! La tranche de donnees a lire:
           start(1) = 1
Index: LMDZ5/trunk/libf/phylmd/phys_output_ctrlout_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_ctrlout_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/phys_output_ctrlout_mod.F90	(revision 2665)
@@ -1204,4 +1204,6 @@
   TYPE(ctrl_out), SAVE :: o_ep = ctrl_out((/ 2, 10, 10, 10, 10, 10, 11, 11, 11 /), &
     'ep', 'ep', 'su', (/ ('', i=1, 9) /))
+  TYPE(ctrl_out), SAVE :: o_duphy = ctrl_out((/ 2, 10, 10, 10, 10, 10, 11, 11, 11 /), &
+    'duphy', 'Physics du', 'm/s2', (/ ('', i=1, 9) /))
   TYPE(ctrl_out), SAVE :: o_dtphy = ctrl_out((/ 2, 10, 10, 10, 10, 10, 11, 11, 11 /), &
     'dtphy', 'Physics dT', 'K/s', (/ ('', i=1, 9) /))
Index: LMDZ5/trunk/libf/phylmd/phys_output_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/phys_output_mod.F90	(revision 2665)
@@ -32,5 +32,5 @@
        new_aod, aerosol_couple, flag_aerosol_strat, &
        pdtphys, paprs, pphis, pplay, lmax_th, ptconv, ptconvth, ivap, &
-       d_t, qx, d_qx, zmasse, ok_sync)   
+       d_u, d_t, qx, d_qx, zmasse, ok_sync)   
 
     USE iophy 
@@ -65,5 +65,5 @@
     REAL, INTENT(IN)                            :: pdtphys
     REAL, DIMENSION(klon), INTENT(IN)           :: pphis
-    REAL, DIMENSION(klon, klev), INTENT(IN)     :: pplay, d_t
+    REAL, DIMENSION(klon, klev), INTENT(IN)     :: pplay, d_u, d_t
     REAL, DIMENSION(klon, klev+1), INTENT(IN)   :: paprs
     REAL, DIMENSION(klon,klev,nqtot), INTENT(IN):: qx, d_qx
Index: LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/phys_output_write_mod.F90	(revision 2665)
@@ -19,5 +19,5 @@
        ok_ade, ok_aie, ivap, iliq, isol, new_aod, ok_sync, &
        ptconv, read_climoz, clevSTD, ptconvth, &
-       d_t, qx, d_qx, zmasse, flag_aerosol, flag_aerosol_strat, ok_cdnc)
+       d_u, d_t, qx, d_qx, zmasse, flag_aerosol, flag_aerosol_strat, ok_cdnc)
 
     ! This subroutine does the actual writing of diagnostics that were
@@ -122,5 +122,5 @@
          o_zfull, o_zhalf, o_rneb, o_rnebjn, o_rnebcon, &
          o_rnebls, o_rhum, o_ozone, o_ozone_light, &
-         o_dtphy, o_dqphy, o_dqphy2d, o_dqlphy, o_dqlphy2d, &
+         o_duphy, o_dtphy, o_dqphy, o_dqphy2d, o_dqlphy, o_dqlphy2d, &
          o_dqsphy, o_dqsphy2d, o_albe_srf, o_z0m_srf, o_z0h_srf, &
          o_ages_srf, o_snow_srf, o_alb1, o_alb2, o_tke, &
@@ -336,5 +336,5 @@
     REAL, DIMENSION(klon,nlevSTD) :: zx_tmp_fi3d_STD
     REAL, DIMENSION(klon) :: pphis
-    REAL, DIMENSION(klon, klev) :: pplay, d_t
+    REAL, DIMENSION(klon, klev) :: pplay, d_u, d_t
     REAL, DIMENSION(klon, klev+1) :: paprs
     REAL, DIMENSION(klon,klev,nqtot) :: qx, d_qx
@@ -1214,4 +1214,6 @@
        ENDIF
 
+       CALL histwrite_phy(o_duphy, d_u)
+
        CALL histwrite_phy(o_dtphy, d_t)
 
Index: LMDZ5/trunk/libf/phylmd/physiq_mod.F90
===================================================================
--- LMDZ5/trunk/libf/phylmd/physiq_mod.F90	(revision 2664)
+++ LMDZ5/trunk/libf/phylmd/physiq_mod.F90	(revision 2665)
@@ -1540,5 +1540,5 @@
             flag_aerosol_strat, pdtphys, paprs, pphis,  &
             pplay, lmax_th, ptconv, ptconvth, ivap,  &
-            d_t, qx, d_qx, zmasse, ok_sync_omp)
+            d_u, d_t, qx, d_qx, zmasse, ok_sync_omp)
        !$OMP END MASTER
        !$OMP BARRIER
@@ -4521,5 +4521,5 @@
          ok_ade, ok_aie, ivap, iliq, isol, new_aod,      & 
          ok_sync, ptconv, read_climoz, clevSTD,          &
-         ptconvth, d_t, qx, d_qx, zmasse,                &
+         ptconvth, d_u, d_t, qx, d_qx, zmasse,           &
          flag_aerosol, flag_aerosol_strat, ok_cdnc)
 #endif
