SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/oi_control.F90
Go to the documentation of this file.
00001 SUBROUTINE OI_CONTROL (      &
00002  & LDINLINE,                 &
00003  & P__SURFTEMPERATURE,       &
00004  & P__SURFPREC_EAU_CON,      &
00005  & P__SURFPREC_EAU_GEC,      &
00006  & P__SURFPREC_NEI_CON,      &
00007  & P__SURFPREC_NEI_GEC,      &
00008  & P__ATMONEBUL_BASSE,       &
00009  & P__SURFXEVAPOTRANSP,      &
00010  & P__SURFFLU_LAT_MEVA,      &
00011  & P__SURFACCPLUIE,          &
00012  & P__SURFACCNEIGE,          &
00013  & P__SURFACCGRAUPEL,        &
00014  & P__CLSTEMPERATURE,        &
00015  & P__CLSHUMI_RELATIVE,      &
00016  & P__SURFIND_TERREMER,      &
00017  & P__SURFRESERV_NEIGE,      &
00018  & P__LON,                   &
00019  & P__LAT,                   &
00020  & LD_MASKEXT)
00021 
00022 ! ------------------------------------------------------------------------------------------
00023 !  *****************************************************************************************
00024 !
00025 !  Program to perform within SURFEX 
00026 !  a soil analysis for water content and temperature 
00027 !  using the Meteo-France optimum interpolation technique of Giard and Bazile (2000)
00028 !
00029 !  Derived from CANARI subroutines externalized by Lora Taseva (Dec. 2007)
00030 !
00031 !  Author : Jean-Francois Mahfouf (01/2008)
00032 !
00033 !  Modifications : 
00034 !   (05/2008)  : The I/O of this version follow the newly available LFI format in SURFEX  
00035 !   (01/2009)  : Read directly atmospheric FA files using XRD library instead of using "edf"
00036 !   (06/2009)  : Modifications to allow the assimilation of ASCAT superficial soil moisture
00037 !   (09/2010)  : More parameters to goto_surfex
00038 !   (03/2011)  : Initialization of ZEVAPTR (F.Bouyssel)
00039 !
00040 ! ******************************************************************************************
00041 ! ------------------------------------------------------------------------------------------
00042 USE MODD_TYPE_DATE_SURF
00043 USE MODD_CSTS,       ONLY : XDAY, XPI, XRHOLW, XLVTT, NDAYSEC
00044 USE MODD_SURF_PAR,   ONLY : XUNDEF
00045 USE MODD_ASSIM
00046 USE MODD_OL_FILEID
00047 
00048 USE MODD_SURFEX_OMP, ONLY : NINDX2_s=>NINDX2, NWORK, XWORK, XWORK2
00049 
00050 USE MODN_IO_OFFLINE, ONLY : CSURF_FILETYPE
00051 
00052 USE MODD_SURF_ATM_n, ONLY : CSEA,        CWATER,      CTOWN,      CNATURE,      &
00053                             XSEA,        XWATER,      XTOWN,      XNATURE,      &
00054                             NSIZE_SEA,   NSIZE_WATER, NSIZE_TOWN, NSIZE_NATURE, &
00055                             NR_SEA,      NR_WATER,    NR_TOWN,                  &
00056                             NR_NATURE,   XCOVER,      NDIM_FULL,  NSIZE_FULL,   &
00057                             NDIM_NATURE, NDIM_SEA,    NDIM_WATER, NDIM_TOWN 
00058 
00059 #ifdef LFI 
00060 USE MODD_IO_SURF_LFI,ONLY : CFILEIN_LFI, CFILEOUT_LFI, CFILEPGD_LFI, CFILEIN_LFI_SAVE
00061 #endif
00062 #ifdef FA
00063 USE MODD_IO_SURF_FA, ONLY : CFILEIN_FA, CFILEIN_FA_SAVE, CDNOMC, &
00064                             NDGUX,  NDLUX,  PERPK,  PELON0, PELAT0, &
00065                             PEDELX, PEDELY, PELON1, PELAT1, PEBETA
00066 #endif 
00067 #ifdef ARO 
00068 USE MODD_IO_SURF_ARO,ONLY : NGPTOT, NGPTOT_CAP, NPROMA, NINDX1, NINDX2, NBLOCK, NKPROMA, &
00069                             LWRITE, LCOUNTW, LFMWRIT, XGPGW, YSURFEX_CACHE_OUT,          &
00070                             SURFEX_FIELD_BUF_PREALLOC, SURFEX_FIELD_BUF_SET_RECORD,      &
00071                             NCOUNTW, NCOUNTW_TOT 
00072 #endif
00073 
00074 USE MODI_READ_ALL_NAMELISTS
00075 USE MODI_GOTO_SURFEX
00076 USE MODI_ALLOC_SURFEX
00077 USE MODI_INI_DATA_COVER
00078 USE MODI_INIT_IO_SURF_n
00079 USE MODI_READ_SURF
00080 USE MODI_TRANS_CHAINE
00081 USE MODI_SET_SURFEX_FILEIN
00082 USE MODI_GET_SIZE_FULL_n
00083 USE MODI_READ_COVER_n
00084 USE MODI_CONVERT_COVER_FRAC
00085 USE MODI_GET_1D_MASK
00086 USE MODI_END_IO_SURF_n
00087 USE MODI_IO_BUFF_CLEAN_n
00088 USE MODI_OI_BC_SOIL_MOISTURE
00089 USE MODI_OI_LATLON_CONF_PROJ
00090 USE MODI_OI_CACSTS
00091 USE MODI_OI_HOR_EXTRAPOL_SURF
00092 USE MODI_FLAG_UPDATE
00093 USE MODI_WRITE_SURF
00094 
00095 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK
00096 USE PARKIND1  ,ONLY : JPRB
00097 
00098 IMPLICIT NONE
00099 
00100 LOGICAL, INTENT (IN) :: LDINLINE
00101 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFTEMPERATURE
00102 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFPREC_EAU_CON
00103 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFPREC_EAU_GEC
00104 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFPREC_NEI_CON
00105 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFPREC_NEI_GEC
00106 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__ATMONEBUL_BASSE
00107 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFXEVAPOTRANSP
00108 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFFLU_LAT_MEVA
00109 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFACCPLUIE
00110 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFACCNEIGE
00111 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFACCGRAUPEL
00112 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__CLSTEMPERATURE
00113 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__CLSHUMI_RELATIVE
00114 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFIND_TERREMER
00115 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__SURFRESERV_NEIGE
00116 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__LON
00117 REAL(KIND=JPRB), OPTIONAL, DIMENSION (:) ::  P__LAT
00118 LOGICAL,         OPTIONAL, DIMENSION (:) ::  LD_MASKEXT
00119 
00120 INTEGER :: IGPCOMP
00121 INTEGER :: IDAT
00122 
00123  CHARACTER(LEN=28) :: YNAMELIST = 'OPTIONS.nam                 '
00124 
00125 !    Declarations of local variables
00126 
00127  CHARACTER(LEN=6)            :: YPROGRAM
00128  CHARACTER(LEN=6), PARAMETER :: YPROGRAM2 = 'FA    '
00129  CHARACTER(LEN=2)            :: CMONTH
00130 INTEGER                     :: IYEAR                ! current year (UTC)
00131 INTEGER                     :: IMONTH               ! current month (UTC)
00132 INTEGER                     :: IDAY                 ! current day (UTC)
00133 INTEGER                     :: NSSSSS               ! current time since start of the run (s)
00134 INTEGER                     :: IRESP                ! return code
00135 TYPE (DATE_TIME)            :: TTIME                ! Current date and time
00136 INTEGER                     :: ISIZE
00137 INTEGER                     :: ISIZE1
00138 LOGICAL                     :: LLKEEPEXTZONE
00139 
00140 ! Arrays for soil OI analysis
00141 REAL, DIMENSION (:,:), ALLOCATABLE :: PWS, PWP, PTS, PTP, PTL, PSNS, PRSMIN, PD2, PLAI, PVEG
00142 REAL, DIMENSION (:),   ALLOCATABLE :: PSST, PSAB, PARG, PLAT, PLON, PTCLS, PHCLS, PUCLS, PVCLS,  
00143                                       PEVAP, PEVAPTR, PT2M_O, PHU2M_O, PTS_O, ZT2INC, ZH2INC,   &
00144                                       ZWS, ZWP, ZTL, ZTS, ZTP, ZTCLS, ZHCLS, ZUCLS, ZVCLS,      &
00145                                       PSSTC, PWPINC1, PWPINC2, PWPINC3, PT2MBIAS, PH2MBIAS,     &
00146                                       PRRCN, PRRCL, PRRSN, PRRSL, PATMNEB, PITM, PALBF, PEMISF, &
00147                                       PZ0F, PIVEG, PZ0H, PTSC, PTPC, PWSC, PWPC, PSNC, ZEVAP,   &
00148                                       ZEVAPTR, PGELAT, PGELAM, PGEMU, ZWSINC, ZWPINC, ZTSINC,   &
00149                                       ZTPINC, ZTLINC, ZSNINC, ZSNS, ZPX, ZPY, PSM_O, PSIG_SMO,  &
00150                                       PLSM_O, PWS_O, ZWGINC, PLST, PTRD3, ZSST, ZLST, ZALT
00151 REAL, DIMENSION (:),   ALLOCATABLE :: ZSST1, ZLST1, PSST1, PLST1, PLAT1, PLON1, ZALT1
00152 
00153 INTEGER                            :: IVERSION, IBUGFIX
00154 INTEGER                            :: J,J1
00155  CHARACTER(LEN=10)                  :: YVAR    ! Name of the prognostic variable (in LFI file)
00156  CHARACTER(LEN=100)                 :: YPREFIX ! Prefix of the prognostic variable  (in LFI file)
00157 INTEGER                            :: ILUOUT  ! ascii output unit number
00158 INTEGER                            :: INOBS   ! number of observations
00159 
00160 REAL                               :: PLAT0,PLON0,PRPK,PLATOR,PLONOR,DELX,DELY,PBETA,ZTHRES
00161 
00162 LOGICAL, DIMENSION(:), ALLOCATABLE :: OINTERP_LST, OINTERP_SST
00163 LOGICAL, DIMENSION(:), ALLOCATABLE :: OINTERP_LST1, OINTERP_SST1
00164 
00165 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00166 ! ----------------------------------------------------------------------------------
00167 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL', 0, ZHOOK_HANDLE)
00168 
00169 PRINT *,'--------------------------------------------------------------------------'
00170 PRINT *,'|                                                                        |'
00171 PRINT *,'|                             ENTER OI_ASSIM                             |'
00172 PRINT *,'|                                                                        |'
00173 PRINT *,'--------------------------------------------------------------------------'
00174 
00175  CALL READ_ALL_NAMELISTS(CSURF_FILETYPE,'ALL',.FALSE.)
00176 
00177 IF (LDINLINE) THEN
00178 
00179   YPROGRAM = 'AROME'
00180 #ifdef ARO   
00181   IGPCOMP = MIN (NGPTOT, NGPTOT_CAP)
00182   
00183   NBLOCK   = 1
00184   NINDX1   = 1 + (NBLOCK - 1) * NPROMA
00185   NINDX2   = MIN (NBLOCK * NPROMA, IGPCOMP)
00186   NKPROMA  = NINDX2 - NINDX1 + 1
00187   CALL GOTO_SURFEX (NBLOCK, .TRUE.)
00188 #endif
00189 
00190 ELSE
00191 
00192   YPROGRAM = 'LFI'
00193   CALL ALLOC_SURFEX(1)
00194   CALL GOTO_SURFEX(1,.TRUE.)
00195 
00196 ENDIF
00197 
00198 ILUOUT = 111
00199 LLKEEPEXTZONE = .FALSE.
00200 
00201 !   Update some constants dependant from NACVEG
00202 
00203 !  scaling of soil moisture increments when assimilation window is different from 6 hours
00204 RSCALDW = REAL(NECHGU)/6.0
00205 !  half assimilation window in sec
00206 ITRAD   = NECHGU*1800
00207 
00208  CALL INI_DATA_COVER
00209 
00210 !   File handling definition
00211 
00212 IF (.NOT. LDINLINE) THEN
00213 #ifdef LFI
00214   CFILEPGD_LFI = 'PGD'
00215   CFILEIN_LFI = 'PREP'        ! input PREP file (surface fields) 
00216   CFILEIN_LFI_SAVE = CFILEIN_LFI
00217 #endif
00218 ENDIF
00219 
00220 !   Read grid dimension for allocation
00221 
00222  CALL INIT_IO_SURF_n(YPROGRAM,'FULL  ','SURF  ','READ ')
00223 
00224 !   Find current time
00225 
00226  CALL READ_SURF(YPROGRAM,'DTCUR',TTIME,IRESP)
00227 
00228 !   Time initializations
00229 
00230 IYEAR  = TTIME%TDATE%YEAR
00231 IMONTH = TTIME%TDATE%MONTH
00232 IDAY   = TTIME%TDATE%DAY
00233 NSSSSS = TTIME%TIME
00234 IF (NSSSSS > NDAYSEC) NSSSSS = NSSSSS - NDAYSEC
00235  CALL TRANS_CHAINE(CMONTH,IMONTH,2)
00236 
00237 !   Reading grid characteristics to perform nature mask
00238 
00239  CALL END_IO_SURF_n(YPROGRAM)
00240  CALL SET_SURFEX_FILEIN(YPROGRAM,'PGD ') ! change input file name to pgd name
00241  CALL INIT_IO_SURF_n(YPROGRAM,'FULL  ','SURF  ','READ ')
00242 
00243  CALL READ_SURF(YPROGRAM,'SEA   ',CSEA   ,IRESP)
00244  CALL READ_SURF(YPROGRAM,'WATER ',CWATER ,IRESP)
00245  CALL READ_SURF(YPROGRAM,'NATURE',CNATURE,IRESP)
00246  CALL READ_SURF(YPROGRAM,'TOWN  ',CTOWN  ,IRESP)
00247 
00248  CALL READ_SURF(YPROGRAM,'DIM_FULL  ',NDIM_FULL,  IRESP)
00249  CALL READ_SURF(YPROGRAM,'DIM_SEA   ',NDIM_SEA,   IRESP)
00250  CALL READ_SURF(YPROGRAM,'DIM_NATURE',NDIM_NATURE,IRESP)
00251  CALL READ_SURF(YPROGRAM,'DIM_WATER ',NDIM_WATER, IRESP)
00252  CALL READ_SURF(YPROGRAM,'DIM_TOWN  ',NDIM_TOWN,  IRESP)
00253 
00254 NINDX2_s = NDIM_FULL
00255 ALLOCATE(NWORK(NDIM_FULL))
00256 ALLOCATE(XWORK(NDIM_FULL))
00257 ALLOCATE(XWORK2(NDIM_FULL,10))
00258 
00259 !   Get total dimension of domain (excluding extension zone)
00260 
00261  CALL GET_SIZE_FULL_n(YPROGRAM,NDIM_FULL,NSIZE_FULL)
00262 
00263 IF (LDINLINE) THEN
00264   ISIZE = NSIZE_FULL
00265 ELSE
00266   ISIZE = NDIM_FULL
00267 ENDIF
00268 
00269 ALLOCATE (PSAB(ISIZE)) 
00270 ALLOCATE (PARG(ISIZE))
00271 ALLOCATE (ZALT(ISIZE))
00272 
00273  CALL READ_SURF(YPROGRAM,'SAND',      PSAB,  IRESP)
00274  CALL READ_SURF(YPROGRAM,'CLAY',      PARG,  IRESP)
00275  CALL READ_SURF(YPROGRAM,'ZS',        ZALT,  IRESP)
00276 
00277  CALL READ_COVER_n(YPROGRAM)
00278 
00279 !   Perform masks (only nature used)
00280 
00281 ALLOCATE(XSEA   (ISIZE))
00282 ALLOCATE(XNATURE(ISIZE))
00283 ALLOCATE(XWATER (ISIZE))
00284 ALLOCATE(XTOWN  (ISIZE))
00285 
00286  CALL CONVERT_COVER_FRAC(XCOVER,XSEA,XNATURE,XTOWN,XWATER)
00287 
00288 NSIZE_NATURE = COUNT(XNATURE(:) > 0.0)
00289 NSIZE_TOWN   = COUNT(XTOWN(:)   > 0.0)
00290 NSIZE_WATER  = COUNT(XWATER(:)  > 0.0)
00291 NSIZE_SEA    = COUNT(XSEA(:)    > 0.0)
00292 
00293 ALLOCATE(NR_NATURE (NSIZE_NATURE))
00294 ALLOCATE(NR_TOWN   (NSIZE_TOWN  ))
00295 ALLOCATE(NR_WATER  (NSIZE_WATER ))
00296 ALLOCATE(NR_SEA    (NSIZE_SEA   ))
00297 
00298  CALL GET_1D_MASK( NSIZE_SEA,    ISIZE, XSEA   , NR_SEA   )
00299  CALL GET_1D_MASK( NSIZE_WATER,  ISIZE, XWATER , NR_WATER )
00300  CALL GET_1D_MASK( NSIZE_TOWN,   ISIZE, XTOWN  , NR_TOWN  )
00301  CALL GET_1D_MASK( NSIZE_NATURE, ISIZE, XNATURE, NR_NATURE)
00302 
00303 ! Allocate arrays
00304 
00305 ALLOCATE (PWS(ISIZE,1))
00306 ALLOCATE (PWP(ISIZE,1))
00307 ALLOCATE (PTS(ISIZE,1))
00308 ALLOCATE (PTP(ISIZE,1))
00309 ALLOCATE (PTL(ISIZE,1))
00310 ALLOCATE (PSST(ISIZE))
00311 ALLOCATE (PSNS(ISIZE,1))
00312 ALLOCATE (PLAI(ISIZE,1))
00313 ALLOCATE (PVEG(ISIZE,1))
00314 ALLOCATE (PRSMIN(ISIZE,1))
00315 ALLOCATE (PD2(ISIZE,1))
00316 ALLOCATE (PTCLS(ISIZE))
00317 ALLOCATE (PHCLS(ISIZE))
00318 ALLOCATE (PUCLS(ISIZE))
00319 ALLOCATE (PVCLS(ISIZE))
00320 ALLOCATE (PEVAP(ISIZE))
00321 ALLOCATE (PLST(ISIZE))
00322 ALLOCATE (PTRD3(ISIZE))
00323 
00324 ALLOCATE (OINTERP_LST(ISIZE))
00325 ALLOCATE (OINTERP_SST(ISIZE))
00326 ALLOCATE (ZLST(ISIZE))
00327 ALLOCATE (ZSST(ISIZE))
00328 
00329 !  Read prognostic variables
00330 
00331  CALL END_IO_SURF_n(YPROGRAM)
00332  CALL SET_SURFEX_FILEIN(YPROGRAM,'PREP') ! change input file name to pgd name
00333  CALL INIT_IO_SURF_n(YPROGRAM,'FULL  ','SURF  ','READ ')
00334 
00335 IF (NSIZE_NATURE>0 .AND. CNATURE/='NONE') THEN
00336   CALL READ_SURF(YPROGRAM,'WG1',       PWS,   IRESP)
00337   CALL READ_SURF(YPROGRAM,'WG2',       PWP,   IRESP)
00338   CALL READ_SURF(YPROGRAM,'TG1',       PTS,   IRESP)
00339   CALL READ_SURF(YPROGRAM,'TG2',       PTP,   IRESP)
00340   CALL READ_SURF(YPROGRAM,'WGI2',      PTL,   IRESP)
00341 
00342   CALL READ_SURF(YPROGRAM,'VERSION',IVERSION,IRESP)
00343   CALL READ_SURF(YPROGRAM,'BUG',IBUGFIX,IRESP)
00344   IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
00345     CALL READ_SURF(YPROGRAM,'WSN_VEG1',PSNS,  IRESP)
00346   ELSE
00347     CALL READ_SURF(YPROGRAM,'WSNOW_VEG1',PSNS,  IRESP)
00348   ENDIF
00349 ENDIF
00350 
00351 IF (NSIZE_SEA>0 .AND. CSEA/='NONE') THEN
00352   CALL READ_SURF(YPROGRAM,'SST',       PSST,  IRESP)
00353 ENDIF
00354 
00355 IF (NSIZE_WATER>0 .AND. CWATER/='NONE') THEN
00356   CALL READ_SURF(YPROGRAM,'TS_WATER',  PLST,  IRESP)
00357 ENDIF
00358 
00359 IF (NSIZE_TOWN>0 .AND. CTOWN/='NONE' .AND. LAROME) THEN
00360   CALL READ_SURF(YPROGRAM,'VERSION',IVERSION,IRESP)
00361   CALL READ_SURF(YPROGRAM,'BUG',IBUGFIX,IRESP)
00362   IF (IVERSION>7 .OR. IVERSION==7 .AND. IBUGFIX>=3) THEN
00363     CALL READ_SURF(YPROGRAM,'TROAD3',   PTRD3,  IRESP)
00364   ELSE
00365     CALL READ_SURF(YPROGRAM,'T_ROAD3',   PTRD3,  IRESP)
00366   ENDIF
00367 ELSE
00368   PTRD3(:) = XUNDEF
00369 ENDIF
00370 
00371  CALL READ_SURF(YPROGRAM,'T2M',       PTCLS, IRESP)
00372  CALL READ_SURF(YPROGRAM,'HU2M',      PHCLS, IRESP)
00373  CALL READ_SURF(YPROGRAM,'ZON10M',    PUCLS, IRESP)
00374  CALL READ_SURF(YPROGRAM,'MER10M',    PVCLS, IRESP)
00375 
00376 ! Read constant surface fields
00377 
00378  CALL READ_SURF(YPROGRAM,'RSMIN',     PRSMIN,IRESP)
00379  CALL READ_SURF(YPROGRAM,'DG2',       PD2,   IRESP)
00380  CALL READ_SURF(YPROGRAM,'LAI',       PLAI,  IRESP)
00381  CALL READ_SURF(YPROGRAM,'VEG',       PVEG,  IRESP)
00382 
00383 IF (LPRINT) THEN
00384   J = NR_NATURE(1)
00385   PRINT *,'value in PREP file => WG1       ',PWS(J,1)
00386   PRINT *,'value in PREP file => WG2       ',PWP(J,1)
00387   PRINT *,'value in PREP file => TG1       ',PTS(J,1)
00388   PRINT *,'value in PREP file => TG2       ',PTP(J,1)
00389   PRINT *,'value in PREP file => WGI2      ',PTL(J,1)
00390   PRINT *,'value in PREP file => WSNOW_VEG1',PSNS(J,1)
00391   PRINT *,'value in PREP file => SST       ',PSST(J)
00392   PRINT *,'value in PREP file => LAI       ',PLAI(J,1)
00393   PRINT *,'value in PREP file => VEG       ',PVEG(J,1)
00394   PRINT *,'value in PREP file => RSMIN     ',PRSMIN(J,1)
00395   PRINT *,'value in PREP file => DATA_DG2  ',PD2(J,1)
00396   PRINT *,'value in PREP file => SAND      ',PSAB(J)
00397   PRINT *,'value in PREP file => CLAY      ',PARG(J)
00398   PRINT *,'value in PREP file => ZS        ',ZALT(J)
00399 ENDIF
00400 
00401  CALL END_IO_SURF_n(YPROGRAM)
00402  CALL IO_BUFF_CLEAN_n
00403 
00404 !  Interface (allocate arrays)
00405 
00406 ALLOCATE (PLAT(ISIZE))
00407 ALLOCATE (PLON(ISIZE))
00408 ALLOCATE (ZPX(ISIZE))
00409 ALLOCATE (ZPY(ISIZE))
00410 ALLOCATE (PEVAPTR(ISIZE))
00411 ALLOCATE (ZWP(ISIZE))
00412 ALLOCATE (ZWS(ISIZE))
00413 ALLOCATE (ZTL(ISIZE))
00414 ALLOCATE (ZTS(ISIZE))
00415 ALLOCATE (ZTP(ISIZE))
00416 ALLOCATE (ZSNS(ISIZE))
00417 ALLOCATE (ZTCLS(ISIZE))
00418 ALLOCATE (ZHCLS(ISIZE))
00419 ALLOCATE (ZUCLS(ISIZE))
00420 ALLOCATE (ZVCLS(ISIZE))
00421 ALLOCATE (PSSTC(ISIZE))
00422 ALLOCATE (PWPINC1(ISIZE))
00423 ALLOCATE (PWPINC2(ISIZE))
00424 ALLOCATE (PWPINC3(ISIZE))
00425 ALLOCATE (PT2MBIAS(ISIZE))
00426 ALLOCATE (PH2MBIAS(ISIZE))
00427 ALLOCATE (PRRCN(ISIZE))
00428 ALLOCATE (PRRCL(ISIZE))
00429 ALLOCATE (PRRSN(ISIZE))
00430 ALLOCATE (PRRSL(ISIZE))
00431 ALLOCATE (PATMNEB(ISIZE))
00432 ALLOCATE (PITM(ISIZE))
00433 ALLOCATE (PALBF(ISIZE))
00434 ALLOCATE (PEMISF(ISIZE))
00435 ALLOCATE (PZ0F(ISIZE))
00436 ALLOCATE (PIVEG(ISIZE))
00437 ALLOCATE (PZ0H(ISIZE))
00438 ALLOCATE (PTSC(ISIZE))
00439 ALLOCATE (PTPC(ISIZE))
00440 ALLOCATE (PWSC(ISIZE))
00441 ALLOCATE (PWPC(ISIZE))
00442 ALLOCATE (PSNC(ISIZE))
00443 ALLOCATE (ZEVAP(ISIZE))
00444 ALLOCATE (ZEVAPTR(ISIZE))
00445 ALLOCATE (PGELAT(ISIZE))
00446 ALLOCATE (PGELAM(ISIZE))
00447 ALLOCATE (PGEMU(ISIZE))
00448 ALLOCATE (PT2M_O(ISIZE))
00449 ALLOCATE (PHU2M_O(ISIZE))
00450 ALLOCATE (PTS_O(ISIZE))
00451 ALLOCATE (PSM_O(ISIZE))
00452 ALLOCATE (PSIG_SMO(ISIZE))
00453 ALLOCATE (PLSM_O(ISIZE))
00454 ALLOCATE (PWS_O(ISIZE))
00455 ALLOCATE (ZWGINC(ISIZE))
00456 
00457 IF (.NOT. LDINLINE) THEN
00458 
00459 !  Read atmospheric forecast fields from FA files 
00460 #ifdef FA
00461   CFILEIN_FA = 'FG_OI_MAIN'        ! input forecast
00462   CFILEIN_FA_SAVE  = CFILEIN_FA
00463 #endif
00464 !  Open FA file (LAM version with extension zone)
00465   CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF  ','READ ')
00466 ENDIF
00467 
00468 !  Read model forecast quantities
00469 
00470 IF (LAROME) THEN
00471   IF (LDINLINE) THEN
00472     PRRSL(:) = P__SURFACCPLUIE   (1:ISIZE)
00473     PRRSN(:) = P__SURFACCNEIGE   (1:ISIZE)
00474     PRRCN(:) = P__SURFACCGRAUPEL (1:ISIZE)
00475   ELSE
00476     CALL READ_SURF(YPROGRAM2,'SURFACCPLUIE',    PRRSL  ,IRESP)
00477     CALL READ_SURF(YPROGRAM2,'SURFACCNEIGE',    PRRSN  ,IRESP)
00478     CALL READ_SURF(YPROGRAM2,'SURFACCGRAUPEL',  PRRCN  ,IRESP)
00479   ENDIF
00480   PRRCL(:) = 0.0
00481 !   CALL READ_SURF(YPROGRAM2,'SURFIND.VEG.DOMI',PIVEG  ,IRESP) 
00482   PIVEG(:) = 0.0
00483 ELSE
00484   IF (LDINLINE) THEN
00485     PRRCL(:) = P__SURFPREC_EAU_CON (1:ISIZE)
00486     PRRSL(:) = P__SURFPREC_EAU_GEC (1:ISIZE)
00487     PRRCN(:) = P__SURFPREC_NEI_CON (1:ISIZE)
00488     PRRSN(:) = P__SURFPREC_NEI_GEC (1:ISIZE)
00489   ELSE
00490     CALL READ_SURF(YPROGRAM2,'SURFPREC.EAU.CON',PRRCL  ,IRESP)
00491     CALL READ_SURF(YPROGRAM2,'SURFPREC.EAU.GEC',PRRSL  ,IRESP)
00492     CALL READ_SURF(YPROGRAM2,'SURFPREC.NEI.CON',PRRCN  ,IRESP)
00493     CALL READ_SURF(YPROGRAM2,'SURFPREC.NEI.GEC',PRRSN  ,IRESP)
00494   ENDIF
00495   PIVEG(:) = 0.0
00496 ENDIF
00497 IF (LDINLINE) THEN
00498   PATMNEB(:) = P__ATMONEBUL_BASSE  (1:ISIZE)
00499   PITM(:)    = P__SURFIND_TERREMER (1:ISIZE)
00500   PEVAP(:)   = P__SURFFLU_LAT_MEVA (1:ISIZE)
00501 ELSE
00502   CALL READ_SURF(YPROGRAM2,'ATMONEBUL.BASSE ',PATMNEB,IRESP)
00503   CALL READ_SURF(YPROGRAM2,'SURFIND.TERREMER',PITM   ,IRESP) 
00504   CALL READ_SURF(YPROGRAM2,'SURFFLU.LAT.MEVA',PEVAP  ,IRESP) ! accumulated fluxes (not available in LFI)
00505 ENDIF
00506 IF (.NOT.LALADSURF) THEN
00507   IF (LDINLINE) THEN
00508     PEVAPTR(:) = P__SURFXEVAPOTRANSP (1:ISIZE)
00509   ELSE
00510     CALL READ_SURF(YPROGRAM2,'SURFXEVAPOTRANSP',PEVAPTR,IRESP) ! not in ALADIN SURFEX
00511   ENDIF
00512 ELSE
00513   PEVAPTR(:) = 0.0
00514 ENDIF
00515 
00516 IF (.NOT. LDINLINE) THEN
00517 !  Close FA file
00518   CALL END_IO_SURF_n(YPROGRAM2)
00519   CALL IO_BUFF_CLEAN_n
00520   PRINT *,'READ FG_OI_MAIN OK'
00521 ENDIF
00522 
00523 IF (.NOT. LDINLINE) THEN
00524 !  Define FA file name for CANARI analysis
00525 #ifdef FA
00526   CFILEIN_FA = 'CANARI'        ! input CANARI analysis
00527   CFILEIN_FA_SAVE  = CFILEIN_FA
00528 #endif
00529 !  Open FA file 
00530   CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF  ','READ ')
00531 ENDIF
00532 
00533 IF (LDINLINE) THEN
00534   PT2M_O(:)  = P__CLSTEMPERATURE   (1:ISIZE)
00535   PHU2M_O(:) = P__CLSHUMI_RELATIVE (1:ISIZE)
00536   PTS_O(:)   = P__SURFTEMPERATURE  (1:ISIZE)
00537 ELSE
00538 !  Read CANARI analysis
00539   CALL READ_SURF(YPROGRAM2,'CLSTEMPERATURE  ',PT2M_O ,IRESP)
00540   CALL READ_SURF(YPROGRAM2,'CLSHUMI.RELATIVE',PHU2M_O,IRESP)
00541   CALL READ_SURF(YPROGRAM2,'SURFTEMPERATURE ',PTS_O  ,IRESP)
00542 ENDIF
00543 
00544 IF (.NOT. LDINLINE) THEN
00545 !  Close CANARI file
00546   CALL END_IO_SURF_n(YPROGRAM2)
00547   CALL IO_BUFF_CLEAN_n
00548   PRINT *,'READ CANARI OK'
00549 ENDIF
00550 
00551 !  Read ASCAT SM observations (in percent)
00552 
00553 INOBS = 0
00554 IF (LOBSWG) THEN
00555   OPEN(UNIT=111,FILE='ASCAT_SM.DAT')
00556   DO J=1,NDIM_FULL
00557     READ(111,*,END=990) PSM_O(J),PSIG_SMO(J),PLSM_O(J)
00558     IF (PLSM_O(J) < 1.0)          PSM_O(J) = 999.0 ! data rejection if not on land
00559     IF (PSIG_SMO(J) > SIGWGO_MAX) PSM_O(J) = 999.0 ! data rejection of error too large
00560     IF (PSM_O(J) /= 999.0) INOBS = INOBS + 1
00561   ENDDO
00562 990 CONTINUE
00563   CLOSE(UNIT=111)
00564   PRINT *,'READ ASCAT SM OK'
00565 ELSE
00566   PSM_O(:)    = 999.0
00567   PSIG_SMO(:) = 999.0
00568   PLSM_O(:)   = 0.0
00569 ENDIF
00570 PRINT *,' NUMBER OF ASCAT OBSERVATIONS AFTER INITIAL CHECKS  :: ',INOBS
00571 INOBS = 0
00572 
00573 ! Perform bias correction of SM observations
00574 
00575  CALL OI_BC_SOIL_MOISTURE(ISIZE,PSM_O,PSAB,PWS_O)
00576 
00577 IF (.NOT. LDINLINE) THEN
00578 !  Define FA file name for surface climatology
00579 #ifdef FA
00580   CFILEIN_FA = 'clim_isba'               ! input climatology
00581   CFILEIN_FA_SAVE  = CFILEIN_FA
00582   CDNOMC     = 'climat'                  ! new frame name
00583 #endif
00584 !  Open FA file 
00585   CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF  ','READ ')
00586 ENDIF
00587 
00588 IF (LDINLINE) THEN
00589   PSNC(:) = P__SURFRESERV_NEIGE (1:ISIZE)
00590 ELSE
00591 !  Read climatology file (snow water equivalent)
00592   CALL READ_SURF(YPROGRAM2,'SURFRESERV.NEIGE',PSNC  ,IRESP)
00593 ENDIF
00594 
00595 IF (.NOT. LDINLINE) THEN
00596 !  Close climatology file
00597   CALL END_IO_SURF_n(YPROGRAM2)
00598   CALL IO_BUFF_CLEAN_n
00599   PRINT *,'READ CLIMATOLOGY OK'
00600 ENDIF
00601 
00602 IF (.NOT. LDINLINE) THEN
00603 #ifdef FA
00604   PLAT0  = PELAT0 
00605   PLON0  = PELON0 
00606   PLATOR = PELAT1 
00607   PLONOR = PELON1 
00608   PRPK   = PERPK  
00609   PBETA  = PEBETA 
00610   DELX   = PEDELX 
00611   DELY   = PEDELY 
00612   IF (PLONOR > 180.0) PLONOR = PLONOR - 360.0
00613   IF (PLON0  > 180.0) PLON0  = PLON0  - 360.0
00614   DO J=1,NDGUX
00615     DO J1=1,NDLUX
00616       ZPX((J-1)*NDLUX + J1) = DELX*REAL(J1-1)
00617       ZPY((J-1)*NDLUX + J1) = DELY*REAL(J-1)
00618     ENDDO
00619   ENDDO
00620 #endif
00621   CALL OI_LATLON_CONF_PROJ(ISIZE,PLAT0,PLON0,PRPK,PBETA,PLATOR,PLONOR,ZPX,ZPY,PLAT,PLON)
00622 ELSE
00623   PLAT(:) = P__LAT (1:ISIZE)
00624   PLON(:) = P__LON (1:ISIZE)
00625 ENDIF
00626 
00627 !  Allocate arrays to produce analysis increments  
00628 
00629 ALLOCATE (ZT2INC(ISIZE))
00630 ALLOCATE (ZH2INC(ISIZE))
00631 ALLOCATE (ZWSINC(ISIZE))
00632 ALLOCATE (ZWPINC(ISIZE))
00633 ALLOCATE (ZTLINC(ISIZE))
00634 ALLOCATE (ZTSINC(ISIZE))
00635 ALLOCATE (ZTPINC(ISIZE))
00636 ALLOCATE (ZSNINC(ISIZE))
00637 
00638 ! Screen-level innovations
00639 
00640 ZT2INC(:) = PT2M_O(:) - PTCLS(:)
00641 ZH2INC(:) = PHU2M_O(:) - PHCLS(:)
00642 
00643 ! Threshold for background check
00644 
00645 ZTHRES=RTHR_QC*SQRT(SIGWGO**2 + SIGWGB**2)
00646 
00647 ! Superficial soil moisture innovations in (m3/m3)
00648 
00649 DO J = 1, ISIZE
00650   IF (PWS_O(J) /= 999.0) THEN
00651     ZWGINC(J) = PWS_O(J) - PWS(J,1)
00652     IF (ABS(ZWGINC(J)) > ZTHRES) THEN 
00653       ZWGINC(J) = 0.0 ! background check
00654     ELSE
00655       INOBS = INOBS + 1
00656     ENDIF
00657   ELSE
00658     ZWGINC(J) = 0.0
00659   ENDIF
00660 ENDDO
00661 PRINT *,' NUMBER OF ASCAT OBSERVATIONS AFTER BACKGROUND CHECK  :: ',INOBS
00662 
00663 PRINT *,'           '
00664 PRINT *,'Mean T2m increments  ',SUM(ZT2INC)/SIZE(ZT2INC)
00665 PRINT *,'Mean HU2m increments ',SUM(ZH2INC)/SIZE(ZH2INC)
00666 PRINT *,'           '
00667 
00668 ! Interface (define arrays and perform unit conversions)
00669 
00670 PARG(:) = PARG(:)*100.0
00671 PSAB(:) = PSAB(:)*100.0
00672 
00673 ZWS(:) = XUNDEF
00674 ZWP(:) = XUNDEF
00675 ZTL(:) = XUNDEF
00676 
00677 WHERE (PWS(:,1)/=XUNDEF) 
00678   ZWS(:)      = PWS(:,1)*RD1*XRHOLW     ! conversion of m3/m3 -> mm
00679   ZWP(:)      = PWP(:,1)*PD2(:,1)*XRHOLW  ! conversion of m3/m3 -> mm
00680   ZTL(:)      = PTL(:,1)*PD2(:,1)*XRHOLW  ! conversion of m3/m3 -> mm
00681 END WHERE
00682 
00683 ZTCLS(:)    = PTCLS(:)
00684 ZHCLS(:)    = PHCLS(:)
00685 ZUCLS(:)    = PUCLS(:)
00686 ZVCLS(:)    = PVCLS(:)
00687 PSSTC(:)    = PTS_O(:)
00688 PWPINC1(:)  = XUNDEF
00689 PWPINC2(:)  = XUNDEF
00690 PWPINC3(:)  = XUNDEF
00691 PT2MBIAS(:) = XUNDEF
00692 PH2MBIAS(:) = XUNDEF
00693 
00694 ! Sea-ice surface properties
00695 
00696 PALBF(:)    = XUNDEF
00697 PEMISF(:)   = XUNDEF
00698 PZ0F(:)     = XUNDEF
00699 PZ0H(:)     = XUNDEF
00700 
00701 ! Climatological arrays set to missing values
00702 
00703 PSNC(:)     =  PSNS(:,1) ! need to read the snow climatology 
00704 PWSC(:)     =  XUNDEF
00705 PWPC(:)     =  XUNDEF
00706 PTSC(:)     =  XUNDEF
00707 PTPC(:)     =  XUNDEF
00708 
00709 DO J = 1, ISIZE
00710   PGELAT(J)   = PLAT(J) 
00711   PGELAM(J)   = PLON(J) 
00712   PGEMU(J)    = SIN(PLAT(J)*XPI/180.)
00713 ENDDO
00714 
00715 ZEVAP(:)   =  (PEVAP(:)/XLVTT*XDAY)/(NECHGU*3600.) ! conversion W/m2 -> mm/day
00716 ZEVAPTR(:) =  PEVAPTR(:)*XDAY
00717 ZSNS(:)    =  PSNS(:,1)
00718 
00719 DO J = 1, ISIZE
00720   ZTS(J) = PTS(J,1)
00721   ZTP(J) = PTP(J,1)
00722 ENDDO
00723 
00724 IDAT = IYEAR*10000. + IMONTH*100. + IDAY
00725 
00726 IF (LDINLINE) THEN
00727 ! Avoid division by zero in next WHERE statement; 
00728 ! this may occur in the extension zone
00729   WHERE (LD_MASKEXT (1:ISIZE))
00730     PD2(:,1) = 1.
00731   END WHERE
00732 ENDIF
00733 
00734 !  Soil analysis based on optimal interpolation
00735 
00736  CALL OI_CACSTS(ISIZE,ZT2INC,ZH2INC,ZWGINC,PWS_O,                       &
00737                 IDAT,NSSSSS,                                           &
00738                 ZTP,ZWP,ZTL,ZSNS,ZTS,ZWS,                              &
00739                 ZTCLS,ZHCLS,ZUCLS,ZVCLS,PSSTC,PWPINC1,PWPINC2,PWPINC3, &
00740                 PT2MBIAS,PH2MBIAS,                                     &
00741                 PRRCL,PRRSL,PRRCN,PRRSN,PATMNEB,ZEVAP,ZEVAPTR,         &
00742                 PITM,PVEG(:,1),PALBF,PEMISF,PZ0F,                      &
00743                 PIVEG,PARG,PD2(:,1),PSAB,PLAI(:,1),PRSMIN(:,1),PZ0H,   &
00744                 PTSC,PTPC,PWSC,PWPC,PSNC,                              &
00745                 PGELAT,PGELAM,PGEMU) 
00746 
00747 !  Store increments
00748 
00749 ZWSINC(:) = 0.0
00750 ZWPINC(:) = 0.0
00751 ZTLINC(:) = 0.0
00752 ZSNINC(:) = 0.0
00753 
00754 WHERE (PWS(:,1)/=XUNDEF)
00755   ZWSINC(:) = ZWS(:) - PWS(:,1)*(RD1*XRHOLW)    
00756   ZWPINC(:) = ZWP(:) - PWP(:,1)*(PD2(:,1)*XRHOLW) 
00757   ZTLINC(:) = ZTL(:) - PTL(:,1)*(PD2(:,1)*XRHOLW) 
00758   ZSNINC(:) = ZSNS(:) - PSNS(:,1)
00759 END WHERE
00760 
00761 IF (LDINLINE) THEN
00762 ! Avoid division by zero in next WHERE statement; 
00763 ! this may occur in the extension zone
00764   WHERE (LD_MASKEXT (1:ISIZE))
00765     PD2(:,1) = 1.
00766   END WHERE
00767 ENDIF
00768 
00769 !  Define soil moiture analyses over NATURE points
00770 
00771 WHERE (PWS(:,1)/=XUNDEF)
00772   PWS(:,1)  = ZWS(:)/(RD1*XRHOLW)
00773   PWP(:,1)  = ZWP(:)/(PD2(:,1)*XRHOLW)
00774   PTL(:,1)  = ZTL(:)/(PD2(:,1)*XRHOLW)
00775   PSNS(:,1) = ZSNS(:)
00776 END WHERE
00777 
00778 !  Perform temperature analysis according to surface types
00779 
00780 OINTERP_LST(:) = .FALSE.
00781 OINTERP_SST(:) = .FALSE.
00782 
00783 ZTSINC(:) = 0.0
00784 ZTPINC(:) = 0.0
00785 
00786 ! a) Temperature analysis of NATURE points
00787 
00788 WHERE (PTS(:,1)/=XUNDEF)
00789   ZTSINC(:) = ZTS(:) - PTS(:,1)
00790   ZTPINC(:) = ZTP(:) - PTP(:,1)
00791   PTS(:,1)  = ZTS(:)
00792   PTP(:,1)  = ZTP(:)
00793 END WHERE
00794 
00795 ! b) Temperature analysis of SEA and LAKE points
00796 
00797 DO J = 1, ISIZE
00798   IF (PITM(J) < 0.5) THEN
00799     IF (PSST(J)/=XUNDEF) THEN
00800       ZTSINC(J) = PTS_O(J) - PSST(J)
00801       PSST(J) = PTS_O(J)   ! canari
00802     ENDIF
00803     IF (PLST(J)/=XUNDEF) THEN
00804       PLST(J) = PTS_O(J)   ! canari
00805     ENDIF
00806   ELSE
00807     IF (PSST(J)/=XUNDEF) THEN
00808       PSST(J) = XUNDEF
00809       OINTERP_SST(J) = .TRUE.
00810     ENDIF
00811     IF (PLST(J)/=XUNDEF) THEN
00812       PLST(J) = XUNDEF
00813       OINTERP_LST(J) = .TRUE.
00814     ENDIF
00815   ENDIF
00816 ENDDO
00817 
00818 ! c) Temperature analysis of TOWN points
00819 
00820 WHERE (PTRD3(:)/=XUNDEF)
00821   PTRD3(:) = PTRD3(:) + ZT2INC(:)/(2.0*XPI)
00822 END WHERE
00823 
00824 ! Search for the nearest grid point values for lake and sea points
00825 ! at locations where the water fraction is less than 50 % 
00826 ! and therefore no useful information is given from the SST analysis
00827 ! A standard temperature gradient is applied to account for the atitude differences
00828 
00829 IF (LDINLINE) THEN
00830 
00831   IF (LLKEEPEXTZONE) THEN
00832 
00833     ZLST(:) = PLST(:)
00834      
00835     IF (LDINLINE) THEN
00836       WHERE (LD_MASKEXT (1:ISIZE))
00837         ZLST = XUNDEF
00838       END WHERE
00839     ENDIF
00840      
00841     CALL OI_HOR_EXTRAPOL_SURF(ISIZE,PLAT,PLON,ZLST,PLAT,PLON,PLST,OINTERP_LST,ZALT)
00842      
00843     ZSST(:) = PSST(:)
00844      
00845     IF (LDINLINE) THEN
00846       WHERE (LD_MASKEXT (1:ISIZE))
00847         ZSST = XUNDEF
00848       END WHERE
00849     ENDIF
00850      
00851     CALL OI_HOR_EXTRAPOL_SURF(ISIZE,PLAT,PLON,ZSST,PLAT,PLON,PSST,OINTERP_SST,ZALT)
00852 
00853   ELSE
00854 
00855     ISIZE1 = COUNT (.NOT. LD_MASKEXT)
00856    
00857     ALLOCATE (PSST1 (ISIZE1), PLST1 (ISIZE1), ZSST1 (ISIZE1), ZLST1 (ISIZE1), PLAT1 (ISIZE1), &
00858             & PLON1 (ISIZE1), ZALT1 (ISIZE1), OINTERP_LST1 (ISIZE1), OINTERP_SST1 (ISIZE1))
00859    
00860     ! remove extension zone
00861     J = 1
00862     DO J1 = 1, ISIZE
00863       IF (.NOT. LD_MASKEXT (J1)) THEN
00864         PSST1 (J) = PSST (J1)
00865         PLST1 (J) = PLST (J1)
00866         PLAT1 (J) = PLAT (J1)
00867         PLON1 (J) = PLON (J1)
00868         ZALT1 (J) = ZALT (J1)
00869         OINTERP_LST1 (J) = OINTERP_LST (J1)
00870         OINTERP_SST1 (J) = OINTERP_SST (J1)
00871         J = J + 1
00872       ENDIF
00873     ENDDO
00874    
00875     ZLST1(:) = PLST1(:)
00876     CALL OI_HOR_EXTRAPOL_SURF(ISIZE1,PLAT1,PLON1,ZLST1,PLAT1,PLON1,PLST1,OINTERP_LST1,ZALT1)
00877      
00878     ZSST1(:) = PSST1(:)
00879     CALL OI_HOR_EXTRAPOL_SURF(ISIZE1,PLAT1,PLON1,ZSST1,PLAT1,PLON1,PSST1,OINTERP_SST1,ZALT1)
00880    
00881     ! copy back
00882     J = 1
00883     DO J1 = 1, ISIZE
00884       IF (.NOT. LD_MASKEXT (J1)) THEN
00885         PSST (J1) = PSST1 (J)
00886         PLST (J1) = PLST1 (J) 
00887         J = J + 1
00888       ENDIF
00889     ENDDO
00890    
00891     DEALLOCATE (PSST1, PLST1, ZSST1, ZLST1, PLAT1, PLON1, &
00892               & ZALT1, OINTERP_LST1, OINTERP_SST1)
00893 
00894   ENDIF
00895 
00896 ELSE
00897  
00898   ZLST(:) = PLST(:)
00899   CALL OI_HOR_EXTRAPOL_SURF(ISIZE,PLAT,PLON,ZLST,PLAT,PLON,PLST,OINTERP_LST,ZALT)
00900 
00901   ZSST(:) = PSST(:)
00902   CALL OI_HOR_EXTRAPOL_SURF(ISIZE,PLAT,PLON,ZSST,PLAT,PLON,PSST,OINTERP_SST,ZALT)
00903 
00904 ENDIF
00905 
00906 ! PRINT values produced by OI_HO_EXTRAPOL_SURF
00907 
00908 IF (LPRINT) THEN
00909   DO J = 1, ISIZE
00910     IF (OINTERP_LST(J)) THEN
00911       PRINT *,'Lake surface temperature set to ',PLST(J),'from nearest neighbour at J=',J
00912     ENDIF
00913     IF (OINTERP_SST(J)) THEN
00914       PRINT *,'Sea surface temperature set to ',PSST(J),'from nearest neighbour at J=',J
00915     ENDIF
00916   ENDDO
00917 ENDIF
00918 
00919 ! PRINT statistics of the soil analysis
00920 
00921 PRINT *,'---------------------------------------------------------------'
00922 PRINT *,'Mean WS increments over NATURE ',SUM(ZWSINC,XNATURE > 0.)/NDIM_NATURE
00923 PRINT *,'Mean WP increments over NATURE ',SUM(ZWPINC,XNATURE > 0.)/NDIM_NATURE
00924 PRINT *,'Mean TS increments over NATURE ',SUM(ZTSINC,XNATURE > 0.)/NDIM_NATURE
00925 PRINT *,'Mean TP increments over NATURE ',SUM(ZTPINC,XNATURE > 0.)/NDIM_NATURE
00926 PRINT *,'Mean TL increments over NATURE ',SUM(ZTLINC,XNATURE > 0.)/NDIM_NATURE
00927 PRINT *,'Mean SN increments over NATURE ',SUM(ZSNINC,XNATURE > 0.)/NDIM_NATURE
00928 PRINT *,'---------------------------------------------------------------'
00929 PRINT *,'Mean WS increments over SEA    ',SUM(ZWSINC,XSEA > 0.)/NDIM_SEA
00930 PRINT *,'Mean WP increments over SEA    ',SUM(ZWPINC,XSEA > 0.)/NDIM_SEA
00931 PRINT *,'Mean TS increments over SEA    ',SUM(ZTSINC,XSEA > 0.)/NDIM_SEA
00932 PRINT *,'Mean TP increments over SEA    ',SUM(ZTPINC,XSEA > 0.)/NDIM_SEA
00933 PRINT *,'Mean TL increments over SEA    ',SUM(ZTLINC,XSEA > 0.)/NDIM_SEA
00934 PRINT *,'Mean SN increments over SEA    ',SUM(ZSNINC,XSEA > 0.)/NDIM_SEA
00935 PRINT *,'---------------------------------------------------------------'
00936 
00937 IF (.NOT. LDINLINE) THEN 
00938 !   Write analysis in LFI file PREP
00939 #ifdef LFI
00940   CFILEOUT_LFI='PREP'
00941 #endif
00942 ENDIF
00943 
00944  CALL FLAG_UPDATE(.FALSE.,.FALSE.,.TRUE.,.FALSE.)
00945  CALL INIT_IO_SURF_n(YPROGRAM,'FULL  ','SURF  ','WRITE')
00946 
00947 IF (LDINLINE) THEN
00948 #ifdef ARO
00949 ! Count 2D fields in MSE
00950   NCOUNTW_TOT = 0
00951   LWRITE      = .FALSE.
00952   LCOUNTW     = .TRUE.
00953   NCOUNTW     = 0
00954 ! NINDX1, NINDX2, NKPROMA already set 
00955   IF (.NOT. LFMWRIT) &
00956  & CALL SURFEX_FIELD_BUF_SET_RECORD (YSURFEX_CACHE_OUT, .FALSE.)
00957 
00958   CALL WRITE
00959    
00960   IF (LFMWRIT) THEN
00961     ALLOCATE (XGPGW (IGPCOMP, NCOUNTW_TOT))
00962     XGPGW = XUNDEF
00963   ELSE
00964     CALL SURFEX_FIELD_BUF_PREALLOC (YSURFEX_CACHE_OUT)
00965     CALL SURFEX_FIELD_BUF_SET_RECORD (YSURFEX_CACHE_OUT, .TRUE.)
00966   ENDIF
00967 
00968   LWRITE      = .TRUE.
00969   LCOUNTW     = .FALSE.
00970   NCOUNTW     = 0
00971 #endif
00972 
00973 ENDIF
00974 
00975  CALL WRITE
00976 
00977 IF (LDINLINE) THEN
00978 #ifdef ARO
00979   IF (LFMWRIT) DEALLOCATE (XGPGW)
00980 #endif
00981 ENDIF
00982 
00983  CALL END_IO_SURF_n(YPROGRAM)
00984  CALL IO_BUFF_CLEAN_n
00985 
00986 DEALLOCATE(NWORK)
00987 DEALLOCATE(XWORK)
00988 DEALLOCATE(XWORK2)
00989 
00990 IF (.NOT. LDINLINE) THEN
00991   PRINT *,'after write in PREP file'
00992 ENDIF
00993 
00994 ! -------------------------------------------------------------------------------------
00995 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL', 1, ZHOOK_HANDLE)
00996 
00997 CONTAINS
00998 
00999 SUBROUTINE WRITE 
01000 
01001 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01002 
01003 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL:WRITE', 0, ZHOOK_HANDLE)
01004 
01005  CALL DD ('WG1', PWS (:,1))
01006 
01007 YVAR='WG1'
01008 YPREFIX='X_Y_WG1 (m3/m3)                                   '
01009  CALL WRITE_SURF(YPROGRAM,YVAR,PWS,IRESP,HCOMMENT=YPREFIX)
01010 
01011  CALL DD ('WG2', PWP (:,1))
01012 
01013 YVAR='WG2'
01014 YPREFIX='X_Y_WG2 (m3/m3)                                   '
01015  CALL WRITE_SURF(YPROGRAM,YVAR,PWP,IRESP,HCOMMENT=YPREFIX)
01016 
01017  CALL DD ('WGI2', PTL (:,1))
01018 
01019 YVAR='WGI2'
01020 YPREFIX='X_Y_WGI2 (m3/m3)                                  '
01021  CALL WRITE_SURF(YPROGRAM,YVAR,PTL,IRESP,HCOMMENT=YPREFIX)
01022 
01023  CALL DD ('TG1', PTS (:,1))
01024 
01025 YVAR='TG1'
01026 YPREFIX='X_Y_TG1 (K)                                       '
01027  CALL WRITE_SURF(YPROGRAM,YVAR,PTS,IRESP,HCOMMENT=YPREFIX)
01028 
01029  CALL DD ('TG2', PTP (:,1))
01030 
01031 YVAR='TG2'
01032 YPREFIX='X_Y_TG2 (K)                                       '
01033  CALL WRITE_SURF(YPROGRAM,YVAR,PTP,IRESP,HCOMMENT=YPREFIX)
01034 
01035  CALL DD ('SST', PSST)
01036 
01037 YVAR='SST'
01038 YPREFIX='X_Y_SST (K)                                       '
01039  CALL WRITE_SURF(YPROGRAM,YVAR,PSST,IRESP,HCOMMENT=YPREFIX)
01040 
01041  CALL DD ('TS_WATER', PLST)
01042 
01043 YVAR='TS_WATER'
01044 YPREFIX='X_Y_TS_WATER (K)                                  '
01045  CALL WRITE_SURF(YPROGRAM,YVAR,PLST,IRESP,HCOMMENT=YPREFIX)
01046 
01047 IF (NSIZE_TOWN > 0 .AND. LAROME) THEN
01048   CALL DD ('T_ROAD3', PTRD3)
01049 
01050   YVAR='TROAD3'
01051   YPREFIX='X_Y_T_ROAD3 (K)                                   '
01052   CALL WRITE_SURF(YPROGRAM,YVAR,PTRD3,IRESP,HCOMMENT=YPREFIX)
01053 ENDIF
01054 
01055  CALL DD ('WSNOW_VEG1', PSNS (:,1))
01056 
01057 YVAR='WSN_VEG1'
01058 YPREFIX='X_Y_WSNOW_VEG1 (kg/m2)                            '
01059  CALL WRITE_SURF(YPROGRAM,YVAR,PSNS,IRESP,HCOMMENT=YPREFIX)
01060 
01061 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL:WRITE', 1, ZHOOK_HANDLE)
01062 
01063 END SUBROUTINE WRITE
01064 
01065 SUBROUTINE DD (CDN, PX)
01066  CHARACTER(LEN=*), INTENT (IN) :: CDN
01067 REAL, INTENT (IN) :: PX (:)
01068 
01069 REAL :: ZX (SIZE (PX))
01070 INTEGER :: I, N
01071 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01072 
01073 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL:DD', 0, ZHOOK_HANDLE)
01074 
01075 IF (LDINLINE) THEN
01076 #ifdef ARO
01077   IF (.NOT.LWRITE.AND.LHOOK) CALL DR_HOOK ('OI_CONTROL:DD', 1, ZHOOK_HANDLE)
01078   IF (.NOT.LWRITE) RETURN
01079 #endif
01080   N = COUNT (.NOT. LD_MASKEXT)
01081   ZX (1:N) = PACK (PX, .NOT. LD_MASKEXT)
01082 ELSE
01083   ZX = PX
01084   N = SIZE (PX)
01085 ENDIF
01086 
01087 WRITE (0, *) TRIM(CDN)//" = " 
01088 WRITE (0, *) N, MINVAL(ZX(1:N)), MAXVAL(ZX(1:N))
01089 !WRITE (0, '(10(E14.6,", "))') ZX (1:N)
01090 
01091 IF (LHOOK) CALL DR_HOOK ('OI_CONTROL:DD', 1, ZHOOK_HANDLE)
01092 
01093 END SUBROUTINE DD
01094 
01095 END SUBROUTINE OI_CONTROL