SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/prep_hor_isba_field.F90
Go to the documentation of this file.
00001 !     #########
00002 SUBROUTINE PREP_HOR_ISBA_FIELD(HPROGRAM,HSURF,HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE)
00003 !     #################################################################################
00004 !
00005 !!****  *PREP_HOR_ISBA_FIELD* - reads, interpolates and prepares an ISBA field
00006 !!
00007 !!    PURPOSE
00008 !!    -------
00009 !
00010 !!**  METHOD
00011 !!    ------
00012 !!
00013 !!    REFERENCE
00014 !!    ---------
00015 !!      
00016 !!
00017 !!    AUTHOR
00018 !!    ------
00019 !!     V. Masson 
00020 !!
00021 !!    MODIFICATIONS
00022 !!    -------------
00023 !!      Original    01/2004
00024 !!      P. Le Moigne 10/2005, Phasage Arome
00025 !!      P. Le Moigne 03/2007, Ajout initialisation par ascllv
00026 !!      B. Decharme  01/2009, Optional Arpege deep soil temperature initialization
00027 !!      M. Lafaysse  07/2012, allow netcdf input files
00028 !!      B. Decharme  07/2012, Bug init uniform snow
00029 !!------------------------------------------------------------------
00030 !
00031 !
00032 !
00033 USE MODD_PREP,     ONLY : CINGRID_TYPE, CINTERP_TYPE, XZS_LS, &
00034                           XLAT_OUT, XLON_OUT, XX_OUT, XY_OUT, &
00035                           LINTERP, CMASK
00036 
00037 USE MODD_PREP_ISBA, ONLY : XGRID_SOIL, NGRID_LEVEL, LSNOW_IDEAL,    &
00038                            XWSNOW, XRSNOW, XTSNOW, XASNOW,          &
00039                            XSG1SNOW, XSG2SNOW, XHISTSNOW, XAGESNOW
00040 
00041 USE MODD_ISBA_n,    ONLY : TTIME, XWG, XWGI, XTG, XWR, XLAI,         &
00042                            NGROUND_LAYER, NPATCH, NWG_LAYER,         &
00043                            XVEGTYPE_PATCH, XDG, XWWILT, XWFC, XPATCH,&
00044                            CISBA, XROOTFRAC, XWSAT, TSNOW, XVEGTYPE, &
00045                            LTEMP_ARP, NTEMPLAYER_ARP, XSODELX
00046 
00047 USE MODD_ISBA_GRID_n,    ONLY : XLAT, XLON
00048 USE MODD_ISBA_PAR,       ONLY : XWGMIN
00049 USE MODD_DATA_COVER_PAR, ONLY : NVEGTYPE
00050 USE MODD_SURF_PAR,       ONLY : XUNDEF,NUNDEF
00051 !
00052 USE MODI_READ_PREP_ISBA_CONF
00053 USE MODI_READ_PREP_ISBA_SNOW
00054 USE MODI_PREP_ISBA_ASCLLV
00055 USE MODI_PREP_ISBA_GRIB
00056 USE MODI_PREP_ISBA_UNIF
00057 USE MODI_PREP_ISBA_BUFFER
00058 USE MODI_ABOR1_SFX
00059 USE MODI_HOR_INTERPOL
00060 USE MODI_VEGTYPE_GRID_TO_PATCH_GRID
00061 USE MODI_PREP_HOR_SNOW_FIELDS
00062 USE MODI_GET_LUOUT
00063 USE MODI_PREP_ISBA_EXTERN
00064 USE MODI_PREP_ISBA_NETCDF
00065 !
00066 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00067 USE PARKIND1  ,ONLY : JPRB
00068 !
00069 IMPLICIT NONE
00070 !
00071 !*      0.1    declarations of arguments
00072 !
00073  CHARACTER(LEN=6),   INTENT(IN)  :: HPROGRAM  ! program calling surf. schemes
00074  CHARACTER(LEN=7),   INTENT(IN)  :: HSURF     ! type of field
00075  CHARACTER(LEN=28),  INTENT(IN)  :: HATMFILE    ! name of the Atmospheric file
00076  CHARACTER(LEN=6),   INTENT(IN)  :: HATMFILETYPE! type of the Atmospheric file
00077  CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE    ! name of the Atmospheric file
00078  CHARACTER(LEN=6),   INTENT(IN)  :: HPGDFILETYPE! type of the Atmospheric file
00079 !
00080 !*      0.2    declarations of local variables
00081 !
00082  CHARACTER(LEN=6)              :: YFILETYPE ! type of input file
00083  CHARACTER(LEN=28)             :: YFILE     ! name of file
00084  CHARACTER(LEN=6)              :: YFILETYPE_SNOW ! type of input file
00085  CHARACTER(LEN=28)             :: YFILE_SNOW     ! name of file
00086  CHARACTER(LEN=6)              :: YFILEPGDTYPE ! type of input file
00087  CHARACTER(LEN=28)             :: YFILEPGD     ! name of file
00088 REAL, POINTER, DIMENSION(:,:,:)     :: ZFIELDIN  ! field to interpolate horizontally
00089 REAL, POINTER, DIMENSION(:,:)       :: ZFIELD ! field to interpolate horizontally
00090 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZFIELDOUT ! field interpolated   horizontally
00091 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZW        ! work array (x, fine   soil grid, npatch)
00092 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZF        ! work array (x, output soil grid, npatch)
00093 REAL, ALLOCATABLE, DIMENSION(:,:,:) :: ZDG       ! out T grid (x, output soil grid, npatch)
00094 INTEGER                       :: ILUOUT    ! output listing logical unit
00095 !
00096 LOGICAL                       :: GUNIF     ! flag for prescribed uniform field
00097 LOGICAL                       :: GUNIF_SNOW! flag for prescribed uniform field
00098 INTEGER                       :: JPATCH    ! loop on patches
00099 INTEGER                       :: JVEGTYPE  ! loop on vegtypes
00100 INTEGER                       :: INI, INL, JJ, JL! Work integer
00101 INTEGER, DIMENSION(SIZE(XDG,1),SIZE(XDG,3)) :: IWORK
00102 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00103 !-------------------------------------------------------------------------------------
00104 !
00105 !
00106 !*      1.     Reading of input file name and type
00107 !
00108 IF (LHOOK) CALL DR_HOOK('PREP_HOR_ISBA_FIELD',0,ZHOOK_HANDLE)
00109  CALL GET_LUOUT(HPROGRAM,ILUOUT)
00110 !
00111  CALL READ_PREP_ISBA_CONF(HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,&
00112                          HATMFILE,HATMFILETYPE,HPGDFILE,HPGDFILETYPE,ILUOUT,GUNIF)
00113 !
00114 CMASK = 'NATURE'
00115 !
00116 INI=SIZE(XLAT)
00117 !
00118 !-------------------------------------------------------------------------------------
00119 !
00120 !*      2.     Snow variables case?
00121 !
00122 IF (HSURF=='SN_VEG ') THEN
00123   CALL READ_PREP_ISBA_SNOW(HPROGRAM,TSNOW%SCHEME,TSNOW%NLAYER,YFILE_SNOW,YFILETYPE_SNOW,GUNIF_SNOW)
00124   IF(.NOT.GUNIF_SNOW.AND.LEN_TRIM(YFILE_SNOW)==0.AND.LEN_TRIM(YFILETYPE_SNOW)==0)THEN
00125     IF(LEN_TRIM(YFILE)/=0.AND.LEN_TRIM(YFILETYPE)/=0)THEN
00126        YFILE_SNOW    =YFILE
00127        YFILETYPE_SNOW=YFILETYPE
00128     ELSE
00129        GUNIF_SNOW=.TRUE.
00130        IF(ALL(XWSNOW==XUNDEF))XWSNOW=0.0
00131     ENDIF
00132   ENDIF
00133   CALL PREP_HOR_SNOW_FIELDS(HPROGRAM, HSURF,                     &
00134                             YFILE_SNOW, YFILETYPE_SNOW,          &
00135                             YFILEPGD, YFILEPGDTYPE,              &
00136                             ILUOUT, GUNIF_SNOW, NPATCH,          &
00137                             INI,TSNOW, TTIME,                    &
00138                             XWSNOW, XRSNOW, XTSNOW, XASNOW,      &
00139                             LSNOW_IDEAL, XSG1SNOW,               &
00140                             XSG2SNOW, XHISTSNOW, XAGESNOW,       &
00141                             XVEGTYPE_PATCH, XPATCH               )
00142   DEALLOCATE(XWSNOW)
00143   DEALLOCATE(XRSNOW)
00144   DEALLOCATE(XTSNOW)
00145   DEALLOCATE(XSG1SNOW)
00146   DEALLOCATE(XSG2SNOW)
00147   DEALLOCATE(XHISTSNOW)
00148   DEALLOCATE(XAGESNOW)
00149   IF (LHOOK) CALL DR_HOOK('PREP_HOR_ISBA_FIELD',1,ZHOOK_HANDLE)
00150   RETURN
00151 END IF
00152 !
00153 !-------------------------------------------------------------------------------------
00154 !
00155 !*      3.     Reading of input  configuration (Grid and interpolation type)
00156 !
00157 IF (GUNIF) THEN
00158   CALL PREP_ISBA_UNIF(ILUOUT,HSURF,ZFIELDIN)
00159 ELSE IF (YFILETYPE=='ASCLLV') THEN
00160   CALL PREP_ISBA_ASCLLV(HPROGRAM,HSURF,ILUOUT,ZFIELDIN)
00161 ELSE IF (YFILETYPE=='GRIB  ') THEN
00162   CALL PREP_ISBA_GRIB(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN)
00163 ELSE IF (YFILETYPE=='MESONH' .OR. YFILETYPE=='ASCII ' .OR. YFILETYPE=='LFI   ') THEN
00164    CALL PREP_ISBA_EXTERN(HPROGRAM,HSURF,YFILE,YFILETYPE,YFILEPGD,YFILEPGDTYPE,ILUOUT,ZFIELDIN)
00165 ELSE IF (YFILETYPE=='BUFFER') THEN
00166    CALL PREP_ISBA_BUFFER(HPROGRAM,HSURF,ILUOUT,ZFIELDIN)
00167 ELSE IF (YFILETYPE=='NETCDF') THEN
00168    CALL PREP_ISBA_NETCDF(HPROGRAM,HSURF,YFILE,ILUOUT,ZFIELDIN)
00169 ELSE
00170    CALL ABOR1_SFX('PREP_HOR_ISBA_FIELD: data file type not supported : '//YFILETYPE)
00171 END IF
00172 !
00173 !-------------------------------------------------------------------------------------
00174 !
00175 !*      5.     Horizontal interpolation
00176 !
00177 ALLOCATE(ZFIELDOUT(INI,SIZE(ZFIELDIN,2),SIZE(ZFIELDIN,3)))
00178 ALLOCATE(ZFIELD(SIZE(ZFIELDIN,1),SIZE(ZFIELDIN,2)))
00179 !
00180 DO JVEGTYPE = 1, SIZE(ZFIELDIN,3)
00181   ZFIELD=ZFIELDIN(:,:,JVEGTYPE)
00182   IF (SIZE(ZFIELDIN,3)==NVEGTYPE) LINTERP = (XVEGTYPE(:,JVEGTYPE) > 0.)
00183   CALL HOR_INTERPOL(ILUOUT,ZFIELD,ZFIELDOUT(:,:,JVEGTYPE))
00184   LINTERP = .TRUE.
00185 END DO
00186 !
00187 DEALLOCATE(ZFIELD)
00188 
00189 !-------------------------------------------------------------------------------------
00190 !
00191 !*      6.     Transformation from vegtype grid to patch grid
00192 !
00193 ALLOCATE(ZW (INI,SIZE(ZFIELDOUT,2),NPATCH))
00194 !
00195 ZW = 0.
00196 IF (SIZE(ZFIELDOUT,3)==NVEGTYPE) THEN
00197   CALL VEGTYPE_GRID_TO_PATCH_GRID(NPATCH,XVEGTYPE_PATCH,XPATCH,ZFIELDOUT,ZW)
00198 END IF
00199 !
00200 !-------------------------------------------------------------------------------------
00201 !
00202 !*      7.     Return to historical variable
00203 !
00204 !
00205 SELECT CASE (HSURF)
00206   !
00207   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00208   !
00209  CASE('ZS     ') 
00210   ALLOCATE(XZS_LS(INI))
00211   XZS_LS(:) = ZFIELDOUT(:,1,1)
00212   !
00213   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00214   !
00215  CASE('WG     ') 
00216   ALLOCATE(ZF (INI,NGROUND_LAYER,NPATCH))
00217   !
00218   !* interpolates on output levels
00219   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,XDG,ZF)
00220   !
00221   !* retrieves soil water content from soil relative humidity
00222   ALLOCATE(XWG(INI,NGROUND_LAYER,NPATCH))
00223   XWG(:,:,:)=XUNDEF
00224   IF(CISBA=='DIF')THEN
00225      IWORK(:,:)=NWG_LAYER(:,:)
00226   ELSE
00227      IWORK(:,:)=SIZE(XWG,2)
00228   ENDIF
00229   DO JPATCH=1,NPATCH
00230     DO JJ=1,INI
00231        IF(IWORK(JJ,JPATCH)==NUNDEF)CYCLE
00232        INL=IWORK(JJ,JPATCH)
00233        DO JL=1,INL
00234           XWG(JJ,JL,JPATCH) = XWWILT(JJ,JL) + ZF(JJ,JL,JPATCH) * (XWFC(JJ,JL)-XWWILT(JJ,JL))
00235           XWG(JJ,JL,JPATCH) = MAX(MIN(XWG(JJ,JL,JPATCH),XWSAT(JJ,JL)),XWGMIN)
00236        ENDDO
00237     ENDDO
00238   ENDDO
00239   !
00240   WHERE(ZF(:,:,:)==XUNDEF)XWG(:,:,:)=XUNDEF
00241   !
00242   DEALLOCATE(ZF)
00243   !
00244   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00245   !
00246  CASE('WGI    ')
00247   ALLOCATE(ZF (INI,NGROUND_LAYER,NPATCH))
00248   !
00249   !* interpolates on output levels
00250   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,XDG,ZF)
00251   !
00252   !* retrieves soil ice content from soil relative humidity
00253   ALLOCATE(XWGI(INI,NGROUND_LAYER,NPATCH))
00254   XWGI(:,:,:)=XUNDEF
00255   IF(CISBA=='DIF')THEN
00256      IWORK(:,:)=NWG_LAYER(:,:)
00257   ELSE
00258      IWORK(:,:)=SIZE(XWG,2)
00259   ENDIF  
00260   DO JPATCH=1,NPATCH
00261     DO JJ=1,INI
00262        IF(IWORK(JJ,JPATCH)==NUNDEF)CYCLE
00263        INL=IWORK(JJ,JPATCH)
00264        DO JL=1,INL
00265           XWGI(JJ,JL,JPATCH) = ZF(JJ,JL,JPATCH) * XWSAT(JJ,JL)
00266           XWGI(JJ,JL,JPATCH) = MAX(MIN(XWGI(JJ,JL,JPATCH),XWSAT(JJ,JL)),0.)
00267        ENDDO
00268     ENDDO
00269   END DO
00270   !
00271   WHERE(ZF(:,:,:)==XUNDEF)XWGI(:,:,:)=XUNDEF
00272   !
00273   DEALLOCATE(ZF)
00274   !
00275   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00276   !
00277  CASE('TG     ') 
00278   IF(LTEMP_ARP)THEN
00279     INL=NTEMPLAYER_ARP
00280   ELSE
00281     INL=NGROUND_LAYER
00282   ENDIF
00283   ALLOCATE(XTG(INI,INL,NPATCH))
00284   ALLOCATE(ZDG(SIZE(XDG,1),INL,SIZE(XDG,3)))
00285   IF (CISBA=='2-L'.OR.CISBA=='3-L') THEN
00286      IF(LTEMP_ARP)THEN
00287        DO JPATCH=1,NPATCH
00288           DO JL=1,INL
00289              ZDG(:,JL,JPATCH) = XSODELX(JL)-XSODELX(1)
00290           ENDDO
00291        ENDDO
00292      ELSE
00293        DO JPATCH=1,NPATCH
00294           ZDG(:,1,JPATCH) = 0.
00295           ZDG(:,2,JPATCH) = 0.40   ! deep temperature for force-restore taken at 20cm
00296           IF(CISBA=='3-L') ZDG(:,3,JPATCH) = 5.60   ! climatological temperature, usually not used
00297        ENDDO
00298      ENDIF
00299   ELSE
00300     !* diffusion method, the soil grid is the same as for humidity
00301     ZDG(:,:,:) = XDG(:,:,:)
00302   END IF
00303   CALL INIT_FROM_REF_GRID(XGRID_SOIL,ZW,ZDG,XTG)
00304   DEALLOCATE(ZDG)
00305   !
00306   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00307   !
00308  CASE('WR     ') 
00309   ALLOCATE(XWR(INI,NPATCH))
00310   DO JPATCH=1,NPATCH
00311     XWR(:,JPATCH) = ZW(:,1,JPATCH)
00312   END DO
00313   !
00314   !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00315   !
00316  CASE('LAI    ') 
00317   !* LAI is updated only if present and pertinent (evolutive LAI) in input file
00318   IF (ANY(ZW(:,:,:)/=XUNDEF)) THEN
00319     DO JPATCH=1,NPATCH
00320       XLAI(:,JPATCH) = ZW(:,1,JPATCH)
00321     END DO
00322   END IF
00323   !
00324 END SELECT
00325 !
00326 DEALLOCATE(ZW)
00327 !-------------------------------------------------------------------------------------
00328 !
00329 !*      8.     Deallocations
00330 !
00331 DEALLOCATE(ZFIELDIN )
00332 DEALLOCATE(ZFIELDOUT)
00333 IF (LHOOK) CALL DR_HOOK('PREP_HOR_ISBA_FIELD',1,ZHOOK_HANDLE)
00334 !
00335 !-------------------------------------------------------------------------------------
00336 !-------------------------------------------------------------------------------------
00337 !
00338 CONTAINS
00339 !
00340 !-------------------------------------------------------------------------------------
00341 !-------------------------------------------------------------------------------------
00342 !
00343 SUBROUTINE INIT_FROM_REF_GRID(PGRID1,PT1,PD2,PT2)
00344 !
00345 USE MODI_INTERP_GRID
00346 !
00347 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PT1    ! variable profile
00348 REAL, DIMENSION(:),     INTENT(IN)  :: PGRID1 ! normalized grid
00349 REAL, DIMENSION(:,:,:), INTENT(IN)  :: PD2    ! output layer thickness
00350 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PT2    ! variable profile
00351 !
00352 INTEGER                                  :: JI,JL  ! loop counter
00353 REAL, DIMENSION(SIZE(PT1,1),SIZE(PT1,2)) :: ZD1 ! input grid
00354 REAL, DIMENSION(SIZE(PD2,1),SIZE(PD2,2)) :: ZD2 ! output grid
00355 !
00356 INTEGER :: ILAYER1, ILAYER2
00357 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00358 !
00359 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00360 !
00361 IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',0,ZHOOK_HANDLE)
00362 IF (SIZE(PT1,2)==3) THEN
00363 !
00364 !* 1. case with only 3 input levels (typically coming from 'UNIF')
00365 !     -----------------------------
00366 !
00367   IF (CISBA=='2-L' .OR. CISBA=='3-L') THEN
00368     !* Possible LTEMP_ARP case
00369     IF(SIZE(PT2,2)>3)THEN
00370       ILAYER1=3
00371       ILAYER2=SIZE(PT2,2)
00372     ELSE
00373       ILAYER1=SIZE(PT2,2)
00374       ILAYER2=0
00375     ENDIF
00376     !* historical 2L or 3L ISBA version
00377     DO JPATCH=1,NPATCH
00378       PT2(:,1:ILAYER1,JPATCH) = PT1(:,1:ILAYER1,JPATCH) 
00379       !* Possible LTEMP_ARP case
00380       IF(ILAYER2>0)THEN
00381         DO JL=ILAYER1+1,ILAYER2
00382           PT2(:,JL,JPATCH) = PT2(:,ILAYER1,JPATCH)
00383         ENDDO
00384       ENDIF
00385     END DO
00386     IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',1,ZHOOK_HANDLE)
00387     RETURN
00388 !
00389   ELSEIF(CISBA=='DIF')THEN
00390     DO JPATCH=1,NPATCH
00391        !surface layer (generally 0.01m imposed)
00392        PT2(:,1,JPATCH) = PT1(:,1,JPATCH) 
00393        !deep layers
00394        DO JL=2,NGROUND_LAYER
00395          PT2(:,JL,JPATCH) = PT1(:,3,JPATCH)
00396        END DO
00397        !if root layers
00398        DO JI=1,SIZE(PT1,1)
00399          DO JL=2,NGROUND_LAYER
00400            IF(XROOTFRAC(JI,JL,JPATCH)<=1.0)THEN 
00401              PT2(JI,JL,JPATCH) = PT1(JI,2,JPATCH)
00402              EXIT
00403            ENDIF
00404          END DO
00405        END DO 
00406     END DO 
00407     IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',1,ZHOOK_HANDLE)
00408     RETURN
00409   END IF    
00410 !  
00411 END IF
00412 !
00413 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00414 !
00415 !* 2. case with fine grid as input (general case)
00416 !     ----------------------------
00417 !
00418 DO JPATCH=1,NPATCH
00419   ZD2(:,:) = 0.
00420   !
00421   ZD2(:,1) = PD2(:,1,JPATCH)/2.
00422   DO JL=2,SIZE(ZD2,2)
00423     ZD2(:,JL) = (PD2(:,JL-1,JPATCH)+PD2(:,JL,JPATCH)) /2.
00424   END DO
00425   !
00426   DO JL=1,SIZE(PT1,2)
00427     ZD1(:,JL) = PGRID1(JL)
00428   END DO
00429   !
00430   CALL INTERP_GRID(ZD1,PT1(:,:,JPATCH),ZD2,PT2(:,:,JPATCH))
00431 END DO
00432 IF (LHOOK) CALL DR_HOOK('INIT_FROM_REF_GRID',1,ZHOOK_HANDLE)
00433 !
00434 !- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
00435 END SUBROUTINE INIT_FROM_REF_GRID
00436 !-------------------------------------------------------------------------------------
00437 !
00438 END SUBROUTINE PREP_HOR_ISBA_FIELD