SURFEX v7.3
General documentation of Surfex
|
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