3
3
4
4
#include " ../include/aether.h"
5
5
6
- // / @brief Calculate epsilon
7
- // / @details intermediate variable used in photoelectron & ionization heating
8
- // / From (Smithro & Solomon, 2008).
9
- // / @param neutrals
10
- // / @param ions
11
- // / @return epsilon
12
- arma_cube calc_epsilon (Neutrals &neutrals, Ions &ions);
13
-
14
-
15
- // / @brief Calculates photoelectron heating
16
- // / @details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008)
17
- // /
18
- // / Uses equations 9-12 from (Zhu & Ridley, 2016)
19
- // / https://doi.org/10.1016/j.jastp.2016.01.005
20
- // /
21
- // / @param ions
22
- // / @param epsilon
23
- // / @return Qphe
24
- arma_cube calc_photoelectron_heating (Ions &ions, arma_cube epsilon);
25
-
26
-
27
- // / @brief Calculates auroral heating
28
- // / @details NOTE: in GITM this is solved separately for ion precipitation & auroral
29
- // / ionization. In Aether these are both in ions.species[iIon].ionization_scgc...
30
- // / @param ions
31
- // / @param epsilon
32
- // / @return Qaurora
33
- arma_cube calc_ionization_heating (Ions &ions, arma_cube epsilon);
34
-
35
-
36
- // / @brief Calculates electron-ion (elastic) collisional heating
37
- // / @details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003
38
- // / - This differs slightly from the GITM implementation, which assumes several ion species are present.
39
- // / Instead, here we use each ion species for the sum.
40
- // / - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5
41
- // / - This is capable of handling BOTH the bulk & individual ion temperatures
42
- // / @param ions
43
- // / @return vector<Qeicp, Qeicm, Qeic_v>
44
- std::vector<arma_cube> calc_electron_ion_collisions (Ions &ions);
45
-
46
-
47
- // / @brief Calculates electron-neutral elastic collisional heating
48
- // / @details From Schunk and Nagy 2009
49
- // / @param ions
50
- // / @param neutrals
51
- // / @return vector<Qencp, Qencm, Qenc_v>
52
- std::vector<arma_cube> calc_electron_neutral_elastic_collisions (Ions &ions, Neutrals &neutrals);
53
-
54
- // / @brief Calculates electron-neutral inelastic collisional heating
55
- // / @details From Schunk and Nagy 2009 pages 277, 282.
56
- // / This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration.
57
- // / See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005
58
- // / @param ions
59
- // / @param neutrals
60
- // / @return vector<Qencp, Qencm, Qenc_v>
61
- std::vector<arma_cube> calc_electron_neutral_inelastic_collisions (Ions &ions, Neutrals &neutrals);
62
-
63
- // / @brief Calculate the thermoelectric current
64
- // / @param ions
65
- // / @param grid
66
- // / @return arma_cube JParaAlt
67
- std::vector<arma_cube> calc_thermoelectric_current (Ions &ions, Grid &grid);
68
-
69
-
70
- // --------------------------------------------------------------------------
71
- // Heating terms:
72
- // - [x] photoelectrons
73
- // - [x] auroral ionization (from ion precipitation & auroral ionization)
74
- // - [x] e- ion collisions
75
- // - [ ] e- neutral collisions (elastic & inelastic)
76
- // - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation)
77
- // --------------------------------------------------------------------------
78
-
79
-
80
-
81
6
82
7
// --------------------------------------------------------------------------
83
8
// TODO (#24): this currently just sets the electron temperature to the neutral temperature
@@ -105,11 +30,15 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
105
30
arma_cube Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2;
106
31
107
32
// Thermoelectric Current
108
- arma_cube JParaAlt ;
33
+ arma_mat JParallel ;
109
34
110
- // Initialize everything to zero!
35
+ int64_t nLons = grid.get_nLons ();
36
+ int64_t nLats = grid.get_nLats ();
37
+ int64_t nAlts = grid.get_nAlts ();
38
+ int64_t nGCs = grid.get_nGCs ();
111
39
112
- epsilon.set_size (grid.get_nLons (), grid.get_nLats (), grid.get_nAlts ());
40
+ // Initialize everything to zero!
41
+ epsilon.set_size (nLons, nLats, nAlts);
113
42
epsilon.zeros ();
114
43
Qphe = epsilon;
115
44
QIonization = epsilon;
@@ -119,8 +48,16 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
119
48
Qencm = epsilon;
120
49
Qencp = epsilon;
121
50
Qenc_v = epsilon;
51
+ Qrotm = epsilon;
52
+ Qrotp = epsilon;
53
+ Qf = epsilon;
54
+ Qexc = epsilon;
55
+ Qvib_O2 = epsilon;
56
+ Qvib_N2 = epsilon;
122
57
123
58
report.print (4 , " Calculating epsilon" );
59
+
60
+ // ============= ADD SOURCES =================
124
61
125
62
126
63
// Needed for both ionization & photoelectron heating:
@@ -152,7 +89,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
152
89
Qeic_v = Qeic[2 ]; // Friction
153
90
}
154
91
155
- report.print (4 , " Calculating electron-neutral collisions" );
92
+ report.print (4 , " Calculating electron-neutral elastic collisions" );
156
93
157
94
// electron-neutral Elastic collisions
158
95
if (input.get_do_electron_neutral_elastic_collisional_heating ()) {
@@ -185,7 +122,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
185
122
186
123
// Since this is used a few times, calculate it separately & pass it to the functions.
187
124
// From (Smithro and Solomon, 2008)
188
- arma_cube calc_epsilon (Neutrals &neutrals, Ions &ions) {
125
+ arma_cube Ions:: calc_epsilon (Neutrals &neutrals, Ions &ions) {
189
126
190
127
std::string function = " calc_epsilon" ;
191
128
static int iFunction = -1 ;
@@ -224,7 +161,7 @@ arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) {
224
161
// --------------------------------------------------------------------------
225
162
// Calculate photoelectron heating
226
163
// --------------------------------------------------------------------------
227
- arma_cube calc_photoelectron_heating (Ions &ions,
164
+ arma_cube Ions:: calc_photoelectron_heating (Ions &ions,
228
165
arma_cube epsilon) {
229
166
230
167
std::string function = " calc_photoelectron_heating" ;
@@ -254,7 +191,7 @@ arma_cube calc_photoelectron_heating(Ions &ions,
254
191
// --------------------------------------------------------------------------
255
192
// Calculate ionization heating
256
193
// --------------------------------------------------------------------------
257
- arma_cube calc_ionization_heating (Ions &ions, arma_cube epsilon){
194
+ arma_cube Ions:: calc_ionization_heating (Ions &ions, arma_cube epsilon){
258
195
259
196
std::string function = " calc_ionization_heating" ;
260
197
static int iFunction = -1 ;
@@ -281,7 +218,7 @@ arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){
281
218
// --------------------------------------------------------------------------
282
219
// Calculate electron-ion collisions
283
220
// --------------------------------------------------------------------------
284
- std::vector<arma_cube> calc_electron_ion_collisions (Ions &ions){
221
+ std::vector<arma_cube> Ions:: calc_electron_ion_collisions (Ions &ions){
285
222
286
223
std::string function = " calc_electron_ion_collisions" ;
287
224
static int iFunction = -1 ;
@@ -346,7 +283,7 @@ std::vector<arma_cube> calc_electron_ion_collisions(Ions &ions){
346
283
// --------------------------------------------------------------------------
347
284
// Calculate electron-neutral elastic collisions
348
285
// --------------------------------------------------------------------------
349
- std::vector<arma_cube> calc_electron_neutral_elastic_collisions (Ions &ions, Neutrals &neutrals){
286
+ std::vector<arma_cube> Ions:: calc_electron_neutral_elastic_collisions (Ions &ions, Neutrals &neutrals){
350
287
351
288
std::string function = " calc_electron_neutral_elastic_collisions" ;
352
289
static int iFunction = -1 ;
@@ -381,7 +318,7 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
381
318
% (1 + 5.70e-4 * ions.electron_temperature_scgc )
382
319
% pow (ions.electron_temperature_scgc , 0.5 )/(cME + neutrals.species [inO].mass ))
383
320
);
384
-
321
+ report. print ( 6 , " Qenc done " );
385
322
Qencp = ions.density_scgc * cME * 3.0 * cKB
386
323
% ((2.33e-11 *neutrals.species [inN2].density_scgc *1 .e -6
387
324
% (1 - 1.21e-4 *ions.electron_temperature_scgc )
@@ -393,12 +330,13 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
393
330
% (1 + 5.70e-4 *ions.electron_temperature_scgc )
394
331
% pow (ions.electron_temperature_scgc , 0.5 )/(cME + neutrals.species [inO].mass ))
395
332
);
333
+ report.print (6 , " Qencp done" );
396
334
397
335
// delta velocity **2 btwn e- & neutrals:
398
336
for (int64_t iDir = 0 ; iDir < 3 ; iDir++) {
399
337
dv2_en += pow (neutrals.velocity_vcgc [iDir] - ions.exb_vcgc [iDir], 2 );
400
338
}
401
-
339
+ report. print ( 6 , " dv2 done " );
402
340
403
341
Qenc_v = ions.density_scgc * cME % dv2_en
404
342
%(2.33e-11 * neutrals.species [inN2].density_scgc * 1 .e -6
@@ -411,6 +349,7 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
411
349
%pow (ions.electron_temperature_scgc ,0.5 )*neutrals.species [inO2].mass /(cME + neutrals.species [inO2].mass )
412
350
);
413
351
352
+ report.print (6 , " Qencv done" );
414
353
415
354
Qencm = Qencp % neutrals.temperature_scgc ;
416
355
@@ -422,7 +361,7 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
422
361
// --------------------------------------------------------------------------
423
362
// Calculate electron-neutral inelasticcollisions
424
363
// --------------------------------------------------------------------------
425
- std::vector<arma_cube> calc_electron_neutral_inelastic_collisions (Ions &ions, Neutrals &neutrals){
364
+ std::vector<arma_cube> Ions:: calc_electron_neutral_inelastic_collisions (Ions &ions, Neutrals &neutrals){
426
365
427
366
std::string function = " calc_electron_neutral_inelastic_collisions" ;
428
367
static int iFunction = -1 ;
@@ -508,11 +447,10 @@ std::vector<arma_cube> calc_electron_neutral_inelastic_collisions(Ions &ions, Ne
508
447
+ 6.6865e-15 *pow (Te,5 ) - 1.9228e-11 *pow (Te,4 )
509
448
+ 3.5187e-8 *pow (Te,3 ) - 3.996e-5 *pow (Te,2 )
510
449
+ 0.0267 *Te - 19.9171 );
511
- // GITM's Te_6000 was from 300 - 6000, which corresponds to ~-15.9 & 198.3 for logQ
450
+ // GITM's Te_6000 was used when 300<T< 6000, which corresponds to ~-15.9 & 198.3 for logQ
512
451
// Mask the values outside of this range...
513
- // TODO: Should we do it this way or just use the clamp?
514
452
logQ.clamp (-15.9 , 198.273 );
515
- logQ.elem ( find (logQ < -15.9 ) ).fill (-20.0 );
453
+ logQ.elem ( find (logQ <= -15.9 ) ).fill (-20.0 );
516
454
517
455
518
456
Qvib_O2 = ne % no2 * 1 .e -12 % exp10 (logQ) % (1 - exp (2239 . * (1 . / Te - 1 . / Tn)));
0 commit comments