1 | ! $Id: ropp_fm_refrac_1d.f90 4452 2015-01-29 14:42:02Z idculv $
|
---|
2 |
|
---|
3 | SUBROUTINE ropp_fm_refrac_1d(x, y, nonull)
|
---|
4 |
|
---|
5 | !****s* Refractivity/ropp_fm_refrac_1d *
|
---|
6 | !
|
---|
7 | ! NAME
|
---|
8 | ! ropp_fm_refrac_1d - Forward model calculating a one dimensional
|
---|
9 | ! refractivity profile from the state vector
|
---|
10 | ! assuming exponential variation of refractivity
|
---|
11 | ! between model levels.
|
---|
12 | !
|
---|
13 | ! SYNOPSIS
|
---|
14 | ! call ropp_fm_refrac_1d(x, y, nonull)
|
---|
15 | !
|
---|
16 | ! DESCRIPTION
|
---|
17 | ! This routine is a forward model calculating a vertical profile of
|
---|
18 | ! refractivity from profiles of temperature, humidity and pressure.
|
---|
19 | ! Refractivity values are calculated for the geopotential height levels
|
---|
20 | ! given in the observation vector.
|
---|
21 | !
|
---|
22 | ! INPUTS
|
---|
23 | ! type(State1dFM) :: x ! State vector structure
|
---|
24 | ! type(Obs1dRefrac) :: y ! Observation vector (levels required)
|
---|
25 | ! logical, optional :: nonull ! Don't nullify refracs below surface of model
|
---|
26 | !
|
---|
27 | ! OUTPUT
|
---|
28 | ! type(Obs1dRefrac) :: y ! Obs vector with forward modelled refrac
|
---|
29 | !
|
---|
30 | ! NOTES
|
---|
31 | ! The forward model assumes that the state vector structure contains
|
---|
32 | ! temperature, humidity and pressure values on common geopotential height
|
---|
33 | ! levels, independent of the source of those data. Model-dependent
|
---|
34 | ! conversion routines can be used to accomplish this within the
|
---|
35 | ! ropp_fm_roprof2state() subroutine.
|
---|
36 | !
|
---|
37 | ! The forward model assumes that the observation vector contains
|
---|
38 | ! geopotential height levels onto which the forward simulated
|
---|
39 | ! observations are interpolated.
|
---|
40 | !
|
---|
41 | ! The interpolation of refractivity calculated at the state vector's
|
---|
42 | ! geopotential height levels to the observation vector's geopotential height
|
---|
43 | ! levels is carried out assuming that refractivity varies exponentially
|
---|
44 | ! with geopotential height.
|
---|
45 | !
|
---|
46 | ! SEE ALSO
|
---|
47 | ! ropp_fm_types
|
---|
48 | ! ropp_fm_refrac_1d_ad
|
---|
49 | ! ropp_fm_refrac_1d_tl
|
---|
50 | !
|
---|
51 | ! AUTHOR
|
---|
52 | ! Met Office, Exeter, UK.
|
---|
53 | ! Any comments on this software should be given via the ROM SAF
|
---|
54 | ! Helpdesk at http://www.romsaf.org
|
---|
55 | !
|
---|
56 | ! COPYRIGHT
|
---|
57 | ! (c) EUMETSAT. All rights reserved.
|
---|
58 | ! For further details please refer to the file COPYRIGHT
|
---|
59 | ! which you should have received as part of this distribution.
|
---|
60 | !
|
---|
61 | !****
|
---|
62 |
|
---|
63 | !-------------------------------------------------------------------------------
|
---|
64 | ! 1. Declarations
|
---|
65 | !-------------------------------------------------------------------------------
|
---|
66 |
|
---|
67 | USE typesizes, ONLY: wp => EightByteReal
|
---|
68 | USE ropp_utils, ONLY: ropp_MDFV
|
---|
69 | USE ropp_fm, not_this => ropp_fm_refrac_1d
|
---|
70 | USE ropp_fm_types
|
---|
71 | USE ropp_fm_constants
|
---|
72 |
|
---|
73 | IMPLICIT NONE
|
---|
74 |
|
---|
75 | TYPE(State1dFM), INTENT(in) :: x ! State vector
|
---|
76 | TYPE(Obs1dRefrac), INTENT(inout) :: y ! Observation vector
|
---|
77 | LOGICAL, OPTIONAL, INTENT(in) :: nonull ! Don't nullify refracs below surface of model
|
---|
78 |
|
---|
79 | ! Local variables
|
---|
80 | REAL(wp), DIMENSION(x%n_lev) :: pwvp ! Partial water vapour pressure
|
---|
81 | REAL(wp), DIMENSION(x%n_lev) :: pdry ! Partial dry air pressure
|
---|
82 | REAL(wp), DIMENSION(x%n_lev) :: refrac ! Refractivity
|
---|
83 | REAL(wp), DIMENSION(x%n_lev) :: z_geop ! Geopotential height of model levels
|
---|
84 | REAL(wp), DIMENSION(x%n_lev) :: zcomp_dry_inv ! Dry compressibility
|
---|
85 | REAL(wp), DIMENSION(x%n_lev) :: zcomp_wet_inv ! Wet compressibility
|
---|
86 |
|
---|
87 | REAL(wp) :: kap1,kap2,kap3 ! Refractivity coefficients used in routine
|
---|
88 |
|
---|
89 | INTEGER :: i
|
---|
90 |
|
---|
91 | LOGICAL :: l_nonull ! Don't nullify refracs below surface of model
|
---|
92 |
|
---|
93 | !-------------------------------------------------------------------------------
|
---|
94 | ! 2. Non ideal gas options
|
---|
95 | !-------------------------------------------------------------------------------
|
---|
96 |
|
---|
97 | ! set inverse of compressibilities
|
---|
98 |
|
---|
99 | zcomp_dry_inv(:) = 1.0_wp
|
---|
100 | zcomp_wet_inv(:) = 1.0_wp
|
---|
101 |
|
---|
102 | ! initialise geopotential heights
|
---|
103 |
|
---|
104 | z_geop(:) = x%geop(:)
|
---|
105 |
|
---|
106 | IF (x%non_ideal) THEN
|
---|
107 |
|
---|
108 | ! if non ideal gas calculation, use adjusted coefficients
|
---|
109 |
|
---|
110 | kap1 = kappa1_comp
|
---|
111 | kap2 = kappa2_comp
|
---|
112 | kap3 = kappa3_comp
|
---|
113 |
|
---|
114 | ! calculate compressibilty and adjust geopotential heights in z_geop
|
---|
115 |
|
---|
116 | CALL ropp_fm_compress(x,z_geop,zcomp_dry_inv,zcomp_wet_inv)
|
---|
117 |
|
---|
118 | ELSE
|
---|
119 |
|
---|
120 | kap1 = kappa1
|
---|
121 | kap2 = kappa2
|
---|
122 | kap3 = kappa3
|
---|
123 |
|
---|
124 | ENDIF
|
---|
125 |
|
---|
126 | !-------------------------------------------------------------------------------
|
---|
127 | ! 3. Standard exponentially varying refractivity assumption
|
---|
128 | !-------------------------------------------------------------------------------
|
---|
129 |
|
---|
130 | ! 3.1 Calculate water vapor and dry air pressure
|
---|
131 | !-----------------------------------------------
|
---|
132 |
|
---|
133 | pwvp = x%pres * x%shum / (epsilon_water + (1.0_wp - epsilon_water)*x%shum)
|
---|
134 |
|
---|
135 | pdry = x%pres - pwvp
|
---|
136 |
|
---|
137 | ! 3.2 Calculate refractivity
|
---|
138 | !---------------------------
|
---|
139 |
|
---|
140 | refrac = kap1 * pdry * zcomp_dry_inv/ x%temp + &
|
---|
141 | kap2 * pwvp * zcomp_wet_inv/ x%temp**2 + &
|
---|
142 | kap3 * pwvp * zcomp_wet_inv/ x%temp
|
---|
143 |
|
---|
144 | ! 3.3 Interpolate to measurements geopotential height levels
|
---|
145 | !-----------------------------------------------------------
|
---|
146 |
|
---|
147 | CALL ropp_fm_interpol_log(z_geop, y%geop, refrac, y%refrac)
|
---|
148 |
|
---|
149 | ! 3.4 Set weight to zero if ob height is below model surface
|
---|
150 | !-----------------------------------------------------------
|
---|
151 |
|
---|
152 | l_nonull = .FALSE.
|
---|
153 |
|
---|
154 | IF ( PRESENT(nonull) ) l_nonull = nonull
|
---|
155 |
|
---|
156 | IF ( .NOT. l_nonull ) THEN
|
---|
157 | DO i=1, SIZE(y%geop)
|
---|
158 | IF ((y%geop(i) < x%geop(1)) .OR. (y%geop(i) > x%geop(x%n_lev))) THEN
|
---|
159 | y%refrac(i) = ropp_MDFV
|
---|
160 | y%weights(i) = 0.0_wp
|
---|
161 | END IF
|
---|
162 | END DO
|
---|
163 | END IF
|
---|
164 |
|
---|
165 | END SUBROUTINE ropp_fm_refrac_1d
|
---|