Skip to content

Commit 90d7fbf

Browse files
committed
STY: Move e- temp functions to ions.h, other cleanup
1 parent 3de1996 commit 90d7fbf

File tree

2 files changed

+92
-90
lines changed

2 files changed

+92
-90
lines changed

include/ions.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,70 @@ class Ions {
352352
**/
353353
void calc_electron_temperature(Neutrals neutrals, Grid grid, Times time);
354354

355+
/**********************************************************************
356+
/// @brief Calculate epsilon
357+
/// @details intermediate variable used in photoelectron & ionization heating
358+
/// From (Smithro & Solomon, 2008).
359+
/// @param neutrals
360+
/// @param ions
361+
/// @return epsilon
362+
**/
363+
arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions);
364+
365+
/**********************************************************************
366+
\brief Calculates photoelectron heating
367+
\details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008)
368+
Uses equations 9-12 from (Zhu & Ridley, 2016)
369+
https://doi.org/10.1016/j.jastp.2016.01.005
370+
\param ions
371+
\param epsilon
372+
\return Qphe
373+
**/
374+
arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon);
375+
376+
/**********************************************************************
377+
\brief Calculates auroral heating
378+
\details NOTE: in GITM this is solved separately for ion precipitation & auroral
379+
ionization. In Aether these are both in ions.species[iIon].ionization_scgc...
380+
\param ions
381+
\param epsilon
382+
\return Qaurora
383+
**/
384+
arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon);
385+
386+
/**********************************************************************
387+
\brief Calculates electron-ion (elastic) collisional heating
388+
\details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003
389+
- This differs slightly from the GITM implementation, which assumes several ion species are present.
390+
Instead, here we use each ion species for the sum.
391+
- electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5
392+
- This is capable of handling BOTH the bulk & individual ion temperatures
393+
\param ions
394+
\return vector<Qeicp, Qeicm, Qeic_v>
395+
**/
396+
std::vector<arma_cube> calc_electron_ion_collisions(Ions &ions);
397+
398+
/**********************************************************************
399+
\brief Calculates electron-neutral elastic collisional heating
400+
\details From Schunk and Nagy 2009
401+
\param ions
402+
\param neutrals
403+
\return vector<Qencp, Qencm, Qenc_v>
404+
**/
405+
std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals);
406+
407+
/**********************************************************************
408+
\brief Calculates the electron-neutral inelastic collisional heating
409+
\details From Schunk and Nagy 2009 pages 277, 282.
410+
This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration.
411+
See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005
412+
\param ions
413+
\param neutrals
414+
\return vector<Qencp, Qencm, Qenc_v>
415+
**/
416+
std::vector<arma_cube> calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals);
417+
418+
355419
/**********************************************************************
356420
\brief Check all of the variables for nonfinites, such as nans
357421
\param none

src/calc_electron_temperature.cpp

Lines changed: 28 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -3,81 +3,6 @@
33

44
#include "../include/aether.h"
55

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-
816

827
// --------------------------------------------------------------------------
838
// 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) {
10530
arma_cube Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2;
10631

10732
// Thermoelectric Current
108-
arma_cube JParaAlt;
33+
arma_mat JParallel;
10934

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();
11139

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);
11342
epsilon.zeros();
11443
Qphe = epsilon;
11544
QIonization = epsilon;
@@ -119,8 +48,16 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
11948
Qencm = epsilon;
12049
Qencp = epsilon;
12150
Qenc_v = epsilon;
51+
Qrotm = epsilon;
52+
Qrotp = epsilon;
53+
Qf = epsilon;
54+
Qexc = epsilon;
55+
Qvib_O2 = epsilon;
56+
Qvib_N2 = epsilon;
12257

12358
report.print(4, "Calculating epsilon");
59+
60+
// ============= ADD SOURCES =================
12461

12562

12663
// Needed for both ionization & photoelectron heating:
@@ -152,7 +89,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
15289
Qeic_v = Qeic[2]; // Friction
15390
}
15491

155-
report.print(4, "Calculating electron-neutral collisions");
92+
report.print(4, "Calculating electron-neutral elastic collisions");
15693

15794
// electron-neutral Elastic collisions
15895
if (input.get_do_electron_neutral_elastic_collisional_heating()) {
@@ -185,7 +122,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) {
185122

186123
// Since this is used a few times, calculate it separately & pass it to the functions.
187124
// From (Smithro and Solomon, 2008)
188-
arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) {
125+
arma_cube Ions::calc_epsilon(Neutrals &neutrals, Ions &ions) {
189126

190127
std::string function = "calc_epsilon";
191128
static int iFunction = -1;
@@ -224,7 +161,7 @@ arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) {
224161
// --------------------------------------------------------------------------
225162
// Calculate photoelectron heating
226163
// --------------------------------------------------------------------------
227-
arma_cube calc_photoelectron_heating(Ions &ions,
164+
arma_cube Ions::calc_photoelectron_heating(Ions &ions,
228165
arma_cube epsilon) {
229166

230167
std::string function = "calc_photoelectron_heating";
@@ -254,7 +191,7 @@ arma_cube calc_photoelectron_heating(Ions &ions,
254191
// --------------------------------------------------------------------------
255192
// Calculate ionization heating
256193
// --------------------------------------------------------------------------
257-
arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){
194+
arma_cube Ions::calc_ionization_heating(Ions &ions, arma_cube epsilon){
258195

259196
std::string function = "calc_ionization_heating";
260197
static int iFunction = -1;
@@ -281,7 +218,7 @@ arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){
281218
// --------------------------------------------------------------------------
282219
// Calculate electron-ion collisions
283220
// --------------------------------------------------------------------------
284-
std::vector<arma_cube> calc_electron_ion_collisions(Ions &ions){
221+
std::vector<arma_cube> Ions::calc_electron_ion_collisions(Ions &ions){
285222

286223
std::string function = "calc_electron_ion_collisions";
287224
static int iFunction = -1;
@@ -346,7 +283,7 @@ std::vector<arma_cube> calc_electron_ion_collisions(Ions &ions){
346283
// --------------------------------------------------------------------------
347284
// Calculate electron-neutral elastic collisions
348285
// --------------------------------------------------------------------------
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){
350287

351288
std::string function = "calc_electron_neutral_elastic_collisions";
352289
static int iFunction = -1;
@@ -381,7 +318,7 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
381318
% (1 + 5.70e-4 * ions.electron_temperature_scgc)
382319
% pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass))
383320
);
384-
321+
report.print(6, "Qenc done");
385322
Qencp = ions.density_scgc * cME * 3.0 * cKB
386323
% ((2.33e-11*neutrals.species[inN2].density_scgc*1.e-6
387324
% (1 - 1.21e-4*ions.electron_temperature_scgc)
@@ -393,12 +330,13 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
393330
% (1 + 5.70e-4*ions.electron_temperature_scgc)
394331
% pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass))
395332
);
333+
report.print(6, "Qencp done");
396334

397335
// delta velocity **2 btwn e- & neutrals:
398336
for (int64_t iDir = 0; iDir < 3; iDir++) {
399337
dv2_en += pow(neutrals.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2);
400338
}
401-
339+
report.print(6, "dv2 done");
402340

403341
Qenc_v = ions.density_scgc * cME % dv2_en
404342
%(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
411349
%pow(ions.electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass)
412350
);
413351

352+
report.print(6, "Qencv done");
414353

415354
Qencm = Qencp % neutrals.temperature_scgc;
416355

@@ -422,7 +361,7 @@ std::vector<arma_cube> calc_electron_neutral_elastic_collisions(Ions &ions, Neut
422361
// --------------------------------------------------------------------------
423362
// Calculate electron-neutral inelasticcollisions
424363
// --------------------------------------------------------------------------
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){
426365

427366
std::string function = "calc_electron_neutral_inelastic_collisions";
428367
static int iFunction = -1;
@@ -508,11 +447,10 @@ std::vector<arma_cube> calc_electron_neutral_inelastic_collisions(Ions &ions, Ne
508447
+ 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4)
509448
+ 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2)
510449
+ 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
512451
// Mask the values outside of this range...
513-
// TODO: Should we do it this way or just use the clamp?
514452
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);
516454

517455

518456
Qvib_O2 = ne % no2 * 1.e-12 % exp10(logQ) % (1 - exp(2239. * (1. / Te - 1. / Tn)));

0 commit comments

Comments
 (0)