SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/soda.F90
Go to the documentation of this file.
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