SURFEX v7.3
General documentation of Surfex
|
00001 ! 00002 ! ***************************************************************************************** 00003 PROGRAM SODA 00004 ! ****************************************************************************************** 00005 ! ------------------------------------------------------------------------------------------ 00006 !! 00007 !! SODA: SURFEX Offline Data Assimilation 00008 !! 00009 !! PURPOSE 00010 !! ------- 00011 !! Program to perform surface data within SURFEX 00012 !! 00013 !! 00014 !! METHOD 00015 !! ------ 00016 !! Different methods for different tiles 00017 !! 00018 !! EXTERNAL 00019 !! -------- 00020 !! 00021 !! IMPLICIT ARGUMENTS 00022 !! ------------------ 00023 !! 00024 !! REFERENCE 00025 !! --------- 00026 !! 00027 !! AUTHOR 00028 !! ------ 00029 !! 00030 !! T. Aspelien met.no 00031 !! 00032 !! MODIFICATION 00033 !! ------------ 00034 !! 00035 !! Original 04/2012 00036 !! 00037 !---------------------------------------------------------------------------- 00038 ! 00039 USE MODD_SURFEX_OMP, ONLY : NINDX2, NWORK, XWORK, XWORK2 00040 ! 00041 USE MODD_TYPE_DATE_SURF, ONLY : DATE_TIME 00042 USE MODD_SURF_PAR, ONLY : XUNDEF,NUNDEF 00043 USE MODD_ASSIM, ONLY : LAROME,LALADSURF,LPRT,LSIM,LBEV,CASSIM_ISBA 00044 ! 00045 USE MODD_FORC_ATM, ONLY : CSV ,&! name of all scalar variables 00046 XDIR_ALB ,&! direct albedo for each band 00047 XSCA_ALB ,&! diffuse albedo for each band 00048 XEMIS ,&! emissivity 00049 XTSRAD ,&! radiative temperature 00050 XTSUN ,&! solar time (s from midnight) 00051 XZS ,&! orography (m) 00052 XZREF ,&! height of T,q forcing (m) 00053 XUREF ,&! height of wind forcing (m) 00054 XTA ,&! air temperature forcing (K) 00055 XQA ,&! air humidity forcing (kg/m3) 00056 XSV ,&! scalar variables 00057 XU ,&! zonal wind (m/s) 00058 XV ,&! meridian wind (m/s) 00059 XSW_BANDS ,&! mean wavelength of each shortwave band (m) 00060 XZENITH ,&! zenithal angle (radian from the vertical) 00061 XAZIM ,&! azimuthal angle (radian from North, clockwise) 00062 XCO2 ,&! CO2 concentration in the air (kg/m3) 00063 XRHOA ! air density at the surface (kg/m3) 00064 ! 00065 USE MODD_SURF_ATM_n, ONLY : NDIM_NATURE 00066 ! 00067 #ifdef ASC 00068 USE MODD_IO_SURF_ASC, ONLY : CFILEIN,CFILEIN_SAVE,& 00069 CFILEPGD 00070 #endif 00071 #ifdef FA 00072 USE MODD_IO_SURF_FA, ONLY : CFILEIN_FA,CFILEIN_FA_SAVE,& 00073 CFILEPGD_FA,CDNOMC 00074 #endif 00075 #ifdef LFI 00076 USE MODD_IO_SURF_LFI, ONLY : CFILEIN_LFI,CFILEIN_LFI_SAVE,& 00077 CFILEPGD_LFI,CFILE_LFI,CLUOUT_LFI 00078 #endif 00079 ! 00080 USE MODN_IO_OFFLINE, ONLY : NAM_IO_OFFLINE,CNAMELIST,CPGDFILE,CPREPFILE,& 00081 CSURF_FILETYPE,LLAND_USE,LRESTART 00082 ! 00083 USE MODE_POS_SURF, ONLY : POSNAM 00084 ! 00085 USE YOMHOOK, ONLY : LHOOK,DR_HOOK 00086 USE PARKIND1, ONLY : JPRB 00087 ! 00088 USE MODI_ALLOC_SURFEX 00089 USE MODI_GET_LUOUT 00090 USE MODI_OPEN_NAMELIST 00091 USE MODI_CLOSE_NAMELIST 00092 USE MODI_ABOR1_SFX 00093 USE MODI_INIT_IO_SURF_n 00094 USE MODI_READ_SURF 00095 USE MODI_END_IO_SURF_n 00096 USE MODI_READ_ALL_NAMELISTS 00097 USE MODI_GOTO_SURFEX 00098 USE MODI_GOTO_TRIP 00099 USE MODI_INIT_SURF_ATM_n 00100 USE MODI_INIT_SURF_TRIP_n 00101 USE MODI_ASSIM_NATURE_ISBA_EKF 00102 USE MODI_IO_BUFF_CLEAN_n 00103 USE MODI_ASSIM_SURF_ATM_n 00104 USE MODI_DEALLOC_SURFEX 00105 ! 00106 IMPLICIT NONE 00107 ! 00108 !* 0. Declaration of local variables 00109 ! ------------------------------ 00110 ! 00111 CHARACTER(LEN=3), PARAMETER :: YINIT = 'ALL' 00112 CHARACTER(LEN=2), PARAMETER :: YTEST = 'OK' ! must be equal to 'OK' 00113 INTEGER :: ILUOUT 00114 INTEGER :: ILUNAM 00115 INTEGER :: IYEAR, IMONTH, IDAY,IHOUR,NSSSSS,ndaysec 00116 REAL :: ZTIME 00117 LOGICAL :: GFOUND 00118 CHARACTER(LEN=28) :: YATMFILE =' ' ! name of the Atmospheric file 00119 CHARACTER(LEN=6) :: YATMFILETYPE =' ' ! type of the Atmospheric file 00120 CHARACTER(LEN=28) :: YLUOUT ='LISTING_SODA ' ! name of listing 00121 INTEGER :: IRET, INB 00122 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00123 REAL :: ZTIMEC ! current duration since start of the run (s) 00124 REAL,ALLOCATABLE, DIMENSION(:) :: PCON_RAIN ! Amount of convective liquid precipitation 00125 REAL,ALLOCATABLE, DIMENSION(:) :: PSTRAT_RAIN ! Amount of stratiform liquid precipitation 00126 REAL,ALLOCATABLE, DIMENSION(:) :: PCON_SNOW ! Amount of convective solid precipitation 00127 REAL,ALLOCATABLE, DIMENSION(:) :: PSTRAT_SNOW ! Amount of stratiform solid precipitation 00128 REAL,ALLOCATABLE, DIMENSION(:) :: PCON_GRAUPEL ! Amount of convective graupel pecipitation (AROME) 00129 REAL,ALLOCATABLE, DIMENSION(:) :: PCLOUDS ! Cloudcover 00130 REAL,ALLOCATABLE, DIMENSION(:) :: PLSM ! Land-Sea mask 00131 REAL,ALLOCATABLE, DIMENSION(:) :: PEVAPTR ! Evaporation 00132 REAL,ALLOCATABLE, DIMENSION(:) :: PEVAP ! Evaporation 00133 REAL,ALLOCATABLE, DIMENSION(:) :: PTSC ! Climatological surface temperature 00134 REAL,ALLOCATABLE, DIMENSION(:) :: PSWEC ! Climatological snow water equvivalent (amount of snow on the ground) 00135 REAL,ALLOCATABLE, DIMENSION(:) :: PTS ! Surface temperature 00136 REAL,ALLOCATABLE, DIMENSION(:) :: PT2M ! Screen level temperature 00137 REAL,ALLOCATABLE, DIMENSION(:) :: PHU2M ! Screen level relative humidity 00138 REAL,ALLOCATABLE, DIMENSION(:) :: PSWE ! Snow water equvivalent (amount of snow on the ground) 00139 TYPE (DATE_TIME) :: TTIME ! Current date and time 00140 CHARACTER(LEN=6) :: YPROGRAM2 = 'FA ' 00141 INTEGER :: INI ! grid dimension 00142 INTEGER :: KSV ! Number of scalar species 00143 INTEGER :: KSW ! Number of radiative bands 00144 INTEGER :: ITRIP_COUNT ! day counter 00145 INTEGER :: IRESP ! Response value 00146 INTEGER :: ITRIP_MONTH ! mont counter for TRIP 00147 REAL :: ZDURATION ! duration of run (s) 00148 INTEGER :: I 00149 00150 IF (LHOOK) CALL DR_HOOK('SODA',0,ZHOOK_HANDLE) 00151 00152 WRITE(*,*) 00153 WRITE(*,*) ' ------------------------------------' 00154 WRITE(*,*) ' | SODA |' 00155 WRITE(*,*) ' | SURFEX OFFLINE DATA ASSIMILATION |' 00156 WRITE(*,*) ' ------------------------------------' 00157 WRITE(*,*) 00158 00159 ! Allocate SURFEX 00160 CALL ALLOC_SURFEX(1) 00161 00162 ! Open ascii outputfile for writing 00163 #ifdef LFI 00164 CLUOUT_LFI = ADJUSTL(ADJUSTR(YLUOUT)//'.txt') 00165 #endif 00166 CALL GET_LUOUT('LFI ',ILUOUT) 00167 OPEN(UNIT=ILUOUT,FILE=ADJUSTL(ADJUSTR(YLUOUT)//'.txt'),FORM='FORMATTED',ACTION='WRITE') 00168 00169 ! Read offline specific things 00170 CALL OPEN_NAMELIST('ASCII ',ILUNAM,CNAMELIST) 00171 CALL POSNAM(ILUNAM,'NAM_IO_OFFLINE',GFOUND) 00172 IF (GFOUND) READ (UNIT=ILUNAM,NML=NAM_IO_OFFLINE) 00173 CALL CLOSE_NAMELIST('ASCII ',ILUNAM) 00174 00175 ! Setting input files read from namelist 00176 if ( CSURF_FILETYPE == "LFI " ) then 00177 #ifdef LFI 00178 CFILEIN_LFI = CPREPFILE 00179 CFILE_LFI = CPREPFILE 00180 CFILEIN_LFI_SAVE = CPREPFILE 00181 CFILEPGD_LFI = CPGDFILE 00182 #endif 00183 elseif ( CSURF_FILETYPE == "FA " ) then 00184 #ifdef FA 00185 CFILEIN_FA = ADJUSTL(ADJUSTR(CPREPFILE)//'.fa') 00186 CFILEIN_FA_SAVE = ADJUSTL(ADJUSTR(CPREPFILE)//'.fa') 00187 CFILEPGD_FA = ADJUSTL(ADJUSTR(CPGDFILE)//'.fa') 00188 #endif 00189 elseif ( CSURF_FILETYPE == "ASCII " ) then 00190 #ifdef ASC 00191 CFILEIN = ADJUSTL(ADJUSTR(CPREPFILE)//'.txt') 00192 CFILEIN_SAVE = ADJUSTL(ADJUSTR(CPREPFILE)//'.txt') 00193 CFILEPGD = ADJUSTL(ADJUSTR(CPGDFILE)//'.txt') 00194 #endif 00195 else 00196 CALL ABOR1_SFX(TRIM(CSURF_FILETYPE)//" is not implemented!") 00197 endif 00198 00199 00200 ! Reading all namelist (also assimilation) 00201 CALL READ_ALL_NAMELISTS(CSURF_FILETYPE,'ALL',.FALSE.) 00202 00203 ! Go to SURFEX 00204 CALL GOTO_SURFEX(1,.TRUE.) 00205 CALL GOTO_TRIP(1,.TRUE.) 00206 00207 ! Initialize time information 00208 IYEAR = NUNDEF 00209 IMONTH = NUNDEF 00210 IDAY = NUNDEF 00211 ZTIME = XUNDEF 00212 CALL INIT_IO_SURF_n(CSURF_FILETYPE,'FULL ','SURF ','READ ') 00213 CALL READ_SURF(CSURF_FILETYPE,'DIM_FULL ',INI, IRESP) 00214 CALL READ_SURF(CSURF_FILETYPE,'DTCUR ',TTIME, IRESP) 00215 CALL END_IO_SURF_n(CSURF_FILETYPE) 00216 00217 NINDX2 = INI 00218 ALLOCATE(NWORK(INI)) 00219 ALLOCATE(XWORK(INI)) 00220 ALLOCATE(XWORK2(INI,10)) 00221 00222 IYEAR = TTIME%TDATE%YEAR 00223 IMONTH = TTIME%TDATE%MONTH 00224 IDAY = TTIME%TDATE%DAY 00225 ZTIME = TTIME%TIME 00226 IF (ZTIME > NDAYSEC) ZTIME = ZTIME - NDAYSEC 00227 00228 KSW=0 00229 KSV=0 00230 ALLOCATE(CSV(KSV)) 00231 ALLOCATE(XCO2(INI)) 00232 ALLOCATE(XRHOA(INI)) 00233 ALLOCATE(XZENITH(INI)) 00234 ALLOCATE(XAZIM(INI)) 00235 ALLOCATE(XSW_BANDS(KSW)) 00236 ALLOCATE(XDIR_ALB(INI,KSW)) 00237 ALLOCATE(XSCA_ALB(INI,KSW)) 00238 ALLOCATE(XEMIS(INI)) 00239 ALLOCATE(XTSRAD(INI)) 00240 00241 WRITE(*,*) "INITIALIZING SURFEX..." 00242 ! Initialize the SURFEX interface 00243 CALL INIT_SURF_ATM_n(CSURF_FILETYPE,YINIT, LLAND_USE, & 00244 INI, kSV, KSW, & 00245 CSV,XCO2,XRHOA, & 00246 XZENITH,XAZIM,XSW_BANDS,XDIR_ALB,XSCA_ALB, & 00247 XEMIS,XTSRAD, & 00248 IYEAR, IMONTH, IDAY, ZTIME, & 00249 YATMFILE, YATMFILETYPE, YTEST ) 00250 00251 ! Initialyse the SURFACE-TRIP interface 00252 CALL INIT_SURF_TRIP_n(CSURF_FILETYPE,INI,KSW,LRESTART,IYEAR,IMONTH,& 00253 ZDURATION,ITRIP_MONTH,ITRIP_COUNT,XZENITH, & 00254 XSW_BANDS,XEMIS,XTSRAD,XDIR_ALB,XSCA_ALB ) 00255 00256 ! For EKF we only need CANARI FA fields for the analysis 00257 ! To save time we can do LPRT LSIM and LBEV without needing CANARI results 00258 IF (( CASSIM_ISBA == 'EKF ' ) .AND. ( ( LPRT ) .OR. ( LSIM ) .OR. ( LBEV ) )) THEN 00259 ALLOCATE(PT2M(NDIM_NATURE)) 00260 ALLOCATE(PHU2M(NDIM_NATURE)) 00261 PT2M=999.0 00262 PHU2M=999.0 00263 CALL ASSIM_NATURE_ISBA_EKF(CSURF_FILETYPE, NDIM_NATURE,& 00264 PT2M, PHU2M, & 00265 YTEST ) 00266 DEALLOCATE(PT2M) 00267 DEALLOCATE(PHU2M) 00268 ELSE 00269 WRITE(*,*) "READING input files..." 00270 ! Normal reading of needed FA fields 00271 ALLOCATE(PCON_RAIN(INI)) 00272 ALLOCATE(PSTRAT_RAIN(INI)) 00273 ALLOCATE(PCON_SNOW(INI)) 00274 ALLOCATE(PSTRAT_SNOW(INI)) 00275 ALLOCATE(PCON_GRAUPEL(INI)) 00276 ALLOCATE(PCLOUDS(INI)) 00277 ALLOCATE(PLSM(INI)) 00278 ALLOCATE(PEVAPTR(INI)) 00279 ALLOCATE(PEVAP(INI)) 00280 ALLOCATE(PTSC(INI)) 00281 ALLOCATE(PSWEC(INI)) 00282 ALLOCATE(PTS(INI)) 00283 ALLOCATE(PT2M(INI)) 00284 ALLOCATE(PHU2M(INI)) 00285 ALLOCATE(PSWE(INI)) 00286 00287 ! Read atmospheric forecast fields from FA files 00288 #ifdef FA 00289 CFILEIN_FA = 'FG_OI_MAIN' 00290 #endif 00291 ! Open FA file (LAM version with extension zone) 00292 CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF ','READ ') 00293 00294 ! Read model forecast quantities 00295 IF (LAROME) THEN 00296 CALL READ_SURF(YPROGRAM2,'SURFACCPLUIE', PCON_RAIN ,IRESP) 00297 CALL READ_SURF(YPROGRAM2,'SURFACCNEIGE', PCON_SNOW ,IRESP) 00298 CALL READ_SURF(YPROGRAM2,'SURFACCGRAUPEL', PCON_GRAUPEL ,IRESP) 00299 ELSE 00300 CALL READ_SURF(YPROGRAM2,'SURFPREC.EAU.CON',PCON_RAIN ,IRESP) 00301 CALL READ_SURF(YPROGRAM2,'SURFPREC.EAU.GEC',PSTRAT_RAIN ,IRESP) 00302 CALL READ_SURF(YPROGRAM2,'SURFPREC.NEI.CON',PCON_SNOW ,IRESP) 00303 CALL READ_SURF(YPROGRAM2,'SURFPREC.NEI.GEC',PSTRAT_SNOW ,IRESP) 00304 ENDIF 00305 CALL READ_SURF(YPROGRAM2,'ATMONEBUL.BASSE ',PCLOUDS,IRESP) 00306 CALL READ_SURF(YPROGRAM2,'SURFIND.TERREMER',PLSM ,IRESP) 00307 CALL READ_SURF(YPROGRAM2,'SURFFLU.LAT.MEVA',PEVAP ,IRESP) ! accumulated fluxes (not available in LFI) 00308 IF (.NOT.LALADSURF) THEN 00309 CALL READ_SURF(YPROGRAM2,'SURFXEVAPOTRANSP',PEVAPTR,IRESP) ! not in ALADIN SURFEX 00310 ELSE 00311 PEVAPTR(:) = 0.0 00312 ENDIF 00313 00314 ! Close FA file 00315 CALL END_IO_SURF_n(YPROGRAM2) 00316 CALL IO_BUFF_CLEAN_n 00317 WRITE(*,*)'READ FG_OI_MAIN OK' 00318 00319 ! Define FA file name for CANARI analysis 00320 #ifdef FA 00321 CFILEIN_FA = 'CANARI' ! input CANARI analysis 00322 #endif 00323 00324 ! Open FA file 00325 CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF ','READ ') 00326 00327 ! Read CANARI analysis 00328 CALL READ_SURF(YPROGRAM2,'CLSTEMPERATURE ',PT2M ,IRESP) 00329 CALL READ_SURF(YPROGRAM2,'CLSHUMI.RELATIVE',PHU2M,IRESP) 00330 CALL READ_SURF(YPROGRAM2,'SURFTEMPERATURE ',PTS ,IRESP) 00331 CALL READ_SURF(YPROGRAM2,'SURFRESERV.NEIGE',PSWE ,IRESP) 00332 00333 00334 ! Close CANARI file 00335 CALL END_IO_SURF_n(YPROGRAM2) 00336 CALL IO_BUFF_CLEAN_n 00337 WRITE(*,*) 'READ CANARI OK' 00338 00339 ! Define FA file name for surface climatology 00340 #ifdef FA 00341 CFILEIN_FA = 'clim_isba' ! input climatology 00342 CDNOMC = 'climat' ! new frame name 00343 #endif 00344 00345 ! Open FA file 00346 CALL INIT_IO_SURF_n(YPROGRAM2,'EXTZON','SURF ','READ ') 00347 00348 ! Read climatology file 00349 CALL READ_SURF(YPROGRAM2,'SURFRESERV.NEIGE',PSWEC ,IRESP) 00350 CALL READ_SURF(YPROGRAM2,'SURFTEMPERATURE',PTSC ,IRESP) 00351 00352 ! Close climatology file 00353 CALL END_IO_SURF_n(YPROGRAM2) 00354 CALL IO_BUFF_CLEAN_n 00355 WRITE(*,*) 'READ CLIMATOLOGY OK' 00356 00357 WRITE(*,*) 'PERFORMIMG OFFLINE SURFEX DATA ASSIMILATION...' 00358 CALL ASSIM_SURF_ATM_n(CSURF_FILETYPE,INI, & 00359 PCON_RAIN, PSTRAT_RAIN, PCON_SNOW, PSTRAT_SNOW, & 00360 PCLOUDS, PLSM, PEVAPTR, PEVAP, & 00361 PSWEC, PTSC, & 00362 PTS, PT2M, PHU2M, PSWE, & 00363 YTEST ) 00364 00365 00366 DEALLOCATE(PCON_RAIN) 00367 DEALLOCATE(PSTRAT_RAIN) 00368 DEALLOCATE(PCON_SNOW) 00369 DEALLOCATE(PSTRAT_SNOW) 00370 DEALLOCATE(PCON_GRAUPEL) 00371 DEALLOCATE(PCLOUDS) 00372 DEALLOCATE(PLSM) 00373 DEALLOCATE(PEVAPTR) 00374 DEALLOCATE(PEVAP) 00375 DEALLOCATE(PTSC) 00376 DEALLOCATE(PSWEC) 00377 DEALLOCATE(PTS) 00378 DEALLOCATE(PT2M) 00379 DEALLOCATE(PHU2M) 00380 DEALLOCATE(PSWE) 00381 00382 ENDIF 00383 ! 00384 !* 3. Close parallelized I/O 00385 ! ---------------------- 00386 ! 00387 WRITE(ILUOUT,*) ' ' 00388 WRITE(ILUOUT,*) ' -----------------------' 00389 WRITE(ILUOUT,*) ' | SODA ENDS CORRECTLY |' 00390 WRITE(ILUOUT,*) ' -----------------------' 00391 ! 00392 WRITE(*,*) ' ' 00393 WRITE(*,*) ' -----------------------' 00394 WRITE(*,*) ' | SODA ENDS CORRECTLY |' 00395 WRITE(*,*) ' -----------------------' 00396 ! 00397 CLOSE(ILUOUT) 00398 ! 00399 DEALLOCATE(NWORK) 00400 DEALLOCATE(XWORK) 00401 DEALLOCATE(XWORK2) 00402 ! 00403 CALL DEALLOC_SURFEX 00404 IF (LHOOK) CALL DR_HOOK('SODA',1,ZHOOK_HANDLE) 00405 ! 00406 !------------------------------------------------------------------------------- 00407 ! 00408 END PROGRAM SODA