@@ -17,11 +17,13 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
17
17
real, allocatable :: model_chemic(:,:)
18
18
real, allocatable :: model_rho(:,:)
19
19
20
- real, parameter :: scaleL = 3000. ! scaling factor for obs error [meters]
20
+ ! Raidus of influence of ground observations at urban sites (Table 3 . in Elbernet al. 2007 )
21
+ ! FIXME: It would be better to put this parameter in the namelist.
22
+ real, parameter :: Lrepr = 3000 . !2000 . ! Scaling factor for obs error [meters]
21
23
22
- ! max thresholds of abs(o-b) in pm25, pm10, so2, no2, o3, co
24
+ ! Max thresholds of abs(o-b) in pm25, pm10, so2, no2, o3, co
23
25
real,dimension(6 ):: maxomb = (/100 ., 100 ., 0.20 , 0.20 , 0.20 , 20 ./)
24
- real :: err_o, err_r
26
+ real :: err_o1, err_o2, err_r1, err_r2
25
27
26
28
if (trace_use) call da_trace_entry(" da_get_innov_vector_chem_sfc" )
27
29
@@ -46,14 +48,14 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
46
48
end do
47
49
48
50
! [1.1 ] Compute prior observations at obs sites
49
- if (chem_cv_options == 10 ) then
51
+ if (chem_cv_options == 10 ) then ! gocart_test
50
52
model_chemic_surf(:,p_chemsi_pm25)=model_rho(:,p_chem_ic_p25)*(model_chemic(:,p_chem_ic_p25) + &
51
53
1.375 *(96.06 /28.964 *1000 )*model_chemic(:,p_chem_ic_sulf) + &
52
54
model_chemic(:,p_chem_ic_bc1)+model_chemic(:,p_chem_ic_bc2)+1.8 *(model_chemic(:,p_chem_ic_oc1)+model_chemic(:,p_chem_ic_oc2)) + &
53
55
model_chemic(:,p_chem_ic_dust_1)+0.286 *model_chemic(:,p_chem_ic_dust_2)+model_chemic(:,p_chem_ic_seas_1) + &
54
56
0.942 *model_chemic(:,p_chem_ic_seas_2))
55
57
56
- else if (chem_cv_options == 20 ) then
58
+ else if (chem_cv_options == 20 ) then ! mosaic_test
57
59
58
60
if (chemicda_opt == 1 ) then
59
61
model_chemic_surf(:,p_chemsi_pm25)=model_rho(:,p_chem_ic_bc_a01)*(model_chemic(:,p_chem_ic_bc_a01)+model_chemic(:,p_chem_ic_bc_a02) + &
@@ -109,7 +111,7 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
109
111
110
112
end if
111
113
112
- else if (chem_cv_options == 108 ) then ! racm_soa_vbs_da
114
+ else if (chem_cv_options >= 108 ) then ! racm_soa_vbs_da or racm_soa_vbs_aqchem_da
113
115
114
116
if (chemicda_opt == 1 .or . chemicda_opt == 3 .or . chemicda_opt == 5 ) then ! pm2.5
115
117
@@ -119,6 +121,13 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
119
121
model_rho(:,ichem) * model_chemic(:,ichem)
120
122
end do
121
123
124
+ if ( (p_chem_ic_p25cwi .gt. p_chem_ic_p25i) .and . chem_cv_options == 109 ) then ! aqueous chemistry
125
+ do ichem = p_chem_ic_so4cwj,p_chem_ic_p25cwi
126
+ model_chemic_surf(:,p_chemsi_pm25) = model_chemic_surf(:,p_chemsi_pm25) + &
127
+ model_rho(:,ichem) * model_chemic(:,ichem)
128
+ enddo
129
+ endif
130
+
122
131
end if
123
132
124
133
if (chemicda_opt == 2 ) then ! pm10
@@ -129,6 +138,13 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
129
138
model_rho(:,ichem) * model_chemic(:,ichem)
130
139
end do
131
140
141
+ if ( (p_chem_ic_p25cwi .gt. p_chem_ic_p25i) .and . chem_cv_options == 109 ) then ! aqueous chemistry
142
+ do ichem = p_chem_ic_so4cwj,p_chem_ic_soilcw
143
+ model_chemic_surf(:,p_chemsi_pm10) = model_chemic_surf(:,p_chemsi_pm10) + &
144
+ model_rho(:,ichem) * model_chemic(:,ichem)
145
+ end do
146
+ endif
147
+
132
148
end if !(chemicda_opt == 2 ) then
133
149
134
150
if (chemicda_opt == 3 .or . chemicda_opt == 5 ) then ! pm10 after pm2.5
@@ -140,6 +156,13 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
140
156
model_rho(:,ichem) * model_chemic(:,ichem)
141
157
end do
142
158
159
+ if ( (p_chem_ic_p25cwi .gt. p_chem_ic_p25i) .and . chem_cv_options == 109 ) then ! aqueous chemistry
160
+ do ichem = p_chem_ic_anthcw,p_chem_ic_soilcw
161
+ model_chemic_surf(:,p_chemsi_pm10) = model_chemic_surf(:,p_chemsi_pm10) + &
162
+ model_rho(:,ichem) * model_chemic(:,ichem)
163
+ end do
164
+ endif
165
+
143
166
end if !(chemicda_opt == 3 .or . chemicda_opt == 5 )
144
167
145
168
if (chemicda_opt >= 4 ) then
@@ -151,9 +174,11 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
151
174
152
175
end if !(chemicda_opt >= 4 ) then
153
176
154
- end if ! (chem_cv_options == 108 )
177
+ end if ! (chem_cv_options >= 108 )
178
+
179
+
180
+ ! Innovations and obs errors for chemic_surf (e.g., surfce concentration)
155
181
156
- ! Loop over chemic_surf (e.g., surfce concentration)
157
182
do ichem = PARAM_FIRST_SCALAR, num_chemic_surf
158
183
ipm = ichem - PARAM_FIRST_SCALAR + 1
159
184
@@ -170,22 +195,22 @@ subroutine da_get_innov_vector_chem_sfc( it, num_qcstat_conv, grid, ob, iv)
170
195
iv % chemic_surf(n) % chem(ichem) % inv = &
171
196
ob % chemic_surf(n) % chem(ichem) - model_chemic_surf(n,ichem)
172
197
173
- if ( ichem <= PARAM_FIRST_SCALAR+ 1 ) then ! PM2.5 and PM10
174
-
175
- err_o = 1.5 + 0.0075 * ob % chemic_surf(n) % chem(ichem)
176
- err_r = 0.5 * err_o * sqrt(grid % dx / scaleL )
177
- iv % chemic_surf(n) % chem(ichem) % error = sqrt(err_o** 2 + err_r** 2 )
178
-
179
- else ! gas species (so2, no2, o3, co)
180
-
181
- err_o = 0.10 * ob % chemic_surf(n) % chem(ichem) ! obs error as 10% of the observation value
182
- iv % chemic_surf(n) % chem(ichem) % error = err_o
183
-
184
- !err_o = 1.0 + 0.0075 * ob % chemic_surf(n) % chem(ichem) ! Wei Sun
185
- !err_r = 0.5 * err_o * sqrt(grid % dx / 2000 .)
186
- ! iv % chemic_surf(n) % chem(ichem) % error = 1.5 *sqrt(err_o **2 + err_r **2 )
187
-
188
- end if !( ichem <= PARAM_FIRST_SCALAR+ 1 )
198
+ ! Observation error specification
199
+ err_o1 = 1.0 + 0.0075 * ob % chemic_surf(n) % chem(ichem)
200
+ err_o2 = 1.5 + 0.0075 * ob % chemic_surf(n) % chem(ichem)
201
+ err_r1 = 0.5 * err_o1 * sqrt(grid%dx/Lrepr )
202
+ err_r2 = 0.5 * err_o2 * sqrt(grid%dx/Lrepr )
203
+
204
+ if (chemicda_opt == 3 . or . chemicda_opt == 5 ) then ! PM10 is treated as (PM10 - PM2 .5 ) residual.
205
+ if (ichem == PARAM_FIRST_SCALAR+ 1 ) then
206
+ iv % chemic_surf(n) % chem(ichem) % error = 1.0 *sqrt(err_o1** 2 + err_r1** 2 ) ! reduced error for PM10
207
+ else ! PM2 .5 and gas species (so2, no2, o3, co)
208
+ iv % chemic_surf(n) % chem(ichem) % error = 1.0 *sqrt(err_o2** 2 + err_r2** 2 ) ! Ha (GMD2022)
209
+ end if
210
+ else ! PM10 is not a residual.
211
+ iv % chemic_surf(n) % chem(ichem) % error = 1.0 *sqrt(err_o2 **2 + err_r2 **2 ) ! Ha (GMD2022 )
212
+ !iv % chemic_surf(n) % chem(ichem) % error = 1.5 *sqrt(err_o1** 2 + err_r1** 2 ) ! Wei ' s error
213
+ end if
189
214
190
215
! Quality Control
191
216
! ----------------
0 commit comments