12 integer,
parameter ::
i_short = selected_int_kind(4)
13 integer,
parameter ::
i_kind = selected_int_kind(8)
14 integer,
parameter ::
r_double = selected_real_kind(15)
15 integer,
parameter ::
r_kind = selected_real_kind(15)
26 integer :: nobs_dimid,nlocs_dimid,nvars_dimid,nrecs_dimid,ndatetime_dimid
27 integer :: varid_lat,varid_lon,varid_time,varid_datetime,varid_said,varid_ptid,varid_sclf,varid_asce
29 integer :: varid_geoid, varid_rfict
30 integer :: varid_ref,varid_msl,varid_refoe
31 integer :: varid_bnd,varid_bndoe,varid_impp, varid_imph,varid_azim
33 integer :: varid_geo_temp,varid_geo_pres,varid_geo_shum,varid_geo_geop, varid_geo_geop_sfc
35 character(len=*),
intent(in) :: infile
36 character(len=*),
intent(in) :: outdir
37 character(len=256) :: outfile
38 character,
dimension(8) :: subset
39 character(len=10) :: anatime
40 integer(i_kind) :: ndatetime = 20
41 character(len=20) :: datetime
42 integer(i_kind) :: i,k,m,ireadmg,ireadsb,ptid,sclf,asce
43 integer(i_kind) :: lnbufr = 10
44 integer(i_kind) :: nread,ndata,nvars,nrec, ndata0
45 integer(i_kind) :: anatime_i
46 integer(i_kind) :: idate5(6), idate,iadate5(6)
47 integer(i_kind) :: mincy,minobs
48 logical :: good,outside
49 integer :: refflag, bendflag
50 integer(i_kind),
parameter :: mxib=31
51 integer(i_kind) :: ibit(mxib),nib
52 integer(i_kind),
parameter :: maxlevs=500
53 integer(i_kind),
parameter :: n1ahdr=11
54 integer(i_kind) :: maxobs
57 integer(i_kind),
allocatable,
dimension(:) :: said
58 integer(i_kind),
allocatable,
dimension(:) :: sclf
59 integer(i_kind),
allocatable,
dimension(:) :: ptid
60 integer(i_kind),
allocatable,
dimension(:) :: recn
61 integer(i_kind),
allocatable,
dimension(:) :: asce
62 real(r_double),
allocatable,
dimension(:) :: time
63 character(len=20),
allocatable,
dimension(:) :: datetime
64 real(r_double),
allocatable,
dimension(:) :: lat
65 real(r_double),
allocatable,
dimension(:) :: lon
66 real(r_double),
allocatable,
dimension(:) :: rfict
67 real(r_double),
allocatable,
dimension(:) :: azim
68 real(r_double),
allocatable,
dimension(:) :: geoid
69 real(r_double),
allocatable,
dimension(:) :: msl_alt
70 real(r_double),
allocatable,
dimension(:) :: ref
71 real(r_double),
allocatable,
dimension(:) :: refoe_gsi
72 real(r_double),
allocatable,
dimension(:) :: bend_ang
73 real(r_double),
allocatable,
dimension(:) :: impact_para
74 real(r_double),
allocatable,
dimension(:) :: bndoe_gsi
79 real(r_double),
dimension(n1ahdr) :: bfr1ahdr
80 real(r_double),
dimension(50,maxlevs) :: data1b
81 real(r_double),
dimension(50,maxlevs) :: data2a
82 real(r_double),
dimension(maxlevs) :: nreps_this_ROSEQ2
83 integer(i_kind) :: iret,levs,levsr,nreps_ROSEQ1,nreps_ROSEQ2_int
84 real(r_double) :: pcc,qfro,usage,dlat,dlat_earth,dlon,dlon_earth,freq_chk,freq,azim
85 real(r_double) :: height,rlat,rlon,ref,bend,impact,roc,geoid, bend_error,ref_error,bend_pccf,ref_pccf
86 real(r_double) :: obsErr
87 real(r_double),
parameter :: missingvalue=-9.9e10
88 logical,
parameter :: GlobalModel = .true.
93 data hdr1a /
'YEAR MNTH DAYS HOUR MINU PCCF ELRC SAID PTID GEODU SCLF' /
100 open(lnbufr,file=trim(infile),form=
'unformatted')
101 call openbf(lnbufr,
'IN',lnbufr)
103 call readmg(lnbufr,subset,idate,iret)
105 write(6,*)
'READ_GNSSRO: can not open gnssro file!'
109 write(unit=*,fmt=
'(a,i10)') trim(infile)//
' file date is: ', idate
110 iadate5(1) = idate/1000000
111 iadate5(2) = (idate-iadate5(1)*1000000)/10000
112 iadate5(3) = (idate-iadate5(1)*1000000-iadate5(2)*10000)/100
113 iadate5(4) = idate-iadate5(1)*1000000-iadate5(2)*10000-iadate5(3)*100
115 call w3fs21(iadate5,mincy)
118 write(outfile,
'(a,i10.10,a)') trim(outdir)//
'gnssro_obs_',idate,
'.nc4'
121 do while(ireadmg(lnbufr,subset,idate)==0)
122 read_loop_countmaxobs:
do while(ireadsb(lnbufr)==0)
123 call ufbint(lnbufr,bfr1ahdr,n1ahdr,1,iret,hdr1a)
124 call ufbseq(lnbufr,data1b,50,maxlevs,levs,
'ROSEQ1')
125 maxobs= maxobs + levs
126 enddo read_loop_countmaxobs
129 allocate(gpsro_data%said(maxobs))
130 allocate(gpsro_data%sclf(maxobs))
131 allocate(gpsro_data%ptid(maxobs))
132 allocate(gpsro_data%recn(maxobs))
133 allocate(gpsro_data%asce(maxobs))
134 allocate(gpsro_data%time(maxobs))
135 allocate(gpsro_data%datetime(maxobs))
136 allocate(gpsro_data%lat(maxobs))
137 allocate(gpsro_data%lon(maxobs))
138 allocate(gpsro_data%rfict(maxobs))
139 allocate(gpsro_data%azim(maxobs))
140 allocate(gpsro_data%geoid(maxobs))
141 allocate(gpsro_data%msl_alt(maxobs))
142 allocate(gpsro_data%ref(maxobs))
143 allocate(gpsro_data%refoe_gsi(maxobs))
144 allocate(gpsro_data%bend_ang(maxobs))
145 allocate(gpsro_data%impact_para(maxobs))
146 allocate(gpsro_data%bndoe_gsi(maxobs))
150 open(lnbufr,file=trim(infile),form=
'unformatted')
151 call openbf(lnbufr,
'IN',lnbufr)
153 call readmg(lnbufr,subset,idate,iret)
155 do while(ireadmg(lnbufr,subset,idate)==0)
156 read_loop:
do while(ireadsb(lnbufr)==0)
158 call ufbint(lnbufr,bfr1ahdr,n1ahdr,1,iret,hdr1a)
159 call ufbint(lnbufr,qfro,1,1,iret,nemo)
161 idate5(1) = bfr1ahdr(1)
162 idate5(2) = bfr1ahdr(2)
163 idate5(3) = bfr1ahdr(3)
164 idate5(4) = bfr1ahdr(4)
165 idate5(5) = bfr1ahdr(5)
174 call w3fs21(idate5,minobs)
175 write(datetime,
'(I4,"-",I2.2,"-",I2.2,"T",I2.2,":",I2.2,":",I2.2,"Z")') &
176 idate5(1),idate5(2),idate5(3),idate5(4),idate5(5),idate5(6)
177 timeo=real(minobs-mincy,r_kind)/60.0
179 if( roc>6450000.0_r_kind .or. roc<6250000.0_r_kind .or. &
180 geoid>200_r_kind .or. geoid<-200._r_kind )
then
181 if (
verbose)
write(6,*)
'READ_GNSSRO: profile fails georeality check, skip this report'
186 if ( ((
said >= 740).and.(
said <=745)) .or. &
187 ((
said >= 750).and.(
said <= 755)).or. &
190 if (
verbose)
write(6,*)
'READ_GNSSRO: bad profile 0.0% confidence said=', &
191 said,
'ptid=',ptid,
' SKIP this report'
200 call upftbv(lnbufr,nemo,qfro,mxib,ibit,nib)
205 if (
verbose)
write(6,*)
'READ_GNSSRO: bad profile said=',
said,
'ptid=',&
206 ptid,
' SKIP this report'
218 call upftbv(lnbufr,nemo,qfro,mxib,ibit,nib)
228 call ufbint(lnbufr,nreps_this_roseq2,1,maxlevs,nreps_roseq1,
'{ROSEQ2}')
229 call ufbseq(lnbufr,data1b,50,maxlevs,levs,
'ROSEQ1')
230 call ufbseq(lnbufr,data2a,50,maxlevs,levsr,
'ROSEQ3')
241 ref_error= data2a(4,k)
242 ref_pccf = data2a(6,k)
245 nreps_roseq2_int = nreps_this_roseq2(k)
246 do i = 1,nreps_roseq2_int
249 if(nint(freq_chk).ne.0) cycle
251 impact = data1b(m+1,k)
253 bend_error = data1b(m+4,k)
256 bend_pccf=data1b((6*nreps_roseq2_int)+4,k)
259 if ( height<0._r_kind .or. height>60000._r_kind .or. &
260 abs(rlat)>90._r_kind .or. abs(rlon)>360._r_kind )
then
262 if (
verbose)
write(6,*)
'READ_GNSSRO: obs fails georeality check, said=',
said,
'ptid=',ptid
264 if ( bend>=1.e+9_r_kind .or. bend<=0._r_kind .or. impact>=1.e+9_r_kind .or. impact<roc .or. bendflag == 1 )
then
266 if (
verbose)
write(6,*)
'READ_GNSSRO: obs bend/impact is invalid, said=',
said,
'ptid=',ptid
269 if ( ref>=1.e+9_r_kind .or. ref<=0._r_kind .or. refflag == 1 )
then
273 if ( abs(azim)>360._r_kind .or. azim<0._r_kind )
then
279 gpsro_data%recn(ndata) = nrec
280 gpsro_data%lat(ndata) = rlat
281 gpsro_data%lon(ndata) = rlon
282 gpsro_data%time(ndata) = timeo
283 gpsro_data%datetime(ndata) = datetime
284 gpsro_data%said(ndata) =
said
285 gpsro_data%sclf(ndata) = sclf
286 gpsro_data%asce(ndata) = asce
287 gpsro_data%ptid(ndata) = ptid
288 gpsro_data%ref(ndata) = ref
289 gpsro_data%msl_alt(ndata) = height
290 gpsro_data%bend_ang(ndata) = bend
291 gpsro_data%bndoe_gsi(ndata) = bend_error
292 gpsro_data%impact_para(ndata) = impact
293 gpsro_data%rfict(ndata) = roc
294 gpsro_data%geoid(ndata) = geoid
295 gpsro_data%azim(ndata) = azim
297 gpsro_data%bndoe_gsi(ndata) = obserr
298 if ( ref > missingvalue)
then
300 gpsro_data%refoe_gsi(ndata) = obserr
302 gpsro_data%refoe_gsi(ndata) = missingvalue
308 if (ndata == ndata0) nrec = nrec -1
315 write(6,*)
"Error. No valid observations found. Cannot create NetCDF ouput."
319 call check( nf90_create(trim(outfile), nf90_netcdf4, ncid))
320 call check( nf90_def_dim(ncid,
'nlocs', ndata, nlocs_dimid) )
321 call check( nf90_def_dim(ncid,
'nrecs', nrec, nrecs_dimid) )
322 call check( nf90_def_dim(ncid,
'nobs', ndata*nvars, nobs_dimid) )
323 call check( nf90_def_dim(ncid,
'nvars', nvars, nvars_dimid) )
324 call check( nf90_def_dim(ncid,
'ndatetime', ndatetime, ndatetime_dimid) )
325 call check( nf90_put_att(ncid, nf90_global,
'date_time', anatime_i) )
326 call check( nf90_def_var(ncid,
"latitude@MetaData", nf90_float, nlocs_dimid, varid_lat) )
327 call check( nf90_def_var(ncid,
"longitude@MetaData", nf90_float, nlocs_dimid, varid_lon) )
328 call check( nf90_def_var(ncid,
"time@MetaData", nf90_float, nlocs_dimid, varid_time) )
329 call check( nf90_put_att(ncid, varid_time,
"longname",
"time offset to analysis time" ))
330 call check( nf90_put_att(ncid, varid_time,
"units",
"hour" ))
331 call check( nf90_def_var(ncid,
"datetime@MetaData", nf90_char, (/ ndatetime_dimid, nlocs_dimid /), varid_datetime) )
332 call check( nf90_def_var(ncid,
"record_number@MetaData", nf90_int, nlocs_dimid, varid_recn))
333 call check( nf90_put_att(ncid, varid_recn,
"longname",
"GNSS RO profile identifier" ))
334 call check( nf90_def_var(ncid,
"gnss_sat_class@MetaData", nf90_int, nlocs_dimid, varid_sclf))
335 call check( nf90_put_att(ncid, varid_sclf,
"longname",
"GNSS satellite classification, e.g, 401=GPS, 402=GLONASS" ))
336 call check( nf90_def_var(ncid,
"reference_sat_id@MetaData", nf90_int, nlocs_dimid, varid_ptid))
337 call check( nf90_put_att(ncid, varid_ptid,
"longname",
"GNSS satellite transmitter identifier (1-32)" ))
338 call check( nf90_def_var(ncid,
"occulting_sat_id@MetaData", nf90_int, nlocs_dimid, varid_said))
339 call check( nf90_put_att(ncid, varid_said,
"longname",
"Low Earth Orbit satellite identifier, e.g., COSMIC2=750-755" ))
340 call check( nf90_def_var(ncid,
"ascending_flag@MetaData", nf90_int, nlocs_dimid, varid_asce))
341 call check( nf90_put_att(ncid, varid_asce,
"longname",
"the original occultation ascending/descending flag" ))
342 call check( nf90_put_att(ncid, varid_asce,
"valid_range",
"0/descending or 1/ascending" ))
343 call check( nf90_def_var(ncid,
"refractivity@ObsValue", nf90_float, nlocs_dimid, varid_ref) )
344 call check( nf90_put_att(ncid, varid_ref,
"longname",
"Atmospheric refractivity" ))
345 call check( nf90_put_att(ncid, varid_ref,
"_FillValue", real(missingvalue) ))
346 call check( nf90_put_att(ncid, varid_ref,
"units",
"N" ))
347 call check( nf90_put_att(ncid, varid_ref,
"valid_range",
"0 - 500 N" ))
348 call check( nf90_def_var(ncid,
"refractivity@ObsError", nf90_float, nlocs_dimid, varid_refoe))
349 call check( nf90_put_att(ncid, varid_refoe,
"longname",
"Input error in atmospheric refractivity" ))
350 call check( nf90_put_att(ncid, varid_refoe,
"_FillValue", real(missingvalue) ))
351 call check( nf90_put_att(ncid, varid_refoe,
"units",
"N" ))
352 call check( nf90_put_att(ncid, varid_refoe,
"valid_range",
"0 - 10 N" ))
353 call check( nf90_def_var(ncid,
"altitude@MetaData", nf90_float, nlocs_dimid, varid_msl) )
354 call check( nf90_put_att(ncid, varid_msl,
"longname",
"Geometric altitude" ))
355 call check( nf90_put_att(ncid, varid_msl,
"units",
"Meters" ))
356 call check( nf90_def_var(ncid,
"bending_angle@ObsValue", nf90_float, nlocs_dimid, varid_bnd) )
357 call check( nf90_put_att(ncid, varid_bnd,
"longname",
"Bending Angle" ))
358 call check( nf90_put_att(ncid, varid_bnd,
"units",
"Radians" ))
359 call check( nf90_put_att(ncid, varid_bnd,
"valid_range",
"-0.001 - 0.08 Radians" ))
360 call check( nf90_def_var(ncid,
"bending_angle@ObsError", nf90_float, nlocs_dimid, varid_bndoe) )
361 call check( nf90_put_att(ncid, varid_bndoe,
"longname",
"Input error in Bending Angle" ))
362 call check( nf90_put_att(ncid, varid_bndoe,
"units",
"Radians" ))
363 call check( nf90_put_att(ncid, varid_bndoe,
"valid_range",
"0 - 0.008 Radians" ))
364 call check( nf90_def_var(ncid,
"impact_parameter@MetaData", nf90_float, nlocs_dimid, varid_impp))
365 call check( nf90_put_att(ncid, varid_impp,
"longname",
"distance from centre of curvature" ))
366 call check( nf90_put_att(ncid, varid_impp,
"units",
"Meters" ))
367 call check( nf90_put_att(ncid, varid_impp,
"valid_range",
"6200 - 6600 km" ))
368 call check( nf90_def_var(ncid,
"impact_height@MetaData", nf90_float, nlocs_dimid, varid_imph))
369 call check( nf90_put_att(ncid, varid_imph,
"longname",
"distance from mean sea level" ))
370 call check( nf90_put_att(ncid, varid_imph,
"units",
"Meters" ))
371 call check( nf90_put_att(ncid, varid_imph,
"valid_range",
"0 - 200 km" ))
372 call check( nf90_def_var(ncid,
"sensor_azimuth_angle@MetaData", nf90_float, nlocs_dimid, varid_azim))
373 call check( nf90_put_att(ncid, varid_azim,
"longname",
"GNSS->LEO line of sight" ))
374 call check( nf90_put_att(ncid, varid_azim,
"_FillValue", real(missingvalue) ))
375 call check( nf90_put_att(ncid, varid_azim,
"units",
"Degree" ))
376 call check( nf90_put_att(ncid, varid_azim,
"valid_range",
"0 - 360 degree" ))
377 call check( nf90_def_var(ncid,
"geoid_height_above_reference_ellipsoid@MetaData",nf90_float, nlocs_dimid, varid_geoid))
378 call check( nf90_put_att(ncid, varid_geoid,
"longname",
"Geoid height above WGS-84 ellipsoid" ))
379 call check( nf90_put_att(ncid, varid_geoid,
"units",
"Meters" ))
380 call check( nf90_put_att(ncid, varid_geoid,
"valid_range",
"-200 - 200 m" ))
381 call check( nf90_def_var(ncid,
"earth_radius_of_curvature@MetaData",nf90_float, nlocs_dimid, varid_rfict))
382 call check( nf90_put_att(ncid, varid_rfict,
"longname", ’
"Earths local radius of curvature" ))
383 call check( nf90_put_att(ncid, varid_rfict,
"units",
"Meters" ))
384 call check( nf90_put_att(ncid, varid_rfict,
"valid_range",
"6200 - 6600 km" ))
385 call check( nf90_enddef(ncid) )
387 call check( nf90_put_var(ncid, varid_lat, gpsro_data%lat(1:ndata)) )
388 call check( nf90_put_var(ncid, varid_lon, gpsro_data%lon(1:ndata)) )
389 call check( nf90_put_var(ncid, varid_time, gpsro_data%time(1:ndata)) )
390 call check( nf90_put_var(ncid, varid_datetime, gpsro_data%datetime(1:ndata)) )
391 call check( nf90_put_var(ncid, varid_recn, gpsro_data%recn(1:ndata)) )
392 call check( nf90_put_var(ncid, varid_said, gpsro_data%said(1:ndata)) )
393 call check( nf90_put_var(ncid, varid_ptid, gpsro_data%ptid(1:ndata)) )
394 call check( nf90_put_var(ncid, varid_sclf, gpsro_data%sclf(1:ndata)) )
395 call check( nf90_put_var(ncid, varid_asce, gpsro_data%asce(1:ndata)) )
396 call check( nf90_put_var(ncid, varid_ref, gpsro_data%ref(1:ndata)) )
397 call check( nf90_put_var(ncid, varid_refoe, gpsro_data%refoe_gsi(1:ndata)) )
398 call check( nf90_put_var(ncid, varid_msl, gpsro_data%msl_alt(1:ndata)) )
399 call check( nf90_put_var(ncid, varid_bnd, gpsro_data%bend_ang(1:ndata)) )
400 call check( nf90_put_var(ncid, varid_bndoe, gpsro_data%bndoe_gsi(1:ndata)) )
401 call check( nf90_put_var(ncid, varid_impp, gpsro_data%impact_para(1:ndata)) )
402 call check( nf90_put_var(ncid, varid_imph, gpsro_data%impact_para(1:ndata)-gpsro_data%rfict(1:ndata)-gpsro_data%geoid(1:ndata) ) )
403 call check( nf90_put_var(ncid, varid_azim, gpsro_data%azim(1:ndata)) )
404 call check( nf90_put_var(ncid, varid_geoid, gpsro_data%geoid(1:ndata)) )
405 call check( nf90_put_var(ncid, varid_rfict, gpsro_data%rfict(1:ndata)) )
406 call check( nf90_close(ncid) )
408 deallocate(gpsro_data%said)
409 deallocate(gpsro_data%sclf)
410 deallocate(gpsro_data%ptid)
411 deallocate(gpsro_data%recn)
412 deallocate(gpsro_data%asce)
413 deallocate(gpsro_data%time)
414 deallocate(gpsro_data%datetime)
415 deallocate(gpsro_data%lat)
416 deallocate(gpsro_data%lon)
417 deallocate(gpsro_data%rfict)
418 deallocate(gpsro_data%azim)
419 deallocate(gpsro_data%geoid)
420 deallocate(gpsro_data%msl_alt)
421 deallocate(gpsro_data%ref)
422 deallocate(gpsro_data%refoe_gsi)
423 deallocate(gpsro_data%bend_ang)
424 deallocate(gpsro_data%impact_para)
425 deallocate(gpsro_data%bndoe_gsi)
431 integer,
intent ( in) :: status
433 if(status /= nf90_noerr)
then
434 print *, trim(nf90_strerror(status))
442 real(r_double),
intent(in) :: obsLat, obsZ
443 real(r_double),
intent(out) :: obsErr
444 logical,
intent(in) :: GlobalModel
445 real(r_double) :: obsZ_km
447 obsz_km = obsz / 1000.0
449 if( globalmodel )
then
451 if( obslat>= 20.0 .or.obslat<= -20.0 )
then
452 obserr=-1.321_r_kind+0.341_r_kind*obsz_km-0.005_r_kind*obsz_km**2
454 if(obsz_km > 10.0)
then
455 obserr=2.013_r_kind-0.060_r_kind*obsz_km+0.0045_r_kind*obsz_km**2
457 obserr=-1.18_r_kind+0.058_r_kind*obsz_km+0.025_r_kind*obsz_km**2
460 obserr = 1.0_r_kind/abs(exp(obserr))
463 if( obslat >= 20.0 .or.obslat <= -20.0 )
then
464 if (obsz_km > 10.00)
then
465 obserr =-1.321_r_kind+0.341_r_kind*obsz_km-0.005_r_kind*obsz_km**2
467 obserr =-1.2_r_kind+0.065_r_kind*obsz_km+0.021_r_kind*obsz_km**2
470 if(obsz_km > 10.00)
then
471 obserr =2.013_r_kind-0.120_r_kind*obsz_km+0.0065_r_kind*obsz_km**2
473 obserr =-1.19_r_kind+0.03_r_kind*obsz_km+0.023_r_kind*obsz_km**2
476 obserr = 1.0_r_kind/abs(exp(obserr))
482 real(r_double),
intent(in) :: obsLat, obsZ
483 real(r_double),
intent(out) :: obsErr
484 real(r_double) :: obsZ_km
486 obsz_km = obsz / 1000.0
489 if( abs(obslat)>= 40.00 )
then
492 obserr=0.19032_r_kind+0.287535_r_kind*obsz_km-0.00260813_r_kind*obsz_km**2
494 obserr=-3.20978_r_kind+1.26964_r_kind*obsz_km-0.0622538_r_kind*obsz_km**2
498 obserr=-1.87788_r_kind+0.354718_r_kind*obsz_km-0.00313189_r_kind*obsz_km**2
500 obserr=-2.41024_r_kind+0.806594_r_kind*obsz_km-0.027257_r_kind*obsz_km**2
503 obserr = 0.001_r_kind/abs(exp(obserr))
506 if( abs(obslat)>= 40.00 )
then
507 if (obsz_km > 12.00)
then
508 obserr=-0.685627_r_kind+0.377174_r_kind*obsz_km-0.00421934_r_kind*obsz_km**2
510 obserr=-3.27737_r_kind+1.20003_r_kind*obsz_km-0.0558024_r_kind*obsz_km**2
513 if(obsz_km >18.00)
then
514 obserr=-2.73867_r_kind+0.447663_r_kind*obsz_km-0.00475603_r_kind*obsz_km**2
516 obserr=-3.45303_r_kind+0.908216_r_kind*obsz_km-0.0293331_r_kind*obsz_km**2
519 obserr = 0.001_r_kind/abs(exp(obserr))
530 INTEGER IYEAR, NDAYS, IJDN
532 DATA jdn78 / 2443510 /
537 IF (iyear.LE.99)
THEN
538 IF (iyear.LT.78)
THEN
546 ijdn = idate(3) - 32075 &
547 + 1461 * (iyear + 4800 + (idate(2) - 14) / 12) / 4 &
548 + 367 * (idate(2)- 2 - (idate(2) -14) / 12 * 12) / 12 &
549 - 3 * ((iyear + 4900 + (idate(2) - 14) / 12) / 100) / 4
554 nmin = ndays * 1440 + idate(4) * 60 + idate(5)
subroutine bendingangle_err_gsi(obsLat, obsZ, obsErr)
subroutine refractivity_err_gsi(obsLat, obsZ, GlobalModel, obsErr)
subroutine w3fs21(IDATE, NMIN)
integer, parameter i_short
integer, parameter r_kind
integer, parameter r_double
subroutine read_write_gnssro(infile, outdir)
integer, parameter i_kind