-
Notifications
You must be signed in to change notification settings - Fork 0
/
paper_ana_20181122.Rmd
1723 lines (1409 loc) · 128 KB
/
paper_ana_20181122.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
---
title: "Hourly Assimilation of Different Sources of Observations Including Satellite Radiances in a Mesoscale Convective System Case During RELAMPAGO campaign"
author:
- name: Paola Belén Corrales
email: [email protected]
affiliation: UBA,CIMA,CNRS
footnote: 1
- name: V. Galligani
affiliation: UBA,CIMA,CNRS
- name: Juan Ruiz
affiliation: UBA,CIMA,CNRS
- name: Luiz Sapucci
affiliation: INPE
- name: María Eugenia Dillon
affiliation: SMN,CONICET
- name: Yanina García Skabar
affiliation: SMN,CONICET,CNRS
- name: Maximiliano Sacco
affiliation: SMN
- name: Craig S. Schwartz
affiliation: NCAR
- name: Stephen W. Nesbitt
affiliation: Illinois
date: "`r Sys.Date()`"
output:
bookdown::pdf_book:
base_format: rticles::elsevier_article
citation_package: natbib
# always_allow_html: true
abstract: |
This paper evaluates the impact of assimilating high-resolution surface networks and satellite observations using the WRF-GSI-LETKF over central and north eastern Argentina where the surface and upper air observing networks are relatively coarse. A case study corresponding to a huge mesoscale convective system (MCS) that developed during November 22, 2018 was used. The accumulated precipitation associated with this MCS was quite high, exceeding 200 mm over northern Argentina and Paraguay. The MCS developed during the Intense Observing Period (IOP) of the Remote sensing of Electrification, Lightning, And Mesoscale/microscale Processes with Adaptive Ground Observations (RELAMPAGO) field campaign. The GSI-4DLETKF data assimilation package is used to produce analyses by assimilating observations every hour with 10-km horizontal grid spacing and a 60-member multiphysics ensemble. Four assimilation experiments are conducted using different sets of observations: CONV, consisting of conventional observations from NCEP’s prepBUFR files; AWS, combining CONV and dense automatic surface weather station networks (AWS), SATWND, combining AWS with satellite-derived winds, and RAD, including SATWND; and satellite radiances from different microwave and infrared sensors. The assimilation of observations with high temporal and spatial frequency generates an important impact on the PBL, primarily on the precipitable water content, that leads to the development of deep convection and heavy precipitation closer to the observed in this case study. The assimilation of radiance observations produces a better development of the convection mainly during the mature state of the MCS leading to an increase in the accumulated precipitation. Ensemble forecasts initialized from each experiment were also simulated to evaluate their skill to predict precipitation. The hourly assimilation of the observations in AWS, SATWND, and RAD helped to improve the precipitation forecast.
journal: Atmospheric Research
#layout: preprint, 3p, authoryear,review, 12pt
# layout: final,5p,times,twocolumn,authoryear
classoption: final,5p,times,twocolumn,authoryear
linenumbers: false
numbersections: true
address:
- code: UBA
address: Universidad de Buenos Aires, Facultad de Ciencias Exactas y Naturales, Departamento de Ciencias de la Atmosfera y los Oceanos. Buenos Aires, Argentina.
- code: CIMA
address: CONICET – Universidad de Buenos Aires. Centro de Investigaciones del Mar y la Atmosfera (CIMA). Buenos Aires, Argentina.
- code: CNRS
address: CNRS – IRD – CONICET – UBA. Instituto Franco-Argentino para el Estudio del Clima y sus Impactos (IRL 3351 IFAECI). Buenos Aires, Argentina.
- code: SMN
address: Servicio Meteorologico Nacional de Argentina.
- code: CONICET
address: CONICET (Consejo Nacional de Investigaciones Cientificas y Tecnicas).
- code: INPE
address: National Institute for Space Research, Brazil, Center for Weather Forecasting and Climate Studies.
- code: NCAR
address: National Center for Atmospheric Research, Boulder, Colorado.
- code: Illinois
address: Department of Atmospheric Sciences, University of Illinois Urbana–Champaign, Urbana, Illinois.
bibliography: "paperANA.bib,packages.bib,era.bib"
# csl: elsevier-harvard.csl
footnote:
- code: 1
text: Corresponding Author
keywords: Regional Data Assimilation, Surface Observations, Satellite Observations
header-includes:
# - \usepackage{gensymb}
# - \usepackage{subfig}
# - \usepackage[inline]{showlabels}
# - \usepackage{chngcntr}
# - \usepackage{natbib}
# - \usepackage{lineno}
- \usepackage[utf8]{inputenc}
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(
echo = FALSE,
cache = TRUE,
cache.extra = 42,
fig.path = "../figures/",
fig.retina = TRUE,
message = FALSE,
warning = FALSE,
collapse = TRUE,
comment = "#>",
dev = "png",
dpi = 300
)
library(mesoda)
library(metR)
library(tidyverse)
library(lubridate)
library(data.table)
library(here)
library(patchwork)
library(unglue)
library(knitr)
library(kableExtra)
library(tagger)
library(cowplot)
map_arg <- rnaturalearth::ne_states(country = c("argentina"),
returnclass = "sf")
map_limitrofes <- rnaturalearth::ne_countries(country = c("Brazil", "Chile", "Uruguay", "Paraguay", "Bolivia"), returnclass = "sf")
square <- fread(here("analysis/data/derived_data/sample_obs/dominio_square.csv"))
square2 <- fread(here("analysis/data/derived_data/sample_obs/dominio_square2.csv"))
coord <- fread(here("analysis/data/derived_data/sample_obs/coordenadas.csv"))
geom_mapa <- function(fill = NA) {
list(geom_sf(data = map_arg, fill = fill, color = "black", size = 0.1, inherit.aes = FALSE),
geom_sf(data = map_limitrofes, fill = fill, color = "black", size = 0.1, inherit.aes = FALSE),
coord_sf(ylim = c(-42, -19), xlim = c(-76, -51)),
scale_x_longitude(ticks = 5),
scale_y_latitude(ticks = 5))
}
arg_topo <- metR::GetTopography(-75+360, -50+360, -20, -60, resolution = 1/10,
file.dir = here("analysis/data/derived_data/"))
arg_topo[, lon := metR::ConvertLongitude(lon)]
cordillera <- list(
ggnewscale::new_scale_fill(),
geom_contour_fill(data = arg_topo, aes(x = lon, y = lat,
z = h),
breaks = seq(1500, 8000, by = 700)),
scale_fill_gradient(low = "#E2E6E6", high = "#7E7E7E", guide = "none",
oob = scales::squish))
scale_date <- function(ini = 20181120180000, end = 20181123120000,
break_bin = "6 hour", ...) {
scale_x_datetime(breaks = seq.POSIXt(ymd_hms(ini), ymd_hms(end), by = break_bin), ..., expand = c(0, 0),
labels = function(x) {
fifelse(hour(x) == 0, format(x, "%H UTC\n%b %d"), format(x, "%H"))
})
}
obs.type <- tribble(
~type, ~code,
120, "ADPUPA",
130, "AIRCFT-AIREP",
131, "AIRCFT-AMDAR",
133, "AIRCAR",
180, "SFCSHP",
181, "ADPSFC",
187, "ADPSFC\nno pressure",
220, "ADPUPA",
221, "ADPUPA-PIBAL",
230, "AIRCFT-AIREP",
231, "AIRCFT-AMDAR",
233, "AIRCAR",
280, "SFCSHP",
281, "ADPSFC",
287, "ADPSFC\nno pressure",
290, "ASCATW"
) %>%
setDT()
fisica <- data.table(mem = as.character(formatC(1:60, flag = "0", width = 3)),
fisica = rep(c("KF-YSU",
"BMJ-YSU",
"GF-YSU",
"KF-MYJ",
"BMJ-MYJ",
"GF-MYJ",
"KF-MYNN2",
"BMJ-MYNN2",
"GF-MYNN2"), length.out = 60)) %>% setDT()
multiespectrales <- c("airs_aqua",
"iasi_metop-a",
"iasi_metop-b")
colores_exp <- c(E2 = "#0077BB", E5 = "#88CCEE", E6 = "#EE7733", E9 = "#CC3311")
derived_data <- "/home/paola.corrales/datosmunin3/EXP/derived_data/"
```
# Introduction
Severe weather events cause significant human and economic losses around the world. A large number of these phenomena are associated with the occurrence of deep moist convection, including tornadoes, intense wind gusts, extreme precipitation in short time periods, large hail, and lightning.
Southern South America has one of the highest frequencies in the world of favorable conditions for high-impact meteorological events [@brooks2003] and large hail events [@cecil2012], particularly during austral spring and summer.
This is also confirmed by observational evidence and high impact weather reports [@matsudo2015; @rasmussen2014]. Recently, the Remote sensing of Electrification, Lightning, And Mesoscale/microscale Processes with Adaptive Ground Observations (RELAMPAGO) field campaign [@nesbitt2021] has been conducted to investigate the mechanisms for convective initiation and the occurrence of high-impact weather events associated with deep convection in central Argentina.
Forecasting mesoscale meteorological phenomena and particularly deep moist convection is a scientific and technological challenge due to its limited predictability and the difficulties in diagnosing the state of the atmosphere at small spatial and short temporal scales (for example from 1 to 10 kilometers and on the order of minutes). Mesoscale data assimilation (DA) is an approach that can provide appropriate initial conditions for high-resolution numerical forecasts [@sun2014] and thus has received increasing attention in the last decades.
For DA methods to be successful, observing networks with sufficient temporal and spatial resolution capable of capturing mesoscale variability should be used [@gustafsson2018]. Assimilating information on temperature, moisture, and wind in the planetary boundary layer (PBL) improves mesoscale model initialization, and several authors have reported the resultant beneficial impacts on the PBL structure and the location and timing of precipitating systems (e.g. @wheatley2010, @ha2014, @chang2017, @bae2022, @banos2021, @maejima2019, and @chen2016).
Particularly relevant for regional mesoscale DA systems in the region of interest is that South America is characterized by a limited number of conventional observations (i.e., radiosondes, surface weather stations) and operational networks that are not dense enough to capture mesoscale details. In this context, analyzing the potential impact of non-conventional sources of observations is essential to improve mesoscale numerical weather prediction (NWP) over South America using DA. There have been only a few published efforts on regional mesoscale DA, but they have all shown promising results [e.g. @dillon2016; @dillon2021; @goncalvesdegoncalves2015]. In particular, @dillon2021 assimilated high resolution surface weather station networks, GOES-16 satellite-derived winds, and satellite temperature and moisture retrievals over central Argentina with positive impacts. Similar to @gasperoni2018, @dillon2021 included private weather station networks which are not incorporated in the operational analysis. However, the impact of different observation types on the analysis quality has not been addressed.
The impact of non-conventional high spatial and temporal resolution observations, such as satellite-derived winds, has been investigated in the context of regional mesoscale DA. Many studies have focused on the impact of these observations on the prediction of tropical storms (e.g., @wu2014, @cherubini2006, and @sawada2019, and many others). Most of these studies reported an overall positive impact of the assimilation of satellite-derived winds for this type of storm. However, some works indicated mixed impacts (e.g. @sawada2019 reported an improvement in the forecast of the track of the storm but a degradation in the forecast intensity). As stated in \citet{zhao2021, zhao2021a}, the impact of assimilating these data on high impact weather events associated with mid-latitude deep convection over land has received relatively less attention. \citet{zhao2021, zhao2021a} assimilated GOES-16 satellite-derived winds into a storm-scale three-dimensional variational DA system during three high impact weather events. They reported positive impacts of satellite-derived winds on the characterization of the storm environment and improved short range precipitation forecasts. @otsuka2015 and @mallick2020 found a slight improvement in the short-range precipitation forecast due to the storm-scale assimilation of high frequency satellite-derived winds.
While the assimilation of radiance observations into global models is well established [@eyre2020], the direct assimilation of radiance data into regional models, however, still remains a challenge due to the sparse data coverage (in the case of polar-orbiting satellite observations), bias correction, and the relatively low model tops used for this application. @bao2015 studied the impact of assimilating cloud-cleared microwave and infrared radiance data polar orbiting instruments on temperature and humidity forecasts over the western USA and found a reduction in the temperature bias at low and mid-levels as a result of the microwave observations but an opposite effect for infrared data. More recently, @zhu2019 studied the impact of assimilating clear sky polar orbiting satellite radiance data within a frequently updated regional system and showed an improvement for all variables, in particular for relative humidity at upper levels. @wang2021 studied the impact of assimilating clear sky radiances in the high-resolution Copernicus European Regional Reanalysis. They reported that satellite radiance observations had a neutral impact on the analyses of geopotential height in the lower troposphere, while a slightly negative impact on the upper troposphere and the stratosphere. They also observed similar results for 3-h forecasts initialized from the analysis but a positive impact on 12 and 24 -h forecasts. Given these mixed results, there is still room to analyze the utility of assimilating radiance observations in a limited-area DA system over land. Moreover, to the best of our knowledge, there are no studies related to the direct assimilation of radiance observations over South America.
The main objective of this work is thus to contribute to the quantification and comparison of the impact of high resolution automatic weather stations, satellite-derived winds, and clear-sky satellite radiances, into a mesoscale, frequently-updated ensemble-based regional DA system. This is particularly important in the efforts to improve mesoscale numerical weather prediction (NWP) over South America where the conventional observation network is rather sparse and other sources of information could potentially fill certain gaps. In particular, this paper focuses on the impact in the context of a mid-latitude mesoscale convective system. To reach this goal, several DA experiments are conducted for a case study of a large Mesoscale Convective System (MCS) that developed over Southern South America during Nov 22-23, 2018 during the intense observation period (IOP) of the RELAMPAGO field campaign.
The paper is organized as follows. The DA system, the experimental design, and the observations used are presented in section 2. Results are discussed in section 3 and finally, conclusions are summarized in section 4.
# Data and Methods
## Case overview
Previously to the development of this case study, the center and north of Argentina was immersed in a warm and humid air mass with high values of convective available potential energy (CAPE), as shown by ERA 5 Reanalysis [@era5pressure] in Figure \@ref(fig:case)a. On Nov 22, 2018 a cold front crossed the center of Argentina (Figure \@ref(fig:case)b). This cold front triggered isolated convective cells that rapidly grew upscale into an exceptionally large MCS (Figure \@ref(fig:case)d,e). During that day several surface stations reported lightning, strong wind gusts, and heavy rain. To the north of the region, a warm and humid environment contributed to the development of isolated convection that ultimately grew and merged with the MCS (Figure \@ref(fig:case)f).
The MCS traveled approximately 2500 km from south to north, dissipating over Paraguay and Southern Brazil after 42 hours.
(ref:case) ERA5 Reanalysis of sea level pressure (hPa, black contours), 1000-500 hPa thickness (red dashed contours) and convective available potential energy (shaded) and GOES-16 channel 13 brightness temperature for a,d) 00 and b,e) 12 UTC Nov 22 and c,f) 00 UTC Nov 23.
```{r case, fig.cap="(ref:case)", fig.width=6, fig.height=4, fig.align="center", fig.env = "figure*"}
#fig.width=7, fig.height=3.5,
campos <- ReadNetCDF(here("analysis/data/derived_data/reanalysis/geopotential.nc")) %>%
dcast(time + longitude + latitude ~ level) %>%
.[order(time, -latitude, longitude)] %>%
.[, ":="(msl = ReadNetCDF(here("analysis/data/derived_data/reanalysis/pressure-pw.nc"), vars = "msl", out = "vector")[[1]],
cape = ReadNetCDF(here("analysis/data/derived_data/reanalysis/cape-pw.nc"), vars = "cape", out = "vector")[[1]])] %>%
setnames(c("longitude", "latitude"), c("lon", "lat")) %>%
.[time != ymd_h(2018112312)]
xlim <- c(2700, 3950)
ylim <- c(3800, 4950)
files <- Sys.glob(here("analysis/data/derived_data/goes16/*"))
goes <- map(files, function(f) {
nc <- ncdf4::nc_open(f)
meta <- unglue::unglue(basename(f), "OR_ABI-L1b-RadF-M3{channel}_G16_s{sdate}_e{edate}_c{cdate}.nc")
ReadNetCDF(f, vars = c(rad = "Rad", time = "t"),
subset = list(x = xlim, y = ylim)) %>%
.[, rad := calculate_rad(rad, nc)] %>%
.[, tb := rad_to_tb(rad, nc)] %>%
.[, time := as_datetime(time, origin = "2000-01-01 12:00:00")] %>%
.[, c("lon", "lat") := goes_projection(x, y, nc)] %>%
.[]
}) %>%
rbindlist() %>%
.[, time := floor_date(time, "hour")]
campos %>%
.[, source := "era5"] %>%
.[, time := factor(time)] %>%
.[, ":="(espesor = (`500`-`1000`)/100, time = factor(time))] %>%
ggplot(aes(lon, lat)) +
geom_contour_fill(aes(z = cape, fill = stat(level_d)), breaks = seq(500, 4000, 500)) +
scale_fill_distiller(super = ScaleDiscretised,
name = "CAPE",
# palette = "PRGn", direction = 1,
palette = "YlOrRd", direction = 1,
guide = guide_colorsteps(barwidth = 0.5, #mid = 25,
barheight = 8,
order = 2,
# title.position = "left",
# title.vjust = 1,
frame.colour = "black")) +
geom_contour2(aes(z = espesor, label = ..level..),
size = 0.2, color = "darkred", linetype = 2,
label_size = 2, label.placer = label_placer_n(n = 3)) +
geom_contour2(aes(z = msl/100, label = ..level..),
size = 0.4, color = "black", linetype = 1,
label_size = 2) +
cordillera +
scattermore::geom_scattermore(data = goes[, source := "goes"], aes(color = tb)) +
scale_color_topes(guide = guide_colorbar(barwidth = 0.5,
barheight = 8,
order = 99,
frame.colour = "black")) +
# guides(fill = guide_legend(" CAPE", order = 0),
# color = guide_legend("BT (ºC)", order = 2)) +
geom_mapa() +
coord_sf(ylim = c(-45, -22), xlim = c(-75, -52)) +
facet_grid(source ~ time, labeller = labeller(time = c("2018-11-22 00:00:00" = "00 UTC Nov 22",
"2018-11-22 12:00:00" = "12 UTC Nov 22",
"2018-11-23 00:00:00" = "00 UTC Nov 23"),
source = c("era5" = "ERA5",
"goes" = "GOES-16 Channel 13"))) +
tag_facets() +
labs(x = NULL, y = NULL, fill = "CAPE", color = "BT (ºC)") +
theme_minimal(base_size = 9) +
theme(tagger.panel.tag.background = element_rect(color = "white"))
```
## Data assimilation system configuration {#config}
The forecast model uses the non-hydrostatic Advanced Research version of Weather Research and Forecasting (WRF-ARW V3.9.1, @skamarock2008).
The horizontal grid spacing is 10 km (150 x 200 grid points) in the horizontal and 37 levels in the vertical with the top of the model at 50 hPa.
The initial and boundary conditions are provided by the Global Forecast System (GFS) analysis (0.25$^{\circ}$ horizontal grid spacing and 6-hour temporal resolution; @cisl_rda_ds084.1). In this case, a single nesting approach is used since the resolution gap between the driving model and the regional model is not too large (0.25$^{\circ}$ or 25 km approximately to 10 km). This approach is also based on recent studies which suggest that using multiple nested domains does not necessarily lead to improved precipitation forecasts in regional domains, particularly in areas of complex terrain (e.g. @liang2019, @beck2004). The domain covers the area indicated in Figure \@ref(fig:dominio) to capture the development of the MCS during the simulated period.
The analyses are generated using the LETKF implementation (V1.3, @hunt2007) of the Gridpoint Statistical Interpolation analysis system (GSI V3.8; @shao2016).
A rapid update cycle approach is implemented with hourly analysis and a centered assimilation window, meaning that all the observations within $\pm$ 30 minutes of the analysis time are assimilated.
Observations are assimilated in a 4D approach by comparing them with the corresponding first guess state at 10-minute intervals.
For radiance observations, the Community Radiative Transfer Model version 2.3 (CRTM; @han2006) is used as an observation operator to calculate model-simulated brightness temperatures.
A 60-member ensemble is used where the initial ensemble mean and the mean boundary conditions are taken from the GFS deterministic analysis. A set of 60 perturbations are randomly generated to perturb the initial state as well as the boundary conditions during the length of the experiment. Perturbing the boundary conditions helps to reduce the impact of errors in the driving global model and helps to keep a larger ensemble spread throughout the domain and during the length of the experiment [@ouaraini2015]. The perturbations are generated as scaled differences between two random atmospheric states obtained from the Climate Forecast System Reanalysis (CFSR) data with 0.5$^{\circ}$ horizontal grid spacing with a smooth time evolution as in @necker2020 and @maldonado2021. In this way, the nearly hydrostatic and geostrophic equilibrium of larger scales is preserved. The random perturbations used are the same across experiments to ensure that the differences between experiments are only related to changes in the number and type of assimilated observations.
A multi-physics scheme is used to better represent the uncertainty in the model formulation within the DA system. 9 different model configurations are generated consisting of the combination of 3 moist convection schemes (Kain–Fritsch [@kain2004], Grell–Freitas [@grell2013], and Betts–Miller–Janjic [@janjic1994]) and 3 planetary boundary layer schemes (Yonsei University Scheme [@hong2006], Mellor–Yamada–Janjic Scheme [@janjic1994], and Mellor–Yamada Nakanishi Niino [@nakanishi2009]). The distribution of these schemes among the 60 ensemble members is outlined in Table \@ref(tab:miembros-desc). The multi-physics approach is also introduced in order to represent the uncertainty associated with the more relevant physical processes that are not resolved by the model. All ensemble members use the same land-surface model (Noah-MP, @chen2001), microphysics (WRF single-moment 6–class scheme [@hong2006a]), and radiation processes (RRTMG shortwave and longwave scheme [@iacono2008]) parameterizations.
```{r miembros-desc}
fisica %>%
copy() %>%
.[, c("Cumulus", "PBL") := tstrsplit(fisica, split = "-")] %>%
.[, .(mem = paste(as.numeric(mem), collapse = ", ")), by = .(PBL, Cumulus)] %>%
dcast(Cumulus ~ PBL, value.var = "mem") %>%
kable(booktabs = TRUE, caption = "Generation of the 60-member multi-physics ensemble as a combination of Cumulus and PBL parameterizations.",
align = "cccc") %>%
add_header_above(c(" " = 1, PBL = 3)) %>%
kable_classic_2(full_width = FALSE) %>%
kable_styling(font_size = 6,
position = "center") %>%
# column_spec(1, width = "1em") %>%
column_spec(2:4, width = "7em")
```
To reduce the effect of spurious correlations in the estimation of error covariances, a horizontal localization radius of 180 km and a vertical localization radius of 0.4 (in log pressure coordinates) is used as in @dillon2021 for all types of observations.
A relaxation-to-prior spread inflation [@whitaker2012] is applied with an inflation parameter $\alpha=0.9$ following @maldonado2020 to mitigate the impact of sampling errors and to consider model errors not accounted for by the multi-model ensemble approach.
(ref:dominio) a) The domain used for the simulations (black box), the inner domain used for the experiment comparison (red box), the region shown in b) (light blue box), and the locations of Automatic Weather Stations (AWS, green squares) and Conventional Surface Weather Stations (CSWS, orange triangles). b) Locations of radiosonde launches during RELAMPAGO. Green dots correspond to radiosondes launched during IOP 7, orange triangles are radiosondes launched during IOP 8, and purple squares are radiosondes launched outside the IOP missions. The topography in meters is also shown (shaded).
```{r dominio, fig.cap="(ref:dominio)", out.width="98%", fig.width=5}
oficiales <- fread(here("analysis/data/derived_data/sample_obs/E2_asim_conv_20181121120000.ensmean"),
na.strings = c("0.100E+11", "-0.100E+06", "-99999.90", "-100000.00")) %>%
.[, c("V2", "V4") := NULL] %>%
setnames(colnames(.), c("var", "stationID", "type", "dhr", "lat", "lon", "pressure", "usage.flag", "flag", "obs", "obs.guess", "obs2", "obs.guess2", "rerr")) %>%
.[type %in% c(181, 281)] %>% unique(by = c("stationID")) %>%
.[!str_detect(stationID, pattern = "[A-Z]")] %>%
.[, source := "Sfc - Official"]
no_oficiales <- fread(here("analysis/data/derived_data/sample_obs/E5_asim_conv_20181121120000.ensmean"),
na.strings = c("0.100E+11", "-0.100E+06", "-99999.90", "-100000.00")) %>%
.[, c("V2", "V4") := NULL] %>%
setnames(colnames(.), c("var", "stationID", "type", "dhr", "lat", "lon", "pressure", "usage.flag", "flag", "obs", "obs.guess", "obs2", "obs.guess2", "rerr")) %>%
.[type %in% c(181, 187)] %>%
.[!str_detect(stationID, "SMN")] %>%
.[!str_detect(stationID, "^SC")] %>%
.[!(stationID %in% oficiales$stationID)] %>%
unique(by = c("stationID")) %>%
.[, source := "Sfc - Non-official"]
obs <- rbind(no_oficiales, oficiales)
lista_sondeos <- fread(here("analysis/data/derived_data/sample_obs/lista_sondeos.csv")) %>%
.[, periodo := fcase(nominal_launch_time %between% c(ymd_hms("20181121150000"), ymd_hms("20181121210000")), "IOP 7",
nominal_launch_time %between% c(ymd_hms("20181122140000"), ymd_hms("20181122200000")), "IOP 8",
default = "Others")
]
dominio <- fread(here("analysis/data/derived_data/sample_obs/dominio_hgt.csv")) %>%
.[, c("x", "y") := wrf_project(lon, lat)]
g1 <- dominio %>%
ggplot(aes(x, y)) +
geom_contour_fill(aes(z = hgt), proj = norargentina_lambert,
breaks = seq(0, 6000, 500)) +
scale_fill_gradient(low = "#f2f2f2", high = "#333333",
name = NULL,
breaks = seq(0, 6000, 1000),
guide = NULL) +
geom_mapa() +
geom_point(data = obs, aes(ConvertLongitude(lon), lat,
color = source, shape = source),
size = 1, alpha = 0.8) +
geom_rect(aes(xmin = -66.5, xmax = -61.5, ymin = -35.5, ymax = -29),
color = "#40BDEC", alpha = 0) +
scale_shape_manual(name = NULL,
breaks = c("Sfc - Non-official", "Sfc - Official"),
labels = c("AWS","CSWS"), values = c(15, 17),
guide = guide_legend(override.aes = list(size = 2))) +
scale_color_manual(name = NULL,
values = c("Sfc - Non-official" = "#00695c",
"Sfc - Official" = "#FD8002"),
breaks = c("Sfc - Non-official", "Sfc - Official"),
labels = c("AWS","CSWS"),
guide = guide_legend(override.aes = list(size = 2))) +
geom_point(data = square, aes(lon, lat), size = 0.2) +
geom_point(data = square2, aes(lon, lat), size = 0.2, color = "#CC3311") +
theme_minimal(base_size = 10) +
theme(legend.box = "horizontal",
legend.position = c(0.15, 0.95),
legend.background = element_rect(fill = "white", color = "white"))
temp <- dominio %>%
ggplot(aes(x, y)) +
geom_contour_fill(aes(z = hgt), proj = norargentina_lambert,
breaks = seq(0, 6000, 500)) +
scale_fill_gradient(low = "#f2f2f2", high = "#333333",
name = "Altitude (m)",
breaks = seq(0, 6000, 1000),
guide = guide_colorstrip(barwidth = 18,
barheight = 0.5)) +
geom_mapa() +
coord_sf(ylim = c(-35.5, -29), xlim = c(-66.5, -61.5)) +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")
legend <- get_legend(temp)
g2 <- dominio %>%
ggplot(aes(x, y)) +
geom_contour_fill(aes(z = hgt), proj = norargentina_lambert,
breaks = seq(0, 6000, 500)) +
scale_fill_gradient(low = "#f2f2f2", high = "#333333",
name = NULL,
breaks = seq(0, 6000, 1000),
guide = NULL) +
geom_mapa() +
coord_sf(ylim = c(-35.5, -29), xlim = c(-66.5, -61.5)) +
geom_jitter(data = lista_sondeos, aes(lon, lat,
color = periodo,
shape = periodo),
alpha = 0.5, size = 1.5, width = 0.03, height = 0.03) +
scale_color_brewer(palette = "Dark2",
guide = guide_legend(override.aes = list(size = 2,
alpha = 1))) +
labs(color = NULL, shape = NULL) +
theme_minimal(base_size = 11) +
theme(legend.box = "horizontal",
legend.position = c(0, 1),
legend.background = element_rect(fill = "white", color = "white"))
ggdraw(plot_grid(plot_grid(g1, g2, ncol = 2, rel_widths = c(1, 0.5),
labels = c("a)", "b)"), label_size = 11), legend,
ncol = 1, rel_heights = c(1, 0.08)))
```
## Observations
### Conventional
The conventional observations used are part of the Global Data Assimilation System (GDAS) data stream. Conventional observations included in the Binary Universal Form for Representation of Meteorological Data (PREPBUFR) files generated at the National Centers for Environmental Prediction (NCEP) are assimilated. These consist of surface observations from 117 Conventional Surface Weather Stations (CSWS), ships, and upper-air observations from 13 radiosondes sites and aircraft. The orange triangles in Figure \@ref(fig:dominio)a indicate the location of the surface stations included in this experiment. The frequency of these observations varied between 1 hour for surface stations and 12/24 hours for radiosondes. Wind surface observations over oceans (ASCATW) come from scatterometers and are also included in the PREPBUFR files.
Table \@ref(tab:table-obs) lists all the observation types (i.e., surface pressure, temperature, specific humidity, and wind) available for each source, together with their associated errors. The observation errors were specified following the GSI default configuration. In some cases, the error varies with height and depends on the specific platform (aircraft and satellite-derived wind). In terms of quality control, a gross check was performed by the observation operator by comparing the innovation (the difference between the observation and the model-simulated observation based on the first-guess) with a predefined threshold that depends on the observation error (also included in Table \@ref(tab:table-obs)).
### AWS networks
Data from 866 Automatic Weather Stations (AWS) that are part of 17 public and private surface networks over Southern South America are also assimilated. The dataset used in this study has been obtained from the RELAMPAGO Data Set repository [@garcia2019]. These stations are indicated as green squares in Figure \@ref(fig:dominio)a. They have higher spatial coverage than the CSWS and a sampling frequency of 10 minutes in most cases. All stations measure temperature, but only 395 stations provide humidity, 422 provide pressure, and 605 provide wind information.
Observation errors used to assimilate these observations are the same as for the CSWS (see Table \@ref(tab:table-obs)).
### Satellite-derived winds
Satellite-derived wind observations are also included in the PREPBUFR files available every 6 h, and consist of estimations from GOES-16 (using the visible, infrared, and water vapor channels) and METEOSAT 8 and 11 (using the visible and water vapor channels). Due to the domain covered by each of these satellites, GOES-16 is the primary source of satellite-derived winds (99 % of the observations). Observation errors used to assimilate these observations follow the GSI default configuration and are indicated in Table \@ref(tab:table-obs).
```{r table-obs}
fread(here("analysis/data/derived_data/tables/table1.csv")) %>%
kbl(caption = "Characteristics of the assimilated observations: The code for each observation type and its source, the available variables, the observation error, and the gross check thresholds used.",
col.names = c("Code", "Platform", "Variable", "Error", "Gross check"),
booktabs = TRUE,
escape = FALSE) %>%
kable_classic_2(full_width = FALSE) %>%
kable_styling(font_size = 6,
position = "center") %>%
column_spec(1, width = "3.5em") %>%
column_spec(2, width = "4.5em") %>%
column_spec(3, width = "5em") %>%
column_spec(4:5, width = "7em") %>%
collapse_rows(columns = 1:2, valign = "middle", latex_hline = "major") %>%
footnote(symbol = c("Observation error varied with height.",
"Observations above 600 hPa are rejected.",
"Observation error depends on the report type."),
symbol_manual = c("*", "**", "+"))
```
### Satellite radiances {#sat}
Satellite radiances available through the GDAS data stream, consisting of infrared and microwave observations, are used in this study. This includes the Advanced Microwave Sounding Unit - A (AMSU-A), Microwave Humidity Sounder (MHS), and 2 multispectral sensors; the Atmospheric Infrared Sounder (AIRS) and the Infrared Atmospheric Sounding Interferometer (IASI) over several satellite platforms (see Table \@ref(tab:table-rad)). Since the regional domain is located in the mid-latitudes and the satellite platforms of interest are on polar orbits, each sensor scans the area only twice a day with a spatial coverage depending on the satellite swath. For this reason, the number of satellite observations varied significantly among cycles. In particular, the multispectral sensors provided between 100 and 1000 observations for every scan every 12 hours, contributing 88 % of the total amount of assimilated radiances in our experiment. The vertical location of each radiance observation was estimated as the model level at which its weighting function was maximized as calculated by CRTM. The multispectral sensors have good vertical coverage and are able to sense from the lower troposphere up to the lower stratosphere.
The channels adopted for assimilation and their associated errors were defined taking into account the low model top (50 hPa). The data preprocessing, which is an essential step in the assimilation of radiances, was performed within the GSI system for each sensor specifically. First, a spatial data thinning is applied using a 60 km grid following @singh2016, @jones2013, and @lin2017a, where the observations to be assimilated are chosen based on their distance to the model grid points, the observation quality (based on available data quality information), and the number of available channels (from the same pixel and sensor) that passed the quality control. Also, observations over the sea are preferred to those over land or snow [@hu2018].
The thinned observations were then bias corrected. The bias correction (BC) has an air-mass dependent and an angle-dependent component [@zhu2014] and it is calculated as a multi-linear function of N predictors $p_i(x)$, with associated coefficients $\beta_i$. Then, the bias corrected brightness temperature ($BT_{bc}$) can be obtained as:
\begin{equation}
\mathrm{\mathit{BT_{bc}} =\mathit{ BT} + \sum_{i = 0}^{N} \beta_i p_i (x)}
(\#eq:eq1)
\end{equation}
GSI has a constant offset bias correction term ($p_0 = 1$) and the remaining predictors are the cloud liquid water content (CLW), the temperature lapse rate at the pressure of maximum weight, the square of the temperature lapse rate at the pressure of maximum weight, and the emissivity sensitivity. Scan angle-dependent bias is modeled as a 4th-order polynomial [@zhu2014].
In the GSI system, the $\beta_i$ coefficients are trained using a variational estimation method which solves the $\beta_i$ that provides the best fit between the simulation and the observations. The coefficients were initialized at 18 UTC Nov 18, 2018 with the GFS system coefficients. The assimilation system was configured to use a constant background error variance of 0.01 to avoid large adjustments in the estimated coefficients at each time.
In our experiments, only clear-sky observations are used. For microwave radiances, observations potentially contaminated by clouds are detected using the scattering and Liquid Water Path (LWP) indexes [@weston2019; @zhu2016]. For the infrared channels, cloud contaminated observations are detected using the transmittance profile calculated within the CRTM algorithms. Moreover, GSI checks the difference between the observations and simulated brightness temperature with height to detect cloudy pixels. Additionally, the GSI quality control for infrared sensors looks for observations over water with a large zenith angle (over 60°) to reject channels near the visible range that can be contaminated with reflection. It also performs an emissivity check for observations over land for both infrared and microwave radiances.
```{r table-rad}
fread(here("analysis/data/derived_data/tables/tabla_radianzas.csv")) %>%
.[, ":="(sensor = toupper(sensor),
plataforma = toupper(plataforma),
prop = paste0(prop, " ", "%"))] %>%
.[order(.[,'sensor']), ] %>%
.[] %>%
kbl(booktabs = TRUE,
escape = TRUE,
col.names = linebreak(c("Sensor", "Platform", "Assimilated channels", "Percentage over total")),
caption = "List of the available sensors over several platforms, the number of accepted channels for the assimilation, and the percentage of assimilated observations calculated over all radiance observations and all cycles.") %>%
kable_styling(font_size = 7) %>%
collapse_rows(1, valign = "top") %>%
kable_classic_2(full_width = TRUE)
```
(ref:obs-horizontal) Horizontal spatial distribution of the mean available observations per analysis cycle for the a) CONV, b) AWS, c) SATWND, and d) RAD experiments calculated over 2.5$^{\circ}$ boxes.
```{r obs-horizontal, fig.cap="(ref:obs-horizontal)", out.width="100%", fig.height=7}
satinfo <- fread(here("analysis/data/derived_data/sample_obs/satinfo.txt")) %>%
setnames(c("!sensor/instr/sat", "chan"), c("sensor", "channel"))
files <- Sys.glob(here("analysis/data/derived_data/omb_diagfiles/E2/asim*ensmean"))
conv <- read_diag_conv(files, exp = "E2", member = "000")
conv[, bufr_code := fcase(type %in% c(181, 187, 281, 287), "ADPSFC",
type %in% c(120, 220, 221), "ADPUPA",
type %in% c(130, 131, 133, 230, 231, 233), "AIRCFT",
type %in% c(290), "ASCATW",
type %in% c(180, 280, 183, 283, 184, 284), "SFCSHP",
type %in% c(240:260), "SATWND")] %>%
.[, ":="(lon.box = cut_round(lon, breaks = seq(284, 309, 2.5)),
lat.box = cut_round(lat, breaks = seq(-42, -17, 2.5)))]
files <- Sys.glob(here("analysis/data/derived_data/omb_diagfiles/E5/asim*ensmean"))
aut <- read_diag_conv(files, exp = "E5", member = "000")
aut[, bufr_code := fcase(type %in% c(181, 187, 281, 287), "ADPSFC",
type %in% c(120, 220, 221), "ADPUPA",
type %in% c(130, 131, 133, 230, 231, 233), "AIRCFT",
type %in% c(290), "ASCATW",
type %in% c(180, 280, 183, 283, 184, 284), "SFCSHP",
type %in% c(240:260), "SATWND")] %>%
.[, ":="(lon.box = cut_round(lon, breaks = seq(284, 309, 2.5)),
lat.box = cut_round(lat, breaks = seq(-42, -17, 2.5)))]
files <- Sys.glob(here("analysis/data/derived_data/omb_diagfiles/E6/asim*ensmean"))
satwnd <- read_diag_conv(files, exp = "E6", member = "000")
satwnd[, bufr_code := fcase(type %in% c(181, 187, 281, 287), "ADPSFC",
type %in% c(120, 220, 221), "ADPUPA",
type %in% c(130, 131, 133, 230, 231, 233), "AIRCFT",
type %in% c(290), "ASCATW",
type %in% c(180, 280, 183, 283, 184, 284), "SFCSHP",
type %in% c(240:260), "SATWND")] %>%
.[, ":="(lon.box = cut_round(lon, breaks = seq(284, 309, 2.5)),
lat.box = cut_round(lat, breaks = seq(-42, -17, 2.5)))]
files <- Sys.glob(here("analysis/data/derived_data/omb_diagfiles/E9/asim*ensmean"))
files <- files[!str_detect(files, "conv")]
rad <- read_diag_rad(files, "E9") %>%
satinfo[., on = c("sensor", "channel")] %>%
.[, ":="(lon.box = cut_round(lon, breaks = seq(284, 309, 2.5)),
lat.box = cut_round(lat, breaks = seq(-42, -17, 2.5)))]
files <- Sys.glob(here("analysis/data/derived_data/omb_diagfiles/E9/asim*ensmean"))
files <- files[str_detect(files, "conv")]
rad_conv <- read_diag_conv(files, exp = "E9", member = "000")
rad_conv[, bufr_code := fcase(type %in% c(181, 187, 281, 287), "ADPSFC",
type %in% c(120, 220, 221), "ADPUPA",
type %in% c(130, 131, 133, 230, 231, 233), "AIRCFT",
type %in% c(290), "ASCATW",
type %in% c(180, 280, 183, 283, 184, 284), "SFCSHP",
type %in% c(240:260), "SATWND")] %>%
.[, ":="(lon.box = cut_round(lon, breaks = seq(284, 309, 2.5)),
lat.box = cut_round(lat, breaks = seq(-42, -17, 2.5)))]
rad <- rad[, .(press, iuse, error, exp, date, lon.box, lat.box)] %>%
setnames(c("press", "iuse", "error"), c("pressure", "usage.flag", "rerr"))
rbind(conv, aut, satwnd, rad_conv) %>%
.[, .(pressure, usage.flag, rerr, exp, date, lon.box, lat.box)] %>%
rbind(., rad) %>%
.[usage.flag == 1 & rerr != 1.0e+10] %>%
.[, .(count_obs = .N), by = .(exp, lon.box, lat.box, date)] %>%
.[, .(obs_cycle = mean(count_obs, na.rm = TRUE)), by = .(exp, lon.box, lat.box)] %>%
ggplot(aes(ConvertLongitude(lon.box), lat.box)) +
geom_raster(aes(fill = obs_cycle), alpha = 0.8) +
scale_fill_viridis_c(option = "D", trans = scales::log10_trans(),
guide = guide_colorbar(barwidth = 18,
barheight = 0.5,
title.position = "left",
title.vjust = 1,
frame.colour = "black")) +
geom_mapa() +
facet_wrap(~exp, labeller = labeller(exp = c(E2 = "CONV", E5 = "AWS",
E6 = "SATWND", E9 = "RAD"))) +
tagger::tag_facets() +
labs(fill = "Mean number of\nobs per cycle") +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
tagger.panel.tag.text = element_text(size = 14),
plot.margin = unit(c(0, 0, 0, 0), "cm"))
```
(ref:obs-cycle) a) Number of assimilated observations per cycle and b) time averaged number of assimilated observations per cycle divided into 50 hPa-depth vertical layers for the CONV (blue squares and line), AWS (light blue dots and line), SATWND (orange triangles and line) and RAD (red diamonds and line) experiments.
```{r obs-cycle, fig.cap="(ref:obs-cycle)", fig.env="figure*", fig.height=3.5, fig.width=7}
rbind(conv, aut, satwnd, rad_conv) %>%
.[, .(pressure, usage.flag, rerr, exp, date, lon.box, lat.box)] %>%
rbind(., rad) %>%
.[usage.flag == 1 & rerr != 1.0e+10] %>%
.[, .(count_obs = .N), by = .(exp, date)] %>%
ggplot(aes(date, count_obs)) +
geom_line(aes(color = exp), size = 0.2) +
geom_point(aes(color = exp, shape = exp), size = 1) +
scale_color_manual(values = colores_exp,
labels = c(E2 = "CONV", E5 = "AWS",
E6 = "SATWND", E9 = "RAD")) +
scale_shape_manual(values = c(15, 16, 17, 18), labels = c(E2 = "CONV", E5 = "AWS",
E6 = "SATWND", E9 = "RAD")) +
scale_y_log10() +
scale_date() +
labs(y = "Number of obs per cycle", x = "Hour (UTC)",
color = NULL, shape = NULL) +
theme_minimal(base_size = 10) +
theme(legend.position = "bottom",
panel.background = element_rect(fill = "#fbfbfb", color = NA),
plot.margin = unit(c(0, 0, 0, 0), "cm")) +
rbind(conv, aut, satwnd, rad_conv) %>%
.[, .(pressure, usage.flag, rerr, exp, date, lon.box, lat.box)] %>%
rbind(., rad) %>%
.[usage.flag == 1 & rerr != 1.0e+10] %>%
.[, ":="(lev.box = cut_round(pressure, breaks = seq(50, 1050, 50)))] %>%
.[, .(count_obs = .N), by = .(exp, lev.box, date)] %>%
.[, .(obs_cycle = mean(count_obs, na.rm = TRUE)), by = .(exp, lev.box)] %>%
ggplot(aes(lev.box, obs_cycle)) +
geom_line(aes(color = exp), size = 0.2) +
geom_point(aes(color = exp, shape = exp), size = 1) +
scale_color_manual(values = colores_exp,
labels = c(E2 = "CONV", E5 = "AWS",
E6 = "SATWND", E9 = "RAD")) +
scale_shape_manual(values = c(15, 16, 17, 18), labels = c(E2 = "CONV", E5 = "AWS",
E6 = "SATWND", E9 = "RAD")) +
scale_y_log10() +
scale_x_reverse() +
coord_flip() +
labs(color = NULL, shape = NULL,
x = "Pressure level (hPa)", y = "Mean number of\nobs per cycle") +
theme_minimal(base_size = 10) +
theme(legend.position = "bottom",
plot.margin = unit(c(0, 0, 0, 0), "cm")) +
plot_layout(ncol = 2, widths = c(4, 1), guides = "collect") +
plot_annotation(tag_levels = 'a', tag_suffix = ")") &
theme(plot.tag = element_text(size = 8),
legend.position = "bottom",
legend.margin = unit(c(0, 0, 0, 0), "cm"),
panel.background = element_rect(fill = "#fbfbfb", color = NA),
plot.margin = unit(c(0, 0, 0, 0), "cm"))
```
### Validation dataset
To evaluate the performance of the ensemble-based DA system presented in this article, the following observational datasets were used:
* ERA5 hourly data on pressure levels from 1959 to present [@era5pressure]. The variables of interest (air temperature, humidity and wind) were interpolated to the model grid to compare them with the analysis of each experiment.
* The Multi-Network Composite Highest Resolution Radiosonde Data [@sondeos] from the RELAMPAGO field campaign database consisting of high-resolution radiosondes launched from several locations during the IOPs along with the operational radiosondes. Only the soundings that did not enter the assimilation system were used for validation. The experiment period covers IOP missions 7 and 8, during which 74 radiosondes were launched in a small area near the center of the experimental domain (Figure \@ref(fig:dominio)b).
* The Satellite precipitation estimation IMERG Final Run with 0.1$^{\circ}$ spatial resolution and 30 minutes temporal resolution [@huffman2018] was used as a reference state to validate the skill of 1-hour forecasts to represent the precipitation over the domain.
* Radar observations are used to perform a qualitative and visual assessment of the convective features. The data comes from 9 radars located in the domain and is provided by the Argentine C-band Doppler dual-polarization weather radar network [@deelia2017] with a temporal frequency of 10 minutes. For this work, only the maximum reflectivity in the column (COLMAX) closest to the analysis time was used.
## Experimental design {#exp}
To investigate the impact of different observations upon the analysis, four DA experiments were performed using different observation sets (Table \@ref(tab:table-exp)). The CONV experiment uses only conventional observations from PREPBUFR. In a second experiment, referred to as AWS, all the observations included in CONV are assimilated plus the 10-minute frequency surface observations from AWS. In the third experiment, referred to as SATWND, the observations from the AWS experiment along with the satellite-derived winds are assimilated. Finally, a fourth experiment referred to as RAD assimilates all available clear-sky radiances from sensors onboard polar orbiting satellites as described in section \@ref(sat).
```{r table-exp}
tribble(
~obs_type, ~conv, ~aut, ~satwnd, ~rad,
"Conventional (PREPBUFR)", "x", "x", "x", "x",
"Conventional (AWS)", " ", "x", "x", "x",
"Satellite-derived winds", " ", " ", "x", "x",
"Radiances", " ", " ", " ", "x",
) %>%
kbl(booktabs = TRUE, col.names = c("Obs type", "CONV", "AWS", "SATWND", "RAD"),
align = "lcccc",
caption = "Observation types assimilated in each experiment.",
escape = FALSE) %>%
kable_classic_2(full_width = TRUE) %>%
column_spec(1, width = "8em") %>%
column_spec(2:3, width = "2.5em", latex_valign = "m") %>%
column_spec(4:5, width = "3em", latex_valign = "m")
```
The horizontal distribution of the average number of assimilated observations per cycle in each experiment is shown in Figure \@ref(fig:obs-horizontal). The larger number of assimilated observations over the center and east of the domain corresponds to the AWS observations. In Figure \@ref(fig:obs-cycle)a the number of assimilated observations over time is shown. Local maxima at 12 and 00 UTC found mainly in CONV are attributed to operational soundings. The strong variability in the number of radiance observations per cycle is also noticeable and depends on the satellite coverage. The maxima at 13-14 and 01-02 UTC in RAD correspond to the contribution of the multispectral sensors. The vertical distribution of the mean number of observations per cycle (Figure \@ref(fig:obs-cycle)b) shows a maximum in low levels due to the AWS observations. Satellite-derived winds are maximized at the upper troposphere (between 500-250 hPa). Above 850 hPa, most of the observations correspond to radiance observations.
All the assimilation experiments start at 18 UTC Nov 20, 2018 and continue until 12 UTC Nov, 23 (totaling 67 hours/assimilation cycles). The initial 60-member ensemble is generated as explained in section \@ref(config) from a spin-up run without assimilating observations performed between 12 UTC and 18 UTC Nov, 20 (Figure \@ref(fig:cycle)).
Ensemble forecasts initialized from the different analysis experiments at 00 and 06 UTC Nov 22 were performed to evaluate the impact of the different observing networks on short range precipitation forecasts. Both forecasts are integrated until 12 UTC Nov 23. All forecasts use the same domain and ensemble configuration as the analysis. The boundary conditions for the ensemble members are generated by adding random perturbations to the GFS deterministic forecast (0.25$^{\circ}$ horizontal grid spacing and 6-hour temporal resolution; @cisl_rda_ds084.1).
(ref:cycle) Diagram of the analysis cycles between 18 UTC Nov 20, and 12 UTC Nov 23 plus spin up period of 6 hours. The zoomed section shows the hourly assimilation that is performed within a one-hour centered window and new boundary conditions from GFS every 6 hours. The two IOP missions from the RELAMPAGO field campaign and the ensemble forecast initialized at 00 and 06 UTC Nov 22 are shown.
```{r cycle, fig.cap="(ref:cycle)", out.width="100%"}
knitr::include_graphics(here("analysis", "figures", "analysis_cycle.png"))
```
## Verification methods
A set of metrics are selected to evaluate different aspects of the analysis obtained in the experiments conducted in this paper. These aspects include a validation of how the uncertainty is quantified in the first-guess and in the analysis, and how different experiments fit an independent set of observations that are not assimilated.
To evaluate the statistical consistency of the uncertainty quantification in the ensemble system the Reduced Centered Random Variable (RCRV, @candille2007) is used which is defined as:
\begin{equation}
\mathrm{RCRV = \frac{m - x_o}{\sqrt{\sigma_o^2 + \sigma^2}}}
(\#eq:eq2)
\end{equation}
where $x_o$ is the assimilated observation and its error $\sigma_o$, the ensemble mean of the analysis in observational space $m$, and the standard deviation $\sigma$ of the ensemble. The $RCRV$ is the ratio of the distance between the observations and the forecast and its expected standard deviation assuming the statistical independence between the forecast error (estimated from the ensemble spread) and the observation error. The average of $RCRV$ computed over all the analysis cycles represents the bias of the ensemble mean with respect to the observations normalized by the estimated uncertainty:
\begin{equation}
\mathrm{\mathit{mean RCRV} = E[RCRV]}
(\#eq:eq3)
\end{equation}
If the ensemble has a positive bias, $mean RCRV$ will be positive, on the opposite, if the ensemble has a negative bias, $mean RCRV$ will be negative. The standard deviation of the $RCRV$ or $sd RCRV$ is defined as:
\begin{equation}
\mathrm{\mathit{sd RCRV} = \sqrt{\frac{1}{M -1}\sum_{i=1}^{M}(\mathit{RCRV_i} - \mathit{mean RCRV})^2}}
(\#eq:eq4)
\end{equation}
where $M$ is the ensemble size. The $sd RCRV$ measures how large is the distance between the forecast and the observations with respect to the expected distance (given by the combination of the ensemble spread and the observation error). Assuming that the observation error is accurately estimated, an $sd RCRV > 1$ indicates that the ensemble is underdispersive (i.e. the distance between the observations and the forecasts is larger than expected), and an $sd RCRV < 1$ indicates that the ensemble is overdispersive (i.e. the distance between the observations and the forecasts is lower than expected). A consistent system will have no bias ($mean RCRV = 0$) and a standard deviation equal to 1 ($sd RCRV = 1$).
The fit of the first-guess and analysis to a set of independent observations, the high-resolution radiosondes from RELAMPAGO, is computed based on the Root Mean Square Error (RMSE) and the BIAS:
\begin{equation}
\mathrm{\mathit{RMSE} = \sqrt{\frac{1}{N}\sum_{i = 1}^{N} (X_i - O_i)^{2}}}
(\#eq:eq5)
\end{equation}
\begin{equation}
\mathrm{\mathit{BIAS} = \frac{1}{N}\sum_{i = 1}^{N} (X_i - O_i)}
(\#eq:eq6)
\end{equation}
where $O$ and $X$ stand for independent observations and the simulations respectively, and N is the sample size.
For the comparison of the first-guess precipitation with the IMERG precipitation estimates, the Fractions Skill Score (FSS, @roberts2008) is computed for different neighborhood length scales and thresholds:
\begin{equation}
\mathrm{\mathit{FSS} = 1-\frac{\sum_{i=1}^{N} ({P_x}_i-{P_o}_i)^{2}}{\sum_{i=1}^{N} ({P_x}_i)^{2}+\sum_{i=1}^{N} ({P_o}_i)^{2}}}
(\#eq:eq7)
\end{equation}
where $P_{oi}$ is the fraction of grid points in the $i-th$ sampling area in which the observed accumulated precipitation is greater than a specified threshold. Following @roberts2020, $P_{xi}$ is calculated from the ensemble probability precipitation over the same threshold in each grid point by averaging over the $i-th$ sampling area.
The FSS was computed from the accumulated precipitation over 6 hr rolling windows by adding the 1-hr accumulated precipitation forecasts over 6 consecutive assimilation cycles.
## Computation procedures
All the experiments were performed at the National Center for Atmospheric Research (NCAR) supercomputer Cheyenne [@Cheyenne2019]. All the analyses in this paper were conducted using the R programming language [@rcoreteam2020], using data.table [@dowle2020] and metR [@campitelli2020] packages.
All graphics are made using ggplot2 [@wickham2009] and the paper was rendered using knitr and rmarkdown [@xie2015; @allaire2019].
# Results
## Ensemble consistency
To investigate the ability of the first-guess ensemble mean to fit the observations taking into account the uncertainties of the forecast and the observations, the $mean RCRV$ and the $sd RCRV$ is calculated for the RAD experiment. As this experiment assimilates all types of observations used in this work, it is possible to analyze the consistency of the ensemble by comparing it with each type of observation. Figure \@ref(fig:rcrv-sfc) shows the $sd RCRV$ for surface observations box-averaged to a 2.5° grid. The $sd RCRV$ for wind observations (Figure \@ref(fig:rcrv-sfc)a) is close to 1 suggesting a good agreement between the ensemble spread, the forecast error, and the observation error. For the temperature (Figure \@ref(fig:rcrv-sfc)b), the results are similar except that for some areas in the west of the domain the $sd RCRV$ can be as high as 4.5. These higher values of $sdRCRV$ can be associated with systematic errors arising from high differences between the model surface and the observations. Small scale circulations associated with the complex terrain and not well resolved by the model can also contribute to increase the distance between the forecast and the observations. These aspects are usually not captured by the ensemble spread unless a well tuned space dependent inflation scheme is used thus leading to greater sdRCRV values.
Figure \@ref(fig:rcrv-profile) shows the mean and standard deviation of the RCRV for the upper-air observations. Figures \@ref(fig:rcrv-profile)a-b show the RCRV statistics for soundings (ADPUPA) and aircraft (AIRCAR and AIRCFT). Both ADPUPA and AIRCFT show a generally good agreement between the ensemble spread and the observation error. As sounding observations and their associated errors are known to be reliable, this result indicates that the ensemble has an appropriate spread. AIRCAR presents an irregular profile with $sd RCRV$ values that suggest that the error for this type of observation is overestimated. ADPUPA and AIRCAR present a $mean RCRV$ profile near zero at middle and upper levels. At low levels, the meanRCRV profile is positive, showing a cold bias present in the model, a characteristic already studied in @ruiz2010 and @dillon2021.
Satellite-derived winds observations vary in number depending on the satellite and the level. In Figure \@ref(fig:rcrv-profile)c only the $RCRV$ calculated with at least 100 observations for each satellite and level is included. At low levels, where there are not many observations available, the profiles of $mean RCRV$ and $sd RCRV$ show a larger departure from the expected behavior with a negative bias, and a possible overestimation of the observation error. Wind estimations derived from water vapor channels are abundant above 500 hPa where their bias is close to zero. The only exception are the EUMETSAT observations which contribute very little in the region.
The mean RCRV profiles calculated from the radiance observations (Figure \@ref(fig:rcrv-profile)d) show almost no bias and the same happens if the $mean RCRV$ is calculated over each channel of each sensor (not shown). This indicates that the bias correction algorithm works as expected. The $sd RCRV$ values are less than 1 for all sensors possibly due to an overestimation of the observation errors to reduce the influence of potentially erroneous observations.
Overall, these results indicate that the ensemble spread is consistent with the short-range forecast error and that systematic errors are relatively small for most of the observation types used in this work. Moreover, these results suggest the relaxation-to-prior spread inflation parameter $\alpha = 0.9$ is adequate for the system.
(ref:rcrv-sfc) First guess $sd RCRV$ calculated for surface observations (from PREPBUFR and AWS) of a) wind, and b) temperature averaged over 2.5º boxes for the RAD experiment. Observations were aggregated every hourly cycle for the entire experiment period.
```{r rcrv-sfc, fig.cap="(ref:rcrv-sfc)", out.width="100%", fig.height=4}
rbind(fread(here("analysis/data/derived_data/RCRV/rcrv_V_box.csv")),
fread(here("analysis/data/derived_data/RCRV/rcrv_t_box.csv"))) %>%
.[, type.obs := type] %>%
.[, type.obs := fcase(type.obs == 181, 281,
type.obs == 187, 287,
type.obs == 281, 281,
type.obs == 287, 287)] %>%
.[, sd.y := mean(sd.y), by = .(lon.box, lat.box, var)] %>%
.[, var := factor(var, levels = c("v", "t"))] %>%
ggplot(aes(ConvertLongitude(lon.box), lat.box)) +
geom_raster(aes(fill = sd.y)) +
geom_mapa() +
scale_fill_viridis_c(breaks = seq(0, 5, 0.5),
limits = c(0, 5),
direction = -1,
guide = guide_colorsteps(inside = TRUE,
barwidth = 18,
barheight = 0.5,
title.position = "left",
title.vjust = 1,
frame.colour = "black")) +
facet_wrap(~var, labeller = labeller(var = c("v" = "Wind",
"t" = "Temperature"))) +
tag_facets() +
labs(fill = latex2exp::TeX("sd RCRV")) +
theme_minimal(base_size = 13) +
theme(legend.position = "bottom",
tagger.panel.tag.text = element_text(size = 14),
panel.ontop = TRUE,
panel.grid = element_line(linetype = 3))
```
(ref:rcrv-profile) Vertical profiles of first guess $mean RCRV$ (dashed line) and $sd RCRV$ (solid line) for a) temperature and b) wind of sounding and aircraft observations, c) satellite-derived wind observations, and d) brightness temperature observations for the RAD experiment. Observations were aggregated every hourly cycle for the entire experiment period.
```{r rcrv-profile, fig.cap="(ref:rcrv-profile)", fig.env="figure*", fig.height=3.5, fig.width=7}
rbind(fread(here("analysis/data/derived_data/RCRV/rcrv_V_perfil.csv")),
fread(here("analysis/data/derived_data/RCRV/rcrv_t_perfil.csv"))) %>%
obs.type[., on = "type"] %>%
.[type != 130] %>%
melt(measure.vars = c("mean.y", "sd.y")) %>%
ggplot(aes(error.level, value)) +
geom_hline(yintercept = c(0, 1), color = "grey20") +
geom_line(aes(linetype = variable, color = code)) +
scale_linetype_manual(values = c("dashed", "solid"),
labels = c("mean RCRV", "sd RCRV")) +
scale_color_brewer(palette = "Dark2") +
guides(linetype = guide_legend(order = 1),
color = guide_legend(order = 10)) +
# scale_color_discrete() +
scale_x_level(name = "Pressure (hPa)", breaks = c(1000, 500, 250, 125, 50)) +
coord_flip() +
facet_wrap(~ var, labeller = labeller(var = c("t" = "Temperature",
"v" = "Wind"))) +
tag_facets() +
labs(x = "Pressure (hPa)", y = NULL,
linetype = NULL, color = "Upper air\nobservations") +
guides(color = guide_legend(keyheight = 0.4, default.unit = "cm"),
linetype = guide_legend(keyheight = 0.4, default.unit = "cm")) +
theme_minimal(base_size = 8) +
theme(legend.box = "vertical",
legend.title = element_text(size = 6),
panel.background = element_rect(fill = "#fbfbfb", color = NA),
tagger.panel.tag.text = element_text(size = 8)) +
read_csv(here("analysis/data/derived_data/RCRV/rcrv_satwind.csv")) %>%
setDT() %>%
.[!(sat_type %in% c("GOES visible", "EUMETSAT visible") & error.level == 700)] %>%
.[, sat_type := fifelse(sat_type == "EUMETSAT WV deep layer winds", "EUMETSAT WV", sat_type)] %>%
melt(measure.vars = c("mean.y", "sd.y")) %>%
ggplot(aes(error.level, value)) +
geom_hline(yintercept = c(0, 1), color = "grey20") +
geom_line(aes(color = sat_type, linetype = variable)) +
scale_linetype_manual(values = c("dashed", "solid"),
labels = c("mean RCRV", "sd RCRV")) +
# scale_color_brewer(palette = "Set1") +
scale_x_level(breaks = c(1000, 500, 250, 125, 50), limits = c(1000, 50)) +
coord_flip() +
facet_wrap(~ var, scales = "free_x", labeller = labeller(var = c("u" = "U wind",
"v" = "Satellite-derived\nwind"))) +
tag_facets(tag_pool = c("c")) +
labs(x = NULL, y = latex2exp::TeX("mean RCRV (----) / sd RCRV (――)"),
linetype = NULL, color = "Satellite-derived\nwind") +
guides(color = guide_legend(keyheight = 0.4, default.unit = "cm"),
linetype = guide_legend(keyheight = 0.4, default.unit = "cm")) +
theme_minimal(base_size = 8) +
theme(legend.box = "vertical",
legend.spacing.y = unit(0.1, 'mm'),
legend.title = element_text(size = 6),
panel.background = element_rect(fill = "#fbfbfb", color = NA),
tagger.panel.tag.text = element_text(size = 8)) +
purrr::map(Sys.glob(here("analysis/data/derived_data/RCRV/rcrv_*_perfil.csv"))[1:6], function(f) {
meta <- unglue::unglue(basename(f), "rcrv_{sensor}_perfil.csv")
fread(f) %>%
.[, sensor := meta[[1]][["sensor"]]]
}) %>%
rbindlist() %>%
.[sensor %in% c("airs", "amsua", "iasi", "mhs")] %>%
separate(sensor, into = c("sensor", "plat"), sep = "_") %>%
setDT() %>%
melt(measure.vars = c("mean.y", "sd.y")) %>%
.[, .(value = mean(value, na.rm = TRUE),
var = "Brightness\ntemperature"), by = .(sensor, level, variable)] %>%
ggplot(aes(level, value)) +
geom_hline(yintercept = c(0, 1), color = "grey20") +
geom_line(aes(color = sensor, linetype = variable)) +
scale_linetype_manual(values = c("dashed", "solid"),
labels = c("mean RCRV", "sd RCRV")) +
scale_color_discrete(labels = toupper) +
coord_flip() +
scale_x_level(breaks = c(1000, 500, 250, 125, 50)) +
facet_wrap(~ var, scales = "free_x") +
tag_facets(tag_pool = c("d")) +
labs(x = NULL, y = NULL,
linetype = NULL, color = "Radiances\nobservations") +
guides(color = guide_legend(keyheight = 0.4, default.unit = "cm"),
linetype = guide_legend(keyheight = 0.4, default.unit = "cm")) +
theme_minimal(base_size = 8) +
theme(legend.box = "vertical",
legend.spacing.y = unit(0.1, 'mm'),
legend.title = element_text(size = 6),
tagger.panel.tag.text = element_text(size = 8)) +
plot_layout(ncol = 3, widths = c(1, 1, 1), guides = "collect") &
theme(legend.box = "vertical",
legend.spacing.y = unit(0.1, 'mm'),
legend.title = element_text(size = 6),
panel.background = element_rect(fill = "#fbfbfb", color = NA),
tagger.panel.tag.text = element_text(size = 8))
```
## Impacts of assimilated observations
This section presents the impact of assimilating different observation types on variables which are particularly relevant for the occurrence of deep moist convection. The analysis is performed over a smaller domain (red box in Figure \@ref(fig:dominio)a) to focus on the region most directly affected by the MCS. Figures \@ref(fig:TQ-diff)a-c show the analysis difference between experiments in the spatially averaged vertical profile of temperature. By averaging the differences between two experiments the systematic impact produced by different observing systems on the analyzed state can be isolated. During the first day, the assimilation of AWS observations results in a colder PBL. This cooling effect has a clear diurnal cycle, being stronger during nighttime (Figure \@ref(fig:TQ-diff)a). During the second day of the experiment, the impact of AWS observations extends into the middle and upper troposphere coinciding with the mature stage of the MCS. The warm difference shown in AWS-CONV between 500 and 200 hPa is produced by the development of stronger convection in AWS compared to CONV. This is a good example of how low-level information provided by surface weather stations can rapidly spread into the troposphere in the presence of deep moist convection. Although the mid-to-upper circulation can have an important impact on the organization and evolution of the MCS over the region, the satellite-derived winds did not have an appreciable impact on the mean temperature and humidity (Figure \@ref(fig:TQ-diff)b-e), possibly due to the large observation errors used for the assimilation.
During the first day of the experiment, the assimilation of radiances produces a warming effect in the PBL which partially compensates for the cooling effect of AWS observations (Figure \@ref(fig:TQ-diff)c). No clear systematic impact is found above the PBL during this period. During the second day, the impact of radiance observations is found through the troposphere with a distribution that is similar to the impact found in the AWS experiment but with the opposite sign.
Comparing the specific humidity in the experiments (Figures \@ref(fig:TQ-diff)d-f), the impact of assimilating AWS with fine spatial and temporal resolution is most substantial at low levels (Figure \@ref(fig:TQ-diff)d). The PBL in the AWS experiment is consistently moister than in the CONV experiment, particularly at nighttime. The increase in low-level moisture by a denser surface network is consistent with previously reported dry biases in the WRF model over the region [@casaretto2022, @matsudo2021, @ruiz2010]. The moistening of the PBL is mainly driven by the covariance between temperature and specific humidity within the PBL. In the experiment and over the center of the domain, this covariance remains negative, increasing low-level moisture as the observations introduce negative temperature corrections. As for the temperature, the systematic impact of satellite-derived winds on moisture is small (Figure \@ref(fig:TQ-diff)e). Figure \@ref(fig:TQ-diff)f shows that radiances reduce low-middle level moisture during the first day of the experiment. The drying effect extends to lower-middle levels during the second day of the experiment coinciding with the development of the MCS between 00 and 12 UTC Nov 22.
(ref:TQ-diff) Difference between analysis ensemble mean experiments a) and d) AWS-CONV, b) and e) SATWND-AWS, and c) and f) RAD-SATWND for the spatially averaged vertical profiles of temperature (a, b, and c, in $K$) and specific humidity (d, e, and f in $g\ kg^{-1}$) calculated over the inner domain (red box in Figure \@ref(fig:dominio)a) for each analysis cycle.
```{r TQ-diff, fig.cap="(ref:TQ-diff)", fig.env="figure*", fig.height=5.5, fig.width=6, fig.align="center",fig.pos="ht"}
files <- Sys.glob(here("analysis/data/derived_data/analysis_variables/perfiles_ana_E[2569].csv"))
perfiles <- purrr::map(files, function(f) {
exp <- unglue(basename(f), "perfiles_{run}_{exp}.csv")
fread(f) %>%
.[, exp := exp[[1]][["exp"]]]
}) %>%
rbindlist() %>%
.[, date := as_datetime(date)] %>%
.[date %between% c(as_datetime("2018-11-20 18:00:00"),
as_datetime("2018-11-23 12:00:00"))]
perfiles %>%
dcast(lev + date ~ exp, value.var = "T") %>%
.[, ":="(E5_E2 = E5 - E2,
E6_E5 = E6 - E5,
E9_E6 = E9 - E6)] %>%
melt(measure.vars = c("E5_E2", "E6_E5", "E9_E6")) %>%
ggplot(aes(date, lev)) +
geom_contour_fill(aes(z = value, fill = stat(level)),
breaks = c(seq(-2, 2, 0.2), Inf)) +
geom_contour2(aes(z = value), color = "white", size = 0.1,
breaks = c(seq(-2, 2, 0.2), Inf)) +
scale_fill_divergent_discretised(guide = guide_colorsteps(barwidth = 25,
barheight = 0.3,
title.position = "left",
title.vjust = 1,
frame.colour = "black")) +
labs(fill = "Temperature (K)",
x = NULL,
y = "Pressure (hPa)") +
scale_y_level(name = "Pressure (hPa)", breaks = c(1000, 850, 750, 500, 300, 200, 100)) +
scale_date(ini = 20181121000000, break_bin = "12 hours") +
facet_wrap(~variable, ncol = 3,
labeller = labeller(variable = c("E5_E2" = "AWS - CONV",
"E6_E5" = "SATWND - AWS",
"E9_E6" = "RAD - SATWND"))) +
tag_facets(position = list(x = 0.1, y = 0.96)) +
theme_minimal(base_size = 8) +
theme(legend.position = "bottom",
tagger.panel.tag.text = element_text(size = 8),
panel.ontop = TRUE,
panel.grid = element_line(linetype = 3)) +
perfiles %>%
dcast(lev + date ~ exp, value.var = "QVAPOR") %>%
.[, ":="(E5_E2 = E5 - E2,
E6_E5 = E6 - E5,
E9_E6 = E9 - E6)] %>%
melt(measure.vars = c("E5_E2", "E6_E5", "E9_E6")) %>%