Juan 8/12/2016: add management of LEN_HREC in MNH & SURFEX
[MNH-git_open_source-lfs.git] / src / SURFEX / mode_read_extern.F90
index 5f459a4..1a01fcb 100644 (file)
@@ -5,6 +5,7 @@
 ! Modifications :
 ! P.Marguinaud : 11-09-2012 : shorten field name
 ! G.Delautier : 24-06-2015 : bug for arome compressed files
+! M.Moge    01/2016  using READ_SURF_FIELD2D/3D for 2D/3D surfex fields reads
 !     #####################
 MODULE MODE_READ_EXTERN
 !     #####################
@@ -31,6 +32,8 @@ USE MODD_SURF_PAR,       ONLY : NUNDEF, XUNDEF
 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER, NVEGTYPE
 !
 USE MODI_READ_SURF_ISBA_PAR_n
+USE MODI_READ_SURF_FIELD3D
+USE MODI_READ_SURF_FIELD2D
 USE MODI_READ_SURF
 USE MODI_CONVERT_COVER_ISBA
 USE MODI_GARDEN_SOIL_DEPTH
@@ -56,8 +59,8 @@ REAL, DIMENSION(:,:,:), POINTER     :: PDEPTH    ! middle depth of each layer
 !* local variables
 !  ---------------
 !
- CHARACTER(LEN=12) :: YRECFM         ! Name of the article to be read
- CHARACTER(LEN=16) :: YRECFM2
+ CHARACTER(LEN=LEN_HREC) :: YRECFM         ! Name of the article to be read
+ CHARACTER(LEN=LEN_HREC) :: YRECFM2
  CHARACTER(LEN=100):: YCOMMENT       ! Comment string
 INTEGER           :: IRESP          ! reading return code
 INTEGER           :: ILAYER         ! number of soil layers
@@ -100,6 +103,13 @@ ELSE
   GECOCLIMAP = .NOT. GPAR_GARDEN
 END IF
 !
+!
+YRECFM='VERSION'
+ CALL READ_SURF(HPROGRAM,YRECFM,IVERSION,IRESP)
+!
+YRECFM='BUG'
+ CALL READ_SURF(HPROGRAM,YRECFM,IBUGFIX,IRESP)
+!
 !------------------------------------------------------------------------------
 !
 ALLOCATE(ZDG   (KNI,KLAYER,KPATCH))
@@ -108,6 +118,8 @@ IWG_LAYER(:,:) = NUNDEF
 IHYDRO_LAYER = KLAYER
 !
 IF (GECOCLIMAP) THEN
+
+ IF (IVERSION<7 .OR. IVERSION==7 .AND. IBUGFIX<=3) THEN
   !
   !* reading of the cover to obtain the depth of inter-layers
   !
@@ -121,18 +133,39 @@ IF (GECOCLIMAP) THEN
   !* computes soil layers
   !  
   CALL CONVERT_COVER_ISBA(HISBA,NUNDEF,ZCOVER,'   ',HNAT,PSOILGRID=PSOILGRID,PDG=ZDG,KWG_LAYER=IWG_LAYER)
-  IF (HISBA=='DIF') IHYDRO_LAYER = MAXVAL(IWG_LAYER(:,:),IWG_LAYER(:,:)/=NUNDEF)
   !
   DEALLOCATE(ZCOVER)
+ ELSE
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+print*, 'MODE_READ_EXTERN : ==> ON NE LIT PAS LES COVERS'
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+print*, '-----------------------------------------------'
+  IF (HNAT=='NAT') THEN
+    YRECFM='ECO_DG'
+  ELSE
+    YRECFM='GD_ECO_DG'
+  END IF
+  CALL READ_SURF_FIELD3D(HPROGRAM,ZDG,1,SIZE(ZDG,2),YRECFM,HDIR='A')
+  !
+  IF (HISBA=='DIF') THEN
+    YRECFM='ECO_WG_L'
+    IF (HNAT=='GRD') YRECFM='GD_ECO_WG_L'
+    ALLOCATE(ZWORK(KNI,KPATCH)) 
+    CALL READ_SURF_FIELD2D(HPROGRAM,ZWORK(:,:),YRECFM,HDIR='A')
+    WHERE (ZWORK==XUNDEF) ZWORK=NUNDEF
+    IWG_LAYER=NINT(ZWORK)
+    DEALLOCATE(ZWORK)
+  END IF
+ END IF
   !
+  IF (HISBA=='DIF') IHYDRO_LAYER = MAXVAL(IWG_LAYER(:,:),IWG_LAYER(:,:)/=NUNDEF)
 ENDIF
-!
-YRECFM='VERSION'
- CALL READ_SURF(HPROGRAM,YRECFM,IVERSION,IRESP)
-!
-YRECFM='BUG'
- CALL READ_SURF(HPROGRAM,YRECFM,IBUGFIX,IRESP)
-!
+
 !-------------------------------------------------------------------
 IF (HNAT=='NAT' .AND. (IVERSION>=7 .OR. .NOT.GECOCLIMAP)) THEN
   !
@@ -288,6 +321,7 @@ USE MODD_ISBA_PAR,    ONLY : XOPTIMGRID
 USE MODI_OPEN_AUX_IO_SURF
 USE MODI_CLOSE_AUX_IO_SURF
 USE MODI_READ_SURF
+USE MODI_READ_SURF_FIELD3D
 USE MODE_SOIL
 !
 IMPLICIT NONE
@@ -310,8 +344,11 @@ REAL, DIMENSION(:,:,:), POINTER       :: PDEPTH    ! middle depth of each layer
 !* local variables
 !  ---------------
 !
- CHARACTER(LEN=12) :: YRECFM         ! Name of the article to be read
+ CHARACTER(LEN=LEN_HREC) :: YRECFM         ! Name of the article to be read
  CHARACTER(LEN=4)  :: YLVL
+#ifdef MNH_PARALLEL
+ CHARACTER(LEN=8)  :: YPATCH
+#endif
  CHARACTER(LEN=3)  :: YISBA          ! type of ISBA soil scheme
  CHARACTER(LEN=3)  :: YNAT           ! type of surface (nature, garden)
  CHARACTER(LEN=4)  :: YPEDOTF        ! type of pedo-transfert function
@@ -478,6 +515,8 @@ DEALLOCATE(ZSOILGRID)
 ALLOCATE(ZNAT(KNI))
 IF (IVERSION>=7) THEN
   CALL READ_SURF(HFILEPGDTYPE,'FRAC_NATURE',ZNAT,IRESP,HDIR='A')
+ELSE
+  ZNAT=1.0  
 ENDIF
 
 !
@@ -500,14 +539,8 @@ ELSE
   CALL OPEN_AUX_IO_SURF(HFILE,HFILETYPE,'NATURE')
 ENDIF
 !
-DO JLAYER=1,ILAYER
-  WRITE(YLVL,'(I4)') JLAYER
-  YRECFM=TRIM(HNAME)//ADJUSTL(YLVL(:LEN_TRIM(YLVL)))
-  CALL READ_SURF(HFILETYPE,YRECFM,ZWORK(:,:),IRESP,HDIR='A')
-  DO JPATCH=1,IPATCH
-    ZVAR(:,JLAYER,JPATCH)=ZWORK(:,JPATCH)
-  END DO
-END DO
+  YRECFM=TRIM(HNAME)
+  CALL READ_SURF_FIELD3D(HFILETYPE,ZVAR,1,ILAYER,YRECFM,HDIR='A')
 !
  CALL CLOSE_AUX_IO_SURF(HFILE,HFILETYPE)
 !
@@ -561,7 +594,7 @@ IF (HFIELD=='WG    ' .OR. HFIELD=='WGI   ') THEN
   IF (HFIELD=='WG    ') THEN
     DO JPATCH=1,IPATCH
       DO JLAYER=1,ILAYER
-        WHERE(ZNAT(:)>0.0)
+        WHERE(ZNAT(:)>0.0 .AND. ZVAR(:,JLAYER,JPATCH)/=XUNDEF)
           ZVAR(:,JLAYER,JPATCH) = MAX(MIN(ZVAR(:,JLAYER,JPATCH),ZWSAT(:)),0.)
           !
           ZFIELD(:,JLAYER,JPATCH) = (ZVAR(:,JLAYER,JPATCH) - ZWWILT(:)) / (ZWFC(:) - ZWWILT(:))
@@ -571,7 +604,7 @@ IF (HFIELD=='WG    ' .OR. HFIELD=='WGI   ') THEN
   ELSE IF (HFIELD=='WGI   ') THEN
     DO JPATCH=1,IPATCH
       DO JLAYER=1,ILAYER
-        WHERE(ZNAT(:)>0.0)
+        WHERE(ZNAT(:)>0.0 .AND. ZVAR(:,JLAYER,JPATCH)/=XUNDEF)
           ZFIELD(:,JLAYER,JPATCH) = ZVAR(:,JLAYER,JPATCH) / ZWSAT(:)  
         END WHERE 
       END DO