1 | ! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
2 | ! Copyright (c) 2015, Regents of the University of Colorado |
---|
3 | ! All rights reserved. |
---|
4 | ! |
---|
5 | ! Redistribution and use in source and binary forms, with or without modification, are |
---|
6 | ! permitted provided that the following conditions are met: |
---|
7 | ! |
---|
8 | ! 1. Redistributions of source code must retain the above copyright notice, this list of |
---|
9 | ! conditions and the following disclaimer. |
---|
10 | ! |
---|
11 | ! 2. Redistributions in binary form must reproduce the above copyright notice, this list |
---|
12 | ! of conditions and the following disclaimer in the documentation and/or other |
---|
13 | ! materials provided with the distribution. |
---|
14 | ! |
---|
15 | ! 3. Neither the name of the copyright holder nor the names of its contributors may be |
---|
16 | ! used to endorse or promote products derived from this software without specific prior |
---|
17 | ! written permission. |
---|
18 | ! |
---|
19 | ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY |
---|
20 | ! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
---|
21 | ! MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL |
---|
22 | ! THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
---|
23 | ! SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT |
---|
24 | ! OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
---|
25 | ! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
---|
26 | ! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
---|
27 | ! OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
---|
28 | ! |
---|
29 | ! History: |
---|
30 | ! May 2015: Dustin Swales - Initial version |
---|
31 | ! |
---|
32 | ! %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
---|
33 | module mod_quickbeam_optics |
---|
34 | USE COSP_KINDS, ONLY: wp,dp |
---|
35 | USE array_lib, ONLY: infind |
---|
36 | USE math_lib, ONLY: path_integral,avint,gamma |
---|
37 | USE optics_lib, ONLY: m_wat,m_ice,MieInt |
---|
38 | USE cosp_math_constants, ONLY: pi |
---|
39 | USE cosp_phys_constants, ONLY: rhoice |
---|
40 | use quickbeam, ONLY: radar_cfg,dmin,dmax,Re_BIN_LENGTH, & |
---|
41 | Re_MAX_BIN,nRe_types,nd,maxhclass |
---|
42 | use mod_cosp_config, ONLY: N_HYDRO |
---|
43 | use mod_cosp_error, ONLY: errorMessage |
---|
44 | implicit none |
---|
45 | |
---|
46 | ! Derived type for particle size distribution |
---|
47 | TYPE size_distribution |
---|
48 | real(wp),dimension(maxhclass) :: p1,p2,p3,dmin,dmax,apm,bpm,rho |
---|
49 | integer, dimension(maxhclass) :: dtype,phase |
---|
50 | END TYPE size_distribution |
---|
51 | |
---|
52 | ! Parameters |
---|
53 | integer,parameter :: & ! |
---|
54 | cnt_liq = 19, & ! Liquid temperature count |
---|
55 | cnt_ice = 20 ! Lce temperature count |
---|
56 | |
---|
57 | ! Initialization variables |
---|
58 | real(wp),dimension(cnt_ice) :: mt_tti |
---|
59 | real(wp),dimension(cnt_liq) :: mt_ttl |
---|
60 | real(wp),dimension(nd) :: D |
---|
61 | !logical :: lQuickbeamInit |
---|
62 | |
---|
63 | contains |
---|
64 | ! ###################################################################################### |
---|
65 | ! SUBROUTINE quickbeam_optics_init |
---|
66 | ! ###################################################################################### |
---|
67 | subroutine quickbeam_optics_init() |
---|
68 | integer :: j |
---|
69 | |
---|
70 | mt_tti = (/ ((j-1)*5-90 + 273.15, j = 1, cnt_ice) /) |
---|
71 | mt_ttl = (/ ((j-1)*5-60 + 273.15, j = 1, cnt_liq) /) |
---|
72 | D(1) = dmin |
---|
73 | do j=2,nd |
---|
74 | D(j) = D(j-1)*exp((log(dmax)-log(dmin))/(nd-1)) |
---|
75 | enddo |
---|
76 | !lQuickbeamInit = .true. |
---|
77 | end subroutine quickbeam_optics_init |
---|
78 | |
---|
79 | ! ###################################################################################### |
---|
80 | ! SUBROUTINE QUICKBEAM_OPTICS |
---|
81 | ! ###################################################################################### |
---|
82 | subroutine quickbeam_optics(sd, rcfg, nprof, ngate, undef, hm_matrix, re_matrix, & |
---|
83 | Np_matrix, p_matrix, t_matrix, sh_matrix,z_vol,kr_vol) |
---|
84 | |
---|
85 | ! INPUTS |
---|
86 | type(size_distribution),intent(inout) :: & |
---|
87 | sd ! |
---|
88 | type(radar_cfg),intent(inout) :: & |
---|
89 | rcfg ! |
---|
90 | integer,intent(in) :: & |
---|
91 | nprof, & ! Number of hydrometeor profiles |
---|
92 | ngate ! Number of vertical layers |
---|
93 | real(wp),intent(in) :: & |
---|
94 | undef ! Missing data value |
---|
95 | real(wp),intent(in),dimension(nprof,ngate) :: & |
---|
96 | p_matrix, & ! Pressure profile (hPa) |
---|
97 | t_matrix, & ! Temperature profile (K) |
---|
98 | sh_matrix ! Specific humidity profile (%) -- only needed if gaseous aborption calculated. |
---|
99 | real(wp),intent(in),dimension(nprof,ngate,rcfg%nhclass) :: & |
---|
100 | re_matrix, & ! Table of hydrometeor effective radii. 0 ==> use defaults. (units=microns) |
---|
101 | hm_matrix ! Table of hydrometeor mixing ratios (g/kg) |
---|
102 | real(wp),intent(inout),dimension(nprof,ngate,rcfg%nhclass) :: & |
---|
103 | Np_matrix ! Table of hydrometeor number concentration. 0 ==> use defaults. (units = 1/kg) |
---|
104 | |
---|
105 | ! OUTPUTS |
---|
106 | real(wp),intent(out), dimension(nprof, ngate) :: & |
---|
107 | z_vol, & ! Effective reflectivity factor (mm^6/m^3) |
---|
108 | kr_vol ! Attenuation coefficient hydro (dB/km) |
---|
109 | |
---|
110 | ! INTERNAL VARIABLES |
---|
111 | integer :: & |
---|
112 | phase, ns,tp,j,k,pr,itt,iRe_type,n |
---|
113 | logical :: & |
---|
114 | hydro |
---|
115 | real(wp) :: & |
---|
116 | t_kelvin,Re_internal |
---|
117 | real(wp) :: & |
---|
118 | rho_a,kr,ze,zr,scale_factor,Re,Np,base,step |
---|
119 | |
---|
120 | real(wp),dimension(:),allocatable :: & |
---|
121 | Deq, & ! Discrete drop sizes (um) |
---|
122 | Ni, & ! Discrete concentrations (cm^-3 um^-1) |
---|
123 | rhoi, & ! Discrete densities (kg m^-3) |
---|
124 | xxa, & ! |
---|
125 | Di ! Discrete drop sizes (um) |
---|
126 | |
---|
127 | real(wp), dimension(nprof, ngate) :: & |
---|
128 | z_ray ! Reflectivity factor, Rayleigh only (mm^6/m^3) |
---|
129 | |
---|
130 | ! PARAMETERS |
---|
131 | logical, parameter :: & ! |
---|
132 | DO_LUT_TEST = .false., & ! |
---|
133 | DO_NP_TEST = .false. ! |
---|
134 | real(wp), parameter :: & |
---|
135 | one_third = 1._wp/3._wp ! |
---|
136 | |
---|
137 | ! Initialization |
---|
138 | z_vol = 0._wp |
---|
139 | z_ray = 0._wp |
---|
140 | kr_vol = 0._wp |
---|
141 | |
---|
142 | do k=1,ngate ! Loop over each profile (nprof) |
---|
143 | do pr=1,nprof |
---|
144 | ! Determine if hydrometeor(s) present in volume |
---|
145 | hydro = .false. |
---|
146 | do j=1,rcfg%nhclass |
---|
147 | if ((hm_matrix(pr,k,j) > 1E-12) .and. (sd%dtype(j) > 0)) then |
---|
148 | hydro = .true. |
---|
149 | exit |
---|
150 | endif |
---|
151 | enddo |
---|
152 | |
---|
153 | t_kelvin = t_matrix(pr,k) |
---|
154 | ! If there is hydrometeor in the volume |
---|
155 | if (hydro) then |
---|
156 | rho_a = (p_matrix(pr,k))/(287._wp*(t_kelvin)) |
---|
157 | |
---|
158 | ! Loop over hydrometeor type |
---|
159 | do tp=1,rcfg%nhclass |
---|
160 | Re_internal = re_matrix(pr,k,tp) |
---|
161 | |
---|
162 | if (hm_matrix(pr,k,tp) <= 1E-12) cycle |
---|
163 | |
---|
164 | ! Index into temperature dimension of scaling tables |
---|
165 | ! These tables have regular steps -- exploit this and abandon infind |
---|
166 | phase = sd%phase(tp) |
---|
167 | if (phase==0) then |
---|
168 | itt = infind(mt_ttl,t_kelvin) |
---|
169 | else |
---|
170 | itt = infind(mt_tti,t_kelvin) |
---|
171 | endif |
---|
172 | |
---|
173 | ! Compute effective radius from number concentration and distribution parameters |
---|
174 | if (Re_internal .eq. 0) then |
---|
175 | call calc_Re(hm_matrix(pr,k,tp),Np_matrix(pr,k,tp),rho_a, & |
---|
176 | sd%dtype(tp),sd%apm(tp),sd%bpm(tp),sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp),Re) |
---|
177 | Re_internal=Re |
---|
178 | !re_matrix(pr,k,tp)=Re |
---|
179 | else |
---|
180 | if (Np_matrix(pr,k,tp) > 0) then |
---|
181 | call errorMessage('WARNING(optics/quickbeam_optics.f90): Re and Np set for the same volume & hydrometeor type. Np is being ignored.') |
---|
182 | endif |
---|
183 | Re = Re_internal |
---|
184 | !Re = re_matrix(pr,k,tp) |
---|
185 | endif |
---|
186 | |
---|
187 | ! Index into particle size dimension of scaling tables |
---|
188 | iRe_type=1 |
---|
189 | if(Re.gt.0) then |
---|
190 | ! Determine index in to scale LUT |
---|
191 | ! Distance between Re points (defined by "base" and "step") for |
---|
192 | ! each interval of size Re_BIN_LENGTH |
---|
193 | ! Integer asignment, avoids calling floor intrinsic |
---|
194 | n=Re/Re_BIN_LENGTH |
---|
195 | if (n>=Re_MAX_BIN) n=Re_MAX_BIN-1 |
---|
196 | step = rcfg%step_list(n+1) |
---|
197 | base = rcfg%base_list(n+1) |
---|
198 | iRe_type=Re/step |
---|
199 | if (iRe_type.lt.1) iRe_type=1 |
---|
200 | Re=step*(iRe_type+0.5_wp) ! set value of Re to closest value allowed in LUT. |
---|
201 | iRe_type=iRe_type+base-int(n*Re_BIN_LENGTH/step) |
---|
202 | |
---|
203 | ! Make sure iRe_type is within bounds |
---|
204 | if (iRe_type.ge.nRe_types) then |
---|
205 | !write(*,*) 'Warning: size of Re exceed value permitted ', & |
---|
206 | ! 'in Look-Up Table (LUT). Will calculate. ' |
---|
207 | ! No scaling allowed |
---|
208 | iRe_type=nRe_types |
---|
209 | rcfg%Z_scale_flag(tp,itt,iRe_type)=.false. |
---|
210 | else |
---|
211 | ! Set value in re_matrix to closest values in LUT |
---|
212 | if (.not. DO_LUT_TEST) re_internal=Re |
---|
213 | !if (.not. DO_LUT_TEST) re_matrix(pr,k,tp)=Re |
---|
214 | endif |
---|
215 | endif |
---|
216 | |
---|
217 | ! Use Ze_scaled, Zr_scaled, and kr_scaled ... if know them |
---|
218 | ! if not we will calculate Ze, Zr, and Kr from the distribution parameters |
---|
219 | ! if( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. .not. DO_LUT_TEST) then |
---|
220 | ! ! can use z scaling |
---|
221 | ! scale_factor=rho_a*hm_matrix(pr,k,tp) |
---|
222 | ! zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor |
---|
223 | ! ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor |
---|
224 | ! kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor |
---|
225 | ! else |
---|
226 | if( (.not. rcfg%Z_scale_flag(tp,itt,iRe_type)) .or. DO_LUT_TEST) then |
---|
227 | ! Create a discrete distribution of hydrometeors within volume |
---|
228 | select case(sd%dtype(tp)) |
---|
229 | case(4) |
---|
230 | ns = 1 |
---|
231 | allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) |
---|
232 | Di = sd%p1(tp) |
---|
233 | Ni = 0._wp |
---|
234 | case default |
---|
235 | ns = nd ! constant defined in simulator/quickbeam.f90 |
---|
236 | allocate(Di(ns),Ni(ns),rhoi(ns),xxa(ns),Deq(ns)) |
---|
237 | Di = D |
---|
238 | Ni = 0._wp |
---|
239 | end select |
---|
240 | call dsd(hm_matrix(pr,k,tp),re_internal,Np_matrix(pr,k,tp), & |
---|
241 | Di,Ni,ns,sd%dtype(tp),rho_a,t_kelvin, & |
---|
242 | sd%dmin(tp),sd%dmax(tp),sd%apm(tp),sd%bpm(tp), & |
---|
243 | sd%rho(tp),sd%p1(tp),sd%p2(tp),sd%p3(tp)) |
---|
244 | |
---|
245 | ! Calculate particle density |
---|
246 | if (phase == 1) then |
---|
247 | if (sd%rho(tp) < 0) then |
---|
248 | ! Use equivalent volume spheres. |
---|
249 | rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice ! solid ice == equivalent volume approach |
---|
250 | Deq = ( ( 6/pi*sd%apm(tp)/rhoice) ** one_third ) * ( (Di*1E-6) ** (sd%bpm(tp)/3._wp) ) * 1E6 |
---|
251 | ! alternative is to comment out above two lines and use the following block |
---|
252 | ! MG Mie approach - adjust density of sphere with D = D_characteristic to match particle density |
---|
253 | ! |
---|
254 | ! rcfg%rho_eff(tp,1:ns,iRe_type) = (6/pi)*sd%apm(tp)*(Di*1E-6)**(sd%bpm(tp)-3) !MG Mie approach |
---|
255 | |
---|
256 | ! as the particle size gets small it is possible that the mass to size relationship of |
---|
257 | ! (given by power law in hclass.data) can produce impossible results |
---|
258 | ! where the mass is larger than a solid sphere of ice. |
---|
259 | ! This loop ensures that no ice particle can have more mass/density larger than an ice sphere. |
---|
260 | ! do i=1,ns |
---|
261 | ! if(rcfg%rho_eff(tp,i,iRe_type) > 917 ) then |
---|
262 | ! rcfg%rho_eff(tp,i,iRe_type) = 917 |
---|
263 | ! endif |
---|
264 | ! enddo |
---|
265 | else |
---|
266 | ! Equivalent volume sphere (solid ice rhoice=917 kg/m^3). |
---|
267 | rcfg%rho_eff(tp,1:ns,iRe_type) = rhoice |
---|
268 | Deq=Di * ((sd%rho(tp)/rhoice)**one_third) |
---|
269 | ! alternative ... coment out above two lines and use the following for MG-Mie |
---|
270 | ! rcfg%rho_eff(tp,1:ns,iRe_type) = sd%rho(tp) !MG Mie approach |
---|
271 | endif |
---|
272 | else |
---|
273 | ! I assume here that water phase droplets are spheres. |
---|
274 | ! sd%rho should be ~ 1000 or sd%apm=524 .and. sd%bpm=3 |
---|
275 | Deq = Di |
---|
276 | endif |
---|
277 | |
---|
278 | ! Calculate effective reflectivity factor of volume |
---|
279 | ! xxa are unused (Mie scattering and extinction efficiencies) |
---|
280 | xxa(1:ns) = -9.9_wp |
---|
281 | rhoi = rcfg%rho_eff(tp,1:ns,iRe_type) |
---|
282 | call zeff(rcfg%freq,Deq,Ni,ns,rcfg%k2,t_kelvin,phase,rcfg%do_ray, & |
---|
283 | ze,zr,kr,xxa,xxa,rhoi) |
---|
284 | |
---|
285 | ! Test compares total number concentration with sum of discrete samples |
---|
286 | ! The second test, below, compares ab initio and "scaled" computations |
---|
287 | ! of reflectivity |
---|
288 | ! These should get broken out as a unit test that gets called on |
---|
289 | ! data. That routine could write to std out. |
---|
290 | |
---|
291 | ! Test code ... compare Np value input to routine with sum of DSD |
---|
292 | ! NOTE: if .not. DO_LUT_TEST, then you are checking the LUT approximation |
---|
293 | ! not just the DSD representation given by Ni |
---|
294 | if(Np_matrix(pr,k,tp)>0 .and. DO_NP_TEST ) then |
---|
295 | Np = path_integral(Ni,Di,1,ns-1)/rho_a*1.E6_wp |
---|
296 | ! Note: Representation is not great or small Re < 2 |
---|
297 | if( (Np_matrix(pr,k,tp)-Np)/Np_matrix(pr,k,tp)>0.1 ) then |
---|
298 | call errorMessage('ERROR(optics/quickbeam_optics.f90): Error: Np input does not match sum(N)') |
---|
299 | endif |
---|
300 | endif |
---|
301 | |
---|
302 | ! Clean up space |
---|
303 | deallocate(Di,Ni,rhoi,xxa,Deq) |
---|
304 | |
---|
305 | ! LUT test code |
---|
306 | ! This segment of code compares full calculation to scaling result |
---|
307 | if ( rcfg%Z_scale_flag(tp,itt,iRe_type) .and. DO_LUT_TEST ) then |
---|
308 | scale_factor=rho_a*hm_matrix(pr,k,tp) |
---|
309 | ! if more than 2 dBZe difference print error message/parameters. |
---|
310 | if ( abs(10*log10(ze) - 10*log10(rcfg%Ze_scaled(tp,itt,iRe_type) * & |
---|
311 | scale_factor)) > 2 ) then |
---|
312 | call errorMessage('ERROR(optics/quickbeam_optics.f90): ERROR: Roj Error?') |
---|
313 | endif |
---|
314 | endif |
---|
315 | else |
---|
316 | ! Use z scaling |
---|
317 | scale_factor=rho_a*hm_matrix(pr,k,tp) |
---|
318 | zr = rcfg%Zr_scaled(tp,itt,iRe_type) * scale_factor |
---|
319 | ze = rcfg%Ze_scaled(tp,itt,iRe_type) * scale_factor |
---|
320 | kr = rcfg%kr_scaled(tp,itt,iRe_type) * scale_factor |
---|
321 | endif ! end z_scaling |
---|
322 | |
---|
323 | kr_vol(pr,k) = kr_vol(pr,k) + kr |
---|
324 | z_vol(pr,k) = z_vol(pr,k) + ze |
---|
325 | z_ray(pr,k) = z_ray(pr,k) + zr |
---|
326 | |
---|
327 | ! Construct Ze_scaled, Zr_scaled, and kr_scaled ... if we can |
---|
328 | if ( .not. rcfg%Z_scale_flag(tp,itt,iRe_type) ) then |
---|
329 | if (iRe_type>1) then |
---|
330 | scale_factor=rho_a*hm_matrix(pr,k,tp) |
---|
331 | rcfg%Ze_scaled(tp,itt,iRe_type) = ze/ scale_factor |
---|
332 | rcfg%Zr_scaled(tp,itt,iRe_type) = zr/ scale_factor |
---|
333 | rcfg%kr_scaled(tp,itt,iRe_type) = kr/ scale_factor |
---|
334 | rcfg%Z_scale_flag(tp,itt,iRe_type) = .true. |
---|
335 | rcfg%Z_scale_added_flag(tp,itt,iRe_type)=.true. |
---|
336 | endif |
---|
337 | endif |
---|
338 | enddo ! end loop of tp (hydrometeor type) |
---|
339 | endif |
---|
340 | enddo |
---|
341 | enddo |
---|
342 | |
---|
343 | where(kr_vol(:,:) <= EPSILON(kr_vol)) |
---|
344 | ! Volume is hydrometeor-free |
---|
345 | !z_vol(:,:) = undef |
---|
346 | z_ray(:,:) = undef |
---|
347 | end where |
---|
348 | |
---|
349 | end subroutine quickbeam_optics |
---|
350 | ! ############################################################################################## |
---|
351 | ! ############################################################################################## |
---|
352 | subroutine calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) |
---|
353 | ! ############################################################################################## |
---|
354 | ! Purpose: |
---|
355 | ! Calculates Effective Radius (1/2 distribution 3rd moment / 2nd moment). |
---|
356 | ! |
---|
357 | ! For some distribution types, the total number concentration (per kg), Np |
---|
358 | ! may be optionally specified. Should be set to zero, otherwise. |
---|
359 | ! |
---|
360 | ! Roj Marchand July 2010 |
---|
361 | ! |
---|
362 | ! Inputs: |
---|
363 | ! |
---|
364 | ! [Q] hydrometeor mixing ratio (g/kg) ! not needed for some distribution types |
---|
365 | ! [Np] Optional Total number concentration (per kg). 0 = use defaults (p1, p2, p3) |
---|
366 | ! [rho_a] ambient air density (kg m^-3) |
---|
367 | ! |
---|
368 | ! Distribution parameters as per quickbeam documentation. |
---|
369 | ! [dtype] distribution type |
---|
370 | ! [apm] a parameter for mass (kg m^[-bpm]) |
---|
371 | ! [bmp] b params for mass |
---|
372 | ! [p1],[p2],[p3] distribution parameters |
---|
373 | ! |
---|
374 | ! Outputs: |
---|
375 | ! [Re] Effective radius, 1/2 the 3rd moment/2nd moment (um) |
---|
376 | ! |
---|
377 | ! Created: |
---|
378 | ! July 2010 Roj Marchand |
---|
379 | ! Modified: |
---|
380 | ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) |
---|
381 | ! |
---|
382 | ! ############################################################################################## |
---|
383 | ! ############################################################################################## |
---|
384 | |
---|
385 | ! Inputs |
---|
386 | real(wp), intent(in) :: Q,Np,rho_a,rho_c,p1,p2,p3 |
---|
387 | integer, intent(in) :: dtype |
---|
388 | real(wp), intent(inout) :: apm,bpm |
---|
389 | |
---|
390 | ! Outputs |
---|
391 | real(wp), intent(out) :: Re |
---|
392 | |
---|
393 | ! Internal |
---|
394 | integer :: local_dtype |
---|
395 | real(wp) :: local_p3,local_Np,tmp1,tmp2 |
---|
396 | real(wp) :: N0,D0,vu,dm,ld,rg,log_sigma_g ! gamma, exponential variables |
---|
397 | |
---|
398 | |
---|
399 | ! If density is constant, set equivalent values for apm and bpm |
---|
400 | if ((rho_c > 0) .and. (apm < 0)) then |
---|
401 | apm = (pi/6)*rho_c |
---|
402 | bpm = 3._wp |
---|
403 | endif |
---|
404 | |
---|
405 | ! Exponential is same as modified gamma with vu =1 |
---|
406 | ! if Np is specified then we will just treat as modified gamma |
---|
407 | if(dtype .eq. 2 .and. Np .gt. 0) then |
---|
408 | local_dtype = 1 |
---|
409 | local_p3 = 1 |
---|
410 | else |
---|
411 | local_dtype = dtype |
---|
412 | local_p3 = p3 |
---|
413 | endif |
---|
414 | select case(local_dtype) |
---|
415 | |
---|
416 | ! ---------------------------------------------------------! |
---|
417 | ! Modified gamma ! |
---|
418 | ! Np = total number concentration (1/kg) = Nt / rho_a ! |
---|
419 | ! D0 = characteristic diameter (um) ! |
---|
420 | ! dm = mean diameter (um) - first moment over zeroth moment! |
---|
421 | ! vu = distribution width parameter ! |
---|
422 | ! ---------------------------------------------------------! |
---|
423 | case(1) |
---|
424 | |
---|
425 | if( abs(local_p3+2) < 1E-8) then |
---|
426 | if(Np>1E-30) then |
---|
427 | ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) |
---|
428 | ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane |
---|
429 | vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2 ! units of Nt = Np*rhoa = #/cm^3 |
---|
430 | else |
---|
431 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for Np in each volume with Morrison/Martin Scheme.') |
---|
432 | return |
---|
433 | endif |
---|
434 | elseif (abs(local_p3+1) > 1E-8) then |
---|
435 | ! vu is fixed in hp structure |
---|
436 | vu = local_p3 |
---|
437 | else |
---|
438 | ! vu isn't specified |
---|
439 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for vu for Modified Gamma distribution') |
---|
440 | return |
---|
441 | endif |
---|
442 | |
---|
443 | if( Np.eq.0 .and. p2+1 > 1E-8) then ! use default value for MEAN diameter as first default |
---|
444 | dm = p2 ! by definition, should have units of microns |
---|
445 | D0 = gamma(vu)/gamma(vu+1)*dm |
---|
446 | else ! use value of Np |
---|
447 | if(Np.eq.0) then |
---|
448 | if( abs(p1+1) > 1E-8 ) then ! use default number concentration |
---|
449 | local_Np = p1 ! total number concentration / pa --- units kg^-1 |
---|
450 | else |
---|
451 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=Dm [um] or p2=Np [1/kg]) for Modified Gamma distribution') |
---|
452 | return |
---|
453 | endif |
---|
454 | else |
---|
455 | local_Np=Np; |
---|
456 | endif |
---|
457 | D0 = 1E6 * ( Q*1E-3*gamma(vu)/(apm*local_Np*gamma(vu+bpm)) )**(1/bpm) ! units = microns |
---|
458 | endif |
---|
459 | Re = 0.5_wp*D0*gamma(vu+3)/gamma(vu+2) |
---|
460 | |
---|
461 | ! ---------------------------------------------------------! |
---|
462 | ! Exponential ! |
---|
463 | ! N0 = intercept parameter (m^-4) ! |
---|
464 | ! ld = slope parameter (um) ! |
---|
465 | ! ---------------------------------------------------------! |
---|
466 | case(2) |
---|
467 | |
---|
468 | ! Np not specified (see if statement above) |
---|
469 | if((abs(p1+1) > 1E-8) ) then ! N0 has been specified, determine ld |
---|
470 | N0 = p1 |
---|
471 | tmp1 = 1._wp/(1._wp+bpm) |
---|
472 | ld = ((apm*gamma(1.+bpm)*N0)/(rho_a*Q*1E-3))**tmp1 |
---|
473 | ld = ld/1E6 ! set units to microns^-1 |
---|
474 | elseif (abs(p2+1) > 1E-8) then ! lambda=ld has been specified as default |
---|
475 | ld = p2 ! should have units of microns^-1 |
---|
476 | else |
---|
477 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p1=No or p2=lambda) for Exponential distribution') |
---|
478 | return |
---|
479 | endif |
---|
480 | Re = 1.5_wp/ld |
---|
481 | |
---|
482 | ! ---------------------------------------------------------! |
---|
483 | ! Power law ! |
---|
484 | ! ahp = Ar parameter (m^-4 mm^-bhp) ! |
---|
485 | ! bhp = br parameter ! |
---|
486 | ! dmin_mm = lower bound (mm) ! |
---|
487 | ! dmax_mm = upper bound (mm) ! |
---|
488 | ! ---------------------------------------------------------! |
---|
489 | case(3) |
---|
490 | |
---|
491 | Re=0._wp ! Not supporting LUT approach for power-law ... |
---|
492 | if(Np>0) then |
---|
493 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Power Law distribution') |
---|
494 | return |
---|
495 | endif |
---|
496 | |
---|
497 | ! ---------------------------------------------------------! |
---|
498 | ! Monodisperse ! |
---|
499 | ! D0 = particle diameter (um) == Re ! |
---|
500 | ! ---------------------------------------------------------! |
---|
501 | case(4) |
---|
502 | |
---|
503 | Re = p1 |
---|
504 | if(Np>0) then |
---|
505 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Variable Np not supported for Monodispersed distribution') |
---|
506 | return |
---|
507 | endif |
---|
508 | |
---|
509 | ! ---------------------------------------------------------! |
---|
510 | ! Lognormal ! |
---|
511 | ! N0 = total number concentration (m^-3) ! |
---|
512 | ! np = fixed number concentration (kg^-1) ! |
---|
513 | ! rg = mean radius (um) ! |
---|
514 | ! log_sigma_g = ln(geometric standard deviation) ! |
---|
515 | ! ---------------------------------------------------------! |
---|
516 | case(5) |
---|
517 | |
---|
518 | if( abs(local_p3+1) > 1E-8 ) then |
---|
519 | !set natural log width |
---|
520 | log_sigma_g = local_p3 |
---|
521 | else |
---|
522 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify a value for sigma_g when using a Log-Normal distribution') |
---|
523 | return |
---|
524 | endif |
---|
525 | |
---|
526 | ! get rg ... |
---|
527 | if( Np.eq.0 .and. (abs(p2+1) > 1E-8) ) then ! use default value of rg |
---|
528 | rg = p2 |
---|
529 | else |
---|
530 | if(Np>0) then |
---|
531 | local_Np=Np; |
---|
532 | elseif(abs(p2+1) < 1E-8) then |
---|
533 | local_Np=p1 |
---|
534 | else |
---|
535 | call errorMessage('ERROR(optics/quickbeam_optics.f90:Calc_Re): Must specify Np or default value (p2=Rg or p1=Np) for Log-Normal distribution') |
---|
536 | endif |
---|
537 | log_sigma_g = p3 |
---|
538 | tmp1 = (Q*1E-3)/(2._wp**bpm*apm*local_Np) |
---|
539 | tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) |
---|
540 | rg = ((tmp1/tmp2)**(1._wp/bpm))*1E6 |
---|
541 | endif |
---|
542 | Re = rg*exp(2.5_wp*(log_sigma_g*log_sigma_g)) |
---|
543 | end select |
---|
544 | end subroutine calc_Re |
---|
545 | ! ############################################################################################## |
---|
546 | ! ############################################################################################## |
---|
547 | subroutine dsd(Q,Re,Np,D,N,nsizes,dtype,rho_a,tk,dmin,dmax,apm,bpm,rho_c,p1,p2,p3) |
---|
548 | ! ############################################################################################## |
---|
549 | ! Purpose: |
---|
550 | ! Create a discrete drop size distribution |
---|
551 | ! |
---|
552 | ! Starting with Quickbeam V3, this routine now allows input of |
---|
553 | ! both effective radius (Re) and total number concentration (Nt) |
---|
554 | ! Roj Marchand July 2010 |
---|
555 | ! |
---|
556 | ! The version in Quickbeam v.104 was modified to allow Re but not Nt |
---|
557 | ! This is a significantly modified form for the version |
---|
558 | ! |
---|
559 | ! Originally Part of QuickBeam v1.03 by John Haynes |
---|
560 | ! http://reef.atmos.colostate.edu/haynes/radarsim |
---|
561 | ! |
---|
562 | ! Inputs: |
---|
563 | ! |
---|
564 | ! [Q] hydrometeor mixing ratio (g/kg) |
---|
565 | ! [Re] Optional Effective Radius (microns). 0 = use defaults (p1, p2, p3) |
---|
566 | ! |
---|
567 | ! [D] array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). |
---|
568 | ! [nsizes] number of elements of [D] |
---|
569 | ! |
---|
570 | ! [dtype] distribution type |
---|
571 | ! [rho_a] ambient air density (kg m^-3) |
---|
572 | ! [tk] temperature (K) |
---|
573 | ! [dmin] minimum size cutoff (um) |
---|
574 | ! [dmax] maximum size cutoff (um) |
---|
575 | ! [rho_c] alternate constant density (kg m^-3) |
---|
576 | ! [p1],[p2],[p3] distribution parameters |
---|
577 | ! |
---|
578 | ! Input/Output: |
---|
579 | ! [apm] a parameter for mass (kg m^[-bpm]) |
---|
580 | ! [bmp] b params for mass |
---|
581 | ! |
---|
582 | ! Outputs: |
---|
583 | ! [N] discrete concentrations (cm^-3 um^-1) |
---|
584 | ! or, for monodisperse, a constant (1/cm^3) |
---|
585 | ! |
---|
586 | ! Requires: |
---|
587 | ! function infind |
---|
588 | ! |
---|
589 | ! Created: |
---|
590 | ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) |
---|
591 | ! Modified: |
---|
592 | ! 01/31/06 Port from IDL to Fortran 90 |
---|
593 | ! 07/07/06 Rewritten for variable DSD's |
---|
594 | ! 10/02/06 Rewritten using scaling factors (Roger Marchand and JMH), Re added V1.04 |
---|
595 | ! July 2020 "N Scale factors" (variable fc) removed (Roj Marchand). |
---|
596 | ! 12/18/14 Define type REALs as double precision (dustin.swales@noaa.gov) |
---|
597 | ! ############################################################################################## |
---|
598 | |
---|
599 | ! Inputs |
---|
600 | integer, intent(in) :: & |
---|
601 | nsizes,& ! Number of elements of [D] |
---|
602 | dtype ! distribution type |
---|
603 | real(wp),intent(in),dimension(nsizes) :: & |
---|
604 | D ! Array of discrete drop sizes (um) where we desire to know the number concentraiton n(D). |
---|
605 | real(wp),intent(in) :: & |
---|
606 | Q, & ! Hydrometeor mixing ratio (g/kg) |
---|
607 | Np, & ! |
---|
608 | rho_a, & ! Ambient air density (kg m^-3) |
---|
609 | tk, & ! Temperature (K) |
---|
610 | dmin, & ! Minimum size cutoff (um) |
---|
611 | dmax, & ! Maximum size cutoff (um) |
---|
612 | rho_c, & ! Alternate constant density (kg m^-3) |
---|
613 | p1, & ! Distribution parameter 1 |
---|
614 | p2, & ! Distribution parameter 2 |
---|
615 | p3 ! Distribution parameter 3 |
---|
616 | real(wp),intent(inout) :: & |
---|
617 | apm, & ! a parameter for mass (kg m^[-bpm]) |
---|
618 | bpm, & ! b params for mass |
---|
619 | Re ! Optional Effective Radius (microns) |
---|
620 | |
---|
621 | ! Outputs |
---|
622 | real(wp),intent(out),dimension(nsizes) :: & |
---|
623 | N ! Discrete concentrations (cm^-3 um^-1) |
---|
624 | ! or, for monodisperse, a constant (1/cm^3) |
---|
625 | |
---|
626 | ! Internal Variables |
---|
627 | real(wp),dimension(nsizes) :: & |
---|
628 | fc |
---|
629 | real(wp) :: & |
---|
630 | N0,D0,vu,local_np,dm,ld, & ! gamma, exponential variables |
---|
631 | dmin_mm,dmax_mm,ahp,bhp, & ! power law variables |
---|
632 | rg,log_sigma_g, & ! lognormal variables |
---|
633 | rho_e, & ! particle density (kg m^-3) |
---|
634 | tmp1,tmp2,tc |
---|
635 | integer :: & |
---|
636 | k,lidx,uidx |
---|
637 | |
---|
638 | ! Convert temperature from Kelvin to Celsius |
---|
639 | tc = tk - 273.15_wp |
---|
640 | |
---|
641 | ! If density is constant, store equivalent values for apm and bpm |
---|
642 | if ((rho_c > 0) .and. (apm < 0)) then |
---|
643 | apm = (pi/6)*rho_c |
---|
644 | bpm = 3._wp |
---|
645 | endif |
---|
646 | |
---|
647 | ! Will preferentially use Re input over Np. |
---|
648 | ! if only Np given then calculate Re |
---|
649 | ! if neigher than use other defaults (p1,p2,p3) following quickbeam documentation |
---|
650 | if(Re==0 .and. Np>0) then |
---|
651 | call calc_Re(Q,Np,rho_a,dtype,apm,bpm,rho_c,p1,p2,p3,Re) |
---|
652 | endif |
---|
653 | select case(dtype) |
---|
654 | |
---|
655 | ! ---------------------------------------------------------! |
---|
656 | ! Modified gamma ! |
---|
657 | ! np = total number concentration ! |
---|
658 | ! D0 = characteristic diameter (um) ! |
---|
659 | ! dm = mean diameter (um) - first moment over zeroth moment! |
---|
660 | ! vu = distribution width parameter ! |
---|
661 | ! ---------------------------------------------------------! |
---|
662 | case(1) |
---|
663 | |
---|
664 | if( abs(p3+2) < 1E-8) then |
---|
665 | if( Np>1E-30) then |
---|
666 | ! Morrison scheme with Martin 1994 shape parameter (NOTE: vu = pc +1) |
---|
667 | ! fixed Roj. Dec. 2010 -- after comment by S. Mcfarlane |
---|
668 | vu = (1/(0.2714_wp + 0.00057145_wp*Np*rho_a*1E-6))**2._wp ! units of Nt = Np*rhoa = #/cm^3 |
---|
669 | else |
---|
670 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for Np in each volume with Morrison/Martin Scheme.') |
---|
671 | return |
---|
672 | endif |
---|
673 | elseif (abs(p3+1) > 1E-8) then |
---|
674 | ! vu is fixed in hp structure |
---|
675 | vu = p3 |
---|
676 | else |
---|
677 | ! vu isn't specified |
---|
678 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for vu for Modified Gamma distribution') |
---|
679 | return |
---|
680 | endif |
---|
681 | |
---|
682 | if(Re>0) then |
---|
683 | D0 = 2._wp*Re*gamma(vu+2)/gamma(vu+3) |
---|
684 | fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & |
---|
685 | (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 |
---|
686 | N = fc*rho_a*(Q*1E-3) |
---|
687 | elseif( p2+1 > 1E-8) then ! use default value for MEAN diameter |
---|
688 | dm = p2 |
---|
689 | D0 = gamma(vu)/gamma(vu+1)*dm |
---|
690 | fc = (((D*1E-6)**(vu-1)*exp(-1*D/D0)) / & |
---|
691 | (apm*((D0*1E-6)**(vu+bpm))*gamma(vu+bpm))) * 1E-12 |
---|
692 | N = fc*rho_a*(Q*1E-3) |
---|
693 | elseif(abs(p3+1) > 1E-8) then! use default number concentration |
---|
694 | local_np = p1 ! total number concentration / pa check |
---|
695 | tmp1 = (Q*1E-3)**(1./bpm) |
---|
696 | fc = (D*1E-6 / (gamma(vu)/(apm*local_np*gamma(vu+bpm)))**(1._wp/bpm))**vu |
---|
697 | N = ((rho_a*local_np*fc*(D*1E-6)**(-1._wp))/(gamma(vu)*tmp1**vu) * & |
---|
698 | exp(-1._wp*fc**(1._wp/vu)/tmp1)) * 1E-12 |
---|
699 | else |
---|
700 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): No default value for Dm or Np provided!') |
---|
701 | return |
---|
702 | endif |
---|
703 | |
---|
704 | ! ---------------------------------------------------------! |
---|
705 | ! Exponential ! |
---|
706 | ! N0 = intercept parameter (m^-4) ! |
---|
707 | ! ld = slope parameter (um) ! |
---|
708 | ! ---------------------------------------------------------! |
---|
709 | case(2) |
---|
710 | |
---|
711 | if(Re>0) then |
---|
712 | ld = 1.5_wp/Re ! units 1/um |
---|
713 | fc = (ld*1E6)**(1.+bpm)/(apm*gamma(1+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 |
---|
714 | N = fc*rho_a*(Q*1E-3) |
---|
715 | elseif (abs(p1+1) > 1E-8) then |
---|
716 | ! Use N0 default value |
---|
717 | N0 = p1 |
---|
718 | tmp1 = 1._wp/(1._wp+bpm) |
---|
719 | fc = ((apm*gamma(1.+bpm)*N0)**tmp1)*(D*1E-6) |
---|
720 | N = (N0*exp(-1._wp*fc*(1._wp/(rho_a*Q*1E-3))**tmp1)) * 1E-12 |
---|
721 | elseif (abs(p2+1) > 1E-8) then |
---|
722 | ! Use default value for lambda |
---|
723 | ld = p2 |
---|
724 | fc = (ld*1E6)**(1._wp+bpm)/(apm*gamma(1+bpm))*exp(-1._wp*(ld*1E6)*(D*1E-6))*1E-12 |
---|
725 | N = fc*rho_a*(Q*1E-3) |
---|
726 | else |
---|
727 | ! ld "parameterized" from temperature (carry over from original Quickbeam). |
---|
728 | ld = 1220._wp*10._wp**(-0.0245_wp*tc)*1E-6 |
---|
729 | N0 = ((ld*1E6)**(1._wp+bpm)*Q*1E-3*rho_a)/(apm*gamma(1+bpm)) |
---|
730 | N = (N0*exp(-ld*D)) * 1E-12 |
---|
731 | endif |
---|
732 | |
---|
733 | ! ---------------------------------------------------------! |
---|
734 | ! Power law ! |
---|
735 | ! ahp = Ar parameter (m^-4 mm^-bhp) ! |
---|
736 | ! bhp = br parameter ! |
---|
737 | ! dmin_mm = lower bound (mm) ! |
---|
738 | ! dmax_mm = upper bound (mm) ! |
---|
739 | ! ---------------------------------------------------------! |
---|
740 | case(3) |
---|
741 | |
---|
742 | if(Re>0) then |
---|
743 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Re not supported for Power-Law distribution') |
---|
744 | return |
---|
745 | elseif(Np>0) then |
---|
746 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Variable Np not supported for Power-Law distribution') |
---|
747 | return |
---|
748 | endif |
---|
749 | |
---|
750 | ! br parameter |
---|
751 | if (abs(p1+2) < 1E-8) then |
---|
752 | ! if p1=-2, bhp is parameterized according to Ryan (2000), |
---|
753 | ! applicatable to cirrus clouds |
---|
754 | if (tc < -30) then |
---|
755 | bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) |
---|
756 | elseif ((tc >= -30) .and. (tc < -9)) then |
---|
757 | bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) |
---|
758 | else |
---|
759 | bhp = -2.15_wp |
---|
760 | endif |
---|
761 | elseif (abs(p1+3) < 1E-8) then |
---|
762 | ! if p1=-3, bhp is parameterized according to Ryan (2000), |
---|
763 | ! applicable to frontal clouds |
---|
764 | if (tc < -35) then |
---|
765 | bhp = -1.75_wp+0.09_wp*((tc+273._wp)-243.16_wp) |
---|
766 | elseif ((tc >= -35) .and. (tc < -17.5)) then |
---|
767 | bhp = -2.65_wp+0.09_wp*((tc+273._wp)-255.66_wp) |
---|
768 | elseif ((tc >= -17.5) .and. (tc < -9)) then |
---|
769 | bhp = -3.25_wp-0.06_wp*((tc+273._wp)-265.66_wp) |
---|
770 | else |
---|
771 | bhp = -2.15_wp |
---|
772 | endif |
---|
773 | else |
---|
774 | ! Otherwise the specified value is used |
---|
775 | bhp = p1 |
---|
776 | endif |
---|
777 | |
---|
778 | ! Ar parameter |
---|
779 | dmin_mm = dmin*1E-3 |
---|
780 | dmax_mm = dmax*1E-3 |
---|
781 | |
---|
782 | ! Commented lines are original method with constant density |
---|
783 | ! rc = 500. ! (kg/m^3) |
---|
784 | ! tmp1 = 6*rho_a*(bhp+4) |
---|
785 | ! tmp2 = pi*rc*(dmax_mm**(bhp+4))*(1-(dmin_mm/dmax_mm)**(bhp+4)) |
---|
786 | ! ahp = (Q*1E-3)*1E12*tmp1/tmp2 |
---|
787 | |
---|
788 | ! New method is more consistent with the rest of the distributions |
---|
789 | ! and allows density to vary with particle size |
---|
790 | tmp1 = rho_a*(Q*1E-3)*(bhp+bpm+1) |
---|
791 | tmp2 = apm*(dmax_mm**bhp*dmax**(bpm+1)-dmin_mm**bhp*dmin**(bpm+1)) |
---|
792 | ahp = tmp1/tmp2 * 1E24 |
---|
793 | ! ahp = tmp1/tmp2 |
---|
794 | lidx = infind(D,dmin) |
---|
795 | uidx = infind(D,dmax) |
---|
796 | do k=lidx,uidx |
---|
797 | N(k) = (ahp*(D(k)*1E-3)**bhp) * 1E-12 |
---|
798 | enddo |
---|
799 | |
---|
800 | ! ---------------------------------------------------------! |
---|
801 | ! Monodisperse ! |
---|
802 | ! D0 = particle diameter (um) ! |
---|
803 | ! ---------------------------------------------------------! |
---|
804 | case(4) |
---|
805 | |
---|
806 | if (Re>0) then |
---|
807 | D0 = Re |
---|
808 | else |
---|
809 | D0 = p1 |
---|
810 | endif |
---|
811 | |
---|
812 | rho_e = (6._wp/pi)*apm*(D0*1E-6)**(bpm-3) |
---|
813 | fc(1) = (6._wp/(pi*D0*D0*D0*rho_e))*1E12 |
---|
814 | N(1) = fc(1)*rho_a*(Q*1E-3) |
---|
815 | |
---|
816 | ! ---------------------------------------------------------! |
---|
817 | ! Lognormal ! |
---|
818 | ! N0 = total number concentration (m^-3) ! |
---|
819 | ! np = fixed number concentration (kg^-1) ! |
---|
820 | ! rg = mean radius (um) ! |
---|
821 | ! og_sigma_g = ln(geometric standard deviation) ! |
---|
822 | ! ---------------------------------------------------------! |
---|
823 | case(5) |
---|
824 | if (abs(p1+1) < 1E-8 .or. Re>0 ) then |
---|
825 | ! rg, log_sigma_g are given |
---|
826 | log_sigma_g = p3 |
---|
827 | tmp2 = (bpm*log_sigma_g)*(bpm*log_sigma_g) |
---|
828 | if(Re.le.0) then |
---|
829 | rg = p2 |
---|
830 | else |
---|
831 | !rg = Re*exp(-2.5*(log_sigma_g*log_sigma_g)) |
---|
832 | rg =Re*exp(-2.5_wp*(log_sigma_g**2)) |
---|
833 | |
---|
834 | endif |
---|
835 | |
---|
836 | fc = 0.5_wp*((1._wp/((2._wp*rg*1E-6)**(bpm)*apm*(2._wp*pi)**(0.5_wp) * & |
---|
837 | log_sigma_g*D*0.5_wp*1E-6))*exp(-0.5_wp*((log(0.5_wp*D/rg)/log_sigma_g)**2._wp+tmp2)))*1E-12 |
---|
838 | N = fc*rho_a*(Q*1E-3) |
---|
839 | |
---|
840 | elseif (abs(p2+1) < 1E-8 .or. Np>0) then |
---|
841 | ! Np, log_sigma_g are given |
---|
842 | if(Np>0) then |
---|
843 | local_Np = Np |
---|
844 | else |
---|
845 | local_Np = p1 |
---|
846 | endif |
---|
847 | |
---|
848 | log_sigma_g = p3 |
---|
849 | N0 = local_np*rho_a |
---|
850 | tmp1 = (rho_a*(Q*1E-3))/(2._wp**bpm*apm*N0) |
---|
851 | tmp2 = exp(0.5_wp*bpm*bpm*(log_sigma_g))*exp(0.5_wp*bpm*bpm*(log_sigma_g)) |
---|
852 | rg = ((tmp1/tmp2)**(1/bpm))*1E6 |
---|
853 | |
---|
854 | N = 0.5_wp*(N0 / ((2._wp*pi)**(0.5_wp)*log_sigma_g*D*0.5_wp*1E-6) * & |
---|
855 | exp((-0.5_wp*(log(0.5_wp*D/rg)/log_sigma_g)**2._wp)))*1E-12 |
---|
856 | else |
---|
857 | call errorMessage('FATAL ERROR(optics/quickbeam_optics.f90:dsd): Must specify a value for sigma_g') |
---|
858 | return |
---|
859 | endif |
---|
860 | end select |
---|
861 | end subroutine dsd |
---|
862 | ! ############################################################################################## |
---|
863 | ! ############################################################################################## |
---|
864 | subroutine zeff(freq,D,N,nsizes,k2,tt,ice,xr,z_eff,z_ray,kr,qe,qs,rho_e) |
---|
865 | ! ############################################################################################## |
---|
866 | ! Purpose: |
---|
867 | ! Simulates radar return of a volume given DSD of spheres |
---|
868 | ! Part of QuickBeam v1.03 by John Haynes |
---|
869 | ! http://reef.atmos.colostate.edu/haynes/radarsim |
---|
870 | ! |
---|
871 | ! Inputs: |
---|
872 | ! [freq] radar frequency (GHz) |
---|
873 | ! [D] discrete drop sizes (um) |
---|
874 | ! [N] discrete concentrations (cm^-3 um^-1) |
---|
875 | ! [nsizes] number of discrete drop sizes |
---|
876 | ! [k2] |K|^2, -1=use frequency dependent default |
---|
877 | ! [tt] hydrometeor temperature (K) |
---|
878 | ! [ice] indicates volume consists of ice |
---|
879 | ! [xr] perform Rayleigh calculations? |
---|
880 | ! [qe] if using a mie table, these contain ext/sca ... |
---|
881 | ! [qs] ... efficiencies; otherwise set to -1 |
---|
882 | ! [rho_e] medium effective density (kg m^-3) (-1 = pure) |
---|
883 | ! |
---|
884 | ! Outputs: |
---|
885 | ! [z_eff] unattenuated effective reflectivity factor (mm^6/m^3) |
---|
886 | ! [z_ray] reflectivity factor, Rayleigh only (mm^6/m^3) |
---|
887 | ! [kr] attenuation coefficient (db km^-1) |
---|
888 | ! |
---|
889 | ! Created: |
---|
890 | ! 11/28/05 John Haynes (haynes@atmos.colostate.edu) |
---|
891 | ! Modified: |
---|
892 | ! 12/18/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) |
---|
893 | ! ############################################################################################## |
---|
894 | ! Inputs |
---|
895 | integer, intent(in) :: & |
---|
896 | ice, & ! Indicates volume consists of ice |
---|
897 | xr, & ! Perform Rayleigh calculations? |
---|
898 | nsizes ! Number of discrete drop sizes |
---|
899 | real(wp), intent(in),dimension(nsizes) :: & |
---|
900 | D, & ! Discrete drop sizes (um) |
---|
901 | N, & ! Discrete concentrations (cm^-3 um^-1) |
---|
902 | rho_e, & ! Medium effective density (kg m^-3) (-1 = pure) |
---|
903 | qe, & ! Extinction efficiency, when using Mie tables |
---|
904 | qs ! Scatering efficiency, when using Mie tables |
---|
905 | real(wp),intent(in) :: & |
---|
906 | freq, & ! Radar frequency (GHz) |
---|
907 | tt ! Hydrometeor temperature (K) |
---|
908 | real(wp), intent(inout) :: & |
---|
909 | k2 ! |K|^2, -1=use frequency dependent default |
---|
910 | |
---|
911 | ! Outputs |
---|
912 | real(wp), intent(out) :: & |
---|
913 | z_eff, & ! Unattenuated effective reflectivity factor (mm^6/m^3) |
---|
914 | z_ray, & ! Reflectivity factor, Rayleigh only (mm^6/m^3) |
---|
915 | kr ! Attenuation coefficient (db km^-1) |
---|
916 | |
---|
917 | ! Internal Variables |
---|
918 | integer :: correct_for_rho ! Correct for density flag |
---|
919 | real(wp), dimension(nsizes) :: & |
---|
920 | D0, & ! D in (m) |
---|
921 | N0, & ! N in m^-3 m^-1 |
---|
922 | sizep, & ! Size parameter |
---|
923 | qext, & ! Extinction efficiency |
---|
924 | qbsca, & ! Backscatter efficiency |
---|
925 | f, & ! Ice fraction |
---|
926 | xtemp ! |
---|
927 | real(wp) :: & |
---|
928 | wl, cr,eta_sum,eta_mie,const,z0_eff,z0_ray,k_sum,n_r,n_i,dqv(1),dqsc,dg,dph(1) |
---|
929 | complex(wp) :: & |
---|
930 | m, & ! Complex index of refraction of bulk form |
---|
931 | Xs1(1), Xs2(1) ! |
---|
932 | integer :: & |
---|
933 | i, err ! |
---|
934 | integer, parameter :: & |
---|
935 | one=1 ! |
---|
936 | real(wp),parameter :: & |
---|
937 | conv_d = 1e-6, & ! Conversion factor for drop sizes (to m) |
---|
938 | conv_n = 1e12, & ! Conversion factor for drop concentrations (to m^-3) |
---|
939 | conv_f = 0.299792458 ! Conversion for radar frequency (to m) |
---|
940 | complex(wp),dimension(nsizes) ::& |
---|
941 | m0 ! Complex index of refraction |
---|
942 | |
---|
943 | ! Initialize |
---|
944 | z0_ray = 0._wp |
---|
945 | |
---|
946 | ! Conversions |
---|
947 | D0 = d*conv_d |
---|
948 | N0 = n*conv_n |
---|
949 | wl = conv_f/freq |
---|
950 | |
---|
951 | ! // dielectric constant |k^2| defaults |
---|
952 | if (k2 < 0) then |
---|
953 | k2 = 0.933_wp |
---|
954 | if (abs(94.-freq) < 3.) k2=0.75_wp |
---|
955 | if (abs(35.-freq) < 3.) k2=0.88_wp |
---|
956 | if (abs(13.8-freq) < 3.) k2=0.925_wp |
---|
957 | endif |
---|
958 | |
---|
959 | if (qe(1) < -9) then |
---|
960 | |
---|
961 | ! Get the refractive index of the bulk hydrometeors |
---|
962 | if (ice == 0) then |
---|
963 | call m_wat(freq,tt,n_r,n_i) |
---|
964 | else |
---|
965 | call m_ice(freq,tt,n_r,n_i) |
---|
966 | endif |
---|
967 | m = cmplx(n_r,-n_i) |
---|
968 | m0(1:nsizes) = m |
---|
969 | |
---|
970 | correct_for_rho = 0 |
---|
971 | if ((ice == 1) .and. (minval(rho_e) >= 0)) correct_for_rho = 1 |
---|
972 | |
---|
973 | ! Correct refractive index for ice density if needed |
---|
974 | if (correct_for_rho == 1) then |
---|
975 | f = rho_e/rhoice |
---|
976 | m0 = sqrt((2+(m0*m0)+2*f*((m0*m0)-1))/(2+(m0*m0)+f*(1-(m0*m0)))) |
---|
977 | endif |
---|
978 | |
---|
979 | ! Mie calculations |
---|
980 | sizep = (pi*D0)/wl |
---|
981 | dqv(1) = 0._wp |
---|
982 | do i=1,nsizes |
---|
983 | call mieint(sizep(i), m0(i), one, dqv, qext(i), dqsc, qbsca(i), & |
---|
984 | dg, xs1, xs2, dph, err) |
---|
985 | end do |
---|
986 | |
---|
987 | else |
---|
988 | ! Mie table used |
---|
989 | qext = qe |
---|
990 | qbsca = qs |
---|
991 | endif |
---|
992 | |
---|
993 | ! eta_mie = 0.25*sum[qbsca*pi*D^2*N(D)*deltaD] |
---|
994 | ! <--------- eta_sum ---------> |
---|
995 | ! z0_eff = (wl^4/!pi^5)*(1./k2)*eta_mie |
---|
996 | eta_sum = 0._wp |
---|
997 | if (size(D0) == 1) then |
---|
998 | eta_sum = qbsca(1)*(n(1)*1E6)*D0(1)*D0(1) |
---|
999 | else |
---|
1000 | xtemp = qbsca*N0*D0*D0 |
---|
1001 | call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),eta_sum) |
---|
1002 | endif |
---|
1003 | |
---|
1004 | eta_mie = eta_sum*0.25_wp*pi |
---|
1005 | const = ((wl*wl*wl*wl)/(pi*pi*pi*pi*pi))*(1._wp/k2) |
---|
1006 | |
---|
1007 | z0_eff = const*eta_mie |
---|
1008 | |
---|
1009 | ! kr = 0.25*cr*sum[qext*pi*D^2*N(D)*deltaD] |
---|
1010 | ! <---------- k_sum ---------> |
---|
1011 | k_sum = 0._wp |
---|
1012 | if (size(D0) == 1) then |
---|
1013 | k_sum = qext(1)*(n(1)*1E6)*D0(1)*D0(1) |
---|
1014 | else |
---|
1015 | xtemp = qext*N0*D0*D0 |
---|
1016 | call avint(xtemp,D0,nsizes,D0(1),D0(size(D0,1)),k_sum) |
---|
1017 | endif |
---|
1018 | ! DS2014 START: Making this calculation in double precision results in a small |
---|
1019 | ! amount of very small errors in the COSP output field,dBZE94, |
---|
1020 | ! so it will be left as is. |
---|
1021 | !cr = 10._wp/log(10._wp) |
---|
1022 | cr = 10./log(10.) |
---|
1023 | ! DS2014 STOP |
---|
1024 | kr = k_sum*0.25_wp*pi*(1000._wp*cr) |
---|
1025 | |
---|
1026 | ! z_ray = sum[D^6*N(D)*deltaD] |
---|
1027 | if (xr == 1) then |
---|
1028 | z0_ray = 0._wp |
---|
1029 | if (size(D0) == 1) then |
---|
1030 | z0_ray = (n(1)*1E6)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1)*D0(1) |
---|
1031 | else |
---|
1032 | xtemp = N0*D0*D0*D0*D0*D0*D0 |
---|
1033 | call avint(xtemp,D0,nsizes,D0(1),D0(size(D0)),z0_ray) |
---|
1034 | endif |
---|
1035 | endif |
---|
1036 | |
---|
1037 | ! Convert to mm^6/m^3 |
---|
1038 | z_eff = z0_eff*1E18 ! 10.*alog10(z0_eff*1E18) |
---|
1039 | z_ray = z0_ray*1E18 ! 10.*alog10(z0_ray*1E18) |
---|
1040 | |
---|
1041 | end subroutine zeff |
---|
1042 | ! ############################################################################################## |
---|
1043 | ! ############################################################################################## |
---|
1044 | function gases(PRES_mb,T,SH,f) |
---|
1045 | ! ############################################################################################## |
---|
1046 | ! Purpose: |
---|
1047 | ! Compute 2-way gaseous attenuation through a volume in microwave |
---|
1048 | ! |
---|
1049 | ! Inputs: |
---|
1050 | ! [PRES_mb] pressure (mb) (hPa) |
---|
1051 | ! [T] temperature (K) |
---|
1052 | ! [RH] relative humidity (%) |
---|
1053 | ! [f] frequency (GHz), < 300 GHz |
---|
1054 | ! |
---|
1055 | ! Returns: |
---|
1056 | ! 2-way gaseous attenuation (dB/km) |
---|
1057 | ! |
---|
1058 | ! Reference: |
---|
1059 | ! Uses method of Liebe (1985) |
---|
1060 | ! |
---|
1061 | ! Created: |
---|
1062 | ! 12/09/05 John Haynes (haynes@atmos.colostate.edu) |
---|
1063 | ! Modified: |
---|
1064 | ! 01/31/06 Port from IDL to Fortran 90 |
---|
1065 | ! 12/19/14 Dustin Swales: Define type REALs as double precision (dustin.swales@noaa.gov) |
---|
1066 | ! ############################################################################################## |
---|
1067 | |
---|
1068 | ! INPUTS |
---|
1069 | real(wp), intent(in) :: & ! |
---|
1070 | PRES_mb, & ! Pressure (mb) (hPa) |
---|
1071 | T, & ! Temperature (K) |
---|
1072 | SH, & ! Specific humidity |
---|
1073 | f ! Frequency (GHz), < 300 GHz |
---|
1074 | |
---|
1075 | ! PARAMETERS |
---|
1076 | integer, parameter :: & ! |
---|
1077 | nbands_o2 = 48, & ! Number of O2 bands |
---|
1078 | nbands_h2o = 30 ! Number of h2o bands |
---|
1079 | ! LOCAL VARIABLES |
---|
1080 | real(wp) :: & |
---|
1081 | gases, th, e, p, sumo, gm0, a0, ap, term1, & |
---|
1082 | term2, term3, bf, be, term4, npp,e_th,one_th, & |
---|
1083 | pth3,eth35,aux1,aux2,aux3, aux4,gm,delt,x,y, & |
---|
1084 | gm2,fpp_o2,fpp_h2o,s_o2,s_h2o |
---|
1085 | integer :: i |
---|
1086 | |
---|
1087 | ! Table1 parameters v0, a1, a2, a3, a4, a5, a6 |
---|
1088 | real(wp),dimension(nbands_o2),parameter :: & |
---|
1089 | v0 = (/49.4523790,49.9622570,50.4742380,50.9877480,51.5033500, & |
---|
1090 | 52.0214090,52.5423930,53.0669060,53.5957480,54.1299999,54.6711570, & |
---|
1091 | 55.2213650,55.7838000,56.2647770,56.3378700,56.9681000,57.6124810, & |
---|
1092 | 58.3238740,58.4465890,59.1642040,59.5909820,60.3060570,60.4347750, & |
---|
1093 | 61.1505580,61.8001520,62.4112120,62.4862530,62.9979740,63.5685150, & |
---|
1094 | 64.1277640,64.6789000,65.2240670,65.7647690,66.3020880,66.8368270, & |
---|
1095 | 67.3695950,67.9008620,68.4310010,68.9603060,69.4890210,70.0173420, & |
---|
1096 | 118.7503410,368.4983500,424.7631200,487.2493700,715.3931500, & |
---|
1097 | 773.8387300, 834.1453300/), & |
---|
1098 | a1 = (/0.0000001,0.0000003,0.0000009,0.0000025,0.0000061,0.0000141, & |
---|
1099 | 0.0000310,0.0000641,0.0001247,0.0002280,0.0003918,0.0006316,0.0009535, & |
---|
1100 | 0.0005489,0.0013440,0.0017630,0.0000213,0.0000239,0.0000146,0.0000240, & |
---|
1101 | 0.0000211,0.0000212,0.0000246,0.0000250,0.0000230,0.0000193,0.0000152, & |
---|
1102 | 0.0000150,0.0000109,0.0007335,0.0004635,0.0002748,0.0001530,0.0000801, & |
---|
1103 | 0.0000395,0.0000183,0.0000080,0.0000033,0.0000013,0.0000005,0.0000002, & |
---|
1104 | 0.0000094,0.0000679,0.0006380,0.0002350,0.0000996,0.0006710,0.0001800/),& |
---|
1105 | a2 = (/11.8300000,10.7200000,9.6900000,8.8900000,7.7400000,6.8400000, & |
---|
1106 | 6.0000000,5.2200000,4.4800000,3.8100000,3.1900000,2.6200000,2.1150000, & |
---|
1107 | 0.0100000,1.6550000,1.2550000,0.9100000,0.6210000,0.0790000,0.3860000, & |
---|
1108 | 0.2070000,0.2070000,0.3860000,0.6210000,0.9100000,1.2550000,0.0780000, & |
---|
1109 | 1.6600000,2.1100000,2.6200000,3.1900000,3.8100000,4.4800000,5.2200000, & |
---|
1110 | 6.0000000,6.8400000,7.7400000,8.6900000,9.6900000,10.7200000,11.8300000,& |
---|
1111 | 0.0000000,0.0200000,0.0110000,0.0110000,0.0890000,0.0790000,0.0790000/),& |
---|
1112 | a3 = (/0.0083000,0.0085000,0.0086000,0.0087000,0.0089000,0.0092000, & |
---|
1113 | 0.0094000,0.0097000,0.0100000,0.0102000,0.0105000,0.0107900,0.0111000, & |
---|
1114 | 0.0164600,0.0114400,0.0118100,0.0122100,0.0126600,0.0144900,0.0131900, & |
---|
1115 | 0.0136000,0.0138200,0.0129700,0.0124800,0.0120700,0.0117100,0.0146800, & |
---|
1116 | 0.0113900,0.0110800,0.0107800,0.0105000,0.0102000,0.0100000,0.0097000, & |
---|
1117 | 0.0094000,0.0092000,0.0089000,0.0087000,0.0086000,0.0085000,0.0084000, & |
---|
1118 | 0.0159200,0.0192000,0.0191600,0.0192000,0.0181000,0.0181000,0.0181000/),& |
---|
1119 | a4 = (/0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1120 | 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1121 | 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1122 | 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1123 | 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1124 | 0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000,0.0000000, & |
---|
1125 | 0.0000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000,0.6000000/),& |
---|
1126 | a5 = (/0.0056000,0.0056000,0.0056000,0.0055000,0.0056000,0.0055000, & |
---|
1127 | 0.0057000,0.0053000,0.0054000,0.0048000,0.0048000,0.0041700,0.0037500, & |
---|
1128 | 0.0077400,0.0029700,0.0021200,0.0009400,-0.0005500,0.0059700,-0.0024400,& |
---|
1129 | 0.0034400,-0.0041300,0.0013200,-0.0003600,-0.0015900,-0.0026600, & |
---|
1130 | -0.0047700,-0.0033400,-0.0041700,-0.0044800,-0.0051000,-0.0051000, & |
---|
1131 | -0.0057000,-0.0055000,-0.0059000,-0.0056000,-0.0058000,-0.0057000, & |
---|
1132 | -0.0056000,-0.0056000,-0.0056000,-0.0004400,0.0000000,0.0000000, & |
---|
1133 | 0.0000000,0.0000000,0.0000000,0.0000000/), & |
---|
1134 | a6 = (/1.7000000,1.7000000,1.7000000,1.7000000,1.8000000,1.8000000, & |
---|
1135 | 1.8000000,1.9000000,1.8000000,2.0000000,1.9000000,2.1000000,2.1000000, & |
---|
1136 | 0.9000000,2.3000000,2.5000000,3.7000000,-3.1000000,0.8000000,0.1000000, & |
---|
1137 | 0.5000000,0.7000000,-1.0000000,5.8000000,2.9000000,2.3000000,0.9000000, & |
---|
1138 | 2.2000000,2.0000000,2.0000000,1.8000000,1.9000000,1.8000000,1.8000000, & |
---|
1139 | 1.7000000,1.8000000,1.7000000,1.7000000,1.7000000,1.7000000,1.7000000, & |
---|
1140 | 0.9000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000,1.0000000/) |
---|
1141 | |
---|
1142 | ! Table2 parameters v1, b1, b2, b3 |
---|
1143 | real(wp),dimension(nbands_h2o),parameter :: & |
---|
1144 | v1 = (/22.2350800,67.8139600,119.9959400,183.3101170,321.2256440, & |
---|
1145 | 325.1529190,336.1870000,380.1973720,390.1345080,437.3466670,439.1508120, & |
---|
1146 | 443.0182950,448.0010750,470.8889740,474.6891270,488.4911330,503.5685320, & |
---|
1147 | 504.4826920,556.9360020,620.7008070,658.0065000,752.0332270,841.0735950, & |
---|
1148 | 859.8650000,899.4070000,902.5550000,906.2055240,916.1715820,970.3150220, & |
---|
1149 | 987.9267640/), & |
---|
1150 | b1 = (/0.1090000,0.0011000,0.0007000,2.3000000,0.0464000,1.5400000, & |
---|
1151 | 0.0010000,11.9000000,0.0044000,0.0637000,0.9210000,0.1940000,10.6000000, & |
---|
1152 | 0.3300000,1.2800000,0.2530000,0.0374000,0.0125000,510.0000000,5.0900000, & |
---|
1153 | 0.2740000,250.0000000,0.0130000,0.1330000,0.0550000,0.0380000,0.1830000, & |
---|
1154 | 8.5600000,9.1600000,138.0000000/), & |
---|
1155 | b2 = (/2.1430000,8.7300000,8.3470000,0.6530000,6.1560000,1.5150000, & |
---|
1156 | 9.8020000,1.0180000,7.3180000,5.0150000,3.5610000,5.0150000,1.3700000, & |
---|
1157 | 3.5610000,2.3420000,2.8140000,6.6930000,6.6930000,0.1140000,2.1500000, & |
---|
1158 | 7.7670000,0.3360000,8.1130000,7.9890000,7.8450000,8.3600000,5.0390000, & |
---|
1159 | 1.3690000,1.8420000,0.1780000/), & |
---|
1160 | b3 = (/0.0278400,0.0276000,0.0270000,0.0283500,0.0214000,0.0270000, & |
---|
1161 | 0.0265000,0.0276000,0.0190000,0.0137000,0.0164000,0.0144000,0.0238000, & |
---|
1162 | 0.0182000,0.0198000,0.0249000,0.0115000,0.0119000,0.0300000,0.0223000, & |
---|
1163 | 0.0300000,0.0286000,0.0141000,0.0286000,0.0286000,0.0264000,0.0234000, & |
---|
1164 | 0.0253000,0.0240000,0.0286000/) |
---|
1165 | |
---|
1166 | ! Conversions |
---|
1167 | th = 300._wp/T ! unitless |
---|
1168 | |
---|
1169 | ! DS2014 START: Using _wp for the exponential in the denominator results in slight errors |
---|
1170 | ! for dBze94. 0.01 % of values differ, relative range: 1.03e-05 to 1.78e-04 |
---|
1171 | !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa |
---|
1172 | !e = (RH*th*th*th*th*th)/(41.45_wp*10**(9.834_wp*th-10)) ! kPa |
---|
1173 | e = SH*PRES_mb/(SH+0.622_wp)/1000._wp !kPa |
---|
1174 | ! DS2014 END |
---|
1175 | |
---|
1176 | p = PRES_mb/1000._wp-e ! kPa |
---|
1177 | e_th = e*th |
---|
1178 | one_th = 1 - th |
---|
1179 | pth3 = p*th*th*th |
---|
1180 | eth35 = e*th**(3.5) |
---|
1181 | |
---|
1182 | ! Term1 |
---|
1183 | sumo = 0._wp |
---|
1184 | aux1 = 1.1_wp*e_th |
---|
1185 | do i=1,nbands_o2 |
---|
1186 | aux2 = f/v0(i) |
---|
1187 | aux3 = v0(i)-f |
---|
1188 | aux4 = v0(i)+f |
---|
1189 | gm = a3(i)*(p*th**(0.8_wp-a4(i))+aux1) |
---|
1190 | gm2 = gm*gm |
---|
1191 | delt = a5(i)*p*th**a6(i) |
---|
1192 | x = aux3*aux3+gm2 |
---|
1193 | y = aux4*aux4+gm2 |
---|
1194 | fpp_o2 = (((1._wp/x)+(1._wp/y))*(gm*aux2) - (delt*aux2)*((aux3/(x))-(aux4/(x)))) |
---|
1195 | s_o2 = a1(i)*pth3*exp(a2(i)*one_th) |
---|
1196 | sumo = sumo + fpp_o2 * s_o2 |
---|
1197 | enddo |
---|
1198 | term1 = sumo |
---|
1199 | |
---|
1200 | ! Term2 |
---|
1201 | gm0 = 5.6E-3_wp*(p+1.1_wp*e)*th**(0.8_wp) |
---|
1202 | a0 = 3.07E-4_wp |
---|
1203 | ap = 1.4_wp*(1-1.2_wp*f**(1.5_wp)*1E-5)*1E-10 |
---|
1204 | term2 = (2*a0*(gm0*(1+(f/gm0)*(f/gm0))*(1+(f/60._wp)**2))**(-1) + ap*p*th**(2.5_wp))*f*p*th*th |
---|
1205 | |
---|
1206 | ! Term3 |
---|
1207 | sumo = 0._wp |
---|
1208 | aux1 = 4.8_wp*e_th |
---|
1209 | do i=1,nbands_h2o |
---|
1210 | aux2 = f/v1(i) |
---|
1211 | aux3 = v1(i)-f |
---|
1212 | aux4 = v1(i)+f |
---|
1213 | gm = b3(i)*(p*th**(0.8)+aux1) |
---|
1214 | gm2 = gm*gm |
---|
1215 | x = aux3*aux3+gm2 |
---|
1216 | y = aux4*aux4+gm2 |
---|
1217 | fpp_h2o = ((1._wp/x)+(1._wp/y))*(gm*aux2) ! - (delt*aux2)*((aux3/(x))-(aux4/(x))) |
---|
1218 | s_h2o = b1(i)*eth35*exp(b2(i)*one_th) |
---|
1219 | sumo = sumo + fpp_h2o * s_h2o |
---|
1220 | enddo |
---|
1221 | term3 = sumo |
---|
1222 | |
---|
1223 | ! Term4 |
---|
1224 | bf = 1.4E-6_wp |
---|
1225 | be = 5.41E-5_wp |
---|
1226 | term4 = (bf*p+be*e*th*th*th)*f*e*th**(2.5_wp) |
---|
1227 | |
---|
1228 | ! Summation and result |
---|
1229 | npp = term1 + term2 + term3 + term4 |
---|
1230 | gases = 0.182_wp*f*npp |
---|
1231 | |
---|
1232 | end function gases |
---|
1233 | subroutine hydro_class_init(lsingle,ldouble,sd) |
---|
1234 | ! ############################################################################################## |
---|
1235 | ! Purpose: |
---|
1236 | ! |
---|
1237 | ! Initialize variables used by the radar simulator. |
---|
1238 | ! Part of QuickBeam v3.0 by John Haynes and Roj Marchand |
---|
1239 | ! |
---|
1240 | ! Inputs: |
---|
1241 | ! NAME SIZE DESCRIPTION |
---|
1242 | ! [lsingle] (1) Logical flag to use single moment |
---|
1243 | ! [ldouble] (1) Logical flag to use two moment |
---|
1244 | ! Outputs: |
---|
1245 | ! [sd] Structure that define hydrometeor types |
---|
1246 | ! |
---|
1247 | ! Local variables: |
---|
1248 | ! [n_hydro] (1) Number of hydrometeor types |
---|
1249 | ! [hclass_type] (nhclass) Type of distribution (see quickbeam documentation) |
---|
1250 | ! [hclass_phase] (nhclass) 1==ice, 0=liquid |
---|
1251 | ! [hclass_dmin] (nhclass) Minimum diameter allowed is drop size distribution N(D<Dmin)=0 |
---|
1252 | ! [hclass_dmax] (nhclass) Maximum diameter allowed is drop size distribution N(D>Dmax)=0 |
---|
1253 | ! [hclass_apm] (nhclass) Density of partical apm*D^bpm or constant = rho |
---|
1254 | ! [hclass_bpm] (nhclass) Density of partical apm*D^bpm or constant = rho |
---|
1255 | ! [hclass_rho] (nhclass) Density of partical apm*D^bpm or constant = rho |
---|
1256 | ! [hclass_p1] (nhclass) Default values of DSD parameters (see quickbeam documentation) |
---|
1257 | ! [hclass_p2] (nhclass) Default values of DSD parameters (see quickbeam documentation) |
---|
1258 | ! [hclass_p3] (nhclass) Default values of DSD parameters (see quickbeam documentation) |
---|
1259 | ! Modified: |
---|
1260 | ! 08/23/2006 placed into subroutine form (Roger Marchand) |
---|
1261 | ! June 2010 New interface to support "radar_simulator_params" structure |
---|
1262 | ! 12/22/2014 Moved radar simulator (CLOUDSAT) configuration initialization to cloudsat_init |
---|
1263 | ! ############################################################################################## |
---|
1264 | |
---|
1265 | ! #################################################################################### |
---|
1266 | ! NOTES on HCLASS variables |
---|
1267 | ! |
---|
1268 | ! TYPE - Set to |
---|
1269 | ! 1 for modified gamma distribution, |
---|
1270 | ! 2 for exponential distribution, |
---|
1271 | ! 3 for power law distribution, |
---|
1272 | ! 4 for monodisperse distribution, |
---|
1273 | ! 5 for lognormal distribution. |
---|
1274 | ! |
---|
1275 | ! PHASE - Set to 0 for liquid, 1 for ice. |
---|
1276 | ! DMIN - The minimum drop size for this class (micron), ignored for monodisperse. |
---|
1277 | ! DMAX - The maximum drop size for this class (micron), ignored for monodisperse. |
---|
1278 | ! Important note: The settings for DMIN and DMAX are |
---|
1279 | ! ignored in the current version for all distributions except for power |
---|
1280 | ! law. Except when the power law distribution is used, particle size |
---|
1281 | ! is fixed to vary from zero to infinity, a restriction that is expected |
---|
1282 | ! to be lifted in future versions. A placeholder must still be specified |
---|
1283 | ! for each. |
---|
1284 | ! Density of particles is given by apm*D^bpm or a fixed value rho. ONLY specify ONE of these two!! |
---|
1285 | ! APM - The alpha_m coefficient in equation (1) (kg m**-beta_m ) |
---|
1286 | ! BPM - The beta_m coefficient in equation (1), see section 4.1. |
---|
1287 | ! RHO - Hydrometeor density (kg m-3 ). |
---|
1288 | ! |
---|
1289 | ! P1, P2, P3 - are default distribution parameters that depend on the type |
---|
1290 | ! of distribution (see quickmbeam documentation for more information) |
---|
1291 | ! |
---|
1292 | ! Modified Gamma (must set P3 and one of P1 or P2) |
---|
1293 | ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ), where |
---|
1294 | ! rho_a is the density of air in the radar volume. |
---|
1295 | ! P2 - Set to the particle mean diameter D (micron). |
---|
1296 | ! P3 - Set to the distribution width nu. |
---|
1297 | ! |
---|
1298 | ! Exponetial (set one of) |
---|
1299 | ! P1 - Set to a constant intercept parameter N0 (m-4). |
---|
1300 | ! P2 - Set to a constant lambda (micron-1). |
---|
1301 | ! |
---|
1302 | ! Power Law |
---|
1303 | ! P1 - Set this to the value of a constant power law parameter br |
---|
1304 | ! |
---|
1305 | ! Monodisperse |
---|
1306 | ! P1 - Set to a constant diameter D0 (micron) = Re. |
---|
1307 | ! |
---|
1308 | ! Log-normal (must set P3 and one of P1 or P2) |
---|
1309 | ! P1 - Set to the total particle number concentration Nt /rho_a (kg-1 ) |
---|
1310 | ! P2 - Set to the geometric mean particle radius rg (micron). |
---|
1311 | ! P3 - Set to the natural logarithm of the geometric standard deviation. |
---|
1312 | ! #################################################################################### |
---|
1313 | ! INPUTS |
---|
1314 | logical,intent(in) :: & |
---|
1315 | lsingle, & ! True -> use single moment |
---|
1316 | ldouble ! True -> use two moment |
---|
1317 | |
---|
1318 | ! OUTPUTS |
---|
1319 | type(size_distribution),intent(out) ::& |
---|
1320 | sd ! |
---|
1321 | |
---|
1322 | ! SINGLE MOMENT PARAMETERS |
---|
1323 | integer,parameter,dimension(N_HYDRO) :: & |
---|
1324 | ! LSL LSI LSR LSS CVL CVI CVR CVS LSG |
---|
1325 | HCLASS1_TYPE = (/5, 1, 2, 2, 5, 1, 2, 2, 2/), & ! |
---|
1326 | HCLASS1_PHASE = (/0, 1, 0, 1, 0, 1, 0, 1, 1/) ! |
---|
1327 | real(wp),parameter,dimension(N_HYDRO) ::& |
---|
1328 | ! LSL LSI LSR LSS CVL CVI CVR CVS LSG |
---|
1329 | HCLASS1_DMIN = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & |
---|
1330 | HCLASS1_DMAX = (/ -1., -1., -1., -1., -1., -1., -1., -1., -1. /), & |
---|
1331 | HCLASS1_APM = (/524., 110.8, 524., -1., 524., 110.8, 524., -1., -1. /), & |
---|
1332 | HCLASS1_BPM = (/ 3., 2.91, 3., -1., 3., 2.91, 3., -1., -1. /), & |
---|
1333 | HCLASS1_RHO = (/ -1., -1., -1., 100., -1., -1., -1., 100., 400. /), & |
---|
1334 | HCLASS1_P1 = (/ -1., -1., 8.e6, 3.e6, -1., -1., 8.e6, 3.e6, 4.e6/), & |
---|
1335 | HCLASS1_P2 = (/ 6., 40., -1., -1., 6., 40., -1., -1., -1. /), & |
---|
1336 | HCLASS1_P3 = (/ 0.3, 2., -1., -1., 0.3, 2., -1., -1., -1. /) |
---|
1337 | |
---|
1338 | ! TWO MOMENT PARAMETERS |
---|
1339 | integer,parameter,dimension(N_HYDRO) :: & |
---|
1340 | ! LSL LSI LSR LSS CVL CVI CVR CVS LSG |
---|
1341 | HCLASS2_TYPE = (/ 1, 1, 1, 1, 1, 1, 1, 1, 1/), & |
---|
1342 | HCLASS2_PHASE = (/ 0, 1, 0, 1, 0, 1, 0, 1, 1/) |
---|
1343 | |
---|
1344 | real(wp),parameter,dimension(N_HYDRO) :: & |
---|
1345 | ! LSL LSI LSR LSS CVL CVI CVR CVS LSG |
---|
1346 | HCLASS2_DMIN = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & |
---|
1347 | HCLASS2_DMAX = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & |
---|
1348 | HCLASS2_APM = (/524, -1, 524, -1, 524, -1, 524, -1, -1/), & |
---|
1349 | HCLASS2_BPM = (/ 3, -1, 3, -1, 3, -1, 3, -1, -1/), & |
---|
1350 | HCLASS2_RHO = (/ -1, 500, -1, 100, -1, 500, -1, 100, 900/), & |
---|
1351 | HCLASS2_P1 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & |
---|
1352 | HCLASS2_P2 = (/ -1, -1, -1, -1, -1, -1, -1, -1, -1/), & |
---|
1353 | HCLASS2_P3 = (/ -2, 1, 1, 1, -2, 1, 1, 1, 1/) |
---|
1354 | |
---|
1355 | if (lsingle) then |
---|
1356 | sd%dtype(1:N_HYDRO) = HCLASS1_TYPE(1:N_HYDRO) |
---|
1357 | sd%phase(1:N_HYDRO) = HCLASS1_PHASE(1:N_HYDRO) |
---|
1358 | sd%dmin(1:N_HYDRO) = HCLASS1_DMIN(1:N_HYDRO) |
---|
1359 | sd%dmax(1:N_HYDRO) = HCLASS1_DMAX(1:N_HYDRO) |
---|
1360 | sd%apm(1:N_HYDRO) = HCLASS1_APM(1:N_HYDRO) |
---|
1361 | sd%bpm(1:N_HYDRO) = HCLASS1_BPM(1:N_HYDRO) |
---|
1362 | sd%rho(1:N_HYDRO) = HCLASS1_RHO(1:N_HYDRO) |
---|
1363 | sd%p1(1:N_HYDRO) = HCLASS1_P1(1:N_HYDRO) |
---|
1364 | sd%p2(1:N_HYDRO) = HCLASS1_P2(1:N_HYDRO) |
---|
1365 | sd%p3(1:N_HYDRO) = HCLASS1_P3(1:N_HYDRO) |
---|
1366 | endif |
---|
1367 | if (ldouble) then |
---|
1368 | sd%dtype(1:N_HYDRO) = HCLASS2_TYPE(1:N_HYDRO) |
---|
1369 | sd%phase(1:N_HYDRO) = HCLASS2_PHASE(1:N_HYDRO) |
---|
1370 | sd%dmin(1:N_HYDRO) = HCLASS2_DMIN(1:N_HYDRO) |
---|
1371 | sd%dmax(1:N_HYDRO) = HCLASS2_DMAX(1:N_HYDRO) |
---|
1372 | sd%apm(1:N_HYDRO) = HCLASS2_APM(1:N_HYDRO) |
---|
1373 | sd%bpm(1:N_HYDRO) = HCLASS2_BPM(1:N_HYDRO) |
---|
1374 | sd%rho(1:N_HYDRO) = HCLASS2_RHO(1:N_HYDRO) |
---|
1375 | sd%p1(1:N_HYDRO) = HCLASS2_P1(1:N_HYDRO) |
---|
1376 | sd%p2(1:N_HYDRO) = HCLASS2_P2(1:N_HYDRO) |
---|
1377 | sd%p3(1:N_HYDRO) = HCLASS2_P3(1:N_HYDRO) |
---|
1378 | endif |
---|
1379 | end subroutine hydro_class_init |
---|
1380 | end module mod_quickbeam_optics |
---|