10 use crtm_module,
only: crtm_irlandcoeff_classification
13 use unstructured_interpolation_mod,
only: unstrc_interp
26 subroutine crtm_surface( geom, field_slmsk, field_sheleg, field_tsea, field_vtype, field_stype, &
27 field_vfrac, field_stc, field_smc, field_u_srf, field_v_srf, field_f10m, &
29 land_type, vegetation_type, soil_type, water_coverage, land_coverage, &
30 ice_coverage, snow_coverage, lai, water_temperature, land_temperature, &
31 ice_temperature, snow_temperature, soil_moisture_content, &
32 vegetation_fraction, soil_temperature, snow_depth, wind_speed, &
33 wind_direction, sea_surface_salinity)
39 real(kind=
kind_real),
intent(in) :: field_slmsk(geom%isc:geom%iec,geom%jsc:geom%jec,1)
40 real(kind=
kind_real),
intent(in) :: field_sheleg(geom%isc:geom%iec,geom%jsc:geom%jec,1)
41 real(kind=
kind_real),
intent(in) :: field_tsea(geom%isc:geom%iec,geom%jsc:geom%jec,1)
42 real(kind=
kind_real),
intent(in) :: field_vtype(geom%isc:geom%iec,geom%jsc:geom%jec,1)
43 real(kind=
kind_real),
intent(in) :: field_stype(geom%isc:geom%iec,geom%jsc:geom%jec,1)
44 real(kind=
kind_real),
intent(in) :: field_vfrac(geom%isc:geom%iec,geom%jsc:geom%jec,1)
45 real(kind=
kind_real),
intent(in) :: field_stc(geom%isc:geom%iec,geom%jsc:geom%jec,1)
46 real(kind=
kind_real),
intent(in) :: field_smc(geom%isc:geom%iec,geom%jsc:geom%jec,1)
47 real(kind=
kind_real),
intent(in) :: field_u_srf(geom%isc:geom%iec,geom%jsc:geom%jec,1)
48 real(kind=
kind_real),
intent(in) :: field_v_srf(geom%isc:geom%iec,geom%jsc:geom%jec,1)
49 real(kind=
kind_real),
intent(in) :: field_f10m(geom%isc:geom%iec,geom%jsc:geom%jec,1)
50 real(kind=
kind_real),
intent(in) :: field_sss(geom%isc:geom%iec,geom%jsc:geom%jec,1)
51 real(kind=
kind_real),
intent(out) :: vegetation_type(geom%isc:geom%iec,geom%jsc:geom%jec,1)
52 real(kind=
kind_real),
intent(out) :: land_type(geom%isc:geom%iec,geom%jsc:geom%jec,1)
53 real(kind=
kind_real),
intent(out) :: soil_type(geom%isc:geom%iec,geom%jsc:geom%jec,1)
54 real(kind=
kind_real),
intent(out) :: water_coverage(geom%isc:geom%iec,geom%jsc:geom%jec,1)
55 real(kind=
kind_real),
intent(out) :: land_coverage(geom%isc:geom%iec,geom%jsc:geom%jec,1)
56 real(kind=
kind_real),
intent(out) :: ice_coverage(geom%isc:geom%iec,geom%jsc:geom%jec,1)
57 real(kind=
kind_real),
intent(out) :: snow_coverage(geom%isc:geom%iec,geom%jsc:geom%jec,1)
58 real(kind=
kind_real),
intent(out) :: lai(geom%isc:geom%iec,geom%jsc:geom%jec,1)
59 real(kind=
kind_real),
intent(out) :: water_temperature(geom%isc:geom%iec,geom%jsc:geom%jec,1)
60 real(kind=
kind_real),
intent(out) :: land_temperature(geom%isc:geom%iec,geom%jsc:geom%jec,1)
61 real(kind=
kind_real),
intent(out) :: ice_temperature(geom%isc:geom%iec,geom%jsc:geom%jec,1)
62 real(kind=
kind_real),
intent(out) :: snow_temperature(geom%isc:geom%iec,geom%jsc:geom%jec,1)
63 real(kind=
kind_real),
intent(out) :: soil_moisture_content(geom%isc:geom%iec,geom%jsc:geom%jec,1)
64 real(kind=
kind_real),
intent(out) :: vegetation_fraction(geom%isc:geom%iec,geom%jsc:geom%jec,1)
65 real(kind=
kind_real),
intent(out) :: soil_temperature(geom%isc:geom%iec,geom%jsc:geom%jec,1)
66 real(kind=
kind_real),
intent(out) :: snow_depth(geom%isc:geom%iec,geom%jsc:geom%jec,1)
67 real(kind=
kind_real),
intent(out) :: wind_speed(geom%isc:geom%iec,geom%jsc:geom%jec,1)
68 real(kind=
kind_real),
intent(out) :: wind_direction(geom%isc:geom%iec,geom%jsc:geom%jec,1)
69 real(kind=
kind_real),
intent(out) :: sea_surface_salinity(geom%isc:geom%iec,geom%jsc:geom%jec,1)
72 real(kind=
kind_real),
parameter :: minsnow = 1.0_kind_real / 10.0_kind_real
73 real(kind=
kind_real),
parameter :: windlimit = 0.0001_kind_real
74 real(kind=
kind_real),
parameter :: quadcof(4, 2 ) = &
75 reshape((/0.0_kind_real, 1.0_kind_real, 1.0_kind_real, 2.0_kind_real, &
76 1.0_kind_real, -1.0_kind_real, 1.0_kind_real, -1.0_kind_real/), (/4, 2/))
78 integer :: itype, istype
81 integer :: lai_type, iquadrant
83 real(kind=
kind_real) :: sfcpct(0:3), ts(0:3), wgtavg(0:3), dtskin(0:3)
88 real(kind=
kind_real) :: vty, sty, vfr, stp, sm, sn, ss
89 real(kind=
kind_real) :: uu5, vv5, f10, sfc_speed, windratio, windangle, windscale
90 real(kind=
kind_real) :: wind10, wind10_direction
93 integer,
parameter :: gfs_soil_n_types = 9
94 integer,
parameter :: gfs_vegetation_n_types = 13
95 integer,
parameter :: invalid_land = 0
96 integer,
parameter :: compacted_soil = 1
97 integer,
parameter :: tilled_soil = 2
98 integer,
parameter :: irrigated_low_vegetation = 5
99 integer,
parameter :: meadow_grass = 6
100 integer,
parameter :: scrub = 7
101 integer,
parameter :: broadleaf_forest = 8
102 integer,
parameter :: pine_forest = 9
103 integer,
parameter :: tundra = 10
104 integer,
parameter :: grass_soil = 11
105 integer,
parameter :: broadleaf_pine_forest = 12
106 integer,
parameter :: grass_scrub = 13
107 integer,
parameter :: urban_concrete = 15
108 integer,
parameter :: broadleaf_brush = 17
109 integer,
parameter :: wet_soil = 18
110 integer,
parameter :: scrub_soil = 19
111 integer,
parameter :: nvege_type = 20
112 integer,
parameter :: igbp_n_types = 20
113 integer,
parameter :: soil_n_types = 16
114 integer,
allocatable,
dimension(:) :: map_to_crtm_ir
115 integer,
allocatable,
dimension(:) :: map_to_crtm_mwave
116 integer,
parameter,
dimension(1:IGBP_N_TYPES) :: igbp_to_gfs=(/4, &
117 1, 5, 2, 3, 8, 9, 6, 6, 7, 8, 12, 7, 12, 13, 11, 0, 10, 10, 11/)
118 integer,
parameter,
dimension(1:IGBP_N_TYPES) :: igbp_to_npoess=(/pine_forest, &
119 broadleaf_forest, pine_forest, broadleaf_forest, broadleaf_pine_forest, &
120 scrub, scrub_soil, broadleaf_brush, broadleaf_brush, scrub, broadleaf_brush, &
121 tilled_soil, urban_concrete, tilled_soil, invalid_land, compacted_soil, &
122 invalid_land, tundra, tundra, tundra/)
123 integer,
parameter,
dimension(1:IGBP_N_TYPES) :: igbp_to_igbp=(/1, &
124 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, &
126 integer,
parameter,
dimension(1:SOIL_N_TYPES) :: map_soil_to_crtm=(/1, &
127 1, 4, 2, 2, 8, 7, 2, 6, 5, 2, 3, 8, 1, 6, 9/)
145 vegetation_type = 0.0_kind_real
146 land_type = 0.0_kind_real
147 soil_type = 0.0_kind_real
148 water_coverage = 0.0_kind_real
149 land_coverage = 0.0_kind_real
150 ice_coverage = 0.0_kind_real
151 snow_coverage = 0.0_kind_real
153 water_temperature = 0.0_kind_real
154 land_temperature = 0.0_kind_real
155 ice_temperature = 0.0_kind_real
156 snow_temperature = 0.0_kind_real
157 soil_moisture_content = 0.0_kind_real
158 vegetation_fraction = 0.0_kind_real
159 soil_temperature = 0.0_kind_real
160 snow_depth = 0.0_kind_real
161 wind_speed = 0.0_kind_real
162 wind_direction = 0.0_kind_real
163 sea_surface_salinity = 0.0_kind_real
166 allocate(map_to_crtm_ir(nvege_type))
167 allocate(map_to_crtm_mwave(nvege_type))
168 map_to_crtm_ir = igbp_to_igbp
169 map_to_crtm_mwave = igbp_to_gfs
177 do jj = geom%jsc, geom%jec
178 do ji = geom%isc, geom%iec
180 slmsk = nint(field_slmsk(ji,jj,1))
181 vtype = nint(field_vtype(ji,jj,1))
182 stype = nint(field_stype(ji,jj,1))
183 sheleg = field_sheleg(ji,jj,1)
184 tsea = field_tsea(ji,jj,1)
185 vfrac = field_vfrac(ji,jj,1)
186 stc = field_stc(ji,jj,1)
187 smc = field_smc(ji,jj,1)
188 u_srf = field_u_srf(ji,jj,1)
189 v_srf = field_v_srf(ji,jj,1)
190 f10m = field_f10m(ji,jj,1)
191 sss = field_sss(ji,jj,1)
193 dtskin = 0.0_kind_real
207 if (istyp00 >=1 .and. sno00 > minsnow) istyp00 = 3
209 sfcpct = 0.0_kind_real
210 sfcpct(istyp00) = 1.0
213 if(sfcpct(0) > 0.99_kind_real)
then
215 else if(sfcpct(1) > 0.99_kind_real)
then
217 else if(sfcpct(2) > 0.99_kind_real)
then
219 else if(sfcpct(3) > 0.99_kind_real)
then
225 ts(0:3)=0.0_kind_real
226 wgtavg(0:3)=0.0_kind_real
238 wgtavg(1) = wgtavg(1) + 1.0
243 else if(istyp00 == 2)
then
244 wgtavg(2) = wgtavg(2) + 1.0
246 else if(istyp00 == 3)
then
247 wgtavg(3) = wgtavg(3) + 1.0
251 wgtavg(0) = wgtavg(0) + 1.0
256 if(wgtavg(0) > 0.0_kind_real)
then
257 ts(0) = ts(0)/wgtavg(0)
264 if(wgtavg(1) > 0.0_kind_real)
then
265 ts(1) = ts(1)/wgtavg(1)
274 if(wgtavg(2) > 0.0_kind_real)
then
275 ts(2) = ts(2)/wgtavg(2)
280 if(wgtavg(3) > 0.0_kind_real)
then
281 ts(3) = ts(3)/wgtavg(3)
292 if (vty == 15) vty = 1
293 if (sty == 16) sty = 1
298 itype = min(max(1,itype),nvege_type)
299 istype = min(max(1,istype),soil_n_types)
300 land_type(ji,jj,1) = real(max(1,map_to_crtm_mwave(itype)),
kind_real)
301 vegetation_type(ji,jj,1) = real(max(1,map_to_crtm_mwave(itype)),
kind_real)
302 soil_type(ji,jj,1) = real(map_soil_to_crtm(istype),
kind_real)
303 lai_type = real(map_to_crtm_mwave(itype),
kind_real)
305 water_coverage(ji,jj,1) = min(max(0.0_kind_real,sfcpct(0)),1.0_kind_real)
306 land_coverage(ji,jj,1) = min(max(0.0_kind_real,sfcpct(1)),1.0_kind_real)
307 ice_coverage(ji,jj,1) = min(max(0.0_kind_real,sfcpct(2)),1.0_kind_real)
308 snow_coverage(ji,jj,1) = min(max(0.0_kind_real,sfcpct(3)),1.0_kind_real)
310 lai(ji,jj,1) = 0.0_kind_real
312 if (land_coverage(ji,jj,1) > 0.0_kind_real)
then
315 call get_lai(lai_type,lai(ji,jj,1))
319 if(soil_type(ji,jj,1) == 9 .OR. vegetation_type(ji,jj,1) == 13)
then
320 ice_coverage(ji,jj,1) = min(ice_coverage(ji,jj,1) + land_coverage(ji,jj,1), 1.0_kind_real)
321 land_coverage(ji,jj,1) = 0.0_kind_real
332 sfc_speed = f10*sqrt(uu5*uu5+vv5*vv5)
334 if (uu5*f10 >= 0.0_kind_real .and. vv5*f10 >= 0.0_kind_real) iquadrant = 1
335 if (uu5*f10 >= 0.0_kind_real .and. vv5*f10 < 0.0_kind_real) iquadrant = 2
336 if (uu5*f10 < 0.0_kind_real .and. vv5*f10 >= 0.0_kind_real) iquadrant = 4
337 if (uu5*f10 < 0.0_kind_real .and. vv5*f10 < 0.0_kind_real) iquadrant = 3
338 if (abs(vv5*f10) >= windlimit)
then
339 windratio = (uu5*f10) / (vv5*f10)
341 windratio = 0.0_kind_real
342 if (abs(uu5*f10) > windlimit)
then
343 windratio = windscale * uu5*f10
346 windangle = atan(abs(windratio))
347 wind10_direction = quadcof(iquadrant, 1) *
pi + windangle * quadcof(iquadrant, 2)
348 wind_speed(ji,jj,1) = sfc_speed
349 wind_direction(ji,jj,1) =
rad2deg*wind10_direction
353 wind_speed(ji,jj,1) = 0.0_kind_real
354 wind_direction(ji,jj,1) = 0.0_kind_real
358 water_temperature(ji,jj,1) = max(ts(0) + dtskin(0), 270._kind_real)
359 sea_surface_salinity(ji,jj,1) = ss
366 land_temperature(ji,jj,1) = ts(1) + dtskin(1)
367 ice_temperature(ji,jj,1) = min(ts(2) + dtskin(2), 280._kind_real)
368 snow_temperature(ji,jj,1) = min(ts(3) + dtskin(3), 280._kind_real)
369 soil_moisture_content(ji,jj,1) = sm
370 vegetation_fraction(ji,jj,1) = vfr
371 soil_temperature(ji,jj,1) = stp
372 snow_depth(ji,jj,1) = sn
377 deallocate(map_to_crtm_ir)
378 deallocate(map_to_crtm_mwave)
388 integer ,
intent(in ) :: lai_type
392 if (lai_type .ne. 0)
then