forked from USEPA/CMAQ
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSOA_DEFN.F
2501 lines (2166 loc) · 105 KB
/
SOA_DEFN.F
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
!------------------------------------------------------------------------!
! The Community Multiscale Air Quality (CMAQ) system software is in !
! continuous development by various groups and is based on information !
! from these groups: Federal Government employees, contractors working !
! within a United States Government contract, and non-Federal sources !
! including research institutions. These groups give the Government !
! permission to use, prepare derivative works of, and distribute copies !
! of their work in the CMAQ system to the public and to permit others !
! to do so. The United States Environmental Protection Agency !
! therefore grants similar permission to use the CMAQ system software, !
! but users are requested to provide copies of derivative works or !
! products designed to operate in the CMAQ system to the United States !
! Government without restrictions as to use by others. Software !
! that is used with the CMAQ system but distributed under the GNU !
! General Public License or the GNU Lesser General Public License is !
! subject to their copyright restrictions. !
!------------------------------------------------------------------------!
C:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
Module soa_defn
C Defines aerosol species arrays and parameters required in SOA processing.
C Contains:
C Subroutine extract_soa
C Subroutine update_orgvapor
C Function findVapor
C Function findOrgprod
C Subroutine orgaer
C Revision History:
C First version was coded in April 2010 by Steve Howard with
C Prakash Bhave, Jeff Young, and Sergey Napelenok.
C
C HP 03/11/11 Updated monoterpene SOA alphas and Cstars to Carlton et al. 2010 values
C HP 07/24/11 Changed aromatic SOA alphas for consistency with updated reaction counters
C BNZ, TOL, XYL numbers now match Ng et al. 2007 Atmos. Chem. Phys.
C 08 Jun 12 J.Young: remove full character blank padding for GNU Fortran (GCC) 4.1.2
C 13 Aug 13 H. Pye: Xylene and toluene low-NOx yields switched. Values now
C follow experimental data of Ng et al. 2007 ACP as shown in Table 3.
C Values in Table 6 of Ng et al. (previously used) are incorrect.
C 18 Dec 13 G.Sarwar: added orgprod parent names based on RACM2
C 07 Jul 14 B.Hutzell: replaced mechanism include file(s) with fortran module
C 21 Jul 14 B.Hutzell: used ifdef statement to make oligomerization
C optional because process represented in chemical
C mechanism
C 26 Sep 14 H. Pye: Added isoprene + NO3 SOA (see mech.def, no changes
C here). When IEPOX uptake present in gas phase for
C cb05e51, replace preivous acid enhanced isoprene SOA
C with IEPOX uptake SOA now handled as a heterogeneous
C rxn. For saprc07tic_ae6i, perform more detailed
C IEPOX and MAE uptake and do not do Carlton et al. 2010
C acid enhancement. Note that saprc07tic_ae6i is a research
C version and it is unclear how duplicative AISO1+AISO2+their oligomers
C are with IEPOX+MAE uptake and their oligomers.
C Both pathways occur with sarpc07tic_ae6i. To turn AISO1+AISO2
C oligomers off, set "Decay" in oaspc to 0.0 for SV_ISO1/2.
C 27 Sep 14 H. Pye: Added alkane and PAH SOA (Pye and Pouliot 2012 ES&T)
C 15 Jul 15 G. Sarwar: updated SOA from alkane, PAH, and isoprene for RACM2
C 03/03/16 D. Luecken: added capability for CB6
C 24 Mar 16 G. Sarwar: updated for CB05EH51
C May 16 B. Murphy, H. Pye: updated treatment of aerosol moments
C Jan 18 H. Pye: updated monoterpene photoxidation SOA: Xu et al. 2018 ACPD
C AMT1-7 will replace ATRP1-2 when fully implemented
C across mechanisms.
C Aug 18 M. Qin, H. Pye: Removed oligomerization option here. Oligomerization
C must be done in gas chemistry (mech.def). Added anthropogenic
C SOA condensation for aero7.
C 29 Aug 18 G. Sarwar: updated for CB6R3M
C 17 Jan 20 B.Hutzell -Added algorithm to handle tracer species and
C -added benzo[a]pyrene to oa_list. Its cstar is based
C on the subcooled vapor pressure in Lei et. al (2002)
C-----------------------------------------------------------------------
#ifdef sens
USE DDM3D_DEFN, ONLY : NP, NPMAX
Use aero_ddm3d, ONLY : init_aero_ddm3d, ae_ddm3d_ready, og_sens, rog_dsens
#endif
Implicit None
! Define Logical values as T and F for the OA table
Logical, Parameter, Private :: T = .true.
Logical, Parameter, Private :: F = .false.
Integer, Parameter :: n_oa_list = 81 ! # of potential partitioning SVOCs
Integer, Save :: n_oa ! Total # of simulated SOA vapors
Integer, Save :: n_oa_NotTracers ! # of simulated SOA vapors that are not tracers
Integer, Save :: n_oa_tracers ! # of simulated SOA vapors that are tracers
Type oa_type
Character( 16 ) :: name ! Organic Aerosol Species Name
Character( 16 ) :: gas_name ! Condensable Vapor Species Name
Character( 16 ) :: ctr_name ! Reaction Counter Name
Real :: alpha ! Mass-based stoichiometric coefficients [ug/m^3]/[ug/m^3]
Real :: cstar ! Effective saturation concentrations [ug/m^3] at 298 K
Real :: enth ! Enthalphy of Vaporization [J/mol]
Real :: otoc ! O:C - Ratio of Oxygen and to Carbon
Real :: OMtoOC ! OM:OC - Ratio of Total Organic Mass to Organic Carbon Mass
Logical :: primary ! Flag identifying primary species
Logical :: anthro ! Flag identifying anthropogenic species
Logical :: biog ! Flag identifying biogenic species
Logical :: nonvol ! Flag identifying nonvolatile species
End Type oa_type
Type( oa_type ), Allocatable, Save :: oaspc( : )
Type( oa_type ), Save :: oa_list( n_oa_list ) = (/
! ANTHROPOGENIC
! | BIOGENIC
! PM Vapor Rxn Cntr Alpha CStar^ Enth- O:C OM:OC | | Nonvol-
! Name Name Name* alpy POA | | atile
! ---------- ---------- ---------- ------ -------- ------- --- ----- --- --- --- ---
& oa_type('AALK1 ', 'SVALK1 ', 'ALKRXN ', 0.0334, 0.1472, 53.0E3, .315,1.56, F, T, F, F ),
& oa_type('AALK2 ', 'SVALK2 ', 'ALKRXN ', 0.2164, 51.8775, 53.0E3, .203,1.42, F, T, F, F ),
& oa_type('AXYL1 ', 'SVXYL1 ', 'XYLNRXN ', 0.0310, 1.3140, 32.0E3,1.002,2.42, F, T, F, F ),
& oa_type('AXYL2 ', 'SVXYL2 ', 'XYLNRXN ', 0.0900, 34.4830, 32.0E3, .611,1.93, F, T, F, F ),
& oa_type('ATOL1 ', 'SVTOL1 ', 'TOLNRXN ', 0.0580, 2.3260, 18.0E3, .875,2.26, F, T, F, F ),
& oa_type('ATOL2 ', 'SVTOL2 ', 'TOLNRXN ', 0.1130, 21.2770, 18.0E3, .523,1.82, F, T, F, F ),
& oa_type('ABNZ1 ', 'SVBNZ1 ', 'BNZNRXN ', 0.0720, 0.3020, 18.0E3,1.211,2.68, F, T, F, F ),
& oa_type('ABNZ2 ', 'SVBNZ2 ', 'BNZNRXN ', 0.8880, 111.1100, 18.0E3, .851,2.23, F, T, F, F ),
& oa_type('APAH1 ', 'SVPAH1 ', 'PAHNRXN ', 0.2100, 1.6598, 18.0E3, .371,1.63, F, T, F, F ),
& oa_type('APAH2 ', 'SVPAH2 ', 'PAHNRXN ', 1.0700, 264.6675, 18.0E3, .259,1.49, F, T, F, F ),
& oa_type('ATRP1 ', 'SVTRP1 ', 'TRPRXN ', 0.1393, 14.7920, 40.0E3, .539,1.84, F, F, T, F ),
& oa_type('ATRP2 ', 'SVTRP2 ', 'TRPRXN ', 0.4542, 133.7297, 40.0E3, .531,1.83, F, F, T, F ),
& oa_type('AMT1 ', 'SVMT1 ', 'TRPRXN ', 0.040, 0.010, 102.0E3, .400,1.67, F, F, T, F ),
& oa_type('AMT2 ', 'SVMT2 ', 'TRPRXN ', 0.032, 0.100, 91.0E3, .400,1.67, F, F, T, F ),
& oa_type('AMT3 ', 'SVMT3 ', 'TRPRXN ', 0.032, 1.000, 80.0E3, .444,1.72, F, F, T, F ),
& oa_type('AMT4 ', 'SVMT4 ', 'TRPRXN ', 0.103, 10.000, 69.0E3, .300,1.53, F, F, T, F ),
& oa_type('AMT5 ', 'SVMT5 ', 'TRPRXN ', 0.143, 100.000, 58.0E3, .333,1.57, F, F, T, F ),
& oa_type('AMT6 ', 'SVMT6 ', 'TRPRXN ', 0.285, 1000.000, 47.0E3, .200,1.40, F, F, T, F ),
& oa_type('AMT7 ', 'SVMT7 ', 'TRPRXN ', 0.160,10000.000, 36.0E3, .222,1.43, F, F, T, F ),
& oa_type('AHOM ', 'HOM ', ' ', 0.0, 6.3E-03, 130.0E3, .700,2.08, F, F, T, F ),
& oa_type('AELHOM ', 'ELHOM ', ' ', 0.0, 1.0E-05, 160.0E3, .400,1.67, F, F, T, F ),
& oa_type('AMTNO3 ', 'MTNO3 ', ' ', 0.0, 12.0, 40.0E3, .587,1.90, F, F, T, F ),
& oa_type('AISOPNN', 'ISOPNN ', ' ', 0.0, 8.9, 40.0E3,2.107,3.80, F, F, T, F ),
& oa_type('AMTHYD ', ' ', ' ', 0.0, 1.E-10, 1.0E0, .299,1.54, F, F, T, T ),
& oa_type('AIETET ', ' ', ' ', 0.0, 1.E-10, 1.0E0, .883,2.27, F, F, T, T ),
& oa_type('AIEOS ', ' ', ' ', 0.0, 1.E-10, 1.0E0,1.947,3.60, F, F, T, T ),
& oa_type('ADIM ', ' ', ' ', 0.0, 1.E-10, 1.0E0, .723,2.07, F, F, T, T ),
& oa_type('AIMGA ', ' ', ' ', 0.0, 1.E-10, 1.0E0,1.067,2.50, F, F, T, T ),
& oa_type('AIMOS ', ' ', ' ', 0.0, 1.E-10, 1.0E0,2.403,4.17, F, F, T, T ),
& oa_type('AISO3NOS',' ',' ', 0.0, 1.e-10, 1.0E0, 0.8,2.27, F, F, T, T ),
& oa_type('AISO3OS ',' ',' ', 0.0, 1.e-10, 1.0E0, 1.4,3.60, F, F, T, T ),
& oa_type('AISO1 ', 'SVISO1 ', 'ISOPRXN ', 0.2320, 116.0100, 40.0E3, .827,2.20, F, F, T, F ),
& oa_type('AISO2 ', 'SVISO2 ', 'ISOPRXN ', 0.0288, 0.6170, 40.0E3, .851,2.23, F, F, T, F ),
& oa_type('AISO3 ', ' ', ' ', 0.0, 1.e-10, 1.0E0,1.307,2.80, F, F, T, T ),
& oa_type('ASQT ', 'SVSQT ', 'SESQRXN ', 1.5370, 24.9840, 40.0E3, .283,1.52, F, F, T, F ),
& oa_type('AGLY ', ' ', ' ', 0.0, 1.E-10, 1.0E0, .771,2.13, F, F, F, T ),
& oa_type('AORGC ', ' ', ' ', 0.0, 1.E-10, 1.0E0, .667,2.00, F, F, F, T ),
& oa_type('AXYL3 ', ' ', 'XYLHRXN ', 0.3600, 1.e-10, 1.0E0, .907,2.30, F, T, F, T ),
& oa_type('ATOL3 ', ' ', 'TOLHRXN ', 0.3000, 1.e-10, 1.0E0,1.227,2.70, F, T, F, T ),
& oa_type('ABNZ3 ', ' ', 'BNZHRXN ', 0.3700, 1.e-10, 1.0E0,1.467,3.00, F, T, F, T ),
& oa_type('APAH3 ', ' ', 'PAHHRXN ', 0.7300, 1.e-10, 1.0E0, .483,1.77, F, T, F, T ),
& oa_type('APOC ', ' ', ' ', 0.0 , 1.e-10, 1.0E0, .000,1.00, T, T, F, T ),
& oa_type('APNCOM ', ' ', ' ', 0.0 , 1.e-10, 1.0E0, -1.0,-1.0, T, T, F, T ),
& oa_type('APCSO ', 'LVPCSOG ', 'PCSOARXN', 1.0 , 1.e-05, 40.0E3, .667,2.00, F, T, F, F ),
& oa_type('ALVPO1 ', 'VLVPO1 ', ' ', 0.0000, 1.e-1, 96.0E3, .185,1.39, T, T, F, F ),
& oa_type('ASVPO1 ', 'VSVPO1 ', ' ', 0.0000, 1.e+0, 85.0E3, .123,1.32, T, T, F, F ),
& oa_type('ASVPO2 ', 'VSVPO2 ', ' ', 0.0000, 1.e+1, 74.0E3, .073,1.26, T, T, F, F ),
& oa_type('ASVPO3 ', 'VSVPO3 ', ' ', 0.0000, 1.e+2, 63.0E3, .032,1.21, T, T, F, F ),
& oa_type('AIVPO1 ', 'VIVPO1 ', ' ', 0.0000, 1.e+3, 52.0E3, .000,1.17, T, T, F, F ),
& oa_type('ALVOO1 ', 'VLVOO1 ', ' ', 0.0000, 1.e-2, 107.0E3, .886,2.27, F, T, F, F ),
& oa_type('ALVOO2 ', 'VLVOO2 ', ' ', 0.0000, 1.e-1, 96.0E3, .711,2.06, F, T, F, F ),
& oa_type('ASVOO1 ', 'VSVOO1 ', ' ', 0.0000, 1.e+0, 85.0E3, .567,1.88, F, T, F, F ),
& oa_type('ASVOO2 ', 'VSVOO2 ', ' ', 0.0000, 1.e+1, 74.0E3, .447,1.73, F, T, F, F ),
& oa_type('ASVOO3 ', 'VSVOO3 ', ' ', 0.0000, 1.e+2, 63.0E3, .345,1.60, F, T, F, F ),
& oa_type('AAVB1 ', 'SVAVB1 ', ' ', 0.0000, 0.010, 18.0E3,1.227,2.70, F, T, F, F ),
& oa_type('AAVB2 ', 'SVAVB2 ', ' ', 0.0000, 1.000, 18.0E3, .947,2.35, F, T, F, F ),
& oa_type('AAVB3 ', 'SVAVB3 ', ' ', 0.0000, 10.000, 18.0E3, .803,2.17, F, T, F, F ),
& oa_type('AAVB4 ', 'SVAVB4 ', ' ', 0.0000, 100.000, 18.0E3, .659,1.99, F, T, F, F ),
& oa_type('AOLGA ', ' ', ' ', 0.0000, 1.e-10, 1.0E0,1.067,2.50, F, T, F, T ),
& oa_type('AOLGB ', ' ', ' ', 0.0000, 1.e-10, 1.0E0, .747,2.10, F, F, T, T ),
& oa_type('AOP3 ', 'OP3 ', ' ', 0.0000, 1.e+1, 81.0E3, .600,1.92, F, T, F, F ),
& oa_type('ASOAT ', ' ', ' ', 0.0000, 1.0E-10, 1.0E0,0.857,2.31, F, T, F, T ),
& oa_type('AROCN2ALK','VROCN2ALK',' ', 0.0000, 1.e-2, 104.0E3, .000,1.39, T, T, F, F ),
& oa_type('AROCN1ALK','VROCN1ALK',' ', 0.0000, 1.e-1, 96.0E3, .000,1.32, T, T, F, F ),
& oa_type('AROCP0ALK','VROCP0ALK',' ', 0.0000, 1.e+0, 85.0E3, .000,1.17, T, T, F, F ),
& oa_type('AROCP1ALK','VROCP1ALK',' ', 0.0000, 1.e+1, 81.0E3, .000,1.17, T, T, F, F ),
& oa_type('AROCP2ALK','VROCP2ALK',' ', 0.0000, 1.e+2, 77.0E3, .000,1.17, T, T, F, F ),
& oa_type('AROCP3ALK','VROCP3ALK',' ', 0.0000, 1.e+3, 73.0E3, .000,1.17, T, T, F, F ),
& oa_type('AROCN2OXY2','VROCN2OXY2',' ',0.0000, 1.e-2, 93.0E3, .200,1.42, F, T, F, F ),
& oa_type('AROCN2OXY4','VROCN2OXY4',' ',0.0000, 1.e-2, 93.0E3, .400,1.67, F, T, F, F ),
& oa_type('AROCN2OXY8','VROCN2OXY8',' ',0.0000, 1.e-2, 93.0E3, .800,2.17, F, T, F, F ),
& oa_type('AROCN1OXY1','VROCN1OXY1',' ',0.0000, 1.e-1, 89.0E3, .100,1.29, F, T, F, F ),
& oa_type('AROCN1OXY3','VROCN1OXY3',' ',0.0000, 1.e-1, 89.0E3, .300,1.54, F, T, F, F ),
& oa_type('AROCN1OXY6','VROCN1OXY6',' ',0.0000, 1.e-1, 89.0E3, .600,1.92, F, T, F, F ),
& oa_type('AROCP0OXY2','VROCP0OXY2',' ',0.0000, 1.e+0, 85.0E3, .200,1.42, F, T, F, F ),
& oa_type('AROCP0OXY4','VROCP0OXY4',' ',0.0000, 1.e+0, 85.0E3, .400,1.67, F, T, F, F ),
& oa_type('AROCP1OXY1','VROCP1OXY1',' ',0.0000, 1.e+1, 81.0E3, .100,1.29, F, T, F, F ),
& oa_type('AROCP1OXY3','VROCP1OXY3',' ',0.0000, 1.e+1, 81.0E3, .300,1.54, F, T, F, F ),
& oa_type('AROCP2OXY2','VROCP2OXY2',' ',0.0000, 1.e+2, 77.0E3, .200,1.42, F, T, F, F ),
& oa_type('AROCP3OXY2','VROCP3OXY2',' ',0.0000, 1.e+3, 73.0E3, .200,1.42, F, T, F, F ),
& oa_type('ABENAPY', 'BENAPY ', ' ', 0.0000, 0.0396, 105.0E3, .000,1.00, F, T, F, F ) /)
! Table Comments:
! *Reaction Counters are only needed if the vapor species is not formed
! directly in the gas-phase chemistry mechanism.
! ^Nonvolatile species are given a default C* of 1e-10 ug/m3 and
! enthalpy of vaporization equal to 1 kJ/mol.
! Cstar for BENAPY or benzo[a]pyrene was based on the DMSO partitioning
! coefficient in Shrivastave et al. (2017) PNAS, vol 114, 1246-1251. All
! OA corresponds to DMSO but its density corresponds to average density
! of CMAQ OA, 1.4 g/cm3
! Identify Species Required for Isoprene and Monoterpene Chemistry
Character( 16 ), Private, Parameter :: req_sviso1 = 'SVISO1'
Character( 16 ), Private, Parameter :: req_sviso2 = 'SVISO2'
Character( 16 ), Private, Parameter :: req_aeiso1 = 'AISO1'
Character( 16 ), Private, Parameter :: req_aeiso2 = 'AISO2'
Character( 16 ), Private, Parameter :: req_aeiso3 = 'AISO3'
Character( 16 ), Private, Parameter :: req_aeorgc = 'AORGC'
! Variables for Carrying Indices of required species
Integer :: iso1_idx
Integer :: iso2_idx
Integer :: aiso1_idx
Integer :: aiso2_idx
Integer :: aiso3_idx
Integer :: aorgc_idx
! Variables for saving properties and concentrations of organic
! compounds
! Molecular Weights
Real, Allocatable :: op_mw ( : ) ! PM species
Real, Allocatable :: og_mw ( : ) ! Vapor Species
Real, Allocatable :: rog_mw ( : ) ! Precursor Species
! that are linked to yields
! Concentrations
Real, Allocatable :: og_conc ( : ) ! Vapors
Real, Allocatable :: rog_dconc( : ) ! Reaction counters
! Variables for mapping OA to aerosol and CGRID arrays
Integer, Allocatable :: map_OAtoAERO( : ) ! organic aerosol pointers to aerospc
Integer, Allocatable :: map_OGtoCGRID( : ) ! pointers of vapor species to CGRID
Integer, Allocatable :: map_ROGtoCGRID( : ) ! pointers of SOA parent species to CGRID
Logical, Allocatable :: lnonvol_oa( : ) ! flag identifying non-volatile OA species
! in aerosol array that are not tracers
Logical, Allocatable :: l_oa( : ) ! flag identifying OA species
! that are not tracers
! Variables for controlling behavior of OA module
Logical, Private, Save :: mapped = .False.
Logical, Private, Save :: RXNS_eflag = .False. ! error flag for RXNS modules used
Logical, Private, Save :: OA_eflag = .False. ! error flag for soa_defn
Character( 16 ), Private, Save :: pname = 'SOA_DEFN '
Contains
C-----------------------------------------------------------------------
#ifdef sens
Subroutine extract_soa( conc, s_conc, schk )
#else
Subroutine extract_soa( conc )
#endif
C Extracts the required soa data from CGRID into the conc array.
C Revision History:
C First version was coded in April 2010 by Steve Howard with
C Prakash Bhave, Jeff Young, and Sergey Napelenok.
C
C SH 03/10/11 Renamed met_data to aeromet_data
C SR 03/25/11 Replaced I/O API include files with UTILIO_DEFN
C HP 09/27/14 alk_factor removed, updated for alkane/PAH SOA.
C Conversion of reacted alkane to dodecane equivalent
C is handled in mech.def. A factor of 0.47 is in use and
C reflects the fact that alkane SOA precursor
C emissions are dominated by compounds smaller than dodecane.
C BM 02/19/19 Major Revision to simplify the mapping procedure and
C remove redundat variables.
C-----------------------------------------------------------------------
Use rxns_data, only: mechname
Use aero_data, only: AE_eflag, findAero, aerospc_mw, n_aerospc, aerospc
Use aeromet_data, only: airdens, inv_mwair, min_gasconc
Use cgrid_spcs, only: n_gc_spc, gc_spc, n_gc_g2ae, gc_g2ae, gc_strt, gc_molwt, gc_g2ae_map,
& n_nr_spc, nr_spc, n_nr_n2ae, nr_n2ae, nr_strt, nr_molwt, nr_n2ae_map,
& n_ae_spc, ae_spc
Use runtime_vars, only: logdev
Use utilio_defn, only: index1, xstat3
Implicit None
! Arguments:
Real, Intent( In ) :: conc( : )
#ifdef sens
Real, Intent( In ) :: s_conc( :,: )
Logical, Intent( In ) :: schk ! necessary because some routines don't require sensitivity updates
#endif
! Local Variables:
Character( 300 ):: xmsg
Real :: gasconv
Real :: vtmp
Integer :: n, a, g
Integer :: spc
Integer :: map_OAtoOAlist( 200 )
! Map All OA Species and Load Properties
If ( .Not. mapped ) Then
mapped = .TRUE.
! First, the number and names of present and nontracer OA species must be
! determined by checking the AEROSOL Table with the species names
! available from the OA_LIST table.
n_oa = 0
Do spc = 1,n_oa_list
n = findAero( oa_list( spc )%name, .False. )
If ( n .Gt. 0 ) Then
If ( aerospc( n )%om .And. .Not. aerospc( n )%tracer ) Then
n_oa = n_oa + 1
map_OAtoOAlist( n_oa ) = spc
End If
End If
End Do
! Place tracers at the end of the list map
n_oa_tracers = 0
Do spc = 1,n_oa_list
n = findAero( oa_list( spc )%name, .False. )
If ( n .Gt. 0 ) Then
If ( aerospc( n )%om .And. aerospc( n )%tracer ) Then
n_oa = n_oa + 1
n_oa_tracers = n_oa_tracers + 1
map_OAtoOAlist( n_oa ) = spc
End If
End If
End Do
If ( n_oa .Eq. n_oa_tracers ) Then
OA_eflag = .True.
xmsg = 'FATAL: All SOA species are tracers at least '
& // 'one SOA species must not be a tracer.'
write(logdev,'(a)')Trim( xmsg )
End If
n_oa_NotTracers = n_oa - n_oa_tracers
! Allocate the OA property and mapping variables now that the
! number of active OA species has been determined.
Allocate ( oaspc ( n_oa ))
Allocate ( op_mw ( n_oa ))
Allocate ( og_mw ( n_oa ))
Allocate ( rog_mw ( n_oa ))
Allocate ( og_conc( n_oa ))
Allocate ( rog_dconc( n_oa ))
Allocate ( map_ROGtoCGRID( n_oa ))
Allocate ( map_OAtoAERO( n_oa ))
Allocate ( map_OGtoCGRID( n_oa ))
Allocate ( lnonvol_oa( n_aerospc ))
Allocate ( l_oa( n_aerospc ))
#ifdef sens
Allocate ( og_sens( n_oa,npmax ) )
Allocate ( rog_dsens( n_oa,npmax ) )
#endif
! Initialize and populate key OA variables
map_OAtoAERO = 0
op_mw = 200.0
lnonvol_oa = .false.
l_oa = .false.
Do spc = 1,n_oa
oaspc( spc ) = oa_list( map_OAtoOAlist( spc ) )
map_OAtoAERO( spc ) = findAero( oaspc( spc )%name, .False. )
If( map_OAtoAERO( spc ) .Lt. 1 )
& write(logdev,99904) Trim( oaspc( spc )%name )
op_mw( spc ) = aerospc_mw( map_OAtoAERO( spc ) )
lnonvol_oa( map_OAtoAERo( spc ) ) = ( oaspc( spc )%nonvol .and.
& .Not. aerospc( map_OAtoAERo( spc ) )%tracer )
l_oa( map_OAtoAERo( spc ) ) = ( aerospc( map_OAtoAERo( spc ) )%om .and.
& .Not. aerospc( map_OAtoAERo( spc ) )%tracer )
End Do
! Determine the location of any reaction counter species on the
! GC Namelist. When a match is found, populate the properties
! of that counter species.
map_ROGtoCGRID = 0
ROG_mw = 200.0
Do spc = 1, n_oa
If( oaspc( spc )%ctr_name == '' ) Cycle
g = index1( oaspc( spc )%ctr_name, n_gc_spc, gc_spc )
if ( g .ge. 1 ) then
! Populate Mapping Vector for the Precursor Species
map_ROGtoCGRID( spc ) = gc_strt - 1 + g
ROG_mw( spc ) = gc_molwt( g )
else
! Log an Error
OA_eflag = .True.
write(logdev,99903)Trim( oaspc( spc )%ctr_name ),
& Trim( oaspc( spc )%gas_name )
End If
End Do
! Determine the location on CGRID of condensable gases in
! equilibrium with OA particle species. When a match is found,
! populate the properties of those gas species.
map_OGtoCGRID = 0
og_mw = 200.0 ! Default Molecular Weight for all Organic Vapor Species
Do spc = 1,n_oa
If( oaspc( spc )%gas_name == '' ) Cycle
n = index1( oaspc( spc )%gas_name, n_nr_spc, nr_spc )
If ( n .ge. 1 ) Then
map_OGtoCGRID( spc ) = nr_strt - 1 + n
og_mw( spc ) = nr_molwt( n )
End If
g = index1( oaspc( spc )%gas_name, n_gc_spc, gc_spc )
If ( g .ge. 1 ) Then
map_OGtoCGRID( spc ) = gc_strt - 1 + g
og_mw( spc ) = gc_molwt( g )
End If
If( n .lt. 1 .and. g .lt. 1 ) Then
OA_eflag = .True.
write(logdev,99902)Trim( oaspc( spc )%gas_name ),
& Trim ( oaspc( spc )%name )
End If
End Do
! Find indices of required species based on mechname
If( index( mechname,'CRACMM1_AQ' ) .eq. 0
& .and. index( mechname,'CRACMM1AMORE_AQ') .eq. 0 ) Then
iso1_idx = findVapor( req_sviso1, .True. )
iso2_idx = findVapor( req_sviso2, .True. )
aiso1_idx = findAero( req_aeiso1, .True. )
aiso2_idx = findAero( req_aeiso2, .True. )
aiso3_idx = findAero( req_aeiso3, .True. )
Else
iso1_idx = findVapor( req_sviso1, .False. )
iso2_idx = findVapor( req_sviso2, .False. )
aiso1_idx = findAero( req_aeiso1, .False. )
aiso2_idx = findAero( req_aeiso2, .False. )
aiso3_idx = findAero( req_aeiso3, .False. )
End If
aorgc_idx = findAero( req_aeorgc, .True. )
End If ! mapping condition
#ifdef sens
If ( .Not. ae_ddm3d_ready ) Then
Call init_aero_ddm3d()
End If
#endif
! Copy grid cell concentrations of vapor species
og_conc = 0.0
rog_dconc = 0.0
gasconv = airdens * inv_mwair ! Compute gas conversion constant
#ifdef sens
og_sens = 0.0
rog_dsens = 0.0
#endif
Do spc = 1, n_oa
n = map_OGtoCGRID( spc )
If ( n .Ne. 0 ) Then
vtmp = gasconv * og_mw( spc )
og_conc( spc ) = Max( conc( n ) * vtmp, min_gasconc )
#ifdef sens
If (schk ) Then
Do np = 1, npmax
If ( og_conc( spc ) .eq. min_gasconc ) Then
og_sens( spc,np ) = 0.0
Else
og_sens( spc,np ) = s_conc( np,n ) * vtmp
Endif
End Do
End If
#endif
End If
n = map_ROGtoCGRID( spc )
If ( n .Ne. 0 ) Then
rog_dconc( spc ) = Max( conc( n ), min_gasconc )
#ifdef sens
If (schk ) Then
Do np = 1, npmax
If ( rog_dconc( spc ) .eq. min_gasconc ) Then
rog_dsens( spc,np ) = 0.0
Else
rog_dsens( spc,np ) = s_conc( np,n )
Endif
End Do
End If
#endif
End If
End Do
99902 Format('FATAL: SOA Vapor, ', a,
& ', is not found among the species in '
& / 'the NR or GC namelist used. Required for modeling ', a / )
99903 Format( 'FATAL: SOA Reaction Counter, ', a,
& '. is not found among the species',
& / 'in GC namelist used. Required for modeling vapor, ',
& a / )
99904 Format(1X,'aerosol product from namelist species: ', a /)
Return
End Subroutine extract_soa
C-----------------------------------------------------------------------
#ifdef sens
Subroutine update_orgvapor( conc, s_conc )
#else
Subroutine update_orgvapor( conc )
#endif
C Populates CGRID from the conc array with updated SOA values.
C Revision History:
C First version was coded in April 2010 by Steve Howard with
C Prakash Bhave, Jeff Young, and Sergey Napelenok.
C
C SH 03/10/11 Renamed met_data to aeromet_data
C SR 03/25/11 Replaced I/O API include files with UTILIO_DEFN
C-----------------------------------------------------------------------
Use aero_data, only : cond_budget, npf_budget
Use aeromet_data, only: airdens, inv_mwair, min_gasconc
Use utilio_defn, only: xstat3
Implicit None
! Arguments:
Real, Intent( Out ) :: conc( : )
#ifdef sens
Real, Intent( Out ) :: s_conc( :,: )
#endif
! Local Variables:
Character( 80 ) :: xmsg
Real :: gasconv
Real :: vtmp
Integer :: n
Integer :: spc
If ( .Not. mapped ) Then
xmsg = 'CGRID Species has not been mapped'
Call m3exit( pname, 0, 0, xmsg, xstat3 )
End If
! Compute gas conversion constant
gasconv = airdens * inv_mwair
! Copy og_conc back to grid cell concentrations
Do spc = 1, n_oa
n = map_OGtoCGRID( spc )
If ( n .Ne. 0 ) Then
vtmp = og_mw( spc ) * gasconv
conc( n ) = Max ( og_conc( spc ) / vtmp, min_gasconc )
#ifdef sens
Do np = 1, npmax
If ( conc( n ) .Eq. min_gasconc ) Then
s_conc( np,n ) = 0.0
Else
s_conc( np,n ) = og_sens( spc,np ) / vtmp
End If
End Do
#endif
! Convert Budget Process Numbers from ug m-3 to ppmv
! for application to process analysis and ISAM
COND_BUDGET( n ) = COND_BUDGET( n ) / vtmp
NPF_BUDGET( n ) = NPF_BUDGET( n ) / vtmp
End If
End Do
Return
End Subroutine update_orgvapor
C-----------------------------------------------------------------------
Function findVapor( vname, required ) Result ( ndx )
C Finds the index of 'required' semivolatile species in the oaspc list
C Revision History:
C First version was coded in April 2010 by Steve Howard with
C Prakash Bhave, Jeff Young, and Sergey Napelenok.
C
C SR 03/25/11 Replaced I/O API include files with UTILIO_DEFN
C-----------------------------------------------------------------------
Use RUNTIME_VARS, only : logdev
Implicit None
! Arguments:
Character( 16 ) :: vname
Integer ndx
Logical required
! Local Variables:
Character( 80 ) :: xmsg
Integer :: spc
ndx = 0
Do spc = 1, n_oa
If ( oaspc( spc )%gas_name .Eq. vname ) Then
ndx = spc
Return
End If
End Do
If ( .Not. required ) Then
xmsg = 'Optional Species '
& // Trim( vname ) //
& ' is not found in the G2AE or N2AE values of GC or NR namelists.'
write(logdev,'(5x,a)') xmsg
Return
End If
xmsg = 'FATAL:' // Trim( vname )
& // ' is not found in the G2AE or N2AE values of GC or NR namelists.'
OA_eflag = .True.
Call m3warn( pname, 0, 0, xmsg )
Return
End Function findVapor
C-----------------------------------------------------------------------
Subroutine orgaer( dt, layer )
C Updates CGRID via several pathways for secondary organic aerosol (SOA)
C formation, as recommended by Edney et al. (2007). These include SOA
C formation from isoprene, monoterpenes, sesquiterpenes, long alkanes, and
C aromatics (incl. benzene).
C Input includes the concentrations of reactive organic gases (ROG)
C that were oxidized during the time step (ORGPROD), the vapor-phase
C concentration of each semi-volatile organic compound, the
C concentration of each SOA species, and the concentration of primary
C organic aerosol (all concentrations are stored in the CBLK array).
C Output includes updated concentrations of SOA species, vapor-phase
C semi-volatile organic compounds, and moments of the accumulation
C mode. The geometric mean diameter of the accumulation mode is also
C updated. All SOA formation is restricted to the accumulation mode.
C This code relies on 12 counter species to be incorporated in the
C gas-phase chemical mechanisms to track the amounts of individual
C ROG that reacted during the current time step (i.e., NPREC=10).
C The arrays of length = NPREC include:
C (1) "long" alkanes (ALKRXN)
C (2) low-yield aromatics, high-NOx pathway (XYLNRXN)
C (3) low-yield aromatics, low-NOx pathway (XYLHRXN)
C (4) high-yield aromatics, high-NOx pathway (TOLNRXN)
C (5) high-yield aromatics, low-NOx pathway (TOLHRXN)
C (6) benzene, high-NOx pathway (BNZNRXN)
C (7) benzene, low-NOx pathway (BNZHRXN)
C (8) monoterpenes (TRPRXN)
C (9) isoprene (ISOPRXN)
C (10) sesquiterpenes (SESQRXN)
C (11) PAHs/naphthalene, high-NOx pathway (PAHNRXN)
C (12) PAHs/naphthalene, low-NOx pathway (PAHHRXN)
C In total, 15 organic species are allowed to partition between the
C vapor and particulate phases (i.e., NCVAP=12). The arrays of
C length = NCVAP include:
C alkane (2 semi-volatile products)
C low-yield aromatics, high-NOx pathway (2 products)
C high-yield aromatics, high-NOx pathway (2 products)
C benzene, high-NOx pathway (2 products)
C monoterpenes (2 products)
C isoprene (2 products)
C sesquiterpenes (1 product)
C PAHs/naphthalene, high-NOx pathway (2 products)
C Equilibrium partitioning calculations are based on the absorptive
C partitioning model of Pankow (1994) that was extended by Odum et
C al. (1996). Saturation vapor pressures (cstar) and mass-based
C stoichiometric yield coefficients (alpha) are obtained from smog-
C chamber studies. Saturation vapor pressures are modified as a
C function of temperature using eqn 6 of Sheehan & Bowman (2001).
C If the pre-existing organic aerosol concentration is zero,
C gas/particle equilibrium is established only after the organic gas
C concentration reaches the threshold value defined in eqn 9 of
C Schell et al. (2001). Until this threshold value is reached,
C organic vapors do not partition to the particle phase. Once the
C organic gas/particle equilibrium has been established, gas and
C particle-phase concentrations of each condensible species are
C calculated iteratively using a globally convergent variation of
C Newton's method (SUBROUTINE NEWT), as described in eqn 8 of Schell
C et al. (2001).
C In addition to the various pathways of semi-volatile SOA formation
C treated in previous versions of the model, four types of non-
C volatile SOA are considered here:
C (1) aromatic and PAH-derived SOA under low-NOx conditions
C (2) oligomerization of all particle-phase semi-volatile material
C (3) SOA formed by in-cloud oxidation (SUBROUTINE AQCHEM)
C (4) isoprene IEPOX-derived SOA under acidic conditions (AEROSOL_CHEMISTRY)
C Previous code revision history:
C Originally coded August 1, 2001 by Dr. Francis S. Binkowski
C Revised April 4, 2003 by Gerald Gipson to allow for evaporation
C of organics from aerosols. Now total vapor + aerosol phase is
C repartitioned at each time step and totorgnv ( Mo ) does not
C include oldsoa.
C Revised July 14, 2003 by Dr. Prakash V. Bhave
C - changed cstar(2,3) from 10.103 & 90.925 to 111.11 & 1000.0
C because smog chamber data of Kalberer et al. were collected
C at 298 K (not 310 K, as was previously assumed)
C - changed mw_vap(9,10) from 184 g/mol to 177 g/mol, to be
C consistent with mwsoa_b
C - modified threshold criteria for establishing gas/particle
C equilibrium by removing the loose criterion involving "mtot"
C - changed variable names to reflect that the combined vapor +
C aerosol concentrations are now being repartitioned during
C each time step (not just the newly formed SVOC's)
C - added documentation and removed extraneous lines of code
C Revised December 4, 2003 by Dr. Francis S. Binkowski
C - output variables ORGRATE and ORGBRATE removed and replaced
C by SOA_A and SOA_B, the newly equilibrated values of
C Anthropogenic and Biogenic SOA, respectively. These are non-
C negative values.
C - variable jj also removed
C Revised January 8, 2004 by Dr. Prakash V. Bhave
C - removed the output variable YIELD. It has no physical meaning
C after the 12/04/2003 revisions.
C Revised January 12, 2004 by Dr. Chris G. Nolte
C - for computational efficiency, modified the initial caer guess
C used as input to NEWT. If NEWT returns check .eq. true, then
C NEWT is called again with a guess of caer = 0.5*ctot
C - removed ITS parameter from NEWT call vector
C - fixed bug where concentrations less than TOLMIN (i.e., 1.0E-12)
C were reset to 1.0e-30
C - removed extraneous code related to "Pandis method" of SVOC
C partitioning when threshold criterion is not met (i.e.,
C insufficient organic matter to establish gas/particle
C equilibrium) ** results unaffected by this change
C
C Revised September 7, 2007 by Dr. Sergey L. Napelenok
C - Replaced old SOA species (SOA_A, SOA_B) with an array of
C precursor-specific SOA species. Replaced OLDSOA_A and OLDSOA_B
C with an array (OLDSOA). Updated call vector accordingly.
C - Deleted nole* and nbio* variables (now obsolete)
C - Increased the dimension of several arrays to accommodate new
C SOA precursors (benzene, sesquiterpenes) and pathways (low-NOx,
C acid-catalyzed, oligomers, in-cloud)
C
C Revised November 29, 2007 by Dr. Prakash V. Bhave
C - Renamed subroutine from ORGAER3 to ORGAER5
C - Modified M2 and M3 calculations to account for the updated
C definition of DRY aerosol (which now includes non-volatile SOA)
C - Updated Hvap and corresponding cstar values
C - Added parameters for SOA from isoprene and sesquiterpenes
C - Updated aromatic SOA scheme to include semi-volatile and non-
C volatile products that form under high-NOx and low-NOx
C conditions, respectively
C - Added oligomerization process
C - Added enhancement of isoprene SOA under acidic conditions
C
C Revised June 2, 2008 by Dr. Prakash V. Bhave
C - Changed h_vap of benzene SOA to match that of toluene SOA, based
C on consultation with Dr. Ed Edney and Dr. Tad Kleindienst.
C Revised June 5, 2008 by Drs. Prakash Bhave and Sergey Napelenok
C - Simplified the code for conserving low-volatility isoprene
C oxidation products and removed a minor bug in the acid-induced
C isoprene SOA calculation.
C
C Revised September 9, 2008 by Dr. Prakash V. Bhave
C - Increased alpha values for SV_TRP1, SV_TRP2, and SV_SQT by a
C factor of 1.3 to correct for the implicit assumption of unit
C density in those SOA yield parameters.
C - Reduced SOA/SOC ratio of AISO1 and AISO2 from 2.5 to 1.6, and
C increased SOA/SOC ratio of AISO3 from 2.5 to 2.7. Accordingly,
C the molar masses of AISO1 and AISO2 were decreased to 96 g/mol
C and the molar mass of AISO3 was increased to 162.
C
C Revised September 26, 2014 by Dr. Havala Pye
C - Removed previous acid enhanced isoprene SOA. Acid catalyzed
C isoprene SOA now follows Pye et al. 2013 ES&T uptake of IEPOX.
C See AEROSOL_CHEMISTRY and mech.def for IEPOX SOA.
C - Allowed for alternate method to NEWT for solving partitioning
C equations
C References:
C 1. Edney, E.O., T.E. Kleindienst, M. Lewandowski, and J.H.
C Offenberg, Updated SOA chemical mechanism for the Community
C Multi-Scale Air Quality model, EPA 600/X-07/025, U.S. EPA,
C Research Triangle Park, NC, 2007.
C 2. Pankow, J. F., An absorption model of gas/particle partitioning
C of organic compounds in the atmosphere, Atmos. Environ., Vol 28,
C No 2, 185-188, 1994.
C 3. Odum, J. R., T. Hoffmann, F. Bowman, D. Collins, R. C. Flagan,
C and J. H. Seinfeld, Gas/particle partitioning and secondary
C organic aerosol yields, Environ. Sci. Technol., Vol 30, No 8,
C 2580-2585, 1996.
C 4. Sheehan, P. E. and F. M. Bowman, Estimated effects of temperature
C on secondary organic aerosol concentrations, Environ. Sci.
C Technol., Vol 35, No 11, 2129-2135, 2001.
C 5. Schell, B., I. J. Ackermann, H. Hass, F. S. Binkowski, and
C A. Abel, Modeling the formation of secondary organic aerosol
C within a comprehensive air quality modeling system, J. Geophys.
C Res., Vol 106, No D22, 28275-28293, 2001.
C 6. Strader, R., F. Lurmann, and S. N. Pandis, Evaluation of
C secondary organic aerosol formation in winter, Atmos. Environ.,
C Vol 33, 4849-4863, 1999.
C 7. Ng, N. L., J. H. Kroll, A. W. H. Chan, P. S. Chhabra, R. C.
C Flagan, and J. H. Seinfeld, Secondary organic aerosol formation
C from m-xylene, toluene, and benzene, Atmos. Chem. Phys., Vol 7,
C 3909-3922, 2007a.
C 8. Griffin, R. J., D. R. Cocker III, R. C. Flagan, and J. H.
C Seinfeld, Organic aerosol formation from the oxidation of
C biogenic hydrocarbons, J. Geophys. Res., Vol 104, No D3,
C 3555-3567, 1999.
C 9. Bian, F. and F. M. Bowman, Theoretical method for lumping
C multicomponent secondary organic aerosol mixtures, Environ.
C Sci. Technol., Vol 36, No 11, 2491-2497, 2002.
C 10. Offenberg, J. H., T. E. Kleindienst, M. Jaoui, M. Lewandowski,
C and E. O. Edney, Thermal properties of secondary organic
C aerosols, Geophys. Res. Lett., Vol 33, L03816, doi:10.1029/
C 2005GL024623, 2006.
C 11. Bahreini, R., M. D. Keywood, N. L. Ng, V. Varutbangkul, S. Gao,
C R. C. Flagan, J. H. Seinfeld, D. R. Worsnop, and J. L. Jimenez,
C Measurements of secondary organic aerosol from oxidation of
C cycloalkenes, terpenes, and m-xylene using an Aerodyne aerosol
C mass spectrometer, Environ. Sci. Technol., Vol 39, 5674-5688,
C 2005.
C 12. Alfarra, M. R., D. Paulsen, M. Gysel, A. A. Gaforth, J. Dommen,
C A. S. H. Prevot, D. R. Worsnop, U. Baltensperger, and H. Coe,
C A mass spectrometric study of secondary organic aerosols formed
C from the photooxidation of anthropogenic and biogenic precursors
C in a reaction chamber, Atmos. Chem. Phys., Vol 6, 5279-5293,
C 2006.
C 13. Ng, N. L., P. S. Chhabra, A. W. H. Chan, J. D. Surratt, J. H.
C Kroll, A. J. Kwan, D. C. McCabe, P. O. Wennberg, A. Sorooshian,
C S. M. Murphy, N. F. Dalleska, R. C. Flagan, and J. H. Seinfeld,
C Effect of NOx level on secondary organic aerosol (SOA) formation
C from the photooxidation of terpenes, Atmos. Chem. Phys., Vol 7,
C 5159-5174, 2007b.
C 14. Kostenidou, E., R. K. Pathak, and S. N. Pandis, An algorithm for
C the calculation of secondary organic aerosol density combining
C AMS and SMPS data, Aerosol Sci. Technol., Vol 41, 1002-1010,
C 2007.
C 15. Offenberg, J. H., C. W. Lewis, M. Lewandowski, M. Jaoui, T. E.
C Kleindienst, and E. O. Edney, Contributions of toluene and
C alpha-pinene to SOA formed in an irradiated toluene/alpha-pinene/
C NOx/air mixture: comparison of results using 14C content and SOA
C organic tracer methods, Environ. Sci. Technol., Vol 41, 3972-
C 3976, 2007.
C 16. Henze, D. K. and J. H. Seinfeld, Global secondary organic aerosol
C from isoprene oxidation, Geophys. Res. Lett., Vol 33, L09812,
C doi:10.1029/2006GL025976, 2006.
C 17. Kleindienst, T. E., M. Jaoui, M. Lewandowski, J. H. Offenberg,
C C. W. Lewis, P. V. Bhave, and E. O. Edney, Estimates of the
C contributions of biogenic and anthropogenic hydrocarbons to
C secondary organic aerosol at a southeastern US location, Atmos.
C Environ., Vol 41, 8288-8300, 2007.
C 18. Kalberer, M., D. Paulsen, M. Sax, M. Steinbacher, J. Dommen,
C A. S. H. Prevot, R. Fisseha, E. Weingartner, V. Frankevich,
C R. Zenobi, and U. Baltensperger, Identification of polymers as
C major components of atmospheric organic aerosols, Science, Vol
C 303, 1659-1662, 2004.
C 19. Turpin, B. J. and H.-J. Lim, Species contributions to PM2.5 mass
C concentrations: revisiting common assumptions for estimating
C organic mass, Aero. Sci. Technol., Vol 35, 602-610, 2001.
C 20. Surratt, J. D., M. Lewandowski, J. H. Offenberg, M. Jaoui, T. E.
C Kleindienst, E. O. Edney, and J. H. Seinfeld, Effect of acidity
C on secondary organic aerosol formation from isoprene, Environ.
C Sci. Technol., Vol 41, 5363-5369, 2007.
C 21. Pye et al., Epoxide pathways improve model prediction of isoprene
C markers and reveal key role of acidity in aerosol formation,
C Environ. Sci. Technol., 2013.
C Revision History:
C First orgaer version was coded in April 2010 by Steve Howard with
C Prakash Bhave, Jeff Young, and Sergey Napelenok.
C
C SH 03/10/11 Renamed met_data to aeromet_data
C SR 03/25/11 Replaced I/O API include files with UTILIO_DEFN
C HOTP 05Aug15 Made the calculation for total number of organic moles more robust
C BNM 11/09/15 Added Some Comments to the SOA Scheme
C HOTP 7/17/18 Added uptake of water onto hydrophillic organics
C-----------------------------------------------------------------------
C Key Subroutines/Functions called: newt, soabisection
Use aero_data
Use aeromet_data
Use utilio_defn
Implicit None
! Arguments:
Real :: dt ! Synchronization time step [ s ]
Integer :: layer ! model layer number
! Local variables:
Logical, Save :: first_time = .True.
Logical, Save :: solve_orgmoles = .True.
Character( 300 ) :: xmsg
Integer :: i, im, indx, ispc, n, nsvol
Integer, Save :: nsvol_tracers
Integer, Save :: nsvol_Nottracers
Real, Allocatable, Save :: mw_inv( : ) ! Inverse MW of SVOCs [ mol/g ]
Real, Allocatable, Save :: rog_ppm2ug( : ) ! [ ppm per ug/m3 ] for ORGPROD at
! reference temperature and pressure
! Parameters & variables for adjusting cstar to ambient conditions
Real, Parameter :: tref = 298.0 ! reference temperature [ K ]
Real, Parameter :: trefm1 = 1.0 / tref ! inverse of reference temperature
Real, Parameter :: prefm1 = 1.0 / stdatmpa ! inverse of reference pressure
Real, Parameter :: rgas1 = 1.0 / rgasuniv ! reciprocal of universal gas constant
Real, Parameter :: kolig = 0.69314718 / 72000.0 ! 20h half-life of oligomerization rate [ 1/s ]
Real, Parameter :: olgrat = 2.1 ! SOA/SOC ratio for oligomers
Real, Parameter :: kacid = 0.00361 ! acid-induced enhancement factor
Real, Parameter :: threshmin = 1.0E-19 ! small positive number
Real, Parameter :: ctolmin = 1.0E-06
Real, Parameter :: convfac_298 = 101325.0 * rgas1 * trefm1 ! P/RT at 1 atm and 298 K [ mole/m**3 ]
Real, Parameter :: difforg = 9.36e-6 ! Diffusivity of organics [m2 s-1]
Real, Parameter :: alphorg = 1.0 ! accomodation coefficient
Real convfac
Real tt1, tt2 ! temperature-related factors
Real tempcorr ! temperature correction factor for cstar
! Variables used in oligomerization calculations
Real expdt ! non-dimensional loss coefficient
Real nsvpa ! particle-phase anthropogenic SVOC [ umolC/m3 ]
Real nsvpb ! particle-phase biogenic SVOC [ umolC/m3 ]
! Variables used in acid-enhanced isoprene SOA calculations
Real hplus ! accumulation-mode H+ conc [ nmol/m3 ]
Real aiso12 ! particle-phase isoprene SVOC [ ug/m3 ]
Real vviso ! vapor-phase isoprene SVOC [ ug/m3 ]
Real xiso3 ! newly produced AISO3J [ ug/m3 ]
Real isofrac ! ratio for depletion of vapor-phase products
! Variables used in equilibrium partitioning calculations
Real totrog( n_oa ) ! drog conc mapped to each SVOC [ ug/m3 ]
Real(8) GRtmp( n_mode ) ! Dummy variable for accurate treatment of growth to specific moment
Real GR3( n_oa,n_mode ) ! 3rd Moment Growth for each mode and compound
Real GR3FRAC( n_oa,n_mode ) ! Fraction of each mode growing/shrinking
Real dcaer ! Change in SVOC conc after partitioning happens[ ug/m3 ]
Real cbar_org(n_oa) ! On-line molecular speed of each organic
Real dv_org ! On-line gas-phase diffusivity of each organic
Real totorgnv ! Non-volatile OA [ umole/m3 ]
Real totorg ! SOA + POA before time step [ umole/m3 ]
Real threshold ! criterion for establishing gas/part equil.
Real faer ! fraction of total in aerosol, intermediate value
Logical check ! flag to indicate if NEWT subroutine
! converged to a spurious root
Real totaer ! total aerosol-phase mass of each semivolaitle component
Real Phi ! mass fraction of a semivolatile component
! in each mode
Character(16), Allocatable, Save :: svname( : )
Real, Allocatable, Save :: svmw( : ), svmw_inv( : )
Real, Allocatable, Save :: c0 ( : ) ! cstar at AIRTEMP [ ug/m3 ]
Real, Allocatable, Save :: caer0 ( : ) ! Particle conc before current time step [ ug/m3 ]
Real, Allocatable, Save :: ctoti ( : ) ! Total (g+p) conc before current time step [ ug/m3 ]
Real, Allocatable, Save :: prod ( : ) ! Total G+P produced during current step [ ug/m3 ]
Real, Allocatable, Save :: ctotf ( : ) ! Total conc after current time step [ ug/m3 ]
Real, Allocatable, Save :: caer ( : ) ! Particle conc in aerosol phase after current
! step [ ug/m3 ]
! Variables for computing the budget
REAL :: CBUDGET0_NUM ( N_MODE )
REAL :: CBUDGET0_SRF ( N_MODE )
REAL :: CBUDGET0_MASS( N_AEROSPC,N_MODE )
REAL :: CBUDGET0_VAP ( N_OA )
! Variables for water uptake onto organics
Real kappaVorg ! sum_i(kappa_i*Vorganic_i) [m3 species/m3 air]
Real overallkappa ! sum_i(kappa_i*Vorganic_i)/vtot [NA units]
Real totvol ! total aerosol volume [m3 species/m3 air]
Real poa ! nonvolatile poa concentration [ug/m3]