53 nwork_full, xwork_full, xwork2_full, nwork2, &
63 USE modd_assim, ONLY : lassim, larome, laladsurf, cassim_isba, nvar, xf, xf_patch, &
64 nobstype, xat2m_isba, xahu2m_isba, cvar, cobs, nechgu, xi, &
65 xlai_pass, xbio_pass, cbio, nivar, xyo, nific, nprintlev, &
66 nobs, nprintlev, lread_all, nens,lbias_correction, &
67 lextrap_sea,lextrap_water,lextrap_nature,lobsheader,nobsmax, &
68 cfile_format_fg,cfile_format_lsm,cfile_format_obs,cfile_format_clim,&
69 nnco,lwatertg2,lobsnat
71 USE modd_forc_atm, ONLY : csv, xdir_alb, xsca_alb, xemis, xtsrad, xtsun, xzs, &
72 xzref, xuref, xta, xqa, xsv, xu, xv, xsw_bands, &
73 xzenith, xazim, xco2, xrhoa, xtsurf
78 USE modd_io_surf_ol, ONLY : xstart, xcount, xstride, xstartw, xcountw, ltime_written, &
79 ldefined_nature, ldefined_sea, ldefined_water, &
80 ldefined_town, ldefined_surf_atm, lpartw
85 USE modd_io_surf_nc, ONLY : cfilein_nc, cfilein_nc_save, cfilepgd_nc, cfileout_nc, ldef, &
89 USE modd_io_surf_asc, ONLY : cfilein, cfilein_save, cfilepgd, cfileout, lcreated
92 USE modd_io_surf_fa, ONLY : cfilein_fa, cfilein_fa_save, cfilepgd_fa, cdnomc, cfileout_fa, &
93 nunit_fa, iverbfa, lfanocompact
97 cfilepgd_lfi, cfile_lfi, cluout_lfi, cfileout_lfi
100 USE modn_io_offline, ONLY : nam_io_offline, cnamelist, cpgdfile, cprepfile, csurffile, &
101 csurf_filetype, ctimeseries_filetype, lland_use, yalg_mpi, &
102 ldiag_fa_nocompact, lout_timename, xio_frac, lrestart_2m
106 USE modi_dealloc_surf_atm_n
107 USE modi_init_output_ol_n
108 USE modi_set_surfex_filein
109 USE modi_init_index_mpi
114 USE modi_open_namelist
115 USE modi_close_namelist
116 USE modi_read_all_namelists
117 USE modi_init_io_surf_n
118 USE modi_end_io_surf_n
120 USE modi_io_buff_clean
121 USE modi_get_size_full_n
122 USE modi_init_surf_atm_n
123 USE modi_assim_surf_atm_n
124 USE modi_write_surf_atm_n
125 USE modi_write_diag_surf_atm_n
126 USE modi_assim_set_sst
127 USE modi_add_forecast_to_date_surf
129 USE modi_flag_diag_update
131 USE modi_init_output_nc_n
132 USE modi_close_fileout_ol
136 USE yomhook
, ONLY : lhook,dr_hook
137 USE parkind1
, ONLY : jprb
148 CHARACTER(LEN=200) :: ymfile
149 CHARACTER(LEN=3) :: yinit
150 CHARACTER(LEN=2),
PARAMETER :: ytest =
'OK'
151 CHARACTER(LEN=28) :: yatmfile =
' '
152 CHARACTER(LEN=6) :: yatmfiletype =
' '
153 CHARACTER(LEN=28) :: yluout =
'LISTING_SODA '
154 CHARACTER(LEN=6) :: yprogram2 =
'FA '
155 CHARACTER(LEN=28) :: yfilein
156 CHARACTER(LEN=3) :: yvar
158 CHARACTER(LEN=100) :: yname
159 CHARACTER(LEN=10) :: yrank
160 CHARACTER(LEN=3) :: yens
161 CHARACTER(LEN=10),
DIMENSION(:),
ALLOCATABLE :: cobsinfile
163 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: zyo_nat
164 REAL,
ALLOCATABLE,
DIMENSION(:) :: znature
166 REAL,
ALLOCATABLE,
DIMENSION(:,:) :: zwork
167 REAL,
ALLOCATABLE,
DIMENSION(:) :: zlsm
168 REAL,
ALLOCATABLE,
DIMENSION(:) :: zcon_rain
169 REAL,
ALLOCATABLE,
DIMENSION(:) :: zstrat_rain
170 REAL,
ALLOCATABLE,
DIMENSION(:) :: zcon_snow
171 REAL,
ALLOCATABLE,
DIMENSION(:) :: zstrat_snow
172 REAL,
ALLOCATABLE,
DIMENSION(:) :: zclouds
173 REAL,
ALLOCATABLE,
DIMENSION(:) :: zevaptr
174 REAL,
ALLOCATABLE,
DIMENSION(:) :: zevap
175 REAL,
ALLOCATABLE,
DIMENSION(:) :: ztsc
176 REAL,
ALLOCATABLE,
DIMENSION(:) :: zts
177 REAL,
ALLOCATABLE,
DIMENSION(:) :: zt2m
178 REAL,
ALLOCATABLE,
DIMENSION(:) :: zhu2m
179 REAL,
ALLOCATABLE,
DIMENSION(:) :: zsnc
180 REAL,
ALLOCATABLE,
DIMENSION(:) :: zswe
181 REAL,
ALLOCATABLE,
DIMENSION(:) :: zswec
182 REAL,
ALLOCATABLE,
DIMENSION(:) :: zucls
183 REAL,
ALLOCATABLE,
DIMENSION(:) :: zvcls
184 REAL,
ALLOCATABLE,
DIMENSION(:) :: zsst
185 REAL,
ALLOCATABLE,
DIMENSION(:) :: zsic
186 REAL,
ALLOCATABLE,
DIMENSION(:) :: zlat
187 REAL,
ALLOCATABLE,
DIMENSION(:) :: zlon
192 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: gd_maskext
193 LOGICAL :: glkeepextzone
198 CHARACTER(LEN=14) :: ytag
200 INTEGER,
DIMENSION(11) :: idatef
204 INTEGER :: iyear, imonth, iday, ihour
205 INTEGER :: iyear_out, imonth_out, iday_out
206 INTEGER :: jl,ji,jj,inb,icpt
213 INTEGER :: iret, inbfa
214 INTEGER :: iresp, istat
215 INTEGER :: infompi, ilevel
216 INTEGER :: isize, iens, isize_full
220 INTEGER :: i2m, ibeq, idsteq
221 LOGICAL :: gfrac, gdiag_grid, gsurf_budget, grad_budget, gcoef, &
222 gsurf_vars, gdiag_ocean, gdiag_seaice, gwater_profile, &
223 gsurf_evap_budget, gflood, gpgd_isba, gch_no_flux_isba,&
224 gsurf_misc_budget_isba, gpgd_teb, gsurf_misc_budget_teb
226 REAL(KIND=JPRB) :: zhook_handle
232 CALL mpi_init_thread(mpi_thread_multiple,ilevel,infompi)
235 IF (lhook) CALL dr_hook(
'SODA',0,zhook_handle)
240 ncomm = mpi_comm_world
241 CALL mpi_comm_size(ncomm,nproc,infompi)
242 CALL mpi_comm_rank(ncomm,nrank,infompi)
249 IF (nrank==npio)
THEN
251 WRITE(*,*)
' ------------------------------------'
252 WRITE(*,*)
' | SODA |'
253 WRITE(*,*)
' | SURFEX OFFLINE DATA ASSIMILATION |'
254 WRITE(*,*)
' ------------------------------------'
258 WRITE(yrank,fmt=
'(I10)') nrank
259 yname=trim(yluout)//adjustl(yrank)
263 cluout_lfi = adjustl(adjustr(yluout)//
'.txt')
266 cluout_nc = adjustl(adjustr(yluout)//
'.txt')
269 OPEN(unit=iluout,file=adjustl(adjustr(yname)//
'.txt'),form=
'FORMATTED',action=
'WRITE')
273 CALL
posnam(ilunam,
'NAM_IO_OFFLINE',gfound)
274 IF (gfound)
READ (unit=ilunam,nml=nam_io_offline)
280 xio_frac = max(min(xio_frac,1.),0.)
284 CALL
test_nam_var_surf(iluout,
'CSURF_FILETYPE',csurf_filetype,
'ASCII ',
'LFI ',
'FA ',
'NC ')
285 CALL
test_nam_var_surf(iluout,
'CTIMESERIES_FILETYPE',ctimeseries_filetype,
'NETCDF',
'TEXTE ',
'BINARY',&
286 'ASCII ',
'LFI ',
'FA ',&
287 'NONE ',
'OFFLIN',
'NC ')
289 IF (ctimeseries_filetype==
'NETCDF') ctimeseries_filetype=
'OFFLIN'
292 IF ( csurf_filetype ==
"LFI " )
THEN
294 cfilein_lfi = cprepfile
295 cfile_lfi = cprepfile
296 cfilein_lfi_save = cprepfile
297 cfilepgd_lfi = cpgdfile
299 ELSEIF ( csurf_filetype ==
"FA " )
THEN
301 cfilein_fa = adjustl(adjustr(cprepfile)//
'.fa')
302 cfilein_fa_save = adjustl(adjustr(cprepfile)//
'.fa')
303 cfilepgd_fa = adjustl(adjustr(cpgdfile)//
'.fa')
305 ELSEIF ( csurf_filetype ==
"ASCII " )
THEN
307 cfilein = adjustl(adjustr(cprepfile)//
'.txt')
308 cfilein_save = adjustl(adjustr(cprepfile)//
'.txt')
309 cfilepgd = adjustl(adjustr(cpgdfile)//
'.txt')
311 ELSEIF ( csurf_filetype ==
"NC " )
THEN
313 cfilein_nc = adjustl(adjustr(cprepfile)//
'.nc')
314 cfilein_nc_save = adjustl(adjustr(cprepfile)//
'.nc')
315 cfilepgd_nc = adjustl(adjustr(cpgdfile)//
'.nc')
318 CALL
abor1_sfx(trim(csurf_filetype)//
" is not implemented!")
323 ysurf_cur => ysurf_list(1)
327 csurf_filetype,
'ALL',.false.)
333 cprogname = csurf_filetype
337 IF (nrank==npio)
THEN
345 ldefined_surf_atm = .false.
346 ldefined_nature = .false.
347 ldefined_town = .false.
348 ldefined_water = .false.
349 ldefined_sea = .false.
354 csurf_filetype, yalg_mpi, xio_frac, .false.)
364 csurf_filetype,
'FULL ',
'SURF ',
'READ ')
366 csurf_filetype,
'DIM_FULL ',idim_full, iresp)
368 csurf_filetype,
'DTCUR ',ttime, iresp)
373 IF (
ALLOCATED(nmask_full))
DEALLOCATE(nmask_full)
378 ALLOCATE(xco2(isize_full))
379 ALLOCATE(xrhoa(isize_full))
380 ALLOCATE(xzenith(isize_full))
381 ALLOCATE(xazim(isize_full))
382 ALLOCATE(xsw_bands(isw))
383 ALLOCATE(xdir_alb(isize_full,isw))
384 ALLOCATE(xsca_alb(isize_full,isw))
385 ALLOCATE(xemis(isize_full))
386 ALLOCATE(xtsrad(isize_full))
387 ALLOCATE(xtsurf(isize_full))
396 IF ( .NOT. lassim ) CALL
abor1_sfx(
"YOU CAN'T RUN SODA WITHOUT SETTING LASSIM=.TRUE. IN THE ASSIM NAMELIST")
401 IF ( cassim_isba ==
'EKF ' )
THEN
406 ELSEIF ( cassim_isba ==
'ENKF ' )
THEN
408 IF (lbias_correction) inb = inb + 1
412 IF (nrank==npio)
WRITE(*,*)
"INITIALIZING SURFEX..."
416 iyear = ttime%TDATE%YEAR
417 imonth = ttime%TDATE%MONTH
418 iday = ttime%TDATE%DAY
420 ihour = nint(ztime/3600.)
431 IF ( cassim_isba ==
'EKF ' .OR. cassim_isba ==
'ENKF ' )
THEN
433 IF (cassim_isba ==
'EKF ')
THEN
434 IF ( nific<inb )
THEN
437 WRITE(yvar,
'(I1.1)') nific-1
438 yfilein = trim(ymfile)//
"_EKF_PERT"//adjustl(yvar)
440 yfilein =
"PREP_INIT"
442 ELSEIF (cassim_isba ==
'ENKF ')
THEN
445 WRITE(yvar,
'(I1.1)') nific
446 yfilein = trim(ymfile)//
"_EKF_ENS"//adjustl(yvar)
455 IF ( (cassim_isba==
'EKF '.OR.cassim_isba==
'ENKF ') .AND. nific==1 ) lread_all = .true.
460 csurf_filetype,yinit, lland_use, isize_full, isv, isw, &
461 csv, xco2, xrhoa, xzenith, xazim, xsw_bands, &
462 xdir_alb, xsca_alb, xemis, xtsrad, xtsurf, &
463 iyear, imonth, iday, ztime, &
464 yatmfile, yatmfiletype, ytest )
466 IF ( cassim_isba==
'EKF ' .OR. cassim_isba==
'ENKF ' )
THEN
468 IF ( nific==inb )
THEN
469 ALLOCATE(xlai_pass(ysurf_cur%U%NSIZE_NATURE,ysurf_cur%IM%I%NPATCH))
470 ALLOCATE(xbio_pass(ysurf_cur%U%NSIZE_NATURE,ysurf_cur%IM%I%NPATCH))
471 IF (cassim_isba==
'EKF ')
ALLOCATE(xi(ysurf_cur%U%NSIZE_NATURE,ysurf_cur%IM%I%NPATCH,isize))
472 ALLOCATE(xf(ysurf_cur%U%NSIZE_NATURE,ysurf_cur%IM%I%NPATCH,isize+1,nvar))
473 ALLOCATE(xf_patch(ysurf_cur%U%NSIZE_NATURE,ysurf_cur%IM%I%NPATCH,isize+1,nobstype))
476 IF ( cassim_isba==
'EKF ' .AND. nific<inb .OR. cassim_isba==
'ENKF ')
THEN
480 DO ji=1,ysurf_cur%IM%I%NPATCH
481 SELECT CASE (trim(cobs(iobs)))
483 xf_patch(:,ji,nific,iobs) = xat2m_isba(:,1)
485 xf_patch(:,ji,nific,iobs) = xahu2m_isba(:,1)
487 xf_patch(:,ji,nific,iobs) = ysurf_cur%IM%I%XWG(:,1,ji)
489 xf_patch(:,ji,nific,iobs) = ysurf_cur%IM%I%XLAI(:,ji)
491 CALL
abor1_sfx(
"Mapping of "//cobs(iobs)//
" is not defined in SODA!")
498 SELECT CASE (trim(cvar(jl)))
500 xf(:,:,nific,jl) = ysurf_cur%IM%I%XTG(:,1,:)
502 xf(:,:,nific,jl) = ysurf_cur%IM%I%XTG(:,2,:)
504 xf(:,:,nific,jl) = ysurf_cur%IM%I%XWG(:,1,:)
506 xf(:,:,nific,jl) = ysurf_cur%IM%I%XWG(:,2,:)
508 xf(:,:,nific,jl) = ysurf_cur%IM%I%XWG(:,3,:)
510 xf(:,:,nific,jl) = ysurf_cur%IM%I%XLAI(:,:)
512 CALL
abor1_sfx(
"Mapping of "//trim(cvar(jl))//
" is not defined in SODA!")
519 IF (trim(cvar(jl))==
"LAI")
THEN
520 IF ( ysurf_cur%IM%I%NPATCH==1 .AND. trim(cbio)/=
"LAI" )
THEN
521 CALL
abor1_sfx(
"Mapping of "//cbio//
" is not defined in EKF with NPATCH=1!")
523 SELECT CASE (trim(cbio))
524 CASE(
"BIOMA1",
"BIOMASS1")
525 xbio_pass(:,:) = ysurf_cur%IM%I%XBIOMASS(:,1,:)
526 CASE(
"BIOMA2",
"BIOMASS2")
527 xbio_pass(:,:) = ysurf_cur%IM%I%XBIOMASS(:,2,:)
528 CASE(
"RESPI1",
"RESP_BIOM1")
529 xbio_pass(:,:) = ysurf_cur%IM%I%XRESP_BIOMASS(:,1,:)
530 CASE(
"RESPI2",
"RESP_BIOM2")
531 xbio_pass(:,:) = ysurf_cur%IM%I%XRESP_BIOMASS(:,2,:)
533 xbio_pass(:,:) = ysurf_cur%IM%I%XLAI(:,:)
535 CALL
abor1_sfx(
"Mapping of "//cbio//
" is not defined in EKF!")
538 xlai_pass(:,:) = ysurf_cur%IM%I%XLAI(:,:)
548 SELECT CASE (trim(cvar(jl)))
550 xi(:,:,jl) = ysurf_cur%IM%I%XTG(:,1,:)
552 xi(:,:,jl) = ysurf_cur%IM%I%XTG(:,2,:)
554 xi(:,:,jl) = ysurf_cur%IM%I%XWG(:,1,:)
556 xi(:,:,jl) = ysurf_cur%IM%I%XWG(:,2,:)
558 xi(:,:,jl) = ysurf_cur%IM%I%XWG(:,3,:)
560 xi(:,:,jl) = ysurf_cur%IM%I%XLAI(:,:)
562 CALL
abor1_sfx(
"Mapping of "//trim(cvar(jl))//
" is not defined in SODA!")
573 ALLOCATE(zlsm(isize_full))
574 ALLOCATE(zcon_rain(isize_full))
575 ALLOCATE(zstrat_rain(isize_full))
576 ALLOCATE(zcon_snow(isize_full))
577 ALLOCATE(zstrat_snow(isize_full))
578 ALLOCATE(zclouds(isize_full))
579 ALLOCATE(zevaptr(isize_full))
580 ALLOCATE(zevap(isize_full))
581 ALLOCATE(ztsc(isize_full))
582 ALLOCATE(zswec(isize_full))
583 ALLOCATE(zts(isize_full))
584 ALLOCATE(zucls(isize_full))
585 ALLOCATE(zvcls(isize_full))
586 ALLOCATE(zsst(isize_full))
587 ALLOCATE(zsic(isize_full))
591 ALLOCATE(zt2m(isize_full))
592 ALLOCATE(zhu2m(isize_full))
593 ALLOCATE(zswe(isize_full))
596 IF (cassim_isba==
"OI ")
THEN
598 IF ( trim(cfile_format_fg) ==
"ASCII" )
THEN
600 ALLOCATE(zwork(ysurf_cur%U%NDIM_FULL,8))
602 IF (nrank==npio)
THEN
604 ymfile =
'FIRST_GUESS_'
606 WRITE(*,*)
"READING first guess from file "//trim(ymfile)//
".DAT"
608 OPEN(unit=55,file=trim(ymfile)//
".DAT",form=
'FORMATTED',status=
'OLD',iostat=istat)
609 IF ( istat /= 0 ) CALL
abor1_sfx(
"Can not open "//trim(ymfile))
614 DO ji = 1,ysurf_cur%U%NDIM_FULL
615 READ (55,*,iostat=istat) (zwork(ji,jj),jj=1,8)
616 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading file "//trim(ymfile))
633 zcon_rain(:) = zwork(:,1)
634 zstrat_snow(:) = zwork(:,2)
635 zcon_snow(:) = zwork(:,3)
636 zstrat_snow(:) = zwork(:,4)
637 zclouds(:) = zwork(:,5)
639 zevap(:) = zwork(:,7)
640 zevaptr(:) = zwork(:,8)
645 ELSEIF ( trim(cfile_format_fg) ==
"FA" )
THEN
649 cfilein_fa =
'FG_OI_MAIN'
654 yprogram2,
'EXTZON',
'SURF ',
'READ ')
658 CALL
read_surf(yprogram2,
'SURFACCPLUIE', zstrat_rain,iresp)
659 CALL
read_surf(yprogram2,
'SURFACCNEIGE', zstrat_snow,iresp)
660 CALL
read_surf(yprogram2,
'SURFACCGRAUPEL',zcon_snow,iresp)
665 CALL
read_surf(yprogram2,
'SURFPREC.EAU.CON',zcon_rain ,iresp)
666 CALL
read_surf(yprogram2,
'SURFPREC.EAU.GEC',zstrat_rain ,iresp)
667 CALL
read_surf(yprogram2,
'SURFPREC.NEI.CON',zcon_snow ,iresp)
668 CALL
read_surf(yprogram2,
'SURFPREC.NEI.GEC',zstrat_snow ,iresp)
671 CALL
read_surf(yprogram2,
'ATMONEBUL.BASSE ',zclouds,iresp)
672 CALL
read_surf(yprogram2,
'SURFIND.TERREMER',zlsm ,iresp)
673 CALL
read_surf(yprogram2,
'SURFFLU.LAT.MEVA',zevap ,iresp)
675 IF (.NOT.laladsurf)
THEN
676 CALL
read_surf(yprogram2,
'SURFXEVAPOTRANSP',zevaptr,iresp)
685 CALL
abor1_sfx(
"The first guess is supposed to be an FA file. You must compile with FA support enabled: -DSFX_FA")
688 CALL
abor1_sfx(
"CFILE_FORMAT_FG="//trim(cfile_format_fg)//
" not implemented!")
690 IF (nrank==npio .AND. nprintlev>0)
WRITE(*,*)
'READ FIRST GUESS OK'
694 IF (lextrap_sea .OR. lextrap_water .OR. lextrap_nature .OR. .NOT.lwatertg2)
THEN
696 IF (nrank==npio .AND. nprintlev>0)
WRITE(*,*)
"READING Land-Sea mask"
698 IF ( trim(cfile_format_lsm) ==
"ASCII" )
THEN
700 ALLOCATE(zwork(ysurf_cur%U%NDIM_FULL,1))
702 IF (nrank==npio)
THEN
704 IF (nprintlev>0)
WRITE(*,*)
"READING LSM from file "//trim(ymfile)
705 OPEN(unit=55,file=trim(ymfile),form=
'FORMATTED',status=
'OLD',iostat=istat)
706 IF ( istat /= 0 ) CALL
abor1_sfx(
"Can not open "//trim(ymfile))
710 DO ji = 1,ysurf_cur%U%NDIM_FULL
711 READ (55,*,iostat=istat) zwork(ji,1)
712 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading file "//trim(ymfile))
726 ELSEIF ( trim(cfile_format_lsm) ==
"FA" )
THEN
729 cfilein_fa =
'FG_OI_MAIN'
734 yprogram2,
'EXTZON',
'SURF ',
'READ ')
735 CALL
read_surf(yprogram2,
'SURFIND.TERREMER',zlsm ,iresp)
736 IF (iresp /=0) CALL
abor1_sfx(
"Can not read Land-Sea mask from FA file "//trim(cfilein_fa))
741 CALL
abor1_sfx(
"The Land-sea mask file is assumed to be an FA file. You must compile with FA support enabled: -DSFX_FA")
744 CALL
abor1_sfx(
"CFILE_FORMAT_LSM="//trim(cfile_format_lsm)//
" not implemented!")
746 IF (nrank==npio.AND.nprintlev>0)
WRITE(*,*)
'READ LSM OK'
751 IF ( cassim_isba==
"EKF " .OR. cassim_isba==
"ENKF " )
THEN
752 ALLOCATE(xyo(ysurf_cur%U%NSIZE_NATURE,nobstype))
755 IF ( trim(cfile_format_obs) ==
"ASCII")
THEN
757 ALLOCATE(zwork(ysurf_cur%U%NDIM_FULL,nobstype))
759 IF (nrank==npio)
THEN
761 ymfile =
'OBSERVATIONS_'
763 ymfile=trim(ymfile)//
".DAT"
765 OPEN(unit=55,file=trim(ymfile),form=
'FORMATTED',status=
'OLD',iostat=istat)
766 IF ( istat /=0 ) CALL
abor1_sfx(
"Error opening file "//trim(ymfile))
770 IF ( lobsheader )
THEN
772 ALLOCATE(cobsinfile(nobstype))
773 READ (55,*,iostat=istat) (cobsinfile(jj),jj=1,nobstype)
774 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading header in "//trim(ymfile))
777 IF ( trim(cobs(iobs)) /= trim(cobsinfile(iobs)))
THEN
778 CALL
abor1_sfx(
"Mapping of observations in "//trim(ymfile)//&
779 " is not consistent with setup! "//trim(cobs(iobs))//
" /= "//trim(cobsinfile(iobs)))
782 DEALLOCATE(cobsinfile)
792 IF (nrank==npio)
THEN
793 ALLOCATE(zyo_nat(ysurf_cur%U%NDIM_NATURE,nobstype))
794 DO ji = 1,ysurf_cur%U%NDIM_NATURE
795 READ (55,*,iostat=istat) (zyo_nat(ji,jj),jj=1,nobstype)
796 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading file "//trim(ymfile))
798 ALLOCATE(znature(ysurf_cur%U%NDIM_FULL))
803 ELSEIF (nrank==npio)
THEN
804 znature(:) = ysurf_cur%U%XNATURE
807 IF (nrank==npio)
THEN
809 DO ji = 1,ysurf_cur%U%NDIM_FULL
810 IF (znature(ji)>0.)
THEN
812 zwork(ji,:) = zyo_nat(icpt,:)
815 DEALLOCATE(znature,zyo_nat)
818 ELSEIF (nrank==npio)
THEN
820 DO ji = 1,ysurf_cur%U%NDIM_FULL
821 READ (55,*,iostat=istat) (zwork(ji,jj),jj=1,nobstype)
822 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading file "//trim(ymfile))
826 IF (nrank==npio)
THEN
829 IF (nprintlev>0)
WRITE(*,*)
'Read observation file OK'
842 IF ( cassim_isba==
"EKF " .OR. cassim_isba==
"ENKF " )
THEN
852 IF (nnco(ji) == 1 .AND. jj <= nobstype )
THEN
868 IF ( cassim_isba==
"EKF " .OR. cassim_isba==
"ENKF " )
THEN
869 DO ji = 1,ysurf_cur%U%NSIZE_NATURE
870 xyo(ji,:) = zwork(ysurf_cur%U%NR_NATURE(ji),:)
876 IF (nnco(ji) == 1 .AND. jj <= nobstype )
THEN
891 nobs = nobs + nobstype
892 IF (( cassim_isba==
"EKF " .OR. cassim_isba==
"ENKF " ) .AND. ( nprintlev > 2 ))
WRITE(iluout,*)
'read in obs: ', xyo(1,:), nobs
894 ELSEIF ( trim(cfile_format_obs) ==
"FA")
THEN
901 cfilein_fa =
'CANARI'
906 yprogram2,
'EXTZON',
'SURF ',
'READ ')
909 CALL
read_surf(yprogram2,
'CLSTEMPERATURE ',zt2m ,iresp)
910 CALL
read_surf(yprogram2,
'CLSHUMI.RELATIVE',zhu2m,iresp)
911 CALL
read_surf(yprogram2,
'SURFTEMPERATURE ',zts ,iresp)
912 CALL
read_surf(yprogram2,
'SURFRESERV.NEIGE',zswe ,iresp)
913 CALL
read_surf(yprogram2,
'CLSVENT.ZONAL ',zucls,iresp)
914 CALL
read_surf(yprogram2,
'CLSVENT.MERIDIEN',zvcls,iresp)
919 IF (nrank==npio.AND.nprintlev>0)
WRITE(*,*)
'READ CANARI OK'
921 CALL
abor1_sfx(
"CANARI analyis is supposed to be an FA file. You must compile with FA support enabled: -DSFX_FA")
924 CALL
abor1_sfx(
"CFILE_FORMAT_OBS="//trim(cfile_format_obs)//
" not implemented!")
928 IF (cassim_isba==
"OI ")
THEN
930 IF (trim(cfile_format_clim) ==
"ASCII" )
THEN
932 ALLOCATE(zwork(ysurf_cur%U%NDIM_FULL,2))
934 IF (nrank==npio)
THEN
935 ymfile =
'CLIMATE.DAT'
936 WRITE(*,*)
"READING CLIM from file "//trim(ymfile)
937 OPEN(unit=55,file=trim(ymfile),form=
'FORMATTED',status=
'OLD',iostat=istat)
938 IF ( istat /= 0 ) CALL
abor1_sfx(
"Can not open "//trim(ymfile))
942 DO ji = 1,ysurf_cur%U%NDIM_FULL
943 READ (55,*,iostat=istat) (zwork(ji,jj),jj=1,2)
944 IF ( istat /= 0 ) CALL
abor1_sfx(
"Error reading file "//trim(ymfile))
960 ELSEIF (trim(cfile_format_clim) ==
"FA" )
THEN
964 cfilein_fa =
'clim_isba'
969 yprogram2,
'EXTZON',
'SURF ',
'READ ')
972 CALL
read_surf(yprogram2,
'SURFRESERV.NEIGE',zswec,iresp)
973 CALL
read_surf(yprogram2,
'SURFTEMPERATURE' ,ztsc ,iresp)
979 CALL
abor1_sfx(
"The climate file is supposed to be an FA file. You must compile with FA support enabled: -DSFX_FA")
982 CALL
abor1_sfx(
"CFILE_FORMAT_CLIM="//trim(cfile_format_clim)//
" not implemented!")
984 IF (nrank==npio.AND.nprintlev>0)
WRITE(*,*)
'READ CLIMATOLOGY OK'
988 CALL
assim_set_sst(ysurf_cur%DTCO, ysurf_cur%DGU, ysurf_cur%SM%S, ysurf_cur%U, &
989 isize_full,zlsm,zsst,zsic,ytest)
991 IF ( .NOT. lassim ) CALL
abor1_sfx(
"YOU CAN'T RUN SODA WITHOUT SETTING LASSIM=.TRUE. IN THE ASSIM NAMELIST")
993 ALLOCATE(gd_maskext(isize_full))
994 gd_maskext(:) = .false.
996 ALLOCATE(zlon(isize_full))
997 ALLOCATE(zlat(isize_full))
998 zlon(:) = ysurf_cur%UG%XLON(:)
999 zlat(:) = ysurf_cur%UG%XLAT(:)
1001 glkeepextzone = .true.
1003 IF (nrank==npio)
WRITE(*,*)
'PERFORMIMG OFFLINE SURFEX DATA ASSIMILATION...'
1004 CALL
assim_surf_atm_n(ysurf_cur%IM%DGMI, ysurf_cur%IM%IG, ysurf_cur%IM%I, ysurf_cur%SM%S, &
1005 ysurf_cur%U, ysurf_cur%TM%T, ysurf_cur%TM%TOP, ysurf_cur%WM%W, &
1006 csurf_filetype,isize_full, &
1007 zcon_rain, zstrat_rain, zcon_snow, zstrat_snow, &
1008 zclouds, zlsm, zevaptr, zevap, &
1010 zts, zt2m, zhu2m, zswe, &
1011 zsst, zsic, zucls, zvcls, &
1012 ytest, gd_maskext, zlon, zlat, glkeepextzone )
1014 DEALLOCATE(zcon_rain)
1015 DEALLOCATE(zstrat_rain)
1016 DEALLOCATE(zcon_snow)
1017 DEALLOCATE(zstrat_snow)
1034 IF (ctimeseries_filetype==
"OFFLIN")
THEN
1043 IF (nrank==npio)
THEN
1045 IF(lout_timename)
THEN
1052 imonth_out = imonth - 1
1053 IF(imonth_out==0)
THEN
1055 iyear_out = iyear - 1
1057 SELECT CASE (imonth_out)
1060 CASE(1,3,5,7:8,10,12)
1063 IF( ((mod(iyear_out,4)==0).AND.(mod(iyear_out,100)/=0)) .OR. (mod(iyear_out,400)==0))
THEN
1074 WRITE(ytag,fmt=
'(I4.4,I2.2,I2.2,A1,I2.2,A1,I2.2)') iyear_out,imonth_out,iday_out,&
1075 '_',int(ztime_out/3600.),
'h',nint(ztime_out)/60-60*int(ztime_out/3600.)
1076 cfileout = adjustl(adjustr(csurffile)//
'.'//ytag//
'.txt')
1078 cfileout_lfi= adjustl(adjustr(csurffile)//
'.'//ytag)
1081 cfileout_fa = adjustl(adjustr(csurffile)//
'.'//ytag//
'.fa')
1084 cfileout_nc = adjustl(adjustr(csurffile)//
'.'//ytag//
'.nc')
1087 IF (csurf_filetype==
'FA ')
THEN
1090 lfanocompact = ldiag_fa_nocompact
1091 idatef(1)= iyear_out
1092 idatef(2)= imonth_out
1094 idatef(4)= floor(ztime_out/3600.)
1095 idatef(5)= floor(ztime_out/60.) - idatef(4) * 60
1096 idatef(6)= nint(ztime_out) - idatef(4) * 3600 - idatef(5) * 60
1098 CALL faitou(iret,nunit_fa,.true.,cfileout_fa,
'UNKNOWN',.true.,.false.,iverbfa,0,inb,cdnomc)
1099 CALL fandar(iret,nunit_fa,idatef)
1106 IF (cassim_isba==
"ENKF ")
THEN
1108 IF (lbias_correction) isize = isize + 1
1113 ltime_written(:)=.false.
1117 IF (cassim_isba==
"ENKF ")
THEN
1121 WRITE(yvar,
'(I3)') iens
1122 yfilein = trim(ymfile)//
"_EKF_ENS"//adjustl(yvar)
1132 csurf_filetype,yinit, lland_use, isize_full, isv, isw, &
1133 csv, xco2, xrhoa, xzenith, xazim, xsw_bands, &
1134 xdir_alb, xsca_alb, xemis, xtsrad, xtsurf, &
1135 iyear, imonth, iday, ztime, &
1136 yatmfile, yatmfiletype, ytest )
1142 SELECT CASE (trim(cvar(jl)))
1144 ysurf_cur%IM%I%XTG(:,1,:) = xf(:,:,iens,jl)
1146 ysurf_cur%IM%I%XTG(:,2,:) = xf(:,:,iens,jl)
1148 ysurf_cur%IM%I%XWG(:,1,:) = xf(:,:,iens,jl)
1150 ysurf_cur%IM%I%XWG(:,2,:) = xf(:,:,iens,jl)
1152 ysurf_cur%IM%I%XWG(:,3,:) = xf(:,:,iens,jl)
1154 ysurf_cur%IM%I%XLAI(:,:) = xf(:,:,iens,jl)
1156 CALL
abor1_sfx(
"Mapping of "//trim(cvar(jl))//
" is not defined in EKF!")
1166 IF (ctimeseries_filetype==
"NC ")
THEN
1167 CALL
init_output_nc_n(ysurf_cur%TM%BDD, ysurf_cur%CHE, ysurf_cur%CHN, ysurf_cur%CHU, &
1168 ysurf_cur%SM%DTS, ysurf_cur%TM%DTT, ysurf_cur%DTZ, ysurf_cur%IM%I, &
1169 ysurf_cur%UG, ysurf_cur%U, ysurf_cur%DGU)
1173 IF (ctimeseries_filetype==
"NC ") inw = 2
1178 ctimeseries_filetype,
'ALL',lland_use)
1180 ctimeseries_filetype,
'ALL')
1186 CALL
flag_update(ysurf_cur%IM%DGI, ysurf_cur%DGU,.false.,.true.,.false.,.false.)
1188 IF (lrestart_2m)
THEN
1197 gsurf_budget = .false.
1198 grad_budget = .false.
1200 gsurf_vars = .false.
1203 gdiag_ocean = .false.
1204 gdiag_seaice = .false.
1205 gwater_profile = .false.
1206 gsurf_evap_budget = .false.
1209 gch_no_flux_isba = .false.
1210 gsurf_misc_budget_isba = .false.
1212 gsurf_misc_budget_teb = .false.
1214 CALL
flag_diag_update(ysurf_cur%FM%CHF, ysurf_cur%IM%CHI, ysurf_cur%SM%CHS, ysurf_cur%TM%CHT, &
1215 ysurf_cur%WM%CHW, ysurf_cur%IM%DGEI, ysurf_cur%FM%DGF, ysurf_cur%IM%DGI, &
1216 ysurf_cur%FM%DGMF, ysurf_cur%IM%DGMI, ysurf_cur%TM%DGMTO, ysurf_cur%SM%DGO, &
1217 ysurf_cur%SM%DGS, ysurf_cur%SM%DGSI, ysurf_cur%DGU, ysurf_cur%TM%DGT, &
1218 ysurf_cur%WM%DGW, ysurf_cur%IM%I, ysurf_cur%U, &
1219 gfrac, gdiag_grid, i2m, gsurf_budget, grad_budget, gcoef, &
1220 gsurf_vars, ibeq, idsteq, gdiag_ocean, gdiag_seaice, &
1222 gsurf_evap_budget, gflood, gpgd_isba, gch_no_flux_isba, &
1223 gsurf_misc_budget_isba, gpgd_teb, gsurf_misc_budget_teb )
1226 IF (isize>1)
WRITE(yens,
'(I3)') iens
1228 IF ( csurf_filetype ==
"LFI " )
THEN
1230 cfileout_lfi = trim(trim(csurffile)//adjustl(yens))
1232 ELSEIF ( csurf_filetype ==
"FA " )
THEN
1234 cfileout_fa = adjustl(trim(adjustr(csurffile)//adjustl(yens))//
'.fa')
1236 ELSEIF ( csurf_filetype ==
"ASCII " )
THEN
1238 cfileout = adjustl(trim(adjustr(csurffile)//adjustl(yens))//
'.txt')
1241 ELSEIF ( csurf_filetype ==
"NC " )
THEN
1243 cfileout_nc = adjustl(trim(adjustr(csurffile)//adjustl(yens))//
'.nc')
1246 CALL
abor1_sfx(trim(csurf_filetype)//
" is not implemented!")
1253 IF (csurf_filetype==
"NC ")
THEN
1254 CALL
init_output_nc_n(ysurf_cur%TM%BDD, ysurf_cur%CHE, ysurf_cur%CHN, ysurf_cur%CHU, &
1255 ysurf_cur%SM%DTS, ysurf_cur%TM%DTT, ysurf_cur%DTZ, ysurf_cur%IM%I, &
1256 ysurf_cur%UG, ysurf_cur%U, ysurf_cur%DGU)
1260 IF (csurf_filetype==
"NC ") inw = 2
1268 csurf_filetype,
'ALL',lland_use)
1269 IF (ysurf_cur%DGU%LREAD_BUDGETC.AND..NOT.ysurf_cur%IM%DGEI%LRESET_BUDGETC)
THEN
1271 csurf_filetype,
'ALL')
1281 IF (nrank==npio .AND. csurf_filetype==
'FA ')
THEN
1283 CALL fairme(iret,nunit_fa,
'UNKNOWN')
1292 IF (nrank==npio)
THEN
1294 WRITE(iluout,*)
' -----------------------'
1295 WRITE(iluout,*)
' | SODA ENDS CORRECTLY |'
1296 WRITE(iluout,*)
' -----------------------'
1299 WRITE(*,*)
' -----------------------'
1300 WRITE(*,*)
' | SODA ENDS CORRECTLY |'
1301 WRITE(*,*)
' -----------------------'
1309 IF (
ALLOCATED(nindex))
DEALLOCATE(nindex)
1310 IF (
ALLOCATED(nsize_task))
DEALLOCATE(nsize_task)
1312 IF (
ASSOCIATED(nwork))
DEALLOCATE(nwork)
1313 IF (
ASSOCIATED(xwork))
DEALLOCATE(xwork)
1314 IF (
ASSOCIATED(nwork2))
DEALLOCATE(nwork2)
1315 IF (
ASSOCIATED(xwork2))
DEALLOCATE(xwork2)
1316 IF (
ASSOCIATED(xwork3))
DEALLOCATE(xwork3)
1317 IF (
ASSOCIATED(nwork_full))
DEALLOCATE(nwork_full)
1318 IF (
ASSOCIATED(xwork_full))
DEALLOCATE(xwork_full)
1319 IF (
ASSOCIATED(nwork2_full))
DEALLOCATE(nwork2_full)
1320 IF (
ASSOCIATED(xwork2_full))
DEALLOCATE(xwork2_full)
1324 IF (lhook) CALL dr_hook(
'SODA',1,zhook_handle)
1327 CALL mpi_finalize(infompi)
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine init_output_nc_n(BDD, CHE, CHN, CHU, DTS, DTT, DTZ, I, UG, U, DGU)
subroutine dealloc_surf_atm_n(YSC)
subroutine init_output_ol_n(YSC)
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine close_fileout_ol
subroutine init_index_mpi(YSC, HPROGRAM, HALG, PIO_FRAC, OSHADOWS)
subroutine abor1_sfx(YTEXT)
subroutine flag_update(DGI, DGU, ONOWRITE_CANOPY, OPGD, OPROVAR_TO_DIAG, OSELECT)
subroutine write_diag_surf_atm_n(YSC, HPROGRAM, HWRITE)
subroutine init_surf_atm_n(YSC, HPROGRAM, HINIT, OLAND_USE, KI, KSV, KSW, HSV, PCO2, PRHOA, PZENITH, PAZIM, PSW_BANDS, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD, PTSURF, KYEAR, KMONTH, KDAY, PTIME, HATMFILE, HATMFILETYPE, HTEST)
subroutine surfex_deallo_list
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine read_all_namelists(YSC, HPROGRAM, HINIT, ONAM_READ)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine flag_diag_update(CHF, CHI, CHS, CHT, CHW, DGEI, DGF, DGI, DGMF, DGMI, DGMTO, DGO, DGS, DGSI, DGU, DGT, DGW, I, U, OFRAC, ODIAG_GRID, K2M, OSURF_BUDGET, ORAD_BUDGET, OCOEF, OSURF_VARS, KBEQ, KDSTEQ, ODIAG_OCEAN, ODIAG_SEAICE, OWATER_PROFILE, OSURF_EVAP_BUDGET, OFLOOD, OPGD_ISBA, OCH_NO_FLUX_ISBA, OSURF_MISC_BUDGET_ISBA, OPGD_TEB, OSURF_MISC_BUDGET_TEB)
subroutine end_io_surf_n(HPROGRAM)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine write_surf_atm_n(YSC, HPROGRAM, HWRITE, OLAND_USE)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine surfex_alloc_list(KMODEL)
subroutine assim_set_sst(DTCO, DGU, S, U, KI, PITM, PSST, PSIC, HTEST)
subroutine get_size_full_n(U, HPROGRAM, KDIM_FULL, KSIZE_FULL)
subroutine assim_surf_atm_n(DGMI, IG, I, S, U, T, TOP, W, HPROGRAM, KI, PCON_RAIN, PSTRAT_RAIN, PCON_SNOW, PSTRAT_SNOW, PCLOUDS, PLSM, PEVAPTR, PEVAP, PSWEC, PTSC, PTS, PT2M, PHU2M, PSWE, PSST, PSIC, PUCLS, PVCLS, HTEST, OD_MASKEXT, PLON, PLAT, OLKEEPEXTZONE)
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)