12 use fckit_configuration_module,
only: fckit_configuration
15 use missing_values_mod
31 character(len=MAXVARLEN),
public,
allocatable :: varin(:)
32 integer,
allocatable :: channels(:)
57 type(fckit_configuration),
intent(in) :: f_confOper
58 integer(c_int),
intent(in) :: channels(:)
62 character(len=max_string) :: err_msg
63 type(fckit_configuration) :: f_confOpts
64 logical :: request_cldfrac
66 call f_confoper%get_or_die(
"obs options",f_confopts)
70 write(err_msg,*)
'ufo_radiancecrtm_setup error: H2O must be included in CRTM Absorbers'
71 call abor1_ftn(err_msg)
74 write(err_msg,*)
'ufo_radiancecrtm_setup error: O3 must be included in CRTM Absorbers'
75 call abor1_ftn(err_msg)
82 nvars_in =
size(
varin_default) + self%conf%n_Absorbers + 2 * self%conf%n_Clouds + 2
84 self%conf%n_Clouds > 0 .and. &
85 self%conf%Cloud_Fraction < 0.0
86 if ( request_cldfrac )
then
87 nvars_in = nvars_in + 1
90 if (
cmp_strings(self%conf%salinity_option,
"on"))
then
91 nvars_in = nvars_in + 1
94 allocate(self%varin(nvars_in))
98 do jspec = 1, self%conf%n_Absorbers
99 self%varin(ind) = self%conf%Absorbers(jspec)
102 do jspec = 1, self%conf%n_Clouds
103 self%varin(ind) = self%conf%Clouds(jspec,1)
105 self%varin(ind) = self%conf%Clouds(jspec,2)
108 if ( request_cldfrac )
then
112 if (
cmp_strings(self%conf%salinity_option,
"on"))
then
116 if (trim(self%conf%sfc_wind_geovars) ==
'vector')
then
121 else if (trim(self%conf%sfc_wind_geovars) ==
'uv')
then
129 allocate(self%channels(
size(channels)))
130 self%channels(:) = channels(:)
148 use fckit_mpi_module,
only: fckit_mpi_comm
155 integer,
intent(in) :: nvars, nlocs
156 real(c_double),
intent(inout) :: hofx(nvars, nlocs)
158 type(c_ptr),
value,
intent(in) :: obss
161 character(*),
parameter :: PROGRAM_NAME =
'ufo_radiancecrtm_simobs'
162 character(255) :: message, version
163 character(max_string) :: err_msg
164 integer :: err_stat, alloc_stat
167 integer :: jvar, jprofile, jlevel, jchannel, ichannel, jspec
168 real(c_double) :: missing
169 type(fckit_mpi_comm) :: f_comm
170 real(kind_real) :: total_od, secant_term, wfunc_max
171 real(kind_real),
allocatable :: TmpVar(:)
172 real(kind_real),
allocatable :: Tao(:)
173 real(kind_real),
allocatable :: Wfunc(:)
175 integer :: n_Profiles, n_Layers, n_Channels
176 logical,
allocatable :: Skip_Profiles(:)
179 type(crtm_channelinfo_type) :: chinfo(self%conf%n_Sensors)
180 type(crtm_geometry_type),
allocatable :: geo(:)
183 type(crtm_atmosphere_type),
allocatable :: atm(:)
184 type(crtm_surface_type),
allocatable :: sfc(:)
185 type(crtm_rtsolution_type),
allocatable :: rts(:,:)
188 type(crtm_atmosphere_type),
allocatable :: atm_K(:,:)
189 type(crtm_surface_type),
allocatable :: sfc_K(:,:)
190 type(crtm_rtsolution_type),
allocatable :: rts_K(:,:)
191 type(crtm_options_type),
allocatable :: Options(:)
194 type(crtm_geometry_type),
allocatable :: geo_hf(:)
195 type(crtm_atmosphere_type),
allocatable :: atm_Ka(:,:)
196 type(crtm_surface_type),
allocatable :: sfc_Ka(:,:)
197 type(crtm_rtsolution_type),
allocatable :: rts_Ka(:,:)
198 type(crtm_rtsolution_type),
allocatable :: rtsa(:,:)
201 character(len=MAXVARLEN) :: varstr
202 character(len=MAXVARLEN),
dimension(hofxdiags%nvar) :: &
203 ystr_diags, xstr_diags
204 character(10),
parameter :: jacobianstr =
"_jacobian_"
205 integer :: str_pos(4), ch_diags(hofxdiags%nvar)
206 logical :: jacobian_needed
208 call obsspace_get_comm(obss, f_comm)
212 n_profiles = geovals%nlocs
233 err_stat = crtm_init( self%conf%SENSOR_ID, chinfo, &
234 file_path=trim(self%conf%COEFFICIENT_PATH), &
235 irwatercoeff_file=trim(self%conf%IRwaterCoeff_File), &
236 irlandcoeff_file=trim(self%conf%IRlandCoeff_File), &
237 irsnowcoeff_file=trim(self%conf%IRsnowCoeff_File), &
238 iricecoeff_file=trim(self%conf%IRiceCoeff_File), &
239 viswatercoeff_file=trim(self%conf%VISwaterCoeff_File), &
240 vislandcoeff_file=trim(self%conf%VISlandCoeff_File), &
241 vissnowcoeff_file=trim(self%conf%VISsnowCoeff_File), &
242 visicecoeff_file=trim(self%conf%VISiceCoeff_File), &
243 mwwatercoeff_file=trim(self%conf%MWwaterCoeff_File), &
245 message =
'Error initializing CRTM'
250 sensor_loop:
do n = 1, self%conf%n_Sensors
255 err_stat = crtm_channelinfo_subset(chinfo(n), self%channels, reset=.false.)
256 message =
'Error subsetting channels!'
261 n_channels = crtm_channelinfo_n_channels(chinfo(n))
265 allocate( geo( n_profiles ), &
268 rts( n_channels, n_profiles ), &
269 options( n_profiles ), &
271 message =
'Error allocating structure arrays'
274 if (n_layers > 0)
call crtm_rtsolution_create (rts, n_layers)
278 call crtm_atmosphere_create( atm, n_layers, self%conf%n_Absorbers, self%conf%n_Clouds, self%conf%n_Aerosols )
279 if ( any(.NOT. crtm_atmosphere_associated(atm)) )
THEN
280 message =
'Error allocating CRTM Forward Atmosphere structure'
281 CALL display_message( program_name, message, failure )
288 call crtm_surface_create(sfc, n_channels)
289 IF ( any(.NOT. crtm_surface_associated(sfc)) )
THEN
290 message =
'Error allocating CRTM Surface structure'
291 CALL display_message( program_name, message, failure )
295 CALL crtm_rtsolution_create(rts, n_layers )
299 call load_atm_data(n_profiles,n_layers,geovals,atm,self%conf)
300 call load_sfc_data(n_profiles,n_channels,self%channels,geovals,sfc,chinfo,obss,self%conf)
301 if (
cmp_strings(self%conf%SENSOR_ID(n),
'gmi_gpm'))
then
302 allocate( geo_hf( n_profiles ))
309 if (self%conf%inspect > 0)
then
310 call crtm_atmosphere_inspect(atm(self%conf%inspect))
311 call crtm_surface_inspect(sfc(self%conf%inspect))
312 call crtm_geometry_inspect(geo(self%conf%inspect))
313 call crtm_channelinfo_inspect(chinfo(n))
321 jacobian_needed = .false.
323 do jvar = 1, hofxdiags%nvar
324 varstr = hofxdiags%variables(jvar)
325 str_pos(4) = len_trim(varstr)
326 if (str_pos(4) < 1) cycle
327 str_pos(3) = index(varstr,
"_",back=.true.)
328 read(varstr(str_pos(3)+1:str_pos(4)),*, err=999) ch_diags(jvar)
329 999 str_pos(1) = index(varstr,jacobianstr) - 1
330 if (str_pos(1) == 0)
then
331 write(err_msg,*)
'ufo_radiancecrtm_simobs: _jacobian_ must be // &
332 & preceded by dependent variable in config: ', &
333 & hofxdiags%variables(jvar)
334 call abor1_ftn(err_msg)
335 else if (str_pos(1) > 0)
then
337 ystr_diags(jvar) = varstr(1:str_pos(1))
338 str_pos(2) = str_pos(1) + len(jacobianstr) + 1
339 jacobian_needed = .true.
340 str_pos(4) = str_pos(3) - str_pos(2)
341 xstr_diags(jvar)(1:str_pos(4)) = varstr(str_pos(2):str_pos(3)-1)
342 xstr_diags(jvar)(str_pos(4)+1:) =
""
345 xstr_diags(jvar) =
""
346 ystr_diags(jvar)(1:str_pos(3)-1) = varstr(1:str_pos(3)-1)
347 ystr_diags(jvar)(str_pos(3):) =
""
348 if (ch_diags(jvar) < 0) ystr_diags(jvar) = varstr
352 allocate(skip_profiles(n_profiles))
354 profile_loop:
do jprofile = 1, n_profiles
355 options(jprofile)%Skip_Profile = skip_profiles(jprofile)
357 do jlevel = atm(jprofile)%n_layers, 1, -1
358 if ( atm(jprofile)%level_pressure(jlevel) <= atm(jprofile)%level_pressure(jlevel-1) )
then
359 options(jprofile)%Skip_Profile = .true.
365 if (jacobian_needed)
then
368 allocate( atm_k( n_channels, n_profiles ), &
369 sfc_k( n_channels, n_profiles ), &
370 rts_k( n_channels, n_profiles ), &
372 message =
'Error allocating K structure arrays'
377 call crtm_atmosphere_create( atm_k, n_layers, self%conf%n_Absorbers, self%conf%n_Clouds, self%conf%n_Aerosols )
378 if ( any(.NOT. crtm_atmosphere_associated(atm_k)) )
THEN
379 message =
'Error allocating CRTM K-matrix Atmosphere structure (setTraj)'
380 CALL display_message( program_name, message, failure )
386 call crtm_surface_create( sfc_k, n_channels)
387 IF ( any(.NOT. crtm_surface_associated(sfc_k)) )
THEN
388 message =
'Error allocating CRTM K-matrix Surface structure (setTraj)'
389 CALL display_message( program_name, message, failure )
395 call crtm_atmosphere_zero( atm_k )
396 call crtm_surface_zero( sfc_k )
400 rts_k%Radiance = zero
401 rts_k%Brightness_Temperature = one
406 err_stat = crtm_k_matrix( atm , &
415 message =
'Error calling CRTM (setTraj) K-Matrix Model for '//trim(self%conf%SENSOR_ID(n))
417 if (
cmp_strings(self%conf%SENSOR_ID(n),
'gmi_gpm'))
then
418 allocate( atm_ka( n_channels, n_profiles ), &
419 sfc_ka( n_channels, n_profiles ), &
420 rts_ka( n_channels, n_profiles ), &
421 rtsa( n_channels, n_profiles ), &
423 message =
'Error allocating K structure arrays rtsa, atm_Ka ......'
431 call crtm_atmosphere_zero( atm_k )
432 call crtm_surface_zero( sfc_k )
433 rts_k%Radiance = zero
434 rts_k%Brightness_Temperature = one
437 err_stat = crtm_k_matrix( atm , &
446 message =
'Error calling CRTM (setTraj, geo_hf) K-Matrix Model for ' &
447 //trim(self%conf%SENSOR_ID(n))
450 do l = 1,
size(self%channels)
451 if ( self%channels(l) <= 9 )
then
452 atm_k(l,:) = atm_ka(l,:)
453 sfc_k(l,:) = sfc_ka(l,:)
454 rts_k(l,:) = rts_ka(l,:)
458 deallocate(atm_ka,sfc_ka,rts_ka,rtsa)
463 err_stat = crtm_forward( atm , &
469 message =
'Error calling CRTM Forward Model for '//trim(self%conf%SENSOR_ID(n))
471 if (
cmp_strings(self%conf%SENSOR_ID(n),
'gmi_gpm'))
then
472 allocate( rtsa( n_channels, n_profiles ), &
474 message =
'Error allocating K structure arrays rtsa.'
480 err_stat = crtm_forward( atm , &
486 message =
'Error calling CRTM Forward Model for gmi_gpm channels 10-13'
489 do l = 1,
size(self%channels)
490 if ( self%channels(l) <= 9 )
then
504 missing = missing_value(missing)
509 if (.not.skip_profiles(m))
then
510 do l = 1,
size(self%channels)
511 hofx(l,m) = rts(l,m)%Brightness_Temperature
518 do jvar = 1, hofxdiags%nvar
519 if (len(trim(hofxdiags%variables(jvar))) < 1) cycle
521 if (ch_diags(jvar) > 0)
then
522 if (
size(pack(self%channels,self%channels==ch_diags(jvar))) /= 1)
then
523 write(err_msg,*)
'ufo_radiancecrtm_simobs: mismatch between// &
524 & h(x) channels(', self%channels,
') and// &
525 & ch_diags(jvar) = ', ch_diags(jvar)
526 call abor1_ftn(err_msg)
531 do ichannel = 1,
size(self%channels)
532 if (ch_diags(jvar) == self%channels(ichannel))
then
538 if (
allocated(hofxdiags%geovals(jvar)%vals)) &
539 deallocate(hofxdiags%geovals(jvar)%vals)
546 select case(ystr_diags(jvar))
549 hofxdiags%geovals(jvar)%nval = n_layers
550 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
551 hofxdiags%geovals(jvar)%vals = missing
552 do jprofile = 1, n_profiles
553 if (.not.skip_profiles(jprofile))
then
554 do jlevel = 1, hofxdiags%geovals(jvar)%nval
555 hofxdiags%geovals(jvar)%vals(jlevel,jprofile) = &
556 rts(jchannel,jprofile) % layer_optical_depth(jlevel)
563 hofxdiags%geovals(jvar)%nval = 1
564 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
565 hofxdiags%geovals(jvar)%vals = missing
566 do jprofile = 1, n_profiles
567 if (.not.skip_profiles(jprofile))
then
568 hofxdiags%geovals(jvar)%vals(1,jprofile) = &
569 rts(jchannel,jprofile) % Radiance
575 hofxdiags%geovals(jvar)%nval = 1
576 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
577 hofxdiags%geovals(jvar)%vals = missing
578 do jprofile = 1, n_profiles
579 if (.not.skip_profiles(jprofile))
then
583 hofxdiags%geovals(jvar)%vals(1,jprofile) = &
584 rts(jchannel,jprofile) % Tb_Clear
590 hofxdiags%geovals(jvar)%nval = 1
591 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
592 hofxdiags%geovals(jvar)%vals = missing
593 do jprofile = 1, n_profiles
594 if (.not.skip_profiles(jprofile))
then
595 hofxdiags%geovals(jvar)%vals(1,jprofile) = &
596 rts(jchannel,jprofile) % Brightness_Temperature
602 hofxdiags%geovals(jvar)%nval = n_layers
603 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
604 hofxdiags%geovals(jvar)%vals = missing
605 allocate(tmpvar(n_profiles))
606 call obsspace_get_db(obss,
"MetaData",
"sensor_zenith_angle", tmpvar)
607 do jprofile = 1, n_profiles
608 if (.not.skip_profiles(jprofile))
then
609 secant_term = one/cos(tmpvar(jprofile)*
deg2rad)
611 do jlevel = 1, n_layers
612 total_od = total_od + rts(jchannel,jprofile) % layer_optical_depth(jlevel)
613 hofxdiags%geovals(jvar)%vals(jlevel,jprofile) = &
614 exp(-min(limit_exp,total_od*secant_term))
622 hofxdiags%geovals(jvar)%nval = n_layers
623 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
624 hofxdiags%geovals(jvar)%vals = missing
625 allocate(tmpvar(n_profiles))
626 allocate(tao(n_layers))
627 call obsspace_get_db(obss,
"MetaData",
"sensor_zenith_angle", tmpvar)
628 do jprofile = 1, n_profiles
629 if (.not.skip_profiles(jprofile))
then
631 secant_term = one/cos(tmpvar(jprofile)*
deg2rad)
633 do jlevel = 1, n_layers
634 total_od = total_od + rts(jchannel,jprofile) % layer_optical_depth(jlevel)
635 tao(jlevel) = exp(-min(limit_exp,total_od*secant_term))
638 do jlevel = n_layers-1, 1, -1
639 hofxdiags%geovals(jvar)%vals(jlevel,jprofile) = &
640 abs( (tao(jlevel+1)-tao(jlevel))/ &
641 (log(atm(jprofile)%pressure(jlevel+1))- &
642 log(atm(jprofile)%pressure(jlevel))) )
644 hofxdiags%geovals(jvar)%vals(n_layers,jprofile) = &
645 hofxdiags%geovals(jvar)%vals(n_layers-1,jprofile)
653 hofxdiags%geovals(jvar)%nval = 1
654 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
655 hofxdiags%geovals(jvar)%vals = missing
656 allocate(tmpvar(n_profiles))
657 allocate(tao(n_layers))
658 allocate(wfunc(n_layers))
659 call obsspace_get_db(obss,
"MetaData",
"sensor_zenith_angle", tmpvar)
660 do jprofile = 1, n_profiles
661 if (.not.skip_profiles(jprofile))
then
663 secant_term = one/cos(tmpvar(jprofile)*
deg2rad)
665 do jlevel = 1, n_layers
666 total_od = total_od + rts(jchannel,jprofile) % layer_optical_depth(jlevel)
667 tao(jlevel) = exp(-min(limit_exp,total_od*secant_term))
670 do jlevel = n_layers-1, 1, -1
672 abs( (tao(jlevel+1)-tao(jlevel))/ &
673 (log(atm(jprofile)%pressure(jlevel+1))- &
674 log(atm(jprofile)%pressure(jlevel))) )
676 wfunc(n_layers) = wfunc(n_layers-1)
679 do jlevel = n_layers-1, 1, -1
680 if (wfunc(jlevel) > wfunc_max)
then
681 wfunc_max = wfunc(jlevel)
682 hofxdiags%geovals(jvar)%vals(1,jprofile) = jlevel
692 write(err_msg,*)
'ufo_radiancecrtm_simobs: //&
693 & ObsDiagnostic is unsupported, ', &
694 & hofxdiags%variables(jvar)
696 hofxdiags%geovals(jvar)%nval = 1
697 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
698 hofxdiags%geovals(jvar)%vals = missing
700 else if (ystr_diags(jvar) ==
var_tb)
then
702 select case (xstr_diags(jvar))
705 hofxdiags%geovals(jvar)%nval = n_layers
706 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
707 hofxdiags%geovals(jvar)%vals = missing
708 do jprofile = 1, n_profiles
709 if (.not.skip_profiles(jprofile))
then
710 do jlevel = 1, hofxdiags%geovals(jvar)%nval
711 hofxdiags%geovals(jvar)%vals(jlevel,jprofile) = &
712 atm_k(jchannel,jprofile) % Temperature(jlevel)
718 hofxdiags%geovals(jvar)%nval = n_layers
719 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
720 hofxdiags%geovals(jvar)%vals = missing
722 do jprofile = 1, n_profiles
723 if (.not.skip_profiles(jprofile))
then
724 do jlevel = 1, hofxdiags%geovals(jvar)%nval
725 hofxdiags%geovals(jvar)%vals(jlevel,jprofile) = &
726 atm_k(jchannel,jprofile) % Absorber(jlevel,jspec)
733 hofxdiags%geovals(jvar)%nval = 1
734 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
735 hofxdiags%geovals(jvar)%vals = missing
736 do jprofile = 1, n_profiles
737 if (.not.skip_profiles(jprofile))
then
738 hofxdiags%geovals(jvar)%vals(1,jprofile) = &
739 sfc_k(jchannel,jprofile) % water_temperature &
740 + sfc_k(jchannel,jprofile) % land_temperature &
741 + sfc_k(jchannel,jprofile) % ice_temperature &
742 + sfc_k(jchannel,jprofile) % snow_temperature
748 hofxdiags%geovals(jvar)%nval = 1
749 allocate(hofxdiags%geovals(jvar)%vals(hofxdiags%geovals(jvar)%nval,n_profiles))
750 hofxdiags%geovals(jvar)%vals = missing
751 do jprofile = 1, n_profiles
752 if (.not.skip_profiles(jprofile))
then
753 hofxdiags%geovals(jvar)%vals(1,jprofile) = &
754 rts_k(jchannel,jprofile) % surface_emissivity
758 write(err_msg,*)
'ufo_radiancecrtm_simobs: //&
759 & ObsDiagnostic is unsupported, ', &
760 & hofxdiags%variables(jvar)
761 call abor1_ftn(err_msg)
764 write(err_msg,*)
'ufo_radiancecrtm_simobs: //&
765 & ObsDiagnostic is unsupported, ', &
766 & hofxdiags%variables(jvar)
767 call abor1_ftn(err_msg)
773 call crtm_geometry_destroy(geo)
774 call crtm_atmosphere_destroy(atm)
775 call crtm_surface_destroy(sfc)
776 call crtm_rtsolution_destroy(rts)
780 deallocate(geo, atm, sfc, rts, options, skip_profiles, stat = alloc_stat)
781 if(
allocated(geo_hf))
deallocate(geo_hf)
782 message =
'Error deallocating structure arrays'
785 if (jacobian_needed)
then
788 call crtm_atmosphere_destroy(atm_k)
789 call crtm_surface_destroy(sfc_k)
790 call crtm_rtsolution_destroy(rts_k)
794 deallocate(atm_k, sfc_k, rts_k, stat = alloc_stat)
795 message =
'Error deallocating K structure arrays'
805 err_stat = crtm_destroy( chinfo )
806 message =
'Error destroying CRTM'
real(kind_real), parameter, public deg2rad
Fortran module to provide code shared between nonlinear and tlm/adm radiance calculations.
subroutine, public crtm_conf_setup(conf, f_confOpts, f_confOper)
subroutine, public load_geom_data(obss, geo, geo_hf)
subroutine, public crtm_comm_stat_check(stat, PROGRAM_NAME, message, f_comm)
subroutine, public load_sfc_data(n_Profiles, n_Channels, channels, geovals, sfc, chinfo, obss, conf)
subroutine, public ufo_crtm_skip_profiles(n_Profiles, n_Channels, channels, obss, Skip_Profiles)
subroutine, public crtm_conf_delete(conf)
subroutine, public load_atm_data(n_Profiles, n_Layers, geovals, atm, conf)
subroutine, public ufo_geovals_get_var(self, varname, geoval)
Fortran module to handle radiancecrtm observations.
subroutine ufo_radiancecrtm_setup(self, f_confOper, channels)
subroutine ufo_radiancecrtm_simobs(self, geovals, obss, nvars, nlocs, hofx, hofxdiags)
character(len=maxvarlen), dimension(19), parameter varin_default
subroutine ufo_radiancecrtm_delete(self)
Fortran module with various useful routines.
logical function, public cmp_strings(str1, str2)
character(len=maxvarlen), parameter, public var_radiance
character(len=maxvarlen), parameter, public var_prsi
character(len=maxvarlen), parameter, public var_sfc_emiss
character(len=maxvarlen), parameter, public var_sfc_ifrac
integer function, public ufo_vars_getindex(vars, varname)
character(len=maxvarlen), parameter, public var_cldfrac
character(len=maxvarlen), parameter, public var_oz
character(len=maxvarlen), parameter, public var_sfc_lfrac
character(len=maxvarlen), parameter, public var_sfc_wtmp
character(len=maxvarlen), parameter, public var_prs
character(len=maxvarlen), parameter, public var_sfc_wfrac
character(len=maxvarlen), parameter, public var_tb_clr
character(len=maxvarlen), parameter, public var_sfc_sfrac
character(len=maxvarlen), parameter, public var_sfc_itmp
character(len=maxvarlen), parameter, public var_sfc_wdir
character(len=maxvarlen), parameter, public var_sfc_soilm
character(len=maxvarlen), parameter, public var_sfc_u
character(len=maxvarlen), parameter, public var_sfc_sdepth
character(len=maxvarlen), parameter, public var_sfc_landtyp
character(len=maxvarlen), parameter, public var_mixr
character(len=maxvarlen), parameter, public var_lvl_transmit
character(len=maxvarlen), parameter, public var_tb
character(len=maxvarlen), parameter, public var_sfc_stmp
character(len=maxvarlen), parameter, public var_lvl_weightfunc
character(len=maxvarlen), parameter, public var_sfc_sss
character(len=maxvarlen), parameter, public var_ts
character(len=maxvarlen), parameter, public var_sfc_lai
character(len=maxvarlen), parameter, public var_pmaxlev_weightfunc
character(len=maxvarlen), parameter, public var_sfc_v
character(len=maxvarlen), parameter, public var_sfc_vegtyp
character(len=maxvarlen), parameter, public var_sfc_soiltyp
character(len=maxvarlen), parameter, public var_sfc_vegfrac
character(len=maxvarlen), parameter, public var_sfc_ltmp
character(len=maxvarlen), parameter, public var_sfc_t
character(len=maxvarlen), parameter, public var_opt_depth
character(len=maxvarlen), parameter, public var_sfc_soilt
character(len=maxvarlen), parameter, public var_sfc_wspeed
type to hold interpolated field for one variable, one observation
type to hold interpolated fields required by the obs operators
Fortran derived type for radiancecrtm trajectory.