FV3 Bundle
NESDIS_LandEM_Module.f90
Go to the documentation of this file.
1 !
2 ! NESDIS_LandEM_Module
3 !
4 ! Module containing the NESDIS microwave land emissivity model
5 !
6 !
7 ! CREATION HISTORY:
8 ! Written by: Banghua Yan, QSS Group Inc., 01-Jun-2005
9 ! Banghua.Yan@noaa.gov
10 ! Fuzhong Weng, NOAA/NESDIS/ORA,
11 ! Fuzhong.Weng@noaa.gov
12 !
13 
15 
16  ! -----------------
17  ! Enviroment set up
18  ! -----------------
19  ! Module use
20  USE type_kinds, ONLY: fp
21  USE fundamental_constants, ONLY: c_2
23  ! Disable implicit typing
24  IMPLICIT NONE
25 
26  ! ------------
27  ! Visibilities
28  ! ------------
29  PRIVATE
30  ! Procedures
31  PUBLIC :: nesdis_landem
32  ! Parameters
33  PUBLIC :: zero
34  PUBLIC :: point1
35  PUBLIC :: point5
36  PUBLIC :: one
37  PUBLIC :: two
38  PUBLIC :: three
39  PUBLIC :: four
40  PUBLIC :: pi
41  PUBLIC :: emissh_default
42  PUBLIC :: emissv_default
43 
44  PUBLIC :: one_tenth
45  PUBLIC :: half
46 
47  ! -----------------
48  ! Module parameters
49  ! -----------------
50  REAL(fp), PARAMETER :: zero = 0.0_fp
51  REAL(fp), PARAMETER :: point1 = 0.1_fp
52  REAL(fp), PARAMETER :: point5 = 0.5_fp
53  REAL(fp), PARAMETER :: one = 1.0_fp
54  REAL(fp), PARAMETER :: two = 2.0_fp
55  REAL(fp), PARAMETER :: three = 3.0_fp
56  REAL(fp), PARAMETER :: four = 4.0_fp
57  REAL(fp), PARAMETER :: pi = 3.141592653589793238462643_fp
58  REAL(fp), PARAMETER :: twopi = two*pi
59  REAL(fp), PARAMETER :: emissh_default = 0.25_fp
60  REAL(fp), PARAMETER :: emissv_default = 0.30_fp
61 
62  REAL(fp), PARAMETER :: one_tenth = point1
63  REAL(fp), PARAMETER :: half = point5
64 
65 
66 CONTAINS
67 
68 
69 !################################################################################
70 !################################################################################
71 !## ##
72 !## ## PUBLIC MODULE ROUTINES ## ##
73 !## ##
74 !################################################################################
75 !################################################################################
76 
77 !--------------------------------------------------------------------------------
78 !
79 ! NAME:
80 ! NESDIS_LandEM
81 !
82 ! PURPOSE:
83 ! Subroutine to simulate microwave emissivity over land conditions.
84 !
85 ! REFERENCES:
86 ! Weng, F., B. Yan, and N. Grody, 2001: "A microwave land emissivity model",
87 ! J. Geophys. Res., 106, 20, 115-20, 123
88 !
89 ! CALLING SEQUENCE:
90 ! CALL NESDIS_LandEM(Angle, & ! Input
91 ! Frequency, & ! Input
92 ! Soil_Moisture_Content, & ! Input
93 ! Vegetation_Fraction, & ! Input
94 ! Soil_Temperature, & ! Input
95 ! Land_Temperature, & ! Input
96 ! Snow_Depth, & ! Input
97 ! Emissivity_H, & ! Output
98 ! Emissivity_V) ! Output
99 !
100 ! INPUT ARGUMENTS:
101 ! Angle: The angle values in degree.
102 ! UNITS: Degrees
103 ! TYPE: REAL(fp)
104 ! DIMENSION: Rank-1, (I)
105 !
106 ! Frequency Frequency User defines
107 ! This is the "I" dimension
108 ! UNITS: GHz
109 ! TYPE: REAL(fp)
110 ! DIMENSION: Scalar
111 !
112 ! Soil_Moisture_Content: The volumetric water content of the soil (0:1).
113 ! UNITS: N/A
114 ! TYPE: REAL(fp)
115 ! DIMENSION: Scalar
116 !
117 ! Vegetation_Fraction: The vegetation fraction of the surface (0:1).
118 ! UNITS: N/A
119 ! TYPE: REAL(fp)
120 ! DIMENSION: Scalar
121 !
122 ! Soil_Temperature: The soil temperature.
123 ! UNITS: Kelvin, K
124 ! TYPE: REAL(fp)
125 ! DIMENSION: Scalar
126 !
127 ! Land_Temperature: The land surface temperature.
128 ! UNITS: Kelvin, K
129 ! TYPE: REAL(fp)
130 ! DIMENSION: Scalar
131 !
132 ! Snow_Depth: The snow depth.
133 ! UNITS: mm
134 ! TYPE: REAL(fp)
135 ! DIMENSION: Scalar
136 !
137 ! OUTPUT ARGUMENTS:
138 ! Emissivity_H: The surface emissivity at a horizontal
139 ! polarization.
140 ! UNITS: N/A
141 ! TYPE: REAL(fp)
142 ! DIMENSION: Scalar
143 !
144 ! Emissivity_V: The surface emissivity at a vertical polarization.
145 ! UNITS: N/A
146 ! TYPE: REAL(fp)
147 ! DIMENSION: Scalar
148 !
149 !
150 ! INTERNAL ARGUMENTS:
151 ! theta - local zenith angle in radian
152 ! rhob - bulk volume density of the soil (1.18-1.12)
153 ! rhos - density of the solids (2.65 g.cm^3 for solid soil material)
154 ! sand - sand fraction (sand + clay = 1.0)
155 ! clay - clay fraction
156 ! lai - leaf area index (eg. lai = 4.0 for corn leaves)
157 ! sigma - surface roughness formed between medium 1 and 2,
158 ! expressed as the standard deviation of roughtness height (mm)
159 ! leaf_thick -- leaf thickness (mm)
160 ! rad - radius of dense medium scatterers (mm)
161 ! va - fraction volume of dense medium scatterers(0.0 - 1.0)
162 ! ep - dielectric constant of ice or sand particles, complex value
163 ! (e.g, 3.0+i0.0)
164 !
165 ! CREATION HISTORY:
166 ! Written by: Banghua Yan, QSS Group Inc., 16-May-2005
167 ! Banghua.Yan@noaa.gov
168 ! Fuzhong Weng, NOAA/NESDIS/ORA,
169 ! Fuzhong.Weng@noaa.gov
170 !
171 !------------------------------------------------------------------------------------------------------------
172 
173  SUBROUTINE nesdis_landem(Angle, & ! Input
174  Frequency, & ! Input
175  Soil_Moisture_Content, & ! Input
176  Vegetation_Fraction, & ! Input
177  Soil_Temperature, & ! Input
178  t_skin, & ! Input
179  Lai, & ! Input
180  Soil_Type, & ! Input
181  Vegetation_Type, & ! Input
182  Snow_Depth, & ! Input
183  Emissivity_H, & ! Output
184  Emissivity_V) ! Output
185  ! Arguments
186  REAL(fp), intent(in) :: angle
187  REAL(fp), intent(in) :: frequency
188  REAL(fp), intent(in) :: soil_moisture_content
189  REAL(fp), intent(in) :: vegetation_fraction
190  REAL(fp), intent(in) :: soil_temperature
191  REAL(fp), intent(in) :: t_skin
192  REAL(fp), intent(in) :: lai
193  INTEGER, intent(in) :: soil_type
194  INTEGER, intent(in) :: vegetation_type
195  REAL(fp), intent(in) :: snow_depth
196  REAL(fp), intent(out):: emissivity_v,emissivity_h
197  ! Local parameters
198  REAL(fp), PARAMETER :: snow_depth_c = 10.0_fp
199  REAL(fp), PARAMETER :: tsoilc_undersnow = 280.0_fp
200  REAL(fp), PARAMETER :: rhos = 2.65_fp
201  REAL(fp) :: sand, clay, rhob
202  REAL(fp), PARAMETER, dimension(0:9) :: frac_sand = (/ 0.80_fp, &
203  0.92_fp, 0.10_fp, 0.20_fp, 0.51_fp, 0.50_fp, &
204  0.35_fp, 0.60_fp, 0.42_fp, 0.92_fp /)
205  REAL(fp), PARAMETER, dimension(0:9) :: frac_clay = (/ 0.20_fp, &
206  0.06_fp, 0.34_fp, 0.63_fp, 0.14_fp, 0.43_fp, &
207  0.34_fp, 0.28_fp, 0.085_fp, 0.06_fp /)
208  REAL(fp), PARAMETER, dimension(0:9) :: rhob_soil = (/ 1.48_fp, &
209  1.68_fp, 1.27_fp, 1.21_fp, 1.48_fp, 1.31_fp, &
210  1.32_fp, 1.40_fp, 1.54_fp, 1.68_fp /)
211 ! Specific Density
212  REAL(fp), PARAMETER, dimension(0:13) :: veg_rho = (/ 0.33_fp, &
213  0.40_fp, 0.40_fp, 0.40_fp, 0.40_fp, 0.40_fp, &
214  0.25_fp, 0.25_fp, 0.40_fp, 0.40_fp, 0.40_fp, &
215  0.40_fp, 0.33_fp, 0.33_fp /)
216 ! MGE
217  REAL(fp), PARAMETER, dimension(0:13) :: veg_mge = (/ 0.50_fp, &
218  0.45_fp, 0.45_fp, 0.45_fp, 0.40_fp, 0.40_fp, &
219  0.30_fp, 0.35_fp, 0.30_fp, 0.30_fp, 0.40_fp, &
220  0.30_fp, 0.50_fp, 0.40_fp /)
221 ! LAI
222  REAL(fp), PARAMETER, dimension(0:13) :: lai_min = (/ 0.52_fp, &
223  3.08_fp, 1.85_fp, 2.80_fp, 5.00_fp, 1.00_fp, &
224  0.50_fp, 0.52_fp, 0.60_fp, 0.50_fp, 0.60_fp, &
225  0.10_fp, 1.56_fp, 0.01_fp /)
226  REAL(fp), PARAMETER, dimension(0:13) :: lai_max = (/ 2.90_fp, &
227  6.48_fp, 3.31_fp, 5.50_fp, 6.40_fp, 5.16_fp, &
228  3.66_fp, 2.90_fp, 2.60_fp, 3.66_fp, 2.60_fp, &
229  0.75_fp, 5.68_fp, 0.01_fp /)
230 ! Leaf_thickness
231  REAL(fp), PARAMETER, dimension(0:13) :: leaf_th = (/ 0.07_fp, &
232  0.18_fp, 0.18_fp, 0.18_fp, 0.18_fp, 0.18_fp, &
233  0.12_fp, 0.12_fp, 0.12_fp, 0.12_fp, 0.12_fp, &
234  0.12_fp, 0.15_fp, 0.12_fp /)
235  ! Local variables
236  REAL(fp) :: mv,veg_frac,theta,theta_i,theta_t,mu,r21_h,r21_v,r23_h,r23_v, &
237  t21_v,t21_h,gv,gh,ssalb_h,ssalb_v,tau_h,tau_v,mge, &
238  leaf_thick,rad,sigma,va,ep_real,ep_imag
239  REAL(fp) :: t_soil
240  REAL(fp) :: rhoveg, vlai
241  REAL(fp) :: local_snow_depth
242  COMPLEX(fp) :: esoil, eveg, esnow, eair
243  LOGICAL :: snowem_physical_model
244 
245  eair = cmplx(one,-zero,fp)
246  theta = angle*pi/180.0_fp
247 
248  ! By default use the
249  ! Assign local variable
250  mv = soil_moisture_content
251  veg_frac = vegetation_fraction
252  t_soil = soil_temperature
253  sand = frac_sand(soil_type)
254  clay = frac_clay(soil_type )
255  rhob = rhob_soil(soil_type )
256  local_snow_depth = snow_depth
257 
258  ! Check soil/skin temperature
259  if ( (t_soil <= 100.0_fp .OR. t_soil >= 350.0_fp) .AND. &
260  (t_skin >= 100.0_fp .AND. t_skin <= 350.0_fp) ) t_soil = t_skin
261 
262  ! Check soil moisture content range
263  mv = max(min(mv,one),zero)
264 
265  ! Surface type based on snow depth
266  IF (local_snow_depth > point1) THEN
267 
268  ! O.k.; we're going to compute snow emissivities....
269 
270  ! By default use the physical model for snow
271  snowem_physical_model = .true.
272  if (local_snow_depth > snow_depth_c) snowem_physical_model = .false.
273 
274  ! Compute the snow emissivity
275  IF ( snowem_physical_model ) THEN
276 
277  ep_real = 3.2_fp
278  ep_imag = -0.0005_fp
279  sigma = one
280 
281  ! For deep snow, the performance of the model is poor
282  local_snow_depth = min(local_snow_depth,1000.0_fp)
283 
284  ! The fraction volume of dense medium
285  ! scatterers must be in the range (0-1)
286  va = 0.4_fp + 0.0004_fp*local_snow_depth
287  va = max(min(va,one),zero)
288 
289  ! Limit for snow grain size
290  rad = min((point5 + 0.005_fp*local_snow_depth),one)
291 
292  ! Limit for soil temperature
293  t_soil = min(t_soil,tsoilc_undersnow)
294 
295  CALL snow_diel(frequency, ep_real, ep_imag, rad, va, esnow)
296  CALL soil_diel(frequency, t_soil, mv, rhob, rhos, sand, clay, esoil)
297 
298  theta_i = asin(REAL(SIN(theta)*SQRT(eair)/SQRT(esnow),fp))
299 
300  CALL reflectance(esnow, eair, theta_i, theta, r21_v, r21_h)
301  CALL transmittance(esnow, eair, theta_i, theta, t21_v, t21_h)
302 
303  mu = cos(theta_i)
304  theta_t = asin(REAL(SIN(theta_i)*SQRT(esnow)/SQRT(esoil),fp))
305 
306  CALL reflectance(esnow, esoil, theta_i, theta_t, r23_v, r23_h)
307  CALL roughness_reflectance(frequency, sigma, r23_v, r23_h)
308  CALL snow_optic(frequency,rad,local_snow_depth,va,ep_real, ep_imag,gv,gh,&
309  ssalb_v,ssalb_h,tau_v,tau_h)
310  CALL two_stream_solution(mu,gv,gh,ssalb_h,ssalb_v,tau_h,tau_v, &
311  r21_h,r21_v,r23_h,r23_v,t21_v,t21_h,emissivity_v,emissivity_h, &
312  frequency, t_soil, t_skin)
313  ELSE
314  ! Use the empirical method
315  CALL snowem_default(frequency,t_skin, local_snow_depth,emissivity_v,emissivity_h)
316  END IF
317 
318  ELSE
319 
320  ! No snow, so we're going to compute canopy emissivities....
321 
322  ! Limit for vegetation fraction
323  veg_frac = max(min(veg_frac,one),zero)
324 
325 ! lai = THREE*veg_frac + POINT5
326 ! mge = POINT5*veg_frac
327 ! leaf_thick = 0.07_fp
328  mu = cos(theta)
329  sigma = point5
330 
331  vlai = lai*veg_frac
332  mge = veg_mge(vegetation_type)
333  rhoveg = veg_rho(vegetation_type)
334  leaf_thick = leaf_th(vegetation_type)
335 
336  r21_h = zero
337  r21_v = zero
338  t21_h = one
339  t21_v = one
340 
341  CALL soil_diel(frequency, t_soil, mv, rhob, rhos, sand, clay, esoil)
342  theta_t = asin(REAL(SIN(theta)*SQRT(eair)/SQRT(esoil),fp))
343  CALL reflectance(eair, esoil, theta, theta_t, r23_v, r23_h)
344  CALL roughness_reflectance(frequency, sigma, r23_v, r23_h)
345  CALL canopy_diel(frequency, mge, eveg, rhoveg)
346  CALL canopy_optic(vlai,frequency,theta,eveg,leaf_thick,gv,gh,ssalb_v,ssalb_h,tau_v,tau_h)
347  CALL two_stream_solution(mu,gv,gh,ssalb_h,ssalb_v,tau_h,tau_v, &
348  r21_h,r21_v,r23_h,r23_v,t21_v,t21_h,emissivity_v,emissivity_h, &
349  frequency, t_soil, t_skin)
350  END IF
351 
352  END SUBROUTINE nesdis_landem
353 
354 
355 
356 !##################################################################################
357 !##################################################################################
358 !## ##
359 !## ## PRIVATE MODULE ROUTINES ## ##
360 !## ##
361 !##################################################################################
362 !##################################################################################
363 
364 
365 
366 subroutine snowem_default(frequency,ts, depth,Emissivity_V,Emissivity_H)
368 !----------------------------------------------------------------------------------
369 !$$$ subprogram documentation block
370 ! . . .
371 ! prgmmr: Banghua Yan and Fuzhong Weng org: nesdis date: 2005-12-01
372 !
373 ! abstract: preliminary estimate of snow emissivity using surface temperature and snow depth
374 !
375 ! input argument list:
376 !
377 ! ts - surface temperature
378 ! frequency - frequency (ghz)
379 !
380 ! output argument list:
381 !
382 ! Emissivity_V - snow emissivty at V-POL
383 ! Emissivity_H - snow emissivty at H-POL
384 !
385 ! remarks:
386 !
387 ! attributes:
388 ! language: f90
389 ! machine: ibm rs/6000 sp
390 !
391 !------------------------------------------------------------------------------------------------------------
392 
393  ! Arguments
394  REAL(fp) :: frequency,ts, depth,Emissivity_V,Emissivity_H
395  ! Local parameters
396  INTEGER , PARAMETER :: new = 7
397  INTEGER , PARAMETER :: NFRESH_SHALLOW_SNOW = 1
398  INTEGER , PARAMETER :: NPOWDER_SNOW = 2
399  INTEGER , PARAMETER :: NWET_SNOW = 3
400  INTEGER , PARAMETER :: NDEEP_SNOW = 4
401  REAL(fp), PARAMETER :: twet = 270.0_fp
402  REAL(fp), PARAMETER :: tcrust = 235.0_fp
403  REAL(fp), PARAMETER :: depth_s = 50.0_fp
404  REAL(fp), PARAMETER :: depth_c = 100.0_fp
405  ! Local variables
406  INTEGER :: ich,basic_snow_type
407  REAL(fp), DIMENSION(new) :: ev, eh, freq
408  REAL(fp) :: df, df0
409 
410 
411  freq = frequency_amsre(1:new)
412 
413  ! Determine the snow type based on temperatures
414  basic_snow_type = nfresh_shallow_snow
415  if (ts >= twet .and. depth <= depth_s) then
416  basic_snow_type = nwet_snow
417  else
418  if (depth <= depth_s) then
419  basic_snow_type = nfresh_shallow_snow
420  else
421  basic_snow_type = npowder_snow
422  endif
423  endif
424  if (ts <= tcrust .and. depth >= depth_c) basic_snow_type = ndeep_snow
425 
426  ! Assign the emissivity spectrum
427  SELECT CASE (basic_snow_type)
428  CASE (nfresh_shallow_snow)
429  ev = grass_after_snow_ev_amsre(1:new)
430  eh = grass_after_snow_eh_amsre(1:new)
431  CASE (npowder_snow)
432  ev = powder_snow_ev_amsre(1:new)
433  eh = powder_snow_eh_amsre(1:new)
434  CASE (nwet_snow)
435  ev = wet_snow_ev_amsre(1:new)
436  eh = wet_snow_eh_amsre(1:new)
437  CASE (ndeep_snow)
438  ev = deep_snow_ev_amsre(1:new)
439  eh = deep_snow_eh_amsre(1:new)
440  END SELECT
441 
442  ! Handle possible extrapolation
443  if (frequency <= freq(1)) then
444  emissivity_h = eh(1)
445  emissivity_v = ev(1)
446  return
447  end if
448  if (frequency >= freq(new)) then
449  emissivity_h = eh(new)
450  emissivity_v = ev(new)
451  return
452  end if
453 
454  ! Interpolate emissivity at a certain frequency
455  channel_loop: do ich=2,new
456  if (frequency <= freq(ich)) then
457  df = frequency-freq(ich-1)
458  df0 = freq(ich)-freq(ich-1)
459  emissivity_h = eh(ich-1) + (df*(eh(ich)-eh(ich-1))/df0)
460  emissivity_v = ev(ich-1) + (df*(ev(ich)-ev(ich-1))/df0)
461  exit channel_loop
462  end if
463  end do channel_loop
464 
465 end subroutine snowem_default
466 
467 
468 subroutine canopy_optic(vlai,frequency,theta,esv,d,gv,gh,&
469  ssalb_v,ssalb_h,tau_v, tau_h)
471 !----------------------------------------------------------------------------------
472 !$$$ subprogram documentation block
473 ! . . . .
474 ! subprogram: canopy_optic compute optic parameters for canopy
475 !
476 ! prgmmr: Fuzhong Weng and Banghua Yan org: nesdis date: 2000-11-28
477 !
478 ! abstract: compute optic parameters for canopy
479 !
480 ! program history log:
481 !
482 ! input argument list:
483 !
484 ! lai - leaf area index
485 ! frequency - frequency (ghz)
486 ! theta - incident angle
487 ! esv - leaf dielectric constant
488 ! d - leaf thickness (mm)
489 !
490 ! output argument list:
491 !
492 ! gv - asymmetry factor for v pol
493 ! gh - asymmetry factor for h pol
494 ! ssalb_v - single scattering albedo at v. polarization
495 ! ssalb_h - single scattering albedo at h. polarization
496 ! tau_v - optical depth at v. polarization
497 ! tau_h - optical depth at h. polarization
498 !
499 ! remarks:
500 !
501 ! attributes:
502 ! language: f90
503 ! machine: ibm rs/6000 sp
504 !
505 !------------------------------------------------------------------------------------------------------------
506 
507  REAL(fp) :: frequency,theta,d,vlai,ssalb_v,ssalb_h,tau_v,tau_h,gv, gh, mu
508  COMPLEX(fp) :: ix,k0,kz0,kz1,rhc,rvc,esv,expval1,factt,factrvc,factrhc
509  REAL(fp) :: rh,rv,th,tv
510  REAL(fp), PARAMETER :: threshold = 0.999_fp
511 
512  mu = cos(theta)
513  ix = cmplx(zero, one, fp)
514 
515  k0 = cmplx(twopi*frequency/300.0_fp, zero, fp) ! 1/mm
516  kz0 = k0*mu
517  kz1 = k0*sqrt(esv - sin(theta)**2)
518 
519  rhc = (kz0 - kz1)/(kz0 + kz1)
520  rvc = (esv*kz0 - kz1)/(esv*kz0 + kz1)
521 
522  expval1 = exp(-two*ix*kz1*d)
523  factrvc = one-rvc**2*expval1
524  factrhc = one-rhc**2*expval1
525  factt = four*kz0*kz1*exp(ix*(kz0-kz1)*d)
526 
527  rv = abs(rvc*(one - expval1)/factrvc)**2
528  rh = abs(rhc*(one - expval1)/factrhc)**2
529 
530  th = abs(factt/((kz1+kz0)**2*factrhc))**2
531  tv = abs(esv*factt/((kz1+esv*kz0)**2*factrvc))**2
532 
533  gv = point5
534  gh = point5
535 
536  tau_v = point5*vlai*(two-tv-th)
537  tau_h = tau_v
538 
539  ssalb_v = min((rv+rh)/(two-tv-th),threshold)
540  ssalb_h = ssalb_v
541 
542 end subroutine canopy_optic
543 
544 
545 subroutine snow_optic(frequency,a,h,f,ep_real,ep_imag,gv,gh, ssalb_v,ssalb_h,tau_v,tau_h)
547 !-------------------------------------------------------------------------------------------------------------
548 !$$$ subprogram documentation block
549 ! . . . .
550 ! subprogram: landem comput optic parameters for snow
551 !
552 ! prgmmr: Fuzhong Weng and Banghua Yan org: nesdis date: 2000-11-28
553 !
554 ! abstract: compute optic parameters for snow
555 !
556 ! program history log:
557 !
558 ! input argument list:
559 !
560 ! theta - local zenith angle (degree)
561 ! frequency - frequency (ghz)
562 ! ep_real - real part of dielectric constant of particles
563 ! ep_imag - imaginary part of dielectric constant of particles
564 ! a - particle radiu (mm)
565 ! h - snow depth(mm)
566 ! f - fraction volume of snow (0.0 - 1.0)
567 !
568 ! output argument list:
569 !
570 ! ssalb - single scattering albedo
571 ! tau - optical depth
572 ! g - asymmetry factor
573 !
574 ! important internal variables:
575 !
576 ! ks - scattering coeffcient (/mm)
577 ! ka - absorption coeffient (/mm)
578 ! kp - eigenvalue of two-stream approximation
579 ! y - = yr+iyi
580 !
581 ! remarks:
582 !
583 ! attributes:
584 ! language: f90
585 ! machine: ibm rs/6000 sp
586 !
587 !----------------------------------------------------------------------------------
588 
589  REAL(fp) :: yr,yi,ep_real,ep_imag
590  REAL(fp) :: frequency,a,h,f,ssalb_v,ssalb_h,tau_v,tau_h,gv,gh,k
591  REAL(fp) :: ks1,ks2,ks3,ks,kr1,kr2,kr3,kr,ki1,ki2,ki3,ki
592  REAL(fp) :: fact1,fact2,fact3,fact4,fact5
593 
594  k = twopi/(300._fp/frequency)
595 
596  yr = (ep_real - one)/(ep_real + two)
597  yi = -ep_imag/(ep_real + two)
598 
599  fact1 = (one+two*f)**2
600  fact2 = one-f*yr
601  fact3 = (one-f)**4
602  fact4 = f*(k*a)**3
603  fact5 = one+two*f*yr
604 
605  ks1 = k*sqrt(fact2/fact5)
606  ks2 = fact4*fact3/fact1
607  ks3 = (yr/fact2)**2
608  ks = ks1*ks2*ks3
609 
610  kr1 = fact5/fact2
611  kr2 = two*ks2
612  kr3 = two*yi*yr/(fact2**3)
613  kr = k*sqrt(kr1+kr2*kr3)
614 
615  ki1 = three*f*yi/fact2**2
616  ki2 = kr2
617  ki3 = ks3
618  ki = k**2/(two*kr)*(ki1+ki2*ki3)
619 
620  gv = point5
621  gh = point5
622 
623  ssalb_v = min(ks/ki, 0.999_fp)
624  ssalb_h = ssalb_v
625  tau_v = two*ki*h
626  tau_h = tau_v
627 
628 end subroutine snow_optic
629 
630 
631 subroutine soil_diel(freq,t_soil,vmc,rhob,rhos,sand,clay,esm)
633 !----------------------------------------------------------------------------------
634 !$$$ subprogram documentation block
635 ! . . . .
636 ! subprogram: Soil_Diel calculate the dielectric properties of soil
637 !
638 ! prgmmr: Fuzhong Weng and Banghua Yan org: nesdis date: 2000-11-28
639 !
640 ! abstract: compute the dilectric constant of the bare soil
641 !
642 ! program history log:
643 !
644 ! input argument list:
645 !
646 ! theta - local zenith angle (degree)
647 ! frequency - frequency (ghz)
648 ! t_soil - soil temperature
649 ! vmc - volumetric moisture content (demensionless)
650 ! rhob - bulk volume density of the soil (1.18-1.12)
651 ! rhos - density of the solids (2.65 g.cm^3 for
652 ! solid soil material)
653 ! sand - sand fraction (sand + clay = 1.0)
654 ! clay - clay fraction
655 !
656 ! output argument list:
657 !
658 ! esm - dielectric constant for bare soil
659 !
660 ! important internal variables:
661 !
662 ! esof - the permittivity of free space
663 ! eswo - static dieletric constant
664 ! tauw - relaxation time of water
665 ! s - salinity
666 !
667 ! remarks:
668 !
669 ! attributes:
670 ! language: f90
671 ! machine: ibm rs/6000 sp
672 !
673 !----------------------------------------------------------------------------------
674 
675  REAL(fp) :: f,tauw,freq,t_soil,vmc,rhob,rhos,sand,clay
676  REAL(fp) :: alpha,beta,ess,rhoef,t,eswi,eswo
677  REAL(fp) :: esof
678  COMPLEX(fp) :: esm,esw,es1,es2
679 
680  alpha = 0.65_fp
681  beta = 1.09_fp - 0.11_fp*sand + 0.18_fp*clay
682  ess = (1.01_fp + 0.44_fp*rhos)**2 - 0.062_fp
683  rhoef = -1.645_fp + 1.939_fp*rhob - 0.020213_fp*sand + 0.01594_fp*clay
684  t = t_soil - 273.0_fp
685  f = freq*1.0e9_fp
686 
687  ! the permittivity at the high frequency limit
688  eswi = 5.5_fp
689 
690  ! the permittivity of free space (esof)
691  esof = 8.854e-12_fp
692 
693  ! static dieletric constant (eswo)
694  eswo = 87.134_fp+(-1.949e-1_fp+(-1.276e-2_fp+2.491e-4_fp*t)*t)*t
695  tauw = 1.1109e-10_fp+(-3.824e-12_fp+(6.938e-14_fp-5.096e-16_fp*t)*t)*t
696 
697  if (vmc > zero) then
698  es1 = cmplx(eswi, -rhoef*(rhos-rhob)/(twopi*f*esof*rhos*vmc), fp)
699  else
700  es1 = cmplx(eswi, zero, fp)
701  endif
702 
703  es2 = cmplx(eswo-eswi, zero, fp)/cmplx(one, f*tauw, fp)
704  esw = es1 + es2
705  esm = one + (ess**alpha - one)*rhob/rhos + vmc**beta*esw**alpha - vmc
706  esm = esm**(one/alpha)
707 
708  if(aimag(esm) >= zero) esm = cmplx(REAL(esm,fp),-0.0001_fp, fp)
709 
710 end subroutine soil_diel
711 
712 
713 subroutine snow_diel(frequency,ep_real,ep_imag,rad,frac,ep_eff)
715 !----------------------------------------------------------------------------------
716 !$$$ subprogram documentation block
717 ! . . . .
718 ! subprogram: Snow_Diel compute dielectric constant of snow
719 !
720 ! prgmmr: Fuzhong Weng and Banghua Yan org: nesdis date: 2000-11-28
721 !
722 ! abstract: compute dielectric constant of snow
723 !
724 !
725 ! program history log:
726 !
727 ! input argument list:
728 !
729 ! frequency - frequency (ghz)
730 ! ep_real - real part of dielectric constant of particle
731 ! ep_imag - imaginary part of dielectric constant of particle
732 ! rad - particle radiu (mm)
733 ! frac - fraction volume of snow (0.0 - 1.0)
734 !
735 ! output argument list:
736 !
737 ! ep_eff - dielectric constant of the dense medium
738 !
739 ! remarks:
740 !
741 ! attributes:
742 ! language: f90
743 ! machine: ibm rs/6000 sp
744 !
745 ! Copyright (C) 2005 Fuzhong Weng and Banghua Yan
746 !
747 ! This program is free software; you can redistribute it and/or modify it under the terms of the GNU
748 ! General Public License as published by the Free Software Foundation; either version 2 of the License,
749 ! or (at your option) any later version.
750 !
751 ! This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
752 ! the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
753 ! License for more details.
754 !
755 ! You should have received a copy of the GNU General Public License along with this program; if not, write
756 ! to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
757 !----------------------------------------------------------------------------------
758 
759  REAL(fp) :: ep_imag,ep_real
760  REAL(fp) :: frequency,rad,frac,k0,yr,yi
761  COMPLEX(fp) :: y,ep_r,ep_i,ep_eff,fracy
762 
763  k0 = twopi/(300.0_fp/frequency)
764 
765  yr = (ep_real - one)/(ep_real + two)
766  yi = ep_imag/(ep_real + two)
767 
768  y = cmplx(yr, yi, fp)
769  fracy=frac*y
770 
771  ep_r = (one + two*fracy)/(one - fracy)
772  ep_i = two*fracy*y*(k0*rad)**3*(one-frac)**4/((one-fracy)**2*(one+two*frac)**2)
773  ep_eff = ep_r - cmplx(zero,one,fp)*ep_i
774 
775  if (aimag(ep_eff) >= zero) ep_eff = cmplx(REAL(ep_eff), -0.0001_fp, fp)
776 
777 end subroutine snow_diel
778 
779 
780 subroutine canopy_diel(frequency,mg,esv,rhoveg)
782 !----------------------------------------------------------------------------------
783 !
784 !$$$ subprogram documentation block
785 ! . . . .
786 ! subprogram: canopy_diel compute the dielectric constant of the vegetation canopy
787 !
788 ! prgmmr: Fuzhong Weng and Banghua Yan org: nesdis date: 2000-11-28
789 !
790 ! abstract: compute the dielectric constant of the vegetation canopy geomatrical optics approximation
791 !
792 ! for vegetation canopy work for horizontal leaves
793 !
794 ! program history log:
795 !
796 ! input argument list:
797 !
798 ! frequency - frequency (ghz)
799 ! mg - gravimetric water content
800 !
801 ! output argument list:
802 !
803 ! esv - dielectric constant of leaves
804 !
805 ! remarks:
806 !
807 ! references:
808 !
809 ! ulaby and el-rayer, 1987: microwave dielectric spectrum of vegetation part ii,
810 ! dual-dispersion model, ieee trans geosci. remote sensing, 25, 550-557
811 !
812 ! attributes:
813 ! language: f90
814 ! machine: ibm rs/6000 sp
815 !
816 !----------------------------------------------------------------------------------
817 
818  REAL(fp) :: frequency, mg, en, vf, vb
819  REAL(fp) :: rhoveg, vmv
820  COMPLEX(fp) :: esv, xx
821 
822  vmv = mg*rhoveg/( one - mg*(one-rhoveg) )
823  en = 1.7_fp + (3.2_fp + 6.5_fp*vmv)*vmv
824 
825  vf = vmv*(0.82_fp*vmv + 0.166_fp)
826  vb = 31.4_fp*vmv*vmv/( one + 59.5_fp*vmv*vmv)
827 
828  xx = cmplx(zero,one,fp)
829 
830  esv = en + vf*(4.9_fp + 75.0_fp/(one + xx*frequency/18.0_fp)-xx*(18.0_fp/frequency)) + &
831  vb*(2.9_fp + 55.0_fp/(one + sqrt(xx*frequency/0.18_fp)))
832 
833  if (aimag(esv) >= zero) esv = cmplx(REAL(esv), -0.0001_fp, fp)
834 
835 end subroutine canopy_diel
836 
837 
838 subroutine reflectance(em1, em2, theta_i, theta_t, rv, rh)
840 !----------------------------------------------------------------------------------
841 !$$$ subprogram documentation block
842 ! . . . .
843 ! subprogram: Reflectance compute the surface reflectivity
844 !
845 ! prgmmr: org: nesdis date: 2000-11-28
846 !
847 ! abstract: compute the surface reflectivety using fresnel equations
848 ! for a rough surface having a standard deviation of height of sigma
849 !
850 ! program history log:
851 !
852 ! input argument list:
853 ! theta_i - incident angle (degree)
854 ! theta_t - transmitted angle (degree)
855 ! em1 - dielectric constant of the medium 1
856 ! em2 - dielectric constant of the medium 2
857 !
858 ! output argument list:
859 !
860 ! rv - reflectivity at vertical polarization
861 ! rh - reflectivity at horizontal polarization
862 !
863 ! remarks:
864 !
865 ! attributes:
866 ! language: f90
867 ! machine: ibm rs/6000 sp
868 !
869 !----------------------------------------------------------------------------------
870 
871  REAL(fp) :: theta_i, theta_t
872  REAL(fp) :: rh, rv,cos_i,cos_t
873  COMPLEX(fp) :: em1, em2, m1, m2, angle_i, angle_t
874 
875  ! compute the refractive index ratio between medium 2 and 1
876  ! using dielectric constant (n = SQRT(e))
877  cos_i = cos(theta_i)
878  cos_t = cos(theta_t)
879 
880  angle_i = cmplx(cos_i, zero, fp)
881  angle_t = cmplx(cos_t, zero, fp)
882 
883  m1 = sqrt(em1)
884  m2 = sqrt(em2)
885 
886  rv = (abs((m1*angle_t-m2*angle_i)/(m1*angle_t+m2*angle_i)))**2
887  rh = (abs((m1*angle_i-m2*angle_t)/(m1*angle_i+m2*angle_t)))**2
888 
889 end subroutine reflectance
890 
891 
892 subroutine transmittance(em1,em2,theta_i,theta_t,tv,th)
894 !----------------------------------------------------------------------------------
895 !$$$ subprogram documentation block
896 ! . . . .
897 ! subprogram: Transmittance calculate Transmittance
898 !
899 ! prgmmr: Banghua Yan and Fuzhong Weng org: nesdis date: 2000-11-28
900 !
901 ! abstract: compute Transmittance
902 !
903 ! program history log:
904 !
905 ! input argument list:
906 !
907 ! theta - local zenith angle (degree)
908 ! theta_i - incident angle (degree)
909 ! theta_t - transmitted angle (degree)
910 ! em1 - dielectric constant of the medium 1
911 ! em2 - dielectric constant of the medium 2
912 !
913 ! output argument list:
914 !
915 ! tv - transmisivity at vertical polarization
916 ! th - transmisivity at horizontal polarization
917 !
918 ! remarks:
919 !
920 ! attributes:
921 ! language: f90
922 ! machine: ibm rs/6000 sp
923 !
924 !----------------------------------------------------------------------------------
925 
926  REAL(fp) :: theta_i, theta_t
927  REAL(fp) :: th, tv, rr, cos_i,cos_t
928  COMPLEX(fp) :: em1, em2, m1, m2, angle_i, angle_t
929 
930  ! compute the refractive index ratio between medium 2 and 1
931  ! using dielectric constant (n = SQRT(e))
932  cos_i = cos(theta_i)
933  cos_t = cos(theta_t)
934 
935  angle_i = cmplx(cos_i, zero, fp)
936  angle_t = cmplx(cos_t, zero, fp)
937 
938  m1 = sqrt(em1)
939  m2 = sqrt(em2)
940 
941  rr = abs(m2/m1)*cos_t/cos_i
942  tv = rr*(abs(two*m1*angle_i/(m1*angle_t + m2*angle_i)))**2
943  th = rr*(abs(two*m1*angle_i/(m1*angle_i + m2*angle_t)))**2
944 
945 end subroutine transmittance
946 
947 
948 subroutine roughness_reflectance(frequency,sigma,rv,rh)
950 !-------------------------------------------------------------------------------------------------------------
951 !$$$ subprogram documentation block
952 ! . . . .
953 ! subprogram: rought_reflectance calculate surface relectivity
954 !
955 ! prgmmr: Banghua Yan and Fuzhong Weng org: nesdis date: 2000-11-28
956 !
957 ! abstract: compute the surface reflectivety for a rough surface having a standard devoation of height of sigma
958 !
959 !
960 ! program history log:
961 !
962 ! input argument list:
963 !
964 ! frequency - frequency (ghz)
965 !
966 ! theta - local zenith angle (degree) (currently, not used here)
967 !
968 ! sigma - standard deviation of rough surface height
969 !
970 ! smooth surface:0.38, medium: 1.10, rough:2.15 cm
971 !
972 ! internal variables
973 !
974 !
975 ! output argument list:
976 !
977 ! rv - reflectivity at vertical polarization
978 ! rh - reflectivity at horizontal polarization
979 !
980 !
981 ! important internal variables:
982 !
983 ! k0 - a propagation constant or wavenumber in a free space
984 !
985 ! remarks:
986 !
987 ! references:
988 !
989 ! wang, j. and b. j. choudhury, 1992: passive microwave radiation from soil: examples...
990 ! passive microwave remote sensing of .. ed. b. j. choudhury, etal vsp.
991 ! also wang and choudhury (1982)
992 !
993 ! attributes:
994 ! language: f90
995 ! machine: ibm rs/6000 sp
996 !
997 !-------------------------------------------------------------------------------------------------------------
998 
999  REAL(fp) :: frequency
1000  REAL(fp) :: q, rh, rv, rh_s, rv_s, sigma
1001 
1002  rh_s = 0.3_fp*rh
1003  rv_s = 0.3_fp*rv
1004  q = 0.35_fp*(one - exp(-0.60_fp*frequency*sigma**two))
1005  rh = rh_s + q*(rv_s-rh_s)
1006  rv = rv_s + q*(rh_s-rv_s)
1007 
1008 end subroutine roughness_reflectance
1009 
1010 
1011 subroutine two_stream_solution(mu,gv,gh,ssalb_h,ssalb_v,tau_h,tau_v, &
1012  r21_h,r21_v,r23_h,r23_v,t21_v,t21_h,esv,esh,frequency,t_soil,t_skin)
1014 !-------------------------------------------------------------------------------------------------------------
1015 !$$$ subprogram documentation block
1016 ! . . . .
1017 ! subprogram: two_stream_solution
1018 !
1019 ! prgmmr: Banghua Yan and Fuzhong Weng org: nesdis date: 2000-11-28
1020 !
1021 ! abstract: two stream solution
1022 ! Updated with the more accurate formula of total upwelling radiance emanating from the surface.
1023 !
1024 ! REFERENCES:
1025 ! Weng, F., B. Yan, and N. Grody, 2001: "A microwave land emissivity model", J. Geophys. Res., 106,
1026 ! 20, 115-20, 123
1027 ! version: beta
1028 !
1029 ! program history log:
1030 !
1031 ! input argument list:
1032 !
1033 ! b - scattering layer temperature (k) (gdas) (not used here)
1034 ! mu - cos(theta)
1035 ! gv - asymmetry factor for v pol
1036 ! gh - asymmetry factor for h pol
1037 ! ssalb_v - single scattering albedo at v. polarization
1038 ! ssalb_h - single scattering albedo at h. polarization
1039 ! tau_v - optical depth at v. polarization
1040 ! tau_h - optical depth at h. polarization
1041 ! r12_v - reflectivity at vertical polarization (not used here)
1042 ! r12_h - reflectivity at horizontal polarization (not used here)
1043 ! r21_v - reflectivity at vertical polarization
1044 ! r21_h - reflectivity at horizontal polarization
1045 ! r23_v - reflectivity at vertical polarization
1046 ! r23_h - reflectivity at horizontal polarization
1047 ! t21_v - transmisivity at vertical polarization
1048 ! t21_h - transmisivity at horizontal polarization
1049 ! t12_v - transmisivity at vertical polarization (not used here)
1050 ! t12_h - transmisivity at horizontal polarization (not used here)
1051 ! Frequency - frequency
1052 ! t_soil - soil temperature
1053 ! t_skin - land surface temperature
1054 !
1055 ! output argument list:
1056 !
1057 ! esh - emissivity for horizontal polarization
1058 ! esv - emissivity for vertical polarization
1059 !
1060 ! Local variables:
1061 ! gsect0, gsect1_h, gsect1_v, gsect2_h, gsect2_v
1062 !
1063 ! remarks:
1064 !
1065 ! attributes:
1066 ! language: f90
1067 ! machine: ibm rs/6000 sp
1068 !
1069 !-------------------------------------------------------------------------------------------------------------
1070 
1071  REAL(fp) :: mu, gv, gh, ssalb_h, ssalb_v, tau_h,tau_v, &
1072  r21_h, r21_v, r23_h, r23_v, t21_v, t21_h, esv, esh
1073  REAL(fp) :: alfa_v, alfa_h, kk_h, kk_v, gamma_h, gamma_v, beta_v, beta_h
1074  REAL(fp) :: fact1,fact2
1075  REAL(fp) :: frequency, t_soil, t_skin
1076  REAL(fp) :: gsect0, gsect1_h, gsect1_v, gsect2_h, gsect2_v
1077 
1078  alfa_h = sqrt((one - ssalb_h)/(one - gh*ssalb_h))
1079  kk_h = sqrt((one - ssalb_h)*(one - gh*ssalb_h))/mu
1080  beta_h = (one - alfa_h)/(one + alfa_h)
1081  gamma_h = (beta_h -r23_h)/(one-beta_h*r23_h)
1082 
1083  alfa_v = sqrt((one-ssalb_v)/(one - gv*ssalb_v))
1084  kk_v = sqrt((one-ssalb_v)*(one - gv*ssalb_v))/mu
1085  beta_v = (one - alfa_v)/(one + alfa_v)
1086  gamma_v = (beta_v -r23_v)/(one-beta_v*r23_v)
1087 
1088  fact1=gamma_h*exp(-two*kk_h*tau_h)
1089  fact2=gamma_v*exp(-two*kk_v*tau_v)
1090 
1091  gsect0 =(exp(c_2*frequency/t_skin) -one)/(exp(c_2*frequency/t_soil) -one)
1092 
1093  gsect1_h=(one-r23_h)*(gsect0-one)
1094  gsect2_h=((one-beta_h*beta_h)/(one-beta_h*r23_h))*exp(-kk_h*tau_h)
1095 
1096  gsect1_v=(one-r23_v)*(gsect0-one)
1097  gsect2_v=((one-beta_v*beta_v)/(one-beta_v*r23_v))*exp(-kk_h*tau_v)
1098 
1099  esh = t21_h*((one - beta_h)*(one + fact1)+gsect1_h*gsect2_h) /(one-beta_h*r21_h-(beta_h-r21_h)*fact1)
1100  esv = t21_v*((one - beta_v)*(one + fact2)+gsect1_v*gsect2_v) /(one-beta_v*r21_v-(beta_v-r21_v)*fact2)
1101 
1102  if (esh < emissh_default) esh = emissh_default
1103  if (esv < emissv_default) esv = emissv_default
1104 
1105  if (esh > one) esh = one
1106  if (esv > one) esv = one
1107 
1108 end subroutine two_stream_solution
1109 
1110 END MODULE nesdis_landem_module
real(fp), parameter, public half
subroutine transmittance(em1, em2, theta_i, theta_t, tv, th)
real(fp), dimension(n_freq_amsre), parameter, public wet_snow_ev_amsre
real(fp), parameter, public zero
real(fp), parameter, public four
integer, parameter, public fp
Definition: Type_Kinds.f90:124
real(fp), dimension(n_freq_amsre), parameter, public frequency_amsre
real(fp), parameter, public three
subroutine, public nesdis_landem(Angle, Frequency, Soil_Moisture_Content, Vegetation_Fraction, Soil_Temperature, t_skin, Lai, Soil_Type, Vegetation_Type, Snow_Depth, Emissivity_H, Emissivity_V)
real(fp), dimension(n_freq_amsre), parameter, public deep_snow_ev_amsre
real(fp), parameter, public point5
subroutine snowem_default(frequency, ts, depth, Emissivity_V, Emissivity_H)
real(fp), dimension(n_freq_amsre), parameter, public wet_snow_eh_amsre
real(fp), dimension(n_freq_amsre), parameter, public grass_after_snow_ev_amsre
real(fp), parameter, public c_2
subroutine soil_diel(freq, t_soil, vmc, rhob, rhos, sand, clay, esm)
subroutine two_stream_solution(mu, gv, gh, ssalb_h, ssalb_v, tau_h, tau_v, r21_h, r21_v, r23_h, r23_v, t21_v, t21_h, esv, esh, frequency, t_soil, t_skin)
real(fp), parameter, public emissh_default
real(fp), parameter, public one
real(fp), parameter, public twopi
subroutine roughness_reflectance(frequency, sigma, rv, rh)
subroutine canopy_diel(frequency, mg, esv, rhoveg)
real(fp), parameter, public two
subroutine canopy_optic(vlai, frequency, theta, esv, d, gv, gh, ssalb_v, ssalb_h, tau_v, tau_h)
real(fp), dimension(n_freq_amsre), parameter, public grass_after_snow_eh_amsre
real(fp), dimension(n_freq_amsre), parameter, public powder_snow_ev_amsre
real(fp), parameter, public point1
#define max(a, b)
Definition: mosaic_util.h:33
real(fp), parameter, public one_tenth
real(fp), dimension(n_freq_amsre), parameter, public powder_snow_eh_amsre
real(fp), dimension(n_freq_amsre), parameter, public deep_snow_eh_amsre
subroutine reflectance(em1, em2, theta_i, theta_t, rv, rh)
subroutine snow_diel(frequency, ep_real, ep_imag, rad, frac, ep_eff)
#define min(a, b)
Definition: mosaic_util.h:32
subroutine snow_optic(frequency, a, h, f, ep_real, ep_imag, gv, gh, ssalb_v, ssalb_h, tau_v, tau_h)
real(fp), parameter, public emissv_default
real(fp), parameter, public pi