SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/offline.F90
Go to the documentation of this file.
00001 ! -------------------------------------------------
00002 PROGRAM OFFLINE
00003 !
00004 ! -------------------------------------------------
00005 ! Driver structure
00006 ! ----------------
00007 ! 1. Initializations
00008 ! 2. Temporal loops
00009 !   2.a Read forcing
00010 !   2.b Interpolate forcing in time
00011 !   2.c Run surface
00012 !   2.d Write prognostics and diagnostics variables
00013 !
00014 ! modifications 
00015 ! 09/2012 G. Pigeon: coherence between radiation and zenith angle because of
00016 !                    trouble with radiation received by wall in TEB
00017 ! -------------------------------------------------
00018 USE MODD_FORC_ATM,  ONLY: CSV         ,&! name of all scalar variables
00019                             XDIR_ALB    ,&! direct albedo for each band
00020                             XSCA_ALB    ,&! diffuse albedo for each band
00021                             XEMIS       ,&! emissivity
00022                             XTSRAD      ,&! radiative temperature
00023                             XTSUN       ,&! solar time                    (s from midnight)
00024                             XZS         ,&! orography                             (m)
00025                             XZREF       ,&! height of T,q forcing                 (m)
00026                             XUREF       ,&! height of wind forcing                (m)
00027                             XTA         ,&! air temperature forcing               (K)
00028                             XQA         ,&! air humidity forcing                  (kg/m3)
00029                             XSV         ,&! scalar variables
00030                             XU          ,&! zonal wind                            (m/s)
00031                             XV          ,&! meridian wind                         (m/s)
00032                             XDIR_SW     ,&! direct  solar radiation (on horizontal surf.)
00033                             XSCA_SW     ,&! diffuse solar radiation (on horizontal surf.)
00034                             XSW_BANDS   ,&! mean wavelength of each shortwave band (m)
00035                             XZENITH     ,&! zenithal angle       (radian from the vertical)
00036                             XZENITH2    ,&! zenithal angle       (radian from the vertical)
00037                             XAZIM       ,&! azimuthal angle      (radian from North, clockwise)
00038                             XLW         ,&! longwave radiation (on horizontal surf.)
00039                             XPS         ,&! pressure at atmospheric model surface (Pa)
00040                             XPA         ,&! pressure at forcing level             (Pa)
00041                             XRHOA       ,&! density at forcing level              (kg/m3)
00042                             XCO2        ,&! CO2 concentration in the air          (kg/m3)
00043                             XSNOW       ,&! snow precipitation                    (kg/m2/s)
00044                             XRAIN       ,&! liquid precipitation                  (kg/m2/s)
00045                             XSFTH       ,&! flux of heat                          (W/m2)
00046                             XSFTQ       ,&! flux of water vapor                   (kg/m2/s)
00047                             XSFU        ,&! zonal momentum flux                   (m/s)
00048                             XSFV        ,&! meridian momentum flux                (m/s)
00049                             XSFCO2      ,&! flux of CO2                           (kg/m2/s)
00050                             XSFTS       ,&! flux of scalar var.                   (kg/m2/s)
00051                             XPEW_A_COEF ,&! implicit coefficients
00052                             XPEW_B_COEF ,&! needed if HCOUPLING='I'
00053                             XPET_A_COEF ,&
00054                             XPEQ_A_COEF ,&
00055                             XPET_B_COEF ,&
00056                             XPEQ_B_COEF  
00057 !
00058 USE MODD_SURF_CONF,  ONLY : CPROGNAME, CSOFTWARE
00059 USE MODD_CSTS,       ONLY : XPI, XDAY, XRV, XRD, XG
00060 USE MODD_IO_SURF_ASC,ONLY : CFILEIN,CFILEIN_SAVE,CFILEOUT,CFILEPGD
00061 USE MODD_SURF_PAR
00062 USE MODD_IO_SURF_FA, ONLY : CFILEIN_FA, CFILEIN_FA_SAVE,       &
00063                             CFILEOUT_FA, NUNIT_FA, CDNOMC,     &
00064                             IVERBFA, LFANOCOMPACT, CFILEPGD_FA  
00065 USE MODD_IO_SURF_LFI,ONLY : CFILEIN_LFI, CFILEIN_LFI_SAVE, CLUOUT_LFI, CFILEOUT_LFI, &
00066                             LMNH_COMPATIBLE, CFILEPGD_LFI  
00067 USE MODD_IO_SURF_OL, ONLY : XSTART, XCOUNT, XSTRIDE,           &
00068                               LDEFINED_NATURE, LDEFINED_SEA,    &
00069                               LDEFINED_WATER,  LDEFINED_TOWN,   &
00070                               LDEFINED_SURF_ATM, LPARTW,        &
00071                               XSTARTW, XCOUNTW, LTIME_WRITTEN,  &
00072                               NSTEP_OUTPUT  
00073 USE MODD_WRITE_BIN,  ONLY : NWRITE
00074 USE MODD_SURF_ATM,   ONLY : LCPL_ESM
00075 !
00076 USE MODD_SURFEX_MPI, ONLY : NCOMM, NPROC, NRANK, NPIO, WLOG_MPI, PREP_LOG_MPI,   &
00077                             NINDEX, NSIZE_TASK, XTIME_NPIO_READ, XTIME_NPIO_WRITE, &
00078                             XTIME_COMM_READ, XTIME_COMM_WRITE, XTIME_SEA, &
00079                             XTIME_NATURE, XTIME_WATER, XTIME_TOWN, &
00080                             XTIME_INIT_SEA, XTIME_INIT_WATER, &
00081                             XTIME_INIT_NATURE, XTIME_INIT_TOWN, &
00082                             XTIME_WRITE, XTIME_CALC, XTIME_OMP_BARR, &
00083                             XTIME_CALC_WRITE, IDX_W
00084 !
00085 USE MODD_SURFEX_OMP, ONLY :  NINDX1, NINDX2, NBLOCK, NBLOCKTOT, &
00086                              INIT_DIM, RESET_DIM, NWORK, XWORK, XWORK2
00087 !
00088 USE MODD_COUPLING_TOPD, ONLY : NNB_TOPD, NNB_STP_RESTART, LBUDGET_TOPD, LTOPD_STEP, &
00089                                LCOUPL_TOPD, NTOPD_STEP, NYEAR, NMONTH, NDAY, NH, NM
00090 USE MODD_TOPODYN, ONLY : XTOPD_STEP, NNB_TOPD_STEP, XQTOT, XQB_RUN, XQB_DR
00091 !
00092 USE MODE_POS_SURF
00093 !
00094 USE MODE_CRODEBUG
00095 !
00096 USE MODN_IO_OFFLINE
00097 !
00098 USE MODI_ALLOC_SURFEX
00099 USE MODI_GET_LUOUT
00100 USE MODI_OPEN_NAMELIST
00101 USE MODI_TEST_NAM_VAR_SURF
00102 USE MODI_CLOSE_NAMELIST
00103 USE MODI_READ_ALL_NAMELISTS
00104 USE MODI_GOTO_SURFEX
00105 USE MODI_GOTO_TRIP
00106 USE MODI_OPEN_CLOSE_BIN_ASC_FORC
00107 USE MODI_OPEN_FILEIN_OL
00108 USE MODI_OL_READ_ATM_CONF
00109 USE MODI_ABOR1_SFX
00110 USE MODI_OL_ALLOC_ATM
00111 USE MODI_COMPARE_OROGRAPHY
00112 USE MODI_SUNPOS
00113 USE MODI_INIT_INDEX_MPI
00114 USE MODI_OL_READ_ATM
00115 USE MODI_GET_SIZES_PARALLEL
00116 USE MODI_IO_BUFF_CLEAN_n
00117 USE MODI_INIT_SURF_ATM_n
00118 USE MODI_INIT_SURF_LANDUSE_n
00119 USE MODI_INIT_SURF_TRIP_n
00120 USE MODI_OL_TIME_INTERP_ATM
00121 USE MODI_COUPLING_SURF_ATM_n
00122 USE MODI_COUPLING_SURF_TRIP_n
00123 USE MODI_ADD_FORECAST_TO_DATE_SURF
00124 USE MODI_WRITE_SURF_ATM_n
00125 USE MODI_WRITE_HEADER_MNH
00126 USE MODI_FLAG_UPDATE
00127 USE MODI_FLAG_DIAG_UPDATE
00128 USE MODI_DIAG_SURF_ATM_n
00129 USE MODI_WRITE_DIAG_SURF_ATM_n
00130 USE MODI_GET_SURF_VAR_n
00131 USE MODI_GATHER_AND_WRITE_MPI
00132 USE MODI_CLOSE_FILEIN_OL
00133 USE MODI_CLOSE_FILEOUT_OL
00134 USE MODI_DEALLOC_SURFEX
00135 !
00136 USE MODI_WRITE_DISCHARGE_FILE
00137 USE MODI_WRITE_BUDGET_COUPL_ROUT
00138 USE MODI_PREP_RESTART_COUPL_TOPD
00139 !
00140 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00141 USE PARKIND1  ,ONLY : JPRB
00142 !
00143 #ifdef AIX64
00144 USE OMP_LIB
00145 #endif
00146 !
00147 IMPLICIT NONE
00148 !
00149 #ifndef NOMPI
00150 INCLUDE 'mpif.h'
00151 #endif
00152 !
00153 #ifndef AIX64
00154 INCLUDE 'omp_lib.h'
00155 #endif
00156 !
00157 !*      0.    declarations of local variables
00158 !
00159  CHARACTER(LEN=3), PARAMETER       :: YINIT     = 'ALL'
00160 !
00161  CHARACTER(LEN=28)                 :: YLUOUT    = 'LISTING_OFFLINE             '
00162 !
00163 INTEGER                           :: IYEAR               ! current year (UTC)
00164 INTEGER                           :: IMONTH              ! current month (UTC)
00165 INTEGER                           :: IDAY                ! current day (UTC)
00166 REAL                              :: ZTIME               ! current time since start of the run (s)
00167 REAL                              :: ZTIMEC              ! current duration since start of the run (s)
00168 !
00169 INTEGER                           :: IYEAR_OUT           ! output year name
00170 INTEGER                           :: IMONTH_OUT          ! output month name
00171 INTEGER                           :: IDAY_OUT            ! output day name
00172 REAL                              :: ZTIME_OUT           ! output time since start of the run (s)
00173 !
00174 INTEGER, DIMENSION(11)  :: IDATEF
00175 !
00176  CHARACTER(LEN=28), PARAMETER      :: YATMFILE     = '                            '
00177  CHARACTER(LEN=6),  PARAMETER      :: YATMFILETYPE = '      '
00178  CHARACTER(LEN=2),  PARAMETER      :: YTEST        = 'OK'          ! must be equal to 'OK'
00179 !
00180 REAL, DIMENSION(:), POINTER       :: ZLAT                ! latitude                         (rad)
00181 REAL, DIMENSION(:), POINTER       :: ZLON                ! longitude                        (rad)
00182 REAL, DIMENSION(:), POINTER       :: ZZS_FORC            ! orography                        (m)  
00183 REAL, DIMENSION(:), POINTER       :: ZZREF               ! Forcing level for T
00184 REAL, DIMENSION(:), POINTER       :: ZUREF               ! Forcing level for U
00185 !
00186 REAL                              :: ZTSTEP              ! atmospheric time-step            (s)
00187 !
00188 INTEGER                           :: INI                 ! grid dimension
00189 INTEGER                           :: JLOOP               ! loop counter
00190 INTEGER                           :: ISCAL               ! Number of scalar species
00191 INTEGER                           :: IBANDS              ! Number of radiative bands 
00192 INTEGER                           :: INB_STEP_ATM        ! Number of atmospheric time-steps
00193 INTEGER                           :: INB_ATM             ! Number of Isba time-steps 
00194                                                          ! within a forcing time-step
00195 INTEGER                           :: ID_FORC             ! indice of forcing in the file
00196 INTEGER                           :: INB_LINES           ! nb of lines to read in the forcing file
00197 INTEGER                           :: IDMAX               ! nb of lines to read in the forcing file at last 
00198 INTEGER                           :: JFORC_STEP          ! atmospheric loop index
00199 INTEGER                           :: JSURF_STEP          ! isba loop index
00200 INTEGER                           :: ICOUNT              ! day counter 
00201 INTEGER                           :: ITRIP_COUNT         ! day counter
00202 INTEGER                           :: ITRIP_MONTH
00203 REAL                              :: ZDURATION           ! duration of run                     (s)
00204 !
00205 REAL, DIMENSION(:,:), ALLOCATABLE :: ZTA                 ! air temperature forcing               (K)
00206 REAL, DIMENSION(:,:), ALLOCATABLE :: ZQA                 ! air humidity forcing                  (kg/m3)
00207 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWIND               ! wind speed                            (m/s)
00208 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSCA_SW             ! diffuse solar radiation (on horizontal surf.)
00209 REAL, DIMENSION(:,:), ALLOCATABLE :: ZDIR_SW             ! direct  solar radiation (on horizontal surf.)
00210 REAL, DIMENSION(:,:), ALLOCATABLE :: ZLW                 ! longwave radiation (on horizontal surf.)
00211 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSNOW               ! snow precipitation                    (kg/m2/s)
00212 REAL, DIMENSION(:,:), ALLOCATABLE :: ZRAIN               ! liquid precipitation                  (kg/m2/s)
00213 REAL, DIMENSION(:,:), ALLOCATABLE :: ZPS                 ! pressure at forcing level             (Pa)
00214 REAL, DIMENSION(:,:), ALLOCATABLE :: ZCO2                ! CO2 concentration in the air          (kg/m3)
00215 REAL, DIMENSION(:,:), ALLOCATABLE :: ZDIR                ! wind direction
00216 INTEGER                           :: ILUOUT              ! ascii output unit number
00217 INTEGER                           :: ILUNAM              ! namelist unit number
00218 INTEGER                           :: IRET                ! error return code
00219 INTEGER                           :: INB 
00220  CHARACTER(LEN=14)                 :: YTAG                
00221 LOGICAL                           :: GFOUND              ! return logical when reading namelist
00222 REAL, DIMENSION(:),   ALLOCATABLE :: ZSW                 ! total solar radiation (on horizontal surf.)
00223 REAL, DIMENSION(:),   ALLOCATABLE :: ZCOEF               ! coefficient for solar radiation interpolation near sunset/sunrise
00224 !
00225 ! Inquiry mode arrays:
00226 !
00227 REAL, DIMENSION(:), ALLOCATABLE   :: ZSEA, ZWATER, ZNATURE, ZTOWN
00228 REAL, DIMENSION(:), ALLOCATABLE   :: ZSEA_FULL, ZWATER_FULL, ZNATURE_FULL, ZTOWN_FULL
00229 REAL, DIMENSION(:), ALLOCATABLE   :: ZT2M, ZQ2M
00230 REAL, DIMENSION(:), ALLOCATABLE   :: ZZ0, ZZ0H, ZQS
00231 REAL, DIMENSION(:), ALLOCATABLE   :: ZQS_SEA, ZQS_WATER, ZQS_NATURE, ZQS_TOWN
00232 REAL, DIMENSION(:), ALLOCATABLE   :: ZPSNG, ZPSNV
00233 REAL, DIMENSION(:), ALLOCATABLE   :: ZZ0EFF
00234 REAL, DIMENSION(:), ALLOCATABLE   :: ZZS
00235 REAL, DIMENSION(:), ALLOCATABLE   :: ZZ0_FULL, ZZ0EFF_FULL, ZZS_FULL
00236 INTEGER :: ISERIES, ISIZE
00237 !
00238 ! MPI variables
00239 !
00240  CHARACTER(LEN=100) :: YNAME
00241 INTEGER :: ILEVEL, INFOMPI, J, INKPROMA, JBLOCK
00242 INTEGER, DIMENSION(:), ALLOCATABLE :: ISIZE_OMP
00243 DOUBLE PRECISION :: XTIME0, XTIME1, XTIME
00244 !
00245 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00246 !
00247 ! --------------------------------------------------------------------------------------
00248 !
00249 !*     0.1.   MPI and dr_hook initializations
00250 !
00251 #ifndef NOMPI
00252  CALL MPI_INIT_THREAD(MPI_THREAD_MULTIPLE,ILEVEL,INFOMPI)
00253 #endif
00254 !
00255 IF (LHOOK) CALL DR_HOOK('OFFLINE',0,ZHOOK_HANDLE)
00256 !
00257 CSOFTWARE='OFFLINE'
00258 !
00259 #ifndef NOMPI
00260 NCOMM = MPI_COMM_WORLD
00261  CALL MPI_COMM_SIZE(NCOMM,NPROC,INFOMPI)
00262  CALL MPI_COMM_RANK(NCOMM,NRANK,INFOMPI)
00263 #endif
00264 !
00265 !
00266 !$OMP PARALLEL
00267 !$ NBLOCKTOT = OMP_GET_NUM_THREADS()
00268 !$OMP END PARALLEL
00269 !
00270  CALL PREP_LOG_MPI
00271 !
00272  CALL WLOG_MPI(' ')
00273 !
00274  CALL WLOG_MPI('NBLOCKTOT ',KLOG=NBLOCKTOT)
00275 !
00276 #ifndef NOMPI
00277 XTIME0 = MPI_WTIME()
00278 #endif
00279 !
00280 !
00281 !*      0.3.   Open ascii file for writing
00282 !
00283 IF (NRANK>=10) THEN
00284   WRITE(YNAME,FMT='(A15,I2)') TRIM(YLUOUT),NRANK
00285 ELSE
00286   WRITE(YNAME,FMT='(A15,I1)') TRIM(YLUOUT),NRANK
00287 ENDIF
00288 !
00289 CLUOUT_LFI =  ADJUSTL(ADJUSTR(YNAME)//'.txt')
00290 !
00291  CALL GET_LUOUT('ASCII ',ILUOUT)
00292 OPEN(UNIT=ILUOUT,FILE=ADJUSTL(ADJUSTR(YNAME)//'.txt'),FORM='FORMATTED',ACTION='WRITE')
00293 !
00294 !
00295 !*      0.4.   Reads namelists
00296 !
00297  CALL OPEN_NAMELIST('ASCII ',ILUNAM,CNAMELIST)
00298 !
00299  CALL POSNAM(ILUNAM,'NAM_IO_OFFLINE',GFOUND,ILUOUT)
00300 IF (GFOUND) READ (UNIT=ILUNAM,NML=NAM_IO_OFFLINE)
00301  CALL CLOSE_NAMELIST('ASCII ',ILUNAM)
00302 !
00303 IF (NPROC==1) THEN 
00304   XIO_FRAC=1.
00305 ELSE
00306   XIO_FRAC = MAX(MIN(XIO_FRAC,1.),0.)
00307 ENDIF
00308 !
00309  CALL TEST_NAM_VAR_SURF(ILUOUT,'CSURF_FILETYPE',CSURF_FILETYPE,'ASCII ','LFI   ','FA    ')
00310  CALL TEST_NAM_VAR_SURF(ILUOUT,'CTIMESERIES_FILETYPE',CTIMESERIES_FILETYPE,'NETCDF','TEXTE ','BINARY',&
00311                                                                             'ASCII ','LFI   ','FA    ',&
00312                                                                             'NONE  ','OFFLIN')  
00313  CALL TEST_NAM_VAR_SURF(ILUOUT,'CFORCING_FILETYPE',CFORCING_FILETYPE,'NETCDF','ASCII ','BINARY')
00314 !
00315 !
00316 IF (CTIMESERIES_FILETYPE=='NETCDF') CTIMESERIES_FILETYPE='OFFLIN'
00317 !
00318 IF (NRANK==NPIO) THEN
00319   !
00320   CFILEPGD     = ADJUSTL(ADJUSTR(CPGDFILE)//'.txt')
00321   CFILEPGD_LFI = CPGDFILE
00322   CFILEPGD_FA  = ADJUSTL(ADJUSTR(CPGDFILE)//'.fa')
00323   !
00324   CFILEIN     = ADJUSTL(ADJUSTR(CPREPFILE)//'.txt')
00325   CFILEIN_LFI = CPREPFILE
00326   CFILEIN_FA  = ADJUSTL(ADJUSTR(CPREPFILE)//'.fa')
00327   !
00328   CFILEIN_SAVE     = CFILEIN
00329   CFILEIN_LFI_SAVE = CFILEIN_LFI
00330   CFILEIN_FA_SAVE  = CFILEIN_FA
00331   !
00332 ENDIF
00333 !
00334  CALL READ_ALL_NAMELISTS(CSURF_FILETYPE,'ALL',.FALSE.)
00335 !
00336 !*      0.6   Assume FA filetype consistency 
00337 !
00338 CPROGNAME = CSURF_FILETYPE
00339 !
00340 ! --------------------------------------------------------------------------------------
00341 !
00342 !*      1.    Initializations
00343 !
00344 LCPL_ESM = .FALSE.
00345 !
00346 !       netcdf file handling
00347 !
00348 IF (NRANK==NPIO) THEN
00349   !
00350   XSTART            = NUNDEF
00351   XSTRIDE           = NUNDEF
00352   XCOUNT            = NUNDEF
00353   XSTARTW           = 0
00354   XCOUNTW           = 1
00355   LPARTW            = .TRUE.
00356   LDEFINED_SURF_ATM = .FALSE.
00357   LDEFINED_NATURE   = .FALSE.
00358   LDEFINED_TOWN     = .FALSE.
00359   LDEFINED_WATER    = .FALSE.
00360   LDEFINED_SEA      = .FALSE.
00361   !
00362 ENDIF
00363 !
00364 #ifndef NOMPI
00365 XTIME = (MPI_WTIME() - XTIME0)
00366 #endif
00367  CALL WLOG_MPI('READ NAMELISTS ',PLOG=XTIME)
00368 #ifndef NOMPI
00369 XTIME0 = MPI_WTIME()
00370 #endif
00371 !
00372 !       forcing file handling
00373 !
00374 IF (CFORCING_FILETYPE=='ASCII ' .OR. CFORCING_FILETYPE=='BINARY') CALL OPEN_CLOSE_BIN_ASC_FORC('CONF ',CFORCING_FILETYPE,'R')
00375 IF (CFORCING_FILETYPE=='NETCDF') CALL OPEN_FILEIN_OL
00376 !
00377 !*     0.2.    Allocations of Surfex Types
00378 !
00379  CALL ALLOC_SURFEX(1)
00380  CALL GOTO_SURFEX(1,.TRUE.)
00381 !
00382 !       splitting of the grid
00383 !
00384  CALL INIT_INDEX_MPI(CSURF_FILETYPE, YALG_MPI, XIO_FRAC)
00385 !
00386  CALL WLOG_MPI(' ')
00387  CALL WLOG_MPI('TIME_NPIO_READ init_index ',PLOG=XTIME_NPIO_READ)
00388  CALL WLOG_MPI('TIME_COMM_READ init_index ',PLOG=XTIME_COMM_READ)
00389 XTIME_NPIO_READ = 0.
00390 XTIME_COMM_READ = 0.
00391 !
00392 #ifndef NOMPI
00393 XTIME = (MPI_WTIME() - XTIME0)
00394 #endif
00395  CALL WLOG_MPI(' ')
00396  CALL WLOG_MPI('INIT_INDEX_MPI ',PLOG=XTIME)
00397  CALL WLOG_MPI(' ')
00398 #ifndef NOMPI
00399 XTIME0 = MPI_WTIME()
00400 #endif
00401 !
00402 !       configuration of run
00403 !
00404  CALL OL_READ_ATM_CONF(CSURF_FILETYPE, CFORCING_FILETYPE,            &
00405                       ZDURATION, ZTSTEP, INI, IYEAR, IMONTH, IDAY,  &
00406                       ZTIME, ZLAT, ZLON, ZZS_FORC, ZZREF, ZUREF     )
00407 !
00408  CALL WLOG_MPI(' ')
00409  CALL WLOG_MPI('TIME_NPIO_READ forc conf ',PLOG=XTIME_NPIO_READ)
00410  CALL WLOG_MPI('TIME_COMM_READ forc conf ',PLOG=XTIME_COMM_READ)
00411 XTIME_NPIO_READ = 0.
00412 XTIME_COMM_READ = 0.
00413 !
00414 #ifndef NOMPI
00415 XTIME = (MPI_WTIME() - XTIME0)
00416 #endif
00417  CALL WLOG_MPI('OL_READ_ATM_CONF ',PLOG=XTIME)
00418  CALL WLOG_MPI(' ')
00419 #ifndef NOMPI
00420 XTIME0 = MPI_WTIME()
00421 #endif
00422 !
00423 !*     time steps coherence check 
00424 !
00425 IF ( (MOD(XTSTEP_OUTPUT,ZTSTEP)*MOD(ZTSTEP,XTSTEP_OUTPUT) /= 0) .OR. (MOD(ZTSTEP,XTSTEP_SURF) /= 0) ) THEN
00426    WRITE(ILUOUT,*)' FORCING  AND OUTPUT/SURFACE TIME STEP SHOULD BE MULTIPLE', &
00427      NINT(ZTSTEP),NINT(XTSTEP_OUTPUT),NINT(XTSTEP_SURF)    
00428    CALL ABOR1_SFX('OFFLINE: FORCING  AND OUTPUT/SURFACE TIME STEP SHOULD BE MULTIPLE')
00429 ENDIF
00430 !
00431 IF ( ZTIME /= 0. .AND. MOD(ZTIME,XTSTEP_SURF) /= 0  ) THEN
00432    WRITE(ILUOUT,*)' INITIAL AND SURFACE TIME STEP SHOULD BE MULTIPLE', &
00433    NINT(ZTIME),NINT(XTSTEP_SURF)  
00434    CALL ABOR1_SFX('OFFLINE: INITIAL AND SURFACE TIME STEP SHOULD BE MULTIPLE')
00435 ENDIF
00436 !
00437 INB_STEP_ATM  = INT(ZDURATION / ZTSTEP)
00438 INB_ATM       = INT(ZTSTEP / XTSTEP_SURF)
00439 NSTEP_OUTPUT  = INT(ZDURATION / XTSTEP_OUTPUT)
00440 !
00441 XTOPD_STEP = 0
00442 NNB_TOPD_STEP = 0
00443 NTOPD_STEP = 0
00444 IF ( LCOUPL_TOPD ) THEN
00445   !
00446   XTOPD_STEP = FLOAT(NNB_TOPD)* XTSTEP_SURF
00447   NNB_TOPD_STEP = INT( ZDURATION / XTOPD_STEP )
00448   !
00449   IF ( NNB_STP_RESTART==0 .AND. .NOT.LRESTART ) NNB_STP_RESTART = -1
00450   !
00451   NTOPD_STEP = 1
00452   !
00453 ENDIF
00454 !
00455 !       allocation of variables
00456 !
00457 IBANDS = 1
00458 ISCAL  = 1
00459 !
00460  CALL OL_ALLOC_ATM(INI,IBANDS,ISCAL)
00461 !
00462 XZS   = ZZS_FORC
00463 XZREF = ZZREF
00464 XUREF = ZUREF
00465 !
00466 !       compare orography
00467 !
00468  CALL COMPARE_OROGRAPHY (CSURF_FILETYPE, LSET_FORC_ZS, 200.)
00469 !
00470 !       miscellaneous initialization
00471 !
00472 ICOUNT = 0
00473 ZTIMEC = 0.
00474 !
00475 ALLOCATE(ISIZE_OMP(0:NBLOCKTOT-1))
00476  CALL GET_SIZES_PARALLEL(1.,NBLOCKTOT,0,INI,ISIZE_OMP)
00477  CALL SUNPOS(ISIZE_OMP, IYEAR, IMONTH, IDAY, ZTIME, ZLON, ZLAT, XTSUN, XZENITH, XAZIM)
00478 DEALLOCATE(ISIZE_OMP)
00479 !
00480 !number of lines read in forcing files
00481 INB_LINES=1
00482 IF (NB_READ_FORC.EQ.1) THEN
00483   INB_LINES=INB_STEP_ATM
00484 ELSEIF (NB_READ_FORC.NE.0) THEN
00485   !to be sure the number of readings will be NB_READ_FORC as a maximum
00486   INB_LINES=CEILING(1.*(INB_STEP_ATM+1)/NB_READ_FORC)
00487 ENDIF
00488 !number of lines to be read effectively
00489 IDMAX=INB_LINES+1
00490 !effective number of readings of the forcing files
00491 NB_READ_FORC=CEILING(1.*(INB_STEP_ATM+1)/INB_LINES)
00492 !
00493 !       allocate local atmospheric variables
00494 !
00495 IF (.NOT.ALLOCATED(ZTA)) ALLOCATE(ZTA    (INI,INB_LINES+1)) 
00496 IF (.NOT.ALLOCATED(ZQA))ALLOCATE(ZQA    (INI,INB_LINES+1))
00497 IF (.NOT.ALLOCATED(ZWIND))ALLOCATE(ZWIND  (INI,INB_LINES+1))
00498 IF (.NOT.ALLOCATED(ZDIR_SW))ALLOCATE(ZDIR_SW(INI,INB_LINES+1))
00499 IF (.NOT.ALLOCATED(ZSCA_SW))ALLOCATE(ZSCA_SW(INI,INB_LINES+1))
00500 IF (.NOT.ALLOCATED(ZLW))ALLOCATE(ZLW    (INI,INB_LINES+1))
00501 IF (.NOT.ALLOCATED(ZSNOW))ALLOCATE(ZSNOW  (INI,INB_LINES+1))
00502 IF (.NOT.ALLOCATED(ZRAIN))ALLOCATE(ZRAIN  (INI,INB_LINES+1))
00503 IF (.NOT.ALLOCATED(ZPS))ALLOCATE(ZPS    (INI,INB_LINES+1))
00504 IF (.NOT.ALLOCATED(ZCO2))ALLOCATE(ZCO2   (INI,INB_LINES+1))
00505 IF (.NOT.ALLOCATED(ZDIR))ALLOCATE(ZDIR   (INI,INB_LINES+1))
00506 IF (.NOT.ALLOCATED(ZCOEF))ALLOCATE(ZCOEF   (INI))
00507 !
00508 IF (.NOT.ALLOCATED(ZSW))ALLOCATE(ZSW    (INI))
00509 !
00510 !      computes initial air co2 concentration and  density
00511 !
00512 #ifndef NOMPI
00513 XTIME = (MPI_WTIME() - XTIME0)
00514 #endif
00515  CALL WLOG_MPI('COMPARE_OROGRAPHY SUNPOS ',PLOG=XTIME)
00516 #ifndef NOMPI
00517 XTIME0 = MPI_WTIME()
00518 #endif
00519 !
00520 !* opens forcing files (if ASCII or BINARY)
00521 !
00522 IF (CFORCING_FILETYPE=='ASCII ' .OR. CFORCING_FILETYPE=='BINARY') CALL OPEN_CLOSE_BIN_ASC_FORC('OPEN ',CFORCING_FILETYPE,'R')
00523 !
00524  CALL OL_READ_ATM(CSURF_FILETYPE, CFORCING_FILETYPE, 1,             &
00525                    ZTA,ZQA,ZWIND,ZDIR_SW,ZSCA_SW,ZLW,ZSNOW,ZRAIN,ZPS,&
00526                    ZCO2,ZDIR,LLIMIT_QAIR                           ) 
00527 !
00528  CALL WLOG_MPI(' ')
00529  CALL WLOG_MPI('TIME_NPIO_READ forc ',PLOG=XTIME_NPIO_READ)
00530  CALL WLOG_MPI('TIME_COMM_READ forc ',PLOG=XTIME_COMM_READ)
00531 XTIME_NPIO_READ = 0.
00532 XTIME_COMM_READ = 0.
00533 !
00534 #ifndef NOMPI
00535 XTIME = (MPI_WTIME() - XTIME0)
00536 #endif
00537  CALL WLOG_MPI(' ')
00538  CALL WLOG_MPI('OL_READ_ATM0 ',PLOG=XTIME)
00539  CALL WLOG_MPI(' ')
00540 #ifndef NOMPI
00541 XTIME0 = MPI_WTIME()
00542 #endif
00543 !
00544 XCO2(:)  = ZCO2(:,1)
00545 XRHOA (:) = ZPS(:,1) / (XRD * ZTA(:,1) * ( 1.+((XRV/XRD)-1.)*ZQA(:,1) ) + XG * XZREF )
00546 !                 
00547 !       surface Initialisation     
00548 !
00549 #ifndef NOMPI
00550 XTIME = (MPI_WTIME() - XTIME0)
00551 #endif
00552  CALL WLOG_MPI('CO2 RHOA ',PLOG=XTIME)
00553 !
00554  CALL IO_BUFF_CLEAN_n
00555 !
00556  CALL DEALLOC_SURFEX
00557  CALL ALLOC_SURFEX(NBLOCKTOT)
00558 !
00559 ALLOCATE(ISIZE_OMP(0:NBLOCKTOT-1))
00560  CALL GET_SIZES_PARALLEL(1.,NBLOCKTOT,0,INI,ISIZE_OMP)
00561 DO J=0,NBLOCKTOT-1
00562  CALL WLOG_MPI("SIZES_OMP ",KLOG=J,KLOG2=ISIZE_OMP(J))
00563 ENDDO
00564 !
00565 !$OMP PARALLEL PRIVATE(INKPROMA,XTIME,XTIME0)
00566 !
00567 #ifndef NOMPI
00568 XTIME0 = MPI_WTIME()
00569 #endif
00570 !
00571 !$ NBLOCK = OMP_GET_THREAD_NUM()
00572 !
00573 IF (NBLOCK==NBLOCKTOT) THEN
00574   CALL INIT_DIM(ISIZE_OMP,0,INKPROMA,NINDX1,NINDX2)
00575 ELSE
00576   CALL INIT_DIM(ISIZE_OMP,NBLOCK,INKPROMA,NINDX1,NINDX2)
00577 ENDIF
00578 !
00579 IF (NBLOCK==0) THEN
00580   CALL GOTO_SURFEX(NBLOCKTOT,.TRUE.)
00581 ELSE
00582   CALL GOTO_SURFEX(NBLOCK,.TRUE.)
00583 ENDIF
00584 !
00585  CALL INIT_SURF_ATM_n(CSURF_FILETYPE, YINIT, LLAND_USE,                      &
00586                      INKPROMA, ISCAL, IBANDS,                               &
00587                      CSV,XCO2(NINDX1:NINDX2),XRHOA(NINDX1:NINDX2),          &
00588                      XZENITH(NINDX1:NINDX2),XAZIM(NINDX1:NINDX2),XSW_BANDS, &
00589                      XDIR_ALB(NINDX1:NINDX2,:), XSCA_ALB(NINDX1:NINDX2,:),  &
00590                      XEMIS(NINDX1:NINDX2), XTSRAD(NINDX1:NINDX2),           &
00591                      IYEAR, IMONTH, IDAY, ZTIME,                            &
00592                      YATMFILE, YATMFILETYPE, YTEST                          )
00593 !
00594  CALL RESET_DIM(INI,INKPROMA,NINDX1,NINDX2)
00595 !
00596 #ifndef NOMPI
00597 XTIME = (MPI_WTIME() - XTIME0)
00598 #endif
00599  CALL WLOG_MPI(' ')
00600  CALL WLOG_MPI('INIT_SURF_ATM ',PLOG=XTIME)
00601  CALL WLOG_MPI(' ')
00602 !
00603  CALL WLOG_MPI('TIME_NPIO_READ init ',PLOG=XTIME_NPIO_READ)
00604  CALL WLOG_MPI('TIME_COMM_READ init ',PLOG=XTIME_COMM_READ)
00605  CALL WLOG_MPI(' ')
00606 !
00607 !$OMP END PARALLEL
00608 !
00609 !
00610 XTIME_NPIO_READ = 0.
00611 XTIME_COMM_READ = 0.
00612 !
00613 !   Land use or/and vegetation dynamic
00614 !                  
00615  CALL INIT_SURF_LANDUSE_n(CSURF_FILETYPE,YINIT,LLAND_USE,             &
00616                        INI, ISCAL, IBANDS,                           &
00617                        CSV,XCO2(NINDX1:NINDX2),XRHOA(NINDX1:NINDX2), &
00618                        XZENITH(NINDX1:NINDX2),XAZIM(NINDX1:NINDX2),  &
00619                        XSW_BANDS,XDIR_ALB(NINDX1:NINDX2,:),          &
00620                        XSCA_ALB(NINDX1:NINDX2,:),                    &
00621                        XEMIS(NINDX1:NINDX2),XTSRAD(NINDX1:NINDX2),   &
00622                        IYEAR, IMONTH, IDAY, ZTIME,                   &
00623                        YATMFILE, YATMFILETYPE, YTEST                 )
00624 !
00625 #ifndef NOMPI
00626 XTIME0 = MPI_WTIME()
00627 #endif
00628 !
00629 ! Initialyse the SURFACE-TRIP interface
00630 !
00631  CALL INIT_SURF_TRIP_n(CSURF_FILETYPE,INI,IBANDS,LRESTART,IYEAR,IMONTH,&
00632                         ZDURATION,ITRIP_MONTH,ITRIP_COUNT,XZENITH,      &
00633                         XSW_BANDS,XEMIS,XTSRAD,XDIR_ALB,XSCA_ALB        )  
00634 !
00635  CALL INIT_CRODEBUG()
00636 !
00637 ! --------------------------------------------------------------------------------------
00638 !
00639 NWRITE = 0
00640 !
00641 #ifndef NOMPI
00642 XTIME = (MPI_WTIME() - XTIME0)
00643 #endif
00644  CALL WLOG_MPI('INIT FINISHED ',PLOG=XTIME)
00645 #ifndef NOMPI
00646 XTIME0 = MPI_WTIME()
00647 #endif
00648 !*      2.    Temporal loops
00649 !
00650 XTIME_CALC(:) = 0.
00651 XTIME_WRITE(:) = 0.
00652 !
00653 DO JFORC_STEP=1,INB_STEP_ATM
00654   !
00655 #ifndef NOMPI  
00656   XTIME1 = MPI_WTIME()
00657 #endif
00658   ! read Forcing
00659   !
00660   !indice of forcing line in forcing arrays
00661   ID_FORC=JFORC_STEP-INT(JFORC_STEP/INB_LINES)*INB_LINES
00662   IF (ID_FORC==0) ID_FORC=INB_LINES
00663   !new forcings to read
00664   IF (ID_FORC==1 .AND. JFORC_STEP.NE.1) THEN
00665     !if last part of forcing, the last point has to be adjusted on the end of
00666     !files
00667     IF (JFORC_STEP/INB_LINES==NB_READ_FORC-1) THEN 
00668       IDMAX=INB_STEP_ATM-JFORC_STEP+1+1
00669       !for ascii and binary forcing files
00670       ZTA(:,IDMAX)=ZTA(:,SIZE(ZTA,2))
00671       ZQA(:,IDMAX)=ZQA(:,SIZE(ZTA,2))
00672       ZWIND(:,IDMAX)=ZWIND(:,SIZE(ZTA,2))
00673       ZDIR_SW(:,IDMAX)=ZDIR_SW(:,SIZE(ZTA,2))
00674       ZSCA_SW(:,IDMAX)=ZSCA_SW(:,SIZE(ZTA,2))
00675       ZLW(:,IDMAX)=ZLW(:,SIZE(ZTA,2))
00676       ZSNOW(:,IDMAX)=ZSNOW(:,SIZE(ZTA,2))
00677       ZRAIN(:,IDMAX)=ZRAIN(:,SIZE(ZTA,2))
00678       ZPS(:,IDMAX)=ZPS(:,SIZE(ZTA,2))
00679       ZCO2(:,IDMAX)=ZCO2(:,SIZE(ZTA,2))
00680       ZDIR(:,IDMAX)=ZDIR(:,SIZE(ZTA,2))
00681     ENDIF
00682     CALL OL_READ_ATM(CSURF_FILETYPE, CFORCING_FILETYPE, JFORC_STEP,    &
00683                      ZTA(:,1:IDMAX),ZQA(:,1:IDMAX),ZWIND(:,1:IDMAX), &
00684                      ZDIR_SW(:,1:IDMAX),ZSCA_SW(:,1:IDMAX),ZLW(:,1:IDMAX), &
00685                      ZSNOW(:,1:IDMAX),ZRAIN(:,1:IDMAX),ZPS(:,1:IDMAX),&
00686                      ZCO2(:,1:IDMAX),ZDIR(:,1:IDMAX),LLIMIT_QAIR         )
00687   ENDIF
00688 
00689 #ifndef NOMPI  
00690   XTIME_CALC(1) = XTIME_CALC(1) + (MPI_WTIME() - XTIME1)
00691   XTIME1 = MPI_WTIME()
00692 #endif
00693   !
00694   DO JSURF_STEP=1,INB_ATM
00695     !
00696     ! time interpolation of the forcing
00697     !
00698 #ifndef NOMPI    
00699     XTIME1 = MPI_WTIME()
00700 #endif
00701     CALL SUNPOS(ISIZE_OMP, IYEAR, IMONTH, IDAY, ZTIME, &
00702                 ZLON, ZLAT, XTSUN, XZENITH, XAZIM)
00703     CALL SUNPOS(ISIZE_OMP, IYEAR, IMONTH, IDAY, ZTIME+XTSTEP_SURF, &
00704                 ZLON, ZLAT, XTSUN, XZENITH2, XAZIM)
00705 #ifndef NOMPI                
00706     XTIME_CALC(2) = XTIME_CALC(2) + (MPI_WTIME() - XTIME1)
00707     XTIME1 = MPI_WTIME()
00708 #endif
00709     !interpolation between beginning and end of current forcing time step
00710     CALL OL_TIME_INTERP_ATM(JSURF_STEP,INB_ATM,ISIZE_OMP,            &
00711                             ZTA(:,ID_FORC),ZTA(:,ID_FORC+1),         &
00712                             ZQA(:,ID_FORC),ZQA(:,ID_FORC+1),         &
00713                             ZWIND(:,ID_FORC),ZWIND(:,ID_FORC+1),     &
00714                             ZDIR_SW(:,ID_FORC),ZDIR_SW(:,ID_FORC+1), &
00715                             ZSCA_SW(:,ID_FORC),ZSCA_SW(:,ID_FORC+1), &
00716                             ZLW(:,ID_FORC),ZLW(:,ID_FORC+1),         &
00717                             ZSNOW(:,ID_FORC+1),ZRAIN(:,ID_FORC+1),   &
00718                             ZPS(:,ID_FORC),ZPS(:,ID_FORC+1),         &
00719                             ZCO2(:,ID_FORC), ZCO2(:,ID_FORC+1),      &
00720                             ZDIR(:,ID_FORC) ,ZDIR(:,ID_FORC+1)       )
00721 #ifndef NOMPI                            
00722     XTIME_CALC(3) = XTIME_CALC(3) + (MPI_WTIME() - XTIME1)
00723     XTIME1 = MPI_WTIME()    
00724 #endif
00725     !
00726     ! coherence between solar zenithal angle and radiation
00727     ! when solar beam close to horizontal -> reduction of direct radiation to
00728     ! the benefit of scattered radiation
00729     ! when pi/2 - 0.1 < ZENITH < pi/2 - 0.05 => weight of direct to scattered radiation decreases linearly with zenith 
00730     ! when pi/2 - 0.05 < ZENITH => all the direct radiation is converted to scattered radiation
00731     ! coherence between solar zenithal angle and radiation
00732     !
00733     ZCOEF(:) = (XPI/2. - XZENITH(:) - 0.05) / 0.05
00734     ZCOEF(:) = MAX(MIN(ZCOEF,1.),0.)
00735     DO JLOOP=1,SIZE(XDIR_SW,2)
00736       XSCA_SW(:,JLOOP) = XSCA_SW(:,JLOOP) + XDIR_SW(:,JLOOP) * (1 - ZCOEF)
00737       XDIR_SW(:,JLOOP) = XDIR_SW(:,JLOOP) * ZCOEF(:)
00738     ENDDO   
00739     !ZSW(:) = 0.
00740     !DO JLOOP=1,SIZE(XDIR_SW,2)
00741     !  ZSW(:) = ZSW(:) + XDIR_SW(:,JLOOP) + XSCA_SW(:,JLOOP)
00742     !END DO    
00743     !
00744     ! updates time
00745     ZTIMEC= ZTIMEC+XTSTEP_SURF
00746     IF (LCOUPL_TOPD) LTOPD_STEP = ( MOD((((JFORC_STEP-1)*INB_ATM)+JSURF_STEP),NNB_TOPD) == 0 )
00747     !
00748     ! run Surface
00749     !
00750 #ifndef NOMPI    
00751     XTIME_CALC(4) = XTIME_CALC(4) + (MPI_WTIME() - XTIME1) 
00752 #endif   
00753     !
00754     CALL IO_BUFF_CLEAN_n
00755     !
00756 !$OMP PARALLEL PRIVATE(INKPROMA,XTIME1)
00757     !
00758 #ifndef NOMPI    
00759     XTIME1 = MPI_WTIME()    
00760 #endif
00761     !    
00762 !$ NBLOCK = OMP_GET_THREAD_NUM()
00763     !
00764     IF (NBLOCK==NBLOCKTOT) THEN
00765       CALL INIT_DIM(ISIZE_OMP,0,INKPROMA,NINDX1,NINDX2)
00766     ELSE
00767       CALL INIT_DIM(ISIZE_OMP,NBLOCK,INKPROMA,NINDX1,NINDX2)
00768     ENDIF
00769     !
00770     IF (NBLOCK==0) THEN
00771       CALL GOTO_SURFEX(NBLOCKTOT,.TRUE.)
00772     ELSE
00773       CALL GOTO_SURFEX(NBLOCK,.TRUE.)
00774     ENDIF
00775     !
00776     CALL COUPLING_SURF_ATM_n(CSURF_FILETYPE, 'E', ZTIMEC,                    &
00777            XTSTEP_SURF, IYEAR, IMONTH, IDAY, ZTIME, INKPROMA, ISCAL, IBANDS, &
00778            XTSUN(NINDX1:NINDX2), XZENITH(NINDX1:NINDX2),                     &
00779            XZENITH2(NINDX1:NINDX2), XAZIM(NINDX1:NINDX2),                    &
00780            XZREF(NINDX1:NINDX2), XUREF(NINDX1:NINDX2), XZS(NINDX1:NINDX2),   &
00781            XU(NINDX1:NINDX2), XV(NINDX1:NINDX2), XQA(NINDX1:NINDX2),         &
00782            XTA(NINDX1:NINDX2), XRHOA(NINDX1:NINDX2), XSV(NINDX1:NINDX2,:),   &
00783            XCO2(NINDX1:NINDX2), CSV, XRAIN(NINDX1:NINDX2),                   &
00784            XSNOW(NINDX1:NINDX2), XLW(NINDX1:NINDX2),                         &
00785            XDIR_SW(NINDX1:NINDX2,:), XSCA_SW(NINDX1:NINDX2,:), XSW_BANDS,    &
00786            XPS(NINDX1:NINDX2), XPA(NINDX1:NINDX2),                           &
00787            XSFTQ(NINDX1:NINDX2), XSFTH(NINDX1:NINDX2), XSFTS(NINDX1:NINDX2,:), &
00788            XSFCO2(NINDX1:NINDX2), XSFU(NINDX1:NINDX2), XSFV(NINDX1:NINDX2),  &
00789            XTSRAD(NINDX1:NINDX2), XDIR_ALB(NINDX1:NINDX2,:),                 &
00790            XSCA_ALB(NINDX1:NINDX2,:), XEMIS(NINDX1:NINDX2),                  &
00791            XPEW_A_COEF(NINDX1:NINDX2), XPEW_B_COEF(NINDX1:NINDX2),           &
00792            XPET_A_COEF(NINDX1:NINDX2), XPEQ_A_COEF(NINDX1:NINDX2),           &
00793            XPET_B_COEF(NINDX1:NINDX2), XPEQ_B_COEF(NINDX1:NINDX2), YTEST     )
00794     !
00795     CALL RESET_DIM(INI,INKPROMA,NINDX1,NINDX2)
00796     !
00797 #ifndef NOMPI    
00798     XTIME_CALC(5) = XTIME_CALC(5) + (MPI_WTIME() - XTIME1)
00799 #endif
00800     !
00801 !$OMP END PARALLEL
00802     !
00803 #ifndef NOMPI    
00804     XTIME1 = MPI_WTIME()  
00805 #endif
00806     CALL COUPLING_SURF_TRIP_n(CSURF_FILETYPE,INI,IBANDS,LRESTART,IYEAR,  &
00807                               ITRIP_MONTH,ITRIP_COUNT,ZTIME+XTSTEP_SURF, &
00808                               ZDURATION,XZENITH,XSW_BANDS,XEMIS,XTSRAD,  &
00809                               XDIR_ALB,XSCA_ALB                          )
00810     !
00811     ZTIME = ZTIME + XTSTEP_SURF
00812     CALL ADD_FORECAST_TO_DATE_SURF(IYEAR, IMONTH, IDAY, ZTIME)
00813 #ifndef NOMPI    
00814     XTIME_CALC(6) = XTIME_CALC(6) + (MPI_WTIME() - XTIME1)
00815     !
00816     XTIME1 =  MPI_WTIME()
00817 #endif    
00818     ! ecrit Surface
00819     !
00820     IF ( LCOUPL_TOPD .AND. LTOPD_STEP ) THEN
00821       !
00822       IF (.NOT.ALLOCATED(NYEAR))  ALLOCATE(NYEAR(NNB_TOPD_STEP))
00823       IF (.NOT.ALLOCATED(NMONTH)) ALLOCATE(NMONTH(NNB_TOPD_STEP))
00824       IF (.NOT.ALLOCATED(NDAY))   ALLOCATE(NDAY(NNB_TOPD_STEP))
00825       IF (.NOT.ALLOCATED(NH))     ALLOCATE(NH(NNB_TOPD_STEP))
00826       IF (.NOT.ALLOCATED(NM))     ALLOCATE(NM(NNB_TOPD_STEP))
00827       !
00828       NYEAR (NTOPD_STEP) = IYEAR
00829       NMONTH(NTOPD_STEP) = IMONTH
00830       NDAY  (NTOPD_STEP) = IDAY
00831       NH    (NTOPD_STEP) = INT(ZTIME/3600.)
00832       NM    (NTOPD_STEP) = INT((ZTIME-NH(NTOPD_STEP)*3600.)/60.)
00833       !
00834       IF ( NM(NTOPD_STEP)==60 ) THEN
00835         !
00836         NM(NTOPD_STEP) = 0
00837         NH(NTOPD_STEP) = NH(NTOPD_STEP)+1
00838         !
00839       ENDIF
00840       !
00841       IF ( NH(NTOPD_STEP)==24 ) THEN
00842         !
00843         NH  (NTOPD_STEP) = 0
00844         NDAY(NTOPD_STEP) = NDAY(NTOPD_STEP)+1
00845         !
00846         !!AJOUT BEC 
00847         SELECT CASE (NMONTH(NTOPD_STEP))
00848           CASE(4,6,9,11)
00849             IF ( NDAY(NTOPD_STEP)==31 ) THEN
00850               NMONTH(NTOPD_STEP) = NMONTH(NTOPD_STEP)+1
00851               NDAY  (NTOPD_STEP) = 1
00852             ENDIF
00853           CASE(1,3,5,7:8,10)
00854             IF ( NDAY(NTOPD_STEP)==32 ) THEN
00855               NMONTH(NTOPD_STEP) = NMONTH(NTOPD_STEP)+1
00856               NDAY  (NTOPD_STEP) = 1
00857             ENDIF
00858           CASE(12)
00859             IF ( NDAY(NTOPD_STEP)==32 ) THEN
00860               NYEAR (NTOPD_STEP) = NYEAR(NTOPD_STEP)+1
00861               NMONTH(NTOPD_STEP) = 1
00862               NDAY  (NTOPD_STEP) = 1
00863             ENDIF
00864           CASE(2)
00865             IF( MOD(NYEAR(NTOPD_STEP),4)==0 .AND. MOD(NYEAR(NTOPD_STEP),100)/=0 .OR. MOD(NYEAR(NTOPD_STEP),400)==0 ) THEN 
00866               IF (NDAY(NTOPD_STEP)==30) THEN
00867                 NMONTH(NTOPD_STEP) = NMONTH(NTOPD_STEP)+1
00868                 NDAY  (NTOPD_STEP) = 1
00869               ENDIF
00870             ELSE
00871               IF (NDAY(NTOPD_STEP)==29) THEN
00872                 NMONTH(NTOPD_STEP) = NMONTH(NTOPD_STEP)+1
00873                 NDAY  (NTOPD_STEP) = 1
00874               ENDIF
00875             ENDIF
00876         END SELECT
00877         !
00878       ENDIF
00879       !
00880       ! * 2. Stocking date of each time step
00881       !
00882       NTOPD_STEP = NTOPD_STEP + 1 
00883       !     
00884     ENDIF
00885     !
00886     IF (MOD(ZTIMEC,XTSTEP_OUTPUT) == 0. .AND. CTIMESERIES_FILETYPE/='NONE  ') THEN
00887       !
00888       IF (NRANK==NPIO) THEN
00889         !
00890         !* name of the file
00891         IF (CTIMESERIES_FILETYPE=="ASCII " .OR. &
00892             CTIMESERIES_FILETYPE=="LFI   " .OR. &
00893             CTIMESERIES_FILETYPE=="FA    "      ) THEN  
00894           !
00895           ZTIME_OUT  = ZTIME
00896           IDAY_OUT   = IDAY
00897           IMONTH_OUT = IMONTH
00898           IYEAR_OUT  = IYEAR
00899           !
00900           IF(LOUT_TIMENAME)THEN
00901             ! if true, change the name of output file at the end of a day
00902             ! (ex: 19860502_00h00 -> 19860501_24h00)                     
00903             IF(ZTIME==0.0)THEN
00904               ZTIME_OUT = 86400.
00905               IDAY_OUT   = IDAY-1
00906               IF(IDAY_OUT==0)THEN
00907                 IMONTH_OUT = IMONTH - 1
00908                 IF(IMONTH_OUT==0)THEN
00909                   IMONTH_OUT=12
00910                   IYEAR_OUT = IYEAR - 1
00911                 ENDIF
00912                 SELECT CASE (IMONTH_OUT)
00913                   CASE(4,6,9,11)
00914                     IDAY_OUT=30
00915                   CASE(1,3,5,7:8,10,12)
00916                     IDAY_OUT=31
00917                   CASE(2)
00918                     IF( ((MOD(IYEAR_OUT,4)==0).AND.(MOD(IYEAR_OUT,100)/=0)) .OR. (MOD(IYEAR_OUT,400)==0))THEN 
00919                       IDAY_OUT=29
00920                     ELSE
00921                       IDAY_OUT=28
00922                     ENDIF
00923                 END SELECT
00924               ENDIF
00925             ENDIF
00926             !
00927           ENDIF
00928           !
00929           WRITE(YTAG,FMT='(I4.4,I2.2,I2.2,A1,I2.2,A1,I2.2)') IYEAR_OUT,IMONTH_OUT,IDAY_OUT,&
00930                 '_',INT(ZTIME_OUT/3600.),'h',NINT(ZTIME_OUT)/60-60*INT(ZTIME_OUT/3600.)  
00931           CFILEOUT    = ADJUSTL(ADJUSTR(CSURFFILE)//'.'//YTAG//'.txt')
00932           CFILEOUT_LFI= ADJUSTL(ADJUSTR(CSURFFILE)//'.'//YTAG)
00933           CFILEOUT_FA = ADJUSTL(ADJUSTR(CSURFFILE)//'.'//YTAG//'.fa')
00934           !
00935           IF (CTIMESERIES_FILETYPE=='FA    ') THEN
00936             LFANOCOMPACT = LDIAG_FA_NOCOMPACT
00937             IDATEF(1)= IYEAR_OUT
00938             IDATEF(2)= IMONTH_OUT
00939             IDATEF(3)= IDAY_OUT
00940             IDATEF(4)= FLOOR(ZTIME_OUT/3600.)
00941             IDATEF(5)= FLOOR(ZTIME_OUT/60.) - IDATEF(4) * 60 
00942             IDATEF(6)= NINT(ZTIME_OUT) - IDATEF(4) * 3600 - IDATEF(5) * 60
00943             IDATEF(7:11) = 0
00944             CALL FAITOU(IRET,NUNIT_FA,.TRUE.,CFILEOUT_FA,'UNKNOWN',.TRUE.,.FALSE.,IVERBFA,0,INB,CDNOMC)
00945             CALL FANDAR(IRET,NUNIT_FA,IDATEF)
00946           END IF
00947           !
00948         END IF
00949         !
00950         XSTARTW = XSTARTW + 1
00951         NWRITE  = NWRITE  + 1
00952         LTIME_WRITTEN(:)=.FALSE.
00953         !
00954       ENDIF
00955       !
00956 #ifndef NOMPI      
00957       XTIME_WRITE(1) = XTIME_WRITE(1) + (MPI_WTIME() - XTIME1)
00958 #endif      
00959       !      
00960       CALL IO_BUFF_CLEAN_n
00961       !
00962       IDX_W = 0
00963       !
00964 !$OMP PARALLEL PRIVATE(INKPROMA,XTIME1)
00965       !
00966 !$ NBLOCK = OMP_GET_THREAD_NUM()
00967       !
00968       IF (NBLOCK==NBLOCKTOT) THEN
00969         CALL INIT_DIM(ISIZE_OMP,0,INKPROMA,NINDX1,NINDX2)
00970       ELSE
00971         CALL INIT_DIM(ISIZE_OMP,NBLOCK,INKPROMA,NINDX1,NINDX2)
00972       ENDIF
00973       !
00974       IF (NBLOCK==0) THEN
00975         CALL GOTO_SURFEX(NBLOCKTOT,.TRUE.)
00976       ELSE
00977         CALL GOTO_SURFEX(NBLOCK,.TRUE.)
00978       ENDIF
00979       !
00980 #ifndef NOMPI      
00981       XTIME1 =  MPI_WTIME()
00982 #endif      
00983       CALL WRITE_SURF_ATM_n(CTIMESERIES_FILETYPE,'ALL',LLAND_USE)
00984 #ifndef NOMPI      
00985       XTIME_WRITE(2) = XTIME_WRITE(2) + (MPI_WTIME() - XTIME1)
00986       XTIME1 =  MPI_WTIME()
00987 #endif      
00988       CALL DIAG_SURF_ATM_n(CTIMESERIES_FILETYPE)
00989 #ifndef NOMPI      
00990       XTIME_WRITE(3) = XTIME_WRITE(3) + (MPI_WTIME() - XTIME1)
00991       XTIME1 =  MPI_WTIME()
00992 #endif    
00993       CALL WRITE_DIAG_SURF_ATM_n(CTIMESERIES_FILETYPE,'ALL')
00994 #ifndef NOMPI      
00995       XTIME_WRITE(4) = XTIME_WRITE(4) + (MPI_WTIME() - XTIME1)
00996 #endif      
00997       !
00998       CALL RESET_DIM(INI,INKPROMA,NINDX1,NINDX2)
00999       !
01000 !$OMP END PARALLEL
01001       !
01002       IF (LCOUPL_TOPD .AND. NTOPD_STEP > NNB_TOPD_STEP) THEN
01003         !
01004         ! Writing of file resulting of coupling with TOPMODEL or routing ****
01005         CALL WRITE_DISCHARGE_FILE(CSURF_FILETYPE,'q_total.txt','FORMATTED',&
01006                                   NYEAR,NMONTH,NDAY,NH,NM,XQTOT)
01007         CALL WRITE_DISCHARGE_FILE(CSURF_FILETYPE,'q_runoff.txt','FORMATTED',&
01008                                   NYEAR,NMONTH,NDAY,NH,NM,XQB_RUN)
01009         CALL WRITE_DISCHARGE_FILE(CSURF_FILETYPE,'q_drainage.txt','FORMATTED',&
01010                                   NYEAR,NMONTH,NDAY,NH,NM,XQB_DR)
01011         ! Writing of budget files 
01012         IF (LBUDGET_TOPD) CALL WRITE_BUDGET_COUPL_ROUT
01013         !
01014       ENDIF
01015       !
01016 #ifndef NOMPI      
01017       XTIME1 =  MPI_WTIME()
01018 #endif      
01019       !
01020       IF (NRANK==NPIO) THEN
01021         IF (CTIMESERIES_FILETYPE=='FA    ') THEN
01022           CALL FAIRME(IRET,NUNIT_FA,'UNKNOWN')
01023         END IF
01024         !* add informations in the file
01025         IF (CTIMESERIES_FILETYPE=='LFI   ' .AND. LMNH_COMPATIBLE) CALL WRITE_HEADER_MNH
01026       ENDIF
01027 #ifndef NOMPI      
01028       XTIME_WRITE(5) = XTIME_WRITE(5) + (MPI_WTIME() - XTIME1)
01029 #endif      
01030       !
01031     ENDIF
01032     !
01033   END DO
01034   !
01035   IF (NRANK==NPIO) THEN
01036     IF (LPRINT) THEN
01037       IF (MOD(ZTIMEC,XDAY) == 0.) THEN
01038 !$OMP SINGLE              
01039         ICOUNT = ICOUNT + 1
01040         CALL WLOG_MPI('  DAY :',KLOG=ICOUNT,KLOG2=INT(ZDURATION/XDAY))
01041         WRITE(*,'(A7,I4,A2,I4)')'  DAY :',ICOUNT,' /',INT(ZDURATION/XDAY)
01042 !$OMP END SINGLE        
01043       ENDIF
01044     ENDIF
01045   ENDIF
01046   !
01047 END DO
01048 !
01049 !$OMP PARALLEL PRIVATE(XTIME)
01050 !
01051 #ifndef NOMPI
01052 XTIME = (MPI_WTIME() - XTIME0)
01053 #endif
01054 !
01055  CALL WLOG_MPI(' ')
01056  CALL WLOG_MPI('OL_READ_ATM ',PLOG=XTIME_CALC(1))
01057  CALL WLOG_MPI('SUNPOS ',PLOG=XTIME_CALC(2))
01058  CALL WLOG_MPI('OL_TIME_INTERP_ATM ',PLOG=XTIME_CALC(3))
01059  CALL WLOG_MPI('')
01060  CALL WLOG_MPI('ZENITH ',PLOG=XTIME_CALC(4))
01061  CALL WLOG_MPI('')
01062  CALL WLOG_MPI('COUPLING_SURF_ATM ',PLOG=XTIME_CALC(5))
01063  CALL WLOG_MPI('')
01064  CALL WLOG_MPI('ADD_FORECAST_TO_DATE_SURF ',PLOG=XTIME_CALC(6))
01065  CALL WLOG_MPI('DEF_DATE ',PLOG=XTIME_WRITE(1))
01066  CALL WLOG_MPI('')
01067  CALL WLOG_MPI('WRITE_SURF_ATM ',PLOG=XTIME_WRITE(2))
01068  CALL WLOG_MPI('DIAG_SURF_ATM ',PLOG=XTIME_WRITE(3))
01069  CALL WLOG_MPI('WRITE_DIAG_SURF_ATM ',PLOG=XTIME_WRITE(4))
01070  CALL WLOG_MPI('')
01071  CALL WLOG_MPI('CLOSE FILES ',PLOG=XTIME_WRITE(5))
01072  CALL WLOG_MPI('')
01073  CALL WLOG_MPI('END LOOP ',PLOG=XTIME)
01074  CALL WLOG_MPI('')
01075  CALL WLOG_MPI('TIME_NPIO_WRITE ',PLOG=XTIME_NPIO_WRITE)
01076  CALL WLOG_MPI('TIME_COMM_WRITE ',PLOG=XTIME_COMM_WRITE)
01077  CALL WLOG_MPI('TIME_OMP_BARR ',PLOG=XTIME_OMP_BARR)
01078  CALL WLOG_MPI('TIME_CALC_WRITE ',PLOG=XTIME_CALC_WRITE)
01079  CALL WLOG_MPI('')
01080  CALL WLOG_MPI('TIME_INIT_SEA ',PLOG=XTIME_INIT_SEA)
01081  CALL WLOG_MPI('TIME_INIT_WATER ',PLOG=XTIME_INIT_WATER)
01082  CALL WLOG_MPI('TIME_INIT_NATURE ',PLOG=XTIME_INIT_NATURE)
01083  CALL WLOG_MPI('TIME_INIT_TOWN ',PLOG=XTIME_INIT_TOWN)
01084  CALL WLOG_MPI('')
01085  CALL WLOG_MPI('TIME_SEA ',PLOG=XTIME_SEA)
01086  CALL WLOG_MPI('TIME_WATER ',PLOG=XTIME_WATER)
01087  CALL WLOG_MPI('TIME_NATURE ',PLOG=XTIME_NATURE)
01088  CALL WLOG_MPI('TIME_TOWN ',PLOG=XTIME_TOWN)
01089 !
01090 !$OMP END PARALLEL
01091 !
01092 ! --------------------------------------------------------------------------------------
01093 !
01094 !*    3.     write restart file
01095 !            ------------------
01096 !
01097 IF ( LRESTART ) THEN
01098   !
01099   IF (NRANK==NPIO) THEN
01100     !* name of the file
01101     CFILEOUT    = ADJUSTL(ADJUSTR(CSURFFILE)//'.txt')
01102     CFILEOUT_LFI= CSURFFILE
01103     CFILEOUT_FA = ADJUSTL(ADJUSTR(CSURFFILE)//'.fa')
01104 
01105     !* opens the file
01106     IF (CSURF_FILETYPE=='FA    ') THEN
01107       LFANOCOMPACT = .TRUE.
01108       IDATEF(1)= IYEAR_OUT
01109       IDATEF(2)= IMONTH_OUT
01110       IDATEF(3)= IDAY_OUT
01111       IDATEF(4)= FLOOR(ZTIME_OUT/3600.)
01112       IDATEF(5)= FLOOR(ZTIME_OUT/60.) - IDATEF(4) * 60 
01113       IDATEF(6)= NINT(ZTIME_OUT) - IDATEF(4) * 3600 - IDATEF(5) * 60
01114       IDATEF(7:11) = 0    
01115       CALL FAITOU(IRET,NUNIT_FA,.TRUE.,CFILEOUT_FA,'UNKNOWN',.TRUE.,.FALSE.,IVERBFA,0,INB,CDNOMC)
01116       CALL FANDAR(IRET,NUNIT_FA,IDATEF)
01117     END IF
01118     !
01119   ENDIF
01120   !
01121   CALL IO_BUFF_CLEAN_n
01122   !
01123 !$OMP PARALLEL PRIVATE(INKPROMA)
01124   !
01125 !$ NBLOCK = OMP_GET_THREAD_NUM()
01126   !
01127   IF (NBLOCK==NBLOCKTOT) THEN
01128     CALL INIT_DIM(ISIZE_OMP,0,INKPROMA,NINDX1,NINDX2)
01129   ELSE
01130     CALL INIT_DIM(ISIZE_OMP,NBLOCK,INKPROMA,NINDX1,NINDX2)
01131   ENDIF
01132   !
01133   IF (NBLOCK==0) THEN
01134     CALL GOTO_SURFEX(NBLOCKTOT,.TRUE.)
01135   ELSE
01136     CALL GOTO_SURFEX(NBLOCK,.TRUE.)
01137   ENDIF
01138   !  
01139   CALL FLAG_UPDATE(.FALSE.,.TRUE.,.FALSE.,.FALSE.)
01140   !  
01141   !* writes into the file
01142   CALL WRITE_SURF_ATM_n(CSURF_FILETYPE,'ALL',LLAND_USE)
01143   IF(CSURF_FILETYPE/='FA    ')THEN
01144      CALL FLAG_DIAG_UPDATE(.FALSE.,.TRUE.,0,.FALSE.,.FALSE.,.FALSE.,&
01145                            .FALSE.,0,0,.FALSE.,.FALSE.,.FALSE.,.FALSE.,&
01146                            .FALSE.,.FALSE.,.FALSE.,.FALSE.)
01147      CALL WRITE_DIAG_SURF_ATM_n(CSURF_FILETYPE,'ALL')
01148   ENDIF
01149   !
01150 !$OMP END PARALLEL 
01151   !
01152   !* closes the file
01153   IF (NRANK==0 ) THEN
01154     IF (CSURF_FILETYPE=='FA    ') THEN
01155       CALL FAIRME(IRET,NUNIT_FA,'UNKNOWN')
01156     END IF
01157     !* add informations in the file
01158     IF (CSURF_FILETYPE=='LFI   ' .AND. LMNH_COMPATIBLE) CALL WRITE_HEADER_MNH
01159     !
01160   ENDIF
01161   !
01162   IF (LCOUPL_TOPD .AND. NTOPD_STEP > NNB_TOPD_STEP) CALL PREP_RESTART_COUPL_TOPD(CSURF_FILETYPE,INI)
01163   !
01164 END IF
01165 !
01166 ! --------------------------------------------------------------------------------------
01167 !
01168 !*    4.     inquiry mode
01169 !            ------------
01170 !
01171 IF ( LINQUIRE ) THEN
01172   !
01173   ALLOCATE( ZSEA       ( INI ) )
01174   ALLOCATE( ZWATER     ( INI ) )
01175   ALLOCATE( ZNATURE    ( INI ) )
01176   ALLOCATE( ZTOWN      ( INI ) )
01177   ALLOCATE( ZT2M       ( INI ) )
01178   ALLOCATE( ZQ2M       ( INI ) )
01179   ALLOCATE( ZZ0        ( INI ) )
01180   ALLOCATE( ZZ0H       ( INI ) )
01181   ALLOCATE( ZQS_SEA    ( INI ) )
01182   ALLOCATE( ZQS_WATER  ( INI ) )
01183   ALLOCATE( ZQS_NATURE ( INI ) )
01184   ALLOCATE( ZQS_TOWN   ( INI ) )
01185   ALLOCATE( ZQS        ( INI ) )
01186   ALLOCATE( ZPSNG      ( INI ) )
01187   ALLOCATE( ZPSNV      ( INI ) )
01188   ALLOCATE( ZZ0EFF     ( INI ) )
01189   ALLOCATE( ZZS        ( INI ) )
01190   !
01191   ISERIES = 0
01192   CALL GET_SURF_VAR_n(CSURF_FILETYPE,INI,ISERIES,PSEA=ZSEA,PWATER=ZWATER,PNATURE=ZNATURE,PTOWN=ZTOWN, &
01193                         PT2M=ZT2M,PQ2M=ZQ2M,PQS=ZQS,PZ0=ZZ0,PZ0H=ZZ0H,PZ0EFF=ZZ0EFF,PQS_SEA=ZQS_SEA,  &
01194                         PQS_WATER=ZQS_WATER,PQS_NATURE=ZQS_NATURE,PQS_TOWN=ZQS_TOWN,                  &
01195                         PPSNG=ZPSNG,PPSNV=ZPSNV,PZS=ZZS                                         )  
01196   !
01197   ISIZE = SIZE(NINDEX)
01198   IF (NRANK==NPIO) THEN
01199     ALLOCATE(ZSEA_FULL   (ISIZE))
01200     ALLOCATE(ZWATER_FULL (ISIZE))
01201     ALLOCATE(ZNATURE_FULL(ISIZE))
01202     ALLOCATE(ZTOWN_FULL  (ISIZE))
01203     ALLOCATE(ZZ0_FULL    (ISIZE))
01204     ALLOCATE(ZZ0EFF_FULL (ISIZE))
01205     ALLOCATE(ZZS_FULL    (ISIZE))
01206   ELSE
01207     ALLOCATE(ZSEA_FULL   (0))
01208     ALLOCATE(ZWATER_FULL (0))
01209     ALLOCATE(ZNATURE_FULL(0))
01210     ALLOCATE(ZTOWN_FULL  (0))
01211     ALLOCATE(ZZ0_FULL    (0))
01212     ALLOCATE(ZZ0EFF_FULL (0))
01213     ALLOCATE(ZZS_FULL    (0))
01214   ENDIF
01215   CALL GATHER_AND_WRITE_MPI(ZSEA,ZSEA_FULL) 
01216   CALL GATHER_AND_WRITE_MPI(ZWATER,ZWATER_FULL)
01217   CALL GATHER_AND_WRITE_MPI(ZNATURE,ZNATURE_FULL)
01218   CALL GATHER_AND_WRITE_MPI(ZTOWN,ZTOWN_FULL)
01219   CALL GATHER_AND_WRITE_MPI(ZZ0,ZZ0_FULL)
01220   CALL GATHER_AND_WRITE_MPI(ZZ0EFF,ZZ0EFF_FULL)
01221   CALL GATHER_AND_WRITE_MPI(ZZS,ZZS_FULL)
01222 
01223   IF (NRANK==NPIO) THEN
01224     WRITE(*,'(A32,I4,A3,I4)') ' GRID BOXES CONTAINING SEA    : ',COUNT( ZSEA_FULL    (:) > 0. ),' / ',ISIZE
01225     WRITE(*,'(A32,I4,A3,I4)') ' GRID BOXES CONTAINING WATER  : ',COUNT( ZWATER_FULL  (:) > 0. ),' / ',ISIZE
01226     WRITE(*,'(A32,I4,A3,I4)') ' GRID BOXES CONTAINING NATURE : ',COUNT( ZNATURE_FULL (:) > 0. ),' / ',ISIZE
01227     WRITE(*,'(A32,I4,A3,I4)') ' GRID BOXES CONTAINING TOWN   : ',COUNT( ZTOWN_FULL   (:) > 0. ),' / ',ISIZE
01228     WRITE(*,*)'ZZ0    = ',ZZ0_FULL
01229     WRITE(*,*)'ZZ0EFF = ',ZZ0EFF_FULL
01230     WRITE(*,*)'ZZS = ',ZZS_FULL
01231     WRITE(*,*)'MINVAL(ZZS) = ',MINVAL(ZZS_FULL),' MAXVAL(ZZS) = ',MAXVAL(ZZS_FULL)
01232   ENDIF
01233   !
01234   DEALLOCATE( ZSEA       )
01235   DEALLOCATE( ZWATER     )
01236   DEALLOCATE( ZNATURE    )
01237   DEALLOCATE( ZTOWN      )
01238   DEALLOCATE( ZT2M       )
01239   DEALLOCATE( ZQ2M       )
01240   DEALLOCATE( ZZ0        )
01241   DEALLOCATE( ZZ0H       )
01242   DEALLOCATE( ZQS_SEA    )
01243   DEALLOCATE( ZQS_WATER  )
01244   DEALLOCATE( ZQS_NATURE )
01245   DEALLOCATE( ZQS_TOWN   )
01246   DEALLOCATE( ZQS        )
01247   DEALLOCATE( ZPSNG      )
01248   DEALLOCATE( ZPSNV      )
01249   DEALLOCATE( ZZ0EFF     )
01250   DEALLOCATE( ZZS        )
01251   !
01252   DEALLOCATE(ZSEA_FULL   )
01253   DEALLOCATE(ZWATER_FULL )
01254   DEALLOCATE(ZNATURE_FULL)
01255   DEALLOCATE(ZTOWN_FULL  )
01256   DEALLOCATE(ZZ0_FULL    )
01257   DEALLOCATE(ZZ0EFF_FULL )
01258   DEALLOCATE(ZZS_FULL    )
01259   !
01260 ENDIF   
01261 !
01262 ! --------------------------------------------------------------------------------------
01263 !
01264 IF (CFORCING_FILETYPE=='ASCII ' .OR. CFORCING_FILETYPE=='BINARY') CALL OPEN_CLOSE_BIN_ASC_FORC('CLOSE',CFORCING_FILETYPE,'R')
01265 !
01266 IF (CFORCING_FILETYPE=='NETCDF') CALL CLOSE_FILEIN_OL
01267 IF (CTIMESERIES_FILETYPE=='OFFLIN') CALL CLOSE_FILEOUT_OL
01268 !
01269 !
01270 !*    5.     Close parallelized I/O
01271 !            ----------------------
01272 CLOSE(ILUOUT)
01273 !
01274 IF (NRANK==NPIO) THEN
01275   WRITE(*,*) ' '
01276   WRITE(*,*) '    --------------------------'
01277   WRITE(*,*) '    | OFFLINE ENDS CORRECTLY |'
01278   WRITE(*,*) '    --------------------------'
01279   WRITE(*,*) ' '
01280 ENDIF
01281 !
01282  CALL DEALLOC_SURFEX
01283 !
01284 IF (ALLOCATED(NINDEX)) DEALLOCATE(NINDEX)
01285 IF (ALLOCATED(NSIZE_TASK)) DEALLOCATE(NSIZE_TASK)
01286 !
01287 IF (ASSOCIATED(NWORK)) DEALLOCATE(NWORK)
01288 IF (ASSOCIATED(XWORK)) DEALLOCATE(XWORK)
01289 IF (ASSOCIATED(XWORK2)) DEALLOCATE(XWORK2)
01290 !
01291 IF (LHOOK) CALL DR_HOOK('OFFLINE',1,ZHOOK_HANDLE)
01292 !
01293 #ifndef NOMPI
01294  CALL MPI_FINALIZE(INFOMPI)
01295 #endif
01296 !
01297 ! --------------------------------------------------------------------------------------
01298 !
01299 END PROGRAM OFFLINE