From 9ebe1c7f3a4b2eadbb454c660474b028a53c725b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:03:19 -0500 Subject: [PATCH 001/691] FEAT: use bulk winds --- include/inputs.h | 1 + src/inputs.cpp | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/include/inputs.h b/include/inputs.h index 7c1d94fc..4f0d9df8 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -81,6 +81,7 @@ class Inputs { json get_boundary_condition_types(); std::string get_advection_neutrals_vertical(); + bool get_advection_neutrals_bulkwinds(); // ------------------------------ // Grid inputs: diff --git a/src/inputs.cpp b/src/inputs.cpp index 2e46c892..137dabd8 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -1084,6 +1084,11 @@ std::string Inputs::get_advection_neutrals_vertical() { return get_setting_str("Advection", "Neutrals", "Vertical"); } +bool Inputs::get_advection_neutrals_bulkwinds() { + return get_setting_bool("Advection", "Neutrals", "useBulkWinds"); +} + + // -------------------------------------------------------------------------- // check to see if class is ok // -------------------------------------------------------------------------- From 8769836c00285f4b054fe4143a8fd2620a60f0b2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:04:41 -0500 Subject: [PATCH 002/691] FEAT: include mean major mass for ions --- include/ions.h | 2 ++ src/ions.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/include/ions.h b/include/ions.h index 17a0adea..e3f20266 100644 --- a/include/ions.h +++ b/include/ions.h @@ -57,6 +57,8 @@ class Ions { arma_cube temperature_scgc; arma_cube conduction_scgc; arma_cube electron_temperature_scgc; + arma_cube rho_scgc; + arma_cube mean_major_mass_scgc; // This is the vector that will contain all of the different species: std::vector species; diff --git a/src/ions.cpp b/src/ions.cpp index 3229fb09..492d820f 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -96,6 +96,10 @@ Ions::Ions(Grid grid, Planets planet) { electron_temperature_scgc.set_size(nLons, nLats, nAlts); electron_temperature_scgc.fill(200); + rho_scgc.set_size(nLons, nLats, nAlts); + mean_major_mass_scgc.set_size(nLons, nLats, nAlts); + mean_major_mass_scgc.ones(); + tmp.sources_scgc.set_size(nLons, nLats, nAlts); tmp.sources_scgc.zeros(); tmp.losses_scgc.set_size(nLons, nLats, nAlts); @@ -247,12 +251,16 @@ void Ions::fill_electrons() { report.enter(function, iFunction); species[nSpecies].density_scgc.zeros(); + rho_scgc.zeros(); - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[nSpecies].density_scgc = species[nSpecies].density_scgc + species[iSpecies].density_scgc; - + rho_scgc = rho_scgc + + species[iSpecies].mass * species[iSpecies].density_scgc; + } density_scgc = species[nSpecies].density_scgc; + mean_major_mass_scgc = rho_scgc / density_scgc; report.exit(function); return; From 88a4b5e1c990e5cea88256a007aacaa7b9d7830d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:07:01 -0500 Subject: [PATCH 003/691] FEAT: ion neutral collisions + heating --- include/neutrals.h | 15 +++++++++++++-- src/neutrals.cpp | 13 +++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index be0c0a01..c2ed17cb 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -183,6 +183,9 @@ class Neutrals { // Source terms: + // Bulk acceleration due to collisions with ions: + std::vector acc_ion_collisions; + /// Bulk neutral thermal conduction temperature change rate (K/s) arma_cube conduction_scgc; @@ -192,6 +195,12 @@ class Neutrals { /// Bulk neutral chemical heating temperatuare change (K/s) arma_cube heating_chemical_scgc; + // Bulk neutral collisional heating with ions (K/s) + arma_cube heating_ion_collisions_scgc; + + // Total heating sources + arma_cube heating_sources_total; + /// Nuetral gas direct absorption heating efficiency (~5%) precision_t heating_efficiency; @@ -349,7 +358,7 @@ class Neutrals { \param grid The grid to define the neutrals on \param time The times within the model (dt is needed) **/ - void calc_conduction(Grid grid, Times time); + void update_temperature(Grid grid, Times time); /********************************************************************** \brief Calculate the O radiative cooling @@ -364,8 +373,10 @@ class Neutrals { /********************************************************************** \brief Add all of the neutral source terms to each of the equations \param time The times within the model (dt is needed) + \param planet Need things like rotation rate + \param grid Need things like radius **/ - void add_sources(Times time); + void add_sources(Times time, Planets planet, Grid grid); /********************************************************************** \brief Set boundary conditions for the neutrals diff --git a/src/neutrals.cpp b/src/neutrals.cpp index cf1e0bbf..6e51af60 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -135,9 +135,15 @@ Neutrals::Neutrals(Grid grid, conduction_scgc.set_size(nLons, nLats, nAlts); heating_euv_scgc.set_size(nLons, nLats, nAlts); heating_chemical_scgc.set_size(nLons, nLats, nAlts); + heating_sources_total.set_size(nLons, nLats, nAlts); + heating_sources_total.zeros(); heating_efficiency = input.get_euv_heating_eff_neutrals(); + // bulk ion_neutral collisional acceleration: + acc_ion_collisions = make_cube_vector(nLons, nLats, nAlts, 3); + + // This gets a bunch of the species-dependent characteristics: iErr = read_planet_file(planet); @@ -201,15 +207,18 @@ int Neutrals::read_planet_file(Planets planet) { } //---------------------------------------------------------------------- -// Fill With Hydrostatic Solution (all species) +// Fill With Hydrostatic Solution (all ADVECTED species) // - iEnd is NOT included (python style)! +// - only do advected, since others are probably chemistry dominated //---------------------------------------------------------------------- void Neutrals::fill_with_hydrostatic(int64_t iStart, int64_t iEnd, Grid grid) { - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + int64_t iNeutral, iSpecies; + for (iNeutral = 0; iNeutral < nSpeciesAdvect; iNeutral++) { + iSpecies = species_to_advect[iNeutral]; // Integrate with hydrostatic equilibrium up: for (int iAlt = iStart; iAlt < iEnd; iAlt++) { species[iSpecies].density_scgc.slice(iAlt) = From 5a2c28a29a03266c31d110eb153b535d73eaba13 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:07:51 -0500 Subject: [PATCH 004/691] FEAT: neutral/ion collisional heating --- src/neutral_ion_collisions.cpp | 95 +++++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 14 deletions(-) diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index bed85aae..fb98dc98 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -14,34 +14,101 @@ void calc_ion_collisions(Neutrals &neutrals, int64_t nY = neutrals.density_scgc.n_cols; int64_t nZ = neutrals.density_scgc.n_slices; int64_t nSpecies = neutrals.nSpecies, iSpecies; - int64_t iDir, iIon, iNeutral; + int64_t iDir, iIon, iIon_, iNeutral, iNeutral_; arma_cube rho_n(nX, nY, nZ); arma_cube rho_i(nX, nY, nZ); arma_cube rho_sum(nX, nY, nZ); + + // energy is the total energy transfered from ions to neutrals + arma_cube energy(nX, nY, nZ); + // beta is the sum of the collision frequencies * mass density of ions + arma_cube beta(nX, nY, nZ); + // velocity difference between ions and neutrals + arma_cube vDiff(nX, nY, nZ); + // momentum so we can divide by the mass density later + std::vector momentum; + momentum = make_cube_vector(nX, nY, nZ, 3); - // Calculate acceleration due to ion drag. Based on Formula 4.124b in Ionospheres text. - for (iNeutral = 0; iNeutral < neutrals.nSpeciesAdvect; iNeutral++) { - Neutrals::species_chars & advected_neutral = - neutrals.species[neutrals.species_to_advect[iNeutral]]; - rho_n = advected_neutral.mass * advected_neutral.density_scgc; + beta.zeros(); + // If we are using the bulk (horizontal, primarily) neutral winds + // then approximate some of the collisional quantities + + if (input.get_advection_neutrals_bulkwinds()) { + for (iIon = 0; iIon < ions.nSpeciesAdvect; iIon++) { + iIon_ = ions.species_to_advect[iIon]; + Ions::species_chars & advected_ion = ions.species[iIon_]; + rho_i = advected_ion.mass * advected_ion.density_scgc; + for (iNeutral = 0; iNeutral < neutrals.nSpeciesAdvect; iNeutral++) { + iNeutral_ = neutrals.species_to_advect[iNeutral]; + beta = beta + rho_i % advected_ion.nu_ion_neutral_vcgc[iNeutral_]; + } + } + + // Now use the bulk quantities for the collisions + // (beta is included in the last step) + // heat transfer between ions and neutrals: + energy = 3 * cKB / ions.mean_major_mass_scgc % + (ions.temperature_scgc - neutrals.temperature_scgc); for (iDir = 0; iDir < 3; iDir++) { - rho_sum.zeros(); + // need the velocity difference for momentum and energy eqns: + vDiff = (ions.velocity_vcgc[iDir] - neutrals.velocity_vcgc[iDir]); + // ion - neutral drag (acceleration): + neutrals.acc_ion_collisions[iDir] = + beta / neutrals.rho_scgc % vDiff; + // Frictional heating between ions and neutrals: + energy = energy + vDiff % vDiff; + } + // multiply by collision frequencies and convert + // energy change to temperature change: + neutrals.heating_ion_collisions_scgc = + beta % energy / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); + } else { + energy.zeros(); + + // Calculate acceleration due to ion drag. Based on Formula 4.124b in Ionospheres text. + for (iNeutral = 0; iNeutral < neutrals.nSpeciesAdvect; iNeutral++) { + Neutrals::species_chars & advected_neutral = + neutrals.species[neutrals.species_to_advect[iNeutral]]; + rho_n = advected_neutral.mass * advected_neutral.density_scgc; + + for (iDir = 0; iDir < 3; iDir++) + momentum[iDir].zeros(); for (iIon = 0; iIon < ions.nSpeciesAdvect; iIon++) { Ions::species_chars & advected_ion = ions.species[ions.species_to_advect[iIon]]; rho_i = advected_ion.mass * advected_ion.density_scgc; - rho_sum = rho_sum + - rho_i % advected_ion.nu_ion_neutral_vcgc[iNeutral] % - (advected_ion.par_velocity_vcgc[iDir] + + beta = rho_i % advected_ion.nu_ion_neutral_vcgc[iNeutral]; + precision_t one_over_masses = 1.0 / (advected_ion.mass + advected_neutral.mass); + + // B = rho_i * Nu_in + // Acc (for each species) = sum_over_ions(B * (Vi - Vn)) / rho + // Momentum = sum(B * (Vi - Vn)) + // Energy = sum_neutrals(sum__ions(B/(Mi + Mn) * (Ti - Tn) + Mi * (Vi-Vn)^2)) + + energy = energy + 3 * cKB * one_over_masses * + (ions.temperature_scgc - neutrals.temperature_scgc); + + for (iDir = 0; iDir < 3; iDir++) { + vDiff = (advected_ion.par_velocity_vcgc[iDir] + advected_ion.perp_velocity_vcgc[iDir] - advected_neutral.velocity_vcgc[iDir]); - } // for each ion + energy = energy + (advected_ion.mass * one_over_masses) * vDiff % vDiff; + momentum[iDir] = momentum[iDir] + beta % vDiff; - advected_neutral.acc_ion_drag[iDir] = rho_sum / rho_n; - } // for each direction - } // for each neutral + } // for each ion + // + energy = energy % beta; + } // for each ion + // Divide by the mass density to get the acceleration + for (iDir = 0; iDir < 3; iDir++) + advected_neutral.acc_ion_drag[iDir] = momentum[iDir]/rho_n; + } // for each neutral + // Only one heating needed for the neutrals: + neutrals.heating_ion_collisions_scgc = + energy / (neutrals.rho_scgc % neutrals.Cv_scgc); + } // bulk neutral winds report.exit(function); return; From d64851f4e694303300398d55f28261533bf34986 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:08:43 -0500 Subject: [PATCH 005/691] FEAT: calculate bulk velocity, move conduction --- src/calc_neutral_derived.cpp | 81 +++++------------------------------- 1 file changed, 10 insertions(+), 71 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 32ca53fe..065fd02b 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -157,11 +157,18 @@ void Neutrals::assign_bulk_velocity() { static int64_t iSpecies, iDir; - // If you don't advect a species, then fill with bulk velocity: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - if (!species[iSpecies].DoAdvect) + if (input.get_advection_neutrals_bulkwinds()) { + // assume every species is advected with the bunk velocity: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) for (iDir = 0; iDir < 3; iDir++) species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; + } else { + // If you don't advect a species, then fill with bulk velocity: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + if (!species[iSpecies].DoAdvect) + for (iDir = 0; iDir < 3; iDir++) + species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; + } report.exit(function); return; @@ -608,71 +615,3 @@ void Neutrals::calc_chapman(Grid grid) { report.exit(function); return; } - -// ----------------------------------------------------------------------------- -// Calculate thermal conduction -// ----------------------------------------------------------------------------- - -void Neutrals::calc_conduction(Grid grid, Times time) { - - std::string function = "Neutrals::calc_conduction"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t dt; - int64_t iLon, iLat; - int64_t nLons = grid.get_nLons(); - int64_t nLats = grid.get_nLats(); - int64_t nAlts = grid.get_nAlts(); - int64_t nGCs = grid.get_nGCs(); - - if (nAlts == 2 * nGCs + 1) - conduction_scgc.zeros(); - - else { - - arma_cube rhocvr23d(nLons, nLats, nAlts); - arma_cube lambda3d(nLons, nLats, nAlts); - arma_cube prandtl3d(nLons, nLats, nAlts); - - rhocvr23d = rho_scgc % Cv_scgc % grid.radius2_scgc; - - // Need to make this eddy * rho * cv: - if (input.get_use_eddy_energy()) - prandtl3d = kappa_eddy_scgc % rho_scgc % Cv_scgc; - else - prandtl3d.zeros(); - - lambda3d = (kappa_scgc + prandtl3d) % grid.radius2_scgc; - - arma_vec temp1d(nAlts); - arma_vec lambda1d(nAlts); - arma_vec rhocvr21d(nAlts); - arma_vec dalt1d(nAlts); - arma_vec conduction1d(nAlts); - - for (iLon = 0; iLon < nLons; iLon++) { - for (iLat = 0; iLat < nLats; iLat++) { - - temp1d = temperature_scgc.tube(iLon, iLat); - lambda1d = lambda3d.tube(iLon, iLat); - rhocvr21d = rhocvr23d.tube(iLon, iLat); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); - conduction1d.zeros(); - - dt = time.get_dt(); - - conduction1d = solver_conduction(temp1d, lambda1d, rhocvr21d, dt, dalt1d); - - // We want the sources to be in terms of dT/dt, while the - // conduction actually solves for Tnew-Told, so divide by dt - - conduction_scgc.tube(iLon, iLat) = conduction1d / dt; - } // lat - } // lon - - } // if nAlts == 1 + 2*GCs - - report.exit(function); - return; -} From cd827e2713d21593c807c5a2ae688c8022c43300 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 12:09:23 -0500 Subject: [PATCH 006/691] FEAT: move and rename neutral conduction --- src/neutrals_energy.cpp | 74 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/neutrals_energy.cpp diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp new file mode 100644 index 00000000..dfce6560 --- /dev/null +++ b/src/neutrals_energy.cpp @@ -0,0 +1,74 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include "aether.h" + +// ----------------------------------------------------------------------------- +// Calculate thermal conduction +// ----------------------------------------------------------------------------- + +void Neutrals::update_temperature(Grid grid, Times time) { + + std::string function = "Neutrals::calc_conduction"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + int64_t iLon, iLat; + int64_t nLons = grid.get_nLons(); + int64_t nLats = grid.get_nLats(); + int64_t nAlts = grid.get_nAlts(); + int64_t nGCs = grid.get_nGCs(); + + dt = time.get_dt(); + + if (nAlts == 2 * nGCs + 1) { + // Simply update the temperature if there is no conduction: + temperature_scgc = temperature_scgc + dt * heating_sources_total; + conduction_scgc.zeros(); + } else { + + arma_cube rhocvr23d(nLons, nLats, nAlts); + arma_cube lambda3d(nLons, nLats, nAlts); + arma_cube prandtl3d(nLons, nLats, nAlts); + + rhocvr23d = rho_scgc % Cv_scgc % grid.radius2_scgc; + + // Need to make this eddy * rho * cv: + if (input.get_use_eddy_energy()) + prandtl3d = kappa_eddy_scgc % rho_scgc % Cv_scgc; + else + prandtl3d.zeros(); + + lambda3d = (kappa_scgc + prandtl3d) % grid.radius2_scgc; + + arma_vec temp1d(nAlts); + arma_vec lambda1d(nAlts); + arma_vec rhocvr21d(nAlts); + arma_vec dalt1d(nAlts); + arma_vec sources1d(nAlts); + arma_vec conduction1d(nAlts); + + for (iLon = 0; iLon < nLons; iLon++) { + for (iLat = 0; iLat < nLats; iLat++) { + + temp1d = temperature_scgc.tube(iLon, iLat); + lambda1d = lambda3d.tube(iLon, iLat); + rhocvr21d = rhocvr23d.tube(iLon, iLat); + sources1d = heating_sources_total.tube(iLon, iLat); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + conduction1d.zeros(); + + conduction1d = solver_conduction(temp1d, lambda1d, rhocvr21d, sources1d, dalt1d, dt, nGCs, false); + temperature_scgc.tube(iLon, iLat) = conduction1d; + + // Store the difference (as a rate), so we can output it later if we want: + conduction_scgc.tube(iLon, iLat) = (conduction1d - temp1d)/dt - sources1d; + } // lat + } // lon + + } // if nAlts == 1 + 2*GCs + + report.exit(function); + return; +} From 2572389f1bdf5ae9be9e23680bd575adb60282f4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:23:44 -0500 Subject: [PATCH 007/691] FEAT: added coriolis and modified conduction --- include/solvers.h | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/include/solvers.h b/include/solvers.h index 3a20e3d4..49093b1e 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -9,18 +9,25 @@ #include using namespace arma; -arma_vec solver_conduction(arma_vec value, +arma_vec solver_conduction( + arma_vec value, arma_vec lambda, arma_vec front, + arma_vec source, + arma_vec dx, precision_t dt, - arma_vec dx); - + int64_t nGCs, + bool return_diff); arma_cube solver_chemistry(arma_cube density, arma_cube source, arma_cube loss, precision_t dt); +std::vector coriolis(std::vector velocity, + precision_t rotation_rate, + arma_cube lat_scgc); + /// Set flag values that indicate whether the previous, next, closest, /// or an interpolated value should be used. const int iPrevious_ = 1; From d82c86e01de8e0f6d6379c8dc1da881127ad1151 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:35:05 -0500 Subject: [PATCH 008/691] FEAT: modify conduction + bulk velocity stuff --- src/add_sources.cpp | 63 +++++++++++++++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index ba37b21d..64c2ebdd 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -10,7 +10,7 @@ // Adds all of the sources to the states. Needs time to get dt. // ----------------------------------------------------------------------------- -void Neutrals::add_sources(Times time) { +void Neutrals::add_sources(Times time, Planets planet, Grid grid) { std::string function = "add_sources"; static int iFunction = -1; @@ -18,33 +18,56 @@ void Neutrals::add_sources(Times time) { precision_t dt = time.get_dt(); - temperature_scgc = temperature_scgc + - dt * (heating_euv_scgc - + heating_chemical_scgc - + conduction_scgc - - O_cool_scgc - - NO_cool_scgc); + heating_sources_total = heating_euv_scgc + + heating_chemical_scgc + + heating_ion_collisions_scgc + - O_cool_scgc + - NO_cool_scgc; - for (int64_t iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { - species_chars & advected_neutral = species[species_to_advect[iSpec]]; + // Solve the laplace equations using the source terms, + // updating the neutral temperature: + update_temperature(grid, time); + std::vector acc_coriolis; + + // If we only consider the bulk winds in the horizontal direction: + if (input.get_advection_neutrals_bulkwinds()) { + // Calculate Coriolis: + acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + // Add Velocity sources to bulk winds: for (int iDir = 0; iDir < 3; iDir++) { - // update velocities based on acceleration: - // reduce neutral friction until solver is added - advected_neutral.velocity_vcgc[iDir] = - advected_neutral.velocity_vcgc[iDir] + - dt * (advected_neutral.acc_neutral_friction[iDir] / 4.0 + - advected_neutral.acc_ion_drag[iDir]); - - // eddy acceleration is only in the vertical direction: - if (iDir == 2) + velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( + grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + + acc_ion_collisions[iDir]); + } + } else { + for (int64_t iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { + // Pick out the advected neutral species: + species_chars & advected_neutral = species[species_to_advect[iSpec]]; + // Calculate Coriolis: + acc_coriolis = coriolis(advected_neutral.velocity_vcgc, + planet.get_omega(), + grid.geoLat_scgc); + + for (int iDir = 0; iDir < 2; iDir++) { + // update velocities based on acceleration: + // reduce neutral friction until solver is added advected_neutral.velocity_vcgc[iDir] = + advected_neutral.velocity_vcgc[iDir] + + dt * (grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + + advected_neutral.acc_neutral_friction[iDir] / 4.0 + + advected_neutral.acc_ion_drag[iDir]); + // eddy acceleration is only in the vertical direction: + if (iDir == 2) advected_neutral.velocity_vcgc[iDir] = + advected_neutral.velocity_vcgc[iDir] + dt * advected_neutral.acc_eddy; + } } + calc_bulk_velocity(); } - - calc_bulk_velocity(); assign_bulk_velocity(); report.exit(function); From 4151f01f10e33907525e28a93bdd5204ebbff94b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:36:10 -0500 Subject: [PATCH 009/691] FEAT: move conduction into add sources --- src/advance.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index c1269cd1..66ab4b9b 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -96,8 +96,6 @@ bool advance(Planets &planet, calc_aurora(gGrid, neutrals, ions); - // Calculate some neutral source terms: - neutrals.calc_conduction(gGrid, time); chemistry.calc_chemistry(neutrals, ions, time, gGrid); if (input.get_O_cooling()) @@ -110,7 +108,7 @@ bool advance(Planets &planet, calc_ion_collisions(neutrals, ions); calc_neutral_friction(neutrals); - neutrals.add_sources(time); + neutrals.add_sources(time, planet, gGrid); ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); From 53551763529fd13696d200305cacf176e33ef3d4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:37:07 -0500 Subject: [PATCH 010/691] FEAT: ion temperature hack at this point --- src/calc_ion_temperature.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 3ddd3627..73b4a3b8 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -45,12 +45,14 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); int64_t nAlts = grid.get_nAlts(); + int64_t nGCs = grid.get_nGCs(); arma_vec temp1d(nAlts); arma_vec lambda1d(nAlts); arma_vec front1d(nAlts); arma_vec dalt1d(nAlts); arma_vec conduction1d(nAlts); + arma_vec sources1d(nAlts); arma_cube tempT(nLons, nLats, nAlts); arma_cube tempD(nLons, nLats, nAlts); @@ -60,9 +62,11 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, for (iIon = 0; iIon < nSpecs; iIon++) species[iIon].temperature_scgc = - neutrals.temperature_scgc; + neutrals.temperature_scgc + + 1.5 * (neutrals.temperature_scgc - neutrals.temperature_scgc(2,2,2)); - temperature_scgc = neutrals.temperature_scgc; + temperature_scgc = neutrals.temperature_scgc + + 1.5 * (neutrals.temperature_scgc - neutrals.temperature_scgc(2,2,2)); report.exit(function); return; @@ -89,17 +93,16 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Calculate heat flux (conduction) in 1D; loop over all lat,lon // --------------------------------------------------------------------- temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); - lambda1d = 25.0 * pow(cKB, 2) * pow(temp1d, 2.5) / species[iIon].mass - / species[iIon].nu_ion_ion[iIon] / 8.0; lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) / species[iIon].nu_ion_ion[iIon] / 8.0; front1d = 2.0 / species[iIon].density_scgc.tube(iLon, iLat) / cKB / 3.0; dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + sources1d.zeros(); conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, lambda1d, front1d, dt, dalt1d); + conduction1d = solver_conduction(temp1d, lambda1d, front1d, sources1d, dalt1d, dt, nGCs, true); // The conduction solver gives Tnew-Told, so divide by dt conduction_scgc.tube(iLon, iLat) = conduction1d / dt; From 4b516cfacb923ddb50f3a67813abf80d09f561a7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:38:48 -0500 Subject: [PATCH 011/691] FEAT: nGCs, sources, and return updated --- src/solver_conduction.cpp | 54 ++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/src/solver_conduction.cpp b/src/solver_conduction.cpp index a1254a88..3cc7639c 100644 --- a/src/solver_conduction.cpp +++ b/src/solver_conduction.cpp @@ -6,7 +6,10 @@ #include "aether.h" // ----------------------------------------------------------------------- -// This code solves the conduction equation in 1D. +// This code solves the laplace equation in 1D: +// +// dV/dt = 1/front d/dx lambda dV/dx + source +// // Some assumptions: // - Assume that lambda and front are scaled by radius squared! // - The spacing can be non-uniform. @@ -18,8 +21,11 @@ arma_vec solver_conduction(arma_vec value, arma_vec lambda, arma_vec front, + arma_vec source, + arma_vec dx, precision_t dt, - arma_vec dx) { + int64_t nGCs, + bool return_diff) { int64_t nPts = value.n_elem; @@ -43,24 +49,24 @@ arma_vec solver_conduction(arma_vec value, int64_t i; - for (i = 2; i < nPts - 2; i++) + for (i = nGCs; i < nPts - nGCs; i++) dl(i) = di(i + 1) - di(i - 1) * r(i) * r(i) - di(i) * (1.0 - r(i) * r(i)); arma_vec a = di / du22 % r - dl / du12 % r % r; arma_vec c = di / du22 + dl / du12; arma_vec b = -1.0 / m - di / du22 % (1.0 + r) - dl / du12 % (1.0 - r % r); - arma_vec d = -1.0 * value / m; + arma_vec d = -1.0 * (value / m + source % front * dt); // Lower BCs (fixed value): - a(1) = 0.0; - b(1) = -1.0; - c(1) = 0.0; - d(1) = -1.0 * value(1); + a(nGCs-1) = 0.0; + b(nGCs-1) = -1.0; + c(nGCs-1) = 0.0; + d(nGCs-1) = -1.0 * value(nGCs-1); // Upper BCs: // This assumes a constant-gradient BC (need to change for ion and ele temps. - i = nPts - 2; + i = nPts - nGCs; a(i) = 1.0 * (r(i) * (1.0 + r(i)) * di(i) * m(i) / du22(i)); b(i) = -1.0 * (1.0 + r(i) * (1 + r(i)) * di(i) * m(i) / du22(i)); c(i) = 0.0; @@ -70,26 +76,34 @@ arma_vec solver_conduction(arma_vec value, arma_vec dp(nPts, fill::zeros); arma_vec result(nPts, fill::zeros); - cp(1) = c(1) / b(1); + cp(nGCs - 1) = c(nGCs - 1) / b(nGCs - 1); - for (i = 2; i <= nPts - 2; i++) + for (i = nGCs; i <= nPts - nGCs; i++) cp(i) = c(i) / (b(i) - cp(i - 1) * a(i)); - dp(1) = d(1) / b(1); + dp(nGCs - 1) = d(nGCs - 1) / b(nGCs - 1); - for (i = 2; i <= nPts - 2; i++) + for (i = nGCs; i <= nPts - nGCs; i++) dp(i) = (d(i) - dp(i - 1) * a(i)) / (b(i) - cp(i - 1) * a(i)); - result(nPts - 2) = dp(nPts - 2); + result(nPts - nGCs) = dp(nPts - nGCs); - for (i = nPts - 3; i > 0; i--) + for (i = nPts - nGCs - 1; i > nGCs - 1; i--) result(i) = dp(i) - cp(i) * result(i + 1); - conduction = result - value; - conduction(0) = 0.0; - conduction(1) = 0.0; - conduction(nPts - 2) = 0.0; - conduction(nPts - 1) = 0.0; + if (return_diff) { + conduction = result - value; + for (i = 0; i < nGCs; i++) { + conduction(i) = 0.0; + conduction(nPts - i - 1) = 0.0; + } + } else { + conduction = result; + for (i = 0; i < nGCs; i++) { + conduction(i) = value(i); + conduction(nPts - nGCs + i) = conduction(nPts - nGCs - 1); + } + } return conduction; } From 62680f10a0d3a0b2c895c0858d523035370dbb7f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:40:20 -0500 Subject: [PATCH 012/691] BUG: north and east were reversed --- src/solver_coriolis.cpp | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/solver_coriolis.cpp b/src/solver_coriolis.cpp index 4744f7b5..0ab125f7 100644 --- a/src/solver_coriolis.cpp +++ b/src/solver_coriolis.cpp @@ -1,23 +1,23 @@ -// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) -// Full license can be found in License.md - -// Added by S. Annamalai - June 12, 2023 - -// This function calculates the coriolis acceleration vector for an -// object in motion in a rotating frame of reference. It uses the -// coriolis terms in equations (14), (18), (19) in -// https://drive.google.com/file/d/1Q0cMzKhdd0IoXzBl3odTge9JhBwfAyk9 - -#include "../include/aether.h" - -std::vector coriolis(std::vector velocity, - precision_t rotation_rate, - arma_cube lat_scgc) { - std::vector coriolis_vec(3); - coriolis_vec[0] = -2 * rotation_rate * velocity[1] % sin(lat_scgc); - coriolis_vec[1] = - 2 * rotation_rate * velocity[0] % sin(lat_scgc) - - 2 * rotation_rate * velocity[2] % cos(lat_scgc); - coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1]; - return coriolis_vec; -} +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +// Added by S. Annamalai - June 12, 2023 + +// This function calculates the coriolis acceleration vector for an +// object in motion in a rotating frame of reference. It uses the +// coriolis terms in equations (14), (18), (19) in +// https://drive.google.com/file/d/1Q0cMzKhdd0IoXzBl3odTge9JhBwfAyk9 + +#include "../include/aether.h" + +std::vector coriolis(std::vector velocity, + precision_t rotation_rate, + arma_cube lat_scgc) { + std::vector coriolis_vec(3); + coriolis_vec[0] = + 2 * rotation_rate * velocity[1] % sin(lat_scgc) - + 2 * rotation_rate * velocity[2] % cos(lat_scgc); + coriolis_vec[1] = -2 * rotation_rate * velocity[0] % sin(lat_scgc); + coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1]; + return coriolis_vec; +} From 7a323859bf32b5914b57944d2ca141346a2bce33 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 27 Nov 2023 19:43:24 -0500 Subject: [PATCH 013/691] feat: bulk winds - true --- share/run/UA/inputs/defaults.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 8250f234..ec923bbe 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -23,7 +23,8 @@ "Advection" : { "Neutrals" : { "Vertical" : "rusanov", - "Horizontal" : "default"}, + "Horizontal" : "default", + "useBulkWinds" : true}, "Ions" : { "Along" : "rusanov", "Across" : "default"} }, From 97d877413c88245a85b0c35feab352a2cf761c28 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 28 Nov 2023 07:36:41 -0500 Subject: [PATCH 014/691] FEAT: horizontal advection for spherical grid --- src/solver_advection.cpp | 522 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 522 insertions(+) create mode 100644 src/solver_advection.cpp diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp new file mode 100644 index 00000000..033aa6ac --- /dev/null +++ b/src/solver_advection.cpp @@ -0,0 +1,522 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + + +#include "aether.h" + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +arma_vec limiter_mc(arma_vec &left, + arma_vec &right, + int64_t nPts, + int64_t nGCs) { + + precision_t beta = 0.8; + + arma_vec s = left % right; + arma_vec combined = (left + right) * 0.5; + + left = left * beta; + right = right * beta; + arma_vec limited = left; + + for (int64_t i = 1; i < nPts + 2 * nGCs - 1; i++) { + if (s(i) < 0) { + // Sign < 0 means opposite signed left and right: + limited(i) = 0.0; + } else { + if (left(i) > 0 && right(i) > 0) { + if (right(i) < limited(i)) + limited(i) = right(i); + if (combined(i) < limited(i)) + limited(i) = combined(i); + } else { + if (right(i) > limited(i)) + limited(i) = right(i); + if (combined(i) > limited(i)) + limited(i) = combined(i); + } + } + } + return limited; +} + + +// --------------------------------------------------------- +// calc gradients at centers +// - values and x defined at centers +// --------------------------------------------------------- + +arma_vec calc_grad_1d(arma_vec &values, + arma_vec &x, + int64_t nPts, + int64_t nGCs) { + + arma_vec gradients = values * 0.0; + arma_vec gradL = values * 0.0; + arma_vec gradR = values * 0.0; + + precision_t factor1 = 0.625; + precision_t factor2 = 0.0416667; + precision_t h; + + int64_t i; + arma_vec hv = values * 0.0; + + i = nGCs - 1; + h = 2.0 / (x(i+1) - x(i)); + gradR(i) = h * (factor1 * (values(i+1) - values(i)) - + factor2 * (values(i+2) - values(i-1))); + gradL(i) = (values(i) - values(i-1)) / (x(i) - x(i-1)); + + for (i = nGCs; i < nPts + nGCs; i++) { + h = 2.0 / (x(i) - x(i-1)); + gradL(i) = h * (factor1 * (values(i) - values(i-1)) - + factor2 * (values(i+1) - values(i-2))); + h = 2.0 / (x(i+1) - x(i)); + gradR(i) = h * (factor1 * (values(i+1) - values(i)) - + factor2 * (values(i+2) - values(i-1))); + } + i = nPts + nGCs; + h = 2.0 / (x(i) - x(i-1)); + gradL(i) = h * (factor1 * (values(i) - values(i-1)) - + factor2 * (values(i+1) - values(i-2))); + gradR(i) = (values(i+1) - values(i)) / (x(i+1) - x(i)); + + gradients = limiter_mc(gradL, gradR, nPts, nGCs); + + return gradients; +} + +// --------------------------------------------------------- +// calc gradients at centers for 2d matrices +// - values and x defined at centers +// --------------------------------------------------------- + +arma_mat calc_grad(arma_mat values, + arma_mat x, + int64_t nGCs, + bool DoX) { + + arma_mat v2d, x2d; + + if (DoX) { + v2d = values; + x2d = x; + } else { + v2d = values.t(); + x2d = x.t(); + } + + int64_t nX = v2d.n_rows; + int64_t nY = v2d.n_cols; + arma_mat grad2d = v2d * 0.0; + + int64_t nPts = nX - 2 * nGCs; + arma_vec values1d(nX); + arma_vec x1d(nX); + for (int64_t j = 1; j < nY-1; j++) { + values1d = v2d.col(j); + x1d = x2d.col(j); + grad2d.col(j) = calc_grad_1d(values1d, x1d, nPts, nGCs); + } + + arma_mat gradients; + + if (DoX) { + gradients = grad2d; + } else { + gradients = grad2d.t(); + } + return gradients; +} + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat project_from_left(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i + 1, j) = values(i, j) + + gradients(i, j) * (x_edges(i + 1, j) - x_centers(i, j)); + } + projected(1, j) = projected(2, j); + projected(0, j) = projected(1, j); + projected(nX, j) = projected(nX - 1, j); + } + return projected; +} + + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat project_from_right(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i, j) = values(i, j) + + gradients(i, j) * (x_edges(i, j) - x_centers(i, j)); + } + projected(0, j) = projected(1, j); + projected(nX - 1, j) = projected(nX - 2, j); + projected(nX, j) = projected(nX - 1, j); + } + return projected; +} + +// --------------------------------------------------------- +// take gradients and project to all edges +// --------------------------------------------------------- + +projection_struct project_to_edges(arma_mat &values, + arma_mat &x_centers, arma_mat &x_edges, + arma_mat &y_centers, arma_mat &y_edges, + int64_t nGCs) { + + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + projection_struct proj; + + proj.gradLR = calc_grad(values, x_centers, nGCs, true); + proj.gradDU = calc_grad(values.t(), y_centers.t(), nGCs, true).t(); + + proj.R = project_from_left(values, proj.gradLR, + x_centers, x_edges, nGCs); + // Left side of edge from left + proj.L = project_from_right(values, proj.gradLR, + x_centers, x_edges, nGCs); + // Up side of edge from down (left) + proj.U = project_from_left(values.t(), proj.gradDU.t(), + y_centers.t(), y_edges.t(), nGCs).t(); + // Down side of edge from up (right) + proj.D = project_from_right(values.t(), proj.gradDU.t(), + y_centers.t(), y_edges.t(), nGCs).t(); + + return proj; +} + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +precision_t calc_dt(arma_mat &xWidth, + arma_mat &yWidth, + arma_mat &wsLR, + arma_mat &wsDU, + int64_t nGCs) { + + int64_t nX = xWidth.n_rows; + int64_t nY = yWidth.n_cols; + + precision_t wsX, wsY, dtX, dtY, dt; + + dt = 1e32; + + for (int64_t j = nGCs; j < nY - nGCs; j++) { + for (int64_t i = nGCs; i < nX - nGCs; i++) { + wsX = (wsLR(i+1, j) + wsLR(i, j))/2; + dtX = xWidth(i, j) / wsX; + wsY = (wsDU(i, j+1) + wsDU(i, j))/2; + dtY = yWidth(i, j) / wsY; + if (dtX < dt) dt = dtX; + if (dtY < dt) dt = dtY; + } + } + return dt; +} + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +void advect(Grid &grid, + Times &time, + Neutrals &neutrals) { + + std::string function = "advect"; + static int iFunction = -1; + report.enter(function, iFunction); + + projection_struct rhoP; + projection_struct xVelP; + projection_struct yVelP; + projection_struct tempP; + + precision_t gamma = 5.0/3.0; + precision_t dt = time.get_dt(); + + int64_t nGCs = grid.get_nGCs(); + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nAlts = grid.get_nAlts(), iAlt; + + arma_mat x, xEdges; + arma_mat y, yEdges; + + arma_mat xVel, yVel, vel; + arma_mat velL2, velR2, velU2, velD2; + arma_mat rho, temp; + arma_mat xMomentum, yMomentum; + arma_mat grad_xMomenum, xMomentumL, xMomentumR, xMomentumD, xMomentumU; + arma_mat grad_yMomenum, yMomentumL, yMomentumR, yMomentumD, yMomentumU; + + arma_mat eq1FluxLR, eq1FluxDU; + arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + + arma_mat eq2FluxLR, eq2FluxDU; + arma_mat eq2FluxL, eq2FluxR, eq2FluxD, eq2FluxU, eq2Flux; + + arma_mat eq3FluxLR, eq3FluxDU; + arma_mat eq3FluxL, eq3FluxR, eq3FluxD, eq3FluxU, eq3Flux; + + arma_mat eq4FluxLR, eq4FluxDU; + arma_mat eq4FluxL, eq4FluxR, eq4FluxD, eq4FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat totalE; + arma_mat grad_totalE, totaleL, totaleR, totaleD, totaleU; + arma_mat diff; + + arma_mat area, xWidth, yWidth, geometry; + + neutrals.calc_mass_density(); + + arma_mat t_to_e; + + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + + if (report.test_verbose(3)) + std::cout << "Advection: Working with iAlt: " << iAlt << "\n"; + + xVel = neutrals.velocity_vcgc[0].slice(iAlt); + yVel = neutrals.velocity_vcgc[1].slice(iAlt); + rho = neutrals.rho_scgc.slice(iAlt); + // this is "e", or temperature expressed as an energy + t_to_e = 1.0/(gamma-1.0) * cKB / neutrals.mean_major_mass_scgc.slice(iAlt); + temp = t_to_e % neutrals.temperature_scgc.slice(iAlt); + + // ------------------------------------------------ + // Calculate derived equations (at cell centers - these will be updated) + // eq 1 = rho + // eq 2 = rho * xVel (momentum) + // eq 3 = rho * yVel (momentum) + // eq 4 = E --> rho * (temp + 0.5 * vel^2) (totalE) + + vel = sqrt(xVel % xVel + yVel % yVel); + totalE = rho % temp + 0.5 * rho % vel % vel; + xMomentum = rho % xVel; + yMomentum = rho % yVel; + + x = grid.x_Center.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + y = grid.y_Center.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + xEdges = grid.x_Left.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + yEdges = grid.y_Down.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + + rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); + xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); + yVelP = project_to_edges(yVel, x, xEdges, y, yEdges, nGCs); + tempP = project_to_edges(temp, x, xEdges, y, yEdges, nGCs); + + // ------------------------------------------------ + // Calculate derived equations (at edges) + // eq 1 = rho + // eq 2 = rho * xVel (momentum) + // eq 3 = rho * yVel (momentum) + // eq 4 = E --> rho * (temp + 0.5 * vel^2) (totalE) + + report.print(3, "Advection: Deriving State Equations"); + + xMomentumL = rhoP.L % xVelP.L; + xMomentumR = rhoP.R % xVelP.R; + xMomentumD = rhoP.D % xVelP.D; + xMomentumU = rhoP.U % xVelP.U; + + yMomentumL = rhoP.L % yVelP.L; + yMomentumR = rhoP.R % yVelP.R; + yMomentumD = rhoP.D % yVelP.D; + yMomentumU = rhoP.U % yVelP.U; + + velL2 = xVelP.L % xVelP.L + yVelP.L % yVelP.L; + velR2 = xVelP.R % xVelP.R + yVelP.R % yVelP.R; + velD2 = xVelP.D % xVelP.D + yVelP.D % yVelP.D; + velU2 = xVelP.U % xVelP.U + yVelP.U % yVelP.U; + + totaleL = rhoP.L % tempP.L + 0.5 * rhoP.L % velL2; + totaleR = rhoP.R % tempP.R + 0.5 * rhoP.R % velR2; + totaleD = rhoP.D % tempP.D + 0.5 * rhoP.D % velD2; + totaleU = rhoP.U % tempP.U + 0.5 * rhoP.U % velU2; + + // ------------------------------------------------ + // Calculate fluxes of different terms at the edges: + + report.print(3, "Advection: Calculating Fluxes"); + + eq1FluxL = rhoP.L % xVelP.L; + eq1FluxR = rhoP.R % xVelP.R; + eq1FluxD = rhoP.D % yVelP.D; + eq1FluxU = rhoP.U % yVelP.U; + + eq2FluxL = rhoP.L % (xVelP.L % xVelP.L + (gamma-1) * tempP.L); + eq2FluxR = rhoP.R % (xVelP.R % xVelP.R + (gamma-1) * tempP.R); + eq2FluxD = rhoP.D % xVelP.D % yVelP.D; + eq2FluxU = rhoP.U % xVelP.U % yVelP.U; + eq2Flux = rho % xVel % yVel; + + eq3FluxR = rhoP.R % xVelP.R % yVelP.R; + eq3FluxL = rhoP.L % xVelP.L % yVelP.L; + eq3FluxD = rhoP.D % (yVelP.D % yVelP.D + (gamma-1) * tempP.D); + eq3FluxU = rhoP.U % (yVelP.U % yVelP.U + (gamma-1) * tempP.U); + eq3Flux = rho % (yVel % yVel + (gamma-1) * temp); + + eq4FluxL = rhoP.L % xVelP.L % (0.5 * velL2 + gamma * tempP.L); + eq4FluxR = rhoP.R % xVelP.R % (0.5 * velR2 + gamma * tempP.R); + eq4FluxD = rhoP.D % yVelP.D % (0.5 * velD2 + gamma * tempP.D); + eq4FluxU = rhoP.U % yVelP.U % (0.5 * velU2 + gamma * tempP.U); + + // ------------------------------------------------ + // Calculate the wave speed for the diffusive flux: + + report.print(3, "Advection: Diffusive Fluxes"); + + wsL = sqrt(velL2) + sqrt(gamma * (gamma-1) * tempP.L); + wsR = sqrt(velR2) + sqrt(gamma * (gamma-1) * tempP.R); + wsD = sqrt(velD2) + sqrt(gamma * (gamma-1) * tempP.D); + wsU = sqrt(velU2) + sqrt(gamma * (gamma-1) * tempP.U); + + wsLR = wsR; + for (int64_t i = 0; i < nX + 1; i++) { + for (int64_t j = 0; j < nY; j++) { + if (wsL(i, j) > wsLR(i, j)) wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + for (int64_t i = 0; i < nX; i++) { + for (int64_t j = 0; j < nY + 1; j++) { + if (wsU(i, j) > wsDU(i, j)) wsDU(i, j) = wsU(i, j); + } + } + + // ------------------------------------------------ + // Calculate average flux at the edges: + + report.print(3, "Advection: Averaging fluxes at edges"); + + diff = rhoP.R - rhoP.L; + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = rhoP.U - rhoP.D; + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + diff = xMomentumR - xMomentumL; + eq2FluxLR = (eq2FluxL + eq2FluxR) / 2 + 0.5 * wsLR % diff; + diff = xMomentumU - xMomentumD; + eq2FluxDU = (eq2FluxD + eq2FluxU) / 2 + 0.5 * wsDU % diff; + + diff = yMomentumR - yMomentumL; + eq3FluxLR = (eq3FluxL + eq3FluxR) / 2 + 0.5 * wsLR % diff; + diff = yMomentumU - yMomentumD; + eq3FluxDU = (eq3FluxD + eq3FluxU) / 2 + 0.5 * wsDU % diff; + + diff = totaleR - totaleL; + eq4FluxLR = (eq4FluxL + eq4FluxR) / 2 + 0.5 * wsLR % diff; + diff = totaleU - totaleD; + eq4FluxDU = (eq4FluxD + eq4FluxU) / 2 + 0.5 * wsDU % diff; + + // ------------------------------------------------ + // Update values: + report.print(3, "Advection: Updating equations of state"); + + area = grid.cell_area.slice(iAlt) * grid.radius2_scgc(1,1,iAlt); + yWidth = grid.dy_Left.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + xWidth = grid.dx_Down.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + + geometry = + sin(grid.geoLat_scgc.slice(iAlt)) / + cos(grid.geoLat_scgc.slice(iAlt)) / + grid.radius_scgc(1,1,iAlt); + + for (int64_t j = nGCs; j < nY - nGCs; j++) { + for (int64_t i = nGCs; i < nX - nGCs; i++) { + //if (i == nGCs) cout << "j = " << j << " " << xWidth(i,j) << "\n"; + rho(i,j) = rho(i,j) - dt * + (yWidth(i+1,j) * eq1FluxLR(i+1,j) - + yWidth(i,j) * eq1FluxLR(i,j) + + xWidth(i,j+1) * eq1FluxDU(i,j+1) - + xWidth(i,j) * eq1FluxDU(i,j)) / area(i,j); + xMomentum(i,j) = xMomentum(i,j) - dt * + ((yWidth(i+1,j) * eq2FluxLR(i+1,j) - + yWidth(i,j) * eq2FluxLR(i,j) + + xWidth(i,j+1) * eq2FluxDU(i,j+1) - + xWidth(i,j) * eq2FluxDU(i,j)) / area(i,j) - + geometry(i,j) * eq2Flux(i,j)); + yMomentum(i,j) = yMomentum(i,j) - dt * + ((yWidth(i+1,j) * eq3FluxLR(i+1,j) - + yWidth(i,j) * eq3FluxLR(i,j) + + xWidth(i,j+1) * eq3FluxDU(i,j+1) - + xWidth(i,j) * eq3FluxDU(i,j)) / area(i,j) + + geometry(i,j) * eq3Flux(i,j)); + totalE(i,j) = totalE(i,j) - dt * + (yWidth(i+1,j) * eq4FluxLR(i+1,j) - + yWidth(i,j) * eq4FluxLR(i,j) + + xWidth(i,j+1) * eq4FluxDU(i,j+1) - + xWidth(i,j) * eq4FluxDU(i,j)) / area(i,j); + } + } + + xVel = xMomentum / rho; + yVel = yMomentum / rho; + + neutrals.velocity_vcgc[0].slice(iAlt) = xVel; + neutrals.velocity_vcgc[1].slice(iAlt) = yVel; + temp = totalE / rho - 0.5 * (xVel % xVel + yVel % yVel); + + neutrals.temperature_scgc.slice(iAlt) = temp / t_to_e; + if (report.test_verbose(3) && iAlt == 8) { + std::cout << "end t : " << neutrals.temperature_scgc.slice(iAlt).min() << " " << neutrals.temperature_scgc.slice(iAlt).max() << "\n"; + std::cout << "end temp : " << temp.min() << " " << temp.max() << "\n"; + std::cout << "end xVel : " << xVel.min() << " " << xVel.max() << "\n"; + std::cout << "end yVel : " << yVel.min() << " " << yVel.max() << "\n"; + } + } + report.exit(function); + return; +} \ No newline at end of file From 23b4cfddc35d2113dc7b50027ebee5df85a50560 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 28 Nov 2023 07:37:19 -0500 Subject: [PATCH 015/691] DOC: corrected comment --- src/neutrals_bcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 0c7c4017..eb1aa5e5 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -318,7 +318,7 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { } } - // iDir = 2 is left BC: + // iDir = 3 is lower BC: if (iDir == 3) { for (iX = 0; iX < nX; iX++) { for (iY = nGCs - 1; iY >= 0; iY--) { From 6ef52b8578c41a616ec31a42115f615d45f65f4e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 28 Nov 2023 07:37:53 -0500 Subject: [PATCH 016/691] FEAT: grid terms for advection --- include/grid.h | 15 +++++++++++++++ src/init_geo_grid.cpp | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/grid.h b/include/grid.h index 44632251..fcee805e 100644 --- a/include/grid.h +++ b/include/grid.h @@ -124,6 +124,21 @@ class Grid { // Vector of dx dy of different altitudes arma_vec drefx, drefy; + /// These are switching to the LR and DU directions for generalized coords + /// They are also in radians + + arma_cube x_Center, y_Center; + arma_cube x_Left, y_Down; + + /// these are center-to-center distances in the LR (X) and DU (Y) directions: + arma_cube dx_Center, dy_Center; + /// need dx on the lower / upper edges, don't need them on the left/right + arma_cube dx_Down; + /// need dy on the left / right edges: + arma_cube dy_Left; + /// cell area (in radians^2) + arma_cube cell_area; + std::vector bfield_vcgc; arma_cube bfield_mag_scgc; std::vector bfield_unit_vcgc; diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index a904366d..6586b90c 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -650,6 +650,13 @@ void Grid::create_sphere_grid(Quadtree quadtree) { geoLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; } + arma_cube cos_lat = cos(geoLat_scgc); + cos_lat.elem( find(cos_lat < 0.00001) ).fill(0.00001); + + y_Center = geoLat_scgc; + x_Center = geoLon_scgc % cos_lat; + cell_area = dlat * dlon * cos_lat; + // --------------------------------------------- // Left Sides - edges on left side (no offset left) // --------------------------------------------- @@ -668,6 +675,13 @@ void Grid::create_sphere_grid(Quadtree quadtree) { geoLat_Left.slice(iAlt) = lat2d_left; } + arma_cube cos_lat_L = cos(geoLat_Left); + cos_lat_L.elem( find(cos_lat_L < 0.00001) ).fill(0.00001); + + x_Left = geoLon_Left % cos_lat_L; + dy_Left.set_size(nLons, nLats, nAlts); + dy_Left.fill(dlat); + // --------------------------------------------- // Down Sides - edges on down side (no offset lat) // --------------------------------------------- @@ -686,6 +700,12 @@ void Grid::create_sphere_grid(Quadtree quadtree) { geoLat_Down.slice(iAlt) = lat2d_down; } + arma_cube cos_lat_D = cos(geoLat_Down); + cos_lat_D.elem( find(cos_lat_D < 0.00001) ).fill(0.00001); + + y_Down = geoLat_Down; + dx_Down = dlon * cos_lat_D; + // --------------------------------------------- // Corner Sides - corner (no offset lat or lon) // --------------------------------------------- From c1d3d2cdad4f352bcf602c301a0914d49cde1eac Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 28 Nov 2023 07:38:25 -0500 Subject: [PATCH 017/691] FEAT: advection solver for sphere codes --- include/solvers.h | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/include/solvers.h b/include/solvers.h index 49093b1e..eaf16392 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -9,6 +9,29 @@ #include using namespace arma; +struct projection_struct { + + arma_mat gradLR; + arma_mat gradDU; + arma_mat R; + arma_mat L; + arma_mat U; + arma_mat D; + arma_mat grad_edge_LR; + arma_mat grad_edge_DU; +}; + +arma_vec limiter_mc(arma_vec &left, arma_vec &right, int64_t nPts, int64_t nGCs); +arma_vec calc_grad_1d(arma_vec &values, + arma_vec &x, + int64_t nPts, + int64_t nGCs); +arma_mat calc_grad(arma_mat values, arma_mat x, int64_t nGCs, bool DoX); + +void advect(Grid &grid, + Times &time, + Neutrals &neutrals); + arma_vec solver_conduction( arma_vec value, arma_vec lambda, From 7ae96a7ee0411cf5c083c5ad3493127079a45871 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 28 Nov 2023 07:39:07 -0500 Subject: [PATCH 018/691] FEAT: call horizontal advection --- src/advance.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/advance.cpp b/src/advance.cpp index 66ab4b9b..db36d604 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -66,6 +66,8 @@ bool advance(Planets &planet, if (input.get_nAltsGeo() > 1) neutrals.advect_vertical(gGrid, time); + advect(gGrid, time, neutrals); + if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites(); From e10b78a0472dd6fd457ce8499a226b476241c879 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:05:47 -0500 Subject: [PATCH 019/691] FEAT: added viscosity --- include/neutrals.h | 28 ++++++++- src/calc_neutral_derived.cpp | 43 ++++++++++++- src/neutrals.cpp | 8 ++- src/neutrals_momentum_viscosity.cpp | 97 +++++++++++++++++++++++++++++ 4 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 src/neutrals_momentum_viscosity.cpp diff --git a/include/neutrals.h b/include/neutrals.h index c2ed17cb..8b438074 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -72,6 +72,8 @@ class Neutrals { /// concentration (density of species / total density) arma_cube concentration_scgc; + // mass concentration (mass * density of species / rho) + arma_cube mass_concentration_scgc; /// Diffusion through other neutral species: std::vector diff0; @@ -169,6 +171,9 @@ class Neutrals { /// Eddy Diffusion arma_cube kappa_eddy_scgc; + /// Viscosity + arma_cube viscosity_scgc; + /// O cooling arma_cube O_cool_scgc; @@ -186,6 +191,9 @@ class Neutrals { // Bulk acceleration due to collisions with ions: std::vector acc_ion_collisions; + // Total bulk acceleration + std::vector acc_sources_total; + /// Bulk neutral thermal conduction temperature change rate (K/s) arma_cube conduction_scgc; @@ -299,6 +307,11 @@ class Neutrals { **/ void calc_scale_height(Grid grid); + /********************************************************************** + \brief Calculate the viscosity coefficient + **/ + void calc_viscosity(); + /********************************************************************** \brief Calculate the eddy diffusion coefficient in valid pressure **/ @@ -308,7 +321,13 @@ class Neutrals { \brief Calculate the concentration for each species (species ndensity / total ndensity) **/ void calc_concentration(); - + + /********************************************************************** + \brief Calculate the density of each species from the mass concentration + for each species and rho (ndensity = con * rho / mass) + **/ + void calc_density_from_mass_concentration(); + /********************************************************************** \brief Calculate the bulk mean major mass **/ @@ -360,6 +379,13 @@ class Neutrals { **/ void update_temperature(Grid grid, Times time); + /********************************************************************** + \brief Calculate the neutral bulk horizontal viscosity + \param grid The grid to define the neutrals on + \param time The times within the model (dt is needed) + **/ + void update_horizontal_velocity(Grid grid, Times time); + /********************************************************************** \brief Calculate the O radiative cooling **/ diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 065fd02b..6f2f1351 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -6,6 +6,23 @@ #include "aether.h" +// ---------------------------------------------------------------------- +// Calculate viscosity +// ---------------------------------------------------------------------- + +void Neutrals::calc_viscosity() { + + std::string function = "Neutrals::calc_viscosity"; + static int iFunction = -1; + report.enter(function, iFunction); + + viscosity_scgc = 0.00013 * sqrt(temperature_scgc % + mean_major_mass_scgc / cKB); + + report.exit(function); + return; +} + // ---------------------------------------------------------------------- // Calculate eddy diffusion coefficient // ---------------------------------------------------------------------- @@ -66,10 +83,34 @@ void Neutrals::calc_concentration() { static int iFunction = -1; report.enter(function, iFunction); - for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) + for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].concentration_scgc = species[iSpecies].density_scgc / density_scgc; + species[iSpecies].mass_concentration_scgc = + species[iSpecies].mass * species[iSpecies].density_scgc / rho_scgc; + } + + report.exit(function); + return; +} + +// ---------------------------------------------------------------------- +// Calculate densities from mass concentration +// Assuming mass density calculation is accurate... +// ---------------------------------------------------------------------- + +void Neutrals::calc_density_from_mass_concentration() { + + std::string function = "Neutrals::calc_density_from_mass_concentration"; + static int iFunction = -1; + report.enter(function, iFunction); + for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].density_scgc = + rho_scgc % species[iSpecies].mass_concentration_scgc / + species[iSpecies].mass; + } + report.exit(function); return; } diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 6e51af60..6df7e8d3 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -45,6 +45,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.ionization_scgc.zeros(); tmp.concentration_scgc.set_size(nLons, nLats, nAlts); + tmp.mass_concentration_scgc.set_size(nLons, nLats, nAlts); tmp.density_scgc.ones(); tmp.chapman_scgc.ones(); @@ -132,6 +133,9 @@ Neutrals::Neutrals(Grid grid, kappa_eddy_scgc.set_size(nLons, nLats, nAlts); kappa_eddy_scgc.zeros(); + viscosity_scgc.set_size(nLons, nLats, nAlts); + viscosity_scgc.zeros(); + conduction_scgc.set_size(nLons, nLats, nAlts); heating_euv_scgc.set_size(nLons, nLats, nAlts); heating_chemical_scgc.set_size(nLons, nLats, nAlts); @@ -142,7 +146,9 @@ Neutrals::Neutrals(Grid grid, // bulk ion_neutral collisional acceleration: acc_ion_collisions = make_cube_vector(nLons, nLats, nAlts, 3); - + + // bulk ion_neutral collisional acceleration: + acc_sources_total = make_cube_vector(nLons, nLats, nAlts, 3); // This gets a bunch of the species-dependent characteristics: iErr = read_planet_file(planet); diff --git a/src/neutrals_momentum_viscosity.cpp b/src/neutrals_momentum_viscosity.cpp new file mode 100644 index 00000000..9782742a --- /dev/null +++ b/src/neutrals_momentum_viscosity.cpp @@ -0,0 +1,97 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md +// for members) Full license can be found in License.md + +#include "aether.h" + +// --------------------------------------------------------------------------- +// Calculate viscosity +// --------------------------------------------------------------------------- + +void Neutrals::update_horizontal_velocity(Grid grid, Times time) { + + std::string function = "Neutrals::update_horizontal_velocity"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + int64_t iLon, iLat, iDir; + int64_t nLons = grid.get_nLons(); + int64_t nLats = grid.get_nLats(); + int64_t nAlts = grid.get_nAlts(); + int64_t nGCs = grid.get_nGCs(); + + dt = time.get_dt(); + + if (nAlts == 2 * nGCs + 1) { + // Simply update the temperature if there is no conduction: + velocity_vcgc[0] = velocity_vcgc[0] + dt * acc_sources_total[0]; + velocity_vcgc[1] = velocity_vcgc[1] + dt * acc_sources_total[1]; + } else { + + arma_cube rhor23d(nLons, nLats, nAlts); + arma_cube lambda3d(nLons, nLats, nAlts); + //arma_cube prandtl3d(nLons, nLats, nAlts); + + rhor23d = rho_scgc % grid.radius2_scgc; + + //// Need to make this eddy * rho * cv: + //if (input.get_use_eddy_energy()) + // prandtl3d = kappa_eddy_scgc % rho_scgc % Cv_scgc; + //else + // prandtl3d.zeros(); + + lambda3d = (viscosity_scgc) % grid.radius2_scgc; + + arma_vec vel1d(nAlts); + arma_vec lambda1d(nAlts); + arma_vec rhor21d(nAlts); + arma_vec dalt1d(nAlts); + arma_vec sources1d(nAlts); + arma_vec visc1d(nAlts); + + //if (iProc == 1) { + // std::cout << "neutrals_energy heating source : "; + // display_vector(heating_sources_total.tube(11,2)); + // std::cout << " -> temp before: "; + // display_vector(temperature_scgc.tube(11,2)); + //} + + for (iDir = 0; iDir < 2; iDir++) { + for (iLon = 0; iLon < nLons; iLon++) { + for (iLat = 0; iLat < nLats; iLat++) { + + vel1d = velocity_vcgc[iDir].tube(iLon, iLat); + lambda1d = lambda3d.tube(iLon, iLat); + rhor21d = rhor23d.tube(iLon, iLat); + sources1d.zeros(); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + visc1d.zeros(); + + visc1d = solver_conduction(vel1d, + lambda1d, + rhor21d, + sources1d, + dalt1d, + dt, + nGCs, + false); + velocity_vcgc[iDir].tube(iLon, iLat) = visc1d; + + // Store the difference (as a rate), so we can output it later + // if we want: + //conduction_scgc.tube(iLon, iLat) = + // (conduction1d - temp1d)/dt - sources1d; + } // lat + } // lon + } + + //if (iProc == 1) { + // std::cout << " -> temp after: "; + // display_vector(temperature_scgc.tube(11,2)); + //} + + } // if nAlts == 1 + 2*GCs + + report.exit(function); + return; +} From a5d5d66c67750d5212c091def99d9e09b7ecf678 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:06:33 -0500 Subject: [PATCH 020/691] BUG: order of cube was wrong --- src/tools.cpp | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/tools.cpp b/src/tools.cpp index 973cd234..9bf5ec10 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -18,20 +18,20 @@ void fill_corners(arma_cube &values, int64_t nGCs) { for (iGCy = 0; iGCy < nGCs; iGCy++) { // lower left: values.tube(iGCx, iGCy) = 0.5 * ( - values.tube(iGCx, nGCs) + - values.tube(nGCs, iGCy)); + values.tube(iGCx, nGCs) + + values.tube(nGCs, iGCy)); // lower right: values.tube(nXs - iGCx - 1, iGCy) = 0.5 * ( - values.tube(nXs - iGCx - 1, nGCs) + - values.tube(nXs - nGCs - 1, iGCy)); + values.tube(nXs - iGCx - 1, nGCs) + + values.tube(nXs - nGCs - 1, iGCy)); // upper left: values.tube(iGCx, nYs - iGCy - 1) = 0.5 * ( - values.tube(iGCx, nYs - nGCs - 1) + - values.tube(nGCs, nYs - iGCy - 1)); + values.tube(iGCx, nYs - nGCs - 1) + + values.tube(nGCs, nYs - iGCy - 1)); // upper right: values.tube(nXs - iGCx - 1, nYs - iGCy - 1) = 0.5 * ( - values.tube(nXs - iGCx - 1, nYs - nGCs - 1) + - values.tube(nXs - nGCs - 1, nYs - iGCy - 1)); + values.tube(nXs - iGCx - 1, nYs - nGCs - 1) + + values.tube(nXs - nGCs - 1, nYs - iGCy - 1)); } } @@ -493,13 +493,11 @@ void refvect2sph(arma_mat &u1, arma_mat &u2, arma_mat &u, arma_mat &v, //---------------------------------------------------------------------- std::vector index_to_ijk(arma_cube cube, int index) { - arma::uword x = cube.n_rows; - arma::uword y = cube.n_cols; - int altitude = index / (x * y); - int remainder = index % (x * y); - int lattitude = remainder / y; - int longitude = remainder % y; - return std::vector {lattitude, longitude, altitude}; + uvec u = ind2sub(size(cube), index); + int iLon = u(0); + int iLat = u(1); + int iAlt = u(2); + return std::vector {iLon, iLat, iAlt}; } //---------------------------------------------------------------------- @@ -520,6 +518,7 @@ bool all_finite(arma_cube cube, std::string name) { "," + std::to_string(loc[1]) + "," + std::to_string(loc[2]) + ")"; int size = locations.size(); + std::cout << "all_finite : " << cube(loc[0], loc[1], loc[2]) << "\n"; std::string error_message = std::to_string(size) + " Nonfinite values exist in " + name + From a8be372eabeffabcbda8b2ab09ef788e8c79f16c Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:07:18 -0500 Subject: [PATCH 021/691] BUG: Perturb is optional, so don't flag if not there --- src/inputs.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index 137dabd8..be94710a 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -1021,7 +1021,10 @@ bool Inputs::get_use_eddy_energy() { // ----------------------------------------------------------------------- json Inputs::get_perturb_values() { - return get_setting_json("Perturb"); + json value; + if (settings.find("Perturb") != settings.end()) + value = settings.at("Perturb"); + return value; } // ----------------------------------------------------------------------- From 9058978ea4b39a888f21761795dcaca08b7dcd04 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:08:11 -0500 Subject: [PATCH 022/691] BUG: fill corners for old exchange messages --- src/exchange_messages.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 3791717c..efbf7b5b 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -612,6 +612,13 @@ bool Neutrals::exchange_old(Grid &grid) { set_horizontal_bcs(iDir, grid); } + for (int i = 0; i < nSpecies; ++i) + fill_corners(species[i].density_scgc, nG); + + fill_corners(temperature_scgc, nG); + for (int iDir = 0; iDir < 3; iDir++) + fill_corners(velocity_vcgc[iDir], nG); + // Wait for all processors to be done. MPI_Barrier(aether_comm); From 83d67983d78ba57443f32b5f3dcc7089479508fa Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:08:50 -0500 Subject: [PATCH 023/691] FEAT: add viscosity --- src/add_sources.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index 64c2ebdd..3492c90e 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -23,7 +23,7 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { + heating_ion_collisions_scgc - O_cool_scgc - NO_cool_scgc; - + // Solve the laplace equations using the source terms, // updating the neutral temperature: update_temperature(grid, time); @@ -40,7 +40,10 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { grid.cent_acc_vcgc[iDir] + acc_coriolis[iDir] + acc_ion_collisions[iDir]); + acc_sources_total[iDir].zeros(); } + // Apply Viscosity: + update_horizontal_velocity(grid, time); } else { for (int64_t iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { // Pick out the advected neutral species: From 3ee509762dcec4e2e437fff094db356ada58c35c Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:09:30 -0500 Subject: [PATCH 024/691] STY: clean up code a bit --- src/neutrals_energy.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index dfce6560..a7b8d17d 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -1,11 +1,11 @@ -// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) -// Full license can be found in License.md +// Copyright 2020, the Aether Development Team (see doc/dev_team.md +// for members) Full license can be found in License.md #include "aether.h" -// ----------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // Calculate thermal conduction -// ----------------------------------------------------------------------------- +// --------------------------------------------------------------------------- void Neutrals::update_temperature(Grid grid, Times time) { @@ -59,11 +59,20 @@ void Neutrals::update_temperature(Grid grid, Times time) { dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); conduction1d.zeros(); - conduction1d = solver_conduction(temp1d, lambda1d, rhocvr21d, sources1d, dalt1d, dt, nGCs, false); + conduction1d = solver_conduction(temp1d, + lambda1d, + rhocvr21d, + sources1d, + dalt1d, + dt, + nGCs, + false); temperature_scgc.tube(iLon, iLat) = conduction1d; - // Store the difference (as a rate), so we can output it later if we want: - conduction_scgc.tube(iLon, iLat) = (conduction1d - temp1d)/dt - sources1d; + // Store the difference (as a rate), so we can output it later + // if we want: + conduction_scgc.tube(iLon, iLat) = + (conduction1d - temp1d)/dt - sources1d; } // lat } // lon From 3c69cb373bbf2224944c9b3eb4448ac9b27fb7c9 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:10:16 -0500 Subject: [PATCH 025/691] FEAT: add viscosity and exchange messages before horizontal advection --- src/advance.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index db36d604..d2a75c35 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -46,6 +46,7 @@ bool advance(Planets &planet, neutrals.calc_pressure(); neutrals.calc_bulk_velocity(); neutrals.calc_kappa_eddy(); + neutrals.calc_viscosity(); neutrals.calc_cMax(); precision_t dtNeutral = neutrals.calc_dt(gGrid); @@ -66,12 +67,12 @@ bool advance(Planets &planet, if (input.get_nAltsGeo() > 1) neutrals.advect_vertical(gGrid, time); + neutrals.exchange_old(gGrid); advect(gGrid, time, neutrals); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites(); - // ------------------------------------ // Calculate source terms next: From 5df1b1054ab85355f5c406c33c69b2e1946945f9 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 1 Dec 2023 07:11:09 -0500 Subject: [PATCH 026/691] FEAT: limit changes near the pole --- src/solver_advection.cpp | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 033aa6ac..7df27aeb 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -318,7 +318,10 @@ void advect(Grid &grid, arma_mat area, xWidth, yWidth, geometry; + // These are all needed by the solver: neutrals.calc_mass_density(); + neutrals.calc_mean_major_mass(); + neutrals.calc_specific_heat(); arma_mat t_to_e; @@ -507,9 +510,28 @@ void advect(Grid &grid, neutrals.velocity_vcgc[0].slice(iAlt) = xVel; neutrals.velocity_vcgc[1].slice(iAlt) = yVel; - temp = totalE / rho - 0.5 * (xVel % xVel + yVel % yVel); - - neutrals.temperature_scgc.slice(iAlt) = temp / t_to_e; + temp = (totalE / rho - 0.5 * (xVel % xVel + yVel % yVel)) / t_to_e; + precision_t fac, dm, dp; + + for (int64_t j = nGCs; j < nY - nGCs; j++) { + for (int64_t i = nGCs; i < nX - nGCs; i++) { + fac = 1.0; + if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { + fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); + } + dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); + dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); + if (temp(i,j) < dm) temp(i,j) = dm; + if (temp(i,j) > dp) temp(i,j) = dp; + neutrals.temperature_scgc(i,j,iAlt) = temp(i,j); + + dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); + dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); + if (rho(i,j) < dm) rho(i,j) = dm; + if (rho(i,j) > dp) rho(i,j) = dp; + neutrals.rho_scgc(i,j,iAlt) = rho(i,j); + } + } if (report.test_verbose(3) && iAlt == 8) { std::cout << "end t : " << neutrals.temperature_scgc.slice(iAlt).min() << " " << neutrals.temperature_scgc.slice(iAlt).max() << "\n"; std::cout << "end temp : " << temp.min() << " " << temp.max() << "\n"; @@ -517,6 +539,8 @@ void advect(Grid &grid, std::cout << "end yVel : " << yVel.min() << " " << yVel.max() << "\n"; } } + neutrals.calc_density_from_mass_concentration(); + report.exit(function); return; -} \ No newline at end of file +} From df91d189a88de8582630b9940ffffa8d36a9cacd Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Sun, 10 Dec 2023 18:37:59 -0500 Subject: [PATCH 027/691] BUG: Need a real ion temperature --- src/calc_ion_temperature.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 73b4a3b8..06a09044 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -60,14 +60,11 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - for (iIon = 0; iIon < nSpecs; iIon++) - species[iIon].temperature_scgc = - neutrals.temperature_scgc + - 1.5 * (neutrals.temperature_scgc - neutrals.temperature_scgc(2,2,2)); - - temperature_scgc = neutrals.temperature_scgc + - 1.5 * (neutrals.temperature_scgc - neutrals.temperature_scgc(2,2,2)); + for (iIon = 0; iIon < nSpecies; iIon++) + species[iIon].temperature_scgc = neutrals.temperature_scgc; + temperature_scgc = neutrals.temperature_scgc; + report.exit(function); return; From b9d9887df461f74827a2afb5b9b2c27ce3a66ffa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:37:52 -0500 Subject: [PATCH 028/691] FEAT: allow no aurora --- ext/IE/EIE_Initialize.f90 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/ext/IE/EIE_Initialize.f90 b/ext/IE/EIE_Initialize.f90 index 235f6f93..1f9ddbbf 100644 --- a/ext/IE/EIE_Initialize.f90 +++ b/ext/IE/EIE_Initialize.f90 @@ -168,18 +168,23 @@ subroutine EIE_Initialize(iOutputError) IsFound_AuroralModel = .true. endif - if (index(EIE_NameOfAuroralModel,'hpi') > 0) then + if (index(EIE_NameOfAuroralModel,'hpi') > 0) then call read_conductance_model(iError) IsFound_AuroralModel = .true. endif - if (index(EIE_NameOfAuroralModel,'pem') > 0) then + if (index(EIE_NameOfAuroralModel,'pem') > 0) then call read_conductance_model(iError) IsFound_AuroralModel = .true. endif - if (index(EIE_NameOfAuroralModel,'fta') > 0) then + if (index(EIE_NameOfAuroralModel,'fta') > 0) then + IsFound_AuroralModel = .true. + endif + if (index(EIE_NameOfAuroralModel,'zero') > 0) then + IsFound_AuroralModel = .true. + endif + if (index(EIE_NameOfAuroralModel,'none') > 0) then IsFound_AuroralModel = .true. endif - if (iDebugLevel > 4) write(*,*) "=====> Back from read conductance" if (index(EIE_NameOfEFieldModel,'amie') > 0) then From 373d2b194d8683429a1099779ac392e837ae6bce Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:38:18 -0500 Subject: [PATCH 029/691] FEAT: allow no aurora --- ext/IE/EIE_IoLibrary.f90 | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/IE/EIE_IoLibrary.f90 b/ext/IE/EIE_IoLibrary.f90 index dde39c9f..6116694b 100644 --- a/ext/IE/EIE_IoLibrary.f90 +++ b/ext/IE/EIE_IoLibrary.f90 @@ -604,6 +604,14 @@ subroutine IO_GetElectronDiffuseAurora(EFluxOut, AveEOut, iError) endif + if ((index(EIE_NameOfAuroralModel,'zero') > 0) .or. & + (index(EIE_NameOfAuroralModel,'none') > 0)) then + iError = 0 + AveEOut = 3.0 + EFluxOut = 1e-9 + endif + + endif end subroutine IO_GetElectronDiffuseAurora From 9fada92c2d6d8fd5af51693378145241469aa0bb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:39:38 -0500 Subject: [PATCH 030/691] BUG: this seems more correct --- src/calc_chemical_sources.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/calc_chemical_sources.cpp b/src/calc_chemical_sources.cpp index 1f07f13d..7498c29b 100644 --- a/src/calc_chemical_sources.cpp +++ b/src/calc_chemical_sources.cpp @@ -123,12 +123,10 @@ void Chemistry::calc_chemical_sources(Neutrals &neutrals, temp = ions.electron_temperature_scgc; else if (piecewiseTemp == "Tn") temp = neutrals.temperature_scgc; - - // Limit the reagion to where the temperautre is in the range: - change3d = change3d % (change3d > reactions[iReaction].min); - + // zero out the rate when it is outside of the temperature bounds: + change3d.elem( find(temp < reactions[iReaction].min) ).zeros(); if (reactions[iReaction].max > 0) - change3d = change3d % (change3d <= reactions[iReaction].max); + change3d.elem( find(temp > reactions[iReaction].max) ).zeros(); } // Now that the reaction rate is calculated, multiply by the @@ -145,7 +143,7 @@ void Chemistry::calc_chemical_sources(Neutrals &neutrals, } // calculate heat change - chemical_heating += change3d * reactions[iReaction].energy; + chemical_heating = chemical_heating + change3d * reactions[iReaction].energy; // Now that full loss term is calculated, we can then add this // value to the losses: From 26dc45a5abd80959667330fcbef5a1c6432bd7b3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:40:23 -0500 Subject: [PATCH 031/691] BUG: fake ion temperature profile improved --- src/calc_ion_temperature.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 06a09044..6605b457 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -60,10 +60,11 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - for (iIon = 0; iIon < nSpecies; iIon++) - species[iIon].temperature_scgc = neutrals.temperature_scgc; + temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc/1000.0 - 90.0) * 60.0; - temperature_scgc = neutrals.temperature_scgc; + for (iIon = 0; iIon < nSpecies; iIon++) + species[iIon].temperature_scgc = temperature_scgc; + //species[iIon].temperature_scgc = neutrals.temperature_scgc; report.exit(function); return; From dc0900b8e06e8c097cd3cfac307c0c38a6169197 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:41:15 -0500 Subject: [PATCH 032/691] STY: fixed weird code --- src/calc_neutral_derived.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 6f2f1351..8d24c414 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -557,20 +557,17 @@ void Neutrals::calc_chapman(Grid grid) { xp3d = grid.radius_scgc / species[iSpecies].scale_height_scgc; y3d = sqrt(0.5 * xp3d) % abs(grid.cos_sza_scgc); - iAlt = nAlts - 1; integral3d.fill(0.0); - + iAlt = nAlts - 1; integral3d.slice(iAlt) = species[iSpecies].density_scgc.slice(iAlt) % species[iSpecies].scale_height_scgc.slice(iAlt); - for (iAlt = nAlts - 1; iAlt >= 0; iAlt--) { - if (iAlt < nAlts - 1) { - integral3d.slice(iAlt) = integral3d.slice(iAlt + 1) + - species[iSpecies].density_scgc.slice(iAlt) % - grid.dalt_lower_scgc.slice(iAlt + 1); - } + for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { + integral3d.slice(iAlt) = integral3d.slice(iAlt + 1) + + species[iSpecies].density_scgc.slice(iAlt) % + grid.dalt_lower_scgc.slice(iAlt + 1); } species[iSpecies].rho_alt_int_scgc = integral3d * species[iSpecies].mass; From ee774921fcba123648e3f34d138f06e2ab7d10fc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:41:50 -0500 Subject: [PATCH 033/691] BUG: don't interpolate if there are no values --- src/indices.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/indices.cpp b/src/indices.cpp index 97e86334..388f42c5 100644 --- a/src/indices.cpp +++ b/src/indices.cpp @@ -307,6 +307,9 @@ precision_t Indices::get_index(double time, int index) { int64_t iLow, iMid, iHigh; + if (all_indices_arrays[index].nValues <= 0) + return -1.0e32; + iLow = 0; iHigh = all_indices_arrays[index].nValues - 1; iMid = (iHigh + iLow) / 2; From 298ad31cbae59387ca40db17b70848d075280507 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:42:15 -0500 Subject: [PATCH 034/691] FEAT: add more heating terms --- src/output.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/output.cpp b/src/output.cpp index c4c49ecf..66ca3704 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -239,6 +239,22 @@ bool output(const Neutrals &neutrals, // Thermal: if (type_output == "therm") { + AllOutputContainers[iOutput].store_variable("Heating_EUV", + "Heating from EUV", + "K/s", + neutrals.heating_euv_scgc); + AllOutputContainers[iOutput].store_variable("Heating_Chemistry", + "Heating from Chemistry", + "K/s", + neutrals.heating_chemical_scgc); + AllOutputContainers[iOutput].store_variable("Heating_Collisions", + "Heating from Ion Neutral Collisions", + "K/s", + neutrals.heating_ion_collisions_scgc); + AllOutputContainers[iOutput].store_variable("Conduction", + "Conduction", + "K/s", + neutrals.conduction_scgc); AllOutputContainers[iOutput].store_variable("O Rad Cooling", "[O] Radiative Cooling", "K/s", From b24176ba4b1d0f9eb8e9c87722aaf13703497b6f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:42:56 -0500 Subject: [PATCH 035/691] STY: need to test to see if these are the same --- src/neutrals_energy.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index a7b8d17d..da6f0bf6 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -56,6 +56,11 @@ void Neutrals::update_temperature(Grid grid, Times time) { lambda1d = lambda3d.tube(iLon, iLat); rhocvr21d = rhocvr23d.tube(iLon, iLat); sources1d = heating_sources_total.tube(iLon, iLat); + + temp1d = temp1d + dt * sources1d; + sources1d.zeros(); + + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); conduction1d.zeros(); From 34f06d0a1b1f7e288ba066ec28c5a86b162449f5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Dec 2023 10:44:29 -0500 Subject: [PATCH 036/691] FEAT: for testing --- .../run/UA/inputs/chemistry_earth_simple.csv | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 share/run/UA/inputs/chemistry_earth_simple.csv diff --git a/share/run/UA/inputs/chemistry_earth_simple.csv b/share/run/UA/inputs/chemistry_earth_simple.csv new file mode 100644 index 00000000..9f710d03 --- /dev/null +++ b/share/run/UA/inputs/chemistry_earth_simple.csv @@ -0,0 +1,45 @@ +name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,uncertainty,,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType,eol +reaction,name,name,name,goes to,name,name,name,mks,,,ratio,eV,,,K,T,dimensionless,T,K,K,"1: (numerator/temp)^exponent, 2: temp*exp(numerator/temp)",eol +R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,0.1,gitm,250,Te,0.7,,,,1,eol +R23,N2+,e-,,,N_2D,N_2D,,1.39E-13,(300/Te)^0.39,,0.56,1.04,0.1,gitm,300,Te,0.39,,,,1,eol +R24,N2+,e-,,,N,N,,2.20E-13,(300/Te)^0.39,,0.44,5.77,0.1,gitm,300,Te,0.39,,,,1,eol +R26,N2+,NO,,,N2,NO+,,3.60E-16,,,1,6.33,0.1,gitm,,,,,,,,eol +R27,N2+,O,,,NO+,N_2D,,1.33E-16,(300/Ti)^0.44,Ti<=1500,1,0.7,0.1,gitm,300,Ti,0.44,Ti,0,1500,1,eol +R27,,,,,,,,6.55E-17,(Ti/1500)^0.2,Ti>1500,,,0.1,,1500,Ti,-0.2,,1500,,1,eol +R29,N2+,O,,,O+,N2,,7.00E-18,(300/Ti)^0.23,,1,1.96,0.1,gitm,300,Ti,0.23,,,,1,eol +R30,N2+,O2,,,O2+,N2,,5.10E-17,(300/Ti)^1.16,Ti<=1000,1,3.53,0.1,gitm,300,Ti,1.16,Ti,0,1000,1,eol +R30,,,,,,,,1.26E-17,(Ti/1000)^0.67,Ti>1000,,,0.1,,1000,Ti,-0.67,,1000,,1,eol +R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0.38,0.1,gitm,300,Te,0.85,,,,1,eol +R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,2.77,0.1,gitm,300,Te,0.85,,,,1,eol +R35,O+,N2,,,NO+,N,,1.20E-18,,,1,1.1,0.1,,,,,,,,,eol +R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,0.1,gitm,300,Ti,-0.87,,,,1,eol +R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,0.1,gitm,300,Ti,0.52,Ti,0,900,1,eol +R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,0.1,,900,Ti,-0.92,,900,,1,eol +R38,O+_2D,O2,,,O2+,O,,7.00E-17,,,1,4.865,0.1,gitm,,,,,,,,eol +R39,O+_2P,O2,,,O2+,O,,1.30E-16,,,1,6.54,0.1,gitm,,,,,,,,eol +R40,O+_2P,O2,,,O+,O2,,1.30E-16,,,1,5.016,0.1,gitm,,,,,,,,eol +R41,O2+,e-,,,O,O,,1.95E-13,(300/Te)^0.70,Ti<=1200,1,50,0.1,gitm,300,Te,0.7,Ti,0,1200,1,eol +R41,,,,,,,,7.39E-14,(1200/Te)^0.56,Ti>1200,,,0.1,,1200,Te,0.56,,1200,,1,eol +R46,O2+,NO,,,NO+,O2,,4.50E-16,,,1,2.813,0.1,gitm,,,,,,,,eol +R15,N+,NO,,,N2+,O,,8.33E-17,(300/Ti)^0.24,,1,2.2,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol +R16,N+,NO,,,NO+,N,,4.72E-16,(300/Ti)^0.24,,1,3.4,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol +R17,N+,O,,,O+,N,,2.20E-18,,,1,0.93,0.1,gitm (n branch),,,,,,,,eol +R18,N+,O2,,,NO+,O_1D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.36,4.71,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R18,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R19,N+,O2,,,NO+,O_3P,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R19,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R20,N+,O2,,,O+_4S,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R20,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R21,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R22,N+,O2,,,O2+,N_4S,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.35,2.5,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R22,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R2,He+,N2,,,He,N,N+,7.80E-16,,,1,0.28,0.1,gitm,,,,,,,,eol +R3,He+,N2,,,He,N2+,,5.20E-16,,,1,0,0.1,no heating?,,,,,,,,eol +R4,He+,NO,,,He,N+,O,1.35E-15,,,1,0,0.1,,,,,,,,,eol +R5,He+,NO,,,He,O+,N,1.00E-16,,,1,0,0.1,,,,,,,,,eol +R6,He+,O2,,,He,O+_2D,O,2.37E-16,,,1,0,0.1,,,,,,,,,eol +R7,He+,O2,,,He,O+_2P,O,6.04E-17,,,1,0,0.1,,,,,,,,,eol +R8,He+,O2,,,He,O+_4S,O,2.39E-17,,,1,0,0.1,,,,,,,,,eol +R9,He+,O2,,,He,O+,O_1D,4.60E-17,,,1,0,0.1,,,,,,,,,eol +R10,He+,O2,,,He,O2+,,9.20E-18,,,1,0,0.1,,,,,,,,,eol From 689ed57c313d0a95413ad6653550a710cd97aa2e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:23:42 -0500 Subject: [PATCH 037/691] FEAT: flags for centripedal and coriolis --- include/inputs.h | 3 ++- src/inputs.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 4f0d9df8..6ff0948b 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -72,7 +72,8 @@ class Inputs { bool get_NO_cooling(); bool get_O_cooling(); - bool get_cent_acc(); + bool get_use_centripetal(); + bool get_use_coriolis(); std::string get_student_name(); bool get_is_student(); diff --git a/src/inputs.cpp b/src/inputs.cpp index be94710a..5dedd054 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -694,8 +694,16 @@ bool Inputs::get_O_cooling() { // Return centripetal acceleration // ----------------------------------------------------------------------- -bool Inputs::get_cent_acc() { - return get_setting_bool("Sources", "Grid", "Cent_acc"); +bool Inputs::get_use_centripetal() { + return get_setting_bool("Sources", "Grid", "Centripetal"); +} + +// ----------------------------------------------------------------------- +// Return coriolis acceleration +// ----------------------------------------------------------------------- + +bool Inputs::get_use_coriolis() { + return get_setting_bool("Sources", "Grid", "Coriolis"); } // ----------------------------------------------------------------------- From ff33c70e6f357eb15ffc8c1d7223318729dd1ed6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:24:17 -0500 Subject: [PATCH 038/691] FEAT: flags for centripedal and coriolis --- share/run/UA/inputs/defaults.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index ec923bbe..8bf9e0b9 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -92,7 +92,8 @@ "Sources" : { "Grid" : { - "Cent_acc" : true }, + "Centripetal" : true, + "Coriolis" : true }, "Neutrals" : { "NO_cool" : false, "O_cool": false } }, From 4faaa6d8f2a06df8c0f6a3dcd473c8eaba7d2158 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:26:50 -0500 Subject: [PATCH 039/691] FEAT: flag for coriolis added --- src/add_sources.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index 3492c90e..37916aff 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -29,11 +29,13 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { update_temperature(grid, time); std::vector acc_coriolis; + acc_coriolis = make_cube_vector(grid.get_nX(), grid.get_nY(), grid.get_nZ(), 3); // If we only consider the bulk winds in the horizontal direction: if (input.get_advection_neutrals_bulkwinds()) { // Calculate Coriolis: - acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + if (input.get_use_coriolis()) + acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); // Add Velocity sources to bulk winds: for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( @@ -49,9 +51,10 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { // Pick out the advected neutral species: species_chars & advected_neutral = species[species_to_advect[iSpec]]; // Calculate Coriolis: - acc_coriolis = coriolis(advected_neutral.velocity_vcgc, - planet.get_omega(), - grid.geoLat_scgc); + if (input.get_use_coriolis()) + acc_coriolis = coriolis(advected_neutral.velocity_vcgc, + planet.get_omega(), + grid.geoLat_scgc); for (int iDir = 0; iDir < 2; iDir++) { // update velocities based on acceleration: From c5dc02a2729c2b8f53c6baa2d0e2fd1835fad53d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:27:43 -0500 Subject: [PATCH 040/691] BUG: reverse horizontal and vertical solver order --- src/advance.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index d2a75c35..a125fc94 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -64,12 +64,12 @@ bool advance(Planets &planet, if (didWork) didWork = neutrals.set_bcs(gGrid, time, indices); - if (input.get_nAltsGeo() > 1) - neutrals.advect_vertical(gGrid, time); - neutrals.exchange_old(gGrid); advect(gGrid, time, neutrals); + if (input.get_nAltsGeo() > 1) + neutrals.advect_vertical(gGrid, time); + if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites(); From 061d9ecdc67e33a5ae0d1a7de47e25e43a5a281f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:28:23 -0500 Subject: [PATCH 041/691] FEAT: use real gamma and not 5/3 --- src/solver_advection.cpp | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 7df27aeb..3f89e982 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -279,6 +279,7 @@ void advect(Grid &grid, projection_struct xVelP; projection_struct yVelP; projection_struct tempP; + projection_struct gammaP; precision_t gamma = 5.0/3.0; precision_t dt = time.get_dt(); @@ -318,6 +319,8 @@ void advect(Grid &grid, arma_mat area, xWidth, yWidth, geometry; + arma_mat gamma2d; + // These are all needed by the solver: neutrals.calc_mass_density(); neutrals.calc_mean_major_mass(); @@ -334,7 +337,8 @@ void advect(Grid &grid, yVel = neutrals.velocity_vcgc[1].slice(iAlt); rho = neutrals.rho_scgc.slice(iAlt); // this is "e", or temperature expressed as an energy - t_to_e = 1.0/(gamma-1.0) * cKB / neutrals.mean_major_mass_scgc.slice(iAlt); + gamma2d = neutrals.gamma_scgc.slice(iAlt); + t_to_e = 1.0 / (gamma2d - 1.0) * cKB / neutrals.mean_major_mass_scgc.slice(iAlt); temp = t_to_e % neutrals.temperature_scgc.slice(iAlt); // ------------------------------------------------ @@ -358,6 +362,7 @@ void advect(Grid &grid, xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); yVelP = project_to_edges(yVel, x, xEdges, y, yEdges, nGCs); tempP = project_to_edges(temp, x, xEdges, y, yEdges, nGCs); + gammaP = project_to_edges(gamma2d, x, xEdges, y, yEdges, nGCs); // ------------------------------------------------ // Calculate derived equations (at edges) @@ -398,32 +403,32 @@ void advect(Grid &grid, eq1FluxD = rhoP.D % yVelP.D; eq1FluxU = rhoP.U % yVelP.U; - eq2FluxL = rhoP.L % (xVelP.L % xVelP.L + (gamma-1) * tempP.L); - eq2FluxR = rhoP.R % (xVelP.R % xVelP.R + (gamma-1) * tempP.R); + eq2FluxL = rhoP.L % (xVelP.L % xVelP.L + (gammaP.L - 1) % tempP.L); + eq2FluxR = rhoP.R % (xVelP.R % xVelP.R + (gammaP.R - 1) % tempP.R); eq2FluxD = rhoP.D % xVelP.D % yVelP.D; eq2FluxU = rhoP.U % xVelP.U % yVelP.U; eq2Flux = rho % xVel % yVel; eq3FluxR = rhoP.R % xVelP.R % yVelP.R; eq3FluxL = rhoP.L % xVelP.L % yVelP.L; - eq3FluxD = rhoP.D % (yVelP.D % yVelP.D + (gamma-1) * tempP.D); - eq3FluxU = rhoP.U % (yVelP.U % yVelP.U + (gamma-1) * tempP.U); - eq3Flux = rho % (yVel % yVel + (gamma-1) * temp); + eq3FluxD = rhoP.D % (yVelP.D % yVelP.D + (gammaP.D - 1) % tempP.D); + eq3FluxU = rhoP.U % (yVelP.U % yVelP.U + (gammaP.U - 1) % tempP.U); + eq3Flux = rho % (yVel % yVel + (gamma2d - 1) % temp); - eq4FluxL = rhoP.L % xVelP.L % (0.5 * velL2 + gamma * tempP.L); - eq4FluxR = rhoP.R % xVelP.R % (0.5 * velR2 + gamma * tempP.R); - eq4FluxD = rhoP.D % yVelP.D % (0.5 * velD2 + gamma * tempP.D); - eq4FluxU = rhoP.U % yVelP.U % (0.5 * velU2 + gamma * tempP.U); + eq4FluxL = rhoP.L % xVelP.L % (0.5 * velL2 + gammaP.L % tempP.L); + eq4FluxR = rhoP.R % xVelP.R % (0.5 * velR2 + gammaP.R % tempP.R); + eq4FluxD = rhoP.D % yVelP.D % (0.5 * velD2 + gammaP.D % tempP.D); + eq4FluxU = rhoP.U % yVelP.U % (0.5 * velU2 + gammaP.U % tempP.U); // ------------------------------------------------ // Calculate the wave speed for the diffusive flux: report.print(3, "Advection: Diffusive Fluxes"); - wsL = sqrt(velL2) + sqrt(gamma * (gamma-1) * tempP.L); - wsR = sqrt(velR2) + sqrt(gamma * (gamma-1) * tempP.R); - wsD = sqrt(velD2) + sqrt(gamma * (gamma-1) * tempP.D); - wsU = sqrt(velU2) + sqrt(gamma * (gamma-1) * tempP.U); + wsL = sqrt(velL2) + sqrt(gammaP.L % (gammaP.L - 1) % tempP.L); + wsR = sqrt(velR2) + sqrt(gammaP.R % (gammaP.R - 1) % tempP.R); + wsD = sqrt(velD2) + sqrt(gammaP.D % (gammaP.D - 1) % tempP.D); + wsU = sqrt(velU2) + sqrt(gammaP.U % (gammaP.U - 1) % tempP.U); wsLR = wsR; for (int64_t i = 0; i < nX + 1; i++) { From 4639e9ec97d5a6d12ccff70d8c876353f934c394 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:32:56 -0500 Subject: [PATCH 042/691] BUG: only bulk vertical winds --- src/solver_vertical_rusanov.cpp | 41 ++++++++++----------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 0b9258aa..d517e604 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -277,7 +277,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].velocity_vcgc[2] - dt * (species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] - v2or - + 0.1 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + + 0.05 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + gradTemp * cKB / mass + abs(grid.gravity_vcgc[2]))) + dt * diffVertVel_s[iSpecies]; @@ -294,28 +294,9 @@ void Neutrals::solver_vertical_rusanov(Grid grid, + dt * diffTemp; for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - if (species[iSpecies].DoAdvect) { - - for (iX = nGCs; iX < nXs - nGCs; iX++) - for (iY = nGCs; iY < nYs - nGCs; iY++) - for (iZ = nGCs; iZ < nZs - nGCs; iZ++) { - if (abs(species[iSpecies].newVelocity_vcgc[2](iX, iY, iZ)) > 100.0) { - if (species[iSpecies].newVelocity_vcgc[2](iX, iY, iZ) > 100.0) - species[iSpecies].newVelocity_vcgc[2](iX, iY, iZ) = 100.0; - else - species[iSpecies].newVelocity_vcgc[2](iX, iY, iZ) = -100.0; - } - - if (newTemperature_scgc(iX, iY, iZ) < 100.0 || - std::isnan(newTemperature_scgc(iX, iY, iZ))) { - std::cout << "low temp found : " - << iX << " " - << iY << " " - << iZ << " " - << newTemperature_scgc(iX, iY, iZ) << " "; - } - } - } + if (species[iSpecies].DoAdvect) + species[iSpecies].newVelocity_vcgc[2].clamp(-100,100); + newTemperature_scgc.clamp(10, 1e32); for (iX = nGCs; iX < nXs - nGCs; iX++) for (iY = nGCs; iY < nYs - nGCs; iY++) @@ -336,13 +317,15 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } - // If you don't advect a species, then fill with hydrostatic: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - if (!species[iSpecies].DoAdvect) - fill_with_hydrostatic(iSpecies, nGCs, nZs, grid); - calc_mass_density(); - calc_bulk_velocity(); + // Calculate bulk vertical winds: + velocity_vcgc[2].zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + if (species[iSpecies].DoAdvect) { + velocity_vcgc[2] = velocity_vcgc[2] + + species[iSpecies].mass * species[iSpecies].density_scgc % + species[iSpecies].velocity_vcgc[2] / rho_scgc; + } report.exit(function); return; From fe48f6f12cd5a747a07f1e1e659ff5af09eaa4a7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 07:34:11 -0500 Subject: [PATCH 043/691] FEAT: input files for acheron --- share/run/UA/inputs/acheron.in | 55 +++++++++++++++++++++ share/run/UA/inputs/aether.json.acheron | 58 +++++++++++++++++++++++ share/run/UA/inputs/aurora_acheron.csv | 1 + share/run/UA/inputs/chemistry_acheron.csv | 3 ++ 4 files changed, 117 insertions(+) create mode 100755 share/run/UA/inputs/acheron.in create mode 100755 share/run/UA/inputs/aether.json.acheron create mode 100755 share/run/UA/inputs/aurora_acheron.csv create mode 100644 share/run/UA/inputs/chemistry_acheron.csv diff --git a/share/run/UA/inputs/acheron.in b/share/run/UA/inputs/acheron.in new file mode 100755 index 00000000..4c8adbf1 --- /dev/null +++ b/share/run/UA/inputs/acheron.in @@ -0,0 +1,55 @@ + +This is the input file for the planet Acheron. It is basically +meant to be an experimental planet. As a starting point, +Acheron will be a single neutral species (O) and +a single ion species (O+) planet. + +The base altitude of Acheron is 1000 km. + +name is the character string that identifies the species + +O(3P) is the base state of neutral atomic oxygen and is called O. + +Vibration is the degrees of freedom for the atom/molecule + +thermal conduction is typically: +Lambda = (N1 * A1 * T^c1 + N2 * A2 * T^c2 + ... ) / (N1+N2+...) +thermal_cond is the A for the particular species +thermal_exp is the c for the particular species + +mass is in amu + +advect is whether the species is advected or not + +BC is a density that is used in the lowest boundary cell if you + want a constant boundary condition. + Set to a real value to use this. + Set to a negative number if you want to use a different BC. + In this example file, the values are from 96.87 km Jan 1, 2013 + O_1D is made up. + + +#NEUTRALS +name, mass, vibration, thermal_cond, thermal_exp, advect, BC +O, 16, 5, 5.6e-4, 0.69, 1, 5.0e17 + + +Here we can input a temperature profile for the initial condition: + - below the lowest altitude, it will use the lowest alt + - above the highest alt, it will use the highest alt + - in between, linear interpolation + - altitudes in km + +#TEMPERATURE +alt, temp +1000.0, 200.0 +1500.0, 1000.0 +2000.0, 1000.0 + +O+ is O+(4S) is the base state of O+, but is just called O+ +O+ has excited states of O+(2D) and O+(2P). + +#IONS +name, mass, charge, advect +O+, 16, 1, 1 + diff --git a/share/run/UA/inputs/aether.json.acheron b/share/run/UA/inputs/aether.json.acheron new file mode 100755 index 00000000..7b3d77d5 --- /dev/null +++ b/share/run/UA/inputs/aether.json.acheron @@ -0,0 +1,58 @@ + +{ + "Debug" : { + "iVerbose" : 0, + "iFunctionVerbose" : { + "Grid::create_altitudes": 0}, + "dt" : 10.0, + "check_for_nans" : true + }, + + "Planet" : { + "name" : "acheron", + "file": "UA/inputs/acheron.in"}, + + "PlanetFile" : "UA/inputs/acheron.in", + + "ChemistryFile" : "UA/inputs/chemistry_acheron.csv", + + "Electrodynamics" : { + "Potential" : "zero", + "DiffuseAurora" : "none"}, + + "Logfile" : { + "species" : ["O", "O+"]}, + + "AuroraFile" : "UA/inputs/aurora_acheron.csv", + + "Advection" : { + "Neutrals" : { + "Vertical" : "hydro", + "Horizontal" : "default"}}, + + "Sources" : { + "Grid" : { + "Cent_acc" : false }}, + + "EndTime" : [2011, 3, 21, 0, 0, 0], + + "CubeSphere" : { + "is" : false}, + + "GeoBlockSize" : { + "nLons" : 144, + "nLats" : 72, + "nAlts" : 1}, + + "GeoGrid" : { + "MinAlt" : 1000.0, + "dAlt" : 0.25, + "IsUniformAlt" : false}, + + "Outputs" : { + "type" : ["states"], + "dt" : [900] }, + + "DoCalcBulkIonTemp" : false + +} diff --git a/share/run/UA/inputs/aurora_acheron.csv b/share/run/UA/inputs/aurora_acheron.csv new file mode 100755 index 00000000..613fb01b --- /dev/null +++ b/share/run/UA/inputs/aurora_acheron.csv @@ -0,0 +1 @@ +O,O+,1.0 diff --git a/share/run/UA/inputs/chemistry_acheron.csv b/share/run/UA/inputs/chemistry_acheron.csv new file mode 100644 index 00000000..44913d10 --- /dev/null +++ b/share/run/UA/inputs/chemistry_acheron.csv @@ -0,0 +1,3 @@ +name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,uncertainty,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType +reaction,name,name,name,goes to,name,name,name,mks,,,ratio,eV,,K,T,dimensionless,T,K,K,, +R1,O+,e-,,,O,,,1.00E-15,,,,0,0.1,,,,,,,, From e013e89499a0ca57b724bf283d7641d37e8965a6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 08:26:48 -0500 Subject: [PATCH 044/691] STY: changed name of function --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index f10d5025..76137e93 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -79,7 +79,7 @@ int main() { // Calculate centripetal acceleration, since this is a constant // vector on the grid: - if (input.get_cent_acc()) + if (input.get_use_centripetal()) gGrid.calc_cent_acc(planet); // Initialize Magnetic grid: From 15a5f854b83f7e0d49e13e7aa725437dba152d5b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Dec 2023 08:27:29 -0500 Subject: [PATCH 045/691] BUG: initialize variables so output has correct shape --- src/neutrals.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 6df7e8d3..e16276d3 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -101,10 +101,6 @@ Neutrals::Neutrals(Grid grid, temperature_scgc.ones(); newTemperature_scgc.set_size(nLons, nLats, nAlts); newTemperature_scgc.ones(); - O_cool_scgc.set_size(nLons, nLats, nAlts); - O_cool_scgc.zeros(); - NO_cool_scgc.set_size(nLons, nLats, nAlts); - NO_cool_scgc.zeros(); // Derived quantities: @@ -137,10 +133,19 @@ Neutrals::Neutrals(Grid grid, viscosity_scgc.zeros(); conduction_scgc.set_size(nLons, nLats, nAlts); + conduction_scgc.zeros(); heating_euv_scgc.set_size(nLons, nLats, nAlts); + heating_euv_scgc.zeros(); heating_chemical_scgc.set_size(nLons, nLats, nAlts); + heating_chemical_scgc.zeros(); heating_sources_total.set_size(nLons, nLats, nAlts); heating_sources_total.zeros(); + heating_ion_collisions_scgc.set_size(nLons, nLats, nAlts); + heating_ion_collisions_scgc.zeros(); + O_cool_scgc.set_size(nLons, nLats, nAlts); + O_cool_scgc.zeros(); + NO_cool_scgc.set_size(nLons, nLats, nAlts); + NO_cool_scgc.zeros(); heating_efficiency = input.get_euv_heating_eff_neutrals(); From bf594585796f7be1b9c8782a3a289564b2f70f5e Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 15 Dec 2023 06:55:00 -0500 Subject: [PATCH 046/691] FEAT: provide simulation time --- include/times.h | 5 +++++ src/time.cpp | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/include/times.h b/include/times.h index 3f2e8fe4..f0fff47e 100644 --- a/include/times.h +++ b/include/times.h @@ -148,6 +148,11 @@ class Times { **/ std::vector get_iCurrent(); + /************************************************************** + \brief Get the current simulation time (sec since start) + **/ + double get_simulation_time(); + /********************************************************************** \brief Read / Write restart files for time \param dir directory to write restart files diff --git a/src/time.cpp b/src/time.cpp index 86bbd6bb..d0962e33 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -175,6 +175,14 @@ double Times::get_julian_day() { return julian_day; } +// ----------------------------------------------------------------------------- +// Get the current simulation time (in sec since start of run) +// ----------------------------------------------------------------------------- + +double Times::get_simulation_time() { + return simulation; +} + // ----------------------------------------------------------------------------- // Get the current time array // ----------------------------------------------------------------------------- From 1d0e66733a68f63d108e091e195c7e6a0bfca0b0 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 15 Dec 2023 06:56:09 -0500 Subject: [PATCH 047/691] TEST: trying to figure out instability --- src/add_sources.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index 37916aff..fd7742f6 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -31,6 +31,65 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { std::vector acc_coriolis; acc_coriolis = make_cube_vector(grid.get_nX(), grid.get_nY(), grid.get_nZ(), 3); + int64_t iDir, iSpec, iSpecies; + double tSim = time.get_simulation_time(); + precision_t ramp = tSim / 3600.0; + if (ramp > 1.0) ramp = 1.0; + + // Vertical winds use species winds: + for (iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { + // Pick out the advected neutral species: + species_chars & advected_neutral = species[species_to_advect[iSpec]]; + // Calculate Coriolis: + if (input.get_use_coriolis()) + acc_coriolis = coriolis(advected_neutral.velocity_vcgc, + planet.get_omega(), + grid.geoLat_scgc); + + iDir = 2; + // update velocities based on acceleration: + // reduce neutral friction until solver is added + advected_neutral.velocity_vcgc[iDir] = + advected_neutral.velocity_vcgc[iDir] + + dt * (ramp * grid.cent_acc_vcgc[iDir] + + ramp * acc_coriolis[iDir] + + advected_neutral.acc_neutral_friction[iDir] / 4.0 + + advected_neutral.acc_ion_drag[iDir] + + advected_neutral.acc_eddy); + } + + calc_mass_density(); + // Calculate bulk vertical winds: + velocity_vcgc[2].zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + if (species[iSpecies].DoAdvect) { + velocity_vcgc[2] = velocity_vcgc[2] + + species[iSpecies].mass * species[iSpecies].density_scgc % + species[iSpecies].velocity_vcgc[2] / rho_scgc; + } + + + // Horizontal winds use bulk winds: + if (input.get_use_coriolis()) + acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + // Add Velocity sources to bulk winds: + for (iDir = 0; iDir < 2; iDir++) { + velocity_vcgc[iDir] = + velocity_vcgc[iDir] + dt * ( + ramp * grid.cent_acc_vcgc[iDir] + + ramp * acc_coriolis[iDir] + + acc_ion_collisions[iDir]); + acc_sources_total[iDir].zeros(); + } + // Apply Viscosity: + update_horizontal_velocity(grid, time); + + // Assign bulk horizontal velocity to all species: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + for (iDir = 0; iDir < 2; iDir++) + species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; + + /* // If we only consider the bulk winds in the horizontal direction: if (input.get_advection_neutrals_bulkwinds()) { // Calculate Coriolis: @@ -75,7 +134,7 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { calc_bulk_velocity(); } assign_bulk_velocity(); - + */ report.exit(function); return; } From 7047b22c813bdb2b7ca2d13a4038cd0c9e6b42f8 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 15 Dec 2023 06:57:06 -0500 Subject: [PATCH 048/691] FEAT: assign winds to each species --- src/solver_advection.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 3f89e982..6eb6ae69 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -546,6 +546,11 @@ void advect(Grid &grid, } neutrals.calc_density_from_mass_concentration(); + // Assign bulk horizontal velocity to all species: + for (int64_t iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) + for (int64_t iDir = 0; iDir < 2; iDir++) + neutrals.species[iSpecies].velocity_vcgc[iDir] = neutrals.velocity_vcgc[iDir]; + report.exit(function); return; } From afaa5e8ff69c47f3af3d65820ac72ec35545aae8 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 15 Dec 2023 06:57:59 -0500 Subject: [PATCH 049/691] TEST: trying to figure out instability --- src/solver_coriolis.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/solver_coriolis.cpp b/src/solver_coriolis.cpp index 0ab125f7..4a17897e 100644 --- a/src/solver_coriolis.cpp +++ b/src/solver_coriolis.cpp @@ -14,10 +14,10 @@ std::vector coriolis(std::vector velocity, precision_t rotation_rate, arma_cube lat_scgc) { std::vector coriolis_vec(3); - coriolis_vec[0] = - 2 * rotation_rate * velocity[1] % sin(lat_scgc) - - 2 * rotation_rate * velocity[2] % cos(lat_scgc); + coriolis_vec[0] = ( + 2 * rotation_rate * velocity[1] % sin(lat_scgc)); // - + //2 * rotation_rate * velocity[2] % cos(lat_scgc) ); coriolis_vec[1] = -2 * rotation_rate * velocity[0] % sin(lat_scgc); - coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1]; + coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1] * 0.0; return coriolis_vec; } From 4282855e72f2bc38c8886564fca1b226574faea7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:21:42 -0500 Subject: [PATCH 050/691] BUG: moved into neutrals and the vertical solver --- include/calc_momentum_friction.h | 8 +-- src/neutrals_momentum_friction.cpp | 83 +++++++++++++++--------------- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/include/calc_momentum_friction.h b/include/calc_momentum_friction.h index 24a6e9ef..6d302fb7 100644 --- a/include/calc_momentum_friction.h +++ b/include/calc_momentum_friction.h @@ -4,11 +4,8 @@ #ifndef INCLUDE_CALC_MOMENTUM_FRICTION_H_ #define INCLUDE_CALC_MOMENTUM_FRICTION_H_ -arma_vec neutral_friction_one_cell(int64_t iLong, int64_t iLat, int64_t iAlt, - arma_vec &vels, - Neutrals &neutrals); +#include "../include/aether.h" -void calc_neutral_friction(Neutrals &neutrals); /********************************************************************** \brief Calculate acceleration due to ion drag @@ -17,7 +14,6 @@ void calc_neutral_friction(Neutrals &neutrals); \param dt The change in time \param report allow reporting to occur **/ -void calc_ion_collisions(Neutrals &neutrals, - Ions &ions); +void calc_ion_collisions(Neutrals &neutrals, Ions &ions); #endif // INCLUDE_CALC_MOMENTUM_FRICTION_H_ diff --git a/src/neutrals_momentum_friction.cpp b/src/neutrals_momentum_friction.cpp index 30493882..e92a3f34 100644 --- a/src/neutrals_momentum_friction.cpp +++ b/src/neutrals_momentum_friction.cpp @@ -10,34 +10,30 @@ // multiply by dt later. // --------------------------------------------------------------------- -arma_vec neutral_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, - arma_vec &vels, - Neutrals &neutrals) { +arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, + arma_vec &vels) { std::string function = "neutral_friction_one_cell"; static int iFunction = -1; report.enter(function, iFunction); precision_t ktom, temp_dij; int64_t iSpecies, jSpecies, iSpecies_, jSpecies_; - static arma_mat matrix(neutrals.nSpeciesAdvect, neutrals.nSpeciesAdvect, - fill::zeros); - static arma_mat coefmatrix(neutrals.nSpeciesAdvect, neutrals.nSpeciesAdvect, - fill::zeros); + static arma_mat matrix(nSpeciesAdvect, nSpeciesAdvect, fill::zeros); + static arma_mat coefmatrix(nSpeciesAdvect, nSpeciesAdvect, fill::zeros); - for (iSpecies = 0; iSpecies < neutrals.nSpeciesAdvect; iSpecies++) { - iSpecies_ = neutrals.species_to_advect[iSpecies]; + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; - Neutrals::species_chars & advected_neutral = - neutrals.species[iSpecies_]; + Neutrals::species_chars & advected_neutral = species[iSpecies_]; // ktom = boltzmann's constant * temperature / mass ktom = cKB * - neutrals.temperature_scgc(iLon, iLat, iAlt) / + temperature_scgc(iLon, iLat, iAlt) / advected_neutral.mass; - for (jSpecies = 0; jSpecies < neutrals.nSpeciesAdvect; jSpecies++) { - jSpecies_ = neutrals.species_to_advect[jSpecies]; + for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { + jSpecies_ = species_to_advect[jSpecies]; if (iSpecies_ == jSpecies_) continue; @@ -48,41 +44,42 @@ arma_vec neutral_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, // (2) Additionally, the Dij's are in cm^2/s, thus the 1.0e-04 factor temp_dij = 1e-4 * advected_neutral.diff0[jSpecies_] * - pow(neutrals.temperature_scgc(iLon, iLat, iAlt), + pow(temperature_scgc(iLon, iLat, iAlt), advected_neutral.diff_exp[jSpecies_]) / - (neutrals.density_scgc(iLon, iLat, iAlt) * 1e-6); + (density_scgc(iLon, iLat, iAlt) * 1e-6); coefmatrix(iSpecies, jSpecies) = ktom * advected_neutral.density_scgc(iLon, iLat, iAlt) / - (temp_dij * neutrals.density_scgc(iLon, iLat, iAlt)); + (temp_dij * density_scgc(iLon, iLat, iAlt)); } // jSpec loop } // iSpec loop matrix = -1 * coefmatrix; // Fill in diagonal of matrix: - for (iSpecies = 0; iSpecies < neutrals.nSpeciesAdvect; iSpecies++) + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) matrix(iSpecies, iSpecies) = 1 + sum(coefmatrix.row(iSpecies)); // initialize array of each neutral species' accelerations at (iLon, iLat, iAlt): - arma_vec accs(neutrals.nSpeciesAdvect, fill::zeros); + arma_vec accs(nSpeciesAdvect, fill::zeros); // Solve system of equations: arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); + /* // put the new values into the velocity cubes: - for (iSpecies = 0; iSpecies < neutrals.nSpeciesAdvect; iSpecies++) + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) accs(iSpecies) = new_vels(iSpecies) - vels(iSpecies); - + */ report.exit(function); - return accs; + return new_vels; } // --------------------------------------------------------------------- // // --------------------------------------------------------------------- -void calc_neutral_friction(Neutrals &neutrals) { +void Neutrals::calc_neutral_friction() { std::string function = "calc_neutral_friction"; static int iFunction = -1; @@ -91,42 +88,46 @@ void calc_neutral_friction(Neutrals &neutrals) { int64_t iAlt, iLat, iLon, iDir, iSpecies, iSpecies_; // Initialize all of the accelerations to zero: - for (iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) for (iDir = 0; iDir < 3; iDir++) - neutrals.species[iSpecies].acc_neutral_friction[iDir].zeros(); + species[iSpecies].acc_neutral_friction[iDir].zeros(); if (input.get_advection_neutrals_vertical() != "hydro") { - arma_vec vels(neutrals.nSpeciesAdvect, fill::zeros); - arma_vec acc(neutrals.nSpeciesAdvect, fill::zeros); - int64_t nXs = neutrals.temperature_scgc.n_rows; - int64_t nYs = neutrals.temperature_scgc.n_cols; - int64_t nZs = neutrals.temperature_scgc.n_slices; + arma_vec vels(nSpeciesAdvect, fill::zeros); + arma_vec acc(nSpeciesAdvect, fill::zeros); + arma_vec new_vels; + int64_t nXs = temperature_scgc.n_rows; + int64_t nYs = temperature_scgc.n_cols; + int64_t nZs = temperature_scgc.n_slices; // Calculate friction terms for only species that advect. // - If only 1 species is advected, then it will have no friction - if (neutrals.nSpeciesAdvect > 1) { + if (nSpeciesAdvect > 1) { for (iAlt = 0; iAlt < nZs; iAlt++) { for (iLat = 0; iLat < nYs; iLat++) { for (iLon = 0; iLon < nXs; iLon++) { - for (iDir = 0; iDir < 3; iDir++) { + iDir = 2; + //for (iDir = 0; iDir < 3; iDir++) { vels.zeros(); //Put the old velocities into vels: - for (iSpecies = 0; iSpecies < neutrals.nSpeciesAdvect; iSpecies++) { - iSpecies_ = neutrals.species_to_advect[iSpecies]; + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; vels(iSpecies) = - neutrals.species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt); + species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt); } - acc = neutral_friction_one_cell(iLon, iLat, iAlt, vels, neutrals); + //acc = neutral_friction_one_cell(iLon, iLat, iAlt, vels); + new_vels = calc_friction_one_cell(iLon, iLat, iAlt, vels); - for (iSpecies = 0; iSpecies < neutrals.nSpeciesAdvect; iSpecies++) { - iSpecies_ = neutrals.species_to_advect[iSpecies]; - neutrals.species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = - acc(iSpecies); + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); + //species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = + // acc(iSpecies); } // iSpeciesAdvect - } // for direction + //} // for direction } // for long } // for lat } // for alt From e3e8e851d84d79dea3d6519621ceb4b329e06e62 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:22:04 -0500 Subject: [PATCH 051/691] BUG: moved into neutrals and the vertical solver --- include/neutrals.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/neutrals.h b/include/neutrals.h index 8b438074..459a96ae 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -191,6 +191,9 @@ class Neutrals { // Bulk acceleration due to collisions with ions: std::vector acc_ion_collisions; + // Bulk acceleration due to coriolis + std::vector acc_coriolis; + // Total bulk acceleration std::vector acc_sources_total; @@ -524,6 +527,11 @@ class Neutrals { **/ bool advect_vertical(Grid grid, Times time); + + arma_vec calc_friction_one_cell(int64_t iLong, int64_t iLat, int64_t iAlt, + arma_vec &vels); + + void calc_neutral_friction(); }; From 03fc8fb2440a8a7343eb75ad46530d71b3d25627 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:22:50 -0500 Subject: [PATCH 052/691] FEAT: save coriolis --- src/neutrals.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index e16276d3..2058bdcf 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -151,6 +151,8 @@ Neutrals::Neutrals(Grid grid, // bulk ion_neutral collisional acceleration: acc_ion_collisions = make_cube_vector(nLons, nLats, nAlts, 3); + // bulk coriolis acceleration: + acc_coriolis = make_cube_vector(nLons, nLats, nAlts, 3); // bulk ion_neutral collisional acceleration: acc_sources_total = make_cube_vector(nLons, nLats, nAlts, 3); From 7b9168fa9c2fd5bba563d816169120619106d34c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:23:28 -0500 Subject: [PATCH 053/691] TEST: add back in dropped terms --- src/solver_coriolis.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/solver_coriolis.cpp b/src/solver_coriolis.cpp index 4a17897e..46411fd5 100644 --- a/src/solver_coriolis.cpp +++ b/src/solver_coriolis.cpp @@ -15,8 +15,8 @@ std::vector coriolis(std::vector velocity, arma_cube lat_scgc) { std::vector coriolis_vec(3); coriolis_vec[0] = ( - 2 * rotation_rate * velocity[1] % sin(lat_scgc)); // - - //2 * rotation_rate * velocity[2] % cos(lat_scgc) ); + 2 * rotation_rate * velocity[1] % sin(lat_scgc) - + 2 * rotation_rate * velocity[2] % cos(lat_scgc)); coriolis_vec[1] = -2 * rotation_rate * velocity[0] % sin(lat_scgc); coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1] * 0.0; return coriolis_vec; From ec4287118b5957235733acc5325e451b9224bbe7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:24:14 -0500 Subject: [PATCH 054/691] TEST: add back in terms and move others to solvers --- src/add_sources.cpp | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index fd7742f6..dbae9f33 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -28,23 +28,18 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { // updating the neutral temperature: update_temperature(grid, time); - std::vector acc_coriolis; - acc_coriolis = make_cube_vector(grid.get_nX(), grid.get_nY(), grid.get_nZ(), 3); - int64_t iDir, iSpec, iSpecies; double tSim = time.get_simulation_time(); - precision_t ramp = tSim / 3600.0; - if (ramp > 1.0) ramp = 1.0; + // Horizontal winds use bulk winds: + if (input.get_use_coriolis()) + acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + +/* // Vertical winds use species winds: for (iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { // Pick out the advected neutral species: species_chars & advected_neutral = species[species_to_advect[iSpec]]; - // Calculate Coriolis: - if (input.get_use_coriolis()) - acc_coriolis = coriolis(advected_neutral.velocity_vcgc, - planet.get_omega(), - grid.geoLat_scgc); iDir = 2; // update velocities based on acceleration: @@ -68,16 +63,14 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { species[iSpecies].velocity_vcgc[2] / rho_scgc; } - - // Horizontal winds use bulk winds: - if (input.get_use_coriolis()) - acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + */ + // Add Velocity sources to bulk winds: for (iDir = 0; iDir < 2; iDir++) { velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( - ramp * grid.cent_acc_vcgc[iDir] + - ramp * acc_coriolis[iDir] + + grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + acc_ion_collisions[iDir]); acc_sources_total[iDir].zeros(); } From cf1eafdbdad8a2c66ad4bdc84315b01bac71e411 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:24:52 -0500 Subject: [PATCH 055/691] BUG: move to vertical solver --- src/advance.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index a125fc94..31cb7a8b 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -107,9 +107,7 @@ bool advance(Planets &planet, if (input.get_NO_cooling()) neutrals.calc_NO_cool(); - neutrals.vertical_momentum_eddy(gGrid); calc_ion_collisions(neutrals, ions); - calc_neutral_friction(neutrals); neutrals.add_sources(time, planet, gGrid); From f84979741033095ef872790e89d700443a10753b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 10:26:05 -0500 Subject: [PATCH 056/691] TEST: put friction into solver --- src/solver_vertical_rusanov.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index d517e604..e9181352 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -251,6 +251,10 @@ void Neutrals::solver_vertical_rusanov(Grid grid, v2or = (velocity_vcgc[0] % velocity_vcgc[0] + velocity_vcgc[1] % velocity_vcgc[1]) / grid.radius_scgc; + // calculate vertical momentum due to eddy diffusion: + vertical_momentum_eddy(grid); + + // ----------------------------------------------------------- // Now calculate new states: precision_t mass; @@ -277,7 +281,10 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].velocity_vcgc[2] - dt * (species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] - v2or - + 0.05 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + - species[iSpecies].acc_eddy + - acc_coriolis[2] + - grid.cent_acc_vcgc[2] + + 0.025 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + gradTemp * cKB / mass + abs(grid.gravity_vcgc[2]))) + dt * diffVertVel_s[iSpecies]; @@ -287,6 +294,9 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } + + + newTemperature_scgc = temperature_scgc - dt * (velocity_vcgc[2] % gradTemp @@ -317,6 +327,17 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } + // Force the neutrals to move together with friction: + calc_neutral_friction(); + /* + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + if (species[iSpecies].DoAdvect) { + species[iSpecies].velocity_vcgc[2] = + species[iSpecies].velocity_vcgc[2] + dt * + species[iSpecies].acc_neutral_friction[iDir]; + } + } + */ calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); From 26df7750adea5f551ffbc8a8e2a41350d9add747 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 14:07:00 -0500 Subject: [PATCH 057/691] FEAT: add message for nan check --- include/neutrals.h | 2 +- src/advance.cpp | 13 ++++++++----- src/main/main.cpp | 2 +- src/neutrals.cpp | 5 ++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index 459a96ae..e041e758 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -451,7 +451,7 @@ class Neutrals { /***************************************************************************** \brief Checks for nans and +/- infinities in density, temp, and velocity **/ - bool check_for_nonfinites(); + bool check_for_nonfinites(std::string location); /********************************************************************** \brief Checks for nans in the specified variable diff --git a/src/advance.cpp b/src/advance.cpp index 31cb7a8b..30af8508 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -36,7 +36,7 @@ bool advance(Planets &planet, input.get_student_name() + "?"); if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites(); + didWork = neutrals.check_for_nonfinites("Top of Advance"); gGrid.calc_sza(planet, time); neutrals.calc_mass_density(); @@ -67,11 +67,14 @@ bool advance(Planets &planet, neutrals.exchange_old(gGrid); advect(gGrid, time, neutrals); + if (didWork & input.get_check_for_nans()) + didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); + if (input.get_nAltsGeo() > 1) neutrals.advect_vertical(gGrid, time); if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites(); + didWork = neutrals.check_for_nonfinites("After Vertical Advection"); // ------------------------------------ // Calculate source terms next: @@ -111,6 +114,9 @@ bool advance(Planets &planet, neutrals.add_sources(time, planet, gGrid); + if (didWork & input.get_check_for_nans()) + didWork = neutrals.check_for_nonfinites("After Add Sources"); + ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); @@ -129,9 +135,6 @@ bool advance(Planets &planet, } } - if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites(); - if (didWork) didWork = output(neutrals, ions, gGrid, time, planet); diff --git a/src/main/main.cpp b/src/main/main.cpp index 76137e93..9e5d2ddb 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -103,7 +103,7 @@ int main() { } if (input.get_check_for_nans()) { - didWork = neutrals.check_for_nonfinites(); + didWork = neutrals.check_for_nonfinites("In Main, before main loop"); didWork = ions.check_for_nonfinites(); } diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 2058bdcf..8f79ff48 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -307,7 +307,7 @@ void Neutrals::nan_test(std::string variable) { // Checks for nans and +/- infinities in density, temp, and velocity //---------------------------------------------------------------------- -bool Neutrals::check_for_nonfinites() { +bool Neutrals::check_for_nonfinites(std::string location) { bool isBad = false; bool didWork = true; @@ -315,6 +315,7 @@ bool Neutrals::check_for_nonfinites() { if (isBad) { report.error("non-finite found in neutral density!"); + report.error("from location : " + location); didWork = false; } @@ -322,6 +323,7 @@ bool Neutrals::check_for_nonfinites() { if (isBad) { report.error("non-finite found in neutral temperature!"); + report.error("from location : " + location); didWork = false; } @@ -329,6 +331,7 @@ bool Neutrals::check_for_nonfinites() { if (isBad) { report.error("non-finite found in neutral velocity!"); + report.error("from location : " + location); didWork = false; } From 469b616208c433ada89baa17b712fe28ad99aa02 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 14:38:29 -0500 Subject: [PATCH 058/691] BUG: need to sync up didwork in case one PE goes bad --- src/neutrals.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 8f79ff48..48192a9a 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -334,7 +334,8 @@ bool Neutrals::check_for_nonfinites(std::string location) { report.error("from location : " + location); didWork = false; } - + didWork = sync_across_all_procs(didWork); + return didWork; } From efe78627f718925720026a1ff226342cd38bb02e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 15 Dec 2023 14:39:13 -0500 Subject: [PATCH 059/691] TEST: move vertical solver to after temperature conduction --- src/advance.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 30af8508..c5fe05c4 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -70,12 +70,6 @@ bool advance(Planets &planet, if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); - if (input.get_nAltsGeo() > 1) - neutrals.advect_vertical(gGrid, time); - - if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites("After Vertical Advection"); - // ------------------------------------ // Calculate source terms next: @@ -120,11 +114,20 @@ bool advance(Planets &planet, ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); + if (input.get_nAltsGeo() > 1) + neutrals.advect_vertical(gGrid, time); + + if (didWork & input.get_check_for_nans()) + didWork = neutrals.check_for_nonfinites("After Vertical Advection"); + + if (input.get_is_cubesphere()) neutrals.exchange(gGrid); else neutrals.exchange_old(gGrid); + + time.increment_time(); if (time.check_time_gate(input.get_dt_write_restarts())) { From c8da4cc559041b770af9aaa18fbcf148734d18f0 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Tue, 26 Dec 2023 17:12:17 -0500 Subject: [PATCH 060/691] FEAT: test all species for NaNs --- src/neutrals.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 48192a9a..4e838644 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -312,15 +312,25 @@ bool Neutrals::check_for_nonfinites(std::string location) { bool didWork = true; isBad = !all_finite(density_scgc, "density_scgc"); - if (isBad) { report.error("non-finite found in neutral density!"); report.error("from location : " + location); didWork = false; } + int64_t iSpecies; + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + isBad = !all_finite(species[iSpecies].density_scgc, + species[iSpecies].cName + " density"); + if (isBad) { + report.error("non-finite found in " + + species[iSpecies].cName + " density!"); + report.error("from location : " + location); + didWork = false; + } + } + isBad = !all_finite(temperature_scgc, "temperature_scgc"); - if (isBad) { report.error("non-finite found in neutral temperature!"); report.error("from location : " + location); @@ -328,13 +338,23 @@ bool Neutrals::check_for_nonfinites(std::string location) { } isBad = !all_finite(velocity_vcgc, "velocity_vcgc"); - if (isBad) { report.error("non-finite found in neutral velocity!"); report.error("from location : " + location); didWork = false; } didWork = sync_across_all_procs(didWork); + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + isBad = !all_finite(species[iSpecies].velocity_vcgc, + species[iSpecies].cName + " velocity!"); + if (isBad) { + report.error("non-finite found in " + + species[iSpecies].cName + " velocity!"); + report.error("from location : " + location); + didWork = false; + } + } return didWork; } From e5b0117bce2e6d4e450b56c6db55b95b56c99116 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Tue, 26 Dec 2023 17:13:34 -0500 Subject: [PATCH 061/691] FEAT: fill everything with hydrostatic initially --- src/neutrals_ics.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 9f67e005..02fb258f 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -167,7 +167,9 @@ bool Neutrals::initial_conditions(Grid grid, } calc_scale_height(grid); - fill_with_hydrostatic(1, nAlts, grid); + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) + fill_with_hydrostatic(iSpecies, 1, nAlts, grid); + } // type = planet } From 666bc49be68d17ec03078a446d5c7507698fd65c Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Tue, 26 Dec 2023 17:16:24 -0500 Subject: [PATCH 062/691] TEST: remove limiters to see what happens --- src/solver_advection.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 6eb6ae69..85b6dbfe 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -516,24 +516,26 @@ void advect(Grid &grid, neutrals.velocity_vcgc[0].slice(iAlt) = xVel; neutrals.velocity_vcgc[1].slice(iAlt) = yVel; temp = (totalE / rho - 0.5 * (xVel % xVel + yVel % yVel)) / t_to_e; - precision_t fac, dm, dp; + temp.clamp(200, 2000); + + //precision_t fac, dm, dp; for (int64_t j = nGCs; j < nY - nGCs; j++) { for (int64_t i = nGCs; i < nX - nGCs; i++) { - fac = 1.0; - if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { - fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); - } - dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); - dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); - if (temp(i,j) < dm) temp(i,j) = dm; - if (temp(i,j) > dp) temp(i,j) = dp; + //fac = 1.0; + //if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { + // fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); + //} + //dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); + //dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); + //if (temp(i,j) < dm) temp(i,j) = dm; + //if (temp(i,j) > dp) temp(i,j) = dp; neutrals.temperature_scgc(i,j,iAlt) = temp(i,j); - dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); - dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); - if (rho(i,j) < dm) rho(i,j) = dm; - if (rho(i,j) > dp) rho(i,j) = dp; + //dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); + //dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); + //if (rho(i,j) < dm) rho(i,j) = dm; + //if (rho(i,j) > dp) rho(i,j) = dp; neutrals.rho_scgc(i,j,iAlt) = rho(i,j); } } From d05931c3b84df9bc0beb485085da04fba3c46c3c Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Tue, 26 Dec 2023 17:18:01 -0500 Subject: [PATCH 063/691] TEST: ease up on limiters --- src/solver_vertical_rusanov.cpp | 100 +++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 8 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index e9181352..74b8814c 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -26,12 +26,14 @@ void calc_facevalues_alts_rusanov(Grid &grid, precision_t beta = 1.5; // inverse delta-alt at cell edge - arma_mat ida; + arma_mat ida(nXs, nYs); // Projection of variables to the cell edge: arma_mat dVarUp(nXs, nYs), dVarDown(nXs, nYs); arma_cube dVarLimited(nXs, nYs, nZs); + dVarLimited.zeros(); + // Only do calculation on physical cells for (iZ = nGCs; iZ < nZs - nGCs; iZ++) { ida = 2.0 / grid.dalt_lower_scgc.slice(iZ + 1); @@ -75,6 +77,20 @@ void calc_facevalues_alts_rusanov(Grid &grid, dVarLimited(iX, iY, iZ) = limiter_mc(dVarUp(iX, iY), dVarDown(iX, iY), beta); + // TEMPORARY!!! + iZ = 18; + ida = 2.0 / grid.dalt_lower_scgc.slice(iZ + 1); + dVarUp = ida % + (factor1 * (inVar.slice(iZ + 1) - inVar.slice(iZ)) - + factor2 * (inVar.slice(iZ + 2) - inVar.slice(iZ - 1))); + + ida = 2.0 / grid.dalt_lower_scgc.slice(iZ); + dVarDown = ida % + (factor1 * (inVar.slice(iZ) - inVar.slice(iZ - 1)) - + factor2 * (inVar.slice(iZ + 1) - inVar.slice(iZ - 2))); + + // End TEMP + for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { outLeft.slice(iZ) = inVar.slice(iZ - 1) + @@ -83,7 +99,23 @@ void calc_facevalues_alts_rusanov(Grid &grid, inVar.slice(iZ) - 0.5 * dVarLimited.slice(iZ) % grid.dalt_lower_scgc.slice(iZ); } - + /* + if (iProc == 11) + std::cout << "facevalues : " + << inVar(7,19,17) << " " + << inVar(7,19,18) << " " + << inVar(7,19,19) << " " + << inVar(7,19,20) << " " + << dVarLimited(7,19,18) << " " + << grid.dalt_lower_scgc(7,19,17) << " " + << outRight(7, 19, 17) << " " + << outRight(7, 19, 18) << " " + << outLeft(7, 19, 17) << " " + << outLeft(7, 19, 18) << " " + << dVarUp(7, 19) << " " + << dVarDown(7, 19) << "\n"; + */ + return; } @@ -124,7 +156,16 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, (varLeft.slice(iZ + 1) + varRight.slice(iZ + 1) - varLeft.slice(iZ) - varRight.slice(iZ)) / grid.dalt_center_scgc.slice(iZ); - + /* + if (iProc == 11) + std::cout << "calc_grad : " + << varLeft(7, 19, 17) << " " + << varLeft(7, 19, 18) << " " + << varRight(7, 19, 17) << " " + << varRight(7, 19, 18) << " " + << grid.dalt_center_scgc(7, 19, 17) << " " + << outGrad(7, 19, 17) << "\n"; + */ for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { for (iX = nGCs; iX < nXs - nGCs; iX++) for (iY = nGCs; iY < nYs - nGCs; iY++) { @@ -225,6 +266,20 @@ void Neutrals::solver_vertical_rusanov(Grid grid, cMax_vcgc[2], gradDummy, diffDummy); + /* + if (iProc == 11) + std::cout << "gradlog : " + << iSpecies << " " + << species[iSpecies].density_scgc(7,19,17) << " " + << log_s(7,19,14) << " " + << log_s(7,19,15) << " " + << log_s(7,19,16) << " " + << log_s(7,19,17) << " " + << log_s(7,19,18) << " " + << log_s(7,19,19) << " " + << cMax_vcgc[2](7,19,17) << " " + << gradDummy(7,19,17) << "\n"; + */ gradLogN_s[iSpecies] = gradDummy; diffLogN_s[iSpecies] = diffDummy; @@ -284,28 +339,57 @@ void Neutrals::solver_vertical_rusanov(Grid grid, - species[iSpecies].acc_eddy - acc_coriolis[2] - grid.cent_acc_vcgc[2] - + 0.025 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + + 0.25 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + gradTemp * cKB / mass + abs(grid.gravity_vcgc[2]))) + dt * diffVertVel_s[iSpecies]; + /* + if (iProc == 11) { + std::cout << "den + vel : " + << iSpecies << " " + << species[iSpecies].density_scgc(7,19,17) << " " + << log_s(7,19,17) << " " + << species[iSpecies].velocity_vcgc[2](7,19,17) << " " + << species[iSpecies].newVelocity_vcgc[2](7,19,17) << " " + << species[iSpecies].acc_eddy(7,19,17) << " " + << velocity_vcgc[0](7,19,17) << " " + << velocity_vcgc[1](7,19,17) << " " + << cMax_vcgc[0](7,19,17) << " " + << cMax_vcgc[1](7,19,17) << " " + << cMax_vcgc[2](7,19,17) << " " + << gradLogN_s[iSpecies](7,19,17) << " " + << temperature_scgc(7,19,17) << " " + << gradTemp(7,19,17) << " " + << diffVertVel_s[iSpecies](7,19,17) << " " + << v2or(7,19,17) << "\n"; + } */ } else { species[iSpecies].newVelocity_vcgc[2].zeros(); species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; } } - - - newTemperature_scgc = temperature_scgc - dt * (velocity_vcgc[2] % gradTemp + gmo % (temperature_scgc % divBulkVertVel)) + dt * diffTemp; +/* + if (iProc == 11) + std::cout << "temp : " + << temperature_scgc(7,19,17) << " " + << newTemperature_scgc(7,19,17) << " " + << velocity_vcgc[2](7,19,17) << " " + << gradTemp(7,19,17) << " " + << gmo(7,19,17) << " " + << divBulkVertVel(7,19,17) << " " + << diffTemp(7,19,17) << "\n"; +*/ + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) - species[iSpecies].newVelocity_vcgc[2].clamp(-100,100); + species[iSpecies].newVelocity_vcgc[2].clamp(-150,150); newTemperature_scgc.clamp(10, 1e32); for (iX = nGCs; iX < nXs - nGCs; iX++) From 31bd855fd90292ae5b35813e260d2e400ff78881 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 13:59:55 -0500 Subject: [PATCH 064/691] FEAT: things for vertical advection --- include/ions.h | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/include/ions.h b/include/ions.h index e3f20266..bd8dd1ff 100644 --- a/include/ions.h +++ b/include/ions.h @@ -20,7 +20,7 @@ class Ions { std::string cName; precision_t mass; int charge; - + int vibe; int DoAdvect; std::vector nu_ion_neutral_coef; @@ -39,8 +39,10 @@ class Ions { // Sources and Losses: arma_cube density_scgc; + arma_cube newDensity_scgc; std::vector par_velocity_vcgc; std::vector perp_velocity_vcgc; + std::vector velocity_vcgc; arma_cube temperature_scgc; arma_cube conduction_scgc; @@ -59,6 +61,9 @@ class Ions { arma_cube electron_temperature_scgc; arma_cube rho_scgc; arma_cube mean_major_mass_scgc; + std::vector cMax_vcgc; + arma_cube sound_scgc; + arma_cube gamma_scgc; // This is the vector that will contain all of the different species: std::vector species; @@ -100,6 +105,12 @@ class Ions { void init_ion_temperature(Neutrals neutrals, Grid grid); void set_floor(); void fill_electrons(); + void calc_sound_speed(); + void calc_cMax(); + void set_bcs(Grid grid); + void set_upper_bcs(Grid grid); + void set_lower_bcs(Grid grid); + int get_species_id(std::string name); void calc_efield(Grid grid); void calc_exb_drift(Grid grid); @@ -113,5 +124,14 @@ class Ions { bool check_for_nonfinites(); void nan_test(std::string variable); bool restart_file(std::string dir, bool DoRead); + + /********************************************************************** + \brief Vertical advection solver - Rusanov + \param grid The grid to define the neutrals on + \param time contains information about the current time + **/ + + void solver_vertical_rusanov(Grid grid, Times time); + }; #endif // INCLUDE_IONS_H_ From 6f86379577b8427a1039158765bb925ef8231779 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:01:14 -0500 Subject: [PATCH 065/691] FEAT: calc_dt made generic --- include/neutrals.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index e041e758..664e9714 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -361,14 +361,6 @@ class Neutrals { **/ void calc_cMax(); - /********************************************************************** - \brief Calculate dt (cell size / cMax) in each direction, and take min - \param dt returns the neutral time-step - \param grid The grid to define the neutrals on - **/ - precision_t calc_dt(Grid grid); - precision_t calc_dt_cubesphere(Grid grid); - /********************************************************************** \brief Calculate the chapman integrals for the individual species \param grid The grid to define the neutrals on From 4bb842caaa440787a15f01e7503191e918080d18 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:01:42 -0500 Subject: [PATCH 066/691] FEAT: calc_dt made generic --- include/solvers.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/solvers.h b/include/solvers.h index eaf16392..48515deb 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -104,4 +104,15 @@ precision_t limiter_mc(precision_t dUp, precision_t dDown, precision_t beta); + + /********************************************************************** + \brief Calculate dt (cell size / cMax) in each direction, and take min + \param dt returns the neutral time-step + \param grid The grid to define the neutrals on + **/ + precision_t calc_dt(Grid grid, std::vector cMax_vcgc); + precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc); + precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc); + precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc); + #endif // INCLUDE_SOLVERS_H_ From f550c5e8f28cedb7c87201af0af17c28db4f0456 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:02:41 -0500 Subject: [PATCH 067/691] FEAT: ignore seconds in filename --- include/times.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/include/times.h b/include/times.h index f0fff47e..61277e9d 100644 --- a/include/times.h +++ b/include/times.h @@ -91,8 +91,10 @@ class Times { \brief Returns the current time as a string (year, month...) Returns the current time as a string of format YYYYMMDD_HHMMSS + + \param useSeconds if false, replace seconds with 0 **/ - std::string get_YMD_HMS(); + std::string get_YMD_HMS(bool useSeconds); /************************************************************** \brief Returns the intermediate time in seconds since ref date @@ -226,6 +228,9 @@ class Times { /// represented as YYYYMMDD_HHMMSS std::string sYMD_HMS; + /// represented as YYYYMMDD_HHMM00 + std::string sYMD_HM0; + // ------------------------------------------------------------- // Keeping track of walltime for the run: From 1df8f066bff0c17ee7976c59c41ccc042e92e044 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:03:19 -0500 Subject: [PATCH 068/691] FEAT: include vibration states --- share/run/UA/inputs/earth.in | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index e8f4432b..a77b5672 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -57,12 +57,12 @@ O+ is O+(4S) is the base state of O+, but is just called O+ O+ has excited states of O+(2D) and O+(2P). #IONS -name, mass, charge, advect -O+, 16, 1, 1 -O2+, 32, 1, 0 -N2+, 28, 1, 0 -NO+, 30, 1, 0 -N+, 14, 1, 0 -He+, 4, 1, 1 -O+_2D, 16, 1, 0 -O+_2P, 16, 1, 0 +name, mass, charge, vibration, advect +O+, 16, 1, 5, 1 +O2+, 32, 1, 7, 0 +N2+, 28, 1, 7, 0 +NO+, 30, 1, 7, 0 +N+, 14, 1, 5, 0 +He+, 4, 1, 5, 1 +O+_2D, 16, 1, 5, 0 +O+_2P, 16, 1, 5, 0 From 53b928875ecd15fea631fbcf684b93b0c8138df3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:04:32 -0500 Subject: [PATCH 069/691] FEAT: enable ion advection --- src/advance.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index c5fe05c4..6e8b0e21 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -49,8 +49,12 @@ bool advance(Planets &planet, neutrals.calc_viscosity(); neutrals.calc_cMax(); - precision_t dtNeutral = neutrals.calc_dt(gGrid); - precision_t dtIon = 100.0; + ions.fill_electrons(); + ions.calc_sound_speed(); + ions.calc_cMax(); + + precision_t dtNeutral = calc_dt(gGrid, neutrals.cMax_vcgc); + precision_t dtIon = calc_dt(gGrid, ions.cMax_vcgc); time.calc_dt(dtNeutral, dtIon); // ------------------------------------ @@ -63,7 +67,10 @@ bool advance(Planets &planet, if (didWork) didWork = neutrals.set_bcs(gGrid, time, indices); - + + if (didWork) + didWork = ions.set_bcs(gGrid, time, indices); + neutrals.exchange_old(gGrid); advect(gGrid, time, neutrals); From dbae1e847e9755cf8918c042f8d91341490c5aeb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:05:03 -0500 Subject: [PATCH 070/691] STY: formatting --- src/calc_ion_drift.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 93a139d0..76c7d51d 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -198,9 +198,11 @@ void Ions::calc_ion_drift(Neutrals neutrals, sum_rho = sum_rho + rho; for (int64_t iComp = 0; iComp < 3; iComp++) { + species[iIon].velocity_vcgc[iComp] = + species[iIon].perp_velocity_vcgc[iComp] + + species[iIon].par_velocity_vcgc[iComp]; velocity_vcgc[iComp] = velocity_vcgc[iComp] + - rho % (species[iIon].perp_velocity_vcgc[iComp] + - species[iIon].par_velocity_vcgc[iComp]); + rho % (species[iIon].velocity_vcgc[iComp]); } } // if DoAdvect From b42746bc9dfb55884c3a178d46305b6b0e323864 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:06:26 -0500 Subject: [PATCH 071/691] FEAT: enable ion advection --- src/ions.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 85 insertions(+), 1 deletion(-) diff --git a/src/ions.cpp b/src/ions.cpp index 492d820f..ca11e8d3 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -20,6 +20,7 @@ Ions::species_chars Ions::create_species(Grid grid) { // Constants: tmp.DoAdvect = 0; + tmp.vibe = 5; tmp.density_scgc.set_size(nLons, nLats, nAlts); tmp.density_scgc.fill(1e10); @@ -35,10 +36,12 @@ Ions::species_chars Ions::create_species(Grid grid) { tmp.par_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.perp_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + tmp.velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); for (int iDir = 0; iDir < 3; iDir++) { tmp.par_velocity_vcgc[iDir].zeros(); tmp.perp_velocity_vcgc[iDir].zeros(); + tmp.velocity_vcgc[iDir].zeros(); } // The collision frequencies need the neutrals, so those are @@ -87,9 +90,17 @@ Ions::Ions(Grid grid, Planets planet) { density_scgc.set_size(nLons, nLats, nAlts); density_scgc.ones(); velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + cMax_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int iDir = 0; iDir < 3; iDir++) + gamma_scgc.set_size(nLons, nLats, nAlts); + gamma_scgc.ones(); + sound_scgc.set_size(nLons, nLats, nAlts); + sound_scgc.ones(); + + for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir].zeros(); + cMax_vcgc[iDir].ones(); + } temperature_scgc.set_size(nLons, nLats, nAlts); temperature_scgc.fill(200.0); @@ -156,6 +167,7 @@ int Ions::read_planet_file(Planets planet) { species[iSpecies].mass = mass * cAMU; species[iSpecies].charge = ions["charge"][iSpecies]; species[iSpecies].DoAdvect = ions["advect"][iSpecies]; + species[iSpecies].vibe = ions["vibration"][iSpecies]; } // account for advected ions: @@ -238,6 +250,78 @@ void Ions::set_floor() { return; } +// ---------------------------------------------------------------------- +// Calculate a bunch of derived products: +// - Gamma +// - Speed of sound +// ---------------------------------------------------------------------- + +void Ions::calc_sound_speed() { + + int64_t iSpecies; + + std::string function = "Ion::calc_sound_speed"; + static int iFunction = -1; + report.enter(function, iFunction); + + gamma_scgc.zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + gamma_scgc = gamma_scgc + + species[iSpecies].density_scgc / (species[iSpecies].vibe - 2); + } + gamma_scgc = gamma_scgc * 2.0 / density_scgc + 1.0; + + sound_scgc = sqrt(cKB * + gamma_scgc % + temperature_scgc / + mean_major_mass_scgc); + + if (report.test_verbose(2)) { + std::cout << "max sound speed : " << sound_scgc.max() << "\n"; + std::cout << "max gamma : " << gamma_scgc.max() << "\n"; + if (!all_finite(sound_scgc, "sound speed")) { + std::cout << "sound speed has nans!\n"; + report.report_errors(); + } + } + + report.exit(function); + return; +} + +// ---------------------------------------------------------------------- +// Calculate cMax, which is the sound speed + velocity in each +// direction +// ---------------------------------------------------------------------- + +void Ions::calc_cMax() { + + std::string function = "Ions::calc_cMax"; + static int iFunction = -1; + report.enter(function, iFunction); + + int iDir; + + // just take the bulk value for now: + + if (report.test_verbose(3)) { + std::cout << "max sound speed : " << sound_scgc.max() << "\n"; + + for (iDir = 0; iDir < 3; iDir++) { + arma_cube tmp = abs(velocity_vcgc[iDir]); + std::cout << "min velocity : " << tmp.min() << "\n"; + std::cout << "max velocity : " << tmp.max() << "\n"; + } + } + + for (iDir = 0; iDir < 3; iDir++) + cMax_vcgc[iDir] = sound_scgc + abs(velocity_vcgc[iDir]); + + report.exit(function); + return; +} + + // ----------------------------------------------------------------------------- // Calculate the electron density from the sum of all ion species // ----------------------------------------------------------------------------- From ee834257242ac3c68a54a7437b719918ecc957d2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:06:58 -0500 Subject: [PATCH 072/691] FEAT: ignore seconds in filename --- src/output.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/output.cpp b/src/output.cpp index 66ca3704..d30416b4 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -312,7 +312,10 @@ bool output(const Neutrals &neutrals, if (type_output == "therm") filename = "3DTHR_"; - filename = filename + time.get_YMD_HMS(); + bool useSeconds = false; + if (input.get_dt_output(iOutput) < 60) + useSeconds = true; + filename = filename + time.get_YMD_HMS(useSeconds); if (nMembers > 1) filename = filename + "_" + cMember; From 7b251b10240a00c72ca70c3b63f1bbbb70730b79 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:07:27 -0500 Subject: [PATCH 073/691] FEAT: ignore seconds in filename --- src/time.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/time.cpp b/src/time.cpp index d0962e33..385c29ff 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -139,8 +139,11 @@ double Times::get_end() { // Get the current time as a string // ----------------------------------------------------------------------------- -std::string Times::get_YMD_HMS() { - return sYMD_HMS; +std::string Times::get_YMD_HMS(bool useSeconds) { + if (useSeconds) + return sYMD_HMS; + else + return sYMD_HM0; } // ----------------------------------------------------------------------------- @@ -230,6 +233,9 @@ void Times::increment_time() { sprintf(tmp, "%04d%02d%02d_%02d%02d%02d", year, month, day, hour, minute, second); sYMD_HMS = std::string(tmp); + sprintf(tmp, "%04d%02d%02d_%02d%02d%02d", + year, month, day, hour, minute, 0); + sYMD_HM0 = std::string(tmp); sprintf(tmp, "%04d%02d%02d", year, month, day); sYMD = std::string(tmp); sprintf(tmp, "%02d%02d%02d", hour, minute, second); From 0dcca19e459ffbc81b77f4199d52a0f323dbd44c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:08:35 -0500 Subject: [PATCH 074/691] STY: astyle within vscode... --- src/main/main.cpp | 412 +++++++++++++++++++++++----------------------- 1 file changed, 206 insertions(+), 206 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 9e5d2ddb..1233b103 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -10,214 +10,214 @@ int main() { - int iErr = 0; - std::string sError; - bool didWork = true; - - Times time; - - // Define the function and report: - std::string function = "main"; - static int iFunction = -1; - report.enter(function, iFunction); - - try { - // Create inputs (reading the input file): - input = Inputs(time); - if (!input.is_ok()) - throw std::string("input initialization failed!"); - - if (input.get_is_student()) - report.print(-1, "Hello " + - input.get_student_name() + " - welcome to Aether!"); - - Quadtree quadtree; - if (!quadtree.is_ok()) - throw std::string("quadtree initialization failed!"); - - // Initialize MPI and parallel aspects of the code: - didWork = init_parallel(quadtree); - if (!didWork) - throw std::string("init_parallel failed!"); - - // Everything should be set for the inputs now, so write a restart file: - didWork = input.write_restart(); - if (!didWork) - throw std::string("input.write_restart failed!"); - - // Initialize the EUV system: - Euv euv; - if (!euv.is_ok()) - throw std::string("EUV initialization failed!"); - - // Initialize the planet: - Planets planet; - MPI_Barrier(aether_comm); - if (!planet.is_ok()) - throw std::string("planet initialization failed!"); - - // Initialize the indices, read the files, and perturb: - Indices indices; - didWork = read_and_store_indices(indices); - MPI_Barrier(aether_comm); - if (!didWork) - throw std::string("read_and_store_indices failed!"); - - // Perturb the inputs if user has asked for this - indices.perturb(); - MPI_Barrier(aether_comm); - - // Initialize Geographic grid: - Grid gGrid(input.get_nLonsGeo(), - input.get_nLatsGeo(), - input.get_nAltsGeo(), - nGeoGhosts); - didWork = gGrid.init_geo_grid(quadtree, planet); - MPI_Barrier(aether_comm); - if (!didWork) - throw std::string("init_geo_grid failed!"); - - // Calculate centripetal acceleration, since this is a constant - // vector on the grid: - if (input.get_use_centripetal()) - gGrid.calc_cent_acc(planet); - - // Initialize Magnetic grid: - Grid mGrid(nMagLonsG, nMagLatsG, nMagAltsG, nMagGhosts); - - // Initialize Neutrals on geographic grid: - Neutrals neutrals(gGrid, planet, time, indices); - - // Initialize Ions on geographic grid: - Ions ions(gGrid, planet); - - // ----------------------------------------------------------------- - // This is a unit test for checking for nans and infinities. - // Is simply adds nans and infinities in a few places, then - // checks for them to make sure the checking is working - // ----------------------------------------------------------------- - - if (input.get_nan_test()) { - neutrals.nan_test(input.get_nan_test_variable()); - ions.nan_test(input.get_nan_test_variable()); + int iErr = 0; + std::string sError; + bool didWork = true; + + Times time; + + // Define the function and report: + std::string function = "main"; + static int iFunction = -1; + report.enter(function, iFunction); + + try { + // Create inputs (reading the input file): + input = Inputs(time); + if (!input.is_ok()) + throw std::string("input initialization failed!"); + + if (input.get_is_student()) + report.print(-1, "Hello " + + input.get_student_name() + " - welcome to Aether!"); + + Quadtree quadtree; + if (!quadtree.is_ok()) + throw std::string("quadtree initialization failed!"); + + // Initialize MPI and parallel aspects of the code: + didWork = init_parallel(quadtree); + if (!didWork) + throw std::string("init_parallel failed!"); + + // Everything should be set for the inputs now, so write a restart file: + didWork = input.write_restart(); + if (!didWork) + throw std::string("input.write_restart failed!"); + + // Initialize the EUV system: + Euv euv; + if (!euv.is_ok()) + throw std::string("EUV initialization failed!"); + + // Initialize the planet: + Planets planet; + MPI_Barrier(aether_comm); + if (!planet.is_ok()) + throw std::string("planet initialization failed!"); + + // Initialize the indices, read the files, and perturb: + Indices indices; + didWork = read_and_store_indices(indices); + MPI_Barrier(aether_comm); + if (!didWork) + throw std::string("read_and_store_indices failed!"); + + // Perturb the inputs if user has asked for this + indices.perturb(); + MPI_Barrier(aether_comm); + + // Initialize Geographic grid: + Grid gGrid(input.get_nLonsGeo(), + input.get_nLatsGeo(), + input.get_nAltsGeo(), + nGeoGhosts); + didWork = gGrid.init_geo_grid(quadtree, planet); + MPI_Barrier(aether_comm); + if (!didWork) + throw std::string("init_geo_grid failed!"); + + // Calculate centripetal acceleration, since this is a constant + // vector on the grid: + if (input.get_use_centripetal()) + gGrid.calc_cent_acc(planet); + + // Initialize Magnetic grid: + Grid mGrid(nMagLonsG, nMagLatsG, nMagAltsG, nMagGhosts); + + // Initialize Neutrals on geographic grid: + Neutrals neutrals(gGrid, planet, time, indices); + + // Initialize Ions on geographic grid: + Ions ions(gGrid, planet); + + // ----------------------------------------------------------------- + // This is a unit test for checking for nans and infinities. + // Is simply adds nans and infinities in a few places, then + // checks for them to make sure the checking is working + // ----------------------------------------------------------------- + + if (input.get_nan_test()) { + neutrals.nan_test(input.get_nan_test_variable()); + ions.nan_test(input.get_nan_test_variable()); + } + + if (input.get_check_for_nans()) { + didWork = neutrals.check_for_nonfinites("In Main, before main loop"); + didWork = ions.check_for_nonfinites(); + } + + // ----------------------------------------------------------------- + + // Once EUV, neutrals, and ions have been defined, pair cross sections + euv.pair_euv(neutrals, ions); + + // Initialize Chemical scheme (including reading file): + Chemistry chemistry(neutrals, ions); + + // Read in the collision frequencies and other diffusion coefficients: + read_collision_file(neutrals, ions); + + // Initialize ion temperatures from neutral temperature + ions.init_ion_temperature(neutrals, gGrid); + + // Initialize electrodynamics and check if electrodynamics times + // works with input time + Electrodynamics electrodynamics(time); + if (!electrodynamics.is_ok()) + throw std::string("electrodynamics initialization failed!"); + + // If the user wants to restart, then get the time of the restart + if (input.get_do_restart()) { + report.print(1, "Restarting! Reading time file!"); + didWork = time.restart_file(input.get_restartin_dir(), DoRead); + if (!didWork) + throw std::string("Reading Restart for time Failed!!!\n"); + } + + // This is for the initial output. If it is not a restart, this will go: + if (time.check_time_gate(input.get_dt_output(0))) + didWork = output(neutrals, ions, gGrid, time, planet); + if (!didWork) + throw std::string("output failed!"); + + // This is advancing now... We are not coupling, so set dt_couple to the + // end of the simulation + + double dt_couple = time.get_end() - time.get_current(); + + // The way most codes are set up in the SWMF is that there are two + // times, an end time which ends the simulation, and an intermediate + // time, which allows coupling or something to happen. So, typically + // the advance functions should only go to this intermediate time, + // then a loop around that goes to the end time. Then, the code can + // be made into a library and run externally. + + Logfile logfile(indices); + while (time.get_current() < time.get_end()) { + + time.increment_intermediate(dt_couple); + + // Increment until the intermediate time: + while (time.get_current() < time.get_intermediate()) { + didWork = advance(planet, + gGrid, + time, + euv, + neutrals, + ions, + chemistry, + electrodynamics, + indices, + logfile); + if (!didWork) + throw std::string("Error in advance!"); + } + + // Should write out some restart files every time we are done with + // intermediate times. Just so when we restart, we know that we can + // couple first thing and everything should be good. (Not sure if + // restart should be before or after the coupling, but since we are + // not coupling, it doesn't matter. Once we do coupling to something, + // need to figure it out. + // + // The odd thing here is that in advance, we most likely JUST + // wrote out restart files, so we only need to do this if we + // didn't just do it. So, check the negative here: + if (!time.check_time_gate(input.get_dt_write_restarts())) { + report.print(3, "Writing restart files"); + + didWork = neutrals.restart_file(input.get_restartout_dir(), DoWrite); + if (!didWork) + throw std::string("Writing Restart for Neutrals Failed!!!\n"); + + didWork = ions.restart_file(input.get_restartout_dir(), DoWrite); + if (!didWork) + throw std::string("Writing Restart for Ions Failed!!!\n"); + + didWork = time.restart_file(input.get_restartout_dir(), DoWrite); + if (!didWork) + throw std::string("Writing Restart for time Failed!!!\n"); + } + + // Do some coupling here. But we have no coupling to do. Sad. + + } // End of outer time loop - done with run! + + report.exit(function); + report.times(); + + } catch (std::string error) { + report.report_errors(); + if (iProc == 0) { + std::cout << error << "\n"; + std::cout << "---- Must Exit! ----\n"; + } } - if (input.get_check_for_nans()) { - didWork = neutrals.check_for_nonfinites("In Main, before main loop"); - didWork = ions.check_for_nonfinites(); - } - - // ----------------------------------------------------------------- - - // Once EUV, neutrals, and ions have been defined, pair cross sections - euv.pair_euv(neutrals, ions); - - // Initialize Chemical scheme (including reading file): - Chemistry chemistry(neutrals, ions); - - // Read in the collision frequencies and other diffusion coefficients: - read_collision_file(neutrals, ions); - - // Initialize ion temperatures from neutral temperature - ions.init_ion_temperature(neutrals, gGrid); - - // Initialize electrodynamics and check if electrodynamics times - // works with input time - Electrodynamics electrodynamics(time); - if (!electrodynamics.is_ok()) - throw std::string("electrodynamics initialization failed!"); - - // If the user wants to restart, then get the time of the restart - if (input.get_do_restart()) { - report.print(1, "Restarting! Reading time file!"); - didWork = time.restart_file(input.get_restartin_dir(), DoRead); - if (!didWork) - throw std::string("Reading Restart for time Failed!!!\n"); - } - - // This is for the initial output. If it is not a restart, this will go: - if (time.check_time_gate(input.get_dt_output(0))) - didWork = output(neutrals, ions, gGrid, time, planet); - if (!didWork) - throw std::string("output failed!"); - - // This is advancing now... We are not coupling, so set dt_couple to the - // end of the simulation - - double dt_couple = time.get_end() - time.get_current(); - - // The way most codes are set up in the SWMF is that there are two - // times, an end time which ends the simulation, and an intermediate - // time, which allows coupling or something to happen. So, typically - // the advance functions should only go to this intermediate time, - // then a loop around that goes to the end time. Then, the code can - // be made into a library and run externally. - - Logfile logfile(indices); - while (time.get_current() < time.get_end()) { - - time.increment_intermediate(dt_couple); - - // Increment until the intermediate time: - while (time.get_current() < time.get_intermediate()) { - didWork = advance(planet, - gGrid, - time, - euv, - neutrals, - ions, - chemistry, - electrodynamics, - indices, - logfile); - if (!didWork) - throw std::string("Error in advance!"); - } - - // Should write out some restart files every time we are done with - // intermediate times. Just so when we restart, we know that we can - // couple first thing and everything should be good. (Not sure if - // restart should be before or after the coupling, but since we are - // not coupling, it doesn't matter. Once we do coupling to something, - // need to figure it out. - // - // The odd thing here is that in advance, we most likely JUST - // wrote out restart files, so we only need to do this if we - // didn't just do it. So, check the negative here: - if (!time.check_time_gate(input.get_dt_write_restarts())) { - report.print(3, "Writing restart files"); - - didWork = neutrals.restart_file(input.get_restartout_dir(), DoWrite); - if (!didWork) - throw std::string("Writing Restart for Neutrals Failed!!!\n"); - - didWork = ions.restart_file(input.get_restartout_dir(), DoWrite); - if (!didWork) - throw std::string("Writing Restart for Ions Failed!!!\n"); - - didWork = time.restart_file(input.get_restartout_dir(), DoWrite); - if (!didWork) - throw std::string("Writing Restart for time Failed!!!\n"); - } - - // Do some coupling here. But we have no coupling to do. Sad. - - } // End of outer time loop - done with run! - - report.exit(function); - report.times(); - - } catch (std::string error) { - report.report_errors(); - if (iProc == 0) { - std::cout << error << "\n"; - std::cout << "---- Must Exit! ----\n"; - } - } - - // End parallel tasks: - iErr = MPI_Finalize(); + // End parallel tasks: + iErr = MPI_Finalize(); - return iErr; + return iErr; } From 30a80162eb20e0f67bb3bdb64413ee5a927404d1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:09:47 -0500 Subject: [PATCH 075/691] FEAT: vertical ion advection --- src/solver_vertical_rusanov.cpp | 98 +++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 74b8814c..b59baf88 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -435,3 +435,101 @@ void Neutrals::solver_vertical_rusanov(Grid grid, report.exit(function); return; } + + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +void Ions::solver_vertical_rusanov(Grid grid, + Times time) { + + std::string function = "Ions::solver_vertical_rusanov"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t nXs = grid.get_nX(), iX; + int64_t nYs = grid.get_nY(), iY; + int64_t nZs = grid.get_nZ(), iZ; + int64_t nGCs = grid.get_nGCs(); + int iDir, iSpecies; + + precision_t dt = time.get_dt(); + + // ----------------------------------------------------------- + // Bulk Variables: + std::vector gradVel, diffVel; + gradVel = make_cube_vector(nXs, nYs, nZs, 3); + diffVel = make_cube_vector(nXs, nYs, nZs, 3); + + arma_cube gradDummy(nXs, nYs, nZs), diffDummy(nXs, nYs, nZs); + + // ----------------------------------------------------------- + // species dependent variables: + std::vector gradLogN_s, diffLogN_s; + std::vector gradVertVel_s, diffVertVel_s, divVertVel_s; + gradLogN_s = make_cube_vector(nXs, nYs, nZs, nSpecies); + diffLogN_s = make_cube_vector(nXs, nYs, nZs, nSpecies); + gradVertVel_s = make_cube_vector(nXs, nYs, nZs, nSpecies); + diffVertVel_s = make_cube_vector(nXs, nYs, nZs, nSpecies); + divVertVel_s = make_cube_vector(nXs, nYs, nZs, nSpecies); + + arma_cube log_s(nXs, nYs, nZs), vv_s(nXs, nYs, nZs); + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + if (species[iSpecies].DoAdvect) { + + // Log(number density): + log_s = log(species[iSpecies].density_scgc); + + calc_grad_and_diff_alts_rusanov(grid, + log_s, + cMax_vcgc[2], + gradDummy, + diffDummy); + + gradLogN_s[iSpecies] = gradDummy; + diffLogN_s[iSpecies] = diffDummy; + + // Vertical Velocity for each species: + vv_s = species[iSpecies].velocity_vcgc[2]; + calc_grad_and_diff_alts_rusanov(grid, + vv_s, + cMax_vcgc[2], + gradDummy, + diffDummy); + gradVertVel_s[iSpecies] = gradDummy; + diffVertVel_s[iSpecies] = diffDummy; + divVertVel_s[iSpecies] = gradDummy + 2 * vv_s / grid.radius_scgc; + } else { + gradVertVel_s[iSpecies].zeros(); + diffVertVel_s[iSpecies].zeros(); + divVertVel_s[iSpecies].zeros(); + } + } + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + if (species[iSpecies].DoAdvect) { + + // densities: + log_s = + log(species[iSpecies].density_scgc) + - dt * (divVertVel_s[iSpecies] + + species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + + dt * diffLogN_s[iSpecies]; + species[iSpecies].newDensity_scgc = exp(log_s); + + } else { + species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; + } + } + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + if (species[iSpecies].DoAdvect) + species[iSpecies].density_scgc = species[iSpecies].newDensity_scgc; + + fill_electrons(); + + report.exit(function); + return; +} From c53f5048742754b60034bdf9b5bfd78bbaa08c26 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:10:32 -0500 Subject: [PATCH 076/691] FEAT: make calc_dt generic so ions can use --- src/calc_dt.cpp | 149 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/calc_dt.cpp diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp new file mode 100644 index 00000000..5854eadf --- /dev/null +++ b/src/calc_dt.cpp @@ -0,0 +1,149 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include "../include/aether.h" + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + + +precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { + + std::string function = "calc_dt"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + + if (input.get_is_cubesphere()) + dt = calc_dt_cubesphere(grid, cMax_vcgc); + else + dt = calc_dt_sphere(grid, cMax_vcgc); + + report.exit(function); + return dt; +} + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { + + std::string function = "calc_dt_sphere"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + + arma_vec dta(4); + arma_cube dtCube; + + // Longitudinal Direction: + dtCube = grid.dlon_center_dist_scgc / cMax_vcgc[0]; + dta(0) = dtCube.min(); + + // Latitudinal Direction: + dtCube = grid.dlat_center_dist_scgc / cMax_vcgc[1]; + dta(1) = dtCube.min(); + + // Vertical Direction: + dta(2) = calc_dt_vertical(grid, cMax_vcgc); + + // Set a minimum dt: + dta(3) = 10.0; + + dt = dta.min(); + + if (report.test_verbose(3)) + std::cout << "dt (sphere) for neutrals : " << dt << "\n"; + + if (report.test_verbose(4)) + std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; + + report.exit(function); + return dt; +} + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { + + std::string function = "calc_dt_sphere"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + arma_vec dta(4); + + // Get some dimensions + int64_t nAlts = grid.get_nAlts(); + int64_t nXs = grid.get_nLons(); + int64_t nYs = grid.get_nLats(); + + // dtx dty for reference coordinate system + arma_cube dtx(nXs, nYs, nAlts); + arma_cube dty(nXs, nYs, nAlts); + + // A dummy constant one matrix + arma_mat dummy_1(nXs, nYs, fill::ones); + + // Loop through altitudes + for (int iAlt = 0; iAlt < nAlts; iAlt++) { + // Conver cMax to contravariant velocity first + arma_mat u1 = sqrt( + cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) % + cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) + + cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt) % + cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt)); + arma_mat u2 = sqrt( + cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) % + cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) + + cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt) % + cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt)); + dtx.slice(iAlt) = grid.drefx(iAlt) * dummy_1 / u1; + dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; + } + // Take minimum dts in each direction: + dta(0) = dtx.min(); + dta(1) = dty.min(); + // Vertical Direction: + dta(2) = calc_dt_vertical(grid, cMax_vcgc); + // Set a minimum dt: + dta(3) = 10.0; + // Take the minimum of all directions: + dt = dta.min(); + + if (report.test_verbose(3)) + std::cout << "dt (cubesphere) : " << dt << "\n"; + + if (report.test_verbose(4)) + std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; + + report.exit(function); + return dt; +} + +// -------------------------------------------------------------------------- +// +// -------------------------------------------------------------------------- + +precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { + + std::string function = "calc_dt_vertical"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + if (input.get_nAltsGeo() > 1) { + arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; + dt = dtz.min(); + } else + dt = 1e32; + + report.exit(function); + return dt; +} \ No newline at end of file From 9477fd70fdb92e9d2b4e2fd38df6e08112cd35bc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 29 Dec 2023 14:10:53 -0500 Subject: [PATCH 077/691] FEAT: set ion BCs --- src/ions_bcs.cpp | 135 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/ions_bcs.cpp diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp new file mode 100644 index 00000000..bc423412 --- /dev/null +++ b/src/ions_bcs.cpp @@ -0,0 +1,135 @@ +// Copyright 2023, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md +// +// initial version - A. Ridley - May 27, 2023 + +#include "aether.h" + +// ----------------------------------------------------------------------------- +// Set initial conditions for the neutrals. +// Two methods implemented so far: +// - Planet: Use fixed density values in the planet.in file and the +// temperature profile to set the densities and temperature. +// Densities are filled with hydrostatic solution. +// - Msis: Use NRL MSIS to set the densities and temperatures. If the +// densities are not found, then set to density in planet.in +// file and fill with hydrostatic. +// ----------------------------------------------------------------------------- + +//---------------------------------------------------------------------- +// set_bcs - This is for setting the vertical BCs +//---------------------------------------------------------------------- + +bool Ions::set_bcs(Grid grid, + Times time, + Indices indices) { + + std::string function = "Ions::set_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork = true; + + if (input.get_nAltsGeo() > 1) { + didWork = set_lower_bcs(grid, time, indices); + + if (didWork) + didWork = set_upper_bcs(grid); + + if (didWork) + fill_electrons(); + } + + if (!didWork) + report.error("issue with ion BCs!"); + + report.exit(function); + return didWork; +} + +//---------------------------------------------------------------------- +// set upper boundary conditions for the ions +//---------------------------------------------------------------------- + +bool Ions::set_upper_bcs(Grid grid) { + + std::string function = "Ions::set_upper_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork = true; + + int64_t nAlts = grid.get_nZ(); + int64_t nX = grid.get_nX(), iX; + int64_t nY = grid.get_nY(), iY; + int64_t nGCs = grid.get_nGCs(); + int64_t iAlt; + arma_mat h; + arma_mat aveT; + + for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { + // Bulk Quantities: + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt - 1); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].temperature_scgc.slice(iAlt) = + species[iSpecies].temperature_scgc.slice(iAlt - 1); + + aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + + electon_temperature_scgc.slice(iAlt)); + // Calculate scale height for the species: + h = cKB * species[iSpecies].temperature_scgc.slice(iAlt) / + (species[iSpecies].mass % abs(grid.gravity_vcgc[2])); + // Assume each species falls of with (modified) hydrostatic: + species[iSpecies].density_scgc.slice(iAlt) = + species[iSpecies].density_scgc.slice(iAlt - 1) % + exp(-grid.dalt_lower_scgc.slice(iAlt) / h); + } + } + + report.exit(function); + return didWork; +} + +//---------------------------------------------------------------------- +// set lower boundary conditions for the ions +//---------------------------------------------------------------------- + +bool Ions::set_lower_bcs(Grid grid) { + + std::string function = "Ions::set_lower_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork = true; + + int64_t nAlts = grid.get_nZ(); + int64_t nX = grid.get_nX(), iX; + int64_t nY = grid.get_nY(), iY; + int64_t nGCs = grid.get_nGCs(); + int64_t iAlt; + arma_mat h; + arma_mat aveT; + + for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { + // Bulk Quantities: + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // assign all species temperatures the bulk temperature: + species[iSpecies].temperature_scgc.slice(iAlt) = + temperature_scgc.slice(iAlt); + // Assume each species falls off a bit. + // this BC shouldn't matter, since the bottom of the code + // should be in chemical equalibrium: + species[iSpecies].density_scgc.slice(iAlt) = + 0.95 * species[iSpecies].density_scgc.slice(iAlt + 1); + } + } + + report.exit(function); + return didWork; +} + From 23f3f62636b30bfd6c7fe54db1dc8ac1f0c40a6f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 16 Feb 2024 20:00:30 -0500 Subject: [PATCH 078/691] FEAT: trying a vertical 1d solver --- edu/examples/Advection/euler_vertical.cpp | 737 ++++++++++++++++++++++ 1 file changed, 737 insertions(+) create mode 100644 edu/examples/Advection/euler_vertical.cpp diff --git a/edu/examples/Advection/euler_vertical.cpp b/edu/examples/Advection/euler_vertical.cpp new file mode 100644 index 00000000..65a0a429 --- /dev/null +++ b/edu/examples/Advection/euler_vertical.cpp @@ -0,0 +1,737 @@ + +// g++ -o euler1dv.exe -I/usr/local/include euler_vertical.cpp + +/// The armadillo library is to allow the use of 3d cubes and other +/// array types, with array math built in. This eliminates loops! +#include + +/// This is used for timing and the random seed generator: +#include + +// Types +// Precision compile-time aliasing +//#ifdef AETHER_USE_PRECISION_DOUBLE +/// Precision type chosen to be `double` through `AETHER_USE_PRECISION_DOUBLE` +using precision_t = double; +//#else +/// Precision type compile-time default to float. +//using precision_t = float; +//#endif + +/// Armadillo type vector (single column) with compile-time precision. +using arma_vec = arma::Col; +/// Armadillo type matrix (two dimension) with compile-time precision. +using arma_mat = arma::Mat; +/// Armadillo type cube (three dimension) with compile-time precision. +using arma_cube = arma::Cube; + +#include + +const precision_t t0 = 1000.0; +const precision_t mass = 16.0 * 1.67e-27; +const precision_t r0 = 1.0e19 * mass; +const precision_t kb = 1.38e-23; +const precision_t gravity = -kb * t0 / mass / 100000.0; + +// --------------------------------------------------------- +// grid stretched creation +// --------------------------------------------------------- + +arma_vec init_stretched_grid(int64_t nPts, int64_t nGCs) { + + precision_t dx = 1.0; + arma_vec x(nPts + nGCs * 2); + + precision_t factor = 1.0; + precision_t i2pi = 2.0 * 3.1415927 / (nPts-1); + + x(nGCs) = 0.0; + + for (int64_t i = 1; i < nPts + nGCs; i++) { + x(i + nGCs) = x(i - 1 + nGCs) + dx + factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + for (int64_t i = -1; i >= -nGCs; i--) { + x(i + nGCs) = x(i + 1 + nGCs) - dx - factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + precision_t maxX = x(nPts + nGCs - 1); + x = 100.0 * x / maxX; + + return x; +} + +// --------------------------------------------------------- +// grid creation +// --------------------------------------------------------- + +arma_vec init_grid(int64_t nPts, int64_t nGCs) { + + precision_t dx = 1.0 / nPts; + arma_vec x(nPts + nGCs * 2); + + // uniform grid: + for (int64_t i = -nGCs; i < nPts + nGCs; i++) { + x(i + nGCs) = i * dx; + } + // stretch to be 100 km: + x = x * 200.0 * 1000.0; + + return x; +} + +// --------------------------------------------------------- +// bin edges +// --------------------------------------------------------- + +arma_vec calc_bin_edges(arma_vec centers) { + + int64_t nPts = centers.n_elem; + arma_vec edges(nPts+1); + + precision_t dc = centers(1) - centers(0); + + edges(0) = centers(0) - dc / 2.0; + edges(1) = centers(0) + dc / 2.0; + for (int64_t i = 2; i < nPts + 1; i++) + edges(i) = 2 * centers(i - 1) - edges(i - 1); + + return edges; +} + +// --------------------------------------------------------- +// bin widths +// --------------------------------------------------------- + +arma_vec calc_bin_widths(arma_vec edges) { + + int64_t nPts = edges.n_elem - 1; + arma_vec widths(nPts); + + for (int64_t i = 0; i < nPts; i++) + widths(i) = edges(i + 1) - edges(i); + + return widths; +} + +// --------------------------------------------------------- +// initial rho +// --------------------------------------------------------- + +arma_vec init_rho(int64_t nPts, arma_vec x) { + + arma_vec rho(nPts); + precision_t h, dx; + rho(0) = r0; + for (int64_t i = 1; i < nPts; i++) { + // t = 100: + h = kb * t0 / mass / abs(gravity); + dx = x(i) - x(i-1); + rho(i) = rho(i-1) * exp( - dx / h); +//std::cout << "i, rho : " << i +// << " " << rho(i) +// << " " << dx +// << " " << h << "\n"; + } + + return rho; +} + +// --------------------------------------------------------- +// set BCs +// --------------------------------------------------------- + +void set_bcs(int64_t nPts, int64_t nGCs, + arma_vec x, + arma_vec &rho, + arma_vec &vel, + arma_vec &temp) { + + precision_t h, dx; + // Lower BC on rho: + rho(0) = r0; + vel(0) = 0.0; //vel(nGCs); + temp(0) = t0; + for (int64_t i = 1; i < nGCs; i++) { + h = kb * t0 / mass / abs(gravity); + dx = x(i) - x(i-1); + rho(i) = rho(i-1) * exp( - dx / h); + vel(i) = 0.0; //vel(nGCs); + temp(i) = t0; + } + // Upper BC on rho: + for (int64_t i = nPts + nGCs; i < nPts + 2 * nGCs; i++) { + h = kb * temp(i) / mass / abs(gravity); + dx = x(i) - x(i-1); + temp(i) = temp(i-1); + rho(i) = temp(i-1) / temp(i) * rho(i-1) * exp( - dx / h); + //if (vel(i-1) >= 0.0) { + vel(i) = vel(i-1); + //} else { + //vel(i) = 0.0; + //} + } + + return; +} + +// --------------------------------------------------------- +// initial velocity +// --------------------------------------------------------- + +arma_vec init_vel(int64_t nPts) { + arma_vec vel(nPts); + // all cells positive to right: + vel.zeros(); + return vel; +} + +// --------------------------------------------------------- +// initial temp (e) +// --------------------------------------------------------- + +arma_vec init_temp(int64_t nPts) { + arma_vec temp(nPts); + temp.ones(); + temp = temp * t0; + return temp; +} + +// --------------------------------------------------------- +// exchange messages +// --------------------------------------------------------- + +void exchange(arma_vec &values, int64_t nPts, int64_t nGCs) { + + int64_t iEnd = nPts + 2 * nGCs; + // this is a periodic BC: + for (int64_t i = 0; i < nGCs; i++) { + values(i) = values(iEnd - 2 * nGCs + i); + values(iEnd - nGCs + i) = values(nGCs + i); + } +} + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +arma_vec limiter_mc(arma_vec left, + arma_vec right, + int64_t nPts, + int64_t nGCs) { + + precision_t beta = 0.8; + + arma_vec s = left % right; + arma_vec combined = (left + right) * 0.5; + + left = left * beta; + right = right * beta; + arma_vec limited = left; + + for (int64_t i = 1; i < nPts + 2 * nGCs - 1; i++) { + if (s(i) < 0) { + // Sign < 0 means opposite signed left and right: + limited(i) = 0.0; + } else { + if (left(i) > 0 && right(i) > 0) { + if (right(i) < limited(i)) + limited(i) = right(i); + if (combined(i) < limited(i)) + limited(i) = combined(i); + } else { + if (right(i) > limited(i)) + limited(i) = right(i); + if (combined(i) > limited(i)) + limited(i) = combined(i); + } + } + + } + return limited; +} + +// --------------------------------------------------------- +// calc gradients at centers +// - values and x defined at centers +// --------------------------------------------------------- + +arma_vec calc_grad(arma_vec values, + arma_vec x, + int64_t nPts, + int64_t nGCs) { + + arma_vec gradients = values * 0.0; + arma_vec gradL = values * 0.0; + arma_vec gradR = values * 0.0; + + precision_t factor1 = 0.625; + precision_t factor2 = 0.0416667; + precision_t h; + + int64_t i; + + i = nGCs - 1; + h = 2.0 / (x(i+1) - x(i)); + gradR(i) = h * (factor1 * (values(i+1) - values(i)) - + factor2 * (values(i+2) - values(i-1))); + gradL(i) = (values(i) - values(i-1)) / (x(i) - x(i-1)); + + for (i = nGCs; i < nPts + nGCs; i++) { + h = 2.0 / (x(i) - x(i-1)); + gradL(i) = h * (factor1 * (values(i) - values(i-1)) - + factor2 * (values(i+1) - values(i-2))); + h = 2.0 / (x(i+1) - x(i)); + gradR(i) = h * (factor1 * (values(i+1) - values(i)) - + factor2 * (values(i+2) - values(i-1))); + } + i = nPts + nGCs; + h = 2.0 / (x(i) - x(i-1)); + gradL(i) = h * (factor1 * (values(i) - values(i-1)) - + factor2 * (values(i+1) - values(i-2))); + gradR(i) = (values(i+1) - values(i)) / (x(i+1) - x(i)); + + gradients = limiter_mc(gradL, gradR, nPts, nGCs); + + return gradients; +} + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_left(arma_vec values, + arma_vec gradients, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart + 1; i < iEnd - 1; i++) + projected(i + 1) = values(i) + + gradients(i) * (x_edges(i + 1) - x_centers(i)); + + return projected; +} + + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_right(arma_vec values, + arma_vec gradients, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart + 1; i < iEnd - 1; i++) + projected(i) = values(i) + + gradients(i) * (x_edges(i) - x_centers(i)); + + return projected; +} + +// --------------------------------------------------------- +// Limiter on values +// projected is assumed to be on the edge between the +// i-1 and i cell (i-1/2) +// limited is returned at edges +// --------------------------------------------------------- + +arma_vec limiter_value(arma_vec projected, + arma_vec values, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec limited = projected; + + precision_t mini, maxi; + + for (int64_t i = iStart + 1; i < iEnd - 1; i++) { + + mini = values(i-1); + if (values(i) < mini) + mini = values(i); + maxi = values(i-1); + if (values(i) > maxi) + maxi = values(i); + + if (limited(i) < mini) + limited(i) = mini; + if (limited(i) > maxi) + limited(i) = maxi; + + } + return limited; +} + + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_left_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + projected.zeros(); + + precision_t dxei, dxci, dxcip1, r; + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i + 1) = values(i) + + 0.5 * dxei * (values(i) - values(i - 1)) / dxci + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); + } + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; +} + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_right_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + precision_t dxei, dxci, dxcip1, r; + + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i) = values(i) - + 0.5 * dxei * (values(i + 1) - values(i)) / dxcip1 + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); + } + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; +} + +// --------------------------------------------------------- +// gudonov upwind scheme +// --------------------------------------------------------- + +arma_vec gudonov(arma_vec valL, + arma_vec valR, + arma_vec velL, + arma_vec velR, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec flux = velL * 0.0; + arma_vec vel = (velL + velR)/2.0; + + for (int64_t i = iStart + 1; i < iEnd - 1; i++) { + if (vel(i) > 0) + flux(i) = valR(i) * vel(i); + else + flux(i) = valL(i) * vel(i); + } + return flux; +} + +// --------------------------------------------------------- +// gudonov upwind scheme +// --------------------------------------------------------- + +arma_vec rusanov(arma_vec valL, + arma_vec valR, + arma_vec velL, + arma_vec velR, + arma_vec widths, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec ws = abs((velL + velR)/2.0) + 1.; + arma_vec fluxL = valL % velL; + arma_vec fluxR = valR % velR; + arma_vec valDiff = valL - valR; + arma_vec flux = (fluxL + fluxR) / 2.0; + for (int64_t i = iStart + 1; i < iEnd - 1; i++) + flux(i) = flux(i) - ws(i)/2 * valDiff(i); + + return flux; +} + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +void output(arma_vec values, + std::string filename, + bool DoAppend, + int64_t nPts, + int64_t nGCs) { + + std::ofstream outfile; + if (DoAppend) + outfile.open(filename, std::ios_base::app); + else + outfile.open(filename); + + int64_t i; + for (i = 0; i < nPts + 2 * nGCs ; i++) { + outfile << values(i) << " "; + } + outfile << "\n"; + outfile.close(); + +} + + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + + +// --------------------------------------------------------- +// main code +// --------------------------------------------------------- + +int main() { + + precision_t timeMax = 0.1; + precision_t time = 0.0; + + precision_t gamma = 5.0/3.0; + precision_t KoM = kb/mass; + //gamma = kb/mass; + + int64_t iStep; + + int64_t nPts = 100, i; + int64_t nGCs = 2; + int64_t nPtsTotal = nGCs + nPts + nGCs; + + arma_vec x = init_grid(nPts, nGCs); + //arma_vec x = init_stretched_grid(nPts, nGCs); + arma_vec edges = calc_bin_edges(x); + arma_vec widths = calc_bin_widths(edges); + + precision_t dt = 0.00001 * x(nPts + nGCs - 1) / nPts; + int64_t nSteps = 100.0 / dt; + + // std::cout << "dt : " << dt << "; nSteps: " << nSteps << "\n"; + + // state variables: + arma_vec rho = init_rho(nPtsTotal, x); + arma_vec grad_rho; + arma_vec rhoL; + arma_vec rhoR; + + arma_vec vel = init_vel(nPtsTotal); + arma_vec grad_vel; + arma_vec velL; + arma_vec velR; + + // temp is "e" (not E): + arma_vec temp = init_temp(nPtsTotal); + arma_vec grad_temp; + arma_vec tempL, tempR; + + arma_vec eq1Flux, eq1FluxL, eq1FluxR; + arma_vec eq2Flux, eq2FluxL, eq2FluxR; + arma_vec eq3Flux, eq3FluxL, eq3FluxR; + arma_vec wsL, wsR, ws; + arma_vec dtAll; + + arma_vec diff; + +// exchange(rho, nPts, nGCs); +// exchange(vel, nPts, nGCs); +// exchange(temp, nPts, nGCs); + + arma_vec momentum = rho % vel; + arma_vec grad_momenum, momentumL, momentumR; + + arma_vec totalE = rho % temp * KoM + 0.5 * rho % vel % vel; + arma_vec grad_totalE, totaleL, totaleR; + + output(rho, "rho.txt", false, nPts, nGCs); + output(vel, "vel.txt", false, nPts, nGCs); + output(temp, "temp.txt", false, nPts, nGCs); + output(totalE, "totale.txt", false, nPts, nGCs); + output(x, "x.txt", false, nPts, nGCs); + + iStep = 0; + while (time < timeMax) { + + std::cout << "iStep = " << iStep + << "; time = " << time + << "; vel = " << vel(80) << "\n"; + + // ----------------------------------- + // Rho + + grad_rho = calc_grad(rho, x, nPts, nGCs); + + // Right side of edge from left + rhoR = project_from_left_new(rho, + x, edges, + nPts, nGCs); + + // Left side of edge from left + rhoL = project_from_right_new(rho, + x, edges, + nPts, nGCs); + + // ----------------------------------- + // vel + + grad_vel = calc_grad(vel, x, nPts, nGCs); + // Right side of edge from left + velR = project_from_left_new(vel, + x, edges, + nPts, nGCs); + // Left side of edge from left + velL = project_from_right_new(vel, + x, edges, + nPts, nGCs); + + // ----------------------------------- + // temp + + grad_temp = calc_grad(temp, x, nPts, nGCs); + // Right side of edge from left + tempR = project_from_left_new(temp, + x, edges, + nPts, nGCs); + // Left side of edge from left + tempL = project_from_right_new(temp, + x, edges, + nPts, nGCs); + + // eq 1 = rho + // eq 2 = rho * vel (momentum) + // eq 3 = E --> rho * (temp + 0.5 * vel^2) (totalE) + + // Calculate fluxes of different terms at the edges: + eq1FluxL = rhoL % velL; + eq1FluxR = rhoR % velR; + + momentumL = eq1FluxL; + momentumR = eq1FluxR; + totaleL = rhoL % tempL * KoM + 0.5 * rhoL % velL % velL; + totaleR = rhoR % tempR * KoM + 0.5 * rhoR % velR % velR; + + //eq2FluxL = rhoL % (velL % velL + (gamma-1) * tempL); + //eq2FluxR = rhoR % (velR % velR + (gamma-1) * tempR); + eq2FluxL = rhoL % (velL % velL + KoM * tempL); + eq2FluxR = rhoR % (velR % velR + KoM * tempR); + + //eq3FluxL = rhoL % velL % (0.5 * velL % velL + gamma * tempL); + //eq3FluxR = rhoR % velR % (0.5 * velR % velR + gamma * tempR); + eq3FluxL = rhoL % velL % (0.5 * velL % velL + gamma * tempL * KoM); + eq3FluxR = rhoR % velR % (0.5 * velR % velR + gamma * tempR * KoM); + + // Calculate the wave speed for the diffusive flux: + //wsL = abs(velL) + sqrt(gamma * (gamma-1.0) * tempL); + //wsR = abs(velR) + sqrt(gamma * (gamma-1.0) * tempR); + wsL = abs(velL) + sqrt(gamma * KoM * tempL); + wsR = abs(velR) + sqrt(gamma * KoM * tempR); + ws = wsR; + dt = 0.0; + for (i = 1; i < nPts + nGCs*2 - 1; i++) { + if (wsR(i) > ws(i)) ws(i) = wsR(i); + if (widths(i) / ws(i) > dt) + dt = widths(i) / ws(i); + } + dt = dt * 0.001; + time = time + dt; + + // Calculate average flux at the edges: + diff = rhoR - rhoL; + eq1Flux = (eq1FluxL + eq1FluxR) / 2 + 0.5 * ws % diff; + diff = momentumR - momentumL; + eq2Flux = (eq2FluxL + eq2FluxR) / 2 + 0.5 * ws % diff; + diff = totaleR - totaleL; + eq3Flux = (eq3FluxL + eq3FluxR) / 2 + 0.5 * ws % diff; + + // Update values: + for (i = nGCs; i < nPts + nGCs*2 - 1; i++) { + rho(i) = rho(i) - dt / widths(i) * (eq1Flux(i+1) - eq1Flux(i)); + momentum(i) = momentum(i) - dt / widths(i) * (eq2Flux(i+1) - eq2Flux(i)) + + gravity * rho(i) * dt; + totalE(i) = totalE(i) - dt / widths(i) * (eq3Flux(i+1) - eq3Flux(i)); + } + + //exchange(rho, nPts, nGCs); + //exchange(momentum, nPts, nGCs); + //exchange(totalE, nPts, nGCs); + vel = momentum / rho; + temp = (totalE / rho - 0.5 * vel % vel) / KoM; + + set_bcs(nPts, nGCs, x, rho, vel, temp); + + output(rho, "rho.txt", true, nPts, nGCs); + output(vel, "vel.txt", true, nPts, nGCs); + output(temp, "temp.txt", true, nPts, nGCs); + output(totalE, "totale.txt", true, nPts, nGCs); + //output(rhoL, "rhor.txt", false, nPts, nGCs); + //output(rhoR, "rhol.txt", false, nPts, nGCs); + iStep++; + + } + + return 0; +} From 0e23bec51b73cfae8ba0ab52e1a513fd646aefdd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 16 Feb 2024 20:02:43 -0500 Subject: [PATCH 079/691] FEAT: use only variables needed from header --- edu/examples/Advection/advect.cpp | 223 ++++++++++++++++++++++++------ 1 file changed, 184 insertions(+), 39 deletions(-) diff --git a/edu/examples/Advection/advect.cpp b/edu/examples/Advection/advect.cpp index 8fe26261..76fac277 100644 --- a/edu/examples/Advection/advect.cpp +++ b/edu/examples/Advection/advect.cpp @@ -1,7 +1,31 @@ // g++ -I/usr/local/include -I/Users/ridley/Software/Json/json/include main.cpp +// g++ -I/usr/local/include -o advect1d advect.cpp + +/// The armadillo library is to allow the use of 3d cubes and other +/// array types, with array math built in. This eliminates loops! +#include + +/// This is used for timing and the random seed generator: +#include + +// Types +// Precision compile-time aliasing +#ifdef AETHER_USE_PRECISION_DOUBLE +/// Precision type chosen to be `double` through `AETHER_USE_PRECISION_DOUBLE` +using precision_t = double; +#else +/// Precision type compile-time default to float. +using precision_t = float; +#endif + +/// Armadillo type vector (single column) with compile-time precision. +using arma_vec = arma::Col; +/// Armadillo type matrix (two dimension) with compile-time precision. +using arma_mat = arma::Mat; +/// Armadillo type cube (three dimension) with compile-time precision. +using arma_cube = arma::Cube; -#include "../../../include/aether.h" #include // --------------------------------------------------------- @@ -17,10 +41,40 @@ arma_vec init_grid(int64_t nPts, int64_t nGCs) { for (int64_t i = -nGCs; i < nPts + nGCs; i++) { x(i + nGCs) = i * dx; } + precision_t maxX = x(nPts + nGCs - 1); + x = 100.0 * x / maxX; return x; } +// --------------------------------------------------------- +// grid stretched creation +// --------------------------------------------------------- + +arma_vec init_stretched_grid(int64_t nPts, int64_t nGCs) { + + precision_t dx = 1.0; + arma_vec x(nPts + nGCs * 2); + + precision_t factor = 1.0; + precision_t i2pi = 2.0 * 3.1415927 / (nPts-1); + + x(nGCs) = 0.0; + + for (int64_t i = 1; i < nPts + nGCs; i++) { + x(i + nGCs) = x(i - 1 + nGCs) + dx + factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + for (int64_t i = -1; i >= -nGCs; i--) { + x(i + nGCs) = x(i + 1 + nGCs) - dx - factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + precision_t maxX = x(nPts + nGCs - 1); + x = 100.0 * x / maxX; + + return x; +} + // --------------------------------------------------------- // bin edges // --------------------------------------------------------- @@ -80,6 +134,7 @@ arma_vec init_vel(int64_t nPts) { arma_vec vel(nPts); // all cells positive to right: vel.ones(); + vel = -1.0 * vel; return vel; } @@ -182,6 +237,43 @@ arma_vec calc_grad(arma_vec values, return gradients; } +// --------------------------------------------------------- +// Limiter on values +// projected is assumed to be on the edge between the +// i-1 and i cell (i-1/2) +// limited is returned at edges +// --------------------------------------------------------- + +arma_vec limiter_value(arma_vec projected, + arma_vec values, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec limited = projected; + + precision_t mini, maxi; + + for (int64_t i = iStart + 1; i < iEnd - 1; i++) { + + mini = values(i-1); + if (values(i) < mini) + mini = values(i); + maxi = values(i-1); + if (values(i) > maxi) + maxi = values(i); + + if (limited(i) < mini) + limited(i) = mini; + if (limited(i) > maxi) + limited(i) = maxi; + + } + return limited; +} + // --------------------------------------------------------- // Project gradients + values to the right face, from the left // returned values are on the i - 1/2 edges @@ -209,6 +301,42 @@ arma_vec project_from_left(arma_vec values, return projected; } +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_left_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + projected.zeros(); + + precision_t dxei, dxci, dxcip1, r; + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i + 1) = values(i) + + 0.5 * dxei * (values(i) - values(i - 1)) / dxci + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); + } + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; +} + // --------------------------------------------------------- // Project gradients + values to the left face, from the right @@ -238,40 +366,39 @@ arma_vec project_from_right(arma_vec values, } // --------------------------------------------------------- -// Limiter on values -// projected is assumed to be on the edge between the -// i-1 and i cell (i-1/2) -// limited is returned at edges +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) // --------------------------------------------------------- -arma_vec limiter_value(arma_vec projected, - arma_vec values, - int64_t nPts, - int64_t nGCs) { - - int64_t iStart = 0; - int64_t iEnd = nPts + 2 * nGCs; - - arma_vec limited = projected; +arma_vec project_from_right_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; - precision_t mini, maxi; + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + precision_t dxei, dxci, dxcip1, r; - for (int64_t i = iStart + 1; i < iEnd - 1; i++) { - - mini = values(i-1); - if (values(i) < mini) - mini = values(i); - maxi = values(i-1); - if (values(i) > maxi) - maxi = values(i); + projected.zeros(); - if (limited(i) < mini) - limited(i) = mini; - if (limited(i) > maxi) - limited(i) = maxi; - + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i) = values(i) - + 0.5 * dxei * (values(i + 1) - values(i)) / dxcip1 + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); } - return limited; + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; } // --------------------------------------------------------- @@ -363,19 +490,21 @@ void output(arma_vec values, int main() { - precision_t dt = 0.01; - - int64_t nSteps = 3; - int64_t iStep; - - int64_t nPts = 60; + int64_t nPts = 200; int64_t nGCs = 2; int64_t nPtsTotal = nGCs + nPts + nGCs; arma_vec x = init_grid(nPts, nGCs); + //arma_vec x = init_stretched_grid(nPts, nGCs); arma_vec edges = calc_bin_edges(x); arma_vec widths = calc_bin_widths(edges); + precision_t dt = 0.1 * x(nPts + nGCs - 1) / nPts; + precision_t time = 0.0; + + int64_t nSteps = x(nPts + nGCs - 1) / dt; + int64_t iStep; + arma_vec grad_rho; arma_vec rhoL; arma_vec rhoR; @@ -392,19 +521,29 @@ int main() { exchange(vel, nPts, nGCs); output(rho, "rho.txt", false, nPts, nGCs); + output(x, "x.txt", false, nPts, nGCs); for (iStep = 0; iStep < nSteps; iStep++) { + + std::cout << "iStep = " << iStep << "; time = " << time << "\n"; + time = time + dt; grad_rho = calc_grad(rho, x, nPts, nGCs); // Right side of edge from left - rhoR = project_from_left(rho, grad_rho, +//rhoR = project_from_left(rho, grad_rho, +// x, edges, +// nPts, nGCs); + rhoR = project_from_left_new(rho, x, edges, nPts, nGCs); //rhoR = limiter_value(rhoR, rho, nPts, nGCs); // Left side of edge from left - rhoL = project_from_right(rho, grad_rho, +// rhoL = project_from_right(rho, grad_rho, +// x, edges, +// nPts, nGCs); + rhoL = project_from_right_new(rho, x, edges, nPts, nGCs); //rhoL = limiter_value(rhoL, rho, nPts, nGCs); @@ -413,13 +552,19 @@ int main() { grad_vel = calc_grad(vel, x, nPts, nGCs); // Right side of edge from left - velR = project_from_left(vel, grad_vel, +// velR = project_from_left(vel, grad_vel, +// x, edges, +// nPts, nGCs); + velR = project_from_left_new(vel, x, edges, nPts, nGCs); //velR = limiter_value(velR, vel, nPts, nGCs); // Left side of edge from left - velL = project_from_right(vel, grad_vel, +// velL = project_from_right(vel, grad_vel, +// x, edges, +// nPts, nGCs); + velL = project_from_right_new(vel, x, edges, nPts, nGCs); //velL = limiter_value(velL, vel, nPts, nGCs); From 8c883062bf2e0d76f6c13e02ba6e0b10e6c62063 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 16 Feb 2024 20:03:15 -0500 Subject: [PATCH 080/691] FEAT: stretched grid --- edu/examples/Advection/euler.cpp | 159 ++++++++++++++++++++++++++++--- 1 file changed, 145 insertions(+), 14 deletions(-) diff --git a/edu/examples/Advection/euler.cpp b/edu/examples/Advection/euler.cpp index 5a2ad1e4..d3a7f652 100644 --- a/edu/examples/Advection/euler.cpp +++ b/edu/examples/Advection/euler.cpp @@ -1,9 +1,60 @@ -// g++ -I/usr/local/include -I/Users/ridley/Software/Json/json/include main.cpp +// g++ -o euler1d.exe -I/usr/local/include euler.cpp + +/// The armadillo library is to allow the use of 3d cubes and other +/// array types, with array math built in. This eliminates loops! +#include + +/// This is used for timing and the random seed generator: +#include + +// Types +// Precision compile-time aliasing +#ifdef AETHER_USE_PRECISION_DOUBLE +/// Precision type chosen to be `double` through `AETHER_USE_PRECISION_DOUBLE` +using precision_t = double; +#else +/// Precision type compile-time default to float. +using precision_t = float; +#endif + +/// Armadillo type vector (single column) with compile-time precision. +using arma_vec = arma::Col; +/// Armadillo type matrix (two dimension) with compile-time precision. +using arma_mat = arma::Mat; +/// Armadillo type cube (three dimension) with compile-time precision. +using arma_cube = arma::Cube; -#include "../../../include/aether.h" #include +// --------------------------------------------------------- +// grid stretched creation +// --------------------------------------------------------- + +arma_vec init_stretched_grid(int64_t nPts, int64_t nGCs) { + + precision_t dx = 1.0; + arma_vec x(nPts + nGCs * 2); + + precision_t factor = 1.0; + precision_t i2pi = 2.0 * 3.1415927 / (nPts-1); + + x(nGCs) = 0.0; + + for (int64_t i = 1; i < nPts + nGCs; i++) { + x(i + nGCs) = x(i - 1 + nGCs) + dx + factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + for (int64_t i = -1; i >= -nGCs; i--) { + x(i + nGCs) = x(i + 1 + nGCs) - dx - factor * (1 + cos(i * i2pi)); + std::cout << "i : " << i << " " << cos(i * i2pi) << "\n"; + } + precision_t maxX = x(nPts + nGCs - 1); + x = 100.0 * x / maxX; + + return x; +} + // --------------------------------------------------------- // grid creation // --------------------------------------------------------- @@ -17,6 +68,7 @@ arma_vec init_grid(int64_t nPts, int64_t nGCs) { for (int64_t i = -nGCs; i < nPts + nGCs; i++) { x(i + nGCs) = i * dx; } + x = x * 100.0; return x; } @@ -63,7 +115,7 @@ arma_vec init_rho(int64_t nPts) { arma_vec rho(nPts); for (int64_t i = 0; i < nPts; i++) { - if (i > (1 * nPts)/4 && i < 3 * nPts / 4) + if (i > nPts/2 - 3 && i < nPts / 2 + 3) rho(i) = 2.2; else rho(i) = 2.0; @@ -285,6 +337,79 @@ arma_vec limiter_value(arma_vec projected, return limited; } + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_left_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + projected.zeros(); + + precision_t dxei, dxci, dxcip1, r; + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i + 1) = values(i) + + 0.5 * dxei * (values(i) - values(i - 1)) / dxci + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); + } + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; +} + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_vec project_from_right_new(arma_vec values, + arma_vec x_centers, + arma_vec x_edges, + int64_t nPts, + int64_t nGCs) { + int64_t iStart = 1; + int64_t iEnd = nPts + 2 * nGCs - 1; + + // Define at edges: + arma_vec projected(nPts + 2 * nGCs + 1); + precision_t dxei, dxci, dxcip1, r; + + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t i = iStart; i < iEnd; i++) { + dxei = x_edges(i + 1) - x_edges(i); + dxci = x_centers(i) - x_centers(i - 1); + dxcip1 = x_centers(i + 1) - x_centers(i); + r = dxcip1 / dxci; + projected(i) = values(i) - + 0.5 * dxei * (values(i + 1) - values(i)) / dxcip1 + + 0.125 * dxei * dxei * (values(i + 1) + r * values(i - 1) - (1 + r) * values(i)) / (dxci * dxcip1); + } + + projected = limiter_value(projected, values, nPts, nGCs); + + return projected; +} + // --------------------------------------------------------- // gudonov upwind scheme // --------------------------------------------------------- @@ -374,20 +499,24 @@ void output(arma_vec values, int main() { - precision_t dt = 0.0005; + precision_t time = 0.0; + precision_t gamma = 5.0/3.0; - int64_t nSteps = 100; int64_t iStep; - int64_t nPts = 60; + int64_t nPts = 100; int64_t nGCs = 2; int64_t nPtsTotal = nGCs + nPts + nGCs; - arma_vec x = init_grid(nPts, nGCs); + //arma_vec x = init_grid(nPts, nGCs); + arma_vec x = init_stretched_grid(nPts, nGCs); arma_vec edges = calc_bin_edges(x); arma_vec widths = calc_bin_widths(edges); + precision_t dt = 0.01 * x(nPts + nGCs - 1) / nPts; + int64_t nSteps = 10.0 / dt; + // state variables: arma_vec rho = init_rho(nPtsTotal); arma_vec grad_rho; @@ -424,10 +553,12 @@ int main() { output(rho, "rho.txt", false, nPts, nGCs); output(vel, "vel.txt", false, nPts, nGCs); output(temp, "temp.txt", false, nPts, nGCs); + output(x, "x.txt", false, nPts, nGCs); for (iStep = 0; iStep < nSteps; iStep++) { - std::cout << "step : " << iStep << "\n"; + std::cout << "iStep = " << iStep << "; time = " << time << "\n"; + time = time + dt; // ----------------------------------- // Rho @@ -435,12 +566,12 @@ int main() { grad_rho = calc_grad(rho, x, nPts, nGCs); // Right side of edge from left - rhoR = project_from_left(rho, grad_rho, + rhoR = project_from_left_new(rho, x, edges, nPts, nGCs); // Left side of edge from left - rhoL = project_from_right(rho, grad_rho, + rhoL = project_from_right_new(rho, x, edges, nPts, nGCs); @@ -449,11 +580,11 @@ int main() { grad_vel = calc_grad(vel, x, nPts, nGCs); // Right side of edge from left - velR = project_from_left(vel, grad_vel, + velR = project_from_left_new(vel, x, edges, nPts, nGCs); // Left side of edge from left - velL = project_from_right(vel, grad_vel, + velL = project_from_right_new(vel, x, edges, nPts, nGCs); @@ -462,11 +593,11 @@ int main() { grad_temp = calc_grad(temp, x, nPts, nGCs); // Right side of edge from left - tempR = project_from_left(temp, grad_temp, + tempR = project_from_left_new(temp, x, edges, nPts, nGCs); // Left side of edge from left - tempL = project_from_right(temp, grad_temp, + tempL = project_from_right_new(temp, x, edges, nPts, nGCs); From ada2f9325ff8651fb1cbbdd51fcdc8f3ff7c963d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 16 Feb 2024 20:03:49 -0500 Subject: [PATCH 081/691] FEAT: mods for plotting --- edu/examples/Advection/plot.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/edu/examples/Advection/plot.py b/edu/examples/Advection/plot.py index 3dc8e6d9..a922e766 100755 --- a/edu/examples/Advection/plot.py +++ b/edu/examples/Advection/plot.py @@ -33,8 +33,11 @@ def read_file(file): return values -def plot_data(values, fileout): +def plot_data(values, fileout, x = []): + if (len(x) == 0): + nPts = len(values[0]) + x = np.arange(0, nPts) fig = plt.figure(figsize = (10,10)) ax = fig.add_subplot(111) n = len(values)-1 @@ -42,12 +45,13 @@ def plot_data(values, fileout): nSkip = int(n / 10) else: nSkip = 1 + if (n == 0): + n = 1 for i, v in enumerate(values): per = 0.1 + 0.9 * float(i) / float(n) if (i % nSkip == 0): - ax.plot(v, alpha = per) - - ax.plot(values[-1]) + print('Plotting... ', i, values[i][10]) + ax.plot(x, values[i]) fig.savefig(fileout) plt.close() @@ -61,6 +65,7 @@ def plot_data(values, fileout): fileout = fileout[0] values = read_file(filein) - -plot_data(values, fileout) +x = read_file('x.txt') +x = x[0] +plot_data(values, fileout, x = x) From f2091ffc5779c5452b6b552372550f80a99e0356 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 20 Apr 2024 13:37:55 -0400 Subject: [PATCH 082/691] BUG: ignore partial lines --- srcPython/plot_logfiles.py | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/srcPython/plot_logfiles.py b/srcPython/plot_logfiles.py index 5483b90a..82eb40be 100755 --- a/srcPython/plot_logfiles.py +++ b/srcPython/plot_logfiles.py @@ -64,21 +64,23 @@ def read_ssv_file(file): while (iLine < iEnd): aline = lines[iLine].split(' ') - year = int(aline[0]) - month = int(aline[1]) - day = int(aline[2]) - hour = int(aline[3]) - minute = int(aline[4]) - second = int(aline[5]) - if (iOff == 6): - milli = 0 - else: - milli = int(aline[6]) - t = dt.datetime(year, month, day, hour, minute, second, milli) + if ((len(aline) - iOff) == nVars): + + year = int(aline[0]) + month = int(aline[1]) + day = int(aline[2]) + hour = int(aline[3]) + minute = int(aline[4]) + second = int(aline[5]) + if (iOff == 6): + milli = 0 + else: + milli = int(aline[6]) + t = dt.datetime(year, month, day, hour, minute, second, milli) - data["times"].append(t) - for iVar in range(nVars): - allValues[iVar, iLine - iStart] = float(aline[iOff + iVar]) + data["times"].append(t) + for iVar in range(nVars): + allValues[iVar, iLine - iStart] = float(aline[iOff + iVar]) iLine += 1 data['values'] = allValues @@ -317,6 +319,7 @@ def assign_file_to_color(file): print("Reading file : ",file) #data = read_timeline_file(file) data = read_ssv_file(file) + nT = len(data["times"])-1 for iVar in args.vars: label = data["vars"][iVar] color = 'black' @@ -326,7 +329,7 @@ def assign_file_to_color(file): if (nVars > 1): color,line,label = assign_var_to_color(data['vars'][iVar]) - ax.plot(data["times"], data["values"][iVar], label = label, + ax.plot(data["times"][:nT], data["values"][iVar,:nT], label = label, color = color, linestyle = line, linewidth = 2.0) iVar = args.vars[0] From e032527daf8eb65c6ebef14c55bafc798ed6c02e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:08:03 -0400 Subject: [PATCH 083/691] FEAT: 1-sided 3rd order gradient --- include/grid.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/grid.h b/include/grid.h index fcee805e..e59a4c3c 100644 --- a/include/grid.h +++ b/include/grid.h @@ -114,6 +114,14 @@ class Grid { arma_cube MeshCoefp1; arma_cube MeshCoefp2; + // This is for a one-sided 3rd order gradient for the bottom boundary: + + arma_cube MeshCoef1s3rdp1; + arma_cube MeshCoef1s3rdp2; + arma_cube MeshCoef1s3rdp3; + arma_cube MeshCoef1s3rdp4; + arma_cube MeshCoef1s3rdp5; + arma_cube dlon_center_scgc; arma_cube dlon_center_dist_scgc; From 625777789e7dd7c83cec84743ef12f2e75d711e1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:08:25 -0400 Subject: [PATCH 084/691] FEAT: 1-sided 3rd order gradient --- src/grid.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index 14fce6ba..b20953b2 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -113,6 +113,12 @@ Grid::Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in) { dalt_ratio_scgc.set_size(nX, nY, nZ); dalt_ratio_sq_scgc.set_size(nX, nY, nZ); + MeshCoef1s3rdp1.set_size(nX, nY, nGCs); + MeshCoef1s3rdp2.set_size(nX, nY, nGCs); + MeshCoef1s3rdp3.set_size(nX, nY, nGCs); + MeshCoef1s3rdp4.set_size(nX, nY, nGCs); + MeshCoef1s3rdp5.set_size(nX, nY, nGCs); + dlat_center_scgc.set_size(nX, nY, nZ); dlat_center_dist_scgc.set_size(nX, nY, nZ); From 5f23211ff8cc5fa69193373ae94e2a283e651caa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:08:56 -0400 Subject: [PATCH 085/691] FEAT: BCs for the ions --- include/ions.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/ions.h b/include/ions.h index bd8dd1ff..38138764 100644 --- a/include/ions.h +++ b/include/ions.h @@ -107,9 +107,9 @@ class Ions { void fill_electrons(); void calc_sound_speed(); void calc_cMax(); - void set_bcs(Grid grid); - void set_upper_bcs(Grid grid); - void set_lower_bcs(Grid grid); + bool set_bcs(Grid grid, Times time, Indices indices); + bool set_upper_bcs(Grid grid); + bool set_lower_bcs(Grid grid, Times time, Indices indices); int get_species_id(std::string name); void calc_efield(Grid grid); From 2653e15ec73c56af621b1059c03ab1b0a90c3f99 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:09:45 -0400 Subject: [PATCH 086/691] FEAT: improve ion BCs --- src/ions_bcs.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index bc423412..aae7cc73 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -77,10 +77,11 @@ bool Ions::set_upper_bcs(Grid grid) { species[iSpecies].temperature_scgc.slice(iAlt - 1); aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + - electon_temperature_scgc.slice(iAlt)); + electron_temperature_scgc.slice(iAlt)); // Calculate scale height for the species: - h = cKB * species[iSpecies].temperature_scgc.slice(iAlt) / - (species[iSpecies].mass % abs(grid.gravity_vcgc[2])); + h = cKB / species[iSpecies].mass * + species[iSpecies].temperature_scgc.slice(iAlt) / + abs(grid.gravity_vcgc[2].slice(iAlt)); // Assume each species falls of with (modified) hydrostatic: species[iSpecies].density_scgc.slice(iAlt) = species[iSpecies].density_scgc.slice(iAlt - 1) % @@ -96,7 +97,7 @@ bool Ions::set_upper_bcs(Grid grid) { // set lower boundary conditions for the ions //---------------------------------------------------------------------- -bool Ions::set_lower_bcs(Grid grid) { +bool Ions::set_lower_bcs(Grid grid, Times time, Indices indices) { std::string function = "Ions::set_lower_bcs"; static int iFunction = -1; From 0c3bc18987dad0ed6c36272911149421286aabc1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:10:25 -0400 Subject: [PATCH 087/691] FEAT: separate friction and heat exchange --- include/neutrals.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/neutrals.h b/include/neutrals.h index 664e9714..e99f7b3d 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -207,7 +207,10 @@ class Neutrals { arma_cube heating_chemical_scgc; // Bulk neutral collisional heating with ions (K/s) - arma_cube heating_ion_collisions_scgc; + arma_cube heating_ion_friction_scgc; + + // Bulk neutral collisional heating with ions (K/s) + arma_cube heating_ion_heat_transfer_scgc; // Total heating sources arma_cube heating_sources_total; From a4ebdbe8cfc5809a221b1b9c6dc69016169bb946 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:10:48 -0400 Subject: [PATCH 088/691] FEAT: separate friction and heat exchange --- src/neutrals.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 4e838644..fa722a97 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -140,8 +140,10 @@ Neutrals::Neutrals(Grid grid, heating_chemical_scgc.zeros(); heating_sources_total.set_size(nLons, nLats, nAlts); heating_sources_total.zeros(); - heating_ion_collisions_scgc.set_size(nLons, nLats, nAlts); - heating_ion_collisions_scgc.zeros(); + heating_ion_friction_scgc.set_size(nLons, nLats, nAlts); + heating_ion_friction_scgc.zeros(); + heating_ion_heat_transfer_scgc.set_size(nLons, nLats, nAlts); + heating_ion_heat_transfer_scgc.zeros(); O_cool_scgc.set_size(nLons, nLats, nAlts); O_cool_scgc.zeros(); NO_cool_scgc.set_size(nLons, nLats, nAlts); From b8e9d80cf931f6b2dadd54e227634f5461d027f2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:11:46 -0400 Subject: [PATCH 089/691] FEAT: 1-sided gradient calculation --- include/solvers.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/solvers.h b/include/solvers.h index 48515deb..35b8a64b 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -88,6 +88,7 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid); std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid); std::vector calc_gradient_cubesphere(arma_cube value, Grid grid); arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid); +arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt); // interpolation in 1D precision_t linear_interpolation(const precision_t y0, From 6694528b90ab80e64b383820e780ffc537d92967 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:12:18 -0400 Subject: [PATCH 090/691] FEAT: 1-sided gradient calculation --- src/solver_gradients.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index f2bf0cc9..4eade015 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -159,6 +159,33 @@ arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid) { return gradient; } + +// -------------------------------------------------------------------------- +// Calculate the 3rd order (on-sided) gradient in the altitudinal direction +// - this is only defined for the bottom ghostcells! +// -------------------------------------------------------------------------- + +arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { + + int64_t nLons = grid.get_nLons(); + int64_t nLats = grid.get_nLats(); + + arma_mat gradient(nLons, nLats), valueOut(nLons, nLats); + /* + gradient = + grid.MeshCoef1s3rdp1.slice(iAlt) % value.slice(iAlt + 1) + + grid.MeshCoef1s3rdp2.slice(iAlt) % value.slice(iAlt + 2) + + grid.MeshCoef1s3rdp3.slice(iAlt) % value.slice(iAlt + 3) + + grid.MeshCoef1s3rdp4.slice(iAlt) % value.slice(iAlt + 4) + + grid.MeshCoef1s3rdp5.slice(iAlt) % value.slice(iAlt + 5); + */ + gradient = (value.slice(iAlt + 2) - value.slice(iAlt + 1)) / + grid.dalt_lower_scgc.slice(iAlt + 2); + + valueOut = value.slice(iAlt + 1) - gradient % grid.dalt_lower_scgc.slice(iAlt + 1); + return valueOut; +} + // -------------------------------------------------------------------------- // Calculate the gradient in cubesphere spatial discretization // -------------------------------------------------------------------------- From 66f315da23805f86a12c518670de9e9c73abfc2a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:12:40 -0400 Subject: [PATCH 091/691] FEAT: separate friction and heat exchange --- src/add_sources.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index dbae9f33..a527a2fd 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -20,7 +20,8 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { heating_sources_total = heating_euv_scgc + heating_chemical_scgc - + heating_ion_collisions_scgc + + heating_ion_friction_scgc + //+ heating_ion_heat_transfer_scgc - O_cool_scgc - NO_cool_scgc; From 5a22402825b650f05310690f3c92140e1ca96b26 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:13:24 -0400 Subject: [PATCH 092/691] BUG: getting to work --- src/advance.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 6e8b0e21..2770df42 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -47,7 +47,7 @@ bool advance(Planets &planet, neutrals.calc_bulk_velocity(); neutrals.calc_kappa_eddy(); neutrals.calc_viscosity(); - neutrals.calc_cMax(); + //neutrals.calc_cMax(); ions.fill_electrons(); ions.calc_sound_speed(); @@ -70,9 +70,12 @@ bool advance(Planets &planet, if (didWork) didWork = ions.set_bcs(gGrid, time, indices); - + + if (input.get_nAltsGeo() > 1) + neutrals.advect_vertical(gGrid, time); + neutrals.exchange_old(gGrid); - advect(gGrid, time, neutrals); + //advect(gGrid, time, neutrals); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); @@ -121,9 +124,6 @@ bool advance(Planets &planet, ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); - if (input.get_nAltsGeo() > 1) - neutrals.advect_vertical(gGrid, time); - if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Advection"); From cd7ca482dbbb441521a536cf9f66e0072a44ebef Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 30 May 2024 17:18:03 -0400 Subject: [PATCH 093/691] BUG: ionization doesn't have iwave index --- src/calc_euv.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/calc_euv.cpp b/src/calc_euv.cpp index 09be872e..be2d4d8e 100644 --- a/src/calc_euv.cpp +++ b/src/calc_euv.cpp @@ -110,7 +110,6 @@ void calc_ionization_heating(Euv euv, neutrals.species[iSpecies].chapman_scgc.slice(iAlt); } } - intensity2d = euv.wavelengths_intensity_top[iWave] * exp(-1.0 * tau2d); for (iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) { @@ -146,7 +145,8 @@ void calc_ionization_heating(Euv euv, if (neutrals.species[iSpecies].iEuvIonSpecies_[iPei] == neutrals.species[iSpecies].iEuvIonSpecies_[iIonization]) { j_ = neutrals.species[iSpecies].iEuvIonId_[iPei]; - ionization2d[iWave] *= (1 + euv.waveinfo[j_].values[iWave]); + ionization2d *= (1 + euv.waveinfo[j_].values[iWave]); + std::cout << "here in the ipei loop\n"; } } @@ -156,6 +156,7 @@ void calc_ionization_heating(Euv euv, iIon = neutrals.species[iSpecies].iEuvIonSpecies_[iIonization]; ions.species[iIon].ionization_scgc.slice(iAlt) = ions.species[iIon].ionization_scgc.slice(iAlt) + ionization2d; + } // iIonization } // iSpecies } // iWave From fe1b68c90113c9ebb632d66c33c5e2f0f7e11be0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:39:49 -0400 Subject: [PATCH 094/691] TESTING: GITM ignores bulk scale height --- src/calc_neutral_derived.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 8d24c414..404eb087 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -232,10 +232,13 @@ void Neutrals::calc_scale_height(Grid grid) { (species[iSpecies].mass * abs(grid.gravity_vcgc[2])); } + iSpecies = 3; + std::cout << "scale_height : " << species[iSpecies].scale_height_scgc(10,10,2) << "\n"; + // If we have eddy diffusion, the scale-heights need to be adjusted, // since all of the scale heights should be the same in the region // where eddy diffusion is dominant. - +/* if (input.get_use_eddy_momentum()) { // We need the mean major mass in the bottom-most cell, which we // assume is the region where the atmosphere is well-mixed: @@ -275,7 +278,7 @@ void Neutrals::calc_scale_height(Grid grid) { percentage % bulkH; } } - +*/ return; } @@ -374,7 +377,7 @@ void Neutrals::calc_cMax() { report.exit(function); return; } - +/* // ---------------------------------------------------------------------- // Calculate dt primarily for the spherical grid // ---------------------------------------------------------------------- @@ -489,6 +492,7 @@ precision_t Neutrals::calc_dt_cubesphere(Grid grid) { report.exit(function); return dt; } +*/ //---------------------------------------------------------------------- // Calculate the altitude integral of the different species for EUV From 2ae5d5a5a38a8cf9d9f0effb0149618f87ce9102 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:40:33 -0400 Subject: [PATCH 095/691] FEAT: 1-sided 3rd order gradient --- src/fill_grid.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index a0f43fc7..00b39539 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -357,6 +357,34 @@ void Grid::calc_alt_grid_spacing() { // Need the square of the ratio: dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; + + // Calculate the one-sided 3rd order gradient coefficients for the lower BC: + + arma_mat h1, h2, h3, h4, MeshH1, MeshH2, MeshH3, MeshH4; + + for (iAlt = 0; iAlt < nGCs; iAlt++) { + h1 = dalt_lower_scgc.slice(iAlt + 2); + h2 = dalt_lower_scgc.slice(iAlt + 3); + h3 = dalt_lower_scgc.slice(iAlt + 4); + h4 = dalt_lower_scgc.slice(iAlt + 5); + MeshH1 = h1; + MeshH2 = h1 + h2; + MeshH3 = h1 + h2 + h3; + MeshH4 = h1 + h2 + h3 + h4; + MeshCoef1s3rdp1.slice(iAlt) = + -1.0*( MeshH2*MeshH3*MeshH4 + MeshH1*MeshH3*MeshH4 + + MeshH1*MeshH2*MeshH4 + MeshH1*MeshH2*MeshH3)/ + (MeshH1*MeshH2*MeshH3*MeshH4); + MeshCoef1s3rdp2.slice(iAlt) = + 1.0*( MeshH2*MeshH3*MeshH4)/(h1*h2*(h2 + h3)*(h2 + h3 + h4)); + MeshCoef1s3rdp3.slice(iAlt) = + -1.0*( MeshH1*MeshH3*MeshH4)/(MeshH2*h2*h3*(h3+h4)); + MeshCoef1s3rdp4.slice(iAlt) = + 1.0*( MeshH1*MeshH2*MeshH4)/(MeshH3*(h3+h2)*h3*h4); + MeshCoef1s3rdp5.slice(iAlt) = + -1.0*( MeshH1*MeshH2*MeshH3)/(MeshH4*(h2+h3+h4)*(h3+h4)*h4); + } + } // --------------------------------------- From 1e6e22c8da29ee7bde93e3fe54ec815733e1657c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:41:23 -0400 Subject: [PATCH 096/691] FEAT: separate friction and heat transfer --- src/neutral_ion_collisions.cpp | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index fb98dc98..0b8e4e07 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -35,6 +35,9 @@ void calc_ion_collisions(Neutrals &neutrals, // If we are using the bulk (horizontal, primarily) neutral winds // then approximate some of the collisional quantities + neutrals.heating_ion_friction_scgc.zeros(); + neutrals.heating_ion_heat_transfer_scgc.zeros(); + if (input.get_advection_neutrals_bulkwinds()) { for (iIon = 0; iIon < ions.nSpeciesAdvect; iIon++) { iIon_ = ions.species_to_advect[iIon]; @@ -49,7 +52,7 @@ void calc_ion_collisions(Neutrals &neutrals, // Now use the bulk quantities for the collisions // (beta is included in the last step) // heat transfer between ions and neutrals: - energy = 3 * cKB / ions.mean_major_mass_scgc % + neutrals.heating_ion_heat_transfer_scgc = 3 * cKB / ions.mean_major_mass_scgc % (ions.temperature_scgc - neutrals.temperature_scgc); for (iDir = 0; iDir < 3; iDir++) { // need the velocity difference for momentum and energy eqns: @@ -58,12 +61,14 @@ void calc_ion_collisions(Neutrals &neutrals, neutrals.acc_ion_collisions[iDir] = beta / neutrals.rho_scgc % vDiff; // Frictional heating between ions and neutrals: - energy = energy + vDiff % vDiff; + neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc + vDiff % vDiff; } // multiply by collision frequencies and convert // energy change to temperature change: - neutrals.heating_ion_collisions_scgc = - beta % energy / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_friction_scgc = + beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc = + beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); } else { energy.zeros(); @@ -87,27 +92,36 @@ void calc_ion_collisions(Neutrals &neutrals, // Momentum = sum(B * (Vi - Vn)) // Energy = sum_neutrals(sum__ions(B/(Mi + Mn) * (Ti - Tn) + Mi * (Vi-Vn)^2)) - energy = energy + 3 * cKB * one_over_masses * + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc + + 3 * cKB * one_over_masses * (ions.temperature_scgc - neutrals.temperature_scgc); for (iDir = 0; iDir < 3; iDir++) { vDiff = (advected_ion.par_velocity_vcgc[iDir] + advected_ion.perp_velocity_vcgc[iDir] - advected_neutral.velocity_vcgc[iDir]); - energy = energy + (advected_ion.mass * one_over_masses) * vDiff % vDiff; + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc + + (advected_ion.mass * one_over_masses) * vDiff % vDiff; momentum[iDir] = momentum[iDir] + beta % vDiff; } // for each ion // - energy = energy % beta; + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc % beta; + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc % beta; } // for each ion // Divide by the mass density to get the acceleration for (iDir = 0; iDir < 3; iDir++) advected_neutral.acc_ion_drag[iDir] = momentum[iDir]/rho_n; } // for each neutral - // Only one heating needed for the neutrals: - neutrals.heating_ion_collisions_scgc = - energy / (neutrals.rho_scgc % neutrals.Cv_scgc); + // Convert from energy into K/s: + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); } // bulk neutral winds report.exit(function); From 85587d8c5c97a5afb08aae5553c2dd5f02af7e71 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:41:57 -0400 Subject: [PATCH 097/691] FEAT: improve lower BCs --- src/neutrals_bcs.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index eb1aa5e5..6cf4a066 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -189,26 +189,43 @@ bool Neutrals::set_lower_bcs(Grid grid, report.print(2, "setting lower bcs to planet"); - // Set the lower boundary condition: + // Set the lower boundary condition in the last ghost cell: for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].density_scgc.slice(0). + species[iSpecies].density_scgc.slice(nGCs - 1). fill(species[iSpecies].lower_bc_density); } - temperature_scgc.slice(0).fill(initial_temperatures[0]); + temperature_scgc.slice(nGCs - 1).fill(initial_temperatures[0]); didWork = true; } // fill the second+ grid cells with the bottom temperature: - for (iAlt = 1; iAlt < nGCs; iAlt++) - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt - 1); - - // fill the second+ grid cells with a hydrostatic solution: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - fill_with_hydrostatic(iSpecies, 1, nGCs, grid); - + for (iAlt = nGCs - 2; iAlt >= 0; iAlt--) + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); + + arma_mat sh_ave; + // fill the lower ghost cells with a hydrostatic solution: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + for (iAlt = nGCs - 2; iAlt >= 0; iAlt--) { + sh_ave = + (species[iSpecies].scale_height_scgc.slice(iAlt) + + species[iSpecies].scale_height_scgc.slice(iAlt + 1))/2; + + species[iSpecies].density_scgc.slice(iAlt) = + temperature_scgc.slice(iAlt + 1) / + temperature_scgc.slice(iAlt) % + species[iSpecies].density_scgc.slice(iAlt + 1) % + exp(grid.dalt_lower_scgc.slice(iAlt) / sh_ave); + } + for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { + //std::cout << "before project : " << iAlt << " " << iSpecies << " " + // << species[iSpecies].velocity_vcgc[2](10,10,2) << "\n"; + species[iSpecies].velocity_vcgc[2].slice(iAlt) = + project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); + } + } // Force vertical velocities to be zero in the ghost cells: - for (iDir = 0; iDir < 3; iDir++) { + for (iDir = 0; iDir < 2; iDir++) { for (iAlt = 0; iAlt < nGCs; iAlt++) { for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { // species velocity: @@ -216,10 +233,12 @@ bool Neutrals::set_lower_bcs(Grid grid, } // bulk velocity: - velocity_vcgc[iDir].slice(iAlt).zeros(); + //velocity_vcgc[iDir].slice(iAlt).zeros(); } } + calc_bulk_velocity(); + if (!didWork) { report.error("issue with lower BCs!"); report.error("maybe check boundaryconditions type : " + bcsType); From 9141b6436ece10bc28855f893a4fb4ba4dbf6df0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:43:04 -0400 Subject: [PATCH 098/691] TESTING: include sources in conduction or not --- src/neutrals_energy.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index da6f0bf6..ce63849c 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -57,9 +57,8 @@ void Neutrals::update_temperature(Grid grid, Times time) { rhocvr21d = rhocvr23d.tube(iLon, iLat); sources1d = heating_sources_total.tube(iLon, iLat); - temp1d = temp1d + dt * sources1d; - sources1d.zeros(); - + //temp1d = temp1d + dt * sources1d; + //sources1d.zeros(); dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); conduction1d.zeros(); From 9101ed1c12b4533ce9bf19647a9ffaed36da5e9c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:44:21 -0400 Subject: [PATCH 099/691] FEAT: improve lower BCs --- src/neutrals_ics.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 02fb258f..6a5be4de 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -31,6 +31,7 @@ bool Neutrals::initial_conditions(Grid grid, int64_t iLon, iLat, iAlt, iA; precision_t alt, r; int64_t nAlts = grid.get_nZ(); + int64_t nGCs = grid.get_nGCs(); report.print(3, "Creating Neutrals initial_condition"); @@ -160,15 +161,13 @@ bool Neutrals::initial_conditions(Grid grid, temperature_scgc.tube(iLon, iLat) = temp1d; } - // Set the lower boundary condition: - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); - } - + // Make the initial condition in the lower ghost cells to be consistent + // with the actual lowwer BC: calc_scale_height(grid); + set_lower_bcs(grid, time, indices); + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) - fill_with_hydrostatic(iSpecies, 1, nAlts, grid); + fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); } // type = planet } From e89e40188e0625c7a376c1d0d2c759b5ca148cd9 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:45:29 -0400 Subject: [PATCH 100/691] TESTING: return acceleration or new velocity --- src/neutrals_momentum_friction.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/neutrals_momentum_friction.cpp b/src/neutrals_momentum_friction.cpp index e92a3f34..f585cdf7 100644 --- a/src/neutrals_momentum_friction.cpp +++ b/src/neutrals_momentum_friction.cpp @@ -66,11 +66,9 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA // Solve system of equations: arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); - /* // put the new values into the velocity cubes: for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) accs(iSpecies) = new_vels(iSpecies) - vels(iSpecies); - */ report.exit(function); return new_vels; } @@ -118,14 +116,14 @@ void Neutrals::calc_neutral_friction() { species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt); } - //acc = neutral_friction_one_cell(iLon, iLat, iAlt, vels); - new_vels = calc_friction_one_cell(iLon, iLat, iAlt, vels); + // = neutral_friction_one_cell(iLon, iLat, iAlt, vels); + acc = calc_friction_one_cell(iLon, iLat, iAlt, vels); for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { iSpecies_ = species_to_advect[iSpecies]; - species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); - //species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = - // acc(iSpecies); + //species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); + species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = + acc(iSpecies); } // iSpeciesAdvect //} // for direction } // for long From 4a9735a6c4b9faa7e1907842ab500487a51d2edd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:46:06 -0400 Subject: [PATCH 101/691] FEAT: separate friction and heat transfer --- src/output.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/output.cpp b/src/output.cpp index d30416b4..cd01604f 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -247,10 +247,14 @@ bool output(const Neutrals &neutrals, "Heating from Chemistry", "K/s", neutrals.heating_chemical_scgc); - AllOutputContainers[iOutput].store_variable("Heating_Collisions", - "Heating from Ion Neutral Collisions", + AllOutputContainers[iOutput].store_variable("Heating_Transfer", + "Heating from Ti- Tn Ion Neutral Collisions", "K/s", - neutrals.heating_ion_collisions_scgc); + neutrals.heating_ion_heat_transfer_scgc); + AllOutputContainers[iOutput].store_variable("Heating_Ion_Friction", + "Heating from Friction Ion Neutral Collisions", + "K/s", + neutrals.heating_ion_friction_scgc); AllOutputContainers[iOutput].store_variable("Conduction", "Conduction", "K/s", @@ -297,9 +301,6 @@ bool output(const Neutrals &neutrals, if (type_output == "bfield") filename = "3DBFI_"; - if (type_output == "moment") - filename = "3DMMT_"; - if (type_output == "gravity") filename = "3DGRA_"; From ce5015b6b80c7ad3367e09f6f00b8513ce57e27b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:46:50 -0400 Subject: [PATCH 102/691] TESTING: trying to get this to work! --- src/solver_vertical_rusanov.cpp | 53 ++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 21 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index b59baf88..cc52871d 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -76,20 +76,6 @@ void calc_facevalues_alts_rusanov(Grid &grid, for (iY = nGCs; iY < nYs - nGCs; iY++) dVarLimited(iX, iY, iZ) = limiter_mc(dVarUp(iX, iY), dVarDown(iX, iY), beta); - - // TEMPORARY!!! - iZ = 18; - ida = 2.0 / grid.dalt_lower_scgc.slice(iZ + 1); - dVarUp = ida % - (factor1 * (inVar.slice(iZ + 1) - inVar.slice(iZ)) - - factor2 * (inVar.slice(iZ + 2) - inVar.slice(iZ - 1))); - - ida = 2.0 / grid.dalt_lower_scgc.slice(iZ); - dVarDown = ida % - (factor1 * (inVar.slice(iZ) - inVar.slice(iZ - 1)) - - factor2 * (inVar.slice(iZ + 1) - inVar.slice(iZ - 2))); - - // End TEMP for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { outLeft.slice(iZ) = @@ -309,7 +295,6 @@ void Neutrals::solver_vertical_rusanov(Grid grid, // calculate vertical momentum due to eddy diffusion: vertical_momentum_eddy(grid); - // ----------------------------------------------------------- // Now calculate new states: precision_t mass; @@ -339,7 +324,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, - species[iSpecies].acc_eddy - acc_coriolis[2] - grid.cent_acc_vcgc[2] - + 0.25 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + + 1.0 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + gradTemp * cKB / mass + abs(grid.gravity_vcgc[2]))) + dt * diffVertVel_s[iSpecies]; @@ -389,8 +374,8 @@ void Neutrals::solver_vertical_rusanov(Grid grid, for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) - species[iSpecies].newVelocity_vcgc[2].clamp(-150,150); - newTemperature_scgc.clamp(10, 1e32); + species[iSpecies].newVelocity_vcgc[2].clamp(-200,200); + newTemperature_scgc.clamp(150, 1e32); for (iX = nGCs; iX < nXs - nGCs; iX++) for (iY = nGCs; iY < nYs - nGCs; iY++) @@ -411,17 +396,43 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } +iX = 2; +iY = 4; // Force the neutrals to move together with friction: + iSpecies = 3; + std::cout << "ver sol, before friction: " + << species[iSpecies].velocity_vcgc[2](iX,iY,1) << " " + << species[iSpecies].velocity_vcgc[2](iX,iY,2) << " " + << species[iSpecies].velocity_vcgc[2](iX,iY,3) << " " + << species[iSpecies].velocity_vcgc[2](iX,iY,4) << "\n"; + + mass = species[iSpecies].mass; + + for (int iAlt = 0; iAlt < 20; iAlt++) { + std::cout << iAlt << " " + << log(species[iSpecies].density_scgc(iX, iY,iAlt)) << " " + << temperature_scgc(iX,iY,iAlt) << " " + << species[iSpecies].velocity_vcgc[2](iX,iY,iAlt) << " " + << temperature_scgc(10,10,iAlt) * gradLogN_s[iSpecies](iX,iY,iAlt) * cKB / mass << " " + << gradTemp(iX,iY,iAlt) * cKB / mass << " " + << abs(grid.gravity_vcgc[2](iX,iY,iAlt)) << "\n"; + } + calc_neutral_friction(); - /* + std::cout << "ver acc, after friction: " + << species[iSpecies].acc_neutral_friction[2](iX,iY,1) << " " + << species[iSpecies].acc_neutral_friction[2](iX,iY,2) << " " + << species[iSpecies].acc_neutral_friction[2](iX,iY,3) << " " + << species[iSpecies].acc_neutral_friction[2](iX,iY,4) << "\n"; + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { if (species[iSpecies].DoAdvect) { species[iSpecies].velocity_vcgc[2] = species[iSpecies].velocity_vcgc[2] + dt * - species[iSpecies].acc_neutral_friction[iDir]; + species[iSpecies].acc_neutral_friction[2]; } } - */ + std::cout << "here\n"; calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); From c615c0f61503d863d34220afe1297320bd983424 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:47:39 -0400 Subject: [PATCH 103/691] BUG: sprintf to snprintf + reduce CFL for tesing --- src/time.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/time.cpp b/src/time.cpp index 385c29ff..80cd187d 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -107,7 +107,7 @@ int Times::check_time_gate(precision_t dt_check) { void Times::calc_dt(precision_t dtNeutral, precision_t dtIon) { dt = end - current; - double cfl = 0.5; + double cfl = 0.1; if (cfl * dtNeutral < dt) dt = cfl * dtNeutral; @@ -230,15 +230,15 @@ void Times::increment_time() { milli = iCurrent[6]; char tmp[100]; - sprintf(tmp, "%04d%02d%02d_%02d%02d%02d", + snprintf(tmp, 100, "%04d%02d%02d_%02d%02d%02d", year, month, day, hour, minute, second); sYMD_HMS = std::string(tmp); - sprintf(tmp, "%04d%02d%02d_%02d%02d%02d", + snprintf(tmp, 100, "%04d%02d%02d_%02d%02d%02d", year, month, day, hour, minute, 0); sYMD_HM0 = std::string(tmp); - sprintf(tmp, "%04d%02d%02d", year, month, day); + snprintf(tmp, 100, "%04d%02d%02d", year, month, day); sYMD = std::string(tmp); - sprintf(tmp, "%02d%02d%02d", hour, minute, second); + snprintf(tmp, 100, "%02d%02d%02d", hour, minute, second); sHMS = std::string(tmp); // Calculate Julian Day (day of year): From bd635d52e77e4afa95c4df9fdb011acee31870b5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:48:30 -0400 Subject: [PATCH 104/691] BUG: incorporate electrodynamics file into electrodynamics --- share/run/aether.json | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/share/run/aether.json b/share/run/aether.json index 8a135d53..f0f49f82 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -26,10 +26,9 @@ "Electrodynamics" : { "Potential" : "Weimer05", - "DiffuseAurora" : "fta"}, + "DiffuseAurora" : "fta", + "File" : "UA/inputs/b20110320n_omni.bin"}, - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", - "Outputs" : { "type" : ["states"], "dt" : [900] }, From 98d1f9ad3691e54bfdba1b963067fe7cb5e727bf Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 31 May 2024 09:49:14 -0400 Subject: [PATCH 105/691] BUG: need r to interpret \ now --- srcPython/postAether.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index 0282138e..99f69a06 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -463,11 +463,11 @@ def get_core_file(filename): isEnsemble = False ensembleFile = '' ensembleNumber = -1 - m = re.match('.*([0123]D.*)(_g\d*)(\..*)',filename) + m = re.match(r'.*([0123]D.*)(_g\d*)(\..*)',filename) if m: coreFile = m.group(1) # check if file is a member of an ensemble: - check = re.match('.*([0123]D.*)(_m)(\d*)',coreFile) + check = re.match(r'.*([0123]D.*)(_m)(\d*)',coreFile) if (check): ensembleFile = check.group(1) isEnsemble = True From 3f7154674b04d93803b54edfc99239a25b712aaa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:33:18 -0400 Subject: [PATCH 106/691] FEAT: add dipole grid --- include/bfield.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/bfield.h b/include/bfield.h index df64fac8..91a09ff3 100644 --- a/include/bfield.h +++ b/include/bfield.h @@ -10,6 +10,10 @@ struct bfield_info_type { precision_t lat; }; +precision_t get_lshell(precision_t lat, precision_t rNorm); +arma_vec get_lat_from_r_and_lshell(arma_vec r, precision_t lshell); +precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell); + arma_vec get_magnetic_pole(int IsNorth, Planets planet); From 82bb0407f3b7ed067f12b36f7cbb9a46fa60074a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:33:37 -0400 Subject: [PATCH 107/691] FEAT: add dipole grid --- src/init_mag_grid.cpp | 854 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 854 insertions(+) create mode 100644 src/init_mag_grid.cpp diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp new file mode 100644 index 00000000..8a1bcbf5 --- /dev/null +++ b/src/init_mag_grid.cpp @@ -0,0 +1,854 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include +#include + +#include "../include/aether.h" + +// ---------------------------------------------------------------------- +// Initialize the geographic grid. At the moment, this is a simple +// Lon/Lat/Alt grid. The grid structure is general enough that each +// of the lon, lat, and alt can be a function of the other variables. +// ---------------------------------------------------------------------- + +void Grid::init_mag_grid(Planets planet) { + + std::string function = "Grid::init_mag_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + +// turn the switch on! + set_IsGeoGrid(false); + + // This is just an example: + Inputs::grid_input_struct grid_input = input.get_grid_inputs("MagGrid"); + + int64_t iLon, iLat, iAlt; + + // SHOW(grid_input.dalt); exit(10); + + // Longitudes: + // - Make a 1d vector + // - copy it into the 3d cube + fvec lon1d(nLons); + float dlon = (grid_input.lon_max - grid_input.lon_min) / (nLons-2*nGCs); + + for (iLon=0; iLon < nLons; iLon++) + lon1d[iLon] = grid_input.lon_min + (iLon-nGCs+0.5) * dlon; + + for (iLat=0; iLat < nLats; iLat++) { + for (iAlt=0; iAlt < nAlts; iAlt++) { + + magLon_scgc.subcube(0, iLat, iAlt, nLons-1, iLat, iAlt) = lon1d; + + // AD: does below make sense? + // magPhi_scgc.subcube(0, iLat, iAlt, nLons-1, iLat, iAlt) = lon1d; + + } + } + + + // cout << "from"<< function<< "nLats= "<< nLats<<"\n"< + } + + // SHOW(lshell); + // SHOW(lat1d); exit(10); + + + //< + for (iLon = 0; iLon < nLons; iLon++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) + this->magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + } + //> + + + for (iLon=0; iLon < nLons; iLon++) { + for (iAlt=0; iAlt < nAlts; iAlt++) { + + //magP_scgc.subcube(iLon, 0, iAlt, iLon, nLats-1, iAlt) = lshell; + + for (iLat=0; iLatgeoLon_scgc(iX,iY,iZ) = magPhi_scgc(iX,iY,iZ); + this->geoLat_scgc(iX,iY,iZ) = theta; + this->geoAlt_scgc(iX,iY,iZ) = r; + + this->geoAlt_scgc(iX,iY,iZ) *= radius0; + + + // - grid_input.alt_min ? + + //> + + } + } + } + + + + + + // save 3D mag grid for examination + std::fstream gridfile; + gridfile.open ("grid3D.dat",ios::out); + gridfile.precision(std::numeric_limits::digits10); + + // write header + gridfile << "VARIABLES = \"X\", \"Y\", \"Z\" " << endl; + gridfile << "Zone I = "<< nZ << ",J = " << nY << ",K = "<< nX + <<", DATAPACKING=POINT" << endl; + + // write grid data + for (iX=0; iX Grid::lshell_to_qn_qs(Planets planet, float Lshell, float Lon, float AltMin) { + std::string function = "Grid::lshell_to_qn_qs"; + static int iFunction = -1; + report.enter(function, iFunction); + + float qN,qS; + + float XyzDipoleLeft[3], XyzDipoleMid[3], XyzDipoleRight[3]; + float XyzGeoLeft[3], XyzGeoMid[3], XyzGeoRight[3]; + float rGeoLeft, rGeoMid, rGeoRight; + float LlrDipoleLeft[3], LlrDipoleMid[3], LlrDipoleRight[3]; + float ThetaTilt, PhiTilt; + float Lat, Radius, rMin; + // Named dimension constants + static int Lon_= 0, Lat_= 1, Radius_= 2; + + //bound vars for bisection search + float ThetaRight, ThetaLeft, ThetaMid; + float rDipoleLeft,rDipoleMid,rDipoleRight; + + //Stopping condition for bisection search + float DeltaTheta; + float Tolerance = 1e-4; + + // status vars for bisection search + int iStatusLeft, iStatusRight, iStatusMid; + // note we normalize Lshell by equatorial radius + float RadiusEq = planet.get_radius(0.0); + + + // loop for qN and qS + for(int iQ = 0; iQ < 2; iQ++){ + + if (iQ == 0){ + // set initial left, mid, right bounds for bisection search for qN + ThetaRight = 0.5*cPI; + ThetaLeft = 1.0*cDtoR; + ThetaMid = 0.5*(ThetaRight+ThetaLeft); + }else{ + // set initial left, mid, right bounds for bisection search for qS + ThetaLeft = 0.5*cPI; + ThetaRight = 179.0*cDtoR; + ThetaMid = 0.5*(ThetaRight+ThetaLeft); + } + + // Initial stopping condition stopping condition + DeltaTheta = abs(ThetaLeft-ThetaRight); + + + // start bisection search for qN + while( DeltaTheta > Tolerance ) { + + // find rDipole that cooresponds to these Left,Mid,Right + // ThetaDipole values + rDipoleLeft = Lshell * pow(sin(ThetaLeft),2.0); + rDipoleMid = Lshell * pow(sin(ThetaMid),2.0); + rDipoleRight = Lshell * pow(sin(ThetaRight),2.0); + + // Compute XyzDipole for left, mid,right states + LlrDipoleLeft[Lon_] = Lon; + LlrDipoleLeft[Lat_] = 0.5*cPI-ThetaLeft; + LlrDipoleLeft[Radius_] = rDipoleLeft; + transform_llr_to_xyz(LlrDipoleLeft, XyzDipoleLeft); + + LlrDipoleMid[Lon_] = Lon; + LlrDipoleMid[Lat_] = 0.5*cPI-ThetaMid; + LlrDipoleMid[Radius_] = rDipoleMid; + transform_llr_to_xyz(LlrDipoleMid, XyzDipoleMid); + + LlrDipoleRight[Lon_] = Lon; + LlrDipoleRight[Lat_] = 0.5*cPI-ThetaRight; + LlrDipoleRight[Radius_] = rDipoleRight; + transform_llr_to_xyz(LlrDipoleRight, XyzDipoleRight); + + // Transform to XyzGeo and unnormalize + convert_dipole_geo_xyz(planet, XyzDipoleLeft, XyzGeoLeft); + convert_dipole_geo_xyz(planet, XyzDipoleMid, XyzGeoMid); + convert_dipole_geo_xyz(planet, XyzDipoleRight, XyzGeoRight); + + //cout << "XyzGeoLeft[0]" << XyzGeoLeft[0] << endl; + //cout << "XyzGeoLeft[1]" << XyzGeoLeft[1] << endl; + //cout << "XyzGeoLeft[2]" << XyzGeoLeft[2] << endl; + + XyzGeoLeft[0]=XyzGeoLeft[0]*RadiusEq; + XyzGeoLeft[1]=XyzGeoLeft[1]*RadiusEq; + XyzGeoLeft[2]=XyzGeoLeft[2]*RadiusEq; + + abort; + + XyzGeoMid[0]=XyzGeoMid[0]*RadiusEq; + XyzGeoMid[1]=XyzGeoMid[1]*RadiusEq; + XyzGeoMid[2]=XyzGeoMid[2]*RadiusEq; + + XyzGeoRight[0]=XyzGeoRight[0]*RadiusEq; + XyzGeoRight[1]=XyzGeoRight[1]*RadiusEq; + XyzGeoRight[2]=XyzGeoRight[2]*RadiusEq; + + // Compute radius in geo coordinate for comparison to rmin + rGeoLeft = + sqrt(pow(XyzGeoLeft[0],2)+pow(XyzGeoLeft[1],2)+pow(XyzGeoLeft[2],2)); + rGeoMid = + sqrt(pow(XyzGeoMid[0],2)+pow(XyzGeoMid[1],2)+pow(XyzGeoMid[2],2)); + rGeoRight = + sqrt(pow(XyzGeoRight[0],2)+pow(XyzGeoRight[1],2)+pow(XyzGeoRight[2],2)); + + // get rmin for given latitude. Radius is lat dependent in general. + // also find status in (0) or out (1) of rMin + Lat = 0.5*cPI-acos(XyzGeoLeft[2]/rGeoLeft); + Radius = planet.get_radius(Lat); + rMin = Radius+AltMin; + if (rGeoLeft < rMin){ + iStatusLeft = 0; + }else{ + iStatusLeft = 1; + } + + Lat = 0.5*cPI-acos(XyzGeoMid[2]/rGeoMid); + Radius = planet.get_radius(Lat); + rMin = Radius+AltMin; + if (rGeoMid < rMin){ + iStatusMid = 0; + }else{ + iStatusMid = 1; + } + + Lat = 0.5*cPI-acos(XyzGeoRight[2]/rGeoRight); + Radius = planet.get_radius(Lat); + rMin = Radius+AltMin; + if (rGeoRight < rMin){ + iStatusRight = 0; + }else{ + iStatusRight = 1; + } + + // Use status values to update left, right and mid values of theta + if (iStatusMid == 0) { + if (iStatusRight == 1){ + // Mid becomes left and right stays right + ThetaLeft = ThetaMid; + ThetaMid = 0.5*(ThetaLeft+ThetaRight); + }else{ + // Mid becomes right and left stays left + ThetaRight = ThetaMid; + ThetaMid = 0.5*(ThetaLeft+ThetaRight); + } + }else{ + if (iStatusRight == 0){ + // Mid becomes left and right stays right + ThetaLeft = ThetaMid; + ThetaMid = 0.5*(ThetaLeft+ThetaRight); + }else{ + // Mid becomes right and left stays left + ThetaRight = ThetaMid; + ThetaMid = 0.5*(ThetaLeft+ThetaRight); + } + } + // Update stopping condition + DeltaTheta = abs(ThetaLeft-ThetaRight); + } + + //set the q value + rDipoleMid = Lshell * pow(sin(ThetaMid),2.0); + if (iQ ==0){ + qN = pow(rDipoleMid,-2.0)*cos(ThetaMid); + // cout << "!!! For L = " << Lshell << endl; + // cout << "!!! qN = " << qN << endl; + // cout << "!!! ThetaMid = " << ThetaMid*cRtoD << endl; + }else{ + qS = pow(rDipoleMid,-2.0)*cos(ThetaMid); + // cout << "!!! qS = " << qS << endl; + } + } + + report.exit(function); + return {qN,qS}; + +} + +// ----------------------------------------------------------------------- +// Convert XyzDipole to XyzGeo +// +// ----------------------------------------------------------------------- + +void Grid::convert_dipole_geo_xyz(Planets planet, float XyzDipole[3], float XyzGeo[3]) { + float XyzRemoveShift[3]; + float XyzRemoveTilt[3]; + float XyzRemoveRot[3]; + + // get planetary parameters, use radius at equator for Lshell reference + float magnetic_pole_tilt = planet.get_dipole_tilt(); + float magnetic_pole_rotation = planet.get_dipole_rotation(); + float radius = planet.get_radius(0.0); + + + // get the dipole shift, but normalize it to equatorial radius + float dipole_center[3]; + std::vector temp_dipole_center = planet.get_dipole_center(); + transform_float_vector_to_array(temp_dipole_center, dipole_center); + + dipole_center[0]=dipole_center[0]/radius; + dipole_center[1]=dipole_center[1]/radius; + dipole_center[2]=dipole_center[2]/radius; + + // Remove Tilt + transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); + + // Remove Rot + transform_rot_z(XyzRemoveTilt, magnetic_pole_rotation, XyzRemoveRot); + + // Remove Shift + vector_add(XyzRemoveRot, dipole_center, XyzGeo); + +// cout << "XyzDipole[0]" << XyzDipole[0] << endl; +// cout << "XyzDipole[1]" << XyzDipole[1] << endl; +// cout << "XyzDipole[2]" << XyzDipole[2] << endl; +// +// cout << "XyzGeo[0]" << XyzGeo[0] << endl; +// cout << "XyzGeo[1]" << XyzGeo[1] << endl; +// cout << "XyzGeo[2]" << XyzGeo[2] << endl; + +} + +// ---------------------------------------------------------------------- +// Routine to fill in the q values for a particular L and lon +// using equations 7-8 from Huba et al 2000 +// ---------------------------------------------------------------------- +void Grid::fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lshell, float Lon, double *q) { + std::string function = "Grid::fill_dipole_q_line"; + static int iFunction = -1; + report.enter(function, iFunction); + + double x[nZ]; + double r[nZ]; + double theta[nZ]; + double Dx; + float Llr[3], Xyz[3]; + int DoTestLine = 0; + + //open test file for writing the grid data for plotting + std::fstream gridfile; + if (DoTestLine==1){ + gridfile.open ("grid.dat",ios::out); + } + + // set the Dx (c in equation 8 from Huba et al 2000) + // Note this equation has a typo in it. The proper + // version would be found by defining the bounds of + // x from equation 7, and then dividing that into + // equal segments. + //Dx = 2.0*(1.0-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); + + Dx = (sinh(Gamma*qS)-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); + + //Dx = 2.0/(static_cast(nZ)-1.0); + //Dx = (static_cast(qN)-static_cast(qS))/(static_cast(nZ)-1.0); + + //cout << "Dx = " << Dx << endl; + //cout << "Gamma = " << Gamma << endl; + //cout << "nZ = " << nZ << endl; + //cout << "qN = " << qN << endl; + //cout << "qS = " << qS << endl; + + // set initial x[0] value using eq. 7 from Huba et al with qi=qN + x[0] = sinh(Gamma*qN)/sinh(Gamma*qS); + q[0] = asinh(x[0]*sinh(Gamma*qS))/Gamma; + + // fill x_i=x_(i-1)+Dx + for(int i = 1; i < nZ; i++){ + x[i] = x[i-1]+Dx; + q[i] = asinh(x[i]*sinh(Gamma*qS))/Gamma; + + // For given q and p we can now find cooresponding r and theta in + // dipole coord. Starty by numerically solving for r (normalized) using + // equation 4 of Huba et al 2000 given by q^2r^4+1/p r -1 = 0 + auto rtheta = p_q_to_r_theta(Lshell, q[i]); + + r[i] = rtheta.first; + theta[i] = rtheta.second; + + //cout << "i, q " << i << " " << q[i] << endl; + //cout << "i, x " << i << " " << x[i] << endl; + //cout << "i, r, theta " << i << " " << r[i]<<" "< Grid::p_q_to_r_theta(float p, float q) { + //return quanties + float r, theta; + // function value and derivative for NR method + float Func, dFunc; + // tolerance for root finding + float Tolerance = 0.00001; + + // initial guess for r + r = 100.0; + + Func= pow(q,2.0) * pow(r,4.0) + 1.0/p*r-1; + dFunc= 4.0*pow(q,2.0) * pow(r,3.0) + 1.0/p; + + // cout<< "p,q="< Tolerance) { + try { + Func= pow(q,2.0) * pow(r,4.0) + 1.0/p*r-1; + dFunc= 4.0*pow(q,2.0) * pow(r,3.0) + 1.0/p; + + // in NR method r(i+1)=r(i)-f/f' for each iteration + + r = r - Func/dFunc; + + if (++itr > maxItr){ throw(itr);} + } + catch (int itr){ + cout<<"WARN: exceeded max #iterations.. exiting "; + exit(10); + } + // cout << r << " " << Func << " "<< dFunc << endl; + } + + // now that r is determined we can solve for theta + //theta = asin(sqrt(r/p)); + theta = acos(q*pow(r,2.0)); + + + //cout << "for p,q = " << p <<" "<< q << endl; + //cout << " r = " << r << endl; + //cout << " theta = " << theta << endl; + //cout << endl; + + return {r,theta}; +} + +arma_vec Grid::get_r3_spacing(precision_t lat, precision_t rMin, + precision_t rMax, int64_t nPts, int64_t nGcs) { + + precision_t rMaxReal = rMax; + + precision_t lShell = get_lshell(lat, rMin); + if (lShell < rMaxReal) { + rMaxReal = lShell; + std::cout << "Limiting rMaxReal from " << rMax << " to " << rMaxReal << "\n"; + } + precision_t rMin3 = pow(rMin, 1.0/3.0); + precision_t rMax3 = pow(rMaxReal, 1.0/3.0); + precision_t dr3 = (rMax3 - rMin3) / (nPts-nGcs*2); + arma_vec r(nPts); + for (int64_t iPt = 0; iPt < nPts; iPt++) { + r(iPt) = pow(rMin3 + dr3 * (iPt - nGcs), 3); + } + return r; +} + +// ---------------------------------------------------------------------- +// Initialize the geographic grid. At the moment, this is a simple +// Lon/Lat/Alt grid. The grid structure is general enough that each +// of the lon, lat, and alt can be a function of the other variables. +// ---------------------------------------------------------------------- + +void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { + + std::string function = "Grid::init_dipole_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + +// turn the switch on! + IsGeoGrid = false; + + int64_t iLon, iLat, iAlt; + + // This is just an example: + report.print(3, "Getting mgrid_inputs inputs in dipole grid"); + + Inputs::grid_input_struct grid_input = input.get_grid_inputs("MagGrid"); + + report.print(3, "Setting inputs in dipole grid"); + precision_t min_apex = grid_input.min_apex; + precision_t min_alt = grid_input.alt_min; + precision_t max_alt = grid_input.alt_max; + precision_t planetRadius = planet.get_radius(0.0); + precision_t min_lshell = (min_apex + planetRadius)/planetRadius; + precision_t min_r = (min_alt + planetRadius)/planetRadius; + precision_t max_r = (max_alt + planetRadius)/planetRadius; + precision_t min_lat = get_lat_from_r_and_lshell(min_r, min_lshell); + precision_t stretch = (cPI/2 - min_lat) / (cPI/2); + report.print(3, "Done setting inputs in dipole grid"); + + // Get some coordinates and sizes in normalized coordinates: + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); + precision_t lon0 = lower_left_norm(0) * cPI; + arma_vec lon1d(nLons); + + // Longitudes: + // - Make a 1d vector + // - copy it into the 3d cube + for (iLon = 0; iLon < nLons; iLon++) + lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; + + for (iLat = 0; iLat < nLats; iLat++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) + magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + } + + geoLon_scgc = magLon_scgc; + + precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); + precision_t lat0 = lower_left_norm(1) * cPI; + + arma_vec lat1d(nLats); + + // Latitudes: + // - Make a 1d vector + // - copy it into the 3d cube + for (iLat = 0; iLat < nLats; iLat++) { + lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; + std::cout << "Original : " << lat1d(iLat) << " "; + if (lat1d(iLat) >= 0) { + lat1d(iLat) = min_lat + lat1d(iLat) * stretch; + } else { + lat1d(iLat) = -min_lat + lat1d(iLat) * stretch; + } + std::cout << "Final : " << lat1d(iLat) << "\n"; + + } + for (iLon = 0; iLon < nLons; iLon++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) + magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + } + + arma_vec rNorm1d, lat1dAlong; + arma_cube r3d(nLons, nLats, nAlts); + + precision_t lShell; + + for (iLat = 0; iLat < nLats; iLat++) { + lat0 = lat1d(iLat); + if (lat0 > cPI/2) lat0 = cPI - lat0; + if (lat0 < -cPI/2) lat0 = -cPI - lat0; + lShell = get_lshell(lat0, min_r); + std::cout << "iLat : " << iLat << " " << nLats << "\n"; + std::cout << "lShell : " << lat0 * cRtoD << " " << lShell << "\n"; + std::cout << "min_r : " << min_r << " " << max_r << " " << nAlts << " " << nGCs << "\n"; + rNorm1d = get_r3_spacing(lat0, min_r, max_r, nAlts, nGCs); + lat1dAlong = get_lat_from_r_and_lshell(rNorm1d, lShell); + if (lat0 < 0) + lat1dAlong = -1.0 * lat1dAlong; + for (iLon = 0; iLon < nLons; iLon++) { + r3d.tube(iLon, iLat) = rNorm1d * planetRadius; + magLat_scgc.tube(iLon, iLat) = lat1dAlong; + } + } + + geoLat_scgc = magLat_scgc; + magAlt_scgc = r3d - planetRadius; + + std::vector llr, xyz, xyzRot1, xyzRot2; + llr.push_back(magLon_scgc); + llr.push_back(magLat_scgc); + llr.push_back(r3d); + xyz = transform_llr_to_xyz_3d(llr); + + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + + // Reverse our dipole rotations: + xyzRot1 = rotate_around_y_3d(xyz, magnetic_pole_tilt); + xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); + + // transform back to lon, lat, radius: + llr = transform_xyz_to_llr_3d(xyzRot2); + + geoLon_scgc = llr[0]; + geoLat_scgc = llr[1]; + geoAlt_scgc = llr[2] - planetRadius; + + // Calculate the radius, etc: + fill_grid_radius(planet); + calc_rad_unit(planet); + calc_gravity(planet); + + std::cout << "magLon : " << magLon_scgc(12,10,5) * cRtoD << " " + << magLat_scgc(12,10,5) * cRtoD << " " + << magAlt_scgc(12,10,5) / 1000.0 << "\n"; + + std::cout << "geoLon : " << geoLon_scgc(12,10,5) * cRtoD << " " + << geoLat_scgc(12,10,5) * cRtoD << " " + << geoAlt_scgc(12,10,5) / 1000.0 << "\n"; + + report.exit(function); + return; + +} + From 5e6213ff2ca59efabc64aa72579bd4f2e966c254 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:34:12 -0400 Subject: [PATCH 108/691] BUG: not sure how this compiled before --- include/cubesphere.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/cubesphere.h b/include/cubesphere.h index 0342dd6b..e99036a6 100644 --- a/include/cubesphere.h +++ b/include/cubesphere.h @@ -20,7 +20,7 @@ static const arma_mat ORIGINS = { { 1.0, 1.0, -1.0}, {-1.0, 1.0, -1.0}, {-1.0, -1.0, -1.0}, - { 1.0, -1.0, 1.0}, + { 1.0, -1.0, 1.0} }; /// Normalized right steps in cube From 53242c9ece7125a6115e2a82b61a09d0cfa129c6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:35:24 -0400 Subject: [PATCH 109/691] FEAT: add a base-6 sphere --- include/sphere.h | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/include/sphere.h b/include/sphere.h index e050dbeb..6f2c617c 100644 --- a/include/sphere.h +++ b/include/sphere.h @@ -8,7 +8,7 @@ #include /************************************************* - * \brief A namespace with all quad sphere grid logic. + * \brief A namespace with all (1-root) sphere grid logic. *************************************************/ namespace Sphere { @@ -29,4 +29,43 @@ namespace Sphere { }; +/************************************************* + * \brief A namespace with all (6-root) sphere grid logic. + *************************************************/ +namespace Sphere6 { + +/// The normalized origins of each face of the cube (i.e. corner) +static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + {2.0/3.0, -0.5, 0.0}, + {4.0/3.0, -0.5, 0.0}, + { 0.0, 0.0, 0.0}, + {2.0/3.0, 0.0, 0.0}, + {3.0/3.0, 0.0, 0.0} +}; + +/// Normalized right steps in cube +static const arma_mat RIGHTS = { + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0} +}; + +/// Normalized right steps in cube +static const arma_mat UPS = { + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0} +}; + +} // CubeSphere:: + + + #endif // INCLUDE_SPHERE_H_ From 228e9038776df94cad27db6d7bb73bd229d36222 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:36:22 -0400 Subject: [PATCH 110/691] FEAT: add dipole grid and experimental grid --- include/grid.h | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/include/grid.h b/include/grid.h index 908cdee6..270feb68 100644 --- a/include/grid.h +++ b/include/grid.h @@ -68,6 +68,10 @@ class Grid { arma_cube magAlt_scgc, magZ_scgc; arma_cube magLocalTime_scgc; + arma_cube magPhi_scgc; + arma_cube magP_scgc; + arma_cube magQ_scgc; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; @@ -133,10 +137,12 @@ class Grid { Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in); - int get_IsGeoGrid(); + bool get_IsGeoGrid(); bool get_HasBField(); - void set_IsGeoGrid(int value); - + void set_IsGeoGrid(bool value); + void set_IsExperimental(bool value); + bool get_IsExperimental(); + int64_t get_nPointsInGrid(); int64_t get_nX(); @@ -175,6 +181,16 @@ class Grid { void report_grid_boundaries(); void calc_cent_acc(Planets planet); + // Make mag-field grid: + void init_mag_grid(Planets planet); + std::pair lshell_to_qn_qs(Planets planet, float Lshell, float Lon, float AltMin); + void convert_dipole_geo_xyz(Planets planet, float XyzDipole[3], float XyzGeo[3]); + void fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lshell, float Lon, double *q); + std::pair p_q_to_r_theta(float p, float q); + arma_vec get_r3_spacing(precision_t lat, precision_t rMin, + precision_t rMax, int64_t nPts, int64_t nGcs); + void init_dipole_grid(Quadtree quadtree, Planets planet); + // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); @@ -268,8 +284,9 @@ class Grid { private: - int IsGeoGrid; + bool IsGeoGrid; bool HasBField; + bool IsExperimental; int64_t nX, nLons; int64_t nY, nLats; From 374cf0ab947e08b33ca643be79d3b69d4469b314 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:37:40 -0400 Subject: [PATCH 111/691] FEAT: generalize things for grid --- include/inputs.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 7c1d94fc..906cd75a 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -89,18 +89,22 @@ class Inputs { std::string alt_file; bool IsUniformAlt; precision_t alt_min; + // Only really needed for Mag Field grid, since this could be overconstrained: + precision_t alt_max; precision_t dalt; precision_t lat_min; precision_t lat_max; precision_t lon_min; precision_t lon_max; + // Only needed for Mag Field grid: + precision_t min_apex; }; - grid_input_struct get_grid_inputs(); + grid_input_struct get_grid_inputs(std::string gridtype); - int get_nLonsGeo(); - int get_nLatsGeo(); - int get_nAltsGeo(); + int get_nLons(std::string gridtype); + int get_nLats(std::string gridtype); + int get_nAlts(std::string gridtype); int get_nBlocksLonGeo(); int get_nBlocksLatGeo(); From 442286fdfe88166809378d07c63f43e643dc35d6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:38:26 -0400 Subject: [PATCH 112/691] FEAT: generalize things for grid --- src/inputs.cpp | 73 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index 528da15b..129e310a 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -409,38 +409,50 @@ precision_t Inputs::check_settings_pt(std::string key1, // ----------------------------------------------------------------------- // Return characteristics of the grid that are entered by the user +// gridtype needs to be "GeoGrid" or "MagGrid" // ----------------------------------------------------------------------- -Inputs::grid_input_struct Inputs::get_grid_inputs() { +Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { + + Inputs::grid_input_struct grid_specs; + // First Get Values: - geo_grid_input.alt_file = check_settings_str("GeoGrid", "AltFile"); + grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); - if (check_settings("GeoGrid", "IsUniformAlt")) { - bool reality = get_setting_bool("GeoGrid", "IsUniformAlt"); - geo_grid_input.IsUniformAlt = get_setting_bool("GeoGrid", "IsUniformAlt"); + if (check_settings(gridtype, "IsUniformAlt")) { + bool reality = get_setting_bool(gridtype, "IsUniformAlt"); + grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); } else - geo_grid_input.IsUniformAlt = true; + grid_specs.IsUniformAlt = true; - geo_grid_input.alt_min = check_settings_pt("GeoGrid", "MinAlt"); - geo_grid_input.dalt = check_settings_pt("GeoGrid", "dAlt"); - geo_grid_input.lat_min = check_settings_pt("GeoGrid", "MinLat"); - geo_grid_input.lat_max = check_settings_pt("GeoGrid", "MaxLat"); - geo_grid_input.lon_min = check_settings_pt("GeoGrid", "MinLon"); - geo_grid_input.lon_max = check_settings_pt("GeoGrid", "MaxLon"); + grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); + grid_specs.dalt = check_settings_pt(gridtype, "dAlt"); + grid_specs.lat_min = check_settings_pt(gridtype, "MinLat"); + grid_specs.lat_max = check_settings_pt(gridtype, "MaxLat"); + grid_specs.lon_min = check_settings_pt(gridtype, "MinLon"); + grid_specs.lon_max = check_settings_pt(gridtype, "MaxLon"); // Second Change Units - geo_grid_input.alt_min = geo_grid_input.alt_min * cKMtoM; - geo_grid_input.lat_min = geo_grid_input.lat_min * cDtoR; - geo_grid_input.lat_max = geo_grid_input.lat_max * cDtoR; - geo_grid_input.lon_min = geo_grid_input.lon_min * cDtoR; - geo_grid_input.lon_max = geo_grid_input.lon_max * cDtoR; + grid_specs.alt_min = grid_specs.alt_min * cKMtoM; + grid_specs.lat_min = grid_specs.lat_min * cDtoR; + grid_specs.lat_max = grid_specs.lat_max * cDtoR; + grid_specs.lon_min = grid_specs.lon_min * cDtoR; + grid_specs.lon_max = grid_specs.lon_max * cDtoR; // If the grid is uniform, dalt is in km, else it is in fractions of // scale height: - if (geo_grid_input.IsUniformAlt) - geo_grid_input.dalt = geo_grid_input.dalt * cKMtoM; + if (grid_specs.IsUniformAlt) + grid_specs.dalt = grid_specs.dalt * cKMtoM; + + // These are only needed if the gridtype if magnetic: + if (gridtype == "MagGrid") { + grid_specs.alt_max = check_settings_pt(gridtype, "MaxAlt"); + grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); + grid_specs.alt_max = grid_specs.alt_max * cKMtoM; + grid_specs.min_apex = grid_specs.min_apex * cKMtoM; + } - return geo_grid_input; + return grid_specs; } // ----------------------------------------------------------------------- @@ -850,16 +862,25 @@ int Inputs::get_original_seed() { // Return number of longitudes, latitudes, and altitudes in Geo grid // ----------------------------------------------------------------------- -int Inputs::get_nLonsGeo() { - return check_settings_pt("GeoBlockSize", "nLons"); +int Inputs::get_nLons(std::string gridtype) { + if (gridtype == "GeoGrid") + return check_settings_pt("GeoBlockSize", "nLons"); + else + return check_settings_pt("MagBlockSize", "nLons"); } -int Inputs::get_nLatsGeo() { - return check_settings_pt("GeoBlockSize", "nLats"); +int Inputs::get_nLats(std::string gridtype) { + if (gridtype == "GeoGrid") + return check_settings_pt("GeoBlockSize", "nLats"); + else + return check_settings_pt("MagBlockSize", "nLats"); } -int Inputs::get_nAltsGeo() { - return check_settings_pt("GeoBlockSize", "nAlts"); +int Inputs::get_nAlts(std::string gridtype) { + if (gridtype == "GeoGrid") + return check_settings_pt("GeoBlockSize", "nAlts"); + else + return check_settings_pt("MagBlockSize", "nAlts"); } // ----------------------------------------------------------------------- From 7f17908bfe16f7ad8489dc78e49fcb0379269e5d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:39:29 -0400 Subject: [PATCH 113/691] BUG: wouldn't compile anymore...? --- include/output.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/output.h b/include/output.h index f7ce1004..a474d02e 100644 --- a/include/output.h +++ b/include/output.h @@ -229,7 +229,7 @@ class OutputContainer { bool output(const Neutrals &neutrals, const Ions &ions, - const Grid &grid, + Grid &grid, Times time, const Planets &planet); From 4e6766cb7182999c341195b333297d438f64d567 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:40:31 -0400 Subject: [PATCH 114/691] BUG/STY: fix compile, clean code --- src/output.cpp | 70 ++++++++++++++++++++++++++++---------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/src/output.cpp b/src/output.cpp index 1c1970d3..57a418cd 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -13,13 +13,45 @@ -------------------------------------------------------------------- */ +std::string get_filename_from_type(std::string type_output) { + + std::string filename = ""; + + if (type_output == "neutrals") + filename = "3DNE"; + + if (type_output == "states") + filename = "3DAL"; + + if (type_output == "ions") + filename = "3DIO"; + + if (type_output == "bfield") + filename = "3DBF"; + + if (type_output == "moment") + filename = "3DMO"; + + if (type_output == "gravity") + filename = "3DGR"; + + if (type_output == "corners" || type_output == "grid") + filename = "3DCO"; + + if (type_output == "therm") + filename = "3DTH"; + + return filename; + +} + // ----------------------------------------------------------------------------- // Fills output containers and outputs them for common output types // ----------------------------------------------------------------------------- bool output(const Neutrals &neutrals, const Ions &ions, - const Grid &grid, + Grid &grid, Times time, const Planets &planet) { @@ -265,41 +297,19 @@ bool output(const Neutrals &neutrals, // ------------------------------------------------------------ // Set output file names - std::string filename; + std::string filename = get_filename_from_type(type_output); - if (type_output == "neutrals") - filename = "3DNEU_"; - - if (type_output == "states") - filename = "3DALL_"; - - if (type_output == "ions") - filename = "3DION_"; - - if (type_output == "bfield") - filename = "3DBFI_"; - - if (type_output == "moment") - filename = "3DMMT_"; - - if (type_output == "gravity") - filename = "3DGRA_"; - - if (type_output == "moment") - filename = "3DMMT_"; - - if (type_output == "corners" || type_output == "grid") - filename = "3DCOR_"; - - if (type_output == "therm") - filename = "3DTHR_"; - - if (filename.length() < 5) { + if (filename.length() < 4) { report.print(0, "type_output : " + type_output); report.error("File output type not found!"); didWork = false; } else { + if (grid.get_IsGeoGrid()) + filename = filename + "G_"; + else + filename = filename + "M_"; + if ((int64_t(input.get_dt_output(iOutput)) % 60) == 0) filename = filename + time.get_YMD_HM0(); else From 7e604472e214853cdfc15eda92c705292f97eed9 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:41:20 -0400 Subject: [PATCH 115/691] FEAT: generalize things for different grids --- include/quadtree.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/quadtree.h b/include/quadtree.h index 877d5bf2..e63ec1d5 100644 --- a/include/quadtree.h +++ b/include/quadtree.h @@ -102,12 +102,12 @@ class Quadtree { /********************************************************************** \brief Initializes the quadtree **/ - Quadtree(); + Quadtree(std::string gridtype); /********************************************************************** \brief Builds the quadtree **/ - void build(); + void build(std::string gridtype); /********************************************************************** \brief Makes a new node on the quadtree, recursively From f46e5f6bc2cb1483012b06afa95a7488fe49dbbe Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:41:55 -0400 Subject: [PATCH 116/691] FEAT: generalize things for different grids --- src/quadtree.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 3c173cc1..73c93882 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -3,8 +3,8 @@ int64_t iProcQuery = -1; -Quadtree::Quadtree() { - if (input.get_is_cubesphere()) +Quadtree::Quadtree(std::string gridtype) { + if (gridtype == "GeoGrid" & input.get_is_cubesphere()) nRootNodes = 6; else nRootNodes = 1; @@ -22,13 +22,13 @@ bool Quadtree::is_ok() { // build quadtree // -------------------------------------------------------------------------- -void Quadtree::build() { +void Quadtree::build(std::string gridtype) { arma_mat origins; arma_mat rights; arma_mat ups; - if (input.get_is_cubesphere()) { + if (gridtype == "GeoGrid" & input.get_is_cubesphere()) { origins = CubeSphere::ORIGINS; rights = CubeSphere::RIGHTS; ups = CubeSphere::UPS; @@ -65,7 +65,7 @@ void Quadtree::build() { // restrict the domain. This will only work for the spherical // grid so far: - Inputs::grid_input_struct grid_input = input.get_grid_inputs(); + Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); if (grid_input.lon_min > 0.0 || grid_input.lon_max < 2.0 * cPI || From 962e4ee39c4054b137aeebca570de8ff35577789 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:44:24 -0400 Subject: [PATCH 117/691] FEAT: magnitude, xyz->llr, vector add --- include/transform.h | 9 +++++++++ src/transform.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/transform.h b/include/transform.h index a56313b7..be5b6642 100644 --- a/include/transform.h +++ b/include/transform.h @@ -31,7 +31,9 @@ void copy_vector_to_array(std::vector vector_in, // then in fortran copy them back into a character array. int* copy_string_to_int(std::string inString); +arma_cube calc_magnitude(std::vector xyz); std::vector transform_llr_to_xyz_3d(std::vector llr); +std::vector transform_xyz_to_llr_3d(std::vector xyz); std::vector rotate_around_x_3d(std::vector XYZ_in, precision_t angle); std::vector rotate_around_y_3d(std::vector XYZ_in, precision_t angle); std::vector rotate_around_z_3d(std::vector XYZ_in, precision_t angle); @@ -53,6 +55,13 @@ void vector_diff(precision_t vect_in_1[3], precision_t vect_in_2[3], precision_t vect_out[3]); +// ----------------------------------------------------------------------- +// Simple 3-element vector addition +// ----------------------------------------------------------------------- + +void vector_add(precision_t vect_in_1[3], + precision_t vect_in_2[3], + precision_t vect_out[3]); #endif // INCLUDE_TRANSFORM_H_ diff --git a/src/transform.cpp b/src/transform.cpp index b18a6fab..3ff31394 100644 --- a/src/transform.cpp +++ b/src/transform.cpp @@ -131,6 +131,36 @@ void copy_array_to_mat(float *array_in, return; } +// ----------------------------------------------------------------------- +// Calculate the magnitude of a arma_cube vector +// ----------------------------------------------------------------------- +arma_cube calc_magnitude(std::vector xyz) { + arma_cube r = sqrt(xyz[0] % xyz[0] + + xyz[1] % xyz[1] + + xyz[2] % xyz[2]); + return r; +} + +// ----------------------------------------------------------------------- +// Transform X, Y, Z to +// Longitude (llr[0]), Latitude (llr[1]), Radius (llr[2]) +// Use armidillo cubes +// ----------------------------------------------------------------------- + +std::vector transform_xyz_to_llr_3d(std::vector xyz) { + std::vector llr; + arma_cube xy, r, lon; + r = calc_magnitude(xyz); + xy = sqrt(xyz[0] % xyz[0] + + xyz[1] % xyz[1]); + lon = acos(xyz[0]/xy); + uvec ind_ = find(xyz[1] < 0.0); + lon.elem(ind_) = 2 * cPI - lon.elem(ind_); + llr.push_back(lon); + llr.push_back(asin(xyz[2] / r)); + llr.push_back(r); + return llr; +} // ----------------------------------------------------------------------- // Transform Longitude (llr[0]), Latitude (llr[1]), Radius (llr[2]) to @@ -303,3 +333,13 @@ void vector_diff(precision_t vect_in_1[3], for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] - vect_in_2[i]; } + +// ----------------------------------------------------------------------- +// Simple 3-element vector addition +// ----------------------------------------------------------------------- + +void vector_add(precision_t vect_in_1[3], + precision_t vect_in_2[3], + precision_t vect_out[3]) { + for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] + vect_in_2[i]; +} From b17329136d8577506c4beda6842d5c1a6a62658e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:45:03 -0400 Subject: [PATCH 118/691] FEAT: generalize grid --- src/advance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index eacd5b4b..165a0137 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -63,7 +63,7 @@ bool advance(Planets &planet, if (didWork) didWork = neutrals.set_bcs(gGrid, time, indices); - if (input.get_nAltsGeo() > 1) + if (input.get_nAlts("GeoGrid") > 1) neutrals.advect_vertical(gGrid, time); if (didWork & input.get_check_for_nans()) From ea1e5b087f9666bb4231410b11421f3dfbbdffa6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:46:37 -0400 Subject: [PATCH 119/691] FEAT: generalize for different grids --- src/calc_neutral_derived.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 32ca53fe..e6c50722 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -353,7 +353,7 @@ precision_t Neutrals::calc_dt(Grid grid) { arma_cube dty = grid.dlat_center_dist_scgc / cMax_vcgc[1]; dta(1) = dty.min(); - if (input.get_nAltsGeo() > 1) { + if (input.get_nAlts("GeoGrid") > 1) { arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; dta(2) = dtz.min(); } else @@ -422,7 +422,7 @@ precision_t Neutrals::calc_dt_cubesphere(Grid grid) { dta(0) = dtx.min(); dta(1) = dty.min(); - if (input.get_nAltsGeo() > 1) { + if (input.get_nAlts("GeoGrid") > 1) { arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; dta(2) = dtz.min(); } else From 736fe499fb0a30835fa4201136f9f2316d553e36 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:47:10 -0400 Subject: [PATCH 120/691] FEAT: add dipole grid --- src/dipole.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/dipole.cpp b/src/dipole.cpp index 0230a5b3..fb765ac7 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -6,6 +6,33 @@ #include "aether.h" +// ----------------------------------------------------------------------------- +// get the l-shell given latitude (in radians) and normalized radius +// ----------------------------------------------------------------------------- + +precision_t get_lshell(precision_t lat, precision_t rNorm) { + precision_t cosLat = cos(lat); + precision_t lshell = rNorm / (cosLat * cosLat); + return lshell; +} + +arma_vec get_lat_from_r_and_lshell(arma_vec r, precision_t lshell) { + arma_vec cosLat = sqrt(r / lshell); + cosLat.clamp(-1.0, 1.0); + arma_vec lat = acos(cosLat); + return lat; +} + +precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell) { + precision_t cosLat = sqrt(r / lshell); + if (cosLat < -1.0) cosLat = -1.0; + if (cosLat > 1.0) cosLat = 1.0; + precision_t lat = acos(cosLat); + return lat; +} + + + // ----------------------------------------------------------------------------- // Calculate a tilted offset dipole field given the planetary // characteristics From 02e8ff52167be2f3922d7ca5072be124ea870db7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:47:56 -0400 Subject: [PATCH 121/691] DEBUG: debugging... --- src/fill_grid.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index a0f43fc7..3ab6fcfb 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -260,6 +260,11 @@ void Grid::calc_rad_unit(Planets planet) { rad_unit_vcgc[1] = (gradient_vcgc[1] % mag_radius_gradienti); rad_unit_vcgc[2] = (gradient_vcgc[2] % mag_radius_gradienti); + std::cout << "radius unit vector : " + << rad_unit_vcgc[0](5,5,5) << " " + << rad_unit_vcgc[1](5,5,5) << " " + << rad_unit_vcgc[2](5,5,5) << "\n"; + report.exit(function); return; } @@ -289,6 +294,11 @@ void Grid::calc_gravity(Planets planet) { gravity_vcgc[1] = - gravity_vcgc[1]; gravity_vcgc[2] = - gravity_vcgc[2]; + std::cout << "gravity vector : " + << gravity_vcgc[0](5,5,5) << " " + << gravity_vcgc[1](5,5,5) << " " + << gravity_vcgc[2](5,5,5) << "\n"; + report.exit(function); return; } From 28bfd0af793db438fb0d06aac812912d7aa23133 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:48:53 -0400 Subject: [PATCH 122/691] FEAT: incorporate different grid systems --- src/grid.cpp | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/grid.cpp b/src/grid.cpp index 789e637d..4f097b84 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -100,6 +100,10 @@ Grid::Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in) { magLat_scgc.set_size(nX, nY, nZ); magAlt_scgc.set_size(nX, nY, nZ); + magPhi_scgc.set_size(nX, nY, nZ); + magP_scgc.set_size(nX, nY, nZ); + magQ_scgc.set_size(nX, nY, nZ); + magX_scgc.set_size(nX, nY, nZ); magY_scgc.set_size(nX, nY, nZ); magZ_scgc.set_size(nX, nY, nZ); @@ -146,6 +150,7 @@ Grid::Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in) { mag_pole_south_gse.push_back(tmp_col); HasBField = 0; + IsExperimental = false; cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -323,10 +328,18 @@ void Grid::report_grid_boundaries() { // Get whether the grid is a geographic grid (or magnetic - return 0) // -------------------------------------------------------------------------- -int Grid::get_IsGeoGrid() { +bool Grid::get_IsGeoGrid() { return IsGeoGrid; } +// -------------------------------------------------------------------------- +// Get whether the grid is a experimental (return true for experimental) +// -------------------------------------------------------------------------- + +bool Grid::get_IsExperimental() { + return IsExperimental; +} + // -------------------------------------------------------------------------- // Get whether the grid is a geographic grid (or magnetic - return 0) // -------------------------------------------------------------------------- @@ -339,10 +352,18 @@ bool Grid::get_HasBField() { // Set whether the grid is a geographic grid (or magnetic - set to 0) // -------------------------------------------------------------------------- -void Grid::set_IsGeoGrid(int value) { +void Grid::set_IsGeoGrid(bool value) { IsGeoGrid = value; } +// -------------------------------------------------------------------------- +// Set whether the grid is an experimental grid +// -------------------------------------------------------------------------- + +void Grid::set_IsExperimental(bool value) { + IsExperimental = value; +} + // -------------------------------------------------------------------------- // Get total number of grid points // -------------------------------------------------------------------------- From cdac12812d268326b9d9c476a59ead2c4fc6d555 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:49:56 -0400 Subject: [PATCH 123/691] FEAT: allow a tilted sphere grid for experimenting --- src/init_geo_grid.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index cfc4a646..689b96d4 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -748,7 +748,7 @@ void Grid::create_altitudes(Planets planet) { arma_vec alt1d(nAlts); - Inputs::grid_input_struct grid_input = input.get_grid_inputs(); + Inputs::grid_input_struct grid_input = input.get_grid_inputs("GeoGrid"); if (grid_input.IsUniformAlt) { for (iAlt = 0; iAlt < nAlts; iAlt++) @@ -972,12 +972,35 @@ bool Grid::init_geo_grid(Quadtree quadtree, // Calculate the radius (for spherical or non-spherical) fill_grid_radius(planet); - // Correct the reference grid with correct length scale: // (with R = actual radius) if (input.get_is_cubesphere()) correct_xy_grid(planet); + if (IsExperimental) { + std::vector llr, xyz, xyzRot1, xyzRot2; + llr.push_back(geoLon_scgc); + llr.push_back(geoLat_scgc); + llr.push_back(radius_scgc); + xyz = transform_llr_to_xyz_3d(llr); + + precision_t magnetic_pole_rotation = 265.0 * cDtoR; + precision_t magnetic_pole_tilt = 10.0 * cDtoR; + + // Reverse our dipole rotations: + xyzRot1 = rotate_around_y_3d(xyz, magnetic_pole_tilt); + xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); + + // transform back to lon, lat, radius: + llr = transform_xyz_to_llr_3d(xyzRot2); + + geoLon_scgc = llr[0]; + geoLat_scgc = llr[1]; + geoAlt_scgc = llr[2] - planet.get_radius(0.0); + + IsGeoGrid = false; + } + // Calculate grid spacing calc_grid_spacing(planet); //calculate radial unit vector (for spherical or oblate planet) From 3fdfa0e5888718d7c3b6b2db41c3e290ca0ac89b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:51:49 -0400 Subject: [PATCH 124/691] FEAT: prep for mag grid --- src/init_parallel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index 3acaae76..2b4953ae 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -98,7 +98,7 @@ bool init_parallel(Quadtree &quadtree) { if (report.test_verbose(2)) std::cout << "seed : " << seed << "\n"; - quadtree.build(); + quadtree.build("GeoGrid"); } else { if (iProc == 0) { From 5cfce2c259130f971577f26e96ad63b8eb436a47 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:53:00 -0400 Subject: [PATCH 125/691] FEAT: generalize initial temperature --- src/neutrals_ics.cpp | 76 ++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 9f67e005..b9d3080f 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -37,18 +37,14 @@ bool Neutrals::initial_conditions(Grid grid, if (input.get_do_restart()) { report.print(1, "Restarting! Reading neutral files!"); didWork = restart_file(input.get_restartin_dir(), DoRead); - - if (!didWork) { + if (!didWork) report.error("Reading Restart for Neutrals Failed!!!"); - \ - } } else { json ics = input.get_initial_condition_types(); std::string icsType = mklower(ics["type"]); if (icsType == "msis") { - report.print(2, "Using MSIS for Initial Conditions"); Msis msis; @@ -101,6 +97,7 @@ bool Neutrals::initial_conditions(Grid grid, } // type = msis if (icsType == "planet") { + report.print(2, "Using planet for Initial Conditions"); didWork = true; @@ -120,53 +117,56 @@ bool Neutrals::initial_conditions(Grid grid, arma_mat H2d(nLons, nLats); - alt1d = grid.geoAlt_scgc.tube(0, 0); - if (nInitial_temps > 0) { - for (iAlt = 0; iAlt < nAlts; iAlt++) { - alt = alt1d(iAlt); - - // Find temperatures: - if (alt <= initial_altitudes[0]) - temp1d[iAlt] = initial_temperatures[0]; - - else { - if (alt >= initial_altitudes[nInitial_temps - 1]) - temp1d[iAlt] = initial_temperatures[nInitial_temps - 1]; - - else { - // Linear interpolation! - iA = 0; - - while (alt > initial_altitudes[iA]) - iA++; - - iA--; - // alt will be between iA and iA+1: - r = (alt - initial_altitudes[iA]) / - (initial_altitudes[iA + 1] - initial_altitudes[iA]); - temp1d[iAlt] = - (1.0 - r) * initial_temperatures[iA] + - (r) * initial_temperatures[iA + 1]; + for (iLon = 0; iLon < nLons; iLon++) { + for (iLat = 0; iLat < nLats; iLat++) { + alt1d = grid.geoAlt_scgc.tube(iLon, iLat); + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + alt = alt1d(iAlt); + + // Find temperatures: + if (alt <= initial_altitudes[0]) + temp1d[iAlt] = initial_temperatures[0]; + + else { + if (alt >= initial_altitudes[nInitial_temps - 1]) + temp1d[iAlt] = initial_temperatures[nInitial_temps - 1]; + + else { + // Linear interpolation! + iA = 0; + + while (alt > initial_altitudes[iA]) + iA++; + + iA--; + // alt will be between iA and iA+1: + r = (alt - initial_altitudes[iA]) / + (initial_altitudes[iA + 1] - initial_altitudes[iA]); + temp1d[iAlt] = + (1.0 - r) * initial_temperatures[iA] + + (r) * initial_temperatures[iA + 1]; + } + } } + temperature_scgc.tube(iLon, iLat) = temp1d; } } } else temp1d = 200.0; - // spread the 1D temperature across the globe: - for (iLon = 0; iLon < nLons; iLon++) { - for (iLat = 0; iLat < nLats; iLat++) - temperature_scgc.tube(iLon, iLat) = temp1d; - } + std::cout << "done with temps...\n"; // Set the lower boundary condition: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); } + std::cout << "done with fill...\n"; calc_scale_height(grid); + std::cout << "done with scale height...\n"; fill_with_hydrostatic(1, nAlts, grid); } // type = planet } From ea0e1b51228793e036d7b626d3946df8a94b0100 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:54:17 -0400 Subject: [PATCH 126/691] FEAT: generalize grid --- src/neutrals_bcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 0c7c4017..7efca8c7 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -30,7 +30,7 @@ bool Neutrals::set_bcs(Grid grid, bool didWork = true; - if (input.get_nAltsGeo() > 1) { + if (input.get_nAlts("GeoGrid") > 1) { didWork = set_lower_bcs(grid, time, indices); if (didWork) From 9f654b0250517733bf553bb53f0017b9c950b104 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:55:06 -0400 Subject: [PATCH 127/691] FEAT: add some more grids and variables on grids --- src/main/main.cpp | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 84d4ae0e..8583e006 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -32,7 +32,7 @@ int main() { report.print(-1, "Hello " + input.get_student_name() + " - welcome to Aether!"); - Quadtree quadtree; + Quadtree quadtree("GeoGrid"); if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); @@ -75,9 +75,9 @@ int main() { MPI_Barrier(aether_comm); // Initialize Geographic grid: - Grid gGrid(input.get_nLonsGeo(), - input.get_nLatsGeo(), - input.get_nAltsGeo(), + Grid gGrid(input.get_nLons("GeoGrid"), + input.get_nLats("GeoGrid"), + input.get_nAlts("GeoGrid"), nGeoGhosts); didWork = gGrid.init_geo_grid(quadtree, planet); MPI_Barrier(aether_comm); @@ -88,6 +88,19 @@ int main() { // Find interpolation coefs for the ghostcells if cubesphere grid didWork = find_ghostcell_interpolation_coefs(gGrid); + // Make another grid, just to test things: + // Initialize Geographic grid: + Grid testGrid(input.get_nLons("GeoGrid"), + input.get_nLats("GeoGrid"), + input.get_nAlts("GeoGrid"), + nGeoGhosts); + testGrid.set_IsExperimental(true); + didWork = testGrid.init_geo_grid(quadtree, planet); + MPI_Barrier(aether_comm); + + if (!didWork) + throw std::string("init_geo_grid for test grid failed!"); + // Calculate centripetal acceleration, since this is a constant // vector on the grid: if (input.get_cent_acc()) @@ -95,12 +108,20 @@ int main() { // Initialize Magnetic grid: Grid mGrid(nMagLonsG, nMagLatsG, nMagAltsG, nMagGhosts); + mGrid.init_dipole_grid(quadtree, planet); // Initialize Neutrals on geographic grid: Neutrals neutrals(gGrid, planet, time, indices); + // Initialize Neutrals on magnetic grid: + //Neutrals neutralsMag(mGrid, planet, time, indices); + // Initialize Neutrals on experimental grid: + Neutrals neutralsTest(testGrid, planet, time, indices); + // Initialize Ions on geographic grid: Ions ions(gGrid, planet); + // Initialize Ions on magnetic grid: + Ions ionsTest(testGrid, planet); // ----------------------------------------------------------------- // This is a unit test for checking for nans and infinities. @@ -131,6 +152,8 @@ int main() { // Initialize ion temperatures from neutral temperature ions.init_ion_temperature(neutrals, gGrid); + // Initialize ion temperatures from neutral temperature (on Mag Grid) + ionsTest.init_ion_temperature(neutralsTest, testGrid); // Initialize electrodynamics and check if electrodynamics times // works with input time @@ -149,9 +172,10 @@ int main() { } // This is for the initial output. If it is not a restart, this will go: - if (time.check_time_gate(input.get_dt_output(0))) + if (time.check_time_gate(input.get_dt_output(0))) { didWork = output(neutrals, ions, gGrid, time, planet); - + didWork = output(neutralsTest, ionsTest, testGrid, time, planet); + } if (!didWork) throw std::string("output failed!"); From ac7ee8ae66ed488af2f538d0de28d2747da6c594 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 07:56:08 -0400 Subject: [PATCH 128/691] FEAT/STY: Add mag grid and fix spacing --- share/run/UA/inputs/defaults.json | 39 ++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 724a0bcc..3093626d 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -65,22 +65,39 @@ "EndTime" : [2011, 3, 20, 0, 10, 0], "GeoBlockSize" : { - "nLons" : 36, - "nLats" : 36, - "nAlts" : 50}, + "nLons" : 36, + "nLats" : 36, + "nAlts" : 50}, "GeoGrid" : { - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, - "MinAlt" : 100.0, - "dAlt" : 5.0, + "MinLat" : -90.0, + "MaxLat" : 90.0, + "MinLon" : 0.0, + "MaxLon" : 360.0, + "MinAlt" : 100.0, + "dAlt" : 5.0, "AltFile" : "", - "IsUniformAlt" : true}, + "IsUniformAlt" : true}, + + "MagBlockSize" : { + "nLons" : 18, + "nLats" : 20, + "nAlts" : 200}, + + "MagGrid" : { + "MinLat" : -90.0, + "MaxLat" : 90.0, + "MinLon" : 0.0, + "MaxLon" : 360.0, + "MinAlt" : 100.0, + "MaxAlt" : 5000.0, + "MinApex" : 120.0, + "dAlt" : 5.0, + "AltFile" : "", + "IsUniformAlt" : true}, "CubeSphere" : { - "is" : false}, + "is" : false}, "Oblate" : { "isOblate" : false, From 70328434b407e264ae7c798aef212bb5f89033b3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 4 Jun 2024 08:40:57 -0400 Subject: [PATCH 129/691] BUG: change float to precision_t --- include/grid.h | 10 ++--- include/planets.h | 4 +- include/transform.h | 12 +++--- src/dipole.cpp | 2 +- src/init_mag_grid.cpp | 88 +++++++++++++++++++++---------------------- src/planets.cpp | 2 +- src/transform.cpp | 14 +++---- 7 files changed, 66 insertions(+), 66 deletions(-) diff --git a/include/grid.h b/include/grid.h index 270feb68..bfc1bd5e 100644 --- a/include/grid.h +++ b/include/grid.h @@ -142,7 +142,7 @@ class Grid { void set_IsGeoGrid(bool value); void set_IsExperimental(bool value); bool get_IsExperimental(); - + int64_t get_nPointsInGrid(); int64_t get_nX(); @@ -183,10 +183,10 @@ class Grid { // Make mag-field grid: void init_mag_grid(Planets planet); - std::pair lshell_to_qn_qs(Planets planet, float Lshell, float Lon, float AltMin); - void convert_dipole_geo_xyz(Planets planet, float XyzDipole[3], float XyzGeo[3]); - void fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lshell, float Lon, double *q); - std::pair p_q_to_r_theta(float p, float q); + std::pair lshell_to_qn_qs(Planets planet, precision_t Lshell, precision_t Lon, precision_t AltMin); + void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]); + void fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, int nZ, precision_t Lshell, precision_t Lon, double *q); + std::pair p_q_to_r_theta(precision_t p, precision_t q); arma_vec get_r3_spacing(precision_t lat, precision_t rMin, precision_t rMax, int64_t nPts, int64_t nGcs); void init_dipole_grid(Quadtree quadtree, Planets planet); diff --git a/include/planets.h b/include/planets.h index 36edafc7..a512daac 100644 --- a/include/planets.h +++ b/include/planets.h @@ -92,7 +92,7 @@ class Planets { /********************************************************************** \brief Returns the location of the center of the dipole (in meters) **/ - std::vector get_dipole_center(); + std::vector get_dipole_center(); /********************************************************************** \brief Returns the rotation angle of the dipole in longitude (radians) @@ -214,7 +214,7 @@ class Planets { /// Dipole tilt from the rotation axis (co-latitude of pole) (radians) precision_t dipole_tilt; /// Offset of the dipole center from the geographic center of planet - std::vector dipole_center{ 0.0, 0.0, 0.0 }; + std::vector dipole_center{ 0.0, 0.0, 0.0 }; //J2 value precision_t J2; diff --git a/include/transform.h b/include/transform.h index be5b6642..fe27f452 100644 --- a/include/transform.h +++ b/include/transform.h @@ -14,17 +14,17 @@ std::string mklower(std::string inString); std::string mkupper(std::string inString); void copy_cube_to_array(arma_cube cube_in, - float *array_out); + precision_t *array_out); void copy_mat_to_array(arma_mat mat_in, - float *array_out, + precision_t *array_out, bool isFortran); -void copy_array_to_mat(float *array_in, +void copy_array_to_mat(precision_t *array_in, arma_mat &mat_out, bool isFortran); -void copy_vector_to_array(std::vector vector_in, +void copy_vector_to_array(std::vector vector_in, int64_t nElements, - float *array_out); + precision_t *array_out); // This is needed when sending strings to Fortran. // We do this by copying the ascii numbers into an integer array, @@ -41,7 +41,7 @@ std::vector rotate_around_z_3d(std::vector XYZ_in, precisi void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]); void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, precision_t xyz_out[3]); void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, precision_t xyz_out[3]); -void transform_float_vector_to_array(std::vector input, +void transform_float_vector_to_array(std::vector input, precision_t output[3]); void transform_vector_xyz_to_env(precision_t xyz_in[3], diff --git a/src/dipole.cpp b/src/dipole.cpp index fb765ac7..26fdf278 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -62,7 +62,7 @@ bfield_info_type get_dipole(precision_t lon, transform_llr_to_xyz(llr, xyz); precision_t dipole_center[3]; - std::vector temp_dipole_center = planet.get_dipole_center(); + std::vector temp_dipole_center = planet.get_dipole_center(); transform_float_vector_to_array(temp_dipole_center, dipole_center); precision_t delta_pos_to_center[3]; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8a1bcbf5..569d2b2b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -31,8 +31,8 @@ void Grid::init_mag_grid(Planets planet) { // Longitudes: // - Make a 1d vector // - copy it into the 3d cube - fvec lon1d(nLons); - float dlon = (grid_input.lon_max - grid_input.lon_min) / (nLons-2*nGCs); + arma_vec lon1d(nLons); + precision_t dlon = (grid_input.lon_max - grid_input.lon_min) / (nLons-2*nGCs); for (iLon=0; iLon < nLons; iLon++) lon1d[iLon] = grid_input.lon_min + (iLon-nGCs+0.5) * dlon; @@ -57,20 +57,20 @@ void Grid::init_mag_grid(Planets planet) { // Latitudes: // - Make a 1d vector // - copy it into the 3d cube - fvec lat1d(nLats); + arma_vec lat1d(nLats); //cout << "!!!!!!!!!!! HA1a "< Grid::lshell_to_qn_qs(Planets planet, float Lshell, float Lon, float AltMin) { +std::pair Grid::lshell_to_qn_qs(Planets planet, precision_t Lshell, precision_t Lon, precision_t AltMin) { std::string function = "Grid::lshell_to_qn_qs"; static int iFunction = -1; report.enter(function, iFunction); - float qN,qS; + precision_t qN,qS; - float XyzDipoleLeft[3], XyzDipoleMid[3], XyzDipoleRight[3]; - float XyzGeoLeft[3], XyzGeoMid[3], XyzGeoRight[3]; - float rGeoLeft, rGeoMid, rGeoRight; - float LlrDipoleLeft[3], LlrDipoleMid[3], LlrDipoleRight[3]; - float ThetaTilt, PhiTilt; - float Lat, Radius, rMin; + precision_t XyzDipoleLeft[3], XyzDipoleMid[3], XyzDipoleRight[3]; + precision_t XyzGeoLeft[3], XyzGeoMid[3], XyzGeoRight[3]; + precision_t rGeoLeft, rGeoMid, rGeoRight; + precision_t LlrDipoleLeft[3], LlrDipoleMid[3], LlrDipoleRight[3]; + precision_t ThetaTilt, PhiTilt; + precision_t Lat, Radius, rMin; // Named dimension constants static int Lon_= 0, Lat_= 1, Radius_= 2; //bound vars for bisection search - float ThetaRight, ThetaLeft, ThetaMid; - float rDipoleLeft,rDipoleMid,rDipoleRight; + precision_t ThetaRight, ThetaLeft, ThetaMid; + precision_t rDipoleLeft,rDipoleMid,rDipoleRight; //Stopping condition for bisection search - float DeltaTheta; - float Tolerance = 1e-4; + precision_t DeltaTheta; + precision_t Tolerance = 1e-4; // status vars for bisection search int iStatusLeft, iStatusRight, iStatusMid; // note we normalize Lshell by equatorial radius - float RadiusEq = planet.get_radius(0.0); + precision_t RadiusEq = planet.get_radius(0.0); // loop for qN and qS @@ -502,20 +502,20 @@ std::pair Grid::lshell_to_qn_qs(Planets planet, float Lshell, float // // ----------------------------------------------------------------------- -void Grid::convert_dipole_geo_xyz(Planets planet, float XyzDipole[3], float XyzGeo[3]) { - float XyzRemoveShift[3]; - float XyzRemoveTilt[3]; - float XyzRemoveRot[3]; +void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) { + precision_t XyzRemoveShift[3]; + precision_t XyzRemoveTilt[3]; + precision_t XyzRemoveRot[3]; // get planetary parameters, use radius at equator for Lshell reference - float magnetic_pole_tilt = planet.get_dipole_tilt(); - float magnetic_pole_rotation = planet.get_dipole_rotation(); - float radius = planet.get_radius(0.0); + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t radius = planet.get_radius(0.0); // get the dipole shift, but normalize it to equatorial radius - float dipole_center[3]; - std::vector temp_dipole_center = planet.get_dipole_center(); + precision_t dipole_center[3]; + std::vector temp_dipole_center = planet.get_dipole_center(); transform_float_vector_to_array(temp_dipole_center, dipole_center); dipole_center[0]=dipole_center[0]/radius; @@ -545,7 +545,7 @@ void Grid::convert_dipole_geo_xyz(Planets planet, float XyzDipole[3], float XyzG // Routine to fill in the q values for a particular L and lon // using equations 7-8 from Huba et al 2000 // ---------------------------------------------------------------------- -void Grid::fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lshell, float Lon, double *q) { +void Grid::fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, int nZ, precision_t Lshell, precision_t Lon, double *q) { std::string function = "Grid::fill_dipole_q_line"; static int iFunction = -1; report.enter(function, iFunction); @@ -554,7 +554,7 @@ void Grid::fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lsh double r[nZ]; double theta[nZ]; double Dx; - float Llr[3], Xyz[3]; + precision_t Llr[3], Xyz[3]; int DoTestLine = 0; //open test file for writing the grid data for plotting @@ -570,7 +570,7 @@ void Grid::fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lsh // equal segments. //Dx = 2.0*(1.0-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); - Dx = (sinh(Gamma*qS)-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); + Dx = (sinh(Gamma*qS)-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); //Dx = 2.0/(static_cast(nZ)-1.0); //Dx = (static_cast(qN)-static_cast(qS))/(static_cast(nZ)-1.0); @@ -635,13 +635,13 @@ void Grid::fill_dipole_q_line(float qN, float qS, float Gamma, int nZ, float Lsh // note r here is normalized to planet radius. // // ---------------------------------------------------------------------- -std::pair Grid::p_q_to_r_theta(float p, float q) { +std::pair Grid::p_q_to_r_theta(precision_t p, precision_t q) { //return quanties - float r, theta; + precision_t r, theta; // function value and derivative for NR method - float Func, dFunc; + precision_t Func, dFunc; // tolerance for root finding - float Tolerance = 0.00001; + precision_t Tolerance = 0.00001; // initial guess for r r = 100.0; diff --git a/src/planets.cpp b/src/planets.cpp index 2a090171..0528cfd7 100644 --- a/src/planets.cpp +++ b/src/planets.cpp @@ -104,7 +104,7 @@ precision_t Planets::get_dipole_strength() { // Get the location of the dipole center // ----------------------------------------------------------------------------- -std::vector Planets::get_dipole_center() { +std::vector Planets::get_dipole_center() { return planet.dipole_center; } diff --git a/src/transform.cpp b/src/transform.cpp index 3ff31394..03514033 100644 --- a/src/transform.cpp +++ b/src/transform.cpp @@ -45,9 +45,9 @@ int* copy_string_to_int(std::string inString) { // copy from c++ vector to c-native array // ----------------------------------------------------------------------- -void copy_vector_to_array(std::vector vector_in, +void copy_vector_to_array(std::vector vector_in, int64_t nElements, - float *array_out) { + precision_t *array_out) { for (int64_t i = 0; i < nElements; i++) array_out[i] = vector_in[i]; @@ -58,7 +58,7 @@ void copy_vector_to_array(std::vector vector_in, // ----------------------------------------------------------------------- void copy_cube_to_array(arma_cube cube_in, - float *array_out) { + precision_t *array_out) { int64_t nX = cube_in.n_rows; int64_t nY = cube_in.n_cols; @@ -80,7 +80,7 @@ void copy_cube_to_array(arma_cube cube_in, // ----------------------------------------------------------------------- void copy_mat_to_array(arma_mat mat_in, - float *array_out, + precision_t *array_out, bool isFortran) { int64_t nX = mat_in.n_rows; @@ -109,7 +109,7 @@ void copy_mat_to_array(arma_mat mat_in, // If isFortran is set, the columns / rows are flipped // ----------------------------------------------------------------------- -void copy_array_to_mat(float *array_in, +void copy_array_to_mat(precision_t *array_in, arma_mat &mat_out, bool isFortran) { @@ -287,10 +287,10 @@ void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, } // ----------------------------------------------------------------------- -// Simply move data from a vector to a C-native array (float) +// Simply move data from a vector to a C-native array (precision_t) // ----------------------------------------------------------------------- -void transform_float_vector_to_array(std::vector input, +void transform_float_vector_to_array(std::vector input, precision_t output[3]) { for (int i = 0; i < 3; i++) output[i] = input[i]; From 3e77fa8ebab6f585394a05eeb593b5eca07dbfed Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 9 Jun 2024 22:51:37 -0400 Subject: [PATCH 130/691] FEAT: Note if is magnetic grid --- include/grid.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/grid.h b/include/grid.h index bfc1bd5e..724e3f7f 100644 --- a/include/grid.h +++ b/include/grid.h @@ -287,6 +287,7 @@ class Grid { bool IsGeoGrid; bool HasBField; bool IsExperimental; + bool IsMagGrid; int64_t nX, nLons; int64_t nY, nLats; From 013b2314f8fad2ee50553e722d2fbbd5c668f3de Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 9 Jun 2024 22:52:09 -0400 Subject: [PATCH 131/691] STY: remove couts --- src/fill_grid.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 3ab6fcfb..a0f43fc7 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -260,11 +260,6 @@ void Grid::calc_rad_unit(Planets planet) { rad_unit_vcgc[1] = (gradient_vcgc[1] % mag_radius_gradienti); rad_unit_vcgc[2] = (gradient_vcgc[2] % mag_radius_gradienti); - std::cout << "radius unit vector : " - << rad_unit_vcgc[0](5,5,5) << " " - << rad_unit_vcgc[1](5,5,5) << " " - << rad_unit_vcgc[2](5,5,5) << "\n"; - report.exit(function); return; } @@ -294,11 +289,6 @@ void Grid::calc_gravity(Planets planet) { gravity_vcgc[1] = - gravity_vcgc[1]; gravity_vcgc[2] = - gravity_vcgc[2]; - std::cout << "gravity vector : " - << gravity_vcgc[0](5,5,5) << " " - << gravity_vcgc[1](5,5,5) << " " - << gravity_vcgc[2](5,5,5) << "\n"; - report.exit(function); return; } From ec61ee70a455a50d77e5f40a0791b856cc6a68ea Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 9 Jun 2024 22:53:08 -0400 Subject: [PATCH 132/691] FEAT: calc radial direction and gravity --- src/init_mag_grid.cpp | 60 ++++++++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 569d2b2b..0bb64f8a 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -278,6 +278,7 @@ void Grid::init_mag_grid(Planets planet) { gridfileslice.close(); IsGeoGrid = false; + IsMagGrid = true; // Calculate the radius, etc: @@ -694,17 +695,14 @@ arma_vec Grid::get_r3_spacing(precision_t lat, precision_t rMin, precision_t rMaxReal = rMax; precision_t lShell = get_lshell(lat, rMin); - if (lShell < rMaxReal) { + if (lShell < rMaxReal) rMaxReal = lShell; - std::cout << "Limiting rMaxReal from " << rMax << " to " << rMaxReal << "\n"; - } precision_t rMin3 = pow(rMin, 1.0/3.0); precision_t rMax3 = pow(rMaxReal, 1.0/3.0); precision_t dr3 = (rMax3 - rMin3) / (nPts-nGcs*2); arma_vec r(nPts); - for (int64_t iPt = 0; iPt < nPts; iPt++) { + for (int64_t iPt = 0; iPt < nPts; iPt++) r(iPt) = pow(rMin3 + dr3 * (iPt - nGcs), 3); - } return r; } @@ -722,6 +720,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { // turn the switch on! IsGeoGrid = false; + IsMagGrid = true; int64_t iLon, iLat, iAlt; @@ -766,7 +765,6 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); precision_t lat0 = lower_left_norm(1) * cPI; - arma_vec lat1d(nLats); // Latitudes: @@ -774,14 +772,11 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { // - copy it into the 3d cube for (iLat = 0; iLat < nLats; iLat++) { lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; - std::cout << "Original : " << lat1d(iLat) << " "; if (lat1d(iLat) >= 0) { lat1d(iLat) = min_lat + lat1d(iLat) * stretch; } else { lat1d(iLat) = -min_lat + lat1d(iLat) * stretch; } - std::cout << "Final : " << lat1d(iLat) << "\n"; - } for (iLon = 0; iLon < nLons; iLon++) { for (iAlt = 0; iAlt < nAlts; iAlt++) @@ -790,19 +785,18 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { arma_vec rNorm1d, lat1dAlong; arma_cube r3d(nLons, nLats, nAlts); - precision_t lShell; + rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + for (iLat = 0; iLat < nLats; iLat++) { lat0 = lat1d(iLat); if (lat0 > cPI/2) lat0 = cPI - lat0; if (lat0 < -cPI/2) lat0 = -cPI - lat0; lShell = get_lshell(lat0, min_r); - std::cout << "iLat : " << iLat << " " << nLats << "\n"; - std::cout << "lShell : " << lat0 * cRtoD << " " << lShell << "\n"; - std::cout << "min_r : " << min_r << " " << max_r << " " << nAlts << " " << nGCs << "\n"; rNorm1d = get_r3_spacing(lat0, min_r, max_r, nAlts, nGCs); lat1dAlong = get_lat_from_r_and_lshell(rNorm1d, lShell); + if (lat0 < 0) lat1dAlong = -1.0 * lat1dAlong; for (iLon = 0; iLon < nLons; iLon++) { @@ -810,9 +804,34 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { magLat_scgc.tube(iLon, iLat) = lat1dAlong; } } - geoLat_scgc = magLat_scgc; magAlt_scgc = r3d - planetRadius; + geoAlt_scgc = magAlt_scgc; + + // Calculate the radius, etc: + fill_grid_radius(planet); + + // Figure out what direction is radial: + rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + + for (int iV = 0; iV < 3; iV++) { + rad_unit_vcgc[iV].zeros(); + gravity_vcgc[iV].zeros(); + } + + arma_cube br = 2 * sin(abs(magLat_scgc)); + arma_cube bt = cos(magLat_scgc); + arma_cube bm = sqrt(br % br + bt % bt); + // Latitudinal direction of radial: + rad_unit_vcgc[1] = bt / bm % sign(magLat_scgc); + rad_unit_vcgc[2] = - br / bm; + + precision_t mu = planet.get_mu(); + gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; + gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; + gravity_potential_scgc.set_size(nX, nY, nZ); + gravity_potential_scgc.zeros(); std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(magLon_scgc); @@ -834,19 +853,6 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; - // Calculate the radius, etc: - fill_grid_radius(planet); - calc_rad_unit(planet); - calc_gravity(planet); - - std::cout << "magLon : " << magLon_scgc(12,10,5) * cRtoD << " " - << magLat_scgc(12,10,5) * cRtoD << " " - << magAlt_scgc(12,10,5) / 1000.0 << "\n"; - - std::cout << "geoLon : " << geoLon_scgc(12,10,5) * cRtoD << " " - << geoLat_scgc(12,10,5) * cRtoD << " " - << geoAlt_scgc(12,10,5) / 1000.0 << "\n"; - report.exit(function); return; From b632c58ffd3c7f124a9a6a34dc46adb3411b1f3e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 9 Jun 2024 22:54:01 -0400 Subject: [PATCH 133/691] FEAT: initialize neutrals and ions on mag grid --- src/main/main.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 8583e006..b17a8d5f 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -115,13 +115,13 @@ int main() { // Initialize Neutrals on magnetic grid: //Neutrals neutralsMag(mGrid, planet, time, indices); // Initialize Neutrals on experimental grid: - Neutrals neutralsTest(testGrid, planet, time, indices); + Neutrals neutralsTest(mGrid, planet, time, indices); // Initialize Ions on geographic grid: Ions ions(gGrid, planet); // Initialize Ions on magnetic grid: - Ions ionsTest(testGrid, planet); + Ions ionsTest(mGrid, planet); // ----------------------------------------------------------------- // This is a unit test for checking for nans and infinities. @@ -174,7 +174,7 @@ int main() { // This is for the initial output. If it is not a restart, this will go: if (time.check_time_gate(input.get_dt_output(0))) { didWork = output(neutrals, ions, gGrid, time, planet); - didWork = output(neutralsTest, ionsTest, testGrid, time, planet); + didWork = output(neutralsTest, ionsTest, mGrid, time, planet); } if (!didWork) throw std::string("output failed!"); From a413f7c9545912405c4398340d2c9ee8694ff4ad Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:33:55 -0400 Subject: [PATCH 134/691] FEAT: pass data for both geo and mag grids --- include/advance.h | 4 ++++ src/advance.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/include/advance.h b/include/advance.h index 541dd683..d50282a6 100644 --- a/include/advance.h +++ b/include/advance.h @@ -34,11 +34,15 @@ bool advance(Planets &planet, Grid &gGrid, + Grid &mGrid, Times &time, Euv &euv, Neutrals &neutrals, + Neutrals &neutralsMag, Ions &ions, + Ions &ionsMag, Chemistry &chemistry, + Chemistry &chemistryMag, Electrodynamics &electrodynamics, Indices &indices, Logfile &logfile); diff --git a/src/advance.cpp b/src/advance.cpp index 165a0137..8236d071 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -12,11 +12,15 @@ bool advance(Planets &planet, Grid &gGrid, + Grid &mGrid, Times &time, Euv &euv, Neutrals &neutrals, + Neutrals &neutralsMag, Ions &ions, + Ions &ionsMag, Chemistry &chemistry, + Chemistry &chemistryMag, Electrodynamics &electrodynamics, Indices &indices, Logfile &logfile) { @@ -35,10 +39,14 @@ bool advance(Planets &planet, report.print(-1, "(1) What function is this " + input.get_student_name() + "?"); - if (didWork & input.get_check_for_nans()) + if (didWork & input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites(); + didWork = neutralsMag.check_for_nonfinites(); + } gGrid.calc_sza(planet, time); + mGrid.calc_sza(planet, time); + neutrals.calc_mass_density(); neutrals.calc_mean_major_mass(); neutrals.calc_specific_heat(); @@ -48,6 +56,15 @@ bool advance(Planets &planet, neutrals.calc_kappa_eddy(); neutrals.calc_cMax(); + neutralsMag.calc_mass_density(); + neutralsMag.calc_mean_major_mass(); + neutralsMag.calc_specific_heat(); + neutralsMag.calc_concentration(); + neutralsMag.calc_pressure(); + neutralsMag.calc_bulk_velocity(); + neutralsMag.calc_kappa_eddy(); + neutralsMag.calc_cMax(); + precision_t dtNeutral = neutrals.calc_dt(gGrid); precision_t dtIon = 100.0; time.calc_dt(dtNeutral, dtIon); @@ -59,9 +76,12 @@ bool advance(Planets &planet, // first neutrals.calc_scale_height(gGrid); + neutralsMag.calc_scale_height(mGrid); if (didWork) didWork = neutrals.set_bcs(gGrid, time, indices); + if (didWork) + didWork = neutralsMag.set_bcs(mGrid, time, indices); if (input.get_nAlts("GeoGrid") > 1) neutrals.advect_vertical(gGrid, time); @@ -69,7 +89,6 @@ bool advance(Planets &planet, if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites(); - // ------------------------------------ // Calculate source terms next: @@ -81,6 +100,14 @@ bool advance(Planets &planet, neutrals, ions, indices); + if (didWork) + didWork = calc_euv(planet, + mGrid, + time, + euv, + neutralsMag, + ionsMag, + indices); if (didWork) didWork = electrodynamics.update(planet, @@ -88,6 +115,12 @@ bool advance(Planets &planet, time, indices, ions); + if (didWork) + didWork = electrodynamics.update(planet, + mGrid, + time, + indices, + ionsMag); if (didWork) { @@ -95,10 +128,12 @@ bool advance(Planets &planet, ions.calc_ion_drift(neutrals, gGrid, time.get_dt()); calc_aurora(gGrid, neutrals, ions); + calc_aurora(mGrid, neutralsMag, ionsMag); // Calculate some neutral source terms: neutrals.calc_conduction(gGrid, time); chemistry.calc_chemistry(neutrals, ions, time, gGrid); + chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); if (input.get_O_cooling()) neutrals.calc_O_cool(); @@ -111,9 +146,12 @@ bool advance(Planets &planet, calc_neutral_friction(neutrals); neutrals.add_sources(time); + neutralsMag.add_sources(time); ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); + ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); + ionsMag.calc_electron_temperature(neutralsMag, mGrid); if (input.get_is_cubesphere()) neutrals.exchange_old(gGrid); @@ -135,6 +173,8 @@ bool advance(Planets &planet, if (didWork) didWork = output(neutrals, ions, gGrid, time, planet); + if (didWork) + didWork = output(neutralsMag, ionsMag, mGrid, time, planet); if (didWork) didWork = logfile.write_logfile(indices, neutrals, ions, gGrid, time); From 214c34fa758041831b4f3b71c76703300eb4a773 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:37:25 -0400 Subject: [PATCH 135/691] FEAT: gravity magnitude and dipole grid flag --- include/grid.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/grid.h b/include/grid.h index 724e3f7f..b4e5ecdc 100644 --- a/include/grid.h +++ b/include/grid.h @@ -104,6 +104,7 @@ class Grid { std::vector rad_unit_vcgc; arma_cube gravity_potential_scgc; std::vector gravity_vcgc; + arma_cube gravity_mag_scgc; std::vector cent_acc_vcgc; @@ -143,6 +144,9 @@ class Grid { void set_IsExperimental(bool value); bool get_IsExperimental(); + void set_IsDipole(bool value); + bool get_IsDipole(); + int64_t get_nPointsInGrid(); int64_t get_nX(); @@ -288,6 +292,7 @@ class Grid { bool HasBField; bool IsExperimental; bool IsMagGrid; + bool IsDipole = false; int64_t nX, nLons; int64_t nY, nLats; From dce1defebc30176e0efa94146a22315b82706f05 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:38:02 -0400 Subject: [PATCH 136/691] FEAT: dipole grid flag --- src/grid.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index 4f097b84..da598554 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -364,6 +364,14 @@ void Grid::set_IsExperimental(bool value) { IsExperimental = value; } +// -------------------------------------------------------------------------- +// Set whether the grid is a dipole grid +// -------------------------------------------------------------------------- + +void Grid::set_IsDipole(bool value) { + IsDipole = value; +} + // -------------------------------------------------------------------------- // Get total number of grid points // -------------------------------------------------------------------------- From bf20c59567133d4d371aa2b6ee7e193bb11f6b38 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:38:57 -0400 Subject: [PATCH 137/691] FEAT: dipole grid flag --- include/inputs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/inputs.h b/include/inputs.h index 906cd75a..bb8a3d96 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -88,6 +88,7 @@ class Inputs { struct grid_input_struct { std::string alt_file; bool IsUniformAlt; + bool IsDipole; precision_t alt_min; // Only really needed for Mag Field grid, since this could be overconstrained: precision_t alt_max; From c509502e9c3815f565c17ca69414080ad3e9ac0a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:40:19 -0400 Subject: [PATCH 138/691] FEAT: use gravity magnitude to calculate scale height --- src/aurora.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index 09a047a6..597dec7b 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -211,7 +211,7 @@ void calc_aurora(Grid grid, weighted_sum.set_size(nAlts); scale_height = cKB * neutrals.temperature_scgc / - (neutrals.mean_major_mass_scgc % abs(grid.gravity_vcgc[2])); + (neutrals.mean_major_mass_scgc % abs(grid.gravity_mag_scgc)); precision_t eflux; precision_t avee; From 2db68da1630eea3f0694f07be5f1b8d91757a9b0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:40:44 -0400 Subject: [PATCH 139/691] FEAT: use gravity magnitude to calculate scale height --- src/calc_neutral_derived.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index e6c50722..9a6bbb24 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -181,7 +181,7 @@ void Neutrals::calc_scale_height(Grid grid) { for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].scale_height_scgc = cKB * temperature_scgc / - (species[iSpecies].mass * abs(grid.gravity_vcgc[2])); + (species[iSpecies].mass * abs(grid.gravity_mag_scgc)); } // If we have eddy diffusion, the scale-heights need to be adjusted, @@ -213,7 +213,7 @@ void Neutrals::calc_scale_height(Grid grid) { // bulk scale height, assuming well mixed atmosphere: arma_cube bulkH = cKB * temperature_scgc / - (mmm * abs(grid.gravity_vcgc[2])); + (mmm * abs(grid.gravity_mag_scgc)); // percentage will go from 1 = use bulk scale, to 0 = use individual arma_cube percentage = kappa_eddy_scgc / input.get_eddy_coef(); @@ -505,7 +505,7 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].scale_height_scgc = cKB * temperature_scgc / - (species[iSpecies].mass * abs(grid.gravity_vcgc[2])); + (species[iSpecies].mass * grid.gravity_mag_scgc); xp3d = grid.radius_scgc / species[iSpecies].scale_height_scgc; y3d = sqrt(0.5 * xp3d) % abs(grid.cos_sza_scgc); From a02b9047127fff57b9b7ea631ea67ed8a0d1a701 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:41:43 -0400 Subject: [PATCH 140/691] FEAT: calculate magnitude of gravity --- src/fill_grid.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index a0f43fc7..094cc1e9 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -288,6 +288,10 @@ void Grid::calc_gravity(Planets planet) { gravity_vcgc[0] = - gravity_vcgc[0]; gravity_vcgc[1] = - gravity_vcgc[1]; gravity_vcgc[2] = - gravity_vcgc[2]; + gravity_mag_scgc = sqrt( + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); report.exit(function); return; From 6dcd08343687adbdab3d6a32de70e275d9953e1f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:43:52 -0400 Subject: [PATCH 141/691] FEAT: rotate to mag if grid is magnetic --- src/init_geo_grid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 689b96d4..8340d2e1 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -977,7 +977,7 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (input.get_is_cubesphere()) correct_xy_grid(planet); - if (IsExperimental) { + if (IsMagGrid) { std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(geoLon_scgc); llr.push_back(geoLat_scgc); From a35ccb741e8ac9b05b7b80dfddcb2bd2b07c0b41 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:45:26 -0400 Subject: [PATCH 142/691] FEAT: calculate magnitude of gravity and grid spacing --- src/init_mag_grid.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 0bb64f8a..cbb9621b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -824,7 +824,10 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { arma_cube bt = cos(magLat_scgc); arma_cube bm = sqrt(br % br + bt % bt); // Latitudinal direction of radial: - rad_unit_vcgc[1] = bt / bm % sign(magLat_scgc); + arma_cube s = sign(magLat_scgc); + s.elem( find(s == 0) ).ones(); + + rad_unit_vcgc[1] = bt / bm % s; rad_unit_vcgc[2] = - br / bm; precision_t mu = planet.get_mu(); @@ -832,6 +835,10 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; gravity_potential_scgc.set_size(nX, nY, nZ); gravity_potential_scgc.zeros(); + gravity_mag_scgc = sqrt( + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(magLon_scgc); @@ -853,6 +860,8 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; + calc_alt_grid_spacing(); + report.exit(function); return; From 266842e0461fd4bc987b1f22d2e58cd12f8321d3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:46:21 -0400 Subject: [PATCH 143/691] FEAT: Allow both dipole and spherical magnetic field grid --- src/inputs.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/inputs.cpp b/src/inputs.cpp index 129e310a..7c3f1baf 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -450,6 +450,9 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); grid_specs.alt_max = grid_specs.alt_max * cKMtoM; grid_specs.min_apex = grid_specs.min_apex * cKMtoM; + grid_specs.IsDipole = check_settings(gridtype, "IsDipole"); + } else { + grid_specs.IsDipole = false; } return grid_specs; From e0f3e9d23468d289747a03cc7126996bfa2bf66e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:46:50 -0400 Subject: [PATCH 144/691] STY: remove couts --- src/neutrals_ics.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index b9d3080f..0ba0afff 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -156,17 +156,12 @@ bool Neutrals::initial_conditions(Grid grid, } else temp1d = 200.0; - std::cout << "done with temps...\n"; - // Set the lower boundary condition: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.slice(0). fill(species[iSpecies].lower_bc_density); } - - std::cout << "done with fill...\n"; calc_scale_height(grid); - std::cout << "done with scale height...\n"; fill_with_hydrostatic(1, nAlts, grid); } // type = planet } From 045e6f67d005c1a429b4932b17cf88d32538b971 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 11 Jun 2024 13:48:07 -0400 Subject: [PATCH 145/691] FEAT: add in magnetic field grid and associated states --- src/main/main.cpp | 50 +++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index b17a8d5f..635e9601 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -88,40 +88,37 @@ int main() { // Find interpolation coefs for the ghostcells if cubesphere grid didWork = find_ghostcell_interpolation_coefs(gGrid); - // Make another grid, just to test things: - // Initialize Geographic grid: - Grid testGrid(input.get_nLons("GeoGrid"), - input.get_nLats("GeoGrid"), - input.get_nAlts("GeoGrid"), - nGeoGhosts); - testGrid.set_IsExperimental(true); - didWork = testGrid.init_geo_grid(quadtree, planet); - MPI_Barrier(aether_comm); - - if (!didWork) - throw std::string("init_geo_grid for test grid failed!"); - // Calculate centripetal acceleration, since this is a constant // vector on the grid: if (input.get_cent_acc()) gGrid.calc_cent_acc(planet); // Initialize Magnetic grid: - Grid mGrid(nMagLonsG, nMagLatsG, nMagAltsG, nMagGhosts); - mGrid.init_dipole_grid(quadtree, planet); - + Grid mGrid(input.get_nLons("MagGrid"), + input.get_nLats("MagGrid"), + input.get_nAlts("MagGrid"), + nMagGhosts); + + if (input.get_setting_bool("MagGrid", "IsDipole")) { + std::cout << "Making Dipole Grid\n"; + mGrid.set_IsDipole(true); + mGrid.init_dipole_grid(quadtree, planet); + mGrid.set_IsGeoGrid(false); + } else { + std::cout << "Making Spherical Magnetic Grid\n"; + mGrid.set_IsDipole(false); + didWork = mGrid.init_geo_grid(quadtree, planet); + mGrid.set_IsGeoGrid(false); + } // Initialize Neutrals on geographic grid: Neutrals neutrals(gGrid, planet, time, indices); // Initialize Neutrals on magnetic grid: - //Neutrals neutralsMag(mGrid, planet, time, indices); - // Initialize Neutrals on experimental grid: - Neutrals neutralsTest(mGrid, planet, time, indices); - + Neutrals neutralsMag(mGrid, planet, time, indices); // Initialize Ions on geographic grid: Ions ions(gGrid, planet); // Initialize Ions on magnetic grid: - Ions ionsTest(mGrid, planet); + Ions ionsMag(mGrid, planet); // ----------------------------------------------------------------- // This is a unit test for checking for nans and infinities. @@ -143,17 +140,20 @@ int main() { // Once EUV, neutrals, and ions have been defined, pair cross sections euv.pair_euv(neutrals, ions); + euv.pair_euv(neutralsMag, ionsMag); // Initialize Chemical scheme (including reading file): Chemistry chemistry(neutrals, ions); + Chemistry chemistryMag(neutralsMag, ionsMag); // Read in the collision frequencies and other diffusion coefficients: read_collision_file(neutrals, ions); + read_collision_file(neutralsMag, ionsMag); // Initialize ion temperatures from neutral temperature ions.init_ion_temperature(neutrals, gGrid); // Initialize ion temperatures from neutral temperature (on Mag Grid) - ionsTest.init_ion_temperature(neutralsTest, testGrid); + ionsMag.init_ion_temperature(neutralsMag, mGrid); // Initialize electrodynamics and check if electrodynamics times // works with input time @@ -174,7 +174,7 @@ int main() { // This is for the initial output. If it is not a restart, this will go: if (time.check_time_gate(input.get_dt_output(0))) { didWork = output(neutrals, ions, gGrid, time, planet); - didWork = output(neutralsTest, ionsTest, mGrid, time, planet); + didWork = output(neutralsMag, ionsMag, mGrid, time, planet); } if (!didWork) throw std::string("output failed!"); @@ -203,11 +203,15 @@ int main() { while (time.get_current() < time.get_intermediate()) { didWork = advance(planet, gGrid, + mGrid, time, euv, neutrals, + neutralsMag, ions, + ionsMag, chemistry, + chemistryMag, electrodynamics, indices, logfile); From aa62e9526bdc2b0461ff2cf337f3919f2bb31de6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:40:39 -0400 Subject: [PATCH 146/691] FEAT: add new logfile for iono grid --- include/advance.h | 3 ++- src/advance.cpp | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/include/advance.h b/include/advance.h index d50282a6..1885020a 100644 --- a/include/advance.h +++ b/include/advance.h @@ -45,6 +45,7 @@ bool advance(Planets &planet, Chemistry &chemistryMag, Electrodynamics &electrodynamics, Indices &indices, - Logfile &logfile); + Logfile &logfile, + Logfile &logfileMag); #endif // INCLUDE_ADVANCE_H_ diff --git a/src/advance.cpp b/src/advance.cpp index 8236d071..e9f42e54 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -23,7 +23,8 @@ bool advance(Planets &planet, Chemistry &chemistryMag, Electrodynamics &electrodynamics, Indices &indices, - Logfile &logfile) { + Logfile &logfile, + Logfile &logfileMag) { bool didWork = true; @@ -132,6 +133,8 @@ bool advance(Planets &planet, // Calculate some neutral source terms: neutrals.calc_conduction(gGrid, time); + + // Calculate chemistry on both grids: chemistry.calc_chemistry(neutrals, ions, time, gGrid); chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); @@ -178,6 +181,8 @@ bool advance(Planets &planet, if (didWork) didWork = logfile.write_logfile(indices, neutrals, ions, gGrid, time); + if (didWork) + didWork = logfileMag.write_logfile(indices, neutralsMag, ionsMag, mGrid, time); if (!didWork) report.error("Error in Advance!"); From e6ee21e23138e52e6ebcc69013974e8870456c4e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:42:28 -0400 Subject: [PATCH 147/691] FEAT: allow multiple log file names --- include/inputs.h | 1 + src/inputs.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/inputs.h b/include/inputs.h index bb8a3d96..9d101071 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -117,6 +117,7 @@ class Inputs { int iTimingDepth; std::string get_logfile(); + std::string get_logfile(int64_t iLog); std::vector get_species_vector(); bool get_logfile_append(); precision_t get_logfile_dt(); diff --git a/src/inputs.cpp b/src/inputs.cpp index 7c3f1baf..08dac066 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -579,6 +579,32 @@ std::string Inputs::get_logfile() { return logfile; } +// ----------------------------------------------------------------------- +// Return log file name +// ----------------------------------------------------------------------- + +std::string Inputs::get_logfile(int64_t iLog) { + std::string logfile = "log.txt"; + if (check_settings("Logfile", "name")) { + int64_t nLogs = settings.at("Logfile").at("name").size(); + if (nLogs == 1) { + logfile = settings.at("Logfile").at("name").at(iLog); + //logfile = get_setting_str("Logfile", "name"); + } else { + if (iLog > nLogs-1) { + report.error("Error in getting logfile name!"); + logfile = settings.at("Logfile").at("name").at(nLogs-1); + } else { + logfile = settings.at("Logfile").at("name").at(iLog); + } + } + } + if (nMembers > 1) + logfile = add_cmember(logfile); + + return logfile; +} + // ----------------------------------------------------------------------- // Return the name of specified variables as a vector // ----------------------------------------------------------------------- From ff14493cebbcdb69bc1b7cc046864a80e22288e2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:43:32 -0400 Subject: [PATCH 148/691] FEAT: add new logfile for iono grid --- include/logfile.h | 2 +- src/logfile.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/logfile.h b/include/logfile.h index 56620c94..1fe19d5d 100644 --- a/include/logfile.h +++ b/include/logfile.h @@ -100,7 +100,7 @@ class Logfile { * The logfile will output all indicies and specified neutrals and ions * every dt time. */ - Logfile(Indices &indices); + Logfile(Indices &indices, int64_t iLog); /** * \brief Close the file stream if not append diff --git a/src/logfile.cpp b/src/logfile.cpp index 7d5db759..2161970d 100644 --- a/src/logfile.cpp +++ b/src/logfile.cpp @@ -233,7 +233,7 @@ void Satellite::print() { // Initialize the Logfile //------------------------------------------------------------- -Logfile::Logfile(Indices &indices) { +Logfile::Logfile(Indices &indices, int64_t iLog) { // Read the settings for general log file and satellites // Write the header to the general logfile @@ -244,7 +244,7 @@ Logfile::Logfile(Indices &indices) { report.enter(function, iFunction); // Read the inputs - logfileName = input.get_logfile(); + logfileName = input.get_logfile(iLog); species = input.get_species_vector(); dt = input.get_logfile_dt(); doAppend = input.get_logfile_append(); From 688d1d1c5bf6e20a3e2e6237a001813985be8a23 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:44:16 -0400 Subject: [PATCH 149/691] FEAT: add more comments --- src/quadtree.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 73c93882..debd9a26 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -1,3 +1,15 @@ +// Copyright 2024, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +// Need to allow more types of grids. We have two axes of grids, really: +// - Neutral +// - Ion +// Within each of those, we can have several types of grids: +// - Cubesphere, this has 6 root nodes (2 polar, 4 equatorial) +// - Sphere, this has 1 root node (whole grid) +// - Sphere6, this is a spherical grid, but has 6 root nodes (2 lats, 3 lons) +// - Dipole, which may be the same as Sphere +// - Dipole4, which has 4 root nodes (4 lats, 1 lon) #include "aether.h" From 0ac2683510bb20276ac63afc0761ea54fbdaac0f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:45:09 -0400 Subject: [PATCH 150/691] FEAT: aurora needs to be initialized on each grid --- include/neutrals.h | 4 ++++ src/neutrals.cpp | 1 + 2 files changed, 5 insertions(+) diff --git a/include/neutrals.h b/include/neutrals.h index be0c0a01..0d024f21 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -216,6 +216,10 @@ class Neutrals { std::string temperature_name = "Temperature"; std::string temperature_unit = "K"; + // Keep track of whether the aurora species have been initialized: + bool auroraInitialized = false; + + // -------------------------------------------------------------------- // Functions: diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 376572c9..e75c5bc5 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -74,6 +74,7 @@ Neutrals::Neutrals(Grid grid, int iErr; bool didWork = true; species_chars tmp; + auroraInitialized = false; int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); From 77cd6c9c73017711fd86092c1a6386f00bd34ba7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:46:15 -0400 Subject: [PATCH 151/691] FEAT: aurora needs to be initialized on each grid --- src/aurora.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index 597dec7b..a58afcc9 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -32,12 +32,14 @@ void read_aurora(Neutrals &neutrals, //Set the auroral ion and neutral indices and coefficients int iNeutral_ = neutrals.get_species_id(csv[iLine][0]); int iIon_ = ions.get_species_id(csv[iLine][1]); + std::cout << "read_aurora : " << iLine << " " << iNeutral_ << "\n"; neutrals.species[iNeutral_].iAuroraIonSpecies_.push_back(iIon_); neutrals.species[iNeutral_].nAuroraIonSpecies++; neutrals.species[iNeutral_].Aurora_Coef = stod(csv[iLine][2]); } myFile.close(); + neutrals.auroraInitialized = true; } } @@ -155,9 +157,14 @@ void calc_aurora(Grid grid, static arma_vec auroral_energy_widths(nBins); std::vector Ci; - if (IsFirstTime) { + if (!neutrals.auroraInitialized) { // Initialize the aurora using the auroral csv file read_aurora(neutrals, ions); + } + + if (IsFirstTime) { + // Initialize the aurora using the auroral csv file + //read_aurora(neutrals, ions); precision_t lnE; @@ -225,7 +232,7 @@ void calc_aurora(Grid grid, // loop through each altitude and calculate ionization for (iLon = 0; iLon < nLons ; iLon++) { for (iLat = 0; iLat < nLats ; iLat++) { - + eflux = ions.eflux(iLon, iLat); // in ergs/cm2/s avee = ions.avee(iLon, iLat); // in keV @@ -312,7 +319,6 @@ void calc_aurora(Grid grid, ions.species[iIon_].ionization_scgc.tube(iLon, iLat); ions.species[iIon_].ionization_scgc.tube(iLon, iLat) = ionization_tube + ionization_species; - } // nAuroraIonSpecies } // if nAuroraIonSpecies > 0 } // nSpecies From faa156ed5657d8d2a1dea9628278cc5aa739ce8b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:46:51 -0400 Subject: [PATCH 152/691] FEAT: add new logfile for iono grid --- src/main/main.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 635e9601..d989f42c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -100,7 +100,6 @@ int main() { nMagGhosts); if (input.get_setting_bool("MagGrid", "IsDipole")) { - std::cout << "Making Dipole Grid\n"; mGrid.set_IsDipole(true); mGrid.init_dipole_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); @@ -191,7 +190,8 @@ int main() { // then a loop around that goes to the end time. Then, the code can // be made into a library and run externally. - Logfile logfile(indices); + Logfile logfile(indices, 0); + Logfile logfileMag(indices, 1); time.set_start_time_loop(); @@ -214,7 +214,8 @@ int main() { chemistryMag, electrodynamics, indices, - logfile); + logfile, + logfileMag); if (!didWork) throw std::string("Error in advance!"); From f2a4997568e45984f403a0a1f7e6558001b8faca Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:48:01 -0400 Subject: [PATCH 153/691] FEAT: fill grid with b-field --- src/init_mag_grid.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index cbb9621b..c2bcf670 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -724,7 +724,8 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { int64_t iLon, iLat, iAlt; - // This is just an example: + report.print(0, "Creating Dipole Grid"); + report.print(3, "Getting mgrid_inputs inputs in dipole grid"); Inputs::grid_input_struct grid_input = input.get_grid_inputs("MagGrid"); @@ -862,6 +863,9 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { calc_alt_grid_spacing(); + // Calculate magnetic field and magnetic coordinates: + fill_grid_bfield(planet); + report.exit(function); return; From dbe06af6cf54c6ca19752129cbd63770709e8a0a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:48:41 -0400 Subject: [PATCH 154/691] FEAT: more reporting --- src/init_geo_grid.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 8340d2e1..1b801566 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -942,13 +942,15 @@ bool Grid::init_geo_grid(Quadtree quadtree, bool DidWork = true; IsGeoGrid = 1; - IsCubeSphereGrid = input.get_is_cubesphere(); - if (input.get_is_cubesphere()) + if (input.get_is_cubesphere()) { + report.print(0, "Creating Cubesphere Grid"); create_cubesphere_connection(quadtree); - else + } else { + report.print(0, "Creating Spherical Grid"); create_sphere_connection(quadtree); + } if (input.get_do_restart() & !input.get_is_cubesphere()) { report.print(1, "Restarting! Reading grid files!"); @@ -978,6 +980,7 @@ bool Grid::init_geo_grid(Quadtree quadtree, correct_xy_grid(planet); if (IsMagGrid) { + report.print(0, "--> Grid is Magnetic, so rotating"); std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(geoLon_scgc); llr.push_back(geoLat_scgc); From 001f8cd4e6498f413888ca5fb0d5ec52e2690b3f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:49:09 -0400 Subject: [PATCH 155/691] FEAT: describing the grid --- doc/grid.md | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 doc/grid.md diff --git a/doc/grid.md b/doc/grid.md new file mode 100644 index 00000000..76bcf53c --- /dev/null +++ b/doc/grid.md @@ -0,0 +1,126 @@ + +# Grids in Aether + +Aether uses a 2d domain decomposition and the grid system is basically a 3D i, j, k system, meaning that the arrays within Aether are 3D arrays. Aether decomposes the grid in the first 2 dimensions (i and j) using a quadtree structure, while the 3rd dimension is left alone and each processor solves for the entire 3rd dimension. + +Practically, what this means is that Aether uses powers of 4 to specify the grid system. When you ask for 4x the number of processors it doubles the resolution in i and j. You can't double in i or j independently. + +Aether using root nodes, which specify the smallest number of processors that can be run on. For example, the simple "Sphere" grid has one root node that handles the entire Earth (in latitude and longitude). If the resolution needs to be doubles, 4 processors can be asked for. If the resolution is doubled again, 16 processors are needed. Etc. However, in the altitude/radial direction, the number of points that are specified in the aether.json is never doubled when more processors are asked for. + +## Grid Types Explained + +Aether has two types of grid systems - the neutral grid (NeuGrid) and the ion grid (IonGrid). For each type of constituent (neutral or ion), their primary grid is the one where most of the equations are solved, and then they are passed to the other grid. For example, the neutral winds are solved for on the NeuGrid, and then passed onto the IonGrid in order to calculate source terms for the ions. As another example, the ion advection is solved for on the ion grid. The ion densities are then passed to the neutral grid, where the source terms for the neutrals are calculated. + +These grids can be identical or nearly identical. If they are, then it is best to have them on a neutral type of grid, since the stability of the neutrals along the 3rd dimension (where gravity is prime) is hard to achieve. + +The neutral grid system typically has its third axis aligned (mostly) with the radial direction. This is to allow special solvers to treat gravity and the gradient in pressure in a special way. There are two issues with solving the neutrals in the third dimension: (1) often, the top of thermosphere models are supposed to be the exosphere, which means that they can't extend too far in the vertical direction; and (2) a problem with neutral solvers that can solve the full momentum equation in the third dimension is that they struggle with having too many scale heights in a domain. These limit the full height of the model domain for the neutrals. + +For the ions, with systems that have magnetic fields, the plasma often moves up fieldlines on the dayside and down fieldlines on the nightside. This transport is often above the top of the neutral grid. Further, the ions are often structured by the magnetic field, making this the natural coordinate system. For planets without magnetic fields, a grid similar to the neutrals may be useful. The ion grid can extend above and below the neutral grid with both a magnetic-field-aligned grid and a spherical grid. + +## Grid Shapes Explained + +Aether currently has three basic grid shapes: spherical, cubesphere, and dipole. The spherical grid is a (i, j, k) = (longitude, latitude, altitude) system, with these being (mostly) orthogonal to each other. This grid system can simulate a sub-region of the Earth if desired. + +### TL;DR + +The user needs to specify the shape of the grid, which specifies the grid shape and the number of root nodes. Shapes include: sphere (1 root node), sphere6 (6 root nodes), cubesphere (6 root nodes), dipole (1 root node), dipole4 (4 root nodes), and dipole6 (6 root nodes). + +### The Cubesphere Grid + +The cubesphere grid is composed of 6 different faces, similar to a cube, but where each cube "face" is pushed out to form a sphere. The corners of the cube intersect the sphere, and all of the other grid points on the cube are pushed out to form the cube. One cube face defines the southern polar region, one face defines the northern polar region, and the other four faces are spaced in longitude around the equatorial region. For the cubesphere grid, the (k) dimension is altitude. The (i, j) system is set up so that (i) is considered left-right on the cube face, while (j) is up-down. For the four faces around the equator, (i, j) is roughly (lon, lat), but not exactly. For the polar faces, the relationship between (i, j) and longitude, latitude is much more complex. + +For both the spherical grid and the cubesphere grid, the altitudes (k) can be stretched or uniform. A lower boundary is set and the delta-altitude is specified as either a constant distance or a constant percentage of the bulk scale-height. + +### The Dipole Grid + +The dipole grid is aligned with the magnetic field. The (k) dimension is along the fieldline, (i) is magnetic longitude, and (j) is roughly latitude for the bottom of the field-line. Each field-line starts at the lowest altitude and curves towards the equator. In the northern hemisphere, this means that the field-lines curve south, while in the southern hemisphere, they curve north. The latitudinal spacing is such that there is a dependence on the L-shell (i.e., the equatorial radial extent of the field-line). Along the (k) dimension, field-lines either terminate when they reach the equatorial plane, forming half of a full field-line or they terminate at the highest point specified in the aether.json file. Any grid point with an L-shell less than the peak altitude will terminate in the equatorial plane, while any field-line that has an L-shell above the peak altitude will simply terminate. Field-lines that terminate in the equatorial plane have corresponding field-lines in the other hemisphere, so ghostcells are used to pass information back and forth. Field-lines that terminate at the maximum altitude have vertical boundary conditions set in the ghost cells. + +The transition from the "closed" field-line region to the "open" field-line region is a natural break point in the grid. The transition between these regions can be handled with ghostcells in the "latitudinal" direction. Therefore it makes the most sense to have have 4 distinct regions in "latitude": south open, south closed, north closed, north open. The message passing is treated differently at the boundaries between each of these regions. + +### Root Nodes + +A fundamental assumption with in Aether is that each processor does computation on one and only one block. This means that each processor does not deal with multiple blocks, and therefore the distribution of blocks across processors has to match exactly. This document uses the words "block" and "node" somewhat interchangably. Technically, a "block" is single (i, j, k) grid, while a "node" can be multiple "blocks" that make up a section of the globe. + +Aether uses a quadtree system to subdivide and distribute the grids (or blocks) across processors. This means that when an additional level of refinement is desired, an individual block is split in 4 - the number of blocks is doubled in both (i) and (j). The question then is - how many blocks to start with? These are the root nodes. + +For the whole globe sphere shape, there is one single root node, which allows users to run the code on a single processor. When a user asks for one processor using the sphere shape, there is only one single block, which is the root node, which spans then entire globe. When the user asks for four processors using the sphere shape, the number of blocks in latitude are doubled and the number of blocks in longitude are doubled. There is still only one root node, but the number of blocks is four, with 2 in the longitudinal direction and 2 in the latitudinal direction. If the user asks for 16 processors using the sphere shape, the blocks are sub-divided again, with sill one single root node, and 16 blocks - four in the longitudinal direction and four in the altitudinal direction. With a sphere grid, the number of processors that can be used to specify the grid are then: 1, 4, 16 (=4^2), 64 (=4^3), 256 (=4^4), 1024 (=4^5), etc. + +With a cubesphere grid, there are six root nodes, meaning that the code needs six processors to run on just to start. Each root node is a face of the cubesphere. If the user asks for 24 processors (i.e., 6 root nodes that are each divided into four blocks each), each root node is split in half along the left-right direction and the up-down direction. For a cubesphere grid, the number of processors that can be used to specify the grid are then: 6, 24 (= 6 * 4), 96 (6 * 4^2), 384 (6 * 4^3), etc. + +The root nodes indicate the span of the grid that they cover. This is done in a header file. In order to accomplish this, the lower-left corner location (ORGINS) is specified as well the span of the root node in the left-to-right (i) direction (RIGHTS) and in the (j) down-to-up direction (UPS). The easiest example is here: +```bash +namespace Sphere { + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat UPS = { + {0.0, 1.0, 0.0} + }; +}; +``` + +Since the sphere goes from -90 deg to +90 deg in latitude, and 0 deg to 360 deg in longitude, and pi is the normalizer, then the grid should go from -0.5 to 0.5 in the UPS direction, so the ORIGIN is placed at -0.5 and the span is 1.0. In the longitudinal direction, the grid should go from 0 - 2, so the ORIGIN is placed at 0.0 and the span is 2.0. + +This could be altered to have two root nodes. If someone wanted the root node to be "square" in that the lat and lon spans are the same, this could be done: +```bash +namespace Sphere2 { + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 1.0, -0.5, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat UPS = { + {0.0, 1.0, 0.0}, + {0.0, 1.0, 0.0} + }; +}; +``` +Notice that the namespace is different, so that it can be unique. In this case, there are two ORGINS (offset by 1.0 in longitude), two RIGHTS (which are the same), and two UPS (which are the same). + +In both of these examples, the third dimension doesn't change. This is because a single altitude in a spherical grid can be fully described with two variables (lat and lon). For a cubesphere grid, on the other hand, there are three variables that are needed - each face is in an XY, XZ, or YZ plane, so all three (X, Y, and Z) are needed. The 6 root nodes for the cubesphere are specified in the cubesphere.h header file. + +## Specifying the Grid + +There are many different components to specifying the actual grid that is desired, namely: +- Min and Max latitude +- Min and Max longitude +- Min Altitude, whether a stretched altitude is desired, and the altitudinal spacing + +In addition, the number of grid points that should be used in each block are specified: +- nLons or nX - number of grid cells per block in the i direction +- nLats or nY - number of grid cells per block in the j direction +- nAlts or nZ - total number of grid cells in the block in the k direction + +For some grid shapes (Sphere and Dipole), the total number of grid cells in the i and j direction can be determined by, for example, multiplying the number of blocks in the i direction by the number of cells in each block in the i direction. So, with a spherical grid with one root node, and 256 processors used, the number of blocks in the i and j direction is (256 = 4 * 4 * 4 * 4. breaking it into both directions - (2*2) * (2*2) * (2*2) * (2*2) or (2 * 2 * 2 * 2) * (2 * 2 * 2 * 2) or 16 x 16) 16 and 16. So, the total number of blocks in the i direction is 16 * nLons and in the j direction is 16 * nLats. + +For the cubesphere grid, the nX and nY are the number of grid cells in the i and j direction. At this time, these have to be identical in order to have the grid cells match up along the boundaries to the top and bottom nodes. The resolution of the Cubesphere grid is roughly 360 deg / (4 * nX * sqrt(nProc/6)). For example, if nX = 18, and 24 processors are requested, then the resolution = 360 / (4 * 18 * sqrt(4)) = 360 / (72 * 2) = 2.5 deg. As another example, to make a grid with 1 deg resolution, with 96 processors, nX would have to be 1 = 360 / (4 * nX * 4) = 22.5 / nX, so nX has to be around 22. (If nX were 22, and nProc = 96, then the resolution would be 1.02 deg). + +In all grids, the nAlts or nZ are not parallelized, so the number of points in the k direction is what is specified. For the sphere and cubesphere grids, this is the number of altitude points. On the dipole grid, this is the number of points along the dipole flux tube. + + + + +```bash + "NeuGrid" : { + "Shape" : + "MinLat" : -90.0, + "MaxLat" : 90.0, + "MinLon" : 0.0, + "MaxLon" : 360.0, + "MinAlt" : 100.0, + "dAlt" : 5.0, + "AltFile" : "", + "IsUniformAlt" : true}, +``` \ No newline at end of file From 6d4997ab83b342c751f80c94a69d42de7aef3d90 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 07:58:15 -0400 Subject: [PATCH 156/691] FEAT: small edits --- doc/grid.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/doc/grid.md b/doc/grid.md index 76bcf53c..5872e6d2 100644 --- a/doc/grid.md +++ b/doc/grid.md @@ -25,6 +25,10 @@ Aether currently has three basic grid shapes: spherical, cubesphere, and dipole. The user needs to specify the shape of the grid, which specifies the grid shape and the number of root nodes. Shapes include: sphere (1 root node), sphere6 (6 root nodes), cubesphere (6 root nodes), dipole (1 root node), dipole4 (4 root nodes), and dipole6 (6 root nodes). +### The Sphere Grid + +The sphere grid is a normal longitude, latitude, altitude grid. + ### The Cubesphere Grid The cubesphere grid is composed of 6 different faces, similar to a cube, but where each cube "face" is pushed out to form a sphere. The corners of the cube intersect the sphere, and all of the other grid points on the cube are pushed out to form the cube. One cube face defines the southern polar region, one face defines the northern polar region, and the other four faces are spaced in longitude around the equatorial region. For the cubesphere grid, the (k) dimension is altitude. The (i, j) system is set up so that (i) is considered left-right on the cube face, while (j) is up-down. For the four faces around the equator, (i, j) is roughly (lon, lat), but not exactly. For the polar faces, the relationship between (i, j) and longitude, latitude is much more complex. @@ -39,7 +43,7 @@ The transition from the "closed" field-line region to the "open" field-line regi ### Root Nodes -A fundamental assumption with in Aether is that each processor does computation on one and only one block. This means that each processor does not deal with multiple blocks, and therefore the distribution of blocks across processors has to match exactly. This document uses the words "block" and "node" somewhat interchangably. Technically, a "block" is single (i, j, k) grid, while a "node" can be multiple "blocks" that make up a section of the globe. +A fundamental assumption within Aether is that each processor does computation on one and only one block. This means that each processor does not deal with multiple blocks, and therefore the distribution of blocks across processors has to match exactly. This document uses the words "block" and "node" somewhat interchangably. Technically, a "block" is single (i, j, k) grid, while a "node" can be multiple "blocks" that make up a section of the globe. Aether uses a quadtree system to subdivide and distribute the grids (or blocks) across processors. This means that when an additional level of refinement is desired, an individual block is split in 4 - the number of blocks is doubled in both (i) and (j). The question then is - how many blocks to start with? These are the root nodes. @@ -103,10 +107,14 @@ In addition, the number of grid points that should be used in each block are spe - nLats or nY - number of grid cells per block in the j direction - nAlts or nZ - total number of grid cells in the block in the k direction +### Horizontal Resolution + For some grid shapes (Sphere and Dipole), the total number of grid cells in the i and j direction can be determined by, for example, multiplying the number of blocks in the i direction by the number of cells in each block in the i direction. So, with a spherical grid with one root node, and 256 processors used, the number of blocks in the i and j direction is (256 = 4 * 4 * 4 * 4. breaking it into both directions - (2*2) * (2*2) * (2*2) * (2*2) or (2 * 2 * 2 * 2) * (2 * 2 * 2 * 2) or 16 x 16) 16 and 16. So, the total number of blocks in the i direction is 16 * nLons and in the j direction is 16 * nLats. For the cubesphere grid, the nX and nY are the number of grid cells in the i and j direction. At this time, these have to be identical in order to have the grid cells match up along the boundaries to the top and bottom nodes. The resolution of the Cubesphere grid is roughly 360 deg / (4 * nX * sqrt(nProc/6)). For example, if nX = 18, and 24 processors are requested, then the resolution = 360 / (4 * 18 * sqrt(4)) = 360 / (72 * 2) = 2.5 deg. As another example, to make a grid with 1 deg resolution, with 96 processors, nX would have to be 1 = 360 / (4 * nX * 4) = 22.5 / nX, so nX has to be around 22. (If nX were 22, and nProc = 96, then the resolution would be 1.02 deg). +### Vertical Resolution + In all grids, the nAlts or nZ are not parallelized, so the number of points in the k direction is what is specified. For the sphere and cubesphere grids, this is the number of altitude points. On the dipole grid, this is the number of points along the dipole flux tube. From 117dee0b45233147776c8cd9e3e5c8a314ce9bf4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 08:32:51 -0400 Subject: [PATCH 157/691] BUG: forgot removed stray } --- share/run/UA/inputs/defaults.json | 87 ++++++++++++++++--------------- 1 file changed, 44 insertions(+), 43 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 3093626d..aade39a0 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -21,16 +21,16 @@ "type" : "Planet"}, "Advection" : { - "Neutrals" : { - "Vertical" : "rusanov", - "Horizontal" : "default"}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, + "Neutrals" : { + "Vertical" : "rusanov", + "Horizontal" : "default"}, + "Ions" : { + "Along" : "rusanov", + "Across" : "default"} }, "Student" : { - "name" : "", - "is" : false }, + "name" : "", + "is" : false }, "Planet" : { "name" : "earth", @@ -39,18 +39,18 @@ "BField" : "dipole", "Electrodynamics" : { - "Potential" : "weimer", - "DiffuseAurora" : "fta", - "Dir" : "UA/inputs/ext/ie/", - "File" : ""}, + "Potential" : "weimer", + "DiffuseAurora" : "fta", + "Dir" : "UA/inputs/ext/ie/", + "File" : ""}, "Euv" : { - "doUse" : true, - "Model" : "euvac", - "File" : "UA/inputs/euv.csv", - "IncludePhotoElectrons" : true, - "HeatingEfficiency" : 0.05, - "dt" : 60.0}, + "doUse" : true, + "Model" : "euvac", + "File" : "UA/inputs/euv.csv", + "IncludePhotoElectrons" : true, + "HeatingEfficiency" : 0.05, + "dt" : 60.0}, "DoCalcBulkIonTemp" : false, @@ -65,39 +65,40 @@ "EndTime" : [2011, 3, 20, 0, 10, 0], "GeoBlockSize" : { - "nLons" : 36, - "nLats" : 36, - "nAlts" : 50}, + "nLons" : 36, + "nLats" : 36, + "nAlts" : 50}, "GeoGrid" : { - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, - "MinAlt" : 100.0, - "dAlt" : 5.0, + "MinLat" : -90.0, + "MaxLat" : 90.0, + "MinLon" : 0.0, + "MaxLon" : 360.0, + "MinAlt" : 100.0, + "dAlt" : 5.0, "AltFile" : "", - "IsUniformAlt" : true}, + "IsUniformAlt" : true}, "MagBlockSize" : { - "nLons" : 18, - "nLats" : 20, - "nAlts" : 200}, - + "nLons" : 20, + "nLats" : 20, + "nAlts" : 80}, + "MagGrid" : { - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, - "MinAlt" : 100.0, - "MaxAlt" : 5000.0, - "MinApex" : 120.0, - "dAlt" : 5.0, + "MinLat" : -90.0, + "MaxLat" : 90.0, + "MinLon" : 0.0, + "MaxLon" : 360.0, + "MinAlt" : 100.0, + "MaxAlt" : 5000.0, + "MinApex" : 120.0, + "dAlt" : 5.0, "AltFile" : "", - "IsUniformAlt" : true}, + "IsDipole" : true, + "IsUniformAlt" : false}, "CubeSphere" : { - "is" : false}, + "is" : false}, "Oblate" : { "isOblate" : false, @@ -125,7 +126,7 @@ "OnmiwebFile" : [""], "Logfile" : { - "name" : "UA/output/log.txt", + "name" : ["UA/output/log_geo.txt", "UA/output/log_mag.txt"], "append" : false, "dt" : 10.0, "species" : ["O2", "O2+"]}, From 60a68f0dacb0f1a2a3d2ba2c2437265cbb8e705f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 08:33:28 -0400 Subject: [PATCH 158/691] FEAT: output settings --- src/inputs.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/inputs.cpp b/src/inputs.cpp index 08dac066..43712925 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -64,6 +64,11 @@ Inputs::Inputs(Times &time) { // Now read the input file: isOk = read_inputs_json(time); + if (report.test_verbose(1)) { + std::cout << "Settings read in:\n"; + std::cout << std::setw(2) << settings; + } + if (!isOk && iProc == 0) std::cout << "Error in reading input file!\n"; } From d6c263c7924ea3e81c9a0f3213c1da155d88995c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 08:35:04 -0400 Subject: [PATCH 159/691] MAINT: remove cout --- src/aurora.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index a58afcc9..3e7e3a81 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -32,7 +32,6 @@ void read_aurora(Neutrals &neutrals, //Set the auroral ion and neutral indices and coefficients int iNeutral_ = neutrals.get_species_id(csv[iLine][0]); int iIon_ = ions.get_species_id(csv[iLine][1]); - std::cout << "read_aurora : " << iLine << " " << iNeutral_ << "\n"; neutrals.species[iNeutral_].iAuroraIonSpecies_.push_back(iIon_); neutrals.species[iNeutral_].nAuroraIonSpecies++; neutrals.species[iNeutral_].Aurora_Coef = stod(csv[iLine][2]); From 5888836d6997471d217e8a4276c4510d6daf5faa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 08:37:02 -0400 Subject: [PATCH 160/691] STY: output when reading chemistry file --- src/chemistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chemistry.cpp b/src/chemistry.cpp index 4d90a1aa..c9598c0a 100644 --- a/src/chemistry.cpp +++ b/src/chemistry.cpp @@ -381,7 +381,7 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, std::vector errors; - report.print(1, "Reading Chemistry File : " + input.get_chemistry_file()); + report.print(0, "Reading Chemistry File : " + input.get_chemistry_file()); infile_ptr.open(input.get_chemistry_file()); if (!infile_ptr.is_open()) { From 567374ff82f3c53d699916446c5b2b607ba8d573 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 16:01:19 -0400 Subject: [PATCH 161/691] FEAT: test the dipole grid in 2D in python --- edu/examples/Dipole/dipole.py | 105 ++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 edu/examples/Dipole/dipole.py diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py new file mode 100755 index 00000000..3d372177 --- /dev/null +++ b/edu/examples/Dipole/dipole.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python3 + +import matplotlib.pyplot as plt +import numpy as np + +def get_lshell(x, y, z): + # x, y, z need to be normalized to radius of planet! + + xy = np.sqrt(x * x + y * y) + xyz = np.sqrt(x * x + y * y + z * z) + cosLat = xy / xyz + lshell = 1.0 / (cosLat * cosLat) + return lshell + +def get_lshell_sphere(lat, r): + # r needs to be normalized to radius of planet! + cosLat = np.cos(lat) + lshell = r / (cosLat * cosLat) + return lshell + +def get_lat_from_r_and_lshell(r, lshell): + cosLat = np.sqrt(r / lshell) + cosLat[cosLat > 1] = 1.0 + cosLat[cosLat < -1] = -1.0 + lat = np.arccos(cosLat) + return lat + +def get_bfield(lat, r): + # r should be normalized to radius of planet + # b is normalized to Bequator at surface + oor3 = (1.0 / r)**3 + br = -2 * oor3 * np.cos(lat) + bt = -1 * oor3 * np.sin(lat) + return bt, br + +def get_uniform_spacing(lat, rmin, rmax, nPts): + lshell = get_lshell_sphere(lat, 1.0) + print('building field line for lat : ', lat) + print(' --> lshell : ', lshell) + if (lshell < rmax): + rmax = lshell + print(' --> lshell is limiter!') + else: + print(' --> rmax is limiter : ', rmax) + r = np.linspace(rmin, rmax, num = nPts) + return r + +def get_r3_spacing(lat, rmin, rmax, nPts): + lshell = get_lshell_sphere(lat, 1.0) + print('building field line for lat : ', lat) + print(' --> lshell : ', lshell) + if (lshell < rmax): + rmax = lshell + print(' --> lshell is limiter!') + else: + print(' --> rmax is limiter : ', rmax) + + r1 = rmin**(1.0/3.0) + r2 = rmax**(1.0/3.0) + r3 = np.linspace(r1, r2, num = nPts) + r = r3**3 + return r + +#------------------------------------------------------------------------ +# Main code is here: +#------------------------------------------------------------------------ + +nPts = 20 +rEarth = 6372.0 +altMin = 100.0 +altMax = 3*rEarth + +rMin = (rEarth + altMin) / rEarth +rMax = (rEarth + altMax) / rEarth + +fig = plt.figure(figsize = (10,10)) +ax = fig.add_axes([0.1,0.1,0.8,0.8]) + + +baseLats = np.arange(-80, 90, 10) + +for baseLat in baseLats: + + lat = baseLat * np.pi / 180.0 + lshell = get_lshell_sphere(lat, 1.0) + print('lshell : ', lshell) + r = get_r3_spacing(lat, rMin, rMax, nPts) + + lats = get_lat_from_r_and_lshell(r, lshell) + if (baseLat < 0): + lats = -lats + + x = r * np.cos(lats) + z = r * np.sin(lats) + + ax.plot(x, z) + +ax.set_ylim([-rMax*1.1, rMax*1.1]) +ax.set_xlim([-rMax*1.1, rMax*1.1]) +ax.set_aspect(1.0) + +plotfile = 'test.png' +print('Writing plot : ', plotfile) +fig.savefig(plotfile) +plt.close() From 83ac7d65d484c5a0596a99388de16729d49edc27 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 22 Jul 2024 16:01:58 -0400 Subject: [PATCH 162/691] FEAT: more details on grid specification --- doc/grid.md | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/doc/grid.md b/doc/grid.md index 5872e6d2..b7b76eb3 100644 --- a/doc/grid.md +++ b/doc/grid.md @@ -9,7 +9,7 @@ Aether using root nodes, which specify the smallest number of processors that ca ## Grid Types Explained -Aether has two types of grid systems - the neutral grid (NeuGrid) and the ion grid (IonGrid). For each type of constituent (neutral or ion), their primary grid is the one where most of the equations are solved, and then they are passed to the other grid. For example, the neutral winds are solved for on the NeuGrid, and then passed onto the IonGrid in order to calculate source terms for the ions. As another example, the ion advection is solved for on the ion grid. The ion densities are then passed to the neutral grid, where the source terms for the neutrals are calculated. +Aether has two types of grid systems - the neutral grid (neuGrid) and the ion grid (ionGrid). For each type of constituent (neutral or ion), their primary grid is the one where most of the equations are solved, and then they are passed to the other grid. For example, the neutral winds are solved for on the NeuGrid, and then passed onto the IonGrid in order to calculate source terms for the ions. As another example, the ion advection is solved for on the ion grid. The ion densities are then passed to the neutral grid, where the source terms for the neutrals are calculated. These grids can be identical or nearly identical. If they are, then it is best to have them on a neutral type of grid, since the stability of the neutrals along the 3rd dimension (where gravity is prime) is hard to achieve. @@ -118,17 +118,36 @@ For the cubesphere grid, the nX and nY are the number of grid cells in the i and In all grids, the nAlts or nZ are not parallelized, so the number of points in the k direction is what is specified. For the sphere and cubesphere grids, this is the number of altitude points. On the dipole grid, this is the number of points along the dipole flux tube. - - ```bash - "NeuGrid" : { - "Shape" : - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, + "neuGrid" : { + "Shape" : "sphere", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 50, "MinAlt" : 100.0, - "dAlt" : 5.0, - "AltFile" : "", - "IsUniformAlt" : true}, -``` \ No newline at end of file + "dAltkm" : 5.0, + "dAltScale" : 0.25, + "IsUniformAlt" : true, + "AltFile" : ""}, +``` + +```bash + "ionGrid" : { + "Shape" : "dipole", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 200, + "MinAlt" : 80.0, + "MinApex" : 120.0, + "MaxAlt" : 5000.0}, +``` + +The dipole grid has both open field-lines and closed field-lines. The closed field-lines are near the equator, while the open field-lines are near the poles. The variable "MaxAlt" sets where this differentiation occurs - if the apex of the field-line is above this altitude, then it is open. All field-lines in Aether start are the "MinAlt" and rise along a dipolar shape until they either encounter the equatorial plane or "MaxAlt". In the south, these field-lines tilt towards the north (from MinAlt to MaxAlt) and in the north, the field-lines tilt towards the south (from MinAlt to MaxAlt). +- The spacing is uniform in longitude. +- The spacing along the field-line has non-uniform spacing. +- The spacing in latitude is non-uniform. + From 98966bd1238c00fcff0c08611c943f4e11b5c030 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Jul 2024 07:53:34 -0400 Subject: [PATCH 163/691] STY: report when reading file --- src/read_collision_file.cpp | 2 +- src/read_netcdf_electrodynamics.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/read_collision_file.cpp b/src/read_collision_file.cpp index 4d381df3..a2674699 100644 --- a/src/read_collision_file.cpp +++ b/src/read_collision_file.cpp @@ -24,7 +24,7 @@ void read_collision_file(Neutrals &neutrals, std::string hash; int iErr = 0; - report.print(1, "Reading Collision File : " + input.get_collision_file()); + report.print(0, "Reading Collision File : " + input.get_collision_file()); infile_ptr.open(input.get_collision_file()); diff --git a/src/read_netcdf_electrodynamics.cpp b/src/read_netcdf_electrodynamics.cpp index cea916f7..d080f18e 100644 --- a/src/read_netcdf_electrodynamics.cpp +++ b/src/read_netcdf_electrodynamics.cpp @@ -135,7 +135,7 @@ void Electrodynamics::read_netcdf_electrodynamics_file(std::string filename) { std::vector energy_flux_struct, average_energy_struct; std::vector ion_energy_flux_struct, ion_average_energy_struct; - report.print(1, "Reading Electrodynamics file : " + filename); + report.print(0, "Reading Electrodynamics file : " + filename); FILE *infile; char* char_arr; From 2eb163bf3f70ebf0923181d6bf45f28e0d91cb05 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Jul 2024 07:55:38 -0400 Subject: [PATCH 164/691] FEAT: change the naming structure of grid shapes --- include/grid.h | 15 +- include/inputs.h | 601 ++++++++++++++++++++++++++++-- share/run/UA/inputs/defaults.json | 56 ++- share/run/aether.json | 7 +- src/advance.cpp | 7 +- src/calc_neutral_derived.cpp | 6 +- src/grid.cpp | 70 +++- src/init_geo_grid.cpp | 31 +- src/init_mag_grid.cpp | 11 +- src/init_parallel.cpp | 6 +- src/inputs.cpp | 98 +++-- src/main/main.cpp | 17 +- src/neutrals_bcs.cpp | 4 +- src/quadtree.cpp | 19 +- src/solver_gradients.cpp | 2 +- 15 files changed, 770 insertions(+), 180 deletions(-) diff --git a/include/grid.h b/include/grid.h index b4e5ecdc..60935fcb 100644 --- a/include/grid.h +++ b/include/grid.h @@ -15,6 +15,11 @@ class Grid { public: + const int iSphere_ = 1; + const int iCubesphere_ = 2; + const int iDipole_ = 3; + int iGridShape_ = -1; + // Armidillo Cube Versions: // Cell Center Coordinates arma_cube geoLon_scgc, geoX_scgc; @@ -136,7 +141,8 @@ class Grid { arma_cube bfield_mag_scgc; std::vector bfield_unit_vcgc; - Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in); + Grid(std::string gridtype); + void set_variable_sizes(); bool get_IsGeoGrid(); bool get_HasBField(); @@ -152,11 +158,18 @@ class Grid { int64_t get_nX(); int64_t get_nY(); int64_t get_nZ(); + int64_t get_nX(bool includeGCs); + int64_t get_nY(bool includeGCs); + int64_t get_nZ(bool includeGCs); int64_t get_nLons(); int64_t get_nLats(); int64_t get_nAlts(); + int64_t get_nLons(bool includeGCs); + int64_t get_nLats(bool includeGCs); + int64_t get_nAlts(bool includeGCs); + int64_t get_nGCs(); void fill_grid(Planets planet); diff --git a/include/inputs.h b/include/inputs.h index 9d101071..7fc5d70d 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -7,168 +7,700 @@ #include #include +/* + This is the input class for Aether. It handles all of the specification of + parameters and inputs into Aether. Some major features: + - Aether handles a lot of inputs and outputs in json and CSV files + - The settings variable is the main variable for controlling the settings + - The settings variable is a json (like a python dictionary) + - This class uses public "get" functions to access settings, which are private + - The get functions have a naming standard that depends on the structure of the json +*/ + class Inputs { public: + int iVerbose; + int iVerboseProc; + int iTimingDepth; + + // ------------------------------ + // Grid inputs: + + struct grid_input_struct { + // Set the grid size (per block) + // nX is nLonsPerBlock or nXsPerBlock + // nY is nLatsPerBlock or nYsPerBlock + // nZ is nAlts or nZs + int64_t nX, nY, nZ; + + // min and max latitude to simulate: + precision_t lat_min, lat_max; + // min and max longitude to simulate: + precision_t lon_min, lon_max; + + // The shape of the grid can be specified: + // - "sphere", sets grid.iGridShape_ = iSphere_ + // - "cubesphere", sets grid.iGridShape_ = iCubesphere_ + // - "dipole", sets grid.iGridShape_ = iDipole_ + std::string shape; + + // Minimum altitude to simulate: + precision_t alt_min; + // Some grids allow the specification of the maximum altitude: + precision_t alt_max; + + // Can specify the delta-altitude in either km or in scale-heights. + // daltKm is used if there is a uniform grid + // daltScale (0-1, typical) is used non-uniform + precision_t daltKm, daltScale; + // if IsUniformAlt is false, the code uses a temperature profile to + // build an altitude profile of scale heights and uses these scale + // heights to build the grid. + bool IsUniformAlt; + + // Only needed for Mag Field grid: + precision_t min_apex; + + // Some grid shapes allow specification of altitudes based on a file: + std::string alt_file; + }; + + grid_input_struct get_grid_inputs(std::string gridtype); + + + + + /********************************************************************** + \brief + \param + **/ Inputs() {} + + /********************************************************************** + \brief + \param + **/ Inputs(Times &time); + + /********************************************************************** + \brief + \param + **/ int read(Times &time); + + /********************************************************************** + \brief + \param + **/ bool read_inputs_json(Times &time); + + /********************************************************************** + \brief + \param + **/ bool set_verbose(json in); + + // -------------------------------------------------------------------- + // get functions: + // - These functions offer access to specific parts of the settings json. + // - They call the general functions that check whether the key(s) exists. + // - If the key does not exist, an error flag (in report) is set. + // - + // -------------------------------------------------------------------- + + // --------------------- + // Debugging information + // --------------------- + + /********************************************************************** + \brief returns settings["Debug"]["iVerbose"] + \param none + **/ int get_verbose(); + + /********************************************************************** + \brief returns settings["Debug"]["iProc"] + \param none + **/ int get_verbose_proc(); - precision_t get_dt_euv(); - bool get_include_photoelectrons(); + + /********************************************************************** + \brief returns settings["Debug"]["dt"] + \param none + **/ precision_t get_dt_report(); + + // --------------------- + // Output information + // --------------------- + + + /********************************************************************** + \brief returns the size of settings["Outputs"]["type"] + \param none + **/ precision_t get_n_outputs(); + + /********************************************************************** + \brief returns settings["Outputs"]["dt"][iOutput] + \param iOutput int specifying which output file type to report on + **/ precision_t get_dt_output(int iOutput); + + /********************************************************************** + \brief returns settings["Outputs"]["type"][iOutput] + \param iOutput int specifying which output file type to report on + **/ std::string get_type_output(int iOutput); + + + + + /********************************************************************** + \brief returns settings["Euv"]["dt"] + \param none + **/ + precision_t get_dt_euv(); + + /********************************************************************** + \brief returns settings["Euv"]["IncludePhotoElectrons"] + \param none + **/ + bool get_include_photoelectrons(); + + + /********************************************************************** + \brief returns settings["Electrodynamics"]["DiffuseAurora"] + \param none + **/ std::string get_diffuse_auroral_model(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_potential_model(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_electrodynamics_dir(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_electrodynamics_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_electrodynamics_north_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_electrodynamics_south_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_euv_heating_eff_neutrals(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_euv_model(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_euv_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_euv_douse(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_aurora_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_chemistry_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_indices_lookup_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::vector get_omniweb_files(); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_number_of_omniweb_files(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_f107_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_planet(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_planetary_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_planet_species_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_collision_file(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_do_calc_bulk_ion_temp(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_eddy_coef(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_eddy_bottom(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_eddy_top(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_use_eddy_momentum(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_use_eddy_energy(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_bfield_type(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_do_restart(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_restartout_dir(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_restartin_dir(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_dt_write_restarts(); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_original_seed(); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_updated_seed(); + + /********************************************************************** + \brief returns settings[" + \param + **/ void set_seed(int seed); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool write_restart(); + + /********************************************************************** + \brief returns settings[" + \param + **/ json get_perturb_values(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_do_lat_dependent_radius(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_do_J2(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_check_for_nans(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_nan_test(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_nan_test_variable(); + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_is_cubesphere(); - + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_NO_cooling(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_O_cooling(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_cent_acc(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_student_name(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_is_student(); + + /********************************************************************** + \brief returns settings[" + \param + **/ json get_initial_condition_types(); + + /********************************************************************** + \brief returns settings[" + \param + **/ json get_boundary_condition_types(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_advection_neutrals_vertical(); - // ------------------------------ - // Grid inputs: - - struct grid_input_struct { - std::string alt_file; - bool IsUniformAlt; - bool IsDipole; - precision_t alt_min; - // Only really needed for Mag Field grid, since this could be overconstrained: - precision_t alt_max; - precision_t dalt; - precision_t lat_min; - precision_t lat_max; - precision_t lon_min; - precision_t lon_max; - // Only needed for Mag Field grid: - precision_t min_apex; - }; - - grid_input_struct get_grid_inputs(std::string gridtype); - + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_nLons(std::string gridtype); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_nLats(std::string gridtype); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_nAlts(std::string gridtype); - int get_nBlocksLonGeo(); - int get_nBlocksLatGeo(); - + /********************************************************************** + \brief returns settings[gridtype, "shape"] + \param + **/ + std::string get_grid_shape(std::string gridtype); + + /********************************************************************** + \brief returns settings[" + \param + **/ int get_nMembers(); - - int iVerbose; - int iVerboseProc; - int iTimingDepth; - + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_logfile(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::string get_logfile(int64_t iLog); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::vector get_species_vector(); + + /********************************************************************** + \brief returns settings[" + \param + **/ bool get_logfile_append(); + + /********************************************************************** + \brief returns settings[" + \param + **/ precision_t get_logfile_dt(); // Satellites + + /********************************************************************** + \brief returns settings[" + \param + **/ std::vector get_satellite_files(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::vector get_satellite_names(); + + /********************************************************************** + \brief returns settings[" + \param + **/ std::vector get_satellite_dts(); // General get_setting functions with error checks: + + /********************************************************************** + \brief + \param + **/ std::string get_setting_str(std::string key1); + + /********************************************************************** + \brief + \param + **/ std::string get_setting_str(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ std::string get_setting_str(std::string key1, std::string key2, std::string key3); + + /********************************************************************** + \brief + \param + **/ json get_setting_json(std::string key1); + + /********************************************************************** + \brief + \param + **/ json get_setting_json(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ bool get_setting_bool(std::string key1); + + /********************************************************************** + \brief + \param + **/ bool get_setting_bool(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ bool get_setting_bool(std::string key1, std::string key2, std::string key3); + + /********************************************************************** + \brief + \param + **/ precision_t get_setting_float(std::string key1); + + /********************************************************************** + \brief + \param + **/ precision_t get_setting_float(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ int64_t get_setting_int(std::string key1); + + /********************************************************************** + \brief + \param + **/ int64_t get_setting_int(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ std::vector get_setting_intarr(std::string key1); + + /********************************************************************** + \brief + \param + **/ + std::vector get_setting_intarr(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ std::vector get_setting_timearr(std::string key1); // Check settings functions: + + /********************************************************************** + \brief + \param + **/ bool check_settings(std::string key1); + + /********************************************************************** + \brief + \param + **/ bool check_settings(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ std::string check_settings_str(std::string key1); + + /********************************************************************** + \brief + \param + **/ std::string check_settings_str(std::string key1, std::string key2); + + /********************************************************************** + \brief + \param + **/ precision_t check_settings_pt(std::string key1, std::string key2); /********************************************************************** \brief Check to see if internal state of class is ok **/ - bool is_ok(); private: + // This is the main variable that contains all of the settings in Aether: json settings; + // These are a bunch of misc strings that should go away: std::string euv_file = "UA/inputs/euv.csv"; std::string aurora_file = "UA/inputs/aurora_earth.csv"; std::string chemistry_file = "UA/inputs/chemistry_earth.csv"; @@ -213,6 +745,9 @@ class Inputs { std::vector missing_settings; }; +// This makes the input variable a global variable, so it can be used +// without passing it to every function. This is done because the +// input class is needed by almost all functions within Aether extern Inputs input; #endif // INCLUDE_INPUTS_H_ diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index aade39a0..b0cae02f 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -64,41 +64,29 @@ "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 10, 0], - "GeoBlockSize" : { - "nLons" : 36, - "nLats" : 36, - "nAlts" : 50}, - - "GeoGrid" : { - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, + "neuGrid" : { + "Shape" : "sphere", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 50, "MinAlt" : 100.0, - "dAlt" : 5.0, - "AltFile" : "", - "IsUniformAlt" : true}, - - "MagBlockSize" : { - "nLons" : 20, - "nLats" : 20, - "nAlts" : 80}, - - "MagGrid" : { - "MinLat" : -90.0, - "MaxLat" : 90.0, - "MinLon" : 0.0, - "MaxLon" : 360.0, - "MinAlt" : 100.0, - "MaxAlt" : 5000.0, - "MinApex" : 120.0, - "dAlt" : 5.0, - "AltFile" : "", - "IsDipole" : true, - "IsUniformAlt" : false}, - - "CubeSphere" : { - "is" : false}, + "dAltkm" : 5.0, + "dAltScale" : 0.25, + "IsUniformAlt" : true, + "AltFile" : ""}, + + "ionGrid" : { + "Shape" : "sphere", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 200, + "MinAlt" : 80.0, + "MinApex" : 120.0, + "MaxAlt" : 5000.0}, "Oblate" : { "isOblate" : false, diff --git a/share/run/aether.json b/share/run/aether.json index e435a232..e046c37a 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -18,8 +18,11 @@ "nLats" : 18, "nAlts" : 50}, - "GeoGrid" : { - "dAlt" : 0.25, + "neuGrid" : { + "nLonsPerBlock" : 24, + "nLatsPerBlock" : 22, + "nAlts" : 40, + "dAltScale" : 0.25, "IsUniformAlt" : false}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], diff --git a/src/advance.cpp b/src/advance.cpp index e9f42e54..43d98e55 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -84,7 +84,7 @@ bool advance(Planets &planet, if (didWork) didWork = neutralsMag.set_bcs(mGrid, time, indices); - if (input.get_nAlts("GeoGrid") > 1) + if (gGrid.get_nAlts(false) > 1) neutrals.advect_vertical(gGrid, time); if (didWork & input.get_check_for_nans()) @@ -156,10 +156,7 @@ bool advance(Planets &planet, ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); ionsMag.calc_electron_temperature(neutralsMag, mGrid); - if (input.get_is_cubesphere()) - neutrals.exchange_old(gGrid); - else - neutrals.exchange_old(gGrid); + neutrals.exchange_old(gGrid); time.increment_time(); diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 9a6bbb24..59f298e4 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -339,7 +339,7 @@ precision_t Neutrals::calc_dt(Grid grid) { precision_t dt; - if (input.get_is_cubesphere()) + if (grid.iGridShape_ == grid.iCubesphere_) dt = calc_dt_cubesphere(grid); else { int iDir; @@ -353,7 +353,7 @@ precision_t Neutrals::calc_dt(Grid grid) { arma_cube dty = grid.dlat_center_dist_scgc / cMax_vcgc[1]; dta(1) = dty.min(); - if (input.get_nAlts("GeoGrid") > 1) { + if (grid.get_nAlts(false) > 1) { arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; dta(2) = dtz.min(); } else @@ -422,7 +422,7 @@ precision_t Neutrals::calc_dt_cubesphere(Grid grid) { dta(0) = dtx.min(); dta(1) = dty.min(); - if (input.get_nAlts("GeoGrid") > 1) { + if (grid.get_nAlts(false) > 1) { arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; dta(2) = dtz.min(); } else diff --git a/src/grid.cpp b/src/grid.cpp index da598554..2650974d 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -9,15 +9,26 @@ // Initialize Grid class // -------------------------------------------------------------------------- -Grid::Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in) { +Grid::Grid(std::string gridtype) { - nX = nX_in + nGCs_in * 2; + // At this point, we only need 2 ghostcells. Hardcode this: + nGCs = 2; + + Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); + + nX = grid_input.nX + nGCs * 2; nLons = nX; - nY = nY_in + nGCs_in * 2; + nY = grid_input.nY + nGCs * 2; nLats = nY; - nZ = nZ_in + nGCs_in * 2; + nZ = grid_input.nZ + nGCs * 2; nAlts = nZ; - nGCs = nGCs_in; + + if (mklower(grid_input.shape) == "sphere") + iGridShape_ = iSphere_; + if (mklower(grid_input.shape) == "cubesphere") + iGridShape_ = iCubesphere_; + if (mklower(grid_input.shape) == "dipole") + iGridShape_ = iDipole_; geoLon_scgc.set_size(nX, nY, nZ); geoLat_scgc.set_size(nX, nY, nZ); @@ -153,12 +164,21 @@ Grid::Grid(int nX_in, int nY_in, int nZ_in, int nGCs_in) { IsExperimental = false; cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int i = 0; i < 3; i++) cent_acc_vcgc[i].zeros(); } +// -------------------------------------------------------------------------- +// Set Variable Sizes +// -------------------------------------------------------------------------- + +void Grid::set_variable_sizes() { + + return; +} + + // -------------------------------------------------------------------------- // write restart out files for the grid // -------------------------------------------------------------------------- @@ -396,6 +416,25 @@ int64_t Grid::get_nZ() { return nZ; } +int64_t Grid::get_nX(bool includeGCs) { + if (includeGCs) + return nX; + else + return nX - 2*nGCs; +} +int64_t Grid::get_nY(bool includeGCs) { + if (includeGCs) + return nY; + else + return nY - 2*nGCs; +} +int64_t Grid::get_nZ(bool includeGCs) { + if (includeGCs) + return nZ; + else + return nZ - 2*nGCs; +} + int64_t Grid::get_nLons() { return nLons; } @@ -406,6 +445,25 @@ int64_t Grid::get_nAlts() { return nAlts; } +int64_t Grid::get_nLons(bool includeGCs) { + if (includeGCs) + return nLons; + else + return nLons - 2*nGCs; +} +int64_t Grid::get_nLats(bool includeGCs) { + if (includeGCs) + return nLats; + else + return nLats - 2*nGCs; +} +int64_t Grid::get_nAlts(bool includeGCs) { + if (includeGCs) + return nAlts; + else + return nAlts - 2*nGCs; +} + int64_t Grid::get_nGCs() { return nGCs; } diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 1b801566..99e108e6 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -748,11 +748,12 @@ void Grid::create_altitudes(Planets planet) { arma_vec alt1d(nAlts); - Inputs::grid_input_struct grid_input = input.get_grid_inputs("GeoGrid"); + Inputs::grid_input_struct grid_input = input.get_grid_inputs("neuGrid"); if (grid_input.IsUniformAlt) { for (iAlt = 0; iAlt < nAlts; iAlt++) - alt1d(iAlt) = grid_input.alt_min + (iAlt - nGeoGhosts) * grid_input.dalt; + // Convert km to m: + alt1d(iAlt) = (grid_input.alt_min + (iAlt - nGeoGhosts) * grid_input.daltKm) * cKMtoM; } else { json neutrals = planet.get_neutrals(); @@ -775,16 +776,17 @@ void Grid::create_altitudes(Planets planet) { report.print(1, "Making non-uniform altitude grid!"); - if (grid_input.dalt > 0.5) { + if (grid_input.daltScale > 0.5) { if (report.test_verbose(0)) { std::cout << "-----------------------------------------------------\n"; - std::cout << "WARNING: dAlt is set to > 0.5, with non-uniform grid!\n"; - std::cout << " dAlt = " << grid_input.dalt << "\n"; + std::cout << "WARNING: daltScale is set to > 0.5, with non-uniform grid!\n"; + std::cout << " daltScale = " << grid_input.daltScale << "\n"; std::cout << "-----------------------------------------------------\n"; } } - double alt = grid_input.alt_min; + // Convert to km + double alt = grid_input.alt_min * cKMtoM; radius = planet.get_radius(0.0) + alt; precision_t mu = planet.get_mu(); gravity = mu / (radius * radius); @@ -806,13 +808,13 @@ void Grid::create_altitudes(Planets planet) { mass = mass / density; scale_height = cKB * temperature / (mass * gravity); - precision_t dalt = scale_height * grid_input.dalt; + precision_t dalt = scale_height * grid_input.daltScale; precision_t dAltLimiter = dalt * 10.0; // Fills bottom ghost cells with constant dAlt // Fills bottom cell with actual desired bottom altitude for (iAlt = 0; iAlt <= nGeoGhosts; iAlt++) { - alt1d(iAlt) = grid_input.alt_min + (iAlt - nGeoGhosts) * dalt; + alt1d(iAlt) = grid_input.alt_min * cKMtoM + (iAlt - nGeoGhosts) * dalt; if (report.test_verbose(1)) std::cout << "iAlt : " << iAlt @@ -839,7 +841,7 @@ void Grid::create_altitudes(Planets planet) { mass = mass / density; scale_height = cKB * temperature / (mass * gravity); - dalt = scale_height * grid_input.dalt; + dalt = scale_height * grid_input.daltScale; if (dalt > dAltLimiter) dalt = dAltLimiter; @@ -942,21 +944,22 @@ bool Grid::init_geo_grid(Quadtree quadtree, bool DidWork = true; IsGeoGrid = 1; - IsCubeSphereGrid = input.get_is_cubesphere(); - if (input.get_is_cubesphere()) { + if (iGridShape_ == iCubesphere_) { report.print(0, "Creating Cubesphere Grid"); create_cubesphere_connection(quadtree); + IsCubeSphereGrid = true; } else { report.print(0, "Creating Spherical Grid"); create_sphere_connection(quadtree); + IsCubeSphereGrid = false; } - if (input.get_do_restart() & !input.get_is_cubesphere()) { + if (input.get_do_restart() & iGridShape_ != iCubesphere_) { report.print(1, "Restarting! Reading grid files!"); DidWork = read_restart(input.get_restartin_dir()); } else { - if (input.get_is_cubesphere()) { + if (iGridShape_ == iCubesphere_) { if (input.get_do_restart()) report.print(0, "Not restarting the grid - it is too complicated!"); @@ -976,7 +979,7 @@ bool Grid::init_geo_grid(Quadtree quadtree, fill_grid_radius(planet); // Correct the reference grid with correct length scale: // (with R = actual radius) - if (input.get_is_cubesphere()) + if (iGridShape_ == iCubesphere_) correct_xy_grid(planet); if (IsMagGrid) { diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index c2bcf670..5f327dbb 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -22,7 +22,7 @@ void Grid::init_mag_grid(Planets planet) { set_IsGeoGrid(false); // This is just an example: - Inputs::grid_input_struct grid_input = input.get_grid_inputs("MagGrid"); + Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); int64_t iLon, iLat, iAlt; @@ -728,12 +728,13 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { report.print(3, "Getting mgrid_inputs inputs in dipole grid"); - Inputs::grid_input_struct grid_input = input.get_grid_inputs("MagGrid"); + Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); report.print(3, "Setting inputs in dipole grid"); - precision_t min_apex = grid_input.min_apex; - precision_t min_alt = grid_input.alt_min; - precision_t max_alt = grid_input.alt_max; + // Convert altitudes from km to m: + precision_t min_apex = grid_input.min_apex * cKMtoM; + precision_t min_alt = grid_input.alt_min * cKMtoM; + precision_t max_alt = grid_input.alt_max * cKMtoM; precision_t planetRadius = planet.get_radius(0.0); precision_t min_lshell = (min_apex + planetRadius)/planetRadius; precision_t min_r = (min_alt + planetRadius)/planetRadius; diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index 2b4953ae..a7efcafa 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -59,8 +59,8 @@ bool init_parallel(Quadtree &quadtree) { std::cout << "Quadtree max depth : " << quadtree.max_depth << "\n"; // Check to see if we have enough processors to do this stuff: - int nBlocksLonGeo = pow(2, quadtree.max_depth); // input.get_nBlocksLonGeo(); - int nBlocksLatGeo = pow(2, quadtree.max_depth); // input.get_nBlocksLatGeo(); + int nBlocksLonGeo = pow(2, quadtree.max_depth); + int nBlocksLatGeo = pow(2, quadtree.max_depth); nGrids = nBlocksLonGeo * nBlocksLatGeo * quadtree.nRootNodes; int nProcsNeeded = nMembers * nGrids; @@ -98,7 +98,7 @@ bool init_parallel(Quadtree &quadtree) { if (report.test_verbose(2)) std::cout << "seed : " << seed << "\n"; - quadtree.build("GeoGrid"); + quadtree.build("neuGrid"); } else { if (iProc == 0) { diff --git a/src/inputs.cpp b/src/inputs.cpp index 43712925..3b7f69ac 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -29,8 +29,8 @@ Inputs::Inputs(Times &time) { // Grid Defaults: geo_grid_input.alt_file = ""; geo_grid_input.IsUniformAlt = true; - geo_grid_input.alt_min = 100.0 * 1000.0; - geo_grid_input.dalt = 5.0 * 1000.0; + geo_grid_input.alt_min = 100.0; + geo_grid_input.daltKm = 5.0; nLonsGeo = 12; nLatsGeo = 20; @@ -173,6 +173,22 @@ std::vector Inputs::get_setting_intarr(std::string key1) { return value; } +std::vector Inputs::get_setting_intarr(std::string key1, + std::string key2) { + std::vector value; + + if (check_settings(key1, key2)) { + int nPts = settings.at(key1).at(key2).size(); + isOk = true; + + for (int i = 0; i < nPts; i++) + value.push_back(settings.at(key1).at(key2).at(i)); + } else + isOk = false; + + return value; +} + // ----------------------------------------------------------------------- // A specific length int vector @@ -414,50 +430,39 @@ precision_t Inputs::check_settings_pt(std::string key1, // ----------------------------------------------------------------------- // Return characteristics of the grid that are entered by the user -// gridtype needs to be "GeoGrid" or "MagGrid" +// gridtype needs to be "neuGrid" or "ionGrid" // ----------------------------------------------------------------------- Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { Inputs::grid_input_struct grid_specs; - // First Get Values: - grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); + grid_specs.shape = check_settings_str(gridtype, "Shape"); - if (check_settings(gridtype, "IsUniformAlt")) { - bool reality = get_setting_bool(gridtype, "IsUniformAlt"); - grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); - } else - grid_specs.IsUniformAlt = true; + grid_specs.nX = get_setting_int(gridtype, "nLonsPerBlock"); + grid_specs.nY = get_setting_int(gridtype, "nLatsPerBlock"); + grid_specs.nZ = get_setting_int(gridtype, "nAlts"); grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); - grid_specs.dalt = check_settings_pt(gridtype, "dAlt"); - grid_specs.lat_min = check_settings_pt(gridtype, "MinLat"); - grid_specs.lat_max = check_settings_pt(gridtype, "MaxLat"); - grid_specs.lon_min = check_settings_pt(gridtype, "MinLon"); - grid_specs.lon_max = check_settings_pt(gridtype, "MaxLon"); - - // Second Change Units - grid_specs.alt_min = grid_specs.alt_min * cKMtoM; - grid_specs.lat_min = grid_specs.lat_min * cDtoR; - grid_specs.lat_max = grid_specs.lat_max * cDtoR; - grid_specs.lon_min = grid_specs.lon_min * cDtoR; - grid_specs.lon_max = grid_specs.lon_max * cDtoR; - - // If the grid is uniform, dalt is in km, else it is in fractions of - // scale height: - if (grid_specs.IsUniformAlt) - grid_specs.dalt = grid_specs.dalt * cKMtoM; + std::vector min_max; + min_max = get_setting_intarr(gridtype, "LatRange"); + grid_specs.lat_min = min_max[0] * cDtoR; + grid_specs.lat_max = min_max[1] * cDtoR; + min_max = get_setting_intarr(gridtype, "LonRange"); + grid_specs.lon_min = min_max[0] * cDtoR; + grid_specs.lon_max = min_max[1] * cDtoR; // These are only needed if the gridtype if magnetic: - if (gridtype == "MagGrid") { + if (grid_specs.shape == "dipole") { grid_specs.alt_max = check_settings_pt(gridtype, "MaxAlt"); grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); - grid_specs.alt_max = grid_specs.alt_max * cKMtoM; - grid_specs.min_apex = grid_specs.min_apex * cKMtoM; - grid_specs.IsDipole = check_settings(gridtype, "IsDipole"); } else { - grid_specs.IsDipole = false; + grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); + grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); + if (grid_specs.IsUniformAlt) + grid_specs.daltKm = check_settings_pt(gridtype, "dAltkm"); + else + grid_specs.daltScale = check_settings_pt(gridtype, "dAltScale"); } return grid_specs; @@ -893,40 +898,23 @@ int Inputs::get_original_seed() { } // ----------------------------------------------------------------------- -// Return number of longitudes, latitudes, and altitudes in Geo grid +// Return number of longitudes, latitudes, and altitudes in grid // ----------------------------------------------------------------------- int Inputs::get_nLons(std::string gridtype) { - if (gridtype == "GeoGrid") - return check_settings_pt("GeoBlockSize", "nLons"); - else - return check_settings_pt("MagBlockSize", "nLons"); + return get_setting_int(gridtype, "nLonsPerBlock"); } int Inputs::get_nLats(std::string gridtype) { - if (gridtype == "GeoGrid") - return check_settings_pt("GeoBlockSize", "nLats"); - else - return check_settings_pt("MagBlockSize", "nLats"); + return get_setting_int(gridtype, "nLatsPerBlock"); } int Inputs::get_nAlts(std::string gridtype) { - if (gridtype == "GeoGrid") - return check_settings_pt("GeoBlockSize", "nAlts"); - else - return check_settings_pt("MagBlockSize", "nAlts"); -} - -// ----------------------------------------------------------------------- -// Return number of Blocks of longitudes and latitudes in Geo grid -// ----------------------------------------------------------------------- - -int Inputs::get_nBlocksLonGeo() { - return check_settings_pt("GeoBlockSize", "nBlocksLon"); + return get_setting_int(gridtype, "nAlts"); } -int Inputs::get_nBlocksLatGeo() { - return check_settings_pt("GeoBlockSize", "nBlocksLat"); +std::string Inputs::get_grid_shape(std::string gridtype) { + return mklower(get_setting_str(gridtype, "Shape")); } // ----------------------------------------------------------------------- diff --git a/src/main/main.cpp b/src/main/main.cpp index d989f42c..434de71c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -32,7 +32,10 @@ int main() { report.print(-1, "Hello " + input.get_student_name() + " - welcome to Aether!"); - Quadtree quadtree("GeoGrid"); + // For now, the number of processors and blocks are set by the + // neutral grid shape, since this could be sphere (1 root) or + // cubesphere (6 root) + Quadtree quadtree(input.get_grid_shape("neuGrid")); if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); @@ -75,10 +78,7 @@ int main() { MPI_Barrier(aether_comm); // Initialize Geographic grid: - Grid gGrid(input.get_nLons("GeoGrid"), - input.get_nLats("GeoGrid"), - input.get_nAlts("GeoGrid"), - nGeoGhosts); + Grid gGrid("neuGrid"); didWork = gGrid.init_geo_grid(quadtree, planet); MPI_Barrier(aether_comm); @@ -94,12 +94,9 @@ int main() { gGrid.calc_cent_acc(planet); // Initialize Magnetic grid: - Grid mGrid(input.get_nLons("MagGrid"), - input.get_nLats("MagGrid"), - input.get_nAlts("MagGrid"), - nMagGhosts); + Grid mGrid("ionGrid"); - if (input.get_setting_bool("MagGrid", "IsDipole")) { + if (mGrid.iGridShape_ == mGrid.iDipole_) { mGrid.set_IsDipole(true); mGrid.init_dipole_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 7efca8c7..6c1585aa 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -30,7 +30,7 @@ bool Neutrals::set_bcs(Grid grid, bool didWork = true; - if (input.get_nAlts("GeoGrid") > 1) { + if (grid.get_nAlts(false) > 1) { didWork = set_lower_bcs(grid, time, indices); if (didWork) @@ -248,7 +248,7 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { int64_t nX = grid.get_nX(), iX; int64_t nY = grid.get_nY(), iY; - int64_t nAlts = grid.get_nAlts(), iAlt; + int64_t nAlts = grid.get_nAlts(true), iAlt; int64_t nGCs = grid.get_nGCs(); int64_t iV; diff --git a/src/quadtree.cpp b/src/quadtree.cpp index debd9a26..aba15239 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -15,8 +15,8 @@ int64_t iProcQuery = -1; -Quadtree::Quadtree(std::string gridtype) { - if (gridtype == "GeoGrid" & input.get_is_cubesphere()) +Quadtree::Quadtree(std::string shape) { + if (shape == "cubesphere") nRootNodes = 6; else nRootNodes = 1; @@ -40,12 +40,21 @@ void Quadtree::build(std::string gridtype) { arma_mat rights; arma_mat ups; - if (gridtype == "GeoGrid" & input.get_is_cubesphere()) { + Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); + + if (grid_input.shape == "cubesphere") { origins = CubeSphere::ORIGINS; rights = CubeSphere::RIGHTS; ups = CubeSphere::UPS; IsCubeSphere = true; - } else { + } + if (grid_input.shape == "sphere") { + origins = Sphere::ORIGINS; + rights = Sphere::RIGHTS; + ups = Sphere::UPS; + IsSphere = true; + } + if (grid_input.shape == "dipole") { origins = Sphere::ORIGINS; rights = Sphere::RIGHTS; ups = Sphere::UPS; @@ -77,8 +86,6 @@ void Quadtree::build(std::string gridtype) { // restrict the domain. This will only work for the spherical // grid so far: - Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); - if (grid_input.lon_min > 0.0 || grid_input.lon_max < 2.0 * cPI || grid_input.lat_min > -cPI / 2.0 || diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index f2bf0cc9..01d6017b 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -11,7 +11,7 @@ std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { std::vector gradient_vcgc; - if (input.get_is_cubesphere()) + if (grid.iGridShape_ == grid.iCubesphere_) gradient_vcgc = calc_gradient_cubesphere(value_scgc, grid); else { From de569a28fd00c94a71a4d847a873c47a97819793 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Jul 2024 08:11:32 -0400 Subject: [PATCH 165/691] BUG: default ion grid needs to contain sphere info also --- share/run/UA/inputs/defaults.json | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index b0cae02f..6756fda7 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -69,8 +69,8 @@ "LatRange" : [-90.0, 90.0], "nLatsPerBlock" : 18, "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 36, - "nAlts" : 50, + "nLonsPerBlock" : 20, + "nAlts" : 40, "MinAlt" : 100.0, "dAltkm" : 5.0, "dAltScale" : 0.25, @@ -82,11 +82,15 @@ "LatRange" : [-90.0, 90.0], "nLatsPerBlock" : 18, "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 36, - "nAlts" : 200, + "nLonsPerBlock" : 22, + "nAlts" : 50, "MinAlt" : 80.0, "MinApex" : 120.0, - "MaxAlt" : 5000.0}, + "MaxAlt" : 5000.0, + "dAltkm" : 5.0, + "dAltScale" : 0.25, + "IsUniformAlt" : true, + "AltFile" : ""}, "Oblate" : { "isOblate" : false, From 42c8b978ec05f163364541208c607e6a4c4e7d50 Mon Sep 17 00:00:00 2001 From: "abukowski21@gmail.com" Date: Wed, 24 Jul 2024 10:05:23 -0400 Subject: [PATCH 166/691] DOC: Organize root README While working on "overhauling" (re-organizing) the documentation, I've noticed a lot of repeated & out-dated informatuion. This will be fixed in several commits. This commit will: - Add a TOC & remove info better placed elsewhere from `~/README.md` - Fix some typos in README - Standardize apple OS as MacOS, not Mac OS(X) - Shorten the root readme to only contain info necessary for a quick start - Apply conststent .md formatting --- README.md | 302 +++++++++++++++++++++++++----------------------------- 1 file changed, 142 insertions(+), 160 deletions(-) diff --git a/README.md b/README.md index 4af46445..b28a8007 100644 --- a/README.md +++ b/README.md @@ -1,170 +1,140 @@ # Aether -This is the home of the Aether model of the thermosphere and ionosphere. - -The Aether model has been developed using gnu c++ (versions 9, 10, 11). If -you are using this, hopefully it will just work out of the box. We have -been doing development of Aether on Mac OSX, and in Ubuntu Linux. We have -also used the Windows Subsystem for Linux, Ubuntu distribution, which -works similarly to the native Linux distribution. - -If you are a student and don't know how to work with a large code base -(i.e., multiple source codes in multiple directories), you may consider -starting with the doc/student.md file. - -## Dependencies: - -On Mac, installing some of the dependencies can be awkward, depending -on which c++ compiler you are using. Since there is one that -essentially comes with Mac OSX, called clang, the default compiler is -often this. Much of the other software is not built with this, so you -need to switch compilers, which can be challenging. - -While the development team has tried to remove as many of the -dependencies as possible to reduce this issues, it is still a good -idea to try to get a different compiler to work. If you want to -use netCDF files or the fortran compiled options (like MSIS), you -will probably have to do this. - -0. Install gcc. This comes install by default on Ubuntu. For MacOS, -this can be installed using [macports](https://www.macports.org/): -```bash -sudo port install gcc11 -``` -(At this moment, gcc11 is the latest version, there may be a more up-to-date version available now.) - - -1. Aether uses [CMake](https://cmake.org/) instead of make. If you don't have it installed, you need it. - -For MacOS, this can be installed using -[macports](https://www.macports.org/) -```bash -sudo port install cmake -``` - -Or using [homebrew](https://formulae.brew.sh/formula/cmake): -```bash -sudo brew install cmake -``` -The development team has mostly used macports and not homebrew. - -For Ubuntu/Debian Linux: -```bash -sudo apt install cmake -``` -This can be done on redhat using yum also. - -2. Aether uses the nlohman json package for reading and writing json files. - -On Ubuntu: - -```bash -sudo apt-get install -y nlohmann-json3-dev -``` - -On Mac: - -```bash -sudo port install nlohmann-json -``` - -3. The armadillo headers need to be installed. Simplistically, -Armadillo is a system that allows matrix math to be done in C++ -easily. We mostly use it for doing math with matrices (like -multiplication, addition, etc.), but it is much more powerful than -this. You will notice that there are not many 3D loops in Aether, -which is due to Armadillo. To make this all fast, it is best to -install the lapack abd blas libraries too. - -On Ubuntu: - -```bash -sudo apt-get install liblapack-dev -sudo apt-get install libblas-dev -sudo apt-get install libboost-dev -sudo apt-get install libarmadillo-dev -sudo apt-get install openmpi-bin libopenmpi-dev -``` - -On Mac: - -```bash -sudo port install lapack -sudo port install OpenBLAS -sudo port install boost -sudo port install armadillo -sudo port install openmpi-bin libopenmpi-dev - ``` - -4. We have removed the strict dependency for netcdf, but a lot of -codes used netCDF, so it doesn't hurt to try to install the libraries. -Aether uses the netcdf library (netcdf-cxx4). As above, netCDF can be -installed using a package manager. - -On Mac, if you want the clang compiled version of netcdf, then: -```bash -sudo port install netcdf-cxx4 -``` - -If you want the gcc version of netcdf, then: -```bash -sudo port install netcdf-cxx4 +gcc10 -``` -On Ubuntu, gcc is the default compiler, it seems like you can probably just do: -```bash -sudo apt-get install libnetcdf-dev -sudo apt install libnetcdf-c++4-dev -``` - -## Quick Start: - -These are unix commands, assuming that you have access to a unix/linux -terminal. This has been tested on a MacBook Pro and Ubuntu. (This is -assuming that you are installing the root version of Aether and not a -forked version. If you are using a forked version, replace the -"AetherModel" with the appropriate location of the fork.) +This is the home of the Aether model of the thermosphere and ionosphere. -```bash -git clone https://github.com/AetherModel/Aether +The Aether model has been developed using GNU C++ (versions 9, 10, 11). If you +are using this, hopefully it will just work out of the box. We have been doing +development of Aether on MacOS and Ubuntu Linux. We have also used the Windows +Subsystem for Linux, Ubuntu distribution, which works similarly to the native +Linux distribution. + +> If you are a student and don't know how to work with a large code base (i.e., +multiple source codes in multiple directories), you may consider starting within +the [Students](doc/student.md) page. + +All other users may wish to continue with the short installation guide below. If +you run into issues or have questions, first consult the in-progress +[documentation](doc/README.md). More complete documentation is actively being +developed. + +## Contents + +- [Aether](#aether) + - [Contents](#contents) + - [Quick Start](#quick-start) + - [Dependencies](#dependencies) + - [Getting the Code](#getting-the-code) + - [Compiling \& Running](#compiling--running) + - [Code Manual](#code-manual) + - [Further Documentation](#further-documentation) + +## Quick Start + +The following guide serves to demonstrate how to download, install, and then run +the Aether model. More details on each topic will be linked, and some more +detail is available [here](doc/README.md). + +### Dependencies + +On MacOS, installing some of the dependencies can be awkward, depending on which +C++ compiler you are using. Since there is one that essentially comes with +MacOS, called `clang`, the default compiler is often this. Much of the other +software is not built with this, so you need to switch compilers, which can be +challenging. + +While the development team has tried to remove as many of the dependencies as +possible to reduce this issues, it is still a good idea to try to get a +different compiler to work. If you want to use NetCDF files or the Fortran +compiled options (like MSIS), you will probably have to do this. + +A package manager is recommended to install the dependencies of the Aether +model. More details on the use of package managers can be found on [the +dependencies page](doc/installation/dependencies.md). For MacOS and Ubuntu Linux, the validated configurations are: + +
+ MacOS + + | Dependency | Tested version | + |---------------|----------------| + | armadillo | 11.4 | + | boost | 1.76 | + | cmake | 2.24 | + | gcc | 10, 11 | + | netcdf | 4.9 | + | netcdf-cxx4 | 4.3 | + | nlohmann-json | 3.11 | + | OpenBLAS | 0.3 | + | mpich | 4.1 | + + MacOS has two predominant package managers: [Homebrew](https://brew.sh) and + [MacPorts](https://www.macports.org/). Either will work. + +
+ +
+ Linux + + | Dependency | Tested version | + |--------------------|----------------| + | cmake | 2.24 | + | gcc | 10, 11, 12 | + | libarbadillo-dev | | + | libblas-dev | | + | libboost-dev | | + | liblapack-dev | | + | libnetcdf-dev | | + | libnetcdf-c++4-dev | | + | libopenmpi-dev | | + | nlohmann-json3-dev | | + | openmpi-bin | same as gcc | + + The specific package manager to use depends on which distribution of Linux + Aether is installed on. More details on Linux package managers can be found + [here, for + example](https://www.linode.com/docs/guides/linux-package-management-overview/#comparison-of-package-managers). + +
+ +### Getting the Code + +This has been tested on a MacBook Pro and Ubuntu. + +```bash +git clone git@github.com:AetherModel/Aether.git cd Aether git checkout develop ``` +> ***NOTES:*** +> +> - (This is assuming that you are installing the root version of Aether and not +a forked version. If you are using a forked version, replace the +"`AetherModel`" with the appropriate location of the fork.) +> - GitHub now recommends cloning repositories via `ssh` instead of `https`. For +development work, this is the way to go. If the above `git clone` command fails +and you are not planning on contributing to Aether development, the first line +can be replaced with "`git clone https://github.com/AetherModel/Aether`". For +help setting up your machine to use `ssh` to connect to Github, see [this +page](https://docs.github.com/en/authentication/connecting-to-github-with-ssh) + +### Compiling & Running + To compile Aether: + ```bash mkdir build cd build cmake .. make [-j4] ``` -The -j4 is optional and uses 4 processors, but you could use 2, 4, 8, -or whatever. - -To compile Aether with NetCDF: -```bash -mkdir build -cd build -cmake -DUSE_NETCDF=Y .. -make [-j4] (the -j4 uses 4 processors) -``` -To compile Aether with FORTRAN codes: -```bash -mkdir build -cd build -cmake -DUSE_FORTRAN=Y .. -make [-j4] (the -j4 uses 4 processors) -``` +The `-j4` is optional and uses 4 processors, but you could use 2, 4, 8, or +whatever. -To compile Aether with double precision: -```bash -mkdir build -cd build -cmake -DUSE_DOUBLE_PRECISION=Y .. -make [-j4] (the -j4 uses 4 processors) -``` +More compilation options can be found on the [Compiling +Aether](doc/installation/build_opts.md) page. -Once you have compiled you can install Aether with an example run directory +Once you have compiled, you can install Aether with an example run directory structure like this: ```bash @@ -177,16 +147,17 @@ cd run.test There are essentially two input files that specify the settings in the code. When you are in a run directory, they are: -1. UA/inputs/defaults.json. These set the default inputs for the run -and should not be modified at all. You can look at these and copy the -settings that you want to change to this file: +1. UA/inputs/defaults.json. These set the default inputs for the run and should +not be modified at all. You can look at these and copy the settings that you +want to change to this file: -2. aether.json. This file can and should be modified to direct the -code to run the way that you would like. You can copy settings from -the default.json file and then modify them here. This will be covered -in the reference manual, once we have written one. +2. aether.json. This file can and should be modified to direct the code to run +the way that you would like. You can copy settings from the default.json file +and then modify them here. This will be covered in the reference manual, once we +have written one. -You can check to make sure that these are valid json files (not checking the content, though) with: +You can check to make sure that these are valid json files (not checking the +content, though) with: ```bash cd run.test @@ -194,7 +165,8 @@ python -m json.tool aether.json python -m json.tool UA/inputs/defaults.json ``` -At this time, there is no checker to see if all of the settings in each of the inputs files are actually valid and Aether understands them. +At this time, there is no checker to see if all of the settings in each of the +inputs files are actually valid and Aether understands them. Output files are in UA/output. @@ -202,7 +174,7 @@ We are working on aetherpy to make plots. Compare png files to tests/outputs_pngs/*.png to see if they are similar. -## Code Manual: +## Code Manual To create the code documentation manual, download Doxygen for your operating system and run: @@ -211,3 +183,13 @@ system and run: cd doc doxygen Doxyfile ``` + +## Further Documentation + +A more complete documentation is in +[development](https://github.com/AetherModel/AetherDocumentation), which can be +browsed [here](https://aetherdocumentation.rtfd.io/). + +The collection of Markdown files within the [doc](doc/README.md) folder of this +repository will provide more information and, at the time of writing, is more up +to date than the official documentation. It is recommended to start there. From 3d8e72b72a3e1d89ed1a840a3538486ff004baef Mon Sep 17 00:00:00 2001 From: "abukowski21@gmail.com" Date: Wed, 24 Jul 2024 10:11:33 -0400 Subject: [PATCH 167/691] DOC/STY: Markdown formatting Apply consistent markdown formatting (1 blank line, sequential header levels, etc.) and fix small typos. Also change iOS in bug_report to MacOS/Linux, since nobody will be running Aether on iOS --- .github/ISSUE_TEMPLATE/bug_report.md | 8 ++++--- doc/design/standards.md | 4 +--- doc/student.md | 32 ++++++++++++---------------- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 084139d6..cdaa9a9a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,6 +12,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,9 +25,10 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **System information (please complete the following information):** - - OS: [e.g. iOS] - - Compilers used, with version numbers - - Otheer details about your setup that could be relevant + +- OS: (e.g. MacOS, Linux distribution, etc.) +- Compilers used, with version numbers +- Otheer details about your setup that could be relevant **Additional context** Add any other context about the problem here. diff --git a/doc/design/standards.md b/doc/design/standards.md index 0f2e52ca..af071cc4 100644 --- a/doc/design/standards.md +++ b/doc/design/standards.md @@ -4,7 +4,7 @@ Aether Coding and Design Standards Document Overall Design Philosophy ------------------------- -### Files +## Files Directory Structure: @@ -14,7 +14,5 @@ Directory Structure: - Names should be short but descriptive (less than 25 characters) - Source term files should start with `calc` - Variable naming --------------- - diff --git a/doc/student.md b/doc/student.md index 669c1bff..5ba7c855 100644 --- a/doc/student.md +++ b/doc/student.md @@ -1,6 +1,5 @@ # Student Walk Through of Aether - ## Start with the Basics 0. [Using the terminal - Unix commands](https://ubuntu.com/tutorials/command-line-for-beginners#1-overview) @@ -13,26 +12,21 @@ 4. [Tutorial for git and GitHub](https://www.freecodecamp.org/news/git-and-github-for-beginners/) - ## Some Editors The Classics: 1. [Emacs](http://www.jesshamrick.com/2012/09/10/absolute-beginners-guide-to-emacs/) - -emacs can be installed using a package manager such as apt or port - + - emacs can be installed using a package manager such as apt or port 2. [vim](https://linuxconfig.org/vim-tutorial) 21st Century Editors: 1. Most people are using Visual Studio Code to work on Aether. - 2. There are always popular Integrated Development Environments (IDEs) that can be used to edit, develop, and test code. If you use one and develop on Aether, please feel free to update this section. - ## Install Aether for Development Make sure you have all of the dependencies installed (see installation.md). @@ -40,17 +34,13 @@ Then start by creating a new fork of the Aether repository on GitHub. To do this: 1. Go to the Aether repository and click on "Fork" then "+ Create a new fork" - 2. Unclick the "Copy the main branch only" checkbox - 3. Click "Create fork" - 4. GitHub will take you to this repository automatically. It is now your "version" of Aether, and all development will be done here. We will use the username "YourRepo" instead of your actual repository in the examples below. - ```bash git clone https://github.com/YourRepo/Aether cd Aether @@ -58,8 +48,8 @@ git checkout develop ``` To compile Aether, you need to make sure you have all of the dependencies -installed (see the main README.md in the Aether directory), and then run -these commands: +installed (see the main README.md in the Aether directory or [this +page](installation/dependencies.md)), and then run these commands: ```bash mkdir build @@ -68,21 +58,24 @@ cmake .. make ``` -Once you have compiled you can run Aether. To remember which runs you're doing, +Once you have compiled, you can run Aether. To remember which runs you're doing, we recommend creating a specific directory for each run. This can be done by -copying the default run directory to have a special name, like this: +copying the default run directory to have a special name, like: + ```bash cd .. cp -R share/run ./run.test ``` Now, run the executable from the directory you created. + ```bash cd run.test ./aether ``` You should see something like: + ```bash run.test% ./aether > Need to NOT adjust F10.7, but that isn't included yet!!! @@ -102,6 +95,7 @@ etc. ``` The successful end of this will show a timing summary, similar to: + ```bash >main>advance>Chemistry::calc_chemistry nTimes called : 720 @@ -116,13 +110,15 @@ The successful end of this will show a timing summary, similar to: Now, edit the aether.json file and add the following after the "Debug" section, where "Your Name" should be your name: + ```bash "Student" : { - "name" : "Your Name", - "is" : true }, + "name" : "[Your Name]", + "is" : true }, ``` Then, run aether again. Your output should now look something like this: + ```bash run.test% ./aether > Hello Aaron - welcome to Aether! @@ -147,6 +143,7 @@ run.test% ./aether If something happened that made the input file unreadable, you'll instead see something like this: + ```bash Error in reading input file! input initialization failed! @@ -205,4 +202,3 @@ While you are awaiting a response from your advisor, you can check out the Issues part of the Aether github site. That will let you know all of the outstanding issues that are being worked on. Maybe you can contribute to some of these! - From e05f8210266c5547dedbd82888673d75dfd173de Mon Sep 17 00:00:00 2001 From: "abukowski21@gmail.com" Date: Wed, 24 Jul 2024 10:28:17 -0400 Subject: [PATCH 168/691] DOC: Organize .md files in `doc/` `doc/`'s markdown files were not organized, and had a lot of repeated information. This commit (along with #42c8b97 and #38de72) should help address that. There are still a number of gaps in doc coverage & some repeated information, but it should be easier to find specific information now. Features: - table of contents at ~/README.md and ~/doc/README.md - I put this into a tree that made sense to me, open to suggestions on how to re-organize. Thinking about breaking off parts of doc/usage/ to doc/internals, but it's not done yet. - Folders are Design (unchanged), Installing (package manager, cmake args, etc), and Usage (how to run, debug, and ensembles/indices). - Add note that the "real documentation" is in the works... see github.com/AetherModel/AetherDevelopment - I didn't want to touch this, but can migrate these README's there if it would be helpful. - Add consistent markdown formatting. Did not change *too* much of the existing content. But re-organized it and fixed typos/style where necessary. Spent a while debating whether to make this a GitHub Pages or add in to the RTD. Decided this would be easiest since it can be quickly adapted to either... But it's much less elegant that either would be. Navigation is particularly difficult, but I would imagine that people will start in the ~/README.md and then get linked to a specific page, then go back. Or will be hunting for a specific doc page which should be easier to find. If it's not easier, I can re-organize or add more navigation options. I was afraid of deleting too much of the read-the-docs (since a lot of info there seems irrelevant), so didn't do anything there. But I can. Note the code-of-conduct is still showing "problems" in a markdown linter, but I do not see it necessary to fix those. All other markdown files (outside of ~/.github/) show no errors. --- doc/README.md | 37 ++++++++ doc/installation.md | 114 ---------------------- doc/installation/build_opts.md | 38 ++++++++ doc/installation/dependencies.md | 130 +++++++++++++++++++++++++ doc/installation/installation.md | 151 ++++++++++++++++++++++++++++++ doc/{ => usage}/debug.md | 17 ++-- doc/{ => usage}/ensembles.md | 36 ++++--- doc/{ => usage}/indices.md | 3 +- doc/{ => usage}/running_aether.md | 119 ++++++++++++++++------- 9 files changed, 474 insertions(+), 171 deletions(-) create mode 100644 doc/README.md delete mode 100644 doc/installation.md create mode 100644 doc/installation/build_opts.md create mode 100644 doc/installation/dependencies.md create mode 100644 doc/installation/installation.md rename doc/{ => usage}/debug.md (89%) rename doc/{ => usage}/ensembles.md (86%) rename doc/{ => usage}/indices.md (93%) rename doc/{ => usage}/running_aether.md (60%) diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 00000000..f516b145 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,37 @@ +# Temporary Aether Documentation + +As the [full Aether +documentation](https://aetherdocumentation.readthedocs.io/en/latest/index.html) +is still in [development](https://github.com/AetherModel/AetherDocumentation), +this collection of Markdown files may provide more information on the use of the +Aether model. + +Users are encouraged to begin with the [README](../README.md) at the root of the +repository first, then consult the documents here for further assistance. While +effort was devoted to covering as much as possible regarding setup, it is +inevitable that there will be gaps in the documentation. Do not hesitate to +file an Issue on the Aether repository to request the documentation be filled +in. + +## Quick Links + +Contents within `doc`: + +`doc` + +- Design + - [Standards](design/standards.md) +- Installing + - [Installation](installation/installation.md) + - [Dependencies](installation/dependencies.md) + - [Compilation Options](installation/build_opts.md) +- Usage + - [Running Aether](usage/running_aether.md) + - [Debugging](usage/debug.md) + - [Ensembles](usage/ensembles.md) + - [Indices](usage/indices.md) +- [Doxyfile](Doxyfile) +- [README (this page)](README.md) +- [Citations](citations.md) +- [Dev Team](dev_team.md) +- [Students](student.md) diff --git a/doc/installation.md b/doc/installation.md deleted file mode 100644 index 6f27df2e..00000000 --- a/doc/installation.md +++ /dev/null @@ -1,114 +0,0 @@ -# Installation instructions - -## Dependencies - -Before beginning Aether installation, make sure the following dependencies are -available on your system. We recommend using a package manager, such as -MacPorts, Homebrew (Mac OS X), apt-get (Ubuntu), or Chocolatey (Windows). - -| Mac OS X | -|--------------------------------| -| Dependency | Tested version | -|---------------|----------------| -| armadillo | 11.4 | -| boost | 1.76 | -| cmake | 2.24 | -| gcc | 10, 11 | -| netcdf | 4.9 | -| netcdf-cxx4 | 4.3 | -| nlohmann-json | 3.11 | -| OpenBLAS | 0.3 | -| mpich | 4.1 | - - - -| Ubuntu | -|-------------------------------------| -| Dependency | Tested version | -|--------------------|----------------| -| cmake | 2.24 | -| gcc | 10, 11, 12 | -| libarbadillo-dev | | -| libblas-dev | | -| libboost-dev | | -| liblapack-dev | | -| libnetcdf-dev | | -| libnetcdf-c++4-dev | | -| libopenmpi-dev | | -| nlohmann-json3-dev | | -| openmpi-bin | same as gcc | - -## Get Aether - -Clone Aether from GitHub into a local directory of your choosing. We currently -recommend checking out the `develop` branch, as the model is still awaiting its -first release. - -## Build Aether - -Start by creating a build directory for the necessary files. In this example, -we show how to do so from the Aether project directory and assume you start -there. - -```bash -mkdir build -cd build -``` - -Next, use `cmake` to create the necessary make files in the build directory - -```bash -cmake .. -``` - -This is also the point where compilation options can be chosen. These take -the structure: - -```bash -cmake -DFLAG=VALUE .. -``` - -where `FLAG` is a flag name and `VALUE` is the desired value. A table of model -options is included below. Depending on your system, you may also need to -either declare local environment variables or define them using this flag -system. These will show up as cmake warnings. - -| Aether Flag | Value | Description | -|----------------------|-------|-----------------------------------| -| USE_DOUBLE_PRECISION | Y | Run Aether with higher precission | - -If your default compiler isn't a GCC compiler, you will likely need to specify -the desired GCC compiler at this step using: - -```bash -cmake -DCMAKE_CXX_COMPILER= -``` - -Finally, run the make command in the build directory: - -```bash -make [-jN] -``` - -The `-j` flag tells the computer the number of processers to use when running -the code (where N is that number). To use a single processor, just do not use -the flag. - -If the make command fails, try using the `VERBOSE=1` flag. This will include -additional output that may make it easier to debug the process. - -## Test the executable - -To test the model executable, exit the build diretory and run the test script: - -```bash -cd .. -cp -R share/run ./run.test -cd run.test -./aether -``` - -The output should LOOK LIKE THIS - -For more details about running Aether, see the documentation about creating and -modifying input files in the document running_aether.md. \ No newline at end of file diff --git a/doc/installation/build_opts.md b/doc/installation/build_opts.md new file mode 100644 index 00000000..78e8bb48 --- /dev/null +++ b/doc/installation/build_opts.md @@ -0,0 +1,38 @@ +# Compilation Options + +When compiling the code, you are able to set variables to pass to the compiler. +This can enable things like NetCDF optputs, for example. This page serves to +give a rough description of the available compilation flags and their purpose. + +Depending on your system, you may also need to either declare local environment +variables or define them using this flag system. These will show up as `cmake` +warnings. + +## Table of Compilation Options + +The following table lists many of the optional compilation flags. For boolean +flags, the value can be set to `ON` or `Y` to enable it. All boolean options are +disabled by default. + +| Compilation Flag | Type | Description | +| ---------------------- | ------- | ---------------------------------------- | +| `USE_DOUBLE_PRECISION` | boolean | Run Aether with higher precision | +| `CMAKE_CXX_COMPILER` | path | Path to gcc or MPI executable | +| `USE_FORTRAN` | boolean | Enables the compilation of Fortran code. | +| `USE_NETCDF` | boolean | Write outputs to NetCDF format? | + +Recall, the flags are specified with `cmake -DFLAG=VALUE ..`, where `FLAG` is a +flag name and `VALUE` is the desired value. + +### Additional Test flags + +The following flags are used for testing vaious aspects of the Aether model. +These are not recommended to be enabled unless you are involved in development. + +- `TEST_INTERPOLATION` +- `TEST_COORD` +- `TEST_EXCHANGE` + - Enables `USE_DOUBLE_PRECISION` as well. +- `TEST_GRADIENT` + +> These flags are mutually exclusive; multiple *cannot* be used at the same time. diff --git a/doc/installation/dependencies.md b/doc/installation/dependencies.md new file mode 100644 index 00000000..c02dcd5a --- /dev/null +++ b/doc/installation/dependencies.md @@ -0,0 +1,130 @@ +# Installing Dependencies + +Instructions for MacOS are written for use with MacPorts, as the development +team has mostly used MacPorts and not Homebrew. Commands for the two package +managers are nearly identical, although Homebrew may be preferred if you do not +have root access on your machine. For example, the following two commands will +both install `cmake`. Translating the following guide from MacPorts to Homebrew +is left to the user. + +```bash +sudo port install cmake +brew install cmake +``` + +> To check if any of the following dependencies are already installed on your +system, you will need access to the command line (terminal). To check if (and +where) `cmake` is installed, for example, the command `which cmake` can be run. +If a path is printed, `cmake` is installed. To check the version, run `cmake +--version`. + +The layout of this page is as follows: + +- [Installing Dependencies](#installing-dependencies) + - [Install gcc](#install-gcc) + - [Install cmake](#install-cmake) + - [Install JSON libraries](#install-json-libraries) + - [Install Armadillo (and boost)](#install-armadillo-and-boost) + - [Install NetCDF (optional)](#install-netcdf-optional) + +## Install gcc + +This comes installed by default on Ubuntu. On MacOS this can be installed, for +example, using: + +```bash +sudo port install gcc11 +``` + +> As development began, gcc11 was the latest version; there are newer versions +> of `gcc` available now (latest version is gcc14), which have not yet been +> validated. + +## Install cmake + +Aether uses [CMake](https://cmake.org/) instead of `make`. If you don't have it +installed, you need it. + +For MacOS, this can be installed with: + +```bash +sudo port install cmake +``` + +For Ubuntu/Debian Linux: + +```bash +sudo apt install cmake +``` + +This can be done on RedHat using yum also. + +## Install JSON libraries + +Aether uses the nlohman json package for reading and writing json files. + +On Ubuntu: + +```bash +sudo apt-get install -y nlohmann-json3-dev +``` + +On Mac: + +```bash +sudo port install nlohmann-json +``` + +## Install Armadillo (and boost) + +Simplistically, Armadillo is a system that allows matrix math to be done in C++ +easily. We mostly use it for doing math with matrices (like multiplication, +addition, etc.), but it is much more powerful than this. You will notice that +there are not many 3D loops in Aether, which is due to Armadillo. To make this +all fast, it is best to install the `lapack` and `blas` libraries too. + +On Ubuntu: + +```bash +sudo apt-get install liblapack-dev +sudo apt-get install libblas-dev +sudo apt-get install libboost-dev +sudo apt-get install libarmadillo-dev +sudo apt-get install openmpi-bin libopenmpi-dev +``` + +On Mac: + +```bash +sudo port install lapack +sudo port install OpenBLAS +sudo port install boost +sudo port install armadillo +sudo port install openmpi-bin libopenmpi-dev + ``` + +## Install NetCDF (optional) + +We have removed the strict dependency for NetCDF, but a lot of codes used +NetCDF, so it doesn't hurt to try to install the libraries. Aether uses the +NetCDF library (netcdf-cxx4). As above, NetCDF can be installed using a package +manager. + +On Mac, if you want the clang compiled version of netcdf, then: + +```bash +sudo port install netcdf-cxx4 +``` + +If you want the gcc version of netcdf, then: + +```bash +sudo port install netcdf-cxx4 +gcc10 +``` + +On Ubuntu, gcc is the default compiler, it seems like you can probably just do: + +```bash +sudo apt-get install libnetcdf-dev +sudo apt install libnetcdf-c++4-dev +``` diff --git a/doc/installation/installation.md b/doc/installation/installation.md new file mode 100644 index 00000000..bec10985 --- /dev/null +++ b/doc/installation/installation.md @@ -0,0 +1,151 @@ +# Installation instructions + +Before installing the Aether model, it is recommended to ensure the required +[dependencies](#dependencies) for your system are met. The next step is to +[download](#get-aether) and then [build](#build-aether) the software. Your +install can then be [tested](#test-the-executable). + +## Dependencies + +The Aether development team has tested several possible configurations of the +following dependencies. Note that other versions of these programs may possibly +work, however the listed versions are the recommended starting point. + +If you are working on an HPC cluster, it is likely that all of these +dependencies will already be installed. Consult the documentation of your +specific system to find out how to load the software, which will likely be done +with `module`. + +### MacOS + + | Dependency | Tested version | + |---------------|----------------| + | armadillo | 11.4 | + | boost | 1.76 | + | cmake | 2.24 | + | gcc | 10, 11 | + | netcdf | 4.9 | + | netcdf-cxx4 | 4.3 | + | nlohmann-json | 3.11 | + | OpenBLAS | 0.3 | + | mpich | 4.1 | + + MacOS has two predominant package managers: [Homebrew](https://brew.sh) and + [MacPorts](https://www.macports.org/). Either will work. + +### Linux + + | Dependency | Tested version | + |--------------------|----------------| + | cmake | 2.24 | + | gcc | 10, 11, 12 | + | libarbadillo-dev | | + | libblas-dev | | + | libboost-dev | | + | liblapack-dev | | + | libnetcdf-dev | | + | libnetcdf-c++4-dev | | + | libopenmpi-dev | | + | nlohmann-json3-dev | | + | openmpi-bin | same as gcc | + +The specific package manager to use depends on which distribution of Linux +Aether is installed on. More details on Linux package managers can be found +[here](https://www.linode.com/docs/guides/linux-package-management-overview/#comparison-of-package-managers). + +> Programs such as `conda` and `snap` are **not** recommended to install +> dependencies. + +## Get Aether + +Clone Aether from GitHub into a local directory of your choosing. We currently +recommend checking out the `develop` branch, as the model is still awaiting its +first release. + +```bash +cd [some/directory] +git clone git@github.com:AetherModel/Aether.git +cd Aether +git checkout develop +``` + +## Build Aether + +Start by creating a build directory for the necessary files. In this example, +we show how to do so from the Aether project directory and assume you start +there. + +```bash +mkdir build +cd build +``` + +Next, use `cmake` to create the necessary make files in the build directory + +```bash +cmake .. +``` + +This is also the point where compilation options can be chosen. These take +the structure: + +```bash +cmake -DFLAG=VALUE .. +``` + +Here `FLAG` is a flag name and `VALUE` is the desired value (note the `-D`). A +more complete discussion of the available compilation flags can be found on the +[Compilation Options](build_opts.md) page. + +If your default compiler isn't a GCC compiler, you will likely need to specify +the desired GCC compiler at this step using: + +```bash +cmake -DCMAKE_CXX_COMPILER= +``` + +Finally, run the make command in the build directory: + +```bash +make [-jN] +``` + +The `-j` flag tells the computer the number of processers to use when running +the code (where N is that number). To use a single processor, just do not use +the flag. + +If the make command fails, try using the `VERBOSE=1` flag. This will include +additional output that may make it easier to debug the process. + +## Test the executable + +To test the model executable, exit the build diretory and run the test script: + +```bash +cd .. +cp -R share/run ./run.test +cd run.test +./aether +``` + +The output should look like this: + +```bash +> Need to NOT adjust F10.7, but that isn't included yet!!! +> Writing file : 3DALL_20110320_000000 +> Writing file : 3DBFI_20110320_000000 +> Wall Time : 4s (left : 1111h); Current Time : 2011 3 20 0 0 0 0 +> Wall Time : 4s (left : 23m); Current Time : 2011 3 20 0 0 10 0 +> Wall Time : 5s (left : 14m); Current Time : 2011 3 20 0 0 20 0 +> Wall Time : 5s (left : 9m); Current Time : 2011 3 20 0 0 30 0 +> Wall Time : 5s (left : 7m); Current Time : 2011 3 20 0 0 40 0 +> Wall Time : 6s (left : 7m); Current Time : 2011 3 20 0 0 50 0 +> Wall Time : 6s (left : 5m); Current Time : 2011 3 20 0 1 0 0 +> Wall Time : 6s (left : 5m); Current Time : 2011 3 20 0 1 10 0 +> Wall Time : 7s (left : 5m); Current Time : 2011 3 20 0 1 20 0 +> Wall Time : 7s (left : 4m); Current Time : 2011 3 20 0 1 30 0 +etc. +``` + +For more details about running Aether, see the documentation about creating and +modifying input files in the document running_aether.md. diff --git a/doc/debug.md b/doc/usage/debug.md similarity index 89% rename from doc/debug.md rename to doc/usage/debug.md index 9da04050..d2b5c706 100644 --- a/doc/debug.md +++ b/doc/usage/debug.md @@ -1,14 +1,17 @@ +# Debug The Debug command in the input file sets the type and amount of information that is fed to the user. An example of the Debug command is: +```json "Debug" : { - "iVerbose" : 0, - "dt" : 60.0, - "TimingPercent" : 1.0, - "iTimingDepth" : 5, - "iProc" : 0}, + "iVerbose" : 0, + "dt" : 60.0, + "TimingPercent" : 1.0, + "iTimingDepth" : 5, + "iProc" : 0}, +``` The "iVerbose" command can be used under "Debug" in aether.json to set the overall verbose level in the code. This sets the amount of @@ -37,6 +40,7 @@ certain functions by specifying the function names and the corresponding verbose levels using the "iFunctionVerbose" command as follows: +```json "Debug" : { "iVerbose" : 0, "iFunctionVerbose" : { @@ -44,8 +48,9 @@ follows: "func2" : 2}, "dt" : 10.0 } +``` When a sub-function is entered, the verbose level stays the same if the verbose level for that sub-function is not specified. When that sub-function exits, the verbose level will accordingly be set back to -that of the function it is returning to. \ No newline at end of file +that of the function it is returning to. diff --git a/doc/ensembles.md b/doc/usage/ensembles.md similarity index 86% rename from doc/ensembles.md rename to doc/usage/ensembles.md index 7184c291..54eba907 100644 --- a/doc/ensembles.md +++ b/doc/usage/ensembles.md @@ -1,10 +1,13 @@ +# Ensembles Aether is capable of running with ensembles, meaning that you can run multiples of the same simulation in one run. This is enabled by adding to the aether.json file: +```json "Ensembles" : { "nMembers" : N}, +``` where N is the number of members that you would like to run. In order to do this, the number of nodes that are requested have to be N times @@ -19,21 +22,22 @@ with. To perturb indices in Aether, you can use the "Perturb" command in the aether.json file. As an example: - "Perturb": { - "f107" : { "Mean" : 1.0, - "Std" : 0.10, - "Add" : false, - "Constant" : true}, - "f107a" : { "Mean" : 1.0, - "Std" : 0.10, - "Add" : false, - "Constant" : true}, - "imfbz" : { "Mean" : 0.0, - "Std" : 2.0, - "Add" : true, - "Constant" : false} - +```json +"Perturb": { + "f107" : { "Mean" : 1.0, + "Std" : 0.10, + "Add" : false, + "Constant" : true}, + "f107a" : { "Mean" : 1.0, + "Std" : 0.10, + "Add" : false, + "Constant" : true}, + "imfbz" : { "Mean" : 0.0, + "Std" : 2.0, + "Add" : true, + "Constant" : false} } +``` This perturbs the F10.7, F10.7a, and IMF Bz indices. The sub-parts of the command include: @@ -74,8 +78,10 @@ the post processing code can create mean and std files. You can also perturb chemical reaction rates, but doing something like: +```json "Perturb": { - "Chemistry" : ["R2", "R10", "R20"] } + "Chemistry" : ["R2", "R10", "R20"] } +``` This will perturb the reaction rates in the chemistry file. The Rxx names have to be in the "name" column. The percentage of uncertainty diff --git a/doc/indices.md b/doc/usage/indices.md similarity index 93% rename from doc/indices.md rename to doc/usage/indices.md index 5949ea93..8dc2e20f 100644 --- a/doc/indices.md +++ b/doc/usage/indices.md @@ -1,5 +1,5 @@ -Supported Indices within Aether (with internal id): +# Supported Indices within Aether (with internal id) F10.7: Solar index (f107) @@ -26,4 +26,3 @@ AE: Auroral electrojet index in nT (ae) AU: Auroral electrojet upper index in nT (au) AL: Auroral electrojet lower index in nT (al) - diff --git a/doc/running_aether.md b/doc/usage/running_aether.md similarity index 60% rename from doc/running_aether.md rename to doc/usage/running_aether.md index 8c2d2a81..af7a9260 100644 --- a/doc/running_aether.md +++ b/doc/usage/running_aether.md @@ -1,25 +1,32 @@ # Running Aether -See the installation.md document for how to install Aether. +This document assumes you have already downloaded and built the Aether model. If +not, you should return to [one](../../README.md) of +[these](../installation/installation.md) pages before continuing. ## The first run Once you have compiled you can run Aether. To remember which runs you're doing, we recommend creating a specific directory for each run. This can be done by copying the default run directory to have a special name, like this: + ```bash cd .. cp -R share/run ./run.first_run ``` -This creates the directory where you will do your run. In that directory is a link to the aether executable and an input file called aether.json. +This creates the directory where you will do your run. In that directory is a +link to the aether executable and an input file called aether.json. You can then run the executable from the directory you created. + ```bash cd run.first_run ./aether ``` + You should see something like: + ```bash run.first_run% ./aether > Need to NOT adjust F10.7, but that isn't included yet!!! @@ -39,6 +46,7 @@ etc. ``` The successful end of this will show a timing summary, similar to: + ```bash >main>advance>Chemistry::calc_chemistry nTimes called : 720 @@ -53,21 +61,38 @@ The successful end of this will show a timing summary, similar to: ## Output Files -Aether outputs to a subdirectory called UA/output. At this time, all processors within the Aether run output their own files and they can be combined using the post processor. +Aether outputs to a subdirectory called UA/output. At this time, all processors +within the Aether run output their own files and they can be combined using the +post processor. ### Blocks -Aether is a block-based code, so the domain is split up into different blocks that hold a given volume (for spherical grids, this is some range of latitude, longitude and altitude; for other grids it could differ). If you asked for (for example) 4 processors, then the Earth would be broken up into 4 different blocks and each output would consist of 4 different blocks. +Aether is a block-based code, so the domain is split up into different blocks +that hold a given volume (for spherical grids, this is some range of latitude, +longitude and altitude; for other grids it could differ). If you asked for (for +example) 4 processors, then the Earth would be broken up into 4 different blocks +and each output would consist of 4 different blocks. ### Ensembles -Aether can run the same simulation multiple times simultaneously with different drivers and internal parameters. The collection of these simulations is called an ensemble, with each individual simulation called a member. All of the ensemble members output to the UA/output directory. See the ensembles.md document to learn more about ensembles. +Aether can run the same simulation multiple times simultaneously with different +drivers and internal parameters. The collection of these simulations is called +an ensemble, with each individual simulation called a member. All of the +ensemble members output to the UA/output directory. See the ensembles.md +document to learn more about ensembles. ### Post processing -Because there can be multiple blocks and multiple ensemble members, there is a post processor that can pull all of the files together. By default, the post processor combines all of the block files for one ensemble member for one time into one file. This means that if there are 25 hourly outputs requested, there will be 25 total files for each ensemble member. +Because there can be multiple blocks and multiple ensemble members, there is a +post processor that can pull all of the files together. By default, the post +processor combines all of the block files for one ensemble member for one time +into one file. This means that if there are 25 hourly outputs requested, there +will be 25 total files for each ensemble member. -If there is more than one simulation, then the post processor will create a mean file for each time. If there are more than two ensemble members, a standard deviation file is also created. The mean and standard deviations are calculated across ensemble members. +If there is more than one simulation, then the post processor will create a mean +file for each time. If there are more than two ensemble members, a standard +deviation file is also created. The mean and standard deviations are calculated +across ensemble members. To run the post processor, do the following: @@ -76,54 +101,72 @@ cd UA/output ../../../srcPython/post_process.py ``` -By default, this will also leave the raw files and will produce plots just to make sure that everything is working ok. If you don't need the raw files (there is not a good reason to keep these, unless you are debugging the post processor), you can run the post-processor with the "-rm" argument. If you don't want any plots, you can run with the "-alt=-1" argument. An example of this is (this is how it is often run): +By default, this will also leave the raw files and will produce plots just to +make sure that everything is working ok. If you don't need the raw files (there +is not a good reason to keep these, unless you are debugging the post +processor), you can run the post-processor with the "-rm" argument. If you +don't want any plots, you can run with the "-alt=-1" argument. An example of +this is (this is how it is often run): ```bash ../../../srcPython/post_process.py -rm -alt=-1 ``` -If you are going to be using Aether a lot, you may want to copy the post-processor into your bin directory. +If you are going to be using Aether a lot, you may want to copy the +post-processor into your bin directory. ## Input Files -Aether reads in a bunch of files, most of which are specified by the settings file. In order to minimize the number of places where new settings need to be specified, Aether uses a defaults file that sets the generic defaults of the model. This file is in UA/inputs/defaults.json. +Aether reads in a bunch of files, most of which are specified by the settings +file. In order to minimize the number of places where new settings need to be +specified, Aether uses a defaults file that sets the generic defaults of the +model. This file is in UA/inputs/defaults.json. ## defaults.json file -This is a json file that sets all of the defaults within Aether. This file should never be modified! +This is a json file that sets all of the defaults within Aether. This file +should never be modified! ### For Developers -Within Aether, the inputs.cpp file has a large handful of of get_ routines to get the values of the settings that the user has set. +Within Aether, the inputs.cpp file has a large handful of of get_ routines to +get the values of the settings that the user has set. ## aether.json file -The file aether.json is read in AFTER the defaults file and these settings overwrite the defaults. So, if you want to modify the default settings, simply copy a setting out of defaults.json and paste it into aether.json. Then, you can modify the setting in aether.json. +The file aether.json is read in AFTER the defaults file and these settings +overwrite the defaults. So, if you want to modify the default settings, simply +copy a setting out of defaults.json and paste it into aether.json. Then, you +can modify the setting in aether.json. -Because the files are json files, you don't actually have to set all of the subsettings within a specific setting. For example, within the defaults.json file, the EUV setting is: +Because the files are json files, you don't actually have to set all of the +subsettings within a specific setting. For example, within the defaults.json +file, the EUV setting is: ```bash "Euv" : { - "doUse" : true, - "Model" : "euvac", - "File" : "UA/inputs/euv.csv", - "IncludePhotoElectrons" : true, - "HeatingEfficiency" : 0.05, - "dt" : 60.0}, + "doUse" : true, + "Model" : "euvac", + "File" : "UA/inputs/euv.csv", + "IncludePhotoElectrons" : true, + "HeatingEfficiency" : 0.05, + "dt" : 60.0}, ``` -If you simply want to turn off the EUV, you can insert this into the aether.json file: +If you simply want to turn off the EUV, you can insert this into the aether.json +file: ```bash "Euv" : { - "doUse" : false}, + "doUse" : false}, ``` -or, if you wanted to use the 59 wavelength bins instead of the 37 EUVAC bins, you could do: +or, if you wanted to use the 59 wavelength bins instead of the 37 EUVAC bins, +you could do: ```bash "Euv" : { - "File" : "UA/inputs/euv_59.csv"}, + "File" : "UA/inputs/euv_59.csv"}, ``` ## planet.in file @@ -155,12 +198,13 @@ CO2, 46, 7, 3.6e-4, 0.69, 0, 4.5e15 ``` This is a comma seperated list that includes: + - name - this is the common name of the species - mass - the atomic mass of the species - vibration - the degrees of freedom for the species - thermal_cond - the thermal conductivity coeficient of the species - thermal_exp - the exponent that is put on the temperature (Lambda = A * T^B) -- advect - whether the species is advected or not +- advect - whether the species is advected or not - BC - the lower boundary condition on the species density ```bash @@ -177,10 +221,11 @@ O+_2P, 16, 1, 0 ``` This is a comma separated list that includes: + - name - this is the common name of the species - mass - the atomic mass of the species - charge - the charge of the species -- advect - whether the species is advected or not +- advect - whether the species is advected or not ```bash #TEMPERATURE @@ -194,30 +239,36 @@ Within the input file (i.e., aether.json), the following can be set: ```bash "InitialConditions" : { - "type" : "Planet"}, - + "type" : "Planet"}, + "BoundaryConditions" : { - "type" : "Planet"}, + "type" : "Planet"}, ``` -If these are set to "Planet", then the temperature profile is set as the initial condition. If the boundary condition is set to "Planet", then the lowest altitude is used as a boundary condition on the temperature. +If these are set to "Planet", then the temperature profile is set as the initial +condition. If the boundary condition is set to "Planet", then the lowest +altitude is used as a boundary condition on the temperature. ## orbits.csv file -This file contains all of the orbital, mass, rotation, and magnetic field characteristics of the planets. All of the planets within the solar system are included. Other planets (like exo-planets or artificial planets) can be included by adding lines. +This file contains all of the orbital, mass, rotation, and magnetic field +characteristics of the planets. All of the planets within the solar system are +included. Other planets (like exo-planets or artificial planets) can be +included by adding lines. ## chemistry file The chemistry file defines all of the chemical reactions within the system. For example: + ```bash He+ + e- -> He, with R = 4.8e-18 * (250 / Te) ^ 0.7 ``` -With an exothermal energy of xxx. Also, the uncertainty of the reaction can be set too (set to 10%, or 0.1). + +With an exothermal energy of xxx. Also, the uncertainty of the reaction can be +set too (set to 10%, or 0.1). ```bash R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,,0.1,,,,gitm,250,Te,0.7,,,,1, ``` - - From c26b79efdb81e2548ca324190e7fae31fee2e27d Mon Sep 17 00:00:00 2001 From: "abukowski21@gmail.com" Date: Wed, 24 Jul 2024 14:26:17 -0400 Subject: [PATCH 169/691] DOC: Create folder doc/internal/, style markdown files Moving the files grid.md, ensembles.md, indices.md to new folder `docs/internal`. Should organize things a little better, but the folder name might need to be changed. ALSO: - Update the README's with the updated TOC's. - Consistent Markdown syntax: - consistent use of dashes/equals & hashtags for header level - no double empty lines - headings in descending-by-one order - denote links with <>'s - Add a language to each fenced (three backticks) code blocks --- CONTRIBUTING.md | 45 ++-- README.md | 2 +- doc/README.md | 6 +- doc/design/standards.md | 3 +- doc/grid.md | 153 ------------ doc/{usage => internals}/ensembles.md | 0 doc/internals/grid.md | 332 ++++++++++++++++++++++++++ doc/{usage => internals}/indices.md | 0 8 files changed, 365 insertions(+), 176 deletions(-) delete mode 100644 doc/grid.md rename doc/{usage => internals}/ensembles.md (100%) create mode 100644 doc/internals/grid.md rename doc/{usage => internals}/indices.md (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 141db86d..07ced9ce 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,12 +1,21 @@ -Contributing -============ - -Code ----- +# Contributing Please read the [standards document](doc/design/standards) before contributing. +- [Contributing](#contributing) + - [Code](#code) + - [Development](#development) + - [Using AStyle](#using-astyle) + - [Linting](#linting) + - [Commit Styling](#commit-styling) + - [Pull Requests](#pull-requests) + - [Issues](#issues) + +--- + +## Code + ### Development Make new branches for features `git checkout -b my_feature` and commit often @@ -16,8 +25,8 @@ you have something that works. #### Using AStyle We have started using astyle to format the code. Please see -http://astyle.sourceforge.net/. There is a style file in the root directory -of Aether, called .astylerc. To run this, do: +. There is a style file in the root directory of +Aether, called .astylerc. To run this, do: AStyle --project=.astylerc src/*.cpp @@ -25,7 +34,6 @@ on WSL with Ubuntu, the command seems to be: astyle --options=.astylerc src/*.cpp - #### Linting For *C++* code make sure to use a static code checker like @@ -44,13 +52,13 @@ python3 -m pip cpplint python3 -m pip --user cpplint ``` -Using a linter in an editor is a good supplement, but not a replacement for the static linters. -The linter in the 'atom' editor requires that you install the `linter` and `gcc-linter` packages. -Atom also has additional packages `whitespaces` and `tabs-to-spaces` -to automatically remove whitespaces at the end of the lines, and -convert tabs to spaces. +Using a linter in an editor is a good supplement, but not a replacement for the +static linters. The linter in the 'atom' editor requires that you install the +`linter` and `gcc-linter` packages. Atom also has additional packages +`whitespaces` and `tabs-to-spaces` to automatically remove whitespaces at the +end of the lines, and convert tabs to spaces. -### Commit Styling +## Commit Styling The first line of the commit must be *at most* ~50 characters long and should start with either. @@ -74,25 +82,24 @@ For example, *do:* -``` +```github FEAT: Hydrostatic density implementation. ``` *don't:* -``` +```github Implemented hydrostatic density. (feature) ``` -### Pull Requests +## Pull Requests Make sure you have linted and checked your code before asking for a pull request. Before requesting a review, ensure the pull request check list has been completed. Another member must check the code and approve it before merge. -Issues ------- +## Issues *Issues* are reporting bugs, feature requests, or goals for the project. In order to submit an issue make sure it follows the [issue diff --git a/README.md b/README.md index b28a8007..d6fd6ebe 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ When you are in a run directory, they are: 1. UA/inputs/defaults.json. These set the default inputs for the run and should not be modified at all. You can look at these and copy the settings that you -want to change to this file: +want to change to this file. 2. aether.json. This file can and should be modified to direct the code to run the way that you would like. You can copy settings from the default.json file diff --git a/doc/README.md b/doc/README.md index f516b145..d1601e3d 100644 --- a/doc/README.md +++ b/doc/README.md @@ -28,8 +28,10 @@ Contents within `doc`: - Usage - [Running Aether](usage/running_aether.md) - [Debugging](usage/debug.md) - - [Ensembles](usage/ensembles.md) - - [Indices](usage/indices.md) +- Aether Internals + - [Ensembles](internals/ensembles.md) + - [Indices](internals/indices.md) + - [The Grid](internals/grid.md) - [Doxyfile](Doxyfile) - [README (this page)](README.md) - [Citations](citations.md) diff --git a/doc/design/standards.md b/doc/design/standards.md index af071cc4..a7422db1 100644 --- a/doc/design/standards.md +++ b/doc/design/standards.md @@ -4,7 +4,8 @@ Aether Coding and Design Standards Document Overall Design Philosophy ------------------------- -## Files +Files +---- Directory Structure: diff --git a/doc/grid.md b/doc/grid.md deleted file mode 100644 index b7b76eb3..00000000 --- a/doc/grid.md +++ /dev/null @@ -1,153 +0,0 @@ - -# Grids in Aether - -Aether uses a 2d domain decomposition and the grid system is basically a 3D i, j, k system, meaning that the arrays within Aether are 3D arrays. Aether decomposes the grid in the first 2 dimensions (i and j) using a quadtree structure, while the 3rd dimension is left alone and each processor solves for the entire 3rd dimension. - -Practically, what this means is that Aether uses powers of 4 to specify the grid system. When you ask for 4x the number of processors it doubles the resolution in i and j. You can't double in i or j independently. - -Aether using root nodes, which specify the smallest number of processors that can be run on. For example, the simple "Sphere" grid has one root node that handles the entire Earth (in latitude and longitude). If the resolution needs to be doubles, 4 processors can be asked for. If the resolution is doubled again, 16 processors are needed. Etc. However, in the altitude/radial direction, the number of points that are specified in the aether.json is never doubled when more processors are asked for. - -## Grid Types Explained - -Aether has two types of grid systems - the neutral grid (neuGrid) and the ion grid (ionGrid). For each type of constituent (neutral or ion), their primary grid is the one where most of the equations are solved, and then they are passed to the other grid. For example, the neutral winds are solved for on the NeuGrid, and then passed onto the IonGrid in order to calculate source terms for the ions. As another example, the ion advection is solved for on the ion grid. The ion densities are then passed to the neutral grid, where the source terms for the neutrals are calculated. - -These grids can be identical or nearly identical. If they are, then it is best to have them on a neutral type of grid, since the stability of the neutrals along the 3rd dimension (where gravity is prime) is hard to achieve. - -The neutral grid system typically has its third axis aligned (mostly) with the radial direction. This is to allow special solvers to treat gravity and the gradient in pressure in a special way. There are two issues with solving the neutrals in the third dimension: (1) often, the top of thermosphere models are supposed to be the exosphere, which means that they can't extend too far in the vertical direction; and (2) a problem with neutral solvers that can solve the full momentum equation in the third dimension is that they struggle with having too many scale heights in a domain. These limit the full height of the model domain for the neutrals. - -For the ions, with systems that have magnetic fields, the plasma often moves up fieldlines on the dayside and down fieldlines on the nightside. This transport is often above the top of the neutral grid. Further, the ions are often structured by the magnetic field, making this the natural coordinate system. For planets without magnetic fields, a grid similar to the neutrals may be useful. The ion grid can extend above and below the neutral grid with both a magnetic-field-aligned grid and a spherical grid. - -## Grid Shapes Explained - -Aether currently has three basic grid shapes: spherical, cubesphere, and dipole. The spherical grid is a (i, j, k) = (longitude, latitude, altitude) system, with these being (mostly) orthogonal to each other. This grid system can simulate a sub-region of the Earth if desired. - -### TL;DR - -The user needs to specify the shape of the grid, which specifies the grid shape and the number of root nodes. Shapes include: sphere (1 root node), sphere6 (6 root nodes), cubesphere (6 root nodes), dipole (1 root node), dipole4 (4 root nodes), and dipole6 (6 root nodes). - -### The Sphere Grid - -The sphere grid is a normal longitude, latitude, altitude grid. - -### The Cubesphere Grid - -The cubesphere grid is composed of 6 different faces, similar to a cube, but where each cube "face" is pushed out to form a sphere. The corners of the cube intersect the sphere, and all of the other grid points on the cube are pushed out to form the cube. One cube face defines the southern polar region, one face defines the northern polar region, and the other four faces are spaced in longitude around the equatorial region. For the cubesphere grid, the (k) dimension is altitude. The (i, j) system is set up so that (i) is considered left-right on the cube face, while (j) is up-down. For the four faces around the equator, (i, j) is roughly (lon, lat), but not exactly. For the polar faces, the relationship between (i, j) and longitude, latitude is much more complex. - -For both the spherical grid and the cubesphere grid, the altitudes (k) can be stretched or uniform. A lower boundary is set and the delta-altitude is specified as either a constant distance or a constant percentage of the bulk scale-height. - -### The Dipole Grid - -The dipole grid is aligned with the magnetic field. The (k) dimension is along the fieldline, (i) is magnetic longitude, and (j) is roughly latitude for the bottom of the field-line. Each field-line starts at the lowest altitude and curves towards the equator. In the northern hemisphere, this means that the field-lines curve south, while in the southern hemisphere, they curve north. The latitudinal spacing is such that there is a dependence on the L-shell (i.e., the equatorial radial extent of the field-line). Along the (k) dimension, field-lines either terminate when they reach the equatorial plane, forming half of a full field-line or they terminate at the highest point specified in the aether.json file. Any grid point with an L-shell less than the peak altitude will terminate in the equatorial plane, while any field-line that has an L-shell above the peak altitude will simply terminate. Field-lines that terminate in the equatorial plane have corresponding field-lines in the other hemisphere, so ghostcells are used to pass information back and forth. Field-lines that terminate at the maximum altitude have vertical boundary conditions set in the ghost cells. - -The transition from the "closed" field-line region to the "open" field-line region is a natural break point in the grid. The transition between these regions can be handled with ghostcells in the "latitudinal" direction. Therefore it makes the most sense to have have 4 distinct regions in "latitude": south open, south closed, north closed, north open. The message passing is treated differently at the boundaries between each of these regions. - -### Root Nodes - -A fundamental assumption within Aether is that each processor does computation on one and only one block. This means that each processor does not deal with multiple blocks, and therefore the distribution of blocks across processors has to match exactly. This document uses the words "block" and "node" somewhat interchangably. Technically, a "block" is single (i, j, k) grid, while a "node" can be multiple "blocks" that make up a section of the globe. - -Aether uses a quadtree system to subdivide and distribute the grids (or blocks) across processors. This means that when an additional level of refinement is desired, an individual block is split in 4 - the number of blocks is doubled in both (i) and (j). The question then is - how many blocks to start with? These are the root nodes. - -For the whole globe sphere shape, there is one single root node, which allows users to run the code on a single processor. When a user asks for one processor using the sphere shape, there is only one single block, which is the root node, which spans then entire globe. When the user asks for four processors using the sphere shape, the number of blocks in latitude are doubled and the number of blocks in longitude are doubled. There is still only one root node, but the number of blocks is four, with 2 in the longitudinal direction and 2 in the latitudinal direction. If the user asks for 16 processors using the sphere shape, the blocks are sub-divided again, with sill one single root node, and 16 blocks - four in the longitudinal direction and four in the altitudinal direction. With a sphere grid, the number of processors that can be used to specify the grid are then: 1, 4, 16 (=4^2), 64 (=4^3), 256 (=4^4), 1024 (=4^5), etc. - -With a cubesphere grid, there are six root nodes, meaning that the code needs six processors to run on just to start. Each root node is a face of the cubesphere. If the user asks for 24 processors (i.e., 6 root nodes that are each divided into four blocks each), each root node is split in half along the left-right direction and the up-down direction. For a cubesphere grid, the number of processors that can be used to specify the grid are then: 6, 24 (= 6 * 4), 96 (6 * 4^2), 384 (6 * 4^3), etc. - -The root nodes indicate the span of the grid that they cover. This is done in a header file. In order to accomplish this, the lower-left corner location (ORGINS) is specified as well the span of the root node in the left-to-right (i) direction (RIGHTS) and in the (j) down-to-up direction (UPS). The easiest example is here: -```bash -namespace Sphere { - /// The normalized origins of each face of the cube (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0} - }; - /// Normalized right steps in cube - static const arma_mat RIGHTS = { - {2.0, 0.0, 0.0} - }; - /// Normalized right steps in cube - static const arma_mat UPS = { - {0.0, 1.0, 0.0} - }; -}; -``` - -Since the sphere goes from -90 deg to +90 deg in latitude, and 0 deg to 360 deg in longitude, and pi is the normalizer, then the grid should go from -0.5 to 0.5 in the UPS direction, so the ORIGIN is placed at -0.5 and the span is 1.0. In the longitudinal direction, the grid should go from 0 - 2, so the ORIGIN is placed at 0.0 and the span is 2.0. - -This could be altered to have two root nodes. If someone wanted the root node to be "square" in that the lat and lon spans are the same, this could be done: -```bash -namespace Sphere2 { - /// The normalized origins of each face of the cube (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - { 1.0, -0.5, 0.0} - }; - /// Normalized right steps in cube - static const arma_mat RIGHTS = { - {1.0, 0.0, 0.0}, - {1.0, 0.0, 0.0} - }; - /// Normalized right steps in cube - static const arma_mat UPS = { - {0.0, 1.0, 0.0}, - {0.0, 1.0, 0.0} - }; -}; -``` -Notice that the namespace is different, so that it can be unique. In this case, there are two ORGINS (offset by 1.0 in longitude), two RIGHTS (which are the same), and two UPS (which are the same). - -In both of these examples, the third dimension doesn't change. This is because a single altitude in a spherical grid can be fully described with two variables (lat and lon). For a cubesphere grid, on the other hand, there are three variables that are needed - each face is in an XY, XZ, or YZ plane, so all three (X, Y, and Z) are needed. The 6 root nodes for the cubesphere are specified in the cubesphere.h header file. - -## Specifying the Grid - -There are many different components to specifying the actual grid that is desired, namely: -- Min and Max latitude -- Min and Max longitude -- Min Altitude, whether a stretched altitude is desired, and the altitudinal spacing - -In addition, the number of grid points that should be used in each block are specified: -- nLons or nX - number of grid cells per block in the i direction -- nLats or nY - number of grid cells per block in the j direction -- nAlts or nZ - total number of grid cells in the block in the k direction - -### Horizontal Resolution - -For some grid shapes (Sphere and Dipole), the total number of grid cells in the i and j direction can be determined by, for example, multiplying the number of blocks in the i direction by the number of cells in each block in the i direction. So, with a spherical grid with one root node, and 256 processors used, the number of blocks in the i and j direction is (256 = 4 * 4 * 4 * 4. breaking it into both directions - (2*2) * (2*2) * (2*2) * (2*2) or (2 * 2 * 2 * 2) * (2 * 2 * 2 * 2) or 16 x 16) 16 and 16. So, the total number of blocks in the i direction is 16 * nLons and in the j direction is 16 * nLats. - -For the cubesphere grid, the nX and nY are the number of grid cells in the i and j direction. At this time, these have to be identical in order to have the grid cells match up along the boundaries to the top and bottom nodes. The resolution of the Cubesphere grid is roughly 360 deg / (4 * nX * sqrt(nProc/6)). For example, if nX = 18, and 24 processors are requested, then the resolution = 360 / (4 * 18 * sqrt(4)) = 360 / (72 * 2) = 2.5 deg. As another example, to make a grid with 1 deg resolution, with 96 processors, nX would have to be 1 = 360 / (4 * nX * 4) = 22.5 / nX, so nX has to be around 22. (If nX were 22, and nProc = 96, then the resolution would be 1.02 deg). - -### Vertical Resolution - -In all grids, the nAlts or nZ are not parallelized, so the number of points in the k direction is what is specified. For the sphere and cubesphere grids, this is the number of altitude points. On the dipole grid, this is the number of points along the dipole flux tube. - - -```bash - "neuGrid" : { - "Shape" : "sphere", - "LatRange" : [-90.0, 90.0], - "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 36, - "nAlts" : 50, - "MinAlt" : 100.0, - "dAltkm" : 5.0, - "dAltScale" : 0.25, - "IsUniformAlt" : true, - "AltFile" : ""}, -``` - -```bash - "ionGrid" : { - "Shape" : "dipole", - "LatRange" : [-90.0, 90.0], - "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 36, - "nAlts" : 200, - "MinAlt" : 80.0, - "MinApex" : 120.0, - "MaxAlt" : 5000.0}, -``` - -The dipole grid has both open field-lines and closed field-lines. The closed field-lines are near the equator, while the open field-lines are near the poles. The variable "MaxAlt" sets where this differentiation occurs - if the apex of the field-line is above this altitude, then it is open. All field-lines in Aether start are the "MinAlt" and rise along a dipolar shape until they either encounter the equatorial plane or "MaxAlt". In the south, these field-lines tilt towards the north (from MinAlt to MaxAlt) and in the north, the field-lines tilt towards the south (from MinAlt to MaxAlt). -- The spacing is uniform in longitude. -- The spacing along the field-line has non-uniform spacing. -- The spacing in latitude is non-uniform. - diff --git a/doc/usage/ensembles.md b/doc/internals/ensembles.md similarity index 100% rename from doc/usage/ensembles.md rename to doc/internals/ensembles.md diff --git a/doc/internals/grid.md b/doc/internals/grid.md new file mode 100644 index 00000000..a9858803 --- /dev/null +++ b/doc/internals/grid.md @@ -0,0 +1,332 @@ +# Grids in Aether + +Aether uses a 2d domain decomposition and the grid system is basically a 3D `(i, +j, k)` system, meaning that the arrays within Aether are 3D arrays. Aether +decomposes the grid in the first 2 dimensions (`i` and `j`) using a quadtree +structure, while the 3rd dimension is left alone and each processor solves for +the entire 3rd dimension. + +Practically, what this means is that Aether uses powers of 4 to specify the grid +system. When you ask for 4x the number of processors it doubles the resolution +in `i` and `j`. You can't double in `i` or `j` independently. + +Aether using root nodes, which specify the smallest number of processors that +can be run on. For example, the simple "Sphere" grid has one root node that +handles the entire Earth (in latitude and longitude). If the resolution needs +to be doubles, 4 processors can be asked for. If the resolution is doubled +again, 16 processors are needed, etc. However, in the altitude/radial direction, +the number of points that are specified in the aether.json is unchanged, as it +does not rely on the number of processors used. + +- [Grids in Aether](#grids-in-aether) + - [Grid Types Explained](#grid-types-explained) + - [Grid Shapes Explained](#grid-shapes-explained) + - [TL;DR](#tldr) + - [The Sphere Grid](#the-sphere-grid) + - [The Cubesphere Grid](#the-cubesphere-grid) + - [The Dipole Grid](#the-dipole-grid) + - [Root Nodes](#root-nodes) + - [Sphere](#sphere) + - [Cubesphere](#cubesphere) + - [Specifying Root Nodes](#specifying-root-nodes) + - [Specifying the Grid](#specifying-the-grid) + - [Horizontal Resolution](#horizontal-resolution) + - [Vertical Resolution](#vertical-resolution) + +## Grid Types Explained + +Aether has two types of grid systems - the neutral grid (`neuGrid`) and the ion +grid (`ionGrid`). For each type of constituent (neutral or ion), their primary +grid is the one where most of the equations are solved, and then they are passed +to the other grid. For example, the neutral winds are solved for on the +`neuGrid`, and then passed onto the `ionGrid` in order to calculate source terms +for the ions. As another example, the ion advection is solved for on the +`ionGrid`. The ion densities are then passed to the `neuGrid`, where the source +terms for the neutrals are calculated. + +These grids can be identical or nearly identical. If they are, then it is best +to have them on a neutral type of grid, since the stability of the neutrals +along the 3rd dimension (where gravity is prime) is hard to achieve. + +The neutral grid system typically has its third axis aligned (mostly) with the +radial direction. This is to allow special solvers to treat gravity and the +gradient in pressure in a special way. There are two issues with solving the +neutrals in the third dimension: (1) often, the top of thermosphere models are +supposed to be the exosphere, which means that they can't extend too far in the +vertical direction; and (2) neutral solvers struggle with having too many scale +heights in a domain when solving the full momentum equation. These limit the +full height of the model domain for the neutrals. + +For the ions, with systems that have magnetic fields, the plasma often moves up +field-lines on the dayside and down field-lines on the nightside. This transport +is often above the top of the neutral grid. Further, the ions are often +structured by the magnetic field, making this the natural coordinate system. For +planets without magnetic fields, a grid similar to the neutrals may be useful. +The ion grid can extend above and below the neutral grid with both a +magnetic-field-aligned grid and a spherical grid. + +## Grid Shapes Explained + +Aether currently has three basic grid shapes: `spherical`, `cubesphere`, and +`dipole`. The spherical grid is an (`i`, `j`, `k`) = (longitude, latitude, +altitude) system, with these being (mostly) orthogonal to each other. This grid +system can simulate a sub-region of the Earth if desired. + +### TL;DR + +The user needs to specify the shape of the grid, which specifies the grid shape +and the number of root nodes. Shapes include: `sphere` (1 root node), `sphere6` +(6 root nodes), `cubesphere` (6 root nodes), `dipole` (1 root node), `dipole4` +(4 root nodes), and `dipole6` (6 root nodes). + +### The Sphere Grid + +The sphere grid is a normal longitude, latitude, altitude grid. + +### The Cubesphere Grid + +The cubesphere grid is composed of 6 different faces, similar to a cube, but +where each cube "face" is pushed out to form a sphere. The corners of the cube +are first set to intersect the sphere, then all of the other grid points on the +cube are pushed out until they intersect the sphere. + +| Cube with spherical cube | +|:--:| +| A graphical representation of the cubesphere grid.
(*Source: A2569875, CC BY-SA 4.0 , via Wikimedia Commons*) | + +One cube face defines the southern polar region, one face defines the northern +polar region, and the other four faces are spaced in longitude around the +equatorial region. For the cubesphere grid, the `k` dimension is altitude. The +(`i, j`) system is set up so that `i` is considered left-right on the cube face, +while `j` is up-down. For the four faces around the equator, (`i, j`) is roughly +(longitude, latitude), but not exactly. For the polar faces, the relationship +between (`i, j`) and (longitude, latitude) is much more complex. + +For both the spherical grid and the cubesphere grid, the altitudes, `k`, can be +stretched or uniform. A lower boundary is set and the delta-altitude is +specified as either a constant distance or a constant percentage of the bulk +scale-height. + +### The Dipole Grid + +The dipole grid is aligned with the magnetic field. The `k` dimension is along +the fieldline, `i` is magnetic longitude, and `j` is roughly latitude for the +bottom of the field-line. Each fieldline starts at the lowest modeled altitude +and curves towards the equator. In the northern hemisphere, this means that the +fieldlines curve south, while in the southern hemisphere they curve north. + +The latitudinal spacing is such that there is a dependence on the L-shell (i.e., +the equatorial radial extent of the field-line). Along the `k` dimension, +field-lines either terminate when they reach the equatorial plane, forming half +of a full field-line, or they terminate at the highest point specified in the +aether.json file, forming an open field line. Any grid point with an L-shell +less than the peak altitude will terminate in the equatorial plane, while any +field-line that has an L-shell above the peak altitude will simply terminate. +Field-lines that terminate in the equatorial plane have corresponding +field-lines in the other hemisphere, so ghostcells are used to pass information +back and forth. Field-lines that terminate at the maximum altitude have +vertical boundary conditions set in the ghost cells. + +The transition from the "closed" field-line region to the "open" field-line +region is a natural break point in the grid. The transition between these +regions can be handled with ghostcells in the "latitudinal" direction. +Therefore it makes the most sense to have have 4 distinct regions in "latitude": +south open, south closed, north closed, north open. The message passing is +treated differently at the boundaries between each of these regions. + +### Root Nodes + +>This document uses the words "block" and "node" somewhat +interchangably. Technically, a "block" is single (`i, j, k`) grid, while a +"node" can be multiple "blocks" that make up a section of the globe. + +A fundamental assumption within Aether is that each processor does computation +on one and only one block. This means that each processor does not deal with +multiple blocks, and therefore the distribution of blocks across processors has +to match exactly. + +Aether uses a quadtree system to subdivide and distribute the grids (or blocks) +across processors. This means that when an additional level of refinement is +desired, an individual block is split in 4 - the number of blocks is doubled in +both `i` and `j`. The question then is *how many blocks to start with*? These +are the root nodes. + +#### Sphere + +For the whole globe `sphere` shape, there is one single root node, which allows +users to run the code on a single processor. When a user asks for one processor +using this sphere shape, there is only one single block, which is the root node, +and spans the entire globe. When the user asks for four processors using the +sphere shape, the number of blocks in latitude are doubled and the number of +blocks in longitude are doubled. There is still only one root node, but the +number of blocks is four, with 2 in the longitudinal direction and 2 in the +latitudinal direction. If the user asks for 16 processors using the sphere +shape, the blocks are sub-divided again, with sill one single root node, and 16 +blocks - four in the longitudinal direction and four in the altitudinal +direction. With a sphere grid, the number of processors that can be used to +specify the grid are then: 1, 4, 16 (=4^2), 64 (=4^3), 256 (=4^4), 1024 (=4^5), +etc. + +#### Cubesphere + +With a cubesphere grid, there are six root nodes, meaning that the code needs +six processors to run on just to start. Each root node is a face of the +cubesphere. If the user asks for 24 processors (i.e., 6 root nodes that are each +divided into four blocks each), each root node is split in half along the +left-right direction and the up-down direction. For a cubesphere grid, the +number of processors that can be used to specify the grid are then: 6, 24 (6 +\* 4), 96 (6 \* 4^2), 384 (6 \* 4^3), etc. + +#### Specifying Root Nodes + +The root nodes indicate the span of the grid that they cover. This is done in a +header file. In order to accomplish this, the lower-left corner location +(ORGINS) is specified as well the span of the root node in the left-to-right (i) +direction (RIGHTS) and in the (j) down-to-up direction (UPS). The easiest +example is here: + +```cpp +namespace Sphere { + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + {0.0, -0.5, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat UPS = { + {0.0, 1.0, 0.0} + }; +}; +``` + +Since the sphere goes from -90$^\circ$ to +90$^\circ$ in latitude, and 0$^\circ$ +to 360$^\circ$ in longitude, and pi is the normalizer, then the grid should go +from -0.5 to 0.5 in the UPS direction, so the ORIGIN is placed at -0.5 and the +span is 1.0. In the longitudinal direction, the grid should go from 0 to 2, so +the ORIGIN is placed at 0.0 and the span is 2.0. + +This could be altered to have two root nodes. If someone wanted the root node to +be "square", in that the latitude and longitude spans are the same, this could +be done with: + +```cpp +namespace Sphere2 { + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + {0.0, -0.5, 0.0}, + {1.0, -0.5, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0} + }; + /// Normalized right steps in cube + static const arma_mat UPS = { + {0.0, 1.0, 0.0}, + {0.0, 1.0, 0.0} + }; +}; +``` + +Notice that the namespace is different, so that it can be unique. In this case, +there are two ORGINS (offset by 1.0 in longitude), two RIGHTS (which are the +same), and two UPS (which are the same). + +In both of these examples, the third dimension doesn't change. This is because a +single altitude in a spherical grid can be fully described with two variables +(lat and lon). For a cubesphere grid, on the other hand, there are three +variables that are needed - each face is in an XY, XZ, or YZ plane, so all three +(X, Y, and Z) are needed. The 6 root nodes for the cubesphere are specified in +the [cubesphere.h header file](../../include/cubesphere.h). + +## Specifying the Grid + +There are many different components to specifying the actual grid that is +desired, namely: + +- Min and Max latitude +- Min and Max longitude +- Min Altitude, whether a stretched altitude is desired, and the altitudinal + spacing + +In addition, the number of grid points that should be used in each block are +specified: + +- nLons or nX - number of grid cells per block in the i direction +- nLats or nY - number of grid cells per block in the j direction +- nAlts or nZ - total number of grid cells in the block in the k direction + +### Horizontal Resolution + +For some grid shapes (`sphere` and `dipole`), the total number of grid cells in +the `i` and `j` direction can be determined by, for example, multiplying the +*number of blocks* in the `i` direction by the *number of cells in each block* +in the `i` direction. So, with a spherical grid with one root node, and 256 +processors used, the number of blocks in the `i` and `j` direction is 256 ( = 4 +\* 4 \* 4 \* 4). Breaking it into both directions - (2\*2) \* (2*2) \* (2\*2) \* +(2\*2) or (2 \* 2 \* 2 \* 2) \* (2 \* 2 \* 2 \* 2) or (16 \* 16) - 16 and 16. +So, the total number of blocks in the `i` direction is 16 \* nLons and in the +`j` direction is 16 \* nLats. + +For the cubesphere grid, the `nX` and `nY` are the number of grid cells in the +`i` and `j` direction. At this time, these have to be identical in order to have +the grid cells match up along the boundaries between the top and bottom nodes. +The resolution of the Cubesphere grid is roughly (360$^\circ$ / (4 \* nX \* +sqrt(nProc/6))). For example, if `nX` = 18, and 24 processors are requested, +then the resolution = 360 / (4 \* 18 \* sqrt(4)) = 360 / (72 \* 2) = +2.5$^\circ$. As another example, to make a grid with 1$^\circ$ resolution with +96 processors, we get (1 = 360 / (4 \* nX \* 4) = 22.5 / nX), so `nX` has to be +around 22. (If `nX` were 22, and `nProc` = 96, then the resolution would be +1.02$^\circ$). + +### Vertical Resolution + +In all grids, the nAlts (`nZ`) are not parallelized, so the number of points +in the `k` direction is what is specified by the user. For the `sphere` and +`cubesphere` grids, this is the number of altitude points. On the `dipole` grid, +this is the number of points along the dipole flux tube. + +```json + "neuGrid" : { + "Shape" : "sphere", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 50, + "MinAlt" : 100.0, + "dAltkm" : 5.0, + "dAltScale" : 0.25, + "IsUniformAlt" : true, + "AltFile" : ""}, +``` + +```json + "ionGrid" : { + "Shape" : "dipole", + "LatRange" : [-90.0, 90.0], + "nLatsPerBlock" : 18, + "LonRange" : [0.0, 360.0], + "nLonsPerBlock" : 36, + "nAlts" : 200, + "MinAlt" : 80.0, + "MinApex" : 120.0, + "MaxAlt" : 5000.0}, +``` + +The dipole grid has both open field-lines and closed field-lines. The closed +field-lines are near the equator, while the open field-lines are near the poles. +The variable `MaxAlt` sets where this differentiation occurs - if the apex +height of the field-line is above this altitude, then it is open. All +field-lines in Aether start at the `MinAlt` and rise along a dipolar shape until +they either encounter the equatorial plane or `MaxAlt`. In the south, these +field-lines tilt towards the north (from `MinAlt` to `MaxAlt`) and in the north, +the field-lines tilt towards the south (from `MinAlt` to `MaxAlt`). + +- The spacing is uniform in longitude. +- The spacing along the field-line has non-uniform spacing. +- The spacing in latitude is non-uniform. diff --git a/doc/usage/indices.md b/doc/internals/indices.md similarity index 100% rename from doc/usage/indices.md rename to doc/internals/indices.md From 5c984fe79f2ff791934714814fdbddb18f3c73c0 Mon Sep 17 00:00:00 2001 From: "abukowski21@gmail.com" Date: Wed, 24 Jul 2024 15:36:58 -0400 Subject: [PATCH 170/691] BUG: ionGrid error prevents test success This commit adds ionGrid to the default aether.json file (in share/run/aether.json). The ionGrid specs set here hold no importance, but these three values need to be set to enable the tests to pass. Ideally, this is moved from the settings file to a function which reads the inputs (and either sets the default values or catches the error), but for now this works. --- share/run/aether.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/share/run/aether.json b/share/run/aether.json index e046c37a..a819f82e 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -23,7 +23,12 @@ "nLatsPerBlock" : 22, "nAlts" : 40, "dAltScale" : 0.25, - "IsUniformAlt" : false}, + "IsUniformAlt" : false}, + + "ionGrid" : { + "AltFile" : "", + "IsUniformAlt" : false, + "dAltScale" : 0.5}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], From 7334b946c2806bae0b2aead3d6ff48c89aacb0e7 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 3 Sep 2024 16:50:18 -0400 Subject: [PATCH 171/691] FEAT: New exponential-ish dipole grid Drafted first in python. This code makes plots & is adjustable. I commented everything so it's hopefully understandable... Reach out with questions. Similar to SAMI2/3 grid. It's B_par & B_perp aligned, made in dipole (p,q) coords, and specified w/ (nf, nz). Code hands back (r,lat) though, not (q,p) or anything like that... Code needs to be able to be modified for tilted, offset dipole so I left all the for-loops and didn't spend any time optimizing. --- edu/examples/Dipole/dipole.py | 366 +++++++++++++++++++++++++--------- 1 file changed, 277 insertions(+), 89 deletions(-) diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index 3d372177..f8bae674 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -1,105 +1,293 @@ -#!/usr/bin/env python3 - import matplotlib.pyplot as plt import numpy as np -def get_lshell(x, y, z): - # x, y, z need to be normalized to radius of planet! - - xy = np.sqrt(x * x + y * y) - xyz = np.sqrt(x * x + y * y + z * z) - cosLat = xy / xyz - lshell = 1.0 / (cosLat * cosLat) - return lshell - -def get_lshell_sphere(lat, r): - # r needs to be normalized to radius of planet! - cosLat = np.cos(lat) - lshell = r / (cosLat * cosLat) - return lshell - -def get_lat_from_r_and_lshell(r, lshell): - cosLat = np.sqrt(r / lshell) - cosLat[cosLat > 1] = 1.0 - cosLat[cosLat < -1] = -1.0 - lat = np.arccos(cosLat) - return lat - -def get_bfield(lat, r): - # r should be normalized to radius of planet - # b is normalized to Bequator at surface - oor3 = (1.0 / r)**3 - br = -2 * oor3 * np.cos(lat) - bt = -1 * oor3 * np.sin(lat) - return bt, br - -def get_uniform_spacing(lat, rmin, rmax, nPts): - lshell = get_lshell_sphere(lat, 1.0) - print('building field line for lat : ', lat) - print(' --> lshell : ', lshell) - if (lshell < rmax): - rmax = lshell - print(' --> lshell is limiter!') - else: - print(' --> rmax is limiter : ', rmax) - r = np.linspace(rmin, rmax, num = nPts) - return r - -def get_r3_spacing(lat, rmin, rmax, nPts): - lshell = get_lshell_sphere(lat, 1.0) - print('building field line for lat : ', lat) - print(' --> lshell : ', lshell) - if (lshell < rmax): - rmax = lshell - print(' --> lshell is limiter!') - else: - print(' --> rmax is limiter : ', rmax) - - r1 = rmin**(1.0/3.0) - r2 = rmax**(1.0/3.0) - r3 = np.linspace(r1, r2, num = nPts) - r = r3**3 - return r - -#------------------------------------------------------------------------ +#### Set inputs #### + +# Set to None or '' to not save, just show (pan/zoom capabilities). +fig_save_path = None + + +nf = 100 # number of field lines +nz = 200 # number of grid cells on each field line +alt_min = 90 # in km, min altitude + +# in degrees, start/end latitudes of field lines. between (90,0) +max_blat = 89.9 +min_blat = 2.25 + +gams = 0.1 +# point distribution along field lines. +# higher puts more pts at high altitudes. + +baselat_spacing_factor = 6 # exponential factor for spacing baselats (uses cos() too) + +# consts: +Re = 6371 # in km + + +# leave empty for "auto" (aaron b choose), or put in custom limits here. +# [left, right, bottom, top] +limits_left_plot = None # default is whole image +limits_right_plot = None # default is [-0.1, 2.0, -0.3, 1.75] + + +# ------------------------------------------------------------------------ # Main code is here: -#------------------------------------------------------------------------ +# ------------------------------------------------------------------------ + +#### Useful Functions: #### + + +def calc_baselats(blat_min, blat_max, n_f, factor): + """Lay down base latitudes + + Args: + blat_min (float): min latitude to start (positive), in degrees. + blat_max (float): max latitude in degrees, positiv & less than 90.0 + nf (int): Number of field lines. Must be even! + factor (float): Factor to use to space latitudes. + + Returns: + numpy array: starting latitudes + + Notes: follows very similar approach to doi:10.1029/2000JA000035 + - Not exactly exponential, but exponential and a cosine! + - Spaced according to B-field strength. + + """ + # Space out base latitudes: + + baselats = np.linspace( + np.cos(np.deg2rad(blat_min ** (1 / factor))), + np.cos(np.deg2rad(blat_max ** (1 / factor))), + num=n_f, + ) + + # baselats are in southern hemisphere + baselats = -1 * np.flip(np.rad2deg(np.arccos(baselats)) ** factor) + + return baselats + + +def calc_q(alt, theta, re=None, is_alt=False, isnt_re=False): + """Calculate q (distance along field line) for a point + + Args: + alt (float, array-like): altitude (kn or Re) + theta (float or array-like): magnetic latitude (in degrees). + 0 at mag equator (measured from North Pole). + re (float): radius of earth in km. only used if alt is altitude and/or in km + is_alt (bool): altitude is altitude? False means it's radius. Default is False + isnt_re (bool): altitude is in km? False means altitude has units [Re]. Default is False + + Returns: + (array or float): q-value for the given (alt, theta) point. + + Notes: + - make sure theta has units degrees and is measured from north pole + - See for more information. + - is_alt & isnt_re are from debugging & aren't used anymore. + + """ + + if is_alt: # convert altitude to radius + alt = alt + re + if isnt_re: # convert km to re + alt = alt / re + + return np.cos(np.deg2rad(90 - theta)) / (alt**2) + + +def calc_p(alt, theta, re=None, is_alt=False, isnt_re=False): + """Calculate p-value (l-shell) for a given altitude & latitude + + Args: + alt (float): altitude (in km or Re), (above surface or from origin) + theta (float): latitude, in degrees + re (float): earth radius in km. optional. + is_alt (bool): is alt altitude? if it's radius, set to False (default). + isnt_re (bool): altitude is in km? False (default) means altitude has units [Re]. + + Returns: + (array or float): p-value. Same as l-Shell, in Re. + + Notes: + - make sure theta has units degrees and is measured from north pole + - See for more information. + - is_alt & isnt_re are from debugging & aren't used anymore. + + """ + if is_alt: + alt = alt + re + if isnt_re: + alt = alt / re + return alt / (np.sin(np.deg2rad(90 - theta)) ** 2) + + +def qp_solve(q, p): + """Solve for radius given (q,p) dipole coordinates + Methodology from equator + qpnew = [] + for i in range(nzh): + delq = qp0[i] - q_S + qpnew.append(q_S + ft[i] * delq) + + # qpnew is from south-equator. extend it to north pole, + # so *-1 & reverse order so it is ascending + qpnew.extend(np.flip(np.array(qpnew)) * -1) + + ilats = [] + irs = [] + + for i in range(nz0): + # use qpsolve to get r from (q,p) + irs.append(qp_solve(qpnew[i], pvals[f_iter])) + # Use dipole equations to get lat from q and r + # q = cos(theta)/r**2 + ilats.append(np.rad2deg(np.arcsin(qpnew[i] * irs[-1] ** 2))) + + # Put into 2-D; lists easier & then return numpy + lats_2d.append(ilats) + rs_2d.append(irs) + + return np.array(lats_2d), np.array(rs_2d) + + +#### Actual computation: #### + + +AltMinRe = (alt_min + Re) / Re # alt min in Re + +# baselats +baselats = calc_baselats(min_blat, max_blat, nf, baselat_spacing_factor) + +# l-shells +pvals = calc_p(AltMinRe, baselats) + +# take those, make lats & radii +lats, rs = calc_exp_grid(nf, nz, AltMinRe, baselats, pvals, gams) -nPts = 20 -rEarth = 6372.0 -altMin = 100.0 -altMax = 3*rEarth -rMin = (rEarth + altMin) / rEarth -rMax = (rEarth + altMax) / rEarth +print("making plot") -fig = plt.figure(figsize = (10,10)) -ax = fig.add_axes([0.1,0.1,0.8,0.8]) +# change variables in case anyone wants to make different plots +xs = lats[:, :] +ys = rs[:, :] -baseLats = np.arange(-80, 90, 10) +fig, ax = plt.subplots(1, 2, figsize=(7, 7)) -for baseLat in baseLats: +# scatter points, same color is same field line +for x, y in zip(xs, ys): + ax[0].scatter(y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x))) + ax[1].scatter(y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x))) - lat = baseLat * np.pi / 180.0 - lshell = get_lshell_sphere(lat, 1.0) - print('lshell : ', lshell) - r = get_r3_spacing(lat, rMin, rMax, nPts) +# change variables again, overwrite previous xs, ys +# Take every 4th field line so it's more clear to see things +xs = lats[:, :-8:4] +ys = rs[:, :-8:4] +# black dashed lines, same nz value at different nf's +for x, y in zip(xs.T, ys.T): + ax[0].plot( + y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x)), linestyle="--", color="k" + ) + ax[1].plot( + y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x)), linestyle="--", color="k" + ) - lats = get_lat_from_r_and_lshell(r, lshell) - if (baseLat < 0): - lats = -lats +# make square-ish +ax[0].set_aspect(1) +ax[1].set_aspect(1) - x = r * np.cos(lats) - z = r * np.sin(lats) +# custom limits? +if limits_left_plot: + ax[1].set_xlim(limits_left_plot[0], limits_left_plot[1]) + ax[1].set_ylim(limits_left_plot[2], limits_left_plot[3]) - ax.plot(x, z) -ax.set_ylim([-rMax*1.1, rMax*1.1]) -ax.set_xlim([-rMax*1.1, rMax*1.1]) -ax.set_aspect(1.0) +if limits_right_plot: + ax[1].set_xlim(limits_right_plot[0], limits_right_plot[1]) + ax[1].set_ylim(limits_right_plot[2], limits_right_plot[3]) +else: + ax[1].set_xlim(-0.1, 2) + ax[1].set_ylim(-0.3, 1.75) -plotfile = 'test.png' -print('Writing plot : ', plotfile) -fig.savefig(plotfile) -plt.close() +# save or show: +if fig_save_path: + plt.savefig(fig_save_path) +else: + plt.show() +plt.close("all") From e1db675d55751f0b0ba8dc950da3c9d6f451339d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 5 Sep 2024 18:28:10 -0400 Subject: [PATCH 172/691] [feat]: Use analytic solution to find (r,theta) from (q,p) when initalizing mag grid Paper on this from 2006: --- src/init_mag_grid.cpp | 55 ++++++++----------------------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5f327dbb..58cae908 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -629,63 +629,28 @@ void Grid::fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, // ---------------------------------------------------------------------- -// Routine to convert p and q to r and theta. Appraoch is to first solve -// for r using eq 4 from Huba et al 2000. q^2*r^4+1/q*r-1=0 -// This is solved numerically using Newton-Raphson (NR) technique. -// Once we know r we can reover theta from p=r*1/(sin theta)^2. -// note r here is normalized to planet radius. +// Routine to convert p and q to r and theta. Can be solved iteratively, +// or with approach from (swisdak, 2006) +// who solved it analytically: +// https://arxiv.org/pdf/physics/0606044 // // ---------------------------------------------------------------------- std::pair Grid::p_q_to_r_theta(precision_t p, precision_t q) { //return quanties precision_t r, theta; // function value and derivative for NR method - precision_t Func, dFunc; - // tolerance for root finding - precision_t Tolerance = 0.00001; - - // initial guess for r - r = 100.0; - - Func= pow(q,2.0) * pow(r,4.0) + 1.0/p*r-1; - dFunc= 4.0*pow(q,2.0) * pow(r,3.0) + 1.0/p; + precision_t term0, term1, term2, term3; - // cout<< "p,q="< Tolerance) { - try { - Func= pow(q,2.0) * pow(r,4.0) + 1.0/p*r-1; - dFunc= 4.0*pow(q,2.0) * pow(r,3.0) + 1.0/p; - - // in NR method r(i+1)=r(i)-f/f' for each iteration - - r = r - Func/dFunc; - - if (++itr > maxItr){ throw(itr);} - } - catch (int itr){ - cout<<"WARN: exceeded max #iterations.. exiting "; - exit(10); - } - // cout << r << " " << Func << " "<< dFunc << endl; - } + double term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); + double term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); + double term2 = pow(term0, 1.0 / 3.0); + double term3 = 0.5 * pow(((pow(term1,2) + term1 * term2 + pow(term2,2)) / term1), 3.0 / 2.0); + double r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); // now that r is determined we can solve for theta //theta = asin(sqrt(r/p)); theta = acos(q*pow(r,2.0)); - - //cout << "for p,q = " << p <<" "<< q << endl; - //cout << " r = " << r << endl; - //cout << " theta = " << theta << endl; - //cout << endl; - return {r,theta}; } From c0c292a570ec2a925e931d03d90b4ee25c853326 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 11 Sep 2024 17:19:25 -0400 Subject: [PATCH 173/691] [feat]: Use analytic solution to find (r,theta) from (q,p) when initalizing mag grid Paper on this from 2006: --- src/init_mag_grid.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 58cae908..308e0348 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -638,14 +638,15 @@ void Grid::fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, std::pair Grid::p_q_to_r_theta(precision_t p, precision_t q) { //return quanties precision_t r, theta; - // function value and derivative for NR method + // Intermediate quantities: precision_t term0, term1, term2, term3; - double term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); - double term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); - double term2 = pow(term0, 1.0 / 3.0); - double term3 = 0.5 * pow(((pow(term1,2) + term1 * term2 + pow(term2,2)) / term1), 3.0 / 2.0); - double r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); + term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); + term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); + term2 = pow(term0, 1.0 / 3.0); + term3 = 0.5 * pow(((pow(term1,2) + term1 * term2 + pow(term2,2)) / term1), 3.0 / 2.0); + + r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); // now that r is determined we can solve for theta //theta = asin(sqrt(r/p)); From 32b068beb9f50244ea49081152e84cbba91bbea2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 23 Sep 2024 13:20:53 -0400 Subject: [PATCH 174/691] [feat?]: Dipole in c++, not in Aether though... Working. Need to port to init_mag_grid.cpp --- edu/examples/Dipole/grid.cpp | 167 +++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 edu/examples/Dipole/grid.cpp diff --git a/edu/examples/Dipole/grid.cpp b/edu/examples/Dipole/grid.cpp new file mode 100644 index 00000000..9e018acf --- /dev/null +++ b/edu/examples/Dipole/grid.cpp @@ -0,0 +1,167 @@ + +#include +#include +#include +#include + +using arma_vec = arma::Col; +using arma_mat = arma::Mat; + +inline double deg2rad(double degrees) +{ + // function compiled inline to convert degrees to radians + static const double pi_on_180 = 4.0 * atan(1.0) / 180.0; + return degrees * pi_on_180; +} + +inline double rad2deg(double degrees) +{ + // function compiled inline to convert degrees to radians + static const double pi_on_180 = 4.0 * atan(1.0) / 180.0; + return degrees / pi_on_180; + // return degrees; +} + +double qp_solve(double q, double p) +{ + double term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); + double term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); + double term2 = pow(term0, 1.0 / 3.0); + double term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); + double new_r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); + return new_r; +} + +int main() +{ + int nF = 100; + int nZ = 200; + float alt_min = 90.0; + float min_blat = 2.25; + float max_blat = 89.9; + + // user-defined constants + double gams = 0.2; + double baselat_spacing = 6.0; + + // constants + int iErr = 0; + float Re = 6371.0; + float pi = 3.14159; + float pio2 = pi / 2.0; + bool didWork = true; + + int nFby2 = nF / 2; + int nZby2 = nZ / 2; + double altmin_inRe = (alt_min + Re) / Re; + + // outputs + arma_mat bLats(nF, nZ), bLons(nF, nZ), bAlts(nF, nZ); + + arma_vec baseLats(nF); + //, bLons(nF, nZ), bAlts(nF, nZ); + + // TODO: REFACTOR FROM HERE TO **1 ? + // Lay down baseLat spacing according to an exponential factor: + double del_lat, blat_min_, blat_max_, tmp_lat; + blat_min_ = cos(deg2rad(pow(min_blat, 1.0 / baselat_spacing))); + blat_max_ = cos(deg2rad(pow(max_blat, 1.0 / baselat_spacing))); + del_lat = (blat_max_ - blat_min_) / (nF - 1.0); + + for (int i = 0; i < nF; i++) + { + // first put down "linear" spacing + tmp_lat = blat_min_ + del_lat * i; + // then scale it according to the exponent & convert back to deg + tmp_lat = pow(rad2deg(acos(tmp_lat)), baselat_spacing); + // place values in array backwards, S => N hemis + baseLats(nF - i - 1) = -tmp_lat; + } + + // Find L-Shell for each baseLat + // using L=R/sin2(theta), where theta is from north pole + arma_vec Lshells(nF); + for (int i = 0; i < nF; i++) + { + Lshells(i) = ((alt_min + Re) / Re) / pow(sin(deg2rad(90.0 - baseLats(i))), 2.0); + } + + // allocate & calculate some things outside of the main loop + // fa, fb, fc are factors to make the code easier to read + double q_S, q_N, delqp, fb; + double qp0, fb0, ft, delq, qp2; + arma_vec exp_q_dist(nZ), q_vals(nZ); + + for (int i = 0; i < nZ; i++) + { + exp_q_dist(i) = gams + (1 - gams) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); + } + + for (int i_nF = 0; i_nF < nF; i_nF++) + { + + // min/max q + q_N = cos(deg2rad(90.0 + baseLats(i_nF))) / pow((alt_min + Re) / Re, 2.0); + q_S = cos(deg2rad(90 - baseLats(i_nF))) / pow((alt_min + Re) / Re, 2.0); + + // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + // first loop for southern hemisphere, second for north. + for (int i_nZ = 0; i_nZ < nZby2; i_nZ++) + { + delqp = (q_N - q_S) / nZ; + qp0 = q_S + i_nZ * (delqp); + delqp = altmin_inRe * delqp; + fb0 = (1 - exp_q_dist(i_nZ)) / exp(-q_S / delqp - 1); + ft = exp_q_dist(i_nZ) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); + + delq = qp0 - q_S; + qp2 = q_S + ft * delq; + + bAlts(i_nF, i_nZ) = qp_solve(qp2, Lshells(i_nF)); + bLats(i_nF, i_nZ) = rad2deg(asin(qp2 * pow(bAlts(i_nF, i_nZ), 2.0))); + + // test mirroring across hemi's + + bAlts(i_nF, nZ - i_nZ - 1) = qp_solve(-qp2, Lshells(i_nF)); + bLats(i_nF, nZ - i_nZ - 1) = -bLats(i_nF, i_nZ); + } + } + + // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + // first loop for southern hemisphere, second for north. + // for (int i_nZ=nZ; i_nZ>nZby2; i_nZ++){ + // delqp = (q_N - q_S)/nZ; + // qp0 = q_S + i_nZ*(delqp); + // delqp = altmin_inRe * delqp; + // fb0 = (1-exp_q_dist(i_nZ)) / exp(-q_S/delqp - 1); + // fa = exp_q_dist(i_nZ) - fb0; + // ft = fa + fb0 * exp(-(qp0 - q_S)/delqp); + // + // delq = qp0 - q_S; + // qp2 = q_S + ft * delq; + ////fb = (exp_q_dist(i_nZ) - fa) + fa * exp(-(exp_q_dist(i_nZ) - q_S) / delqp); + ////fb = (exp_q_dist(i_nZ) - fa) + fa * exp(-(q_S + i_nZ * delqp/altmin_inRe) / i_nZ); + // bAlts(i_nF, i_nZ) = qp_solve(qp2, Lshells(i_nF)); + // bLats(i_nF, i_nZ) = rad2deg(asin(qp2 * pow(bAlts(i_nF, i_nZ), 2.0))); + // } + // } + //} + //} + //} + + std::ofstream fout; + fout.open("grid.csv"); + fout << "nf,nz,lat,alt,baselat\n"; + for (int fi = 0; fi < nF; fi++) + { + for (int zi = 0; zi < nZ; zi++) + { + fout << fi << "," << zi << "," << bLats(fi, zi) << "," << bAlts(fi, zi) << "," << baseLats(fi) << "\n"; + } + } + fout.close(); + + return iErr; +} From 973f03436168a9a035cdef0fca790a2377f9f6b2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:26:08 -0400 Subject: [PATCH 175/691] FEAT: need a version number somewhere --- include/aether.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/aether.h b/include/aether.h index 35be5d59..9e7e9d13 100644 --- a/include/aether.h +++ b/include/aether.h @@ -4,6 +4,8 @@ #ifndef INCLUDE_AETHER_H_ #define INCLUDE_AETHER_H_ +const float aether_version = 0.6; + /// The armadillo library is to allow the use of 3d cubes and other /// array types, with array math built in. This eliminates loops! #include From 2b55cba79c51377cba1cb1d53351ab799b1938e1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:27:03 -0400 Subject: [PATCH 176/691] FEAT: Create some bools for grid flexibility --- include/grid.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/include/grid.h b/include/grid.h index 60935fcb..3f93148a 100644 --- a/include/grid.h +++ b/include/grid.h @@ -172,6 +172,14 @@ class Grid { int64_t get_nGCs(); + bool get_HasXdim(); + bool get_HasYdim(); + bool get_HasZdim(); + bool get_Is0D(); + bool get_Is1Dx(); + bool get_Is1Dy(); + bool get_Is1Dz(); + void fill_grid(Planets planet); void correct_xy_grid(Planets planet); void calc_sza(Planets planet, Times time); @@ -311,6 +319,19 @@ class Grid { int64_t nY, nLats; int64_t nZ, nAlts; + // These logicals define the dimensionality of the grid: + bool Is0D = false; + bool Is1Dx = false; + bool Is1Dy = false; + bool Is1Dz = false; + bool Is2Dxy = false; + bool Is2Dxz = false; + bool Is2Dyz = false; + bool Is3D = false; + bool HasXdim = true; + bool HasYdim = true; + bool HasZdim = true; + int nGCs; // number of ghostcells // interpolation members From 62289ea74f2a9898d3cb9c748a34884bf530ad0e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:27:59 -0400 Subject: [PATCH 177/691] FEAT: Eventually will want the number of GCs --- include/output.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/output.h b/include/output.h index a474d02e..d6503984 100644 --- a/include/output.h +++ b/include/output.h @@ -119,6 +119,12 @@ class OutputContainer { **/ void set_version(float in_version); + /********************************************************************** + \brief set the number of ghost cells in Aether + \param in_nGCs the number of ghostcells in the grid + **/ + void set_nGhostCells(int in_nGCs); + /********************************************************************** \brief write a file with the information in the container **/ @@ -191,9 +197,13 @@ class OutputContainer { /// The time of the data std::vector itime; + /// The version of the code / data / whatever: float version; + /// The number of Ghost Cells: + int nGCs; + /// The frequency of the output for this particular container: float dt_output; From a861a9ef3f91a7f5024787dae901f62dcf4d0a45 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:28:42 -0400 Subject: [PATCH 178/691] FEAT: Eventually will want the number of GCs --- src/containers_io.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/containers_io.cpp b/src/containers_io.cpp index 75908ad7..18136707 100644 --- a/src/containers_io.cpp +++ b/src/containers_io.cpp @@ -162,6 +162,14 @@ void OutputContainer::set_version(float in_version) { version = in_version; } +// ----------------------------------------------------------------------------- +// Set the number of ghostcells. +// ----------------------------------------------------------------------------- + +void OutputContainer::set_nGhostCells(int in_nGCs) { + nGCs = in_nGCs; +} + // ----------------------------------------------------------------------------- // Clears the elements vector within the output container // ----------------------------------------------------------------------------- @@ -176,6 +184,7 @@ void OutputContainer::clear_variables() { OutputContainer::OutputContainer() { // Set default output type to netCDF + nGCs = 0; #ifdef NETCDF output_type = netcdf_type; #else @@ -236,6 +245,7 @@ void OutputContainer::display() { std::cout << " nX : " << elements[0].value.n_rows << "\n"; std::cout << " nY : " << elements[0].value.n_cols << "\n"; std::cout << " nZ : " << elements[0].value.n_slices << "\n"; + std::cout << " nGCs : " << nGCs << "\n"; int64_t nVars = elements.size(); std::cout << " Number of Variables : " << nVars << "\n"; @@ -281,6 +291,7 @@ bool OutputContainer::write_container_header() { {"nX", nX}, {"nY", nY}, {"nZ", nZ}, + {"nGCs", nGCs}, {"nLons", nX}, {"nLats", nY}, {"nAlts", nZ}, @@ -327,6 +338,7 @@ bool OutputContainer::read_container_binary() { int64_t iY, nY = header["nY"]; int64_t iZ, nZ = header["nZ"]; int64_t iTotalSize = nX * nY * nZ; + nGCs = header["nGCs"]; float *variable_array = new float[iTotalSize]; arma_cube value_scgc; From ede4d03c5c9e1064a2d433bdb3a0d002105ae40e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:30:12 -0400 Subject: [PATCH 179/691] FEAT: dont exchange messages if no horizontal extent --- src/exchange_messages.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 8ab408d7..c67c7d70 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -896,6 +896,10 @@ bool exchange_one_var(Grid &grid, arma_cube &var_to_pass, bool doReverseSignAcrossPole) { + // This function is only needed if we do interpolation, which only happens in + // the horizontal directions + if (!grid.get_HasXdim() & !grid.get_HasYdim()) return true; + std::string function = "exchange_one_var"; static int iFunction = -1; report.enter(function, iFunction); @@ -1192,6 +1196,10 @@ arma_cube interpolate_ghostcells(arma_cube varIn, Grid &grid) { bool find_ghostcell_interpolation_coefs(Grid &grid) { + // This function is only needed if we do interpolation, which only happens in + // the horizontal directions + if (!grid.get_HasXdim() & !grid.get_HasYdim()) return true; + std::string function = "find_ghostcell_interpolation_coefs"; static int iFunction = -1; report.enter(function, iFunction); From 15a83ea2208c9b68aa2a05698c2b1133e6e3af01 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:30:59 -0400 Subject: [PATCH 180/691] FEAT: set and get dimension usage variables --- src/grid.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/src/grid.cpp b/src/grid.cpp index 2650974d..50a65598 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -23,6 +23,28 @@ Grid::Grid(std::string gridtype) { nZ = grid_input.nZ + nGCs * 2; nAlts = nZ; + // No set all of the logicals to make the flow a bit easier: + + if (grid_input.nX == 1 & + grid_input.nY == 1 & + grid_input.nZ == 1) + Is0D = true; + else { + if (grid_input.nY == 1 & grid_input.nZ == 1) Is1Dx = true; + if (grid_input.nX == 1 & grid_input.nZ == 1) Is1Dy = true; + if (grid_input.nX == 1 & grid_input.nY == 1) Is1Dz = true; + if (!Is1Dx & !Is1Dy & !Is1Dz) { + if (grid_input.nX == 1) Is2Dyz = true; + if (grid_input.nY == 1) Is2Dxz = true; + if (grid_input.nZ == 1) Is2Dxy = true; + if (!Is2Dyz & !Is2Dxz & !Is2Dxy) Is3D = true; + } + } + + if (grid_input.nX == 1) HasXdim = false; + if (grid_input.nY == 1) HasYdim = false; + if (grid_input.nZ == 1) HasZdim = false; + if (mklower(grid_input.shape) == "sphere") iGridShape_ = iSphere_; if (mklower(grid_input.shape) == "cubesphere") @@ -192,8 +214,9 @@ bool Grid::write_restart(std::string dir) { try { OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_version(0.1); + RestartContainer.set_version(aether_version); RestartContainer.set_time(0.0); + RestartContainer.set_nGhostCells(nGCs); // Output Cell Centers RestartContainer.set_filename("grid_" + cGrid); @@ -280,7 +303,7 @@ bool Grid::read_restart(std::string dir) { try { OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_version(0.1); + RestartContainer.set_version(aether_version); // Cell Centers: RestartContainer.set_filename("grid_" + cGrid); RestartContainer.read(); @@ -402,6 +425,38 @@ int64_t Grid::get_nPointsInGrid() { return nPoints; } +// -------------------------------------------------------------------------- +// Get some grid definition things +// -------------------------------------------------------------------------- + +bool Grid::get_HasXdim() { + return HasXdim; +} + +bool Grid::get_HasYdim() { + return HasYdim; +} + +bool Grid::get_HasZdim() { + return HasZdim; +} + +bool Grid::get_Is0D() { + return Is0D; +} + +bool Grid::get_Is1Dx() { + return Is1Dx; +} + +bool Grid::get_Is1Dy() { + return Is1Dy; +} + +bool Grid::get_Is1Dz() { + return Is1Dz; +} + // -------------------------------------------------------------------------- // Get a bunch of sizes within the grid // -------------------------------------------------------------------------- From 76246fb96e9ca2c1ecb8ba4e459d7e1329ac835f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:33:00 -0400 Subject: [PATCH 181/691] FEAT: take into account dimensionality --- src/init_geo_grid.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 99e108e6..59ffb3fe 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -650,6 +650,10 @@ void Grid::create_sphere_grid(Quadtree quadtree) { precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); + // if we are not doing anything in the lon direction, then set dlon to + // something reasonable: + if (!HasXdim) dlon = 1.0 * cDtoR; + // Longitudes: // - Make a 1d vector // - copy it into the 3d cube @@ -665,6 +669,10 @@ void Grid::create_sphere_grid(Quadtree quadtree) { precision_t lat0 = lower_left_norm(1) * cPI; arma_vec lat1d(nLats); + // if we are not doing anything in the lat direction, then set dlat to + // something reasonable: + if (!HasYdim) dlat = 1.0 * cDtoR; + // Latitudes: // - Make a 1d vector // - copy it into the 3d cube @@ -947,11 +955,11 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (iGridShape_ == iCubesphere_) { report.print(0, "Creating Cubesphere Grid"); - create_cubesphere_connection(quadtree); + if (!Is0D & !Is1Dz) create_cubesphere_connection(quadtree); IsCubeSphereGrid = true; } else { report.print(0, "Creating Spherical Grid"); - create_sphere_connection(quadtree); + if (!Is0D & !Is1Dz) create_sphere_connection(quadtree); IsCubeSphereGrid = false; } From e428fe2be6b1622edfef70b6f4a87347812fa47a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:33:40 -0400 Subject: [PATCH 182/691] FEAT: add version number --- src/ions.cpp | 2 +- src/neutrals.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ions.cpp b/src/ions.cpp index 558df96b..4980963c 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -303,7 +303,7 @@ bool Ions::restart_file(std::string dir, bool DoRead) { if (DoRead) RestartContainer.read(); else { - RestartContainer.set_version(0.1); + RestartContainer.set_version(aether_version); RestartContainer.set_time(0.0); } diff --git a/src/neutrals.cpp b/src/neutrals.cpp index e75c5bc5..97e3fcd9 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -359,7 +359,7 @@ bool Neutrals::restart_file(std::string dir, bool DoRead) { if (DoRead) RestartContainer.read(); else { - RestartContainer.set_version(0.1); + RestartContainer.set_version(aether_version); RestartContainer.set_time(0.0); } From 2c26287096d81b5bc51572cd328fc0a8b31c7235 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:34:08 -0400 Subject: [PATCH 183/691] FEAT: add version number and nGCs --- src/output.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/output.cpp b/src/output.cpp index 57a418cd..7bbe9db5 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -72,7 +72,8 @@ bool output(const Neutrals &neutrals, OutputContainer DummyOutputContainer; std::string output_dir = "UA/output/"; DummyOutputContainer.set_directory(output_dir); - DummyOutputContainer.set_version(0.1); + DummyOutputContainer.set_version(aether_version); + DummyOutputContainer.set_nGhostCells(grid.get_nGCs()); for (int iOutput = 0; iOutput < nOutputs; iOutput++) AllOutputContainers.push_back(DummyOutputContainer); From 3483c75b74930d9040b6bd40198dfe0e444b27f3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:34:55 -0400 Subject: [PATCH 184/691] STY: remove commented code and moved argparse to top --- srcPython/postAether.py | 56 +++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index 2b958a39..fcdea2e1 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -15,6 +15,32 @@ import json from struct import unpack +# ---------------------------------------------------------------------- +# Function to parse input arguments +# ---------------------------------------------------------------------- + +def parse_args(): + + parser = argparse.ArgumentParser(description = 'Post process Aether files') + parser.add_argument('-hdf5', \ + help='output HDF5 files', \ + action="store_true") + parser.add_argument('-rm', \ + help='removes processed files', \ + action="store_true") + parser.add_argument('-alt', default = -1, type = int, \ + help='altitude to plot (-1 for no plot!)') + parser.add_argument('-v', \ + help='turn on verbose mode', \ + action="store_true") + parser.add_argument('-oned', \ + help='strip 1d files of ghostcells and store in one file', \ + action="store_true") + + args = parser.parse_args() + + return args + # ---------------------------------------------------------------------- # Want to eliminate need for aetherpy to be installed for ease of use. # Therefore a bunch of this stuff is from aetherpy. @@ -111,6 +137,7 @@ def read_aether_headers(filelist, finds=None, filetype="netcdf"): nlons - number of longitude grids nlats - number of latitude grids nalts - number of altitude grids + ngcs - number of ghost cells vars - list of data variable names time - list of datetimes for the processed file start times filename - list of the input filenames @@ -271,6 +298,7 @@ def read_aether_json_header(filename): nlons - number of longitude grids nlats - number of latitude grids nalts - number of altitude grids + ngcs - number of ghost cells nvars - number of data variable names time - datetime for the file vars - variables in the file @@ -349,7 +377,7 @@ def read_aether_one_binary_file(header, ifile, vars_to_read, isVerbose = True): data = {hkey: header[hkey] for hkey in ["version", "nlons", "nlats", - "nalts", "nvars", "vars", + "nalts", "ngcs", "nvars", "vars", "units", "long_name"]} data["time"] = header["time"][0] with open(file_to_read, 'rb') as fin: @@ -431,28 +459,6 @@ def read_aether_file(filename, file_vars=None, epoch_name='time'): return data -# ---------------------------------------------------------------------- -# Function to parse input arguments -# ---------------------------------------------------------------------- - -def parse_args(): - - parser = argparse.ArgumentParser(description = 'Post process Aether files') - parser.add_argument('-hdf5', \ - help='output HDF5 files', \ - action="store_true") - parser.add_argument('-rm', \ - help='removes processed files', \ - action="store_true") - parser.add_argument('-alt', default = -1, type = int, \ - help='altitude to plot (-1 for no plot!)') - parser.add_argument('-v', \ - help='turn on verbose mode', \ - action="store_true") - - args = parser.parse_args() - - return args #---------------------------------------------------------------------------- # This returns the core of the filename without the _g????.nc @@ -595,10 +601,6 @@ def plot_block(data, varToPlot, altToPlot, ax, mini, maxi, i): alts = data[iAlt][0][0] / 1000.0 # Convert from m to km # Change to 2d representation: - - #lons = data[iLon][2:-2, 2:-2, 0] - #lats = data[iLat][2:-2, 2:-2, 0] - #v = data[iVar][2:-2, 2:-2, altToPlot] lons = data[iLon][:, :, 0] lats = data[iLat][:, :, 0] v = data[iVar][:, :, altToPlot] From 650bf81a8ccbf3c08806c9bf888064fe623413c3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Sep 2024 15:51:14 -0400 Subject: [PATCH 185/691] FEAT: test for 1d simulations --- tests/1d_alt_tube/aether.json.1d_alt_tube | 64 +++++++++++++++++++++++ tests/1d_alt_tube/run_test.sh | 15 ++++++ 2 files changed, 79 insertions(+) create mode 100644 tests/1d_alt_tube/aether.json.1d_alt_tube create mode 100755 tests/1d_alt_tube/run_test.sh diff --git a/tests/1d_alt_tube/aether.json.1d_alt_tube b/tests/1d_alt_tube/aether.json.1d_alt_tube new file mode 100644 index 00000000..70ab35f3 --- /dev/null +++ b/tests/1d_alt_tube/aether.json.1d_alt_tube @@ -0,0 +1,64 @@ + +{ + "Ensembles" : { + "nMembers" : 1}, + + "Debug" : { + "iVerbose" : 0, + "iFunctionVerbose" : { + "Grid::create_altitudes": 0}, + "TimingPercent" : 10.0, + "dt" : 10.0, + "check_for_nans" : false + }, + + "EndTime" : [2011, 3, 20, 2, 0, 0], + + "GeoBlockSize" : { + "nLons" : 18, + "nLats" : 18, + "nAlts" : 50}, + + "neuGrid" : { + "Shape" : "sphere", + "LatRange" : [10.0, 10.0], + "nLatsPerBlock" : 1, + "LonRange" : [20.0, 20.0], + "nLonsPerBlock" : 1, + "nAlts" : 50, + "MinAlt" : 100.0, + "dAltkm" : 5.0, + "dAltScale" : 0.25, + "IsUniformAlt" : false, + "AltFile" : ""}, + + "ionGrid" : { + "Shape" : "sphere", + "LatRange" : [10.0, 10.0], + "nLatsPerBlock" : 1, + "LonRange" : [20.0, 20.0], + "nLonsPerBlock" : 1, + "nAlts" : 200, + "MinAlt" : 80.0, + "MinApex" : 120.0, + "MaxAlt" : 1000.0, + "IsUniformAlt" : true, + "dAltkm" : 5.0, + "AltFile" : ""}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta", + "File": "UA/inputs/b20110320n_omni.bin"}, + + "Outputs" : { + "type" : ["states", "grid"], + "dt" : [600, -1] }, + + "DoCalcBulkIonTemp" : false, + + "PlanetFile" : "UA/inputs/earth.in" + +} diff --git a/tests/1d_alt_tube/run_test.sh b/tests/1d_alt_tube/run_test.sh new file mode 100755 index 00000000..ebcd0412 --- /dev/null +++ b/tests/1d_alt_tube/run_test.sh @@ -0,0 +1,15 @@ +#!/bin/sh + + +rm -rf run.1d + +cp -r ../../share/run ./run.1d +cd run.1d +cp ../aether.json.1d_alt_tube ./aether.json + +./aether + +cd UA/output + +~/bin/postAether.py -rm -alt=-1 +~/bin/aether_plot_simple.py 3DALG_20110320_*.nc From 0a90abffd0171ca7c0a53ee82e5484bf08d77122 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 16:38:41 -0400 Subject: [PATCH 186/691] [feat]: Initial commit with dipole magnetic grid Couple issues remain: - Longitudes are sometimes nan in output files? - nLats needs to be even. And it's not checked. - Ghost cells probably not implemented correctly. --- include/grid.h | 66 ++- include/inputs.h | 4 +- src/dipole.cpp | 7 - src/init_mag_grid.cpp | 1211 +++++++++++++++++++++-------------------- src/inputs.cpp | 433 ++++++++++----- 5 files changed, 948 insertions(+), 773 deletions(-) diff --git a/include/grid.h b/include/grid.h index 60935fcb..e6b38aa4 100644 --- a/include/grid.h +++ b/include/grid.h @@ -11,10 +11,10 @@ // Grid class // ---------------------------------------------------------------------------- -class Grid { +class Grid +{ public: - const int iSphere_ = 1; const int iCubesphere_ = 2; const int iDipole_ = 3; @@ -186,7 +186,7 @@ class Grid { void calc_rad_unit(Planets planet); void calc_gravity(Planets planet); bool init_geo_grid(Quadtree quadtree, - Planets planet); + Planets planet); void create_sphere_connection(Quadtree quadtree); void create_sphere_grid(Quadtree quadtree); void create_cubesphere_connection(Quadtree quadtree); @@ -199,15 +199,21 @@ class Grid { void calc_cent_acc(Planets planet); // Make mag-field grid: - void init_mag_grid(Planets planet); - std::pair lshell_to_qn_qs(Planets planet, precision_t Lshell, precision_t Lon, precision_t AltMin); - void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]); - void fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, int nZ, precision_t Lshell, precision_t Lon, double *q); - std::pair p_q_to_r_theta(precision_t p, precision_t q); - arma_vec get_r3_spacing(precision_t lat, precision_t rMin, - precision_t rMax, int64_t nPts, int64_t nGcs); + std::pair lshell_to_qn_qs(Planets planet, + precision_t Lshell, + precision_t Lon, + precision_t AltMin); + void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], + precision_t XyzGeo[3]); + std::pair fill_dipole_q_line(precision_t qN_, + precision_t qS_, + precision_t Gamma_, + int64_t nZ_, + precision_t Lshell_, + precision_t min_alt_); + std::pair qp_to_r_theta(precision_t q, precision_t p); void init_dipole_grid(Quadtree quadtree, Planets planet); - + arma_vec rNorm1d, lat1dalong; // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); @@ -237,7 +243,8 @@ class Grid { int64_t iRootYp; int64_t iRootYm; - struct messages_struct { + struct messages_struct + { int64_t iFace; int64_t iProc_to; int64_t iSizeTotal; @@ -249,8 +256,8 @@ class Grid { /// Variables needed for asynchronous message passing MPI_Request requests; - precision_t* buffer; - precision_t* rbuffer; + precision_t *buffer; + precision_t *rbuffer; // For cubesphere. these are needed for interpolation // when the cells go onto a different face: @@ -263,13 +270,13 @@ class Grid { bool gcInterpolationSet = false; messages_struct make_new_interconnection(int64_t iDir, - int64_t nVars, - int64_t iProc_to, - arma_vec edge_center, - bool IsPole, - bool DoReverseX, - bool DoReverseY, - bool XbecomesY); + int64_t nVars, + int64_t iProc_to, + arma_vec edge_center, + bool IsPole, + bool DoReverseX, + bool DoReverseY, + bool XbecomesY); bool send_one_face(int64_t iFace); bool send_one_var_one_face(int64_t iFace); @@ -299,8 +306,7 @@ class Grid { */ std::vector get_interpolation_values(const arma_cube &data) const; - private: - +private: bool IsGeoGrid; bool HasBField; bool IsExperimental; @@ -315,7 +321,8 @@ class Grid { // interpolation members // The struct representing the range of a spherical grid - struct sphere_range { + struct sphere_range + { precision_t lon_min; precision_t lon_max; precision_t dLon; @@ -326,7 +333,8 @@ class Grid { precision_t alt_max; }; // The struct representing the range of a cubesphere grid - struct cubesphere_range { + struct cubesphere_range + { // The minimum value and delta change of row and col // We don't use row_max and col_max because they are not promised to be // greater than min, for example the right norm of suface 2 expands along @@ -357,7 +365,8 @@ class Grid { // Each point is processed by the function set_interpolation_coefs and stored // in the form of this structure. // If the point is out of the grid, in_grid = false and all other members are undefined - struct interp_coef_t { + struct interp_coef_t + { // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] uint64_t iRow; uint64_t iCol; @@ -394,7 +403,8 @@ class Grid { // Initialize connections between processors void init_connection(); // Used for message exchange - struct idx2d_t { + struct idx2d_t + { // Index of row and column int64_t ilon; int64_t ilat; @@ -409,4 +419,4 @@ class Grid { MPI_Comm grid_comm; }; -#endif // INCLUDE_GRID_H_ +#endif // INCLUDE_GRID_H_ diff --git a/include/inputs.h b/include/inputs.h index 7fc5d70d..03fc16c6 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -61,7 +61,9 @@ class Inputs { bool IsUniformAlt; // Only needed for Mag Field grid: - precision_t min_apex; + // min_apex (not used) and LatStretch is used + // as lat = min_lat + dlat where dlat = acos(cos(lat^stretch))^(1/stretch) + precision_t min_apex, LatStretch, FieldLineStretch, max_lat_dipole; // Some grid shapes allow specification of altitudes based on a file: std::string alt_file; diff --git a/src/dipole.cpp b/src/dipole.cpp index 26fdf278..8f1175ec 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -16,13 +16,6 @@ precision_t get_lshell(precision_t lat, precision_t rNorm) { return lshell; } -arma_vec get_lat_from_r_and_lshell(arma_vec r, precision_t lshell) { - arma_vec cosLat = sqrt(r / lshell); - cosLat.clamp(-1.0, 1.0); - arma_vec lat = acos(cosLat); - return lat; -} - precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell) { precision_t cosLat = sqrt(r / lshell); if (cosLat < -1.0) cosLat = -1.0; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 308e0348..5661feb2 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -7,326 +7,20 @@ #include "../include/aether.h" // ---------------------------------------------------------------------- -// Initialize the geographic grid. At the moment, this is a simple -// Lon/Lat/Alt grid. The grid structure is general enough that each -// of the lon, lat, and alt can be a function of the other variables. -// ---------------------------------------------------------------------- - -void Grid::init_mag_grid(Planets planet) { - - std::string function = "Grid::init_mag_grid"; - static int iFunction = -1; - report.enter(function, iFunction); - -// turn the switch on! - set_IsGeoGrid(false); - - // This is just an example: - Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); - - int64_t iLon, iLat, iAlt; - - // SHOW(grid_input.dalt); exit(10); - - // Longitudes: - // - Make a 1d vector - // - copy it into the 3d cube - arma_vec lon1d(nLons); - precision_t dlon = (grid_input.lon_max - grid_input.lon_min) / (nLons-2*nGCs); - - for (iLon=0; iLon < nLons; iLon++) - lon1d[iLon] = grid_input.lon_min + (iLon-nGCs+0.5) * dlon; - - for (iLat=0; iLat < nLats; iLat++) { - for (iAlt=0; iAlt < nAlts; iAlt++) { - - magLon_scgc.subcube(0, iLat, iAlt, nLons-1, iLat, iAlt) = lon1d; - - // AD: does below make sense? - // magPhi_scgc.subcube(0, iLat, iAlt, nLons-1, iLat, iAlt) = lon1d; - - } - } - - - // cout << "from"<< function<< "nLats= "<< nLats<<"\n"< - } - - // SHOW(lshell); - // SHOW(lat1d); exit(10); - - - //< - for (iLon = 0; iLon < nLons; iLon++) { - for (iAlt = 0; iAlt < nAlts; iAlt++) - this->magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; - } - //> - - - for (iLon=0; iLon < nLons; iLon++) { - for (iAlt=0; iAlt < nAlts; iAlt++) { - - //magP_scgc.subcube(iLon, 0, iAlt, iLon, nLats-1, iAlt) = lshell; - - for (iLat=0; iLatgeoLon_scgc(iX,iY,iZ) = magPhi_scgc(iX,iY,iZ); - this->geoLat_scgc(iX,iY,iZ) = theta; - this->geoAlt_scgc(iX,iY,iZ) = r; - - this->geoAlt_scgc(iX,iY,iZ) *= radius0; - - - // - grid_input.alt_min ? - - //> - - } - } - } - - - - - - // save 3D mag grid for examination - std::fstream gridfile; - gridfile.open ("grid3D.dat",ios::out); - gridfile.precision(std::numeric_limits::digits10); - - // write header - gridfile << "VARIABLES = \"X\", \"Y\", \"Z\" " << endl; - gridfile << "Zone I = "<< nZ << ",J = " << nY << ",K = "<< nX - <<", DATAPACKING=POINT" << endl; - - // write grid data - for (iX=0; iX Grid::lshell_to_qn_qs(Planets planet, precision_t Lshell, precision_t Lon, precision_t AltMin) { +std::pair Grid::lshell_to_qn_qs(Planets planet, + precision_t Lshell, + precision_t Lon, + precision_t AltMin) +{ std::string function = "Grid::lshell_to_qn_qs"; static int iFunction = -1; report.enter(function, iFunction); - precision_t qN,qS; - + precision_t qN, qS; + precision_t XyzDipoleLeft[3], XyzDipoleMid[3], XyzDipoleRight[3]; precision_t XyzGeoLeft[3], XyzGeoMid[3], XyzGeoRight[3]; precision_t rGeoLeft, rGeoMid, rGeoRight; @@ -334,176 +28,197 @@ std::pair Grid::lshell_to_qn_qs(Planets planet, precisi precision_t ThetaTilt, PhiTilt; precision_t Lat, Radius, rMin; // Named dimension constants - static int Lon_= 0, Lat_= 1, Radius_= 2; - - //bound vars for bisection search + static int Lon_ = 0, Lat_ = 1, Radius_ = 2; + + // bound vars for bisection search precision_t ThetaRight, ThetaLeft, ThetaMid; - precision_t rDipoleLeft,rDipoleMid,rDipoleRight; - - //Stopping condition for bisection search + precision_t rDipoleLeft, rDipoleMid, rDipoleRight; + + // Stopping condition for bisection search precision_t DeltaTheta; precision_t Tolerance = 1e-4; - + // status vars for bisection search int iStatusLeft, iStatusRight, iStatusMid; // note we normalize Lshell by equatorial radius precision_t RadiusEq = planet.get_radius(0.0); - // loop for qN and qS - for(int iQ = 0; iQ < 2; iQ++){ + for (int iQ = 0; iQ < 2; iQ++) + { - if (iQ == 0){ + if (iQ == 0) + { // set initial left, mid, right bounds for bisection search for qN - ThetaRight = 0.5*cPI; - ThetaLeft = 1.0*cDtoR; - ThetaMid = 0.5*(ThetaRight+ThetaLeft); - }else{ + ThetaRight = 0.5 * cPI; + ThetaLeft = 1.0 * cDtoR; + ThetaMid = 0.5 * (ThetaRight + ThetaLeft); + } + else + { // set initial left, mid, right bounds for bisection search for qS - ThetaLeft = 0.5*cPI; - ThetaRight = 179.0*cDtoR; - ThetaMid = 0.5*(ThetaRight+ThetaLeft); + ThetaLeft = 0.5 * cPI; + ThetaRight = 179.0 * cDtoR; + ThetaMid = 0.5 * (ThetaRight + ThetaLeft); } - + // Initial stopping condition stopping condition - DeltaTheta = abs(ThetaLeft-ThetaRight); - - + DeltaTheta = abs(ThetaLeft - ThetaRight); + // start bisection search for qN - while( DeltaTheta > Tolerance ) { - + while (DeltaTheta > Tolerance) + { + // find rDipole that cooresponds to these Left,Mid,Right - // ThetaDipole values - rDipoleLeft = Lshell * pow(sin(ThetaLeft),2.0); - rDipoleMid = Lshell * pow(sin(ThetaMid),2.0); - rDipoleRight = Lshell * pow(sin(ThetaRight),2.0); - + // ThetaDipole values + rDipoleLeft = Lshell * pow(sin(ThetaLeft), 2.0); + rDipoleMid = Lshell * pow(sin(ThetaMid), 2.0); + rDipoleRight = Lshell * pow(sin(ThetaRight), 2.0); + // Compute XyzDipole for left, mid,right states LlrDipoleLeft[Lon_] = Lon; - LlrDipoleLeft[Lat_] = 0.5*cPI-ThetaLeft; + LlrDipoleLeft[Lat_] = 0.5 * cPI - ThetaLeft; LlrDipoleLeft[Radius_] = rDipoleLeft; transform_llr_to_xyz(LlrDipoleLeft, XyzDipoleLeft); - + LlrDipoleMid[Lon_] = Lon; - LlrDipoleMid[Lat_] = 0.5*cPI-ThetaMid; + LlrDipoleMid[Lat_] = 0.5 * cPI - ThetaMid; LlrDipoleMid[Radius_] = rDipoleMid; transform_llr_to_xyz(LlrDipoleMid, XyzDipoleMid); - + LlrDipoleRight[Lon_] = Lon; - LlrDipoleRight[Lat_] = 0.5*cPI-ThetaRight; + LlrDipoleRight[Lat_] = 0.5 * cPI - ThetaRight; LlrDipoleRight[Radius_] = rDipoleRight; transform_llr_to_xyz(LlrDipoleRight, XyzDipoleRight); - + // Transform to XyzGeo and unnormalize convert_dipole_geo_xyz(planet, XyzDipoleLeft, XyzGeoLeft); convert_dipole_geo_xyz(planet, XyzDipoleMid, XyzGeoMid); convert_dipole_geo_xyz(planet, XyzDipoleRight, XyzGeoRight); - - //cout << "XyzGeoLeft[0]" << XyzGeoLeft[0] << endl; - //cout << "XyzGeoLeft[1]" << XyzGeoLeft[1] << endl; - //cout << "XyzGeoLeft[2]" << XyzGeoLeft[2] << endl; - - XyzGeoLeft[0]=XyzGeoLeft[0]*RadiusEq; - XyzGeoLeft[1]=XyzGeoLeft[1]*RadiusEq; - XyzGeoLeft[2]=XyzGeoLeft[2]*RadiusEq; - - abort; - - XyzGeoMid[0]=XyzGeoMid[0]*RadiusEq; - XyzGeoMid[1]=XyzGeoMid[1]*RadiusEq; - XyzGeoMid[2]=XyzGeoMid[2]*RadiusEq; - - XyzGeoRight[0]=XyzGeoRight[0]*RadiusEq; - XyzGeoRight[1]=XyzGeoRight[1]*RadiusEq; - XyzGeoRight[2]=XyzGeoRight[2]*RadiusEq; - + + // cout << "XyzGeoLeft[0]" << XyzGeoLeft[0] << endl; + // cout << "XyzGeoLeft[1]" << XyzGeoLeft[1] << endl; + // cout << "XyzGeoLeft[2]" << XyzGeoLeft[2] << endl; + + XyzGeoLeft[0] = XyzGeoLeft[0] * RadiusEq; + XyzGeoLeft[1] = XyzGeoLeft[1] * RadiusEq; + XyzGeoLeft[2] = XyzGeoLeft[2] * RadiusEq; + + // abort; + + XyzGeoMid[0] = XyzGeoMid[0] * RadiusEq; + XyzGeoMid[1] = XyzGeoMid[1] * RadiusEq; + XyzGeoMid[2] = XyzGeoMid[2] * RadiusEq; + + XyzGeoRight[0] = XyzGeoRight[0] * RadiusEq; + XyzGeoRight[1] = XyzGeoRight[1] * RadiusEq; + XyzGeoRight[2] = XyzGeoRight[2] * RadiusEq; + // Compute radius in geo coordinate for comparison to rmin - rGeoLeft = - sqrt(pow(XyzGeoLeft[0],2)+pow(XyzGeoLeft[1],2)+pow(XyzGeoLeft[2],2)); - rGeoMid = - sqrt(pow(XyzGeoMid[0],2)+pow(XyzGeoMid[1],2)+pow(XyzGeoMid[2],2)); - rGeoRight = - sqrt(pow(XyzGeoRight[0],2)+pow(XyzGeoRight[1],2)+pow(XyzGeoRight[2],2)); - + rGeoLeft = sqrt(pow(XyzGeoLeft[0], 2) + pow(XyzGeoLeft[1], 2) + pow(XyzGeoLeft[2], 2)); + rGeoMid = sqrt(pow(XyzGeoMid[0], 2) + pow(XyzGeoMid[1], 2) + pow(XyzGeoMid[2], 2)); + rGeoRight = sqrt(pow(XyzGeoRight[0], 2) + pow(XyzGeoRight[1], 2) + pow(XyzGeoRight[2], 2)); + // get rmin for given latitude. Radius is lat dependent in general. // also find status in (0) or out (1) of rMin - Lat = 0.5*cPI-acos(XyzGeoLeft[2]/rGeoLeft); + Lat = 0.5 * cPI - acos(XyzGeoLeft[2] / rGeoLeft); Radius = planet.get_radius(Lat); - rMin = Radius+AltMin; - if (rGeoLeft < rMin){ - iStatusLeft = 0; - }else{ - iStatusLeft = 1; + rMin = Radius + AltMin; + if (rGeoLeft < rMin) + { + iStatusLeft = 0; } - - Lat = 0.5*cPI-acos(XyzGeoMid[2]/rGeoMid); + else + { + iStatusLeft = 1; + } + + Lat = 0.5 * cPI - acos(XyzGeoMid[2] / rGeoMid); Radius = planet.get_radius(Lat); - rMin = Radius+AltMin; - if (rGeoMid < rMin){ - iStatusMid = 0; - }else{ - iStatusMid = 1; + rMin = Radius + AltMin; + if (rGeoMid < rMin) + { + iStatusMid = 0; } - - Lat = 0.5*cPI-acos(XyzGeoRight[2]/rGeoRight); + else + { + iStatusMid = 1; + } + + Lat = 0.5 * cPI - acos(XyzGeoRight[2] / rGeoRight); Radius = planet.get_radius(Lat); - rMin = Radius+AltMin; - if (rGeoRight < rMin){ - iStatusRight = 0; - }else{ - iStatusRight = 1; + rMin = Radius + AltMin; + if (rGeoRight < rMin) + { + iStatusRight = 0; + } + else + { + iStatusRight = 1; } - + // Use status values to update left, right and mid values of theta - if (iStatusMid == 0) { - if (iStatusRight == 1){ - // Mid becomes left and right stays right - ThetaLeft = ThetaMid; - ThetaMid = 0.5*(ThetaLeft+ThetaRight); - }else{ - // Mid becomes right and left stays left - ThetaRight = ThetaMid; - ThetaMid = 0.5*(ThetaLeft+ThetaRight); - } - }else{ - if (iStatusRight == 0){ - // Mid becomes left and right stays right - ThetaLeft = ThetaMid; - ThetaMid = 0.5*(ThetaLeft+ThetaRight); - }else{ - // Mid becomes right and left stays left - ThetaRight = ThetaMid; - ThetaMid = 0.5*(ThetaLeft+ThetaRight); - } + if (iStatusMid == 0) + { + if (iStatusRight == 1) + { + // Mid becomes left and right stays right + ThetaLeft = ThetaMid; + ThetaMid = 0.5 * (ThetaLeft + ThetaRight); + } + else + { + // Mid becomes right and left stays left + ThetaRight = ThetaMid; + ThetaMid = 0.5 * (ThetaLeft + ThetaRight); + } + } + else + { + if (iStatusRight == 0) + { + // Mid becomes left and right stays right + ThetaLeft = ThetaMid; + ThetaMid = 0.5 * (ThetaLeft + ThetaRight); + } + else + { + // Mid becomes right and left stays left + ThetaRight = ThetaMid; + ThetaMid = 0.5 * (ThetaLeft + ThetaRight); + } } // Update stopping condition - DeltaTheta = abs(ThetaLeft-ThetaRight); + DeltaTheta = abs(ThetaLeft - ThetaRight); } - - //set the q value - rDipoleMid = Lshell * pow(sin(ThetaMid),2.0); - if (iQ ==0){ - qN = pow(rDipoleMid,-2.0)*cos(ThetaMid); + + // set the q value + rDipoleMid = Lshell * pow(sin(ThetaMid), 2.0); + if (iQ == 0) + { + qN = pow(rDipoleMid, -2.0) * cos(ThetaMid); // cout << "!!! For L = " << Lshell << endl; // cout << "!!! qN = " << qN << endl; // cout << "!!! ThetaMid = " << ThetaMid*cRtoD << endl; - }else{ - qS = pow(rDipoleMid,-2.0)*cos(ThetaMid); + } + else + { + qS = pow(rDipoleMid, -2.0) * cos(ThetaMid); // cout << "!!! qS = " << qS << endl; } } report.exit(function); - return {qN,qS}; - + return {qN, qS}; } // ----------------------------------------------------------------------- // Convert XyzDipole to XyzGeo -// +// // ----------------------------------------------------------------------- -void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) { +void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) +{ precision_t XyzRemoveShift[3]; precision_t XyzRemoveTilt[3]; precision_t XyzRemoveRot[3]; @@ -513,15 +228,14 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); precision_t radius = planet.get_radius(0.0); - - // get the dipole shift, but normalize it to equatorial radius + // get the dipole shift, but normalize it to equatorial radius precision_t dipole_center[3]; std::vector temp_dipole_center = planet.get_dipole_center(); transform_float_vector_to_array(temp_dipole_center, dipole_center); - dipole_center[0]=dipole_center[0]/radius; - dipole_center[1]=dipole_center[1]/radius; - dipole_center[2]=dipole_center[2]/radius; + dipole_center[0] = dipole_center[0] / radius; + dipole_center[1] = dipole_center[1] / radius; + dipole_center[2] = dipole_center[2] / radius; // Remove Tilt transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); @@ -532,159 +246,360 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec // Remove Shift vector_add(XyzRemoveRot, dipole_center, XyzGeo); -// cout << "XyzDipole[0]" << XyzDipole[0] << endl; -// cout << "XyzDipole[1]" << XyzDipole[1] << endl; -// cout << "XyzDipole[2]" << XyzDipole[2] << endl; -// -// cout << "XyzGeo[0]" << XyzGeo[0] << endl; -// cout << "XyzGeo[1]" << XyzGeo[1] << endl; -// cout << "XyzGeo[2]" << XyzGeo[2] << endl; - + // cout << "XyzDipole[0]" << XyzDipole[0] << endl; + // cout << "XyzDipole[1]" << XyzDipole[1] << endl; + // cout << "XyzDipole[2]" << XyzDipole[2] << endl; + // + // cout << "XyzGeo[0]" << XyzGeo[0] << endl; + // cout << "XyzGeo[1]" << XyzGeo[1] << endl; + // cout << "XyzGeo[2]" << XyzGeo[2] << endl; } // ---------------------------------------------------------------------- // Routine to fill in the q values for a particular L and lon // using equations 7-8 from Huba et al 2000 // ---------------------------------------------------------------------- -void Grid::fill_dipole_q_line(precision_t qN, precision_t qS, precision_t Gamma, int nZ, precision_t Lshell, precision_t Lon, double *q) { +std::pair Grid::fill_dipole_q_line(precision_t qN_, + precision_t qS_, + precision_t Gamma_, + int64_t nZ_, + precision_t lShell_, + precision_t min_alt_) + +{ + std::string function = "Grid::fill_dipole_q_line"; static int iFunction = -1; report.enter(function, iFunction); - - double x[nZ]; - double r[nZ]; - double theta[nZ]; - double Dx; - precision_t Llr[3], Xyz[3]; - int DoTestLine = 0; - - //open test file for writing the grid data for plotting - std::fstream gridfile; - if (DoTestLine==1){ - gridfile.open ("grid.dat",ios::out); - } - - // set the Dx (c in equation 8 from Huba et al 2000) - // Note this equation has a typo in it. The proper - // version would be found by defining the bounds of - // x from equation 7, and then dividing that into - // equal segments. - //Dx = 2.0*(1.0-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); - - Dx = (sinh(Gamma*qS)-sinh(Gamma*qN))/((static_cast(nZ)-1.0)*sinh(Gamma*qS)); - - //Dx = 2.0/(static_cast(nZ)-1.0); - //Dx = (static_cast(qN)-static_cast(qS))/(static_cast(nZ)-1.0); - - //cout << "Dx = " << Dx << endl; - //cout << "Gamma = " << Gamma << endl; - //cout << "nZ = " << nZ << endl; - //cout << "qN = " << qN << endl; - //cout << "qS = " << qS << endl; - - // set initial x[0] value using eq. 7 from Huba et al with qi=qN - x[0] = sinh(Gamma*qN)/sinh(Gamma*qS); - q[0] = asinh(x[0]*sinh(Gamma*qS))/Gamma; - - // fill x_i=x_(i-1)+Dx - for(int i = 1; i < nZ; i++){ - x[i] = x[i-1]+Dx; - q[i] = asinh(x[i]*sinh(Gamma*qS))/Gamma; - - // For given q and p we can now find cooresponding r and theta in - // dipole coord. Starty by numerically solving for r (normalized) using - // equation 4 of Huba et al 2000 given by q^2r^4+1/p r -1 = 0 - auto rtheta = p_q_to_r_theta(Lshell, q[i]); - - r[i] = rtheta.first; - theta[i] = rtheta.second; - - //cout << "i, q " << i << " " << q[i] << endl; - //cout << "i, x " << i << " " << x[i] << endl; - //cout << "i, r, theta " << i << " " << r[i]<<" "< Grid::p_q_to_r_theta(precision_t p, precision_t q) { - //return quanties +std::pair Grid::qp_to_r_theta(precision_t q, precision_t p) +{ + // return quanties precision_t r, theta; // Intermediate quantities: precision_t term0, term1, term2, term3; - + term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); term2 = pow(term0, 1.0 / 3.0); - term3 = 0.5 * pow(((pow(term1,2) + term1 * term2 + pow(term2,2)) / term1), 3.0 / 2.0); - + term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); + r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); - + // now that r is determined we can solve for theta - //theta = asin(sqrt(r/p)); - theta = acos(q*pow(r,2.0)); - - return {r,theta}; -} + // theta = asin(sqrt(r/p)); + theta = asin(q * pow(r, 2.0)); -arma_vec Grid::get_r3_spacing(precision_t lat, precision_t rMin, - precision_t rMax, int64_t nPts, int64_t nGcs) { - - precision_t rMaxReal = rMax; - - precision_t lShell = get_lshell(lat, rMin); - if (lShell < rMaxReal) - rMaxReal = lShell; - precision_t rMin3 = pow(rMin, 1.0/3.0); - precision_t rMax3 = pow(rMaxReal, 1.0/3.0); - precision_t dr3 = (rMax3 - rMin3) / (nPts-nGcs*2); - arma_vec r(nPts); - for (int64_t iPt = 0; iPt < nPts; iPt++) - r(iPt) = pow(rMin3 + dr3 * (iPt - nGcs), 3); - return r; + return {r, theta}; } // ---------------------------------------------------------------------- -// Initialize the geographic grid. At the moment, this is a simple +// Initialize the dipole grid. At the moment, Aaron B needs to update this string. +// #TODO: FIX THIS! // Lon/Lat/Alt grid. The grid structure is general enough that each // of the lon, lat, and alt can be a function of the other variables. // ---------------------------------------------------------------------- -void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { - +// void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) +// { + +// std::string function = "Grid::init_dipole_grid"; +// static int iFunction = -1; +// report.enter(function, iFunction); + +// // turn the switch on! +// IsGeoGrid = false; +// IsMagGrid = true; + +// int64_t iLon, iLat, iAlt; + +// report.print(0, "Creating Dipole Grid"); + +// report.print(3, "Getting mgrid_inputs inputs in dipole grid"); + +// Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); + +// // Get inputs +// report.print(3, "Setting inputs in dipole grid"); +// // Convert altitudes from km to m: +// precision_t min_apex = grid_input.min_apex * cKMtoM; +// precision_t min_alt = grid_input.alt_min * cKMtoM; +// precision_t LatStretch = grid_input.LatStretch; +// precision_t Gamma = grid_input.FieldLineStretch; +// precision_t max_lat = grid_input.max_lat_dipole; + +// // "Sanitize" the inputs +// precision_t planetRadius = planet.get_radius(0.0); +// precision_t min_lshell = (min_apex + planetRadius) / planetRadius; +// precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; +// // precision_t max_r = (max_alt + planetRadius) / planetRadius; + +// // Get some coordinates and sizes in normalized coordinates: +// arma_vec lower_left_norm = quadtree.get_vect("LL"); +// arma_vec size_right_norm = quadtree.get_vect("SR"); +// arma_vec size_up_norm = quadtree.get_vect("SU"); + +// // ALB needs these for new grid +// precision_t qN, qS, Lon; + +// // LONGITUDES: +// precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); +// precision_t lon0 = lower_left_norm(0) * cPI; +// arma_vec lon1d(nLons); +// // - Make a 1d vector +// // - copy it into the 3d cube +// for (iLon = 0; iLon < nLons; iLon++) +// { +// lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; +// } + +// for (iLat = 0; iLat < nLats; iLat++) +// { +// for (iAlt = 0; iAlt < nAlts; iAlt++) +// magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; +// } + +// geoLon_scgc = magLon_scgc; + +// // Base-latitudes: +// // some stretching is recommended (required 6??). +// // - Make a 1d vector +// // - copy it into the 3d cube + +// // precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); +// // !QUESTION: Use dlat here or (max-min)/total ?? + +// precision_t lat0 = lower_left_norm(1) * cPI; +// arma_vec lat1d(nLats); + +// precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); +// // max_lat defined earlier in inputs + +// // lay down spacing that's linear in cos^(1/latStretch) +// precision_t min_lat_, max_lat_; +// min_lat_ = cos(pow(min_lat, 1 / LatStretch)); +// max_lat_ = cos(pow(max_lat, 1 / LatStretch)); +// // see !QUESTION above +// precision_t dlat = (max_lat_ - min_lat_) / (nLats - 2 * nGCs); + +// for (iLat = nLats / 2; iLat < nLats; iLat++) +// { +// lat1d(iLat) = pow(acos(min_lat_ + (iLat - nGCs + 0.5) * dlat), +// LatStretch); +// // THIS WILL NOT WORK FOR OFFSET DIPOLES: +// lat1d(nLats - iLat - 1) = -lat1d(iLat); +// } + +// for (iLon = 0; iLon < nLons; iLon++) +// { +// for (iAlt = 0; iAlt < nAlts; iAlt++) +// { +// magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; +// } +// } + +// arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); +// arma_cube r3d(nLons, nLats, nAlts); +// precision_t lShell; + +// rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + +// for (iLat = 0; iLat < nLats / 2; iLat++) +// { +// lat0 = lat1d(iLat); +// lat0 = cPI - lat0; + +// lShell = get_lshell(lat0, min_alt_re); + +// // with lShell, go thru and compute q (along field line) points at each longitude +// for (iLon = 0; iLon < nLons; iLon++) +// { +// Lon = magPhi_scgc(iLon, iLat, 1); + +// // This may not be working as expected: +// // auto Qvals = lshell_to_qn_qs(planet, lShell, Lon, min_alt); +// // qN = Qvals.first; +// // qS = Qvals.second; + +// qN = cos((cPI / 2 + lat0)) / pow(min_alt_re, 2.0); +// qS = cos((cPI / 2 - lat0)) / pow(min_alt_re, 2.0); +// // std:: cout<< qN<<" \t"< cPI / 2) +// // lat1dAlong(iAlt) = R_LAT_qline.first(iAlt); +// // if (lat1d(iLat) < -cPI / 2) +// lat1dAlong(iAlt) = R_LAT_qline.first(iAlt); +// rNorm1d(iAlt) = R_LAT_qline.second(iAlt); +// } +// // r3d.tube(iLon, iLat) = rNorm1d; +// r3d.tube(iLon, iLat) = rNorm1d - planetRadius; +// magLat_scgc.tube(iLon, iLat) = lat1dAlong; +// } +// } +// // return; +// // std::ofstream fout0; +// // fout0.open("grid0.csv"); +// // fout0 << "nl,nf,nz,lon,lat,alt,baselat\n"; +// // for (int ilarn = 0; ilarn < nLons; ilarn++) +// // { +// // for (int ilart = 0; ilart < nLats; ilart++) +// // { +// // for (int zi = 0; zi < nZ; zi++) +// // { +// // fout0 << ilarn << "," << ilart << "," << zi << "," << magLon_scgc(ilarn, ilart, zi) +// // << "," << magLat_scgc(ilarn, ilart, zi) << "," << r3d(ilarn, ilart, zi) << "\n"; +// // } +// // } +// // fout0.close(); + +// // return ; + +// geoLat_scgc = magLat_scgc; +// magAlt_scgc = r3d - planetRadius; +// geoAlt_scgc = magAlt_scgc; + +// // Calculate the radius, etc: +// fill_grid_radius(planet); + +// // Figure out what direction is radial: +// rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); +// gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + +// for (int iV = 0; iV < 3; iV++) +// { +// rad_unit_vcgc[iV].zeros(); +// gravity_vcgc[iV].zeros(); +// } + +// arma_cube br = 2 * sin(abs(magLat_scgc)); +// arma_cube bt = cos(magLat_scgc); +// arma_cube bm = sqrt(br % br + bt % bt); +// // Latitudinal direction of radial: +// arma_cube s = sign(magLat_scgc); +// s.elem(find(s == 0)).ones(); + +// rad_unit_vcgc[1] = bt / bm % s; +// rad_unit_vcgc[2] = -br / bm; + +// precision_t mu = planet.get_mu(); +// gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; +// gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; +// gravity_potential_scgc.set_size(nX, nY, nAlts); +// gravity_potential_scgc.zeros(); +// gravity_mag_scgc = sqrt( +// gravity_vcgc[0] % gravity_vcgc[0] + +// gravity_vcgc[1] % gravity_vcgc[1] + +// gravity_vcgc[2] % gravity_vcgc[2]); + +// std::vector llr, xyz, xyzRot1, xyzRot2; +// llr.push_back(magLon_scgc); +// llr.push_back(magLat_scgc); +// llr.push_back(r3d); +// xyz = transform_llr_to_xyz_3d(llr); + +// precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); +// precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + +// // Reverse our dipole rotations: +// xyzRot1 = rotate_around_y_3d(xyz, magnetic_pole_tilt); +// xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); + +// // transform back to lon, lat, radius: +// llr = transform_xyz_to_llr_3d(xyzRot2); + +// geoLon_scgc = llr[0]; +// geoLat_scgc = llr[1]; +// geoAlt_scgc = llr[2] - planetRadius; + +// std::ofstream fout; +// fout.open("grid.csv"); +// fout << "nl,nf,nz,lon,lat,alt,baselat\n"; +// for (int ilarn = 0; ilarn < nLons; ilarn++) +// { +// for (int ilart = 0; ilart < nLats; ilart++) +// { +// for (int zi = 0; zi < nZ; zi++) +// { +// fout << ilarn << "," << ilart << "," << zi << "," << geoLon_scgc(ilarn, ilart, zi) +// << "," << geoLat_scgc(ilarn, ilart, zi) << "," << geoAlt_scgc(ilarn, ilart, zi) << "\n"; +// } +// } +// fout.close(); + +// // return ; +// } + +// // for (iLon = 0; iLon < nLons; iLon++) +// // { +// // for (iAlt = 0; iAlt < nAlts; iAlt++) +// // { +// // magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; +// // } +// // } + +// calc_alt_grid_spacing(); + +// // Calculate magnetic field and magnetic coordinates: +// fill_grid_bfield(planet); + +// report.exit(function); +// return; +// } + +void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) +{ + std::string function = "Grid::init_dipole_grid"; static int iFunction = -1; report.enter(function, iFunction); - -// turn the switch on! + + // turn the switch on! IsGeoGrid = false; IsMagGrid = true; @@ -696,82 +611,195 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); + // Get inputs report.print(3, "Setting inputs in dipole grid"); // Convert altitudes from km to m: precision_t min_apex = grid_input.min_apex * cKMtoM; precision_t min_alt = grid_input.alt_min * cKMtoM; - precision_t max_alt = grid_input.alt_max * cKMtoM; + precision_t LatStretch = grid_input.LatStretch; + precision_t Gamma = grid_input.FieldLineStretch; + precision_t max_lat = grid_input.max_lat_dipole; + + // "Sanitize" the inputs precision_t planetRadius = planet.get_radius(0.0); - precision_t min_lshell = (min_apex + planetRadius)/planetRadius; - precision_t min_r = (min_alt + planetRadius)/planetRadius; - precision_t max_r = (max_alt + planetRadius)/planetRadius; - precision_t min_lat = get_lat_from_r_and_lshell(min_r, min_lshell); - precision_t stretch = (cPI/2 - min_lat) / (cPI/2); - report.print(3, "Done setting inputs in dipole grid"); + precision_t min_lshell = (min_apex + planetRadius) / planetRadius; + precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; + // precision_t max_r = (max_alt + planetRadius) / planetRadius; // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree.get_vect("LL"); arma_vec size_right_norm = quadtree.get_vect("SR"); arma_vec size_up_norm = quadtree.get_vect("SU"); + // ALB needs these for new grid + precision_t qN, qS, Lon; + + // LONGITUDES: precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); - - // Longitudes: // - Make a 1d vector // - copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) + { lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; + } - for (iLat = 0; iLat < nLats; iLat++) { + for (iLat = 0; iLat < nLats; iLat++) + { for (iAlt = 0; iAlt < nAlts; iAlt++) magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; } geoLon_scgc = magLon_scgc; - precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); + // Base-latitudes: + // some stretching is recommended (required 6??). + // - Make a 1d vector + // - copy it into the 3d cube + + // precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); + // !QUESTION: Use dlat here or (max-min)/total ?? + precision_t lat0 = lower_left_norm(1) * cPI; arma_vec lat1d(nLats); - // Latitudes: - // - Make a 1d vector - // - copy it into the 3d cube - for (iLat = 0; iLat < nLats; iLat++) { - lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; - if (lat1d(iLat) >= 0) { - lat1d(iLat) = min_lat + lat1d(iLat) * stretch; - } else { - lat1d(iLat) = -min_lat + lat1d(iLat) * stretch; - } + precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); + + ////////////////////////// + + // Lay down baseLat spacing according to an exponential factor: + precision_t del_lat, blat_min_, blat_max_, tmp_lat; + // This is all going to be done on full field lines. split into halves later + int64_t nF = nLats/2, nZ = nAlts, nZby2 = nAlts / 2; + arma_vec Lshells(nF), baseLats(nF); + + blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); + blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); + del_lat = (blat_max_ - blat_min_) / (nF - nGCs*2.0); + + for (int i = 0; i < nF; i++) + { + // first put down "linear" spacing + tmp_lat = blat_min_ + del_lat * (i-nGCs+0.5); + // then scale it according to the exponent & convert back to deg + tmp_lat = pow(acos(tmp_lat), LatStretch); + // place values in array backwards, S => N hemis + baseLats(nF - i - 1) = -tmp_lat; + } + + // Find L-Shell for each baseLat + // using L=R/sin2(theta), where theta is from north pole + for (int i = 0; i < nF; i++) + { + Lshells(i) = (min_alt_re) / pow(sin(cPI / 2 - baseLats(i)), 2.0); + } + + ////////////////// + + // for (iLon = 0; iLon < nLons; iLon++) + // { + // for (iAlt = 0; iAlt < nAlts; iAlt++) + // { + // magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + // } + // } + + /////////// + + // allocate & calculate some things outside of the main loop + // fa, fb, fc are factors to make the code easier to read + precision_t q_S, q_N, delqp, fa, fb; + precision_t qp0, fb0, ft, delq, qp2; + arma_vec exp_q_dist(nZ), q_vals(nZ); + arma_mat bAlts(nF, nZ), bLats(nF, nZ); + + precision_t term0, term1, term2, term3, new_r; + + for (int i = 0; i < nZ; i++) + { + exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); + } + + for (int i_nF = 0; i_nF < nF; i_nF++) + { + + // min/max q + q_S = - cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); + q_N = -q_S;//cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); + + // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + // first loop for southern hemisphere, second for north. + for (int i_nZ = 0; i_nZ < nZ; i_nZ++) + { + // std::cout< cPI/2) lat0 = cPI - lat0; - if (lat0 < -cPI/2) lat0 = -cPI - lat0; - lShell = get_lshell(lat0, min_r); - rNorm1d = get_r3_spacing(lat0, min_r, max_r, nAlts, nGCs); - lat1dAlong = get_lat_from_r_and_lshell(rNorm1d, lShell); - - if (lat0 < 0) - lat1dAlong = -1.0 * lat1dAlong; - for (iLon = 0; iLon < nLons; iLon++) { + // std::ofstream fout0; + // fout0.open("grid0.csv"); + // fout0 << "nl,nf,nz,lon,lat,alt,baselat\n"; + + for (iLat = 0; iLat < nLats/2; iLat++) + { + for (iLon = 0; iLon < nLons; iLon++) + { + Lon = magPhi_scgc(iLon, iLat, 1); + + for (iAlt = 0; iAlt < nAlts; iAlt++) + { + lat1dAlong(iAlt) = bLats(iLat, iAlt); + rNorm1d(iAlt) = bAlts(iLat, iAlt); + } r3d.tube(iLon, iLat) = rNorm1d * planetRadius; + r3d.tube(iLon, nLats-iLat-1) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; + magLat_scgc.tube(iLon, nLats-iLat-1) = -lat1dAlong; } } + geoLat_scgc = magLat_scgc; magAlt_scgc = r3d - planetRadius; geoAlt_scgc = magAlt_scgc; @@ -783,30 +811,31 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int iV = 0; iV < 3; iV++) { + for (int iV = 0; iV < 3; iV++) + { rad_unit_vcgc[iV].zeros(); gravity_vcgc[iV].zeros(); } arma_cube br = 2 * sin(abs(magLat_scgc)); - arma_cube bt = cos(magLat_scgc); + arma_cube bt = cos(magLat_scgc); arma_cube bm = sqrt(br % br + bt % bt); // Latitudinal direction of radial: arma_cube s = sign(magLat_scgc); - s.elem( find(s == 0) ).ones(); + s.elem(find(s == 0)).ones(); rad_unit_vcgc[1] = bt / bm % s; - rad_unit_vcgc[2] = - br / bm; + rad_unit_vcgc[2] = -br / bm; precision_t mu = planet.get_mu(); gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; - gravity_potential_scgc.set_size(nX, nY, nZ); + gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); gravity_mag_scgc = sqrt( - gravity_vcgc[0] % gravity_vcgc[0] + - gravity_vcgc[1] % gravity_vcgc[1] + - gravity_vcgc[2] % gravity_vcgc[2]); + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(magLon_scgc); @@ -835,6 +864,4 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { report.exit(function); return; - } - diff --git a/src/inputs.cpp b/src/inputs.cpp index 3b7f69ac..15ea40d8 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -15,7 +15,8 @@ Inputs input; // The setting of initial values should probably be moved. // ----------------------------------------------------------------------- -Inputs::Inputs(Times &time) { +Inputs::Inputs(Times &time) +{ // ------------------------------------------------ // Set some defaults: @@ -36,18 +37,24 @@ Inputs::Inputs(Times &time) { nLatsGeo = 20; nAltsGeo = 40; - if (nLonsGeo == 1) { + if (nLonsGeo == 1) + { geo_grid_input.lon_min = 0.0; geo_grid_input.lon_max = 0.0; - } else { + } + else + { geo_grid_input.lon_min = 0.0; geo_grid_input.lon_max = 2.0 * cPI; } - if (nLatsGeo == 1) { + if (nLatsGeo == 1) + { geo_grid_input.lat_min = 0.0; geo_grid_input.lat_max = 0.0; - } else { + } + else + { geo_grid_input.lat_min = -cPI / 2; geo_grid_input.lat_max = cPI / 2; } @@ -64,7 +71,8 @@ Inputs::Inputs(Times &time) { // Now read the input file: isOk = read_inputs_json(time); - if (report.test_verbose(1)) { + if (report.test_verbose(1)) + { std::cout << "Settings read in:\n"; std::cout << std::setw(2) << settings; } @@ -77,10 +85,12 @@ Inputs::Inputs(Times &time) { // output the settings json to a file (for restart) // ----------------------------------------------------------------------- -bool Inputs::write_restart() { +bool Inputs::write_restart() +{ bool didWork = true; - if (iProc == 0) { + if (iProc == 0) + { std::string filename = get_setting_str("Restart", "OutDir"); filename = filename + "/settings.json"; didWork = write_json(filename, settings); @@ -90,14 +100,13 @@ bool Inputs::write_restart() { return didWork; } - // ----------------------------------------------------------------------- // General check functions to see if keys exist: // check settings and throw invalid_argument error // if the setting doesn't exist // ----------------------------------------------------------------------- -//dummy values, to use if the settings are not set +// dummy values, to use if the settings are not set int dummy_int = -1; float dummy_float = -1; std::string dummy_string = "unknown"; @@ -106,21 +115,25 @@ std::string dummy_string = "unknown"; // 2 keys: bool Inputs::check_settings(std::string key1, - std::string key2) { + std::string key2) +{ if (report.test_verbose(2)) std::cout << "checking setting : " << key1 << " and " << key2 << "\n"; - //try to find the keys first - if (settings.find(key1) != settings.end()) { + // try to find the keys first + if (settings.find(key1) != settings.end()) + { if (settings.at(key1).find(key2) != settings.at(key1).end()) isOk = true; - } else - //if we haven't found the keys print a message & set IsOk to false + } + else + // if we haven't found the keys print a message & set IsOk to false isOk = false; - if (!isOk) { + if (!isOk) + { report.error("Error in setting : " + key1 + " : " + key2); std::cout << "Missing setting called! [" << key1 << ", " << key2 << "]\n"; } @@ -131,7 +144,8 @@ bool Inputs::check_settings(std::string key1, // ----------------------------------------------------------------------- // 1 key: -bool Inputs::check_settings(std::string key1) { +bool Inputs::check_settings(std::string key1) +{ if (report.test_verbose(2)) std::cout << "checking setting : " << key1 << "\n"; @@ -139,11 +153,12 @@ bool Inputs::check_settings(std::string key1) { if (settings.find(key1) != settings.end()) isOk = true; else - //if we haven't found the key print a message & set IsOk to false + // if we haven't found the key print a message & set IsOk to false isOk = false; - //perturb is non-essential, otherwise print error message - if (!isOk && key1 != "Perturb") { + // perturb is non-essential, otherwise print error message + if (!isOk && key1 != "Perturb") + { report.error("Error in setting : " + key1); std::cout << "Missing setting called! [" << key1 << "]\n"; } @@ -158,32 +173,38 @@ bool Inputs::check_settings(std::string key1) { // ----------------------------------------------------------------------- // a general int vector -std::vector Inputs::get_setting_intarr(std::string key1) { +std::vector Inputs::get_setting_intarr(std::string key1) +{ std::vector value; - if (check_settings(key1)) { + if (check_settings(key1)) + { int nPts = settings.at(key1).size(); isOk = true; for (int i = 0; i < nPts; i++) value.push_back(settings.at(key1).at(i)); - } else + } + else isOk = false; return value; } std::vector Inputs::get_setting_intarr(std::string key1, - std::string key2) { + std::string key2) +{ std::vector value; - if (check_settings(key1, key2)) { + if (check_settings(key1, key2)) + { int nPts = settings.at(key1).at(key2).size(); isOk = true; for (int i = 0; i < nPts; i++) value.push_back(settings.at(key1).at(key2).at(i)); - } else + } + else isOk = false; return value; @@ -192,12 +213,14 @@ std::vector Inputs::get_setting_intarr(std::string key1, // ----------------------------------------------------------------------- // A specific length int vector -std::vector Inputs::get_setting_timearr(std::string key1) { +std::vector Inputs::get_setting_timearr(std::string key1) +{ int nPtsTime = 7; std::vector outarr(nPtsTime, 0); std::vector timearr = get_setting_intarr(key1); - if (isOk) { + if (isOk) + { int nPts = timearr.size(); if (nPts > nPtsTime) @@ -213,7 +236,8 @@ std::vector Inputs::get_setting_timearr(std::string key1) { // ----------------------------------------------------------------------- // a string with 1 key: -std::string Inputs::get_setting_str(std::string key1) { +std::string Inputs::get_setting_str(std::string key1) +{ std::string value = "unknown"; if (check_settings(key1)) @@ -226,7 +250,8 @@ std::string Inputs::get_setting_str(std::string key1) { // a string with 2 keys: std::string Inputs::get_setting_str(std::string key1, - std::string key2) { + std::string key2) +{ std::string value = "unknown"; if (check_settings(key1, key2)) @@ -240,14 +265,16 @@ std::string Inputs::get_setting_str(std::string key1, std::string Inputs::get_setting_str(std::string key1, std::string key2, - std::string key3) { + std::string key3) +{ std::string value = "unknown"; isOk = false; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) if (settings.at(key1).at(key2).find(key3) != - settings.at(key1).at(key2).end()) { + settings.at(key1).at(key2).end()) + { value = settings.at(key1).at(key2).at(key3); isOk = true; } @@ -261,7 +288,8 @@ std::string Inputs::get_setting_str(std::string key1, // ----------------------------------------------------------------------- // an int with 1 key: -int64_t Inputs::get_setting_int(std::string key1) { +int64_t Inputs::get_setting_int(std::string key1) +{ int64_t value = LONG_MIN; if (check_settings(key1)) @@ -274,7 +302,8 @@ int64_t Inputs::get_setting_int(std::string key1) { // an int with 2 keys: int64_t Inputs::get_setting_int(std::string key1, - std::string key2) { + std::string key2) +{ int64_t value = LONG_MIN; if (check_settings(key1, key2)) @@ -286,7 +315,8 @@ int64_t Inputs::get_setting_int(std::string key1, // ----------------------------------------------------------------------- // a bool with 1 key: -bool Inputs::get_setting_bool(std::string key1) { +bool Inputs::get_setting_bool(std::string key1) +{ bool value = false; if (check_settings(key1)) @@ -299,7 +329,8 @@ bool Inputs::get_setting_bool(std::string key1) { // a bool with 2 keys: bool Inputs::get_setting_bool(std::string key1, - std::string key2) { + std::string key2) +{ bool value = false; if (check_settings(key1, key2)) @@ -313,14 +344,16 @@ bool Inputs::get_setting_bool(std::string key1, bool Inputs::get_setting_bool(std::string key1, std::string key2, - std::string key3) { + std::string key3) +{ bool value = false; isOk = false; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) if (settings.at(key1).at(key2).find(key3) != - settings.at(key1).at(key2).end()) { + settings.at(key1).at(key2).end()) + { value = settings.at(key1).at(key2).at(key3); isOk = true; } @@ -334,7 +367,8 @@ bool Inputs::get_setting_bool(std::string key1, // ----------------------------------------------------------------------- // a float with 1 key: -precision_t Inputs::get_setting_float(std::string key1) { +precision_t Inputs::get_setting_float(std::string key1) +{ precision_t value = std::numeric_limits::lowest(); if (check_settings(key1)) @@ -347,7 +381,8 @@ precision_t Inputs::get_setting_float(std::string key1) { // a float with 2 key: precision_t Inputs::get_setting_float(std::string key1, - std::string key2) { + std::string key2) +{ precision_t value = std::numeric_limits::lowest(); if (check_settings(key1, key2)) @@ -359,12 +394,14 @@ precision_t Inputs::get_setting_float(std::string key1, // ----------------------------------------------------------------------- // a json with 1 key: -json Inputs::get_setting_json(std::string key1) { +json Inputs::get_setting_json(std::string key1) +{ json value; if (settings.find(key1) != settings.end()) value = settings.at(key1); - else { + else + { isOk = false; report.error("Error in setting : " + key1); } @@ -376,16 +413,20 @@ json Inputs::get_setting_json(std::string key1) { // a json with 2 keys: json Inputs::get_setting_json(std::string key1, - std::string key2) { + std::string key2) +{ json value; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) value = settings.at(key1).at(key2); - else { + else + { isOk = false; report.error("Error in setting : " + key1 + " : " + key2); - } else { + } + else + { isOk = false; report.error("Error in setting : " + key1); } @@ -397,7 +438,8 @@ json Inputs::get_setting_json(std::string key1, // a string with 2 keys: std::string Inputs::check_settings_str(std::string key1, - std::string key2) { + std::string key2) +{ if (check_settings(key1, key2)) return settings.at(key1).at(key2); @@ -407,8 +449,10 @@ std::string Inputs::check_settings_str(std::string key1, // ----------------------------------------------------------------------- // a string with 1 key: -std::string Inputs::check_settings_str(std::string key) { - if (get_setting_str(key) == dummy_string) { +std::string Inputs::check_settings_str(std::string key) +{ + if (get_setting_str(key) == dummy_string) + { isOk = false; return dummy_string; } @@ -420,7 +464,8 @@ std::string Inputs::check_settings_str(std::string key) { // a float with 2 keys: precision_t Inputs::check_settings_pt(std::string key1, - std::string key2) { + std::string key2) +{ if (check_settings(key1, key2)) return settings.at(key1).at(key2); @@ -433,30 +478,43 @@ precision_t Inputs::check_settings_pt(std::string key1, // gridtype needs to be "neuGrid" or "ionGrid" // ----------------------------------------------------------------------- -Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { +Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) +{ Inputs::grid_input_struct grid_specs; - grid_specs.shape = check_settings_str(gridtype, "Shape"); + std::vector min_max; + grid_specs.shape = check_settings_str(gridtype, "Shape"); grid_specs.nX = get_setting_int(gridtype, "nLonsPerBlock"); grid_specs.nY = get_setting_int(gridtype, "nLatsPerBlock"); grid_specs.nZ = get_setting_int(gridtype, "nAlts"); - grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); - std::vector min_max; - min_max = get_setting_intarr(gridtype, "LatRange"); - grid_specs.lat_min = min_max[0] * cDtoR; - grid_specs.lat_max = min_max[1] * cDtoR; min_max = get_setting_intarr(gridtype, "LonRange"); grid_specs.lon_min = min_max[0] * cDtoR; grid_specs.lon_max = min_max[1] * cDtoR; - // These are only needed if the gridtype if magnetic: - if (grid_specs.shape == "dipole") { - grid_specs.alt_max = check_settings_pt(gridtype, "MaxAlt"); + grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); + + // The rest of the settings are different for mag/geo grids, + // First take the magnetic options, then "else" should be (cube-)sphere + if (grid_specs.shape == "dipole") + { + // min_apex MUST be more than min_alt: grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); - } else { + if (grid_specs.min_apex <= grid_specs.alt_min) + { + report.error("Error in Inputs! min_apex must be more than min_alt!"); + } + grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); + grid_specs.max_lat_dipole = check_settings_pt(gridtype, "LatMax") * cDtoR; + grid_specs.FieldLineStretch = check_settings_pt(gridtype, "LineSpacing"); + } + else + { + min_max = get_setting_intarr(gridtype, "LatRange"); + grid_specs.lat_min = min_max[0] * cDtoR; + grid_specs.lat_max = min_max[1] * cDtoR; grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); if (grid_specs.IsUniformAlt) @@ -477,25 +535,32 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { // This is needed, because we may want to check for verbose specifically // in a given json and not the normal settings json: -bool Inputs::set_verbose(json in) { +bool Inputs::set_verbose(json in) +{ bool didWork = true; int iVerbose = -1; // Want to set verbose level ASAP: - if (in.contains("Debug")) { - if (in.at("Debug").contains("iVerbose")) { + if (in.contains("Debug")) + { + if (in.at("Debug").contains("iVerbose")) + { iVerbose = in.at("Debug").at("iVerbose"); - if (in.at("Debug").contains("iProc")) { + if (in.at("Debug").contains("iProc")) + { if (iProc != in.at("Debug").at("iProc")) iVerbose = -1; } - } else + } + else didWork = false; - } else + } + else didWork = false; - if (iVerbose > 0) { + if (iVerbose > 0) + { std::cout << "Setting iVerbose : " << iVerbose << "\n"; report.set_verbose(iVerbose); } @@ -507,7 +572,8 @@ bool Inputs::set_verbose(json in) { // Return total number of OMNIWeb files to read // ----------------------------------------------------------------------- -int Inputs::get_number_of_omniweb_files() { +int Inputs::get_number_of_omniweb_files() +{ if (settings.find("OmniwebFiles") != settings.end()) return settings.at("OmniwebFiles").size(); @@ -519,7 +585,8 @@ int Inputs::get_number_of_omniweb_files() { // Return OMNIWeb file names as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_omniweb_files() { +std::vector Inputs::get_omniweb_files() +{ std::vector omniweb_files; int nFiles = get_number_of_omniweb_files(); @@ -533,7 +600,8 @@ std::vector Inputs::get_omniweb_files() { // Return how often to output a given output type // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_output(int iOutput) { +precision_t Inputs::get_dt_output(int iOutput) +{ precision_t value = 0.0; int nOutputs = settings.at("Outputs").at("type").size(); @@ -547,7 +615,8 @@ precision_t Inputs::get_dt_output(int iOutput) { // Return the output type // ----------------------------------------------------------------------- -std::string Inputs::get_type_output(int iOutput) { +std::string Inputs::get_type_output(int iOutput) +{ std::string value = "unknown"; int nOutputs = settings.at("Outputs").at("type").size(); @@ -561,7 +630,8 @@ std::string Inputs::get_type_output(int iOutput) { // Set random number seed // ----------------------------------------------------------------------- -void Inputs::set_seed(int seed) { +void Inputs::set_seed(int seed) +{ settings["Seed"] = seed; updated_seed = seed; } @@ -570,7 +640,8 @@ void Inputs::set_seed(int seed) { // Return random number seed that has been updated // ----------------------------------------------------------------------- -int Inputs::get_updated_seed() { +int Inputs::get_updated_seed() +{ std::default_random_engine get_random(updated_seed); updated_seed = get_random(); return updated_seed; @@ -580,7 +651,8 @@ int Inputs::get_updated_seed() { // Return log file name // ----------------------------------------------------------------------- -std::string Inputs::get_logfile() { +std::string Inputs::get_logfile() +{ std::string logfile = get_setting_str("Logfile", "name"); if (nMembers > 1) @@ -593,18 +665,26 @@ std::string Inputs::get_logfile() { // Return log file name // ----------------------------------------------------------------------- -std::string Inputs::get_logfile(int64_t iLog) { +std::string Inputs::get_logfile(int64_t iLog) +{ std::string logfile = "log.txt"; - if (check_settings("Logfile", "name")) { + if (check_settings("Logfile", "name")) + { int64_t nLogs = settings.at("Logfile").at("name").size(); - if (nLogs == 1) { + if (nLogs == 1) + { logfile = settings.at("Logfile").at("name").at(iLog); - //logfile = get_setting_str("Logfile", "name"); - } else { - if (iLog > nLogs-1) { + // logfile = get_setting_str("Logfile", "name"); + } + else + { + if (iLog > nLogs - 1) + { report.error("Error in getting logfile name!"); - logfile = settings.at("Logfile").at("name").at(nLogs-1); - } else { + logfile = settings.at("Logfile").at("name").at(nLogs - 1); + } + else + { logfile = settings.at("Logfile").at("name").at(iLog); } } @@ -619,7 +699,8 @@ std::string Inputs::get_logfile(int64_t iLog) { // Return the name of specified variables as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_species_vector() { +std::vector Inputs::get_species_vector() +{ std::vector species; const json &json_species = get_setting_json("Logfile", "species"); @@ -633,7 +714,8 @@ std::vector Inputs::get_species_vector() { // Return the name of satellite files as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_files() { +std::vector Inputs::get_satellite_files() +{ std::vector files; const json &json_files = get_setting_json("Satellites", "files"); @@ -647,7 +729,8 @@ std::vector Inputs::get_satellite_files() { // Return the output file names of satellites as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_names() { +std::vector Inputs::get_satellite_names() +{ std::vector names; const json &json_names = get_setting_json("Satellites", "names"); @@ -661,7 +744,8 @@ std::vector Inputs::get_satellite_names() { // Return how oftern to write log file for satellites as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_dts() { +std::vector Inputs::get_satellite_dts() +{ std::vector dts; const json &json_dts = get_setting_json("Satellites", "dts"); @@ -681,7 +765,8 @@ std::vector Inputs::get_satellite_dts() { // Return how oftern to write log file // ----------------------------------------------------------------------- -precision_t Inputs::get_logfile_dt() { +precision_t Inputs::get_logfile_dt() +{ return get_setting_float("Logfile", "dt"); } @@ -689,7 +774,8 @@ precision_t Inputs::get_logfile_dt() { // Return whether to append or rewrite // ----------------------------------------------------------------------- -bool Inputs::get_logfile_append() { +bool Inputs::get_logfile_append() +{ return get_setting_bool("Logfile", "append"); } @@ -697,7 +783,8 @@ bool Inputs::get_logfile_append() { // Return whether user is student // ----------------------------------------------------------------------- -bool Inputs::get_is_student() { +bool Inputs::get_is_student() +{ return get_setting_bool("Student", "is"); } @@ -705,7 +792,8 @@ bool Inputs::get_is_student() { // Return student name // ----------------------------------------------------------------------- -std::string Inputs::get_student_name() { +std::string Inputs::get_student_name() +{ return check_settings_str("Student", "name"); } @@ -713,7 +801,8 @@ std::string Inputs::get_student_name() { // Return whether grid is cubesphere or spherical // ----------------------------------------------------------------------- -bool Inputs::get_is_cubesphere() { +bool Inputs::get_is_cubesphere() +{ return get_setting_bool("CubeSphere", "is"); } @@ -721,7 +810,8 @@ bool Inputs::get_is_cubesphere() { // Return whether to restart or not // ----------------------------------------------------------------------- -bool Inputs::get_do_restart() { +bool Inputs::get_do_restart() +{ return get_setting_bool("Restart", "do"); } @@ -729,7 +819,8 @@ bool Inputs::get_do_restart() { // Return NO cooling // ----------------------------------------------------------------------- -bool Inputs::get_NO_cooling() { +bool Inputs::get_NO_cooling() +{ return get_setting_bool("Sources", "Neutrals", "NO_cool"); } @@ -737,7 +828,8 @@ bool Inputs::get_NO_cooling() { // Return O cooling // ----------------------------------------------------------------------- -bool Inputs::get_O_cooling() { +bool Inputs::get_O_cooling() +{ return get_setting_bool("Sources", "Neutrals", "O_cool"); } @@ -745,7 +837,8 @@ bool Inputs::get_O_cooling() { // Return centripetal acceleration // ----------------------------------------------------------------------- -bool Inputs::get_cent_acc() { +bool Inputs::get_cent_acc() +{ return get_setting_bool("Sources", "Grid", "Cent_acc"); } @@ -753,7 +846,8 @@ bool Inputs::get_cent_acc() { // Return restart OUT directory // ----------------------------------------------------------------------- -std::string Inputs::get_restartout_dir() { +std::string Inputs::get_restartout_dir() +{ return check_settings_str("Restart", "OutDir"); } @@ -761,7 +855,8 @@ std::string Inputs::get_restartout_dir() { // Return restart In directory // ----------------------------------------------------------------------- -std::string Inputs::get_restartin_dir() { +std::string Inputs::get_restartin_dir() +{ return check_settings_str("Restart", "InDir"); } @@ -769,7 +864,8 @@ std::string Inputs::get_restartin_dir() { // dt for writing restart files // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_write_restarts() { +precision_t Inputs::get_dt_write_restarts() +{ return check_settings_pt("Restart", "dt"); } @@ -777,7 +873,8 @@ precision_t Inputs::get_dt_write_restarts() { // Return magnetic field type (dipole and none defined now.) // ----------------------------------------------------------------------- -std::string Inputs::get_bfield_type() { +std::string Inputs::get_bfield_type() +{ return check_settings_str("BField"); } @@ -785,7 +882,8 @@ std::string Inputs::get_bfield_type() { // Return whether to use EUV at all // ----------------------------------------------------------------------- -bool Inputs::get_euv_douse() { +bool Inputs::get_euv_douse() +{ return get_setting_bool("Euv", "doUse"); } @@ -794,7 +892,8 @@ bool Inputs::get_euv_douse() { // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_north_file() { +std::string Inputs::get_electrodynamics_north_file() +{ return check_settings_str("Electrodynamics", "NorthFile"); } @@ -803,7 +902,8 @@ std::string Inputs::get_electrodynamics_north_file() { // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_south_file() { +std::string Inputs::get_electrodynamics_south_file() +{ return check_settings_str("Electrodynamics", "SouthFile"); } @@ -812,7 +912,8 @@ std::string Inputs::get_electrodynamics_south_file() { // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_file() { +std::string Inputs::get_electrodynamics_file() +{ return check_settings_str("Electrodynamics", "File"); } @@ -821,7 +922,8 @@ std::string Inputs::get_electrodynamics_file() { // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_dir() { +std::string Inputs::get_electrodynamics_dir() +{ return check_settings_str("Electrodynamics", "Dir"); } @@ -829,7 +931,8 @@ std::string Inputs::get_electrodynamics_dir() { // Return the Electrodynamics Potential Model // ----------------------------------------------------------------------- -std::string Inputs::get_potential_model() { +std::string Inputs::get_potential_model() +{ return mklower(check_settings_str("Electrodynamics", "Potential")); } @@ -837,7 +940,8 @@ std::string Inputs::get_potential_model() { // Return the Electrodynamics Diffuse Auroral Model // ----------------------------------------------------------------------- -std::string Inputs::get_diffuse_auroral_model() { +std::string Inputs::get_diffuse_auroral_model() +{ return mklower(check_settings_str("Electrodynamics", "DiffuseAurora")); } @@ -845,7 +949,8 @@ std::string Inputs::get_diffuse_auroral_model() { // Return the EUV model used (EUVAC only option now) // ----------------------------------------------------------------------- -std::string Inputs::get_euv_model() { +std::string Inputs::get_euv_model() +{ return mklower(check_settings_str("Euv", "Model")); } @@ -853,7 +958,8 @@ std::string Inputs::get_euv_model() { // Return the heating efficiency of the neutrals for EUV // ----------------------------------------------------------------------- -precision_t Inputs::get_euv_heating_eff_neutrals() { +precision_t Inputs::get_euv_heating_eff_neutrals() +{ return check_settings_pt("Euv", "HeatingEfficiency"); } @@ -861,7 +967,8 @@ precision_t Inputs::get_euv_heating_eff_neutrals() { // Return whether to include the photoelectron ionization // ----------------------------------------------------------------------- -bool Inputs::get_include_photoelectrons() { +bool Inputs::get_include_photoelectrons() +{ return get_setting_bool("Euv", "IncludePhotoElectrons"); } @@ -869,7 +976,8 @@ bool Inputs::get_include_photoelectrons() { // Return how often to calculate EUV energy deposition // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_euv() { +precision_t Inputs::get_dt_euv() +{ return check_settings_pt("Euv", "dt"); } @@ -877,7 +985,8 @@ precision_t Inputs::get_dt_euv() { // Return how often to report progress of simulation // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_report() { +precision_t Inputs::get_dt_report() +{ return check_settings_pt("Debug", "dt"); } @@ -885,7 +994,8 @@ precision_t Inputs::get_dt_report() { // Return number of output types // ----------------------------------------------------------------------- -precision_t Inputs::get_n_outputs() { +precision_t Inputs::get_n_outputs() +{ return settings.at("Outputs").at("type").size(); } @@ -893,7 +1003,8 @@ precision_t Inputs::get_n_outputs() { // Return original random number seed // ----------------------------------------------------------------------- -int Inputs::get_original_seed() { +int Inputs::get_original_seed() +{ return get_setting_int("Seed"); } @@ -901,19 +1012,23 @@ int Inputs::get_original_seed() { // Return number of longitudes, latitudes, and altitudes in grid // ----------------------------------------------------------------------- -int Inputs::get_nLons(std::string gridtype) { +int Inputs::get_nLons(std::string gridtype) +{ return get_setting_int(gridtype, "nLonsPerBlock"); } -int Inputs::get_nLats(std::string gridtype) { +int Inputs::get_nLats(std::string gridtype) +{ return get_setting_int(gridtype, "nLatsPerBlock"); } -int Inputs::get_nAlts(std::string gridtype) { +int Inputs::get_nAlts(std::string gridtype) +{ return get_setting_int(gridtype, "nAlts"); } -std::string Inputs::get_grid_shape(std::string gridtype) { +std::string Inputs::get_grid_shape(std::string gridtype) +{ return mklower(get_setting_str(gridtype, "Shape")); } @@ -921,7 +1036,8 @@ std::string Inputs::get_grid_shape(std::string gridtype) { // Return number of ensemble members // ----------------------------------------------------------------------- -int Inputs::get_nMembers() { +int Inputs::get_nMembers() +{ return check_settings_pt("Ensembles", "nMembers"); } @@ -929,11 +1045,13 @@ int Inputs::get_nMembers() { // Return verbose variables // ----------------------------------------------------------------------- -int Inputs::get_verbose() { +int Inputs::get_verbose() +{ return check_settings_pt("Debug", "iVerbose"); } -int Inputs::get_verbose_proc() { +int Inputs::get_verbose_proc() +{ return get_setting_int("Debug", "iProc"); } @@ -941,7 +1059,8 @@ int Inputs::get_verbose_proc() { // Return EUV file name // ----------------------------------------------------------------------- -std::string Inputs::get_euv_file() { +std::string Inputs::get_euv_file() +{ return check_settings_str("Euv", "File"); } @@ -949,7 +1068,8 @@ std::string Inputs::get_euv_file() { // Return aurora file name // ----------------------------------------------------------------------- -std::string Inputs::get_aurora_file() { +std::string Inputs::get_aurora_file() +{ return check_settings_str("AuroraFile"); } @@ -957,7 +1077,8 @@ std::string Inputs::get_aurora_file() { // Return Chemistry file name // ----------------------------------------------------------------------- -std::string Inputs::get_chemistry_file() { +std::string Inputs::get_chemistry_file() +{ return settings.at("ChemistryFile"); } @@ -965,7 +1086,8 @@ std::string Inputs::get_chemistry_file() { // Return Collision file name // ----------------------------------------------------------------------- -std::string Inputs::get_collision_file() { +std::string Inputs::get_collision_file() +{ return check_settings_str("CollisionsFile"); } @@ -973,7 +1095,8 @@ std::string Inputs::get_collision_file() { // Return Indices Lookup Filename // ----------------------------------------------------------------------- -std::string Inputs::get_indices_lookup_file() { +std::string Inputs::get_indices_lookup_file() +{ return check_settings_str("IndicesLookupFile"); } @@ -981,7 +1104,8 @@ std::string Inputs::get_indices_lookup_file() { // Return F107 file to read // ----------------------------------------------------------------------- -std::string Inputs::get_f107_file() { +std::string Inputs::get_f107_file() +{ return check_settings_str("F107File"); } @@ -989,7 +1113,8 @@ std::string Inputs::get_f107_file() { // Return planet name // ----------------------------------------------------------------------- -std::string Inputs::get_planet() { +std::string Inputs::get_planet() +{ return get_setting_str("Planet", "name"); } @@ -997,7 +1122,8 @@ std::string Inputs::get_planet() { // Return file that contains (all) planetary characteristics // ----------------------------------------------------------------------- -std::string Inputs::get_planetary_file() { +std::string Inputs::get_planetary_file() +{ return check_settings_str("PlanetCharacteristicsFile"); } @@ -1006,7 +1132,8 @@ std::string Inputs::get_planetary_file() { // a given planet // ----------------------------------------------------------------------- -std::string Inputs::get_planet_species_file() { +std::string Inputs::get_planet_species_file() +{ return check_settings_str("PlanetSpeciesFile"); } @@ -1015,7 +1142,8 @@ std::string Inputs::get_planet_species_file() { // of individual ion specie temperature calculations // ----------------------------------------------------------------------- -bool Inputs::get_do_calc_bulk_ion_temp() { +bool Inputs::get_do_calc_bulk_ion_temp() +{ return get_setting_bool("DoCalcBulkIonTemp"); } @@ -1023,7 +1151,8 @@ bool Inputs::get_do_calc_bulk_ion_temp() { // Return Eddy Coefficient // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_coef() { +precision_t Inputs::get_eddy_coef() +{ return get_setting_float("Eddy", "Coefficient"); } @@ -1031,7 +1160,8 @@ precision_t Inputs::get_eddy_coef() { // Return pressure where Eddy Diffusion starts to drop off // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_bottom() { +precision_t Inputs::get_eddy_bottom() +{ return get_setting_float("Eddy", "BottomPressure"); } @@ -1039,7 +1169,8 @@ precision_t Inputs::get_eddy_bottom() { // Return pressure where Eddy Diffusion becomes zero // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_top() { +precision_t Inputs::get_eddy_top() +{ return get_setting_float("Eddy", "TopPressure"); } @@ -1047,7 +1178,8 @@ precision_t Inputs::get_eddy_top() { // // ----------------------------------------------------------------------- -bool Inputs::get_use_eddy_momentum() { +bool Inputs::get_use_eddy_momentum() +{ return get_setting_bool("Eddy", "UseInMomentum"); } @@ -1055,7 +1187,8 @@ bool Inputs::get_use_eddy_momentum() { // // ----------------------------------------------------------------------- -bool Inputs::get_use_eddy_energy() { +bool Inputs::get_use_eddy_energy() +{ return get_setting_bool("Eddy", "UseInEnergy"); } @@ -1063,7 +1196,8 @@ bool Inputs::get_use_eddy_energy() { // // ----------------------------------------------------------------------- -json Inputs::get_perturb_values() { +json Inputs::get_perturb_values() +{ return get_setting_json("Perturb"); } @@ -1071,7 +1205,8 @@ json Inputs::get_perturb_values() { // Flag to check neutral and ions for nans and infinites // ----------------------------------------------------------------------- -bool Inputs::get_check_for_nans() { +bool Inputs::get_check_for_nans() +{ return get_setting_bool("Debug", "check_for_nans"); } @@ -1079,7 +1214,8 @@ bool Inputs::get_check_for_nans() { // Checks to see if nan_test is needed // ----------------------------------------------------------------------- -bool Inputs::get_nan_test() { +bool Inputs::get_nan_test() +{ return get_setting_bool("Debug", "nan_test", "insert"); } @@ -1087,7 +1223,8 @@ bool Inputs::get_nan_test() { // Returns which variable is being tested for nans // ----------------------------------------------------------------------- -std::string Inputs::get_nan_test_variable() { +std::string Inputs::get_nan_test_variable() +{ return get_setting_str("Debug", "nan_test", "variable"); } @@ -1095,7 +1232,8 @@ std::string Inputs::get_nan_test_variable() { // Flag to have a latitude dependent radius, and by extension gravity // ----------------------------------------------------------------------- -bool Inputs::get_do_lat_dependent_radius() { +bool Inputs::get_do_lat_dependent_radius() +{ return get_setting_bool("Oblate", "isOblate"); } @@ -1103,7 +1241,8 @@ bool Inputs::get_do_lat_dependent_radius() { // Flag to include J2 term in the gravity calculation // ----------------------------------------------------------------------- -bool Inputs::get_do_J2() { +bool Inputs::get_do_J2() +{ return get_setting_bool("Oblate", "isJ2"); } @@ -1111,7 +1250,8 @@ bool Inputs::get_do_J2() { // // ----------------------------------------------------------------------- -json Inputs::get_initial_condition_types() { +json Inputs::get_initial_condition_types() +{ return get_setting_json("InitialConditions"); } @@ -1119,11 +1259,13 @@ json Inputs::get_initial_condition_types() { // // ----------------------------------------------------------------------- -json Inputs::get_boundary_condition_types() { +json Inputs::get_boundary_condition_types() +{ return get_setting_json("BoundaryConditions"); } -std::string Inputs::get_advection_neutrals_vertical() { +std::string Inputs::get_advection_neutrals_vertical() +{ return get_setting_str("Advection", "Neutrals", "Vertical"); } @@ -1131,6 +1273,7 @@ std::string Inputs::get_advection_neutrals_vertical() { // check to see if class is ok // -------------------------------------------------------------------------- -bool Inputs::is_ok() { +bool Inputs::is_ok() +{ return isOk; } From 562297adc8ee1c559ecbc7c0425eca816768ff47 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 16:41:57 -0400 Subject: [PATCH 187/691] [bug]: Rename NetCDF Output dimensions to not comflict with variables Netcdf files can't be ready by xarray (python) when a dimension has the same name as a variable. This is a problem for "z". Renames all `(x,y,z,time)` -> `(n_x, n_y, n_z, n_time)` > there are two output_netcdf files. I dont think the other is used? --- src/output_netcdf.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/output_netcdf.cpp b/src/output_netcdf.cpp index be1f560e..beff7c9c 100644 --- a/src/output_netcdf.cpp +++ b/src/output_netcdf.cpp @@ -68,7 +68,7 @@ void output_netcdf_3d(std::vector count_start, bool OutputContainer::read_container_netcdf() { bool didWork = true; - std::string whole_filename = directory + "/" + filename + ".nc"; + std::string whole_filename = directory + filename + ".nc"; std::string UNITS = "units"; try { @@ -161,17 +161,17 @@ bool OutputContainer::read_container_netcdf() { bool OutputContainer::write_container_netcdf() { bool didWork = true; - std::string whole_filename = directory + "/" + filename + ".nc"; + std::string whole_filename = directory+ filename + ".nc"; std::string UNITS = "units"; std::string LONG_NAME = "long_name"; try { NcFile ncdf_file(whole_filename, NcFile::replace); // Add dimensions: - NcDim xDim = ncdf_file.addDim("x", elements[0].value.n_rows); - NcDim yDim = ncdf_file.addDim("y", elements[0].value.n_cols); - NcDim zDim = ncdf_file.addDim("z", elements[0].value.n_slices); - NcDim tDim = ncdf_file.addDim("time", 1); + NcDim xDim = ncdf_file.addDim("n_x", elements[0].value.n_rows); + NcDim yDim = ncdf_file.addDim("n_y", elements[0].value.n_cols); + NcDim zDim = ncdf_file.addDim("n_z", elements[0].value.n_slices); + NcDim tDim = ncdf_file.addDim("n_time", 1); // Define the netCDF variables for the 3D data. // First create a vector of dimensions: From 06c9d7a9649517cd0ec94d40f2d65a973a865f25 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 17:48:10 -0400 Subject: [PATCH 188/691] [STY]: Dipole grid cleaning clean out old comments, improve comments that are gonna be left, refactor a bit. - Some nan's in lon are removed by changing the transform.cpp. It's not a bug so I included it in this commit. - Style in transform.coo too. --- src/init_mag_grid.cpp | 407 ++++++------------------------------------ src/transform.cpp | 106 +++++++---- 2 files changed, 124 insertions(+), 389 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5661feb2..10d5cb63 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -334,264 +334,11 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision } // ---------------------------------------------------------------------- -// Initialize the dipole grid. At the moment, Aaron B needs to update this string. -// #TODO: FIX THIS! -// Lon/Lat/Alt grid. The grid structure is general enough that each -// of the lon, lat, and alt can be a function of the other variables. +// Initialize the dipole grid. +// - inputs (min_apex, min_alt, LatStretch, FieldLineStretch, max_lat_dipole) +// are read from input files. And, of course, the numbers of each coordinate +// - nLats must be even!! // ---------------------------------------------------------------------- - -// void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) -// { - -// std::string function = "Grid::init_dipole_grid"; -// static int iFunction = -1; -// report.enter(function, iFunction); - -// // turn the switch on! -// IsGeoGrid = false; -// IsMagGrid = true; - -// int64_t iLon, iLat, iAlt; - -// report.print(0, "Creating Dipole Grid"); - -// report.print(3, "Getting mgrid_inputs inputs in dipole grid"); - -// Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); - -// // Get inputs -// report.print(3, "Setting inputs in dipole grid"); -// // Convert altitudes from km to m: -// precision_t min_apex = grid_input.min_apex * cKMtoM; -// precision_t min_alt = grid_input.alt_min * cKMtoM; -// precision_t LatStretch = grid_input.LatStretch; -// precision_t Gamma = grid_input.FieldLineStretch; -// precision_t max_lat = grid_input.max_lat_dipole; - -// // "Sanitize" the inputs -// precision_t planetRadius = planet.get_radius(0.0); -// precision_t min_lshell = (min_apex + planetRadius) / planetRadius; -// precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; -// // precision_t max_r = (max_alt + planetRadius) / planetRadius; - -// // Get some coordinates and sizes in normalized coordinates: -// arma_vec lower_left_norm = quadtree.get_vect("LL"); -// arma_vec size_right_norm = quadtree.get_vect("SR"); -// arma_vec size_up_norm = quadtree.get_vect("SU"); - -// // ALB needs these for new grid -// precision_t qN, qS, Lon; - -// // LONGITUDES: -// precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); -// precision_t lon0 = lower_left_norm(0) * cPI; -// arma_vec lon1d(nLons); -// // - Make a 1d vector -// // - copy it into the 3d cube -// for (iLon = 0; iLon < nLons; iLon++) -// { -// lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; -// } - -// for (iLat = 0; iLat < nLats; iLat++) -// { -// for (iAlt = 0; iAlt < nAlts; iAlt++) -// magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; -// } - -// geoLon_scgc = magLon_scgc; - -// // Base-latitudes: -// // some stretching is recommended (required 6??). -// // - Make a 1d vector -// // - copy it into the 3d cube - -// // precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); -// // !QUESTION: Use dlat here or (max-min)/total ?? - -// precision_t lat0 = lower_left_norm(1) * cPI; -// arma_vec lat1d(nLats); - -// precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); -// // max_lat defined earlier in inputs - -// // lay down spacing that's linear in cos^(1/latStretch) -// precision_t min_lat_, max_lat_; -// min_lat_ = cos(pow(min_lat, 1 / LatStretch)); -// max_lat_ = cos(pow(max_lat, 1 / LatStretch)); -// // see !QUESTION above -// precision_t dlat = (max_lat_ - min_lat_) / (nLats - 2 * nGCs); - -// for (iLat = nLats / 2; iLat < nLats; iLat++) -// { -// lat1d(iLat) = pow(acos(min_lat_ + (iLat - nGCs + 0.5) * dlat), -// LatStretch); -// // THIS WILL NOT WORK FOR OFFSET DIPOLES: -// lat1d(nLats - iLat - 1) = -lat1d(iLat); -// } - -// for (iLon = 0; iLon < nLons; iLon++) -// { -// for (iAlt = 0; iAlt < nAlts; iAlt++) -// { -// magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; -// } -// } - -// arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); -// arma_cube r3d(nLons, nLats, nAlts); -// precision_t lShell; - -// rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - -// for (iLat = 0; iLat < nLats / 2; iLat++) -// { -// lat0 = lat1d(iLat); -// lat0 = cPI - lat0; - -// lShell = get_lshell(lat0, min_alt_re); - -// // with lShell, go thru and compute q (along field line) points at each longitude -// for (iLon = 0; iLon < nLons; iLon++) -// { -// Lon = magPhi_scgc(iLon, iLat, 1); - -// // This may not be working as expected: -// // auto Qvals = lshell_to_qn_qs(planet, lShell, Lon, min_alt); -// // qN = Qvals.first; -// // qS = Qvals.second; - -// qN = cos((cPI / 2 + lat0)) / pow(min_alt_re, 2.0); -// qS = cos((cPI / 2 - lat0)) / pow(min_alt_re, 2.0); -// // std:: cout<< qN<<" \t"< cPI / 2) -// // lat1dAlong(iAlt) = R_LAT_qline.first(iAlt); -// // if (lat1d(iLat) < -cPI / 2) -// lat1dAlong(iAlt) = R_LAT_qline.first(iAlt); -// rNorm1d(iAlt) = R_LAT_qline.second(iAlt); -// } -// // r3d.tube(iLon, iLat) = rNorm1d; -// r3d.tube(iLon, iLat) = rNorm1d - planetRadius; -// magLat_scgc.tube(iLon, iLat) = lat1dAlong; -// } -// } -// // return; -// // std::ofstream fout0; -// // fout0.open("grid0.csv"); -// // fout0 << "nl,nf,nz,lon,lat,alt,baselat\n"; -// // for (int ilarn = 0; ilarn < nLons; ilarn++) -// // { -// // for (int ilart = 0; ilart < nLats; ilart++) -// // { -// // for (int zi = 0; zi < nZ; zi++) -// // { -// // fout0 << ilarn << "," << ilart << "," << zi << "," << magLon_scgc(ilarn, ilart, zi) -// // << "," << magLat_scgc(ilarn, ilart, zi) << "," << r3d(ilarn, ilart, zi) << "\n"; -// // } -// // } -// // fout0.close(); - -// // return ; - -// geoLat_scgc = magLat_scgc; -// magAlt_scgc = r3d - planetRadius; -// geoAlt_scgc = magAlt_scgc; - -// // Calculate the radius, etc: -// fill_grid_radius(planet); - -// // Figure out what direction is radial: -// rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); -// gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - -// for (int iV = 0; iV < 3; iV++) -// { -// rad_unit_vcgc[iV].zeros(); -// gravity_vcgc[iV].zeros(); -// } - -// arma_cube br = 2 * sin(abs(magLat_scgc)); -// arma_cube bt = cos(magLat_scgc); -// arma_cube bm = sqrt(br % br + bt % bt); -// // Latitudinal direction of radial: -// arma_cube s = sign(magLat_scgc); -// s.elem(find(s == 0)).ones(); - -// rad_unit_vcgc[1] = bt / bm % s; -// rad_unit_vcgc[2] = -br / bm; - -// precision_t mu = planet.get_mu(); -// gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; -// gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; -// gravity_potential_scgc.set_size(nX, nY, nAlts); -// gravity_potential_scgc.zeros(); -// gravity_mag_scgc = sqrt( -// gravity_vcgc[0] % gravity_vcgc[0] + -// gravity_vcgc[1] % gravity_vcgc[1] + -// gravity_vcgc[2] % gravity_vcgc[2]); - -// std::vector llr, xyz, xyzRot1, xyzRot2; -// llr.push_back(magLon_scgc); -// llr.push_back(magLat_scgc); -// llr.push_back(r3d); -// xyz = transform_llr_to_xyz_3d(llr); - -// precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); -// precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - -// // Reverse our dipole rotations: -// xyzRot1 = rotate_around_y_3d(xyz, magnetic_pole_tilt); -// xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); - -// // transform back to lon, lat, radius: -// llr = transform_xyz_to_llr_3d(xyzRot2); - -// geoLon_scgc = llr[0]; -// geoLat_scgc = llr[1]; -// geoAlt_scgc = llr[2] - planetRadius; - -// std::ofstream fout; -// fout.open("grid.csv"); -// fout << "nl,nf,nz,lon,lat,alt,baselat\n"; -// for (int ilarn = 0; ilarn < nLons; ilarn++) -// { -// for (int ilart = 0; ilart < nLats; ilart++) -// { -// for (int zi = 0; zi < nZ; zi++) -// { -// fout << ilarn << "," << ilart << "," << zi << "," << geoLon_scgc(ilarn, ilart, zi) -// << "," << geoLat_scgc(ilarn, ilart, zi) << "," << geoAlt_scgc(ilarn, ilart, zi) << "\n"; -// } -// } -// fout.close(); - -// // return ; -// } - -// // for (iLon = 0; iLon < nLons; iLon++) -// // { -// // for (iAlt = 0; iAlt < nAlts; iAlt++) -// // { -// // magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; -// // } -// // } - -// calc_alt_grid_spacing(); - -// // Calculate magnetic field and magnetic coordinates: -// fill_grid_bfield(planet); - -// report.exit(function); -// return; -// } - void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { @@ -603,6 +350,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) IsGeoGrid = false; IsMagGrid = true; + // Dimension iterators int64_t iLon, iLat, iAlt; report.print(0, "Creating Dipole Grid"); @@ -613,37 +361,32 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // Get inputs report.print(3, "Setting inputs in dipole grid"); - // Convert altitudes from km to m: precision_t min_apex = grid_input.min_apex * cKMtoM; precision_t min_alt = grid_input.alt_min * cKMtoM; precision_t LatStretch = grid_input.LatStretch; precision_t Gamma = grid_input.FieldLineStretch; precision_t max_lat = grid_input.max_lat_dipole; - // "Sanitize" the inputs + // Normalize to planet radius... precision_t planetRadius = planet.get_radius(0.0); + // L-Shell of minimum field line, normalized to planet radius precision_t min_lshell = (min_apex + planetRadius) / planetRadius; + // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; - // precision_t max_r = (max_alt + planetRadius) / planetRadius; // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree.get_vect("LL"); arma_vec size_right_norm = quadtree.get_vect("SR"); arma_vec size_up_norm = quadtree.get_vect("SU"); - // ALB needs these for new grid - precision_t qN, qS, Lon; - // LONGITUDES: + // - Make a 1d vector + // - copy it into the 3d cube precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); - // - Make a 1d vector - // - copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) - { lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; - } for (iLat = 0; iLat < nLats; iLat++) { @@ -653,140 +396,104 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) geoLon_scgc = magLon_scgc; - // Base-latitudes: - // some stretching is recommended (required 6??). - // - Make a 1d vector - // - copy it into the 3d cube - - // precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); - // !QUESTION: Use dlat here or (max-min)/total ?? - - precision_t lat0 = lower_left_norm(1) * cPI; - arma_vec lat1d(nLats); + // LATITUDES + // min_latitude calculated from min_lshell (min_apex input) precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); - ////////////////////////// - - // Lay down baseLat spacing according to an exponential factor: + // Lay down baseLat spacing according to an exponential factor. + // some intermediates: precision_t del_lat, blat_min_, blat_max_, tmp_lat; - // This is all going to be done on full field lines. split into halves later - int64_t nF = nLats/2, nZ = nAlts, nZby2 = nAlts / 2; + // Integers for field-line loops: + // - nF=nLats/2 (so nLarts MUST be even) + // - nZ=nAlts + // - nZby2 = nZ/2 + int64_t nF = nLats / 2, nZ = nAlts, nZby2 = nAlts / 2; + // lShells and baseLats are currently set for southern hemisphere then mirrored arma_vec Lshells(nF), baseLats(nF); blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); - del_lat = (blat_max_ - blat_min_) / (nF - nGCs*2.0); + del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); for (int i = 0; i < nF; i++) { // first put down "linear" spacing - tmp_lat = blat_min_ + del_lat * (i-nGCs+0.5); - // then scale it according to the exponent & convert back to deg + tmp_lat = blat_min_ + del_lat * (i - nGCs + 0.5); + // then scale it according to the exponent & acos it tmp_lat = pow(acos(tmp_lat), LatStretch); - // place values in array backwards, S => N hemis + // place values in array backwards, South pole -> equator. baseLats(nF - i - 1) = -tmp_lat; } // Find L-Shell for each baseLat // using L=R/sin2(theta), where theta is from north pole for (int i = 0; i < nF; i++) - { Lshells(i) = (min_alt_re) / pow(sin(cPI / 2 - baseLats(i)), 2.0); - } - - ////////////////// - // for (iLon = 0; iLon < nLons; iLon++) - // { - // for (iAlt = 0; iAlt < nAlts; iAlt++) - // { - // magLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; - // } - // } - - /////////// + // SPACING ALONG FIELD LINE // + // Coordinates along the field line to begin modeling + // - In dipole (p,q) coordinates + // - North & south hemisphere base + precision_t q_S, q_N; + // constant stride, scaled later + precision_t delqp; // allocate & calculate some things outside of the main loop - // fa, fb, fc are factors to make the code easier to read - precision_t q_S, q_N, delqp, fa, fb; - precision_t qp0, fb0, ft, delq, qp2; + // - mistly just factors to make the code easier to read + precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3, new_r; + // exp_q_dist is the fraction of total q distance to step for each pt along field line arma_vec exp_q_dist(nZ), q_vals(nZ); + // stored mag. coords temporarily in bAlts and bLats. arma_mat bAlts(nF, nZ), bLats(nF, nZ); - precision_t term0, term1, term2, term3, new_r; + // temp holding of results from q,p -> r,theta conversion: + std::pair r_theta; for (int i = 0; i < nZ; i++) - { exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); - } for (int i_nF = 0; i_nF < nF; i_nF++) { - // min/max q - q_S = - cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); - q_N = -q_S;//cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); - + q_S = -cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); + q_N = -q_S; + // calculate const. stride similar to sami2/3 (huba & joyce 2000) // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // first loop for southern hemisphere, second for north. + // inlo loop thru southern hemisphere, mirror in north. for (int i_nZ = 0; i_nZ < nZ; i_nZ++) { - // std::cout< vector_in, int64_t nElements, - precision_t *array_out) { + precision_t *array_out) +{ for (int64_t i = 0; i < nElements; i++) array_out[i] = vector_in[i]; @@ -58,16 +60,20 @@ void copy_vector_to_array(std::vector vector_in, // ----------------------------------------------------------------------- void copy_cube_to_array(arma_cube cube_in, - precision_t *array_out) { + precision_t *array_out) +{ int64_t nX = cube_in.n_rows; int64_t nY = cube_in.n_cols; int64_t nZ = cube_in.n_slices; int64_t iX, iY, iZ, index; - for (iX = 0; iX < nX; iX++) { - for (iY = 0; iY < nY; iY++) { - for (iZ = 0; iZ < nZ; iZ++) { + for (iX = 0; iX < nX; iX++) + { + for (iY = 0; iY < nY; iY++) + { + for (iZ = 0; iZ < nZ; iZ++) + { index = iX * nY * nZ + iY * nZ + iZ; array_out[index] = cube_in(iX, iY, iZ); } @@ -81,14 +87,17 @@ void copy_cube_to_array(arma_cube cube_in, void copy_mat_to_array(arma_mat mat_in, precision_t *array_out, - bool isFortran) { + bool isFortran) +{ int64_t nX = mat_in.n_rows; int64_t nY = mat_in.n_cols; int64_t iX, iY, index; - for (iX = 0; iX < nX; iX++) { - for (iY = 0; iY < nY; iY++) { + for (iX = 0; iX < nX; iX++) + { + for (iY = 0; iY < nY; iY++) + { if (isFortran) index = iY * nX + iX; else @@ -111,14 +120,17 @@ void copy_mat_to_array(arma_mat mat_in, void copy_array_to_mat(precision_t *array_in, arma_mat &mat_out, - bool isFortran) { + bool isFortran) +{ int64_t nX = mat_out.n_rows; int64_t nY = mat_out.n_cols; int64_t iX, iY, index; - for (iX = 0; iX < nX; iX++) { - for (iY = 0; iY < nY; iY++) { + for (iX = 0; iX < nX; iX++) + { + for (iY = 0; iY < nY; iY++) + { if (isFortran) index = iY * nX + iX; else @@ -134,28 +146,32 @@ void copy_array_to_mat(precision_t *array_in, // ----------------------------------------------------------------------- // Calculate the magnitude of a arma_cube vector // ----------------------------------------------------------------------- -arma_cube calc_magnitude(std::vector xyz) { +arma_cube calc_magnitude(std::vector xyz) +{ arma_cube r = sqrt(xyz[0] % xyz[0] + xyz[1] % xyz[1] + xyz[2] % xyz[2]); - return r; + return r; } // ----------------------------------------------------------------------- -// Transform X, Y, Z to +// Transform X, Y, Z to // Longitude (llr[0]), Latitude (llr[1]), Radius (llr[2]) // Use armidillo cubes // ----------------------------------------------------------------------- -std::vector transform_xyz_to_llr_3d(std::vector xyz) { +std::vector transform_xyz_to_llr_3d(std::vector xyz) +{ std::vector llr; arma_cube xy, r, lon; r = calc_magnitude(xyz); xy = sqrt(xyz[0] % xyz[0] + xyz[1] % xyz[1]); - lon = acos(xyz[0]/xy); + lon = acos(xyz[0] / xy); uvec ind_ = find(xyz[1] < 0.0); lon.elem(ind_) = 2 * cPI - lon.elem(ind_); + ind_ = find(xyz[1] > 2 * cPI); + lon.elem(ind_) = lon.elem(ind_) + 2 * cPI; llr.push_back(lon); llr.push_back(asin(xyz[2] / r)); llr.push_back(r); @@ -168,7 +184,8 @@ std::vector transform_xyz_to_llr_3d(std::vector xyz) { // Use armidillo cubes // ----------------------------------------------------------------------- -std::vector transform_llr_to_xyz_3d(std::vector llr) { +std::vector transform_llr_to_xyz_3d(std::vector llr) +{ std::vector xyz; xyz.push_back(llr[2] % cos(llr[1]) % cos(llr[0])); xyz.push_back(llr[2] % cos(llr[1]) % sin(llr[0])); @@ -180,7 +197,8 @@ std::vector transform_llr_to_xyz_3d(std::vector llr) { // Transform Longitude, Latitude, Radius to X, Y, Z // ----------------------------------------------------------------------- -void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) { +void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) +{ // llr_in[0] = longitude (in radians) // llr_in[1] = latitude (in radians) // llr_in[2] = radius @@ -195,7 +213,8 @@ void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) { // ----------------------------------------------------------------------- std::vector rotate_around_z_3d(std::vector XYZ_in, - precision_t angle) { + precision_t angle) +{ arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -205,7 +224,7 @@ std::vector rotate_around_z_3d(std::vector XYZ_in, precision_t ca = cos(angle); precision_t sa = sin(angle); - XYZ_out.push_back( X * ca + Y * sa); + XYZ_out.push_back(X * ca + Y * sa); XYZ_out.push_back(-X * sa + Y * ca); XYZ_out.push_back(Z); @@ -218,7 +237,8 @@ std::vector rotate_around_z_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- std::vector rotate_around_y_3d(std::vector XYZ_in, - precision_t angle) { + precision_t angle) +{ arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -241,7 +261,8 @@ std::vector rotate_around_y_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- std::vector rotate_around_x_3d(std::vector XYZ_in, - precision_t angle) { + precision_t angle) +{ arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -252,7 +273,7 @@ std::vector rotate_around_x_3d(std::vector XYZ_in, precision_t sa = sin(angle); XYZ_out.push_back(X); - XYZ_out.push_back( Y * ca + Z * sa); + XYZ_out.push_back(Y * ca + Z * sa); XYZ_out.push_back(-Y * sa + Z * ca); return XYZ_out; @@ -264,12 +285,13 @@ std::vector rotate_around_x_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, - precision_t xyz_out[3]) { + precision_t xyz_out[3]) +{ precision_t ca = cos(angle_in); precision_t sa = sin(angle_in); - xyz_out[0] = xyz_in[0] * ca + xyz_in[1] * sa; + xyz_out[0] = xyz_in[0] * ca + xyz_in[1] * sa; xyz_out[1] = -xyz_in[0] * sa + xyz_in[1] * ca; - xyz_out[2] = xyz_in[2]; + xyz_out[2] = xyz_in[2]; } // ----------------------------------------------------------------------- @@ -278,7 +300,8 @@ void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, // ----------------------------------------------------------------------- void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, - precision_t xyz_out[3]) { + precision_t xyz_out[3]) +{ precision_t ca = cos(angle_in); precision_t sa = sin(angle_in); xyz_out[0] = xyz_in[0] * ca - xyz_in[2] * sa; @@ -291,7 +314,8 @@ void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, // ----------------------------------------------------------------------- void transform_float_vector_to_array(std::vector input, - precision_t output[3]) { + precision_t output[3]) +{ for (int i = 0; i < 3; i++) output[i] = input[i]; } @@ -303,14 +327,15 @@ void transform_float_vector_to_array(std::vector input, void transform_vector_xyz_to_env(precision_t xyz_in[3], precision_t lon, precision_t lat, - precision_t env_out[3]) { + precision_t env_out[3]) +{ - env_out[2] = xyz_in[0] * cos(lat) * cos(lon) + - xyz_in[1] * cos(lat) * sin(lon) + xyz_in[2] * sin(lat); + env_out[2] = xyz_in[0] * cos(lat) * cos(lon) + + xyz_in[1] * cos(lat) * sin(lon) + xyz_in[2] * sin(lat); env_out[1] = -(xyz_in[0] * sin(lat) * cos(lon) + xyz_in[1] * sin(lat) * sin(lon) - xyz_in[2] * cos(lat)); - env_out[0] = - xyz_in[0] * sin(lon) + + env_out[0] = -xyz_in[0] * sin(lon) + xyz_in[1] * cos(lon); } @@ -329,7 +354,8 @@ void transform_vector_xyz_to_env(precision_t xyz_in[3], void vector_diff(precision_t vect_in_1[3], precision_t vect_in_2[3], - precision_t vect_out[3]) { + precision_t vect_out[3]) +{ for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] - vect_in_2[i]; } @@ -340,6 +366,8 @@ void vector_diff(precision_t vect_in_1[3], void vector_add(precision_t vect_in_1[3], precision_t vect_in_2[3], - precision_t vect_out[3]) { - for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] + vect_in_2[i]; + precision_t vect_out[3]) +{ + for (int i = 0; i < 3; i++) + vect_out[i] = vect_in_1[i] + vect_in_2[i]; } From 3233b5dfaa3d7fd1ee86b74598be48aca4187402 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 17:53:50 -0400 Subject: [PATCH 189/691] [FEAT]: Add dipole grid options to json settings files - not all ionGrid options are used for sphere/dipole grid. I'll add a doc page on this in the next commit... --- share/run/UA/inputs/defaults.json | 7 +++++-- share/run/aether.json | 14 ++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index b0cae02f..4e85093a 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -85,8 +85,11 @@ "nLonsPerBlock" : 36, "nAlts" : 200, "MinAlt" : 80.0, - "MinApex" : 120.0, - "MaxAlt" : 5000.0}, + "MinApex" : 120.0, + "MaxAlt" : 5000.0, + "LatMax":88.0, + "LineSpacing":0.2, + "LatStretch":6.0}, "Oblate" : { "isOblate" : false, diff --git a/share/run/aether.json b/share/run/aether.json index a819f82e..261bbc36 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -25,10 +25,16 @@ "dAltScale" : 0.25, "IsUniformAlt" : false}, - "ionGrid" : { - "AltFile" : "", - "IsUniformAlt" : false, - "dAltScale" : 0.5}, + "ionGrid": { + "dAltScale": 0.2, + "LatStretch": 6, + "Shape": "dipole", + "nLatsPerBlock" : 22, + "nAlts":159, + "LatMax":88, + "MinAlt":100.0, + "MinApex":150.0 + }, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], From 70802b86f78efb3d6dd2dcb5c512006d43bad838 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 18:10:42 -0400 Subject: [PATCH 190/691] [doc] Draft up some words on the dipole grid. ! I removed the section about passing btwn N/S hemispheres, since that's undecided. --- doc/internals/grid.md | 63 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 32 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index a9858803..ad91f315 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -18,20 +18,19 @@ again, 16 processors are needed, etc. However, in the altitude/radial direction, the number of points that are specified in the aether.json is unchanged, as it does not rely on the number of processors used. -- [Grids in Aether](#grids-in-aether) - - [Grid Types Explained](#grid-types-explained) - - [Grid Shapes Explained](#grid-shapes-explained) - - [TL;DR](#tldr) - - [The Sphere Grid](#the-sphere-grid) - - [The Cubesphere Grid](#the-cubesphere-grid) - - [The Dipole Grid](#the-dipole-grid) - - [Root Nodes](#root-nodes) - - [Sphere](#sphere) - - [Cubesphere](#cubesphere) - - [Specifying Root Nodes](#specifying-root-nodes) - - [Specifying the Grid](#specifying-the-grid) - - [Horizontal Resolution](#horizontal-resolution) - - [Vertical Resolution](#vertical-resolution) +- [Grid Types Explained](#grid-types-explained) +- [Grid Shapes Explained](#grid-shapes-explained) + - [TL;DR](#tldr) + - [The Sphere Grid](#the-sphere-grid) + - [The Cubesphere Grid](#the-cubesphere-grid) + - [The Dipole Grid](#the-dipole-grid) + - [Root Nodes](#root-nodes) + - [Sphere](#sphere) + - [Cubesphere](#cubesphere) + - [Specifying Root Nodes](#specifying-root-nodes) +- [Specifying the Grid](#specifying-the-grid) + - [Horizontal Resolution](#horizontal-resolution) + - [Vertical Resolution](#vertical-resolution) ## Grid Types Explained @@ -115,24 +114,24 @@ bottom of the field-line. Each fieldline starts at the lowest modeled altitude and curves towards the equator. In the northern hemisphere, this means that the fieldlines curve south, while in the southern hemisphere they curve north. -The latitudinal spacing is such that there is a dependence on the L-shell (i.e., -the equatorial radial extent of the field-line). Along the `k` dimension, -field-lines either terminate when they reach the equatorial plane, forming half -of a full field-line, or they terminate at the highest point specified in the -aether.json file, forming an open field line. Any grid point with an L-shell -less than the peak altitude will terminate in the equatorial plane, while any -field-line that has an L-shell above the peak altitude will simply terminate. -Field-lines that terminate in the equatorial plane have corresponding -field-lines in the other hemisphere, so ghostcells are used to pass information -back and forth. Field-lines that terminate at the maximum altitude have -vertical boundary conditions set in the ghost cells. - -The transition from the "closed" field-line region to the "open" field-line -region is a natural break point in the grid. The transition between these -regions can be handled with ghostcells in the "latitudinal" direction. -Therefore it makes the most sense to have have 4 distinct regions in "latitude": -south open, south closed, north closed, north open. The message passing is -treated differently at the boundaries between each of these regions. +The latitudinal spacing is determined by the `LatStretch` factor in the settings. +The base latitudes are then scaled in such a way that **higher** `LatStretch` leads to +more points near the equator, 1.0 is roughly linear, and then values less than 1.0 will +distribute more points near the poles. The exact spacing is calculated where the +difference between successive values is proportional to: +`cos(lat_max)^(1/LatStretch)`. Using an even number of latitudes is required. + +Along the `k` dimension, field lines terminate after a specified number of points. +When using the Dipole grid option, there is not an option to set the maximum altitude. +Rather, points are laid down from the pole towards the equator, stopping when the field +line reaches the equator. Ghost cells are then used to pass information across the +equator. The spacing of points along each field line is the same as +[(Huba, Joyce & Fedder, 2000)](https://doi.org/10.1029/2000JA000035). +Using an even number of points along the `k` dimension (`nAlts`) means that no points +will lie on the magnetic equator and thus the field lines from the high latitude +regions will not reach beyond the plasmasphere. See +[the dipole script in edu/examples](../../edu/examples/Dipole/dipole.py) to +experiment with the available options. ### Root Nodes From d8f79a550ff109ca53016ef1cb20acbc41276613 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 18:31:12 -0400 Subject: [PATCH 191/691] [FEAT]: Experimental check for nLats & attempt to run in 1D > Probably won't work. But a decent starting point, I hope. Feel free to revert this commit if it's broken. --- src/init_mag_grid.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 10d5cb63..ec02cb28 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -412,6 +412,18 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // lShells and baseLats are currently set for southern hemisphere then mirrored arma_vec Lshells(nF), baseLats(nF); + // now make sure the user used 1 or an even number for nLats + if (nLats % 2 != 0) + { + if (nLats == 1) + { + report.print(0, ">> Running in 1D. Experinental!!"); + nF = 1; + } + else + report.error("Cannot use odd nLats with dipole grid!"); + } + blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); From c295433be9fcd9e319a549c952d255cc33433aa3 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 26 Sep 2024 20:57:23 -0400 Subject: [PATCH 192/691] [BUG] Revert commit that screwed up longitudes Though I could do something clever. It's wasn't. Glad I caught this, geez --- src/transform.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/transform.cpp b/src/transform.cpp index 252511b9..74a2f494 100644 --- a/src/transform.cpp +++ b/src/transform.cpp @@ -170,8 +170,6 @@ std::vector transform_xyz_to_llr_3d(std::vector xyz) lon = acos(xyz[0] / xy); uvec ind_ = find(xyz[1] < 0.0); lon.elem(ind_) = 2 * cPI - lon.elem(ind_); - ind_ = find(xyz[1] > 2 * cPI); - lon.elem(ind_) = lon.elem(ind_) + 2 * cPI; llr.push_back(lon); llr.push_back(asin(xyz[2] / r)); llr.push_back(r); From f58fda32c4de4b4c649226a3fa39ab6ee822f4e0 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sat, 28 Sep 2024 12:34:38 -0400 Subject: [PATCH 193/691] [BUG]: Fix altitude spacing in dipole grid - Grid spacing was not exponential, as expected. The issue was with using nZ vs nAlts & is fixed. --- src/init_mag_grid.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index ec02cb28..f26c5dfa 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -408,7 +408,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // - nF=nLats/2 (so nLarts MUST be even) // - nZ=nAlts // - nZby2 = nZ/2 - int64_t nF = nLats / 2, nZ = nAlts, nZby2 = nAlts / 2; + int64_t nF = nLats / 2, nZ = nAlts*2, nZby2 = nAlts; // lShells and baseLats are currently set for southern hemisphere then mirrored arma_vec Lshells(nF), baseLats(nF); @@ -462,7 +462,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // temp holding of results from q,p -> r,theta conversion: std::pair r_theta; - for (int i = 0; i < nZ; i++) + for (int i = 0; i < nAlts; i++) exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); for (int i_nF = 0; i_nF < nF; i_nF++) @@ -474,7 +474,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // calculate const. stride similar to sami2/3 (huba & joyce 2000) // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == // inlo loop thru southern hemisphere, mirror in north. - for (int i_nZ = 0; i_nZ < nZ; i_nZ++) + for (int i_nZ = 0; i_nZ < nAlts; i_nZ++) { // Should be using lshell_to_qn_qs, but it wasn't working right. // This does the same, but won't work for offset dipoles. From 051420889a14ca065345d20ba874aeef4a4a4781 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sat, 28 Sep 2024 12:37:59 -0400 Subject: [PATCH 194/691] [MAINT]: rm unnecessary file & func's unused funcs rm'ed from in init_mag_grid file for debugging removed from edu/examples/dipole/ --- edu/examples/Dipole/grid.cpp | 167 ------------------- src/init_mag_grid.cpp | 300 ----------------------------------- 2 files changed, 467 deletions(-) delete mode 100644 edu/examples/Dipole/grid.cpp diff --git a/edu/examples/Dipole/grid.cpp b/edu/examples/Dipole/grid.cpp deleted file mode 100644 index 9e018acf..00000000 --- a/edu/examples/Dipole/grid.cpp +++ /dev/null @@ -1,167 +0,0 @@ - -#include -#include -#include -#include - -using arma_vec = arma::Col; -using arma_mat = arma::Mat; - -inline double deg2rad(double degrees) -{ - // function compiled inline to convert degrees to radians - static const double pi_on_180 = 4.0 * atan(1.0) / 180.0; - return degrees * pi_on_180; -} - -inline double rad2deg(double degrees) -{ - // function compiled inline to convert degrees to radians - static const double pi_on_180 = 4.0 * atan(1.0) / 180.0; - return degrees / pi_on_180; - // return degrees; -} - -double qp_solve(double q, double p) -{ - double term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); - double term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); - double term2 = pow(term0, 1.0 / 3.0); - double term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); - double new_r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); - return new_r; -} - -int main() -{ - int nF = 100; - int nZ = 200; - float alt_min = 90.0; - float min_blat = 2.25; - float max_blat = 89.9; - - // user-defined constants - double gams = 0.2; - double baselat_spacing = 6.0; - - // constants - int iErr = 0; - float Re = 6371.0; - float pi = 3.14159; - float pio2 = pi / 2.0; - bool didWork = true; - - int nFby2 = nF / 2; - int nZby2 = nZ / 2; - double altmin_inRe = (alt_min + Re) / Re; - - // outputs - arma_mat bLats(nF, nZ), bLons(nF, nZ), bAlts(nF, nZ); - - arma_vec baseLats(nF); - //, bLons(nF, nZ), bAlts(nF, nZ); - - // TODO: REFACTOR FROM HERE TO **1 ? - // Lay down baseLat spacing according to an exponential factor: - double del_lat, blat_min_, blat_max_, tmp_lat; - blat_min_ = cos(deg2rad(pow(min_blat, 1.0 / baselat_spacing))); - blat_max_ = cos(deg2rad(pow(max_blat, 1.0 / baselat_spacing))); - del_lat = (blat_max_ - blat_min_) / (nF - 1.0); - - for (int i = 0; i < nF; i++) - { - // first put down "linear" spacing - tmp_lat = blat_min_ + del_lat * i; - // then scale it according to the exponent & convert back to deg - tmp_lat = pow(rad2deg(acos(tmp_lat)), baselat_spacing); - // place values in array backwards, S => N hemis - baseLats(nF - i - 1) = -tmp_lat; - } - - // Find L-Shell for each baseLat - // using L=R/sin2(theta), where theta is from north pole - arma_vec Lshells(nF); - for (int i = 0; i < nF; i++) - { - Lshells(i) = ((alt_min + Re) / Re) / pow(sin(deg2rad(90.0 - baseLats(i))), 2.0); - } - - // allocate & calculate some things outside of the main loop - // fa, fb, fc are factors to make the code easier to read - double q_S, q_N, delqp, fb; - double qp0, fb0, ft, delq, qp2; - arma_vec exp_q_dist(nZ), q_vals(nZ); - - for (int i = 0; i < nZ; i++) - { - exp_q_dist(i) = gams + (1 - gams) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); - } - - for (int i_nF = 0; i_nF < nF; i_nF++) - { - - // min/max q - q_N = cos(deg2rad(90.0 + baseLats(i_nF))) / pow((alt_min + Re) / Re, 2.0); - q_S = cos(deg2rad(90 - baseLats(i_nF))) / pow((alt_min + Re) / Re, 2.0); - - // calculate const. stride similar to sami2/3 (huba & joyce 2000) - // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // first loop for southern hemisphere, second for north. - for (int i_nZ = 0; i_nZ < nZby2; i_nZ++) - { - delqp = (q_N - q_S) / nZ; - qp0 = q_S + i_nZ * (delqp); - delqp = altmin_inRe * delqp; - fb0 = (1 - exp_q_dist(i_nZ)) / exp(-q_S / delqp - 1); - ft = exp_q_dist(i_nZ) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); - - delq = qp0 - q_S; - qp2 = q_S + ft * delq; - - bAlts(i_nF, i_nZ) = qp_solve(qp2, Lshells(i_nF)); - bLats(i_nF, i_nZ) = rad2deg(asin(qp2 * pow(bAlts(i_nF, i_nZ), 2.0))); - - // test mirroring across hemi's - - bAlts(i_nF, nZ - i_nZ - 1) = qp_solve(-qp2, Lshells(i_nF)); - bLats(i_nF, nZ - i_nZ - 1) = -bLats(i_nF, i_nZ); - } - } - - // calculate const. stride similar to sami2/3 (huba & joyce 2000) - // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // first loop for southern hemisphere, second for north. - // for (int i_nZ=nZ; i_nZ>nZby2; i_nZ++){ - // delqp = (q_N - q_S)/nZ; - // qp0 = q_S + i_nZ*(delqp); - // delqp = altmin_inRe * delqp; - // fb0 = (1-exp_q_dist(i_nZ)) / exp(-q_S/delqp - 1); - // fa = exp_q_dist(i_nZ) - fb0; - // ft = fa + fb0 * exp(-(qp0 - q_S)/delqp); - // - // delq = qp0 - q_S; - // qp2 = q_S + ft * delq; - ////fb = (exp_q_dist(i_nZ) - fa) + fa * exp(-(exp_q_dist(i_nZ) - q_S) / delqp); - ////fb = (exp_q_dist(i_nZ) - fa) + fa * exp(-(q_S + i_nZ * delqp/altmin_inRe) / i_nZ); - // bAlts(i_nF, i_nZ) = qp_solve(qp2, Lshells(i_nF)); - // bLats(i_nF, i_nZ) = rad2deg(asin(qp2 * pow(bAlts(i_nF, i_nZ), 2.0))); - // } - // } - //} - //} - //} - - std::ofstream fout; - fout.open("grid.csv"); - fout << "nf,nz,lat,alt,baselat\n"; - for (int fi = 0; fi < nF; fi++) - { - for (int zi = 0; zi < nZ; zi++) - { - fout << fi << "," << zi << "," << bLats(fi, zi) << "," << bAlts(fi, zi) << "," << baseLats(fi) << "\n"; - } - } - fout.close(); - - return iErr; -} diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index f26c5dfa..5f57e33a 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -6,306 +6,6 @@ #include "../include/aether.h" -// ---------------------------------------------------------------------- -// Routine to find q_N and q_S for a given L -// -// ---------------------------------------------------------------------- -std::pair Grid::lshell_to_qn_qs(Planets planet, - precision_t Lshell, - precision_t Lon, - precision_t AltMin) -{ - std::string function = "Grid::lshell_to_qn_qs"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t qN, qS; - - precision_t XyzDipoleLeft[3], XyzDipoleMid[3], XyzDipoleRight[3]; - precision_t XyzGeoLeft[3], XyzGeoMid[3], XyzGeoRight[3]; - precision_t rGeoLeft, rGeoMid, rGeoRight; - precision_t LlrDipoleLeft[3], LlrDipoleMid[3], LlrDipoleRight[3]; - precision_t ThetaTilt, PhiTilt; - precision_t Lat, Radius, rMin; - // Named dimension constants - static int Lon_ = 0, Lat_ = 1, Radius_ = 2; - - // bound vars for bisection search - precision_t ThetaRight, ThetaLeft, ThetaMid; - precision_t rDipoleLeft, rDipoleMid, rDipoleRight; - - // Stopping condition for bisection search - precision_t DeltaTheta; - precision_t Tolerance = 1e-4; - - // status vars for bisection search - int iStatusLeft, iStatusRight, iStatusMid; - // note we normalize Lshell by equatorial radius - precision_t RadiusEq = planet.get_radius(0.0); - - // loop for qN and qS - for (int iQ = 0; iQ < 2; iQ++) - { - - if (iQ == 0) - { - // set initial left, mid, right bounds for bisection search for qN - ThetaRight = 0.5 * cPI; - ThetaLeft = 1.0 * cDtoR; - ThetaMid = 0.5 * (ThetaRight + ThetaLeft); - } - else - { - // set initial left, mid, right bounds for bisection search for qS - ThetaLeft = 0.5 * cPI; - ThetaRight = 179.0 * cDtoR; - ThetaMid = 0.5 * (ThetaRight + ThetaLeft); - } - - // Initial stopping condition stopping condition - DeltaTheta = abs(ThetaLeft - ThetaRight); - - // start bisection search for qN - while (DeltaTheta > Tolerance) - { - - // find rDipole that cooresponds to these Left,Mid,Right - // ThetaDipole values - rDipoleLeft = Lshell * pow(sin(ThetaLeft), 2.0); - rDipoleMid = Lshell * pow(sin(ThetaMid), 2.0); - rDipoleRight = Lshell * pow(sin(ThetaRight), 2.0); - - // Compute XyzDipole for left, mid,right states - LlrDipoleLeft[Lon_] = Lon; - LlrDipoleLeft[Lat_] = 0.5 * cPI - ThetaLeft; - LlrDipoleLeft[Radius_] = rDipoleLeft; - transform_llr_to_xyz(LlrDipoleLeft, XyzDipoleLeft); - - LlrDipoleMid[Lon_] = Lon; - LlrDipoleMid[Lat_] = 0.5 * cPI - ThetaMid; - LlrDipoleMid[Radius_] = rDipoleMid; - transform_llr_to_xyz(LlrDipoleMid, XyzDipoleMid); - - LlrDipoleRight[Lon_] = Lon; - LlrDipoleRight[Lat_] = 0.5 * cPI - ThetaRight; - LlrDipoleRight[Radius_] = rDipoleRight; - transform_llr_to_xyz(LlrDipoleRight, XyzDipoleRight); - - // Transform to XyzGeo and unnormalize - convert_dipole_geo_xyz(planet, XyzDipoleLeft, XyzGeoLeft); - convert_dipole_geo_xyz(planet, XyzDipoleMid, XyzGeoMid); - convert_dipole_geo_xyz(planet, XyzDipoleRight, XyzGeoRight); - - // cout << "XyzGeoLeft[0]" << XyzGeoLeft[0] << endl; - // cout << "XyzGeoLeft[1]" << XyzGeoLeft[1] << endl; - // cout << "XyzGeoLeft[2]" << XyzGeoLeft[2] << endl; - - XyzGeoLeft[0] = XyzGeoLeft[0] * RadiusEq; - XyzGeoLeft[1] = XyzGeoLeft[1] * RadiusEq; - XyzGeoLeft[2] = XyzGeoLeft[2] * RadiusEq; - - // abort; - - XyzGeoMid[0] = XyzGeoMid[0] * RadiusEq; - XyzGeoMid[1] = XyzGeoMid[1] * RadiusEq; - XyzGeoMid[2] = XyzGeoMid[2] * RadiusEq; - - XyzGeoRight[0] = XyzGeoRight[0] * RadiusEq; - XyzGeoRight[1] = XyzGeoRight[1] * RadiusEq; - XyzGeoRight[2] = XyzGeoRight[2] * RadiusEq; - - // Compute radius in geo coordinate for comparison to rmin - rGeoLeft = sqrt(pow(XyzGeoLeft[0], 2) + pow(XyzGeoLeft[1], 2) + pow(XyzGeoLeft[2], 2)); - rGeoMid = sqrt(pow(XyzGeoMid[0], 2) + pow(XyzGeoMid[1], 2) + pow(XyzGeoMid[2], 2)); - rGeoRight = sqrt(pow(XyzGeoRight[0], 2) + pow(XyzGeoRight[1], 2) + pow(XyzGeoRight[2], 2)); - - // get rmin for given latitude. Radius is lat dependent in general. - // also find status in (0) or out (1) of rMin - Lat = 0.5 * cPI - acos(XyzGeoLeft[2] / rGeoLeft); - Radius = planet.get_radius(Lat); - rMin = Radius + AltMin; - if (rGeoLeft < rMin) - { - iStatusLeft = 0; - } - else - { - iStatusLeft = 1; - } - - Lat = 0.5 * cPI - acos(XyzGeoMid[2] / rGeoMid); - Radius = planet.get_radius(Lat); - rMin = Radius + AltMin; - if (rGeoMid < rMin) - { - iStatusMid = 0; - } - else - { - iStatusMid = 1; - } - - Lat = 0.5 * cPI - acos(XyzGeoRight[2] / rGeoRight); - Radius = planet.get_radius(Lat); - rMin = Radius + AltMin; - if (rGeoRight < rMin) - { - iStatusRight = 0; - } - else - { - iStatusRight = 1; - } - - // Use status values to update left, right and mid values of theta - if (iStatusMid == 0) - { - if (iStatusRight == 1) - { - // Mid becomes left and right stays right - ThetaLeft = ThetaMid; - ThetaMid = 0.5 * (ThetaLeft + ThetaRight); - } - else - { - // Mid becomes right and left stays left - ThetaRight = ThetaMid; - ThetaMid = 0.5 * (ThetaLeft + ThetaRight); - } - } - else - { - if (iStatusRight == 0) - { - // Mid becomes left and right stays right - ThetaLeft = ThetaMid; - ThetaMid = 0.5 * (ThetaLeft + ThetaRight); - } - else - { - // Mid becomes right and left stays left - ThetaRight = ThetaMid; - ThetaMid = 0.5 * (ThetaLeft + ThetaRight); - } - } - // Update stopping condition - DeltaTheta = abs(ThetaLeft - ThetaRight); - } - - // set the q value - rDipoleMid = Lshell * pow(sin(ThetaMid), 2.0); - if (iQ == 0) - { - qN = pow(rDipoleMid, -2.0) * cos(ThetaMid); - // cout << "!!! For L = " << Lshell << endl; - // cout << "!!! qN = " << qN << endl; - // cout << "!!! ThetaMid = " << ThetaMid*cRtoD << endl; - } - else - { - qS = pow(rDipoleMid, -2.0) * cos(ThetaMid); - // cout << "!!! qS = " << qS << endl; - } - } - - report.exit(function); - return {qN, qS}; -} - -// ----------------------------------------------------------------------- -// Convert XyzDipole to XyzGeo -// -// ----------------------------------------------------------------------- - -void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) -{ - precision_t XyzRemoveShift[3]; - precision_t XyzRemoveTilt[3]; - precision_t XyzRemoveRot[3]; - - // get planetary parameters, use radius at equator for Lshell reference - precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); - precision_t radius = planet.get_radius(0.0); - - // get the dipole shift, but normalize it to equatorial radius - precision_t dipole_center[3]; - std::vector temp_dipole_center = planet.get_dipole_center(); - transform_float_vector_to_array(temp_dipole_center, dipole_center); - - dipole_center[0] = dipole_center[0] / radius; - dipole_center[1] = dipole_center[1] / radius; - dipole_center[2] = dipole_center[2] / radius; - - // Remove Tilt - transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); - - // Remove Rot - transform_rot_z(XyzRemoveTilt, magnetic_pole_rotation, XyzRemoveRot); - - // Remove Shift - vector_add(XyzRemoveRot, dipole_center, XyzGeo); - - // cout << "XyzDipole[0]" << XyzDipole[0] << endl; - // cout << "XyzDipole[1]" << XyzDipole[1] << endl; - // cout << "XyzDipole[2]" << XyzDipole[2] << endl; - // - // cout << "XyzGeo[0]" << XyzGeo[0] << endl; - // cout << "XyzGeo[1]" << XyzGeo[1] << endl; - // cout << "XyzGeo[2]" << XyzGeo[2] << endl; -} - -// ---------------------------------------------------------------------- -// Routine to fill in the q values for a particular L and lon -// using equations 7-8 from Huba et al 2000 -// ---------------------------------------------------------------------- -std::pair Grid::fill_dipole_q_line(precision_t qN_, - precision_t qS_, - precision_t Gamma_, - int64_t nZ_, - precision_t lShell_, - precision_t min_alt_) - -{ - - std::string function = "Grid::fill_dipole_q_line"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t r, theta; - precision_t Dx; - precision_t Llr[3], Xyz[3], q[nZ_]; - // precision_t Radius, rMin, alt_min, , delqp, qp0, fb0, ft; - precision_t delqp, qp0, fb0, ft, delq; - int64_t nZby2 = nZ_ / 2; - arma_vec exp_q_dist(nZ_), r_vals(nZ_), lat_vals(nZ_); - - for (int i = 0; i < nZ_; i++) - { - exp_q_dist(i) = Gamma_ + (1 - Gamma_) * exp(-pow(((i - nZby2) / (nZ_ / 10.0)), 2.0)); - } - for (int i_nZ = 0; i_nZ < nZ_; i_nZ++) - { - delqp = (qN_ - qS_) / nZ_; - qp0 = qS_ + i_nZ * (delqp); - delqp = min_alt_ * delqp; - fb0 = (1 - exp_q_dist(i_nZ)) / exp(-qS_ / delqp - 1); - ft = exp_q_dist(i_nZ) - fb0 + fb0 * exp(-(qp0 - qS_) / delqp); - - delq = qp0 - qS_; - q[i_nZ] = qS_ + ft * delq; - - auto rtheta = qp_to_r_theta(-q[i_nZ], lShell_); - r_vals[i_nZ] = rtheta.first; - // r_vals[i_nZ + nZby2] = rtheta.first; - lat_vals[i_nZ] = rtheta.second; - // lat_vals[i_nZ + nZby2] = -rtheta.second; - } - - report.exit(function); - return {r_vals, lat_vals}; -} - // ---------------------------------------------------------------------- // Routine to convert p and q to r and theta. Can be solved iteratively, // or with approach from (Swisdak, 2006), who solved it analytically: From b9de1be981edcdb2568e6c4c487aab37c616d84e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 30 Sep 2024 18:19:23 -0400 Subject: [PATCH 195/691] [FEAT]: Support ghost cells in dipole grid - I can't test in 1D since things break in the geographic grid. If the dipole grid is broken in 1D, let me know! The altitude (along-field-line) ghost cells are treated as standard grid points. - At low altitudes, points are close enough this is OK. - At high altitudes, it's going to be hard to get ghost cells. - For example, if they extend along the field line, there will be points at +25 Re (L-shell of max_lat) - If they are scaled to lower radius, or just not as far along the field line, they will not be perpendicular to B anymore! > Maybe specify where field lines should be separated btwn open/closed? Then closed field lines will overlap across equator, and open field lines will not be perpendicular to B in the ghost cells? IDK yet! ---- Ghost cells in latitude currently go over the poles. Discussion is happening on whether this is a good idea or not. --- --- src/init_mag_grid.cpp | 49 ++++++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 14 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5f57e33a..e5d3164b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -59,6 +59,9 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); + // Number of ghost cells: + int64_t nGCs = get_nGCs(); + // Get inputs report.print(3, "Setting inputs in dipole grid"); precision_t min_apex = grid_input.min_apex * cKMtoM; @@ -85,6 +88,11 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); + + // Quick 1D check for longitudes: + // Same as geo_grid here... + if (!HasXdim) dlon = 1.0 * cDtoR; + for (iLon = 0; iLon < nLons; iLon++) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; @@ -96,7 +104,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) geoLon_scgc = magLon_scgc; - // LATITUDES + // LATITUDES: // min_latitude calculated from min_lshell (min_apex input) precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); @@ -105,38 +113,44 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // some intermediates: precision_t del_lat, blat_min_, blat_max_, tmp_lat; // Integers for field-line loops: - // - nF=nLats/2 (so nLarts MUST be even) - // - nZ=nAlts - // - nZby2 = nZ/2 - int64_t nF = nLats / 2, nZ = nAlts*2, nZby2 = nAlts; + // - nF=nLats/2 (so nLats MUST be even) + // - nZ=nAlts*2 - (we fill up HALF field lines) + // - nZby2 = nAlts + // -> Plus, experinemtal support for altitude ghost cells... + int64_t nF = (nLats) / 2 , nZ = (nAlts) * 2, nZby2 = (nAlts); // lShells and baseLats are currently set for southern hemisphere then mirrored arma_vec Lshells(nF), baseLats(nF); + blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); + blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); + del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); + // now make sure the user used 1 or an even number for nLats if (nLats % 2 != 0) { - if (nLats == 1) + if (!HasYdim) { - report.print(0, ">> Running in 1D. Experinental!!"); + del_lat = 1.0 * cDtoR; + report.print(0, "Running in single latitude dimension. Experinental!!"); nF = 1; } else report.error("Cannot use odd nLats with dipole grid!"); } - blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); - blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); - del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); - + // loop over all cells - everything including the ghost cells + // -> This means some points will go over the pole (baseLat > +- 90 degrees) + // They're taken care of in the conversion to geographic coordinates. for (int i = 0; i < nF; i++) { // first put down "linear" spacing tmp_lat = blat_min_ + del_lat * (i - nGCs + 0.5); - // then scale it according to the exponent & acos it + // then scale it according to the exponent & acos tmp_lat = pow(acos(tmp_lat), LatStretch); // place values in array backwards, South pole -> equator. baseLats(nF - i - 1) = -tmp_lat; } + report.print(3, "Done setting base latitudes for dipole grid."); // Find L-Shell for each baseLat // using L=R/sin2(theta), where theta is from north pole @@ -176,8 +190,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // inlo loop thru southern hemisphere, mirror in north. for (int i_nZ = 0; i_nZ < nAlts; i_nZ++) { - // Should be using lshell_to_qn_qs, but it wasn't working right. - // This does the same, but won't work for offset dipoles. + // This won't work for offset dipoles. // Doesn't have any lat/lon dependence. delqp = (q_N - q_S) / (nZ + 1); qp0 = q_S + i_nZ * (delqp); @@ -194,6 +207,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) bLats(i_nF, i_nZ) = r_theta.second; } } + report.print(3, "Done generating q-spacing for dipole grid."); arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); arma_cube r3d(nLons, nLats, nAlts); @@ -218,11 +232,13 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; } } + report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); geoLat_scgc = magLat_scgc; magAlt_scgc = r3d - planetRadius; geoAlt_scgc = magAlt_scgc; + report.print(4, "Beginning coordinate transformations of the dipole grid."); // Calculate the radius, of planet fill_grid_radius(planet); @@ -256,6 +272,8 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) gravity_vcgc[1] % gravity_vcgc[1] + gravity_vcgc[2] % gravity_vcgc[2]); + report.print(4, "Done gravity calculations for the dipole grid."); + std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(magLon_scgc); llr.push_back(magLat_scgc); @@ -275,11 +293,14 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; + report.print(4, "Done dipole -> geographic transformations for the dipole grid."); calc_alt_grid_spacing(); + report.print(4, "Done altitude spacing for the dipole grid."); // Calculate magnetic field and magnetic coordinates: fill_grid_bfield(planet); + report.print(4, "Done filling dipole grid with b-field!"); report.exit(function); return; From f5835400ea63467ee33fdf003948343a415b53de Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 3 Oct 2024 19:55:16 -0400 Subject: [PATCH 196/691] [FEAT]: Create ion quadtree (It's not used yet) --- include/aether.h | 1 + include/dipole.h | 129 ++++++++++++++++++++++++++++++++++++++++++ include/grid.h | 2 +- include/parallel.h | 2 +- src/init_mag_grid.cpp | 8 +-- src/init_parallel.cpp | 5 +- src/main/main.cpp | 5 +- src/quadtree.cpp | 6 +- 8 files changed, 146 insertions(+), 12 deletions(-) create mode 100644 include/dipole.h diff --git a/include/aether.h b/include/aether.h index 9e7e9d13..fee1cad6 100644 --- a/include/aether.h +++ b/include/aether.h @@ -80,6 +80,7 @@ using json = nlohmann::json; #include "cubesphere.h" #include "sphere.h" #include "quadtree.h" +#include "dipole.h" // not done #include "grid.h" diff --git a/include/dipole.h b/include/dipole.h new file mode 100644 index 00000000..15948395 --- /dev/null +++ b/include/dipole.h @@ -0,0 +1,129 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#ifndef INCLUDE_DIPOLE_H_ +#define INCLUDE_DIPOLE_H_ + +#include "aether.h" +#include + +/************************************************* + * \brief A namespace with all (1-root) dipole grid logic. + *************************************************/ +namespace Dipole { + + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0} + }; + + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0} + }; + + /// Normalized up steps in cube + static const arma_mat UPS = { + {0.0, 1.0, 0.0} + }; + +}; + +/************************************************* + * \brief A namespace with all (2-root) dipole grid logic. + *************************************************/ +namespace Dipole2 { + + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 0.0, 0.0, 0.0} + }; + + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0} + }; + + /// Normalized up steps in cube + static const arma_mat UPS = { + {0.0, 0.5, 0.0}, + {0.0, 0.5, 0.0} + }; + +}; + +/************************************************* + * \brief A namespace with all (4-root) dipole grid logic. + *************************************************/ +namespace Dipole4 { + + /// The normalized origins of each face of the cube (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 1.0, -0.5, 0.0}, + { 1.0, 0.0, 0.0}, + { 0.0, 0.0, 0.0} + }; + + /// Normalized right steps in cube + static const arma_mat RIGHTS = { + {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0}, + {1.0, 0.0, 0.0} + }; + + /// Normalized up steps in cube + static const arma_mat UPS = { + {0.0, 0.5, 0.0}, + {0.0, 0.5, 0.0}, + {0.0, 0.5, 0.0}, + {0.0, 0.5, 0.0} + }; + +}; + + +/************************************************* + * \brief A namespace with all (6-root) dipole grid logic. + * This is the same as the Sphere6 + *************************************************/ + +namespace Dipole6 { + +/// The normalized origins of each face of the cube (i.e. corner) +static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + {2.0/3.0, -0.5, 0.0}, + {4.0/3.0, -0.5, 0.0}, + { 0.0, 0.0, 0.0}, + {2.0/3.0, 0.0, 0.0}, + {3.0/3.0, 0.0, 0.0} +}; + +/// Normalized right steps in cube +static const arma_mat RIGHTS = { + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0}, + { 2.0/3.0, 0.0, 0.0} +}; + +/// Normalized right steps in cube +static const arma_mat UPS = { + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0}, + { 0.0, 0.5, 0.0} +}; + +} + + +#endif // INCLUDE_DIPOLE_H_ diff --git a/include/grid.h b/include/grid.h index a929e2f8..c36d6ee9 100644 --- a/include/grid.h +++ b/include/grid.h @@ -220,7 +220,7 @@ class Grid precision_t Lshell_, precision_t min_alt_); std::pair qp_to_r_theta(precision_t q, precision_t p); - void init_dipole_grid(Quadtree quadtree, Planets planet); + void init_dipole_grid(Quadtree quadtree_ion, Planets planet); arma_vec rNorm1d, lat1dalong; // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/include/parallel.h b/include/parallel.h index 53c64705..6da886c5 100644 --- a/include/parallel.h +++ b/include/parallel.h @@ -34,7 +34,7 @@ extern MPI_Comm aether_comm; /********************************************************************** \brief initialize mpi and figure out ensembles and grid blocks **/ -bool init_parallel(Quadtree &quadtree); +bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion); /********************************************************************** \brief Pack variables for message passing diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index e5d3164b..2671e1cc 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -39,7 +39,7 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision // are read from input files. And, of course, the numbers of each coordinate // - nLats must be even!! // ---------------------------------------------------------------------- -void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) +void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { std::string function = "Grid::init_dipole_grid"; @@ -78,9 +78,9 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; // Get some coordinates and sizes in normalized coordinates: - arma_vec lower_left_norm = quadtree.get_vect("LL"); - arma_vec size_right_norm = quadtree.get_vect("SR"); - arma_vec size_up_norm = quadtree.get_vect("SU"); + arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); + arma_vec size_right_norm = quadtree_ion.get_vect("SR"); + arma_vec size_up_norm = quadtree_ion.get_vect("SU"); // LONGITUDES: // - Make a 1d vector diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index a7efcafa..b8cc58a9 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -23,7 +23,8 @@ std::string cGrid; MPI_Comm aether_comm; -bool init_parallel(Quadtree &quadtree) { +bool init_parallel(Quadtree &quadtree, +Quadtree &quadtree_ion) { bool DidWork = true; @@ -99,6 +100,8 @@ bool init_parallel(Quadtree &quadtree) { std::cout << "seed : " << seed << "\n"; quadtree.build("neuGrid"); + // #TODO + quadtree_ion.build("ionGrid"); } else { if (iProc == 0) { diff --git a/src/main/main.cpp b/src/main/main.cpp index 434de71c..86adcd45 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -36,12 +36,13 @@ int main() { // neutral grid shape, since this could be sphere (1 root) or // cubesphere (6 root) Quadtree quadtree(input.get_grid_shape("neuGrid")); + Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); // Initialize MPI and parallel aspects of the code: - didWork = init_parallel(quadtree); + didWork = init_parallel(quadtree, quadtree_ion); if (!didWork) throw std::string("init_parallel failed!"); @@ -98,7 +99,7 @@ int main() { if (mGrid.iGridShape_ == mGrid.iDipole_) { mGrid.set_IsDipole(true); - mGrid.init_dipole_grid(quadtree, planet); + mGrid.init_dipole_grid(quadtree_ion, planet); mGrid.set_IsGeoGrid(false); } else { std::cout << "Making Spherical Magnetic Grid\n"; diff --git a/src/quadtree.cpp b/src/quadtree.cpp index aba15239..317b8f10 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -55,9 +55,9 @@ void Quadtree::build(std::string gridtype) { IsSphere = true; } if (grid_input.shape == "dipole") { - origins = Sphere::ORIGINS; - rights = Sphere::RIGHTS; - ups = Sphere::UPS; + origins = Dipole::ORIGINS; + rights = Dipole::RIGHTS; + ups = Dipole::UPS; IsSphere = true; } From eaa8695a98db530bc2701ed1c252b83fc5ddfd27 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Oct 2024 13:11:05 -0400 Subject: [PATCH 197/691] [BUG]: Correct origin location in sphere6 and dipole6 4/3, not 3/3. taking (normalized) 2/3 step each time, --- include/dipole.h | 2 +- include/sphere.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/dipole.h b/include/dipole.h index 15948395..ffa016d9 100644 --- a/include/dipole.h +++ b/include/dipole.h @@ -100,7 +100,7 @@ static const arma_mat ORIGINS = { {4.0/3.0, -0.5, 0.0}, { 0.0, 0.0, 0.0}, {2.0/3.0, 0.0, 0.0}, - {3.0/3.0, 0.0, 0.0} + {4.0/3.0, 0.0, 0.0} }; /// Normalized right steps in cube diff --git a/include/sphere.h b/include/sphere.h index 6f2c617c..4f3902a0 100644 --- a/include/sphere.h +++ b/include/sphere.h @@ -41,7 +41,7 @@ static const arma_mat ORIGINS = { {4.0/3.0, -0.5, 0.0}, { 0.0, 0.0, 0.0}, {2.0/3.0, 0.0, 0.0}, - {3.0/3.0, 0.0, 0.0} + {4.0/3.0, 0.0, 0.0} }; /// Normalized right steps in cube From f1782686e47c2eca8efdf4dd167c0474337902a3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:14:44 -0400 Subject: [PATCH 198/691] MERGE: useSeconds is not used anymore --- include/times.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/times.h b/include/times.h index 5496e799..f082f31e 100644 --- a/include/times.h +++ b/include/times.h @@ -99,7 +99,7 @@ class Times { \param useSeconds if false, replace seconds with 0 **/ - std::string get_YMD_HMS(bool useSeconds); + std::string get_YMD_HMS(); /************************************************************** \brief Returns the current time as a string (year, month...) From bf7aebfd1329308c3d63b2a129a755084fe12b4e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:15:19 -0400 Subject: [PATCH 199/691] MEGRE: calc_conduction is done in energy stuff --- src/advance.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 6887694d..66d83b56 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -141,9 +141,6 @@ bool advance(Planets &planet, calc_aurora(gGrid, neutrals, ions); calc_aurora(mGrid, neutralsMag, ionsMag); - // Calculate some neutral source terms: - neutrals.calc_conduction(gGrid, time); - // Calculate chemistry on both grids: chemistry.calc_chemistry(neutrals, ions, time, gGrid); chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); From 25be8e0622a80c9af52b709ac93db44149ed8d21 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:16:00 -0400 Subject: [PATCH 200/691] MERGE: get_nz can return with and without GCs --- src/calc_dt.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index 5854eadf..d1c45e3f 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -138,7 +138,7 @@ precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { report.enter(function, iFunction); precision_t dt; - if (input.get_nAltsGeo() > 1) { + if (grid.get_nZ(false) > 1) { arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; dt = dtz.min(); } else @@ -146,4 +146,4 @@ precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { report.exit(function); return dt; -} \ No newline at end of file +} From 7eeeb94cabb8f21e4648078578482e313333e5ce Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:16:25 -0400 Subject: [PATCH 201/691] MERGE: get_nz can return with and without GCs --- src/ions_bcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index aae7cc73..4166f2e9 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -30,7 +30,7 @@ bool Ions::set_bcs(Grid grid, bool didWork = true; - if (input.get_nAltsGeo() > 1) { + if (grid.get_nZ(false) > 1) { didWork = set_lower_bcs(grid, time, indices); if (didWork) From cc839182fdb0ad57083ee1bbdec0e210426d0ff7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:17:13 -0400 Subject: [PATCH 202/691] MERGE: 00 seconds handled somewhere else --- src/time.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/time.cpp b/src/time.cpp index fa986916..cbef9756 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -147,11 +147,8 @@ double Times::get_end() { // Get the current time as a string // ----------------------------------------------------------------------------- -std::string Times::get_YMD_HMS(bool useSeconds) { - if (useSeconds) - return sYMD_HMS; - else - return sYMD_HM0; +std::string Times::get_YMD_HMS() { + return sYMD_HMS; } // ----------------------------------------------------------------------------- From 681764e94914ce28dbd34cdd6c12fd47471f4f89 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:18:13 -0400 Subject: [PATCH 203/691] MERGE: check takes a string now --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 75d8decd..9c0a8286 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -128,7 +128,7 @@ int main() { } if (input.get_check_for_nans()) { - didWork = neutrals.check_for_nonfinites(); + didWork = neutrals.check_for_nonfinites("After Inputs"); didWork = ions.check_for_nonfinites(); } From eaad347cc3adbc995187bfbd4e5d5aac386d5dc7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 9 Oct 2024 20:33:27 -0400 Subject: [PATCH 204/691] BUG: * should be % in armacube mult --- src/fill_grid.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index de5bcfd1..5cd90393 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -376,17 +376,17 @@ void Grid::calc_alt_grid_spacing() { MeshH3 = h1 + h2 + h3; MeshH4 = h1 + h2 + h3 + h4; MeshCoef1s3rdp1.slice(iAlt) = - -1.0*( MeshH2*MeshH3*MeshH4 + MeshH1*MeshH3*MeshH4 + - MeshH1*MeshH2*MeshH4 + MeshH1*MeshH2*MeshH3)/ - (MeshH1*MeshH2*MeshH3*MeshH4); + -1.0*( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + + MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3)/ + (MeshH1 % MeshH2 % MeshH3 % MeshH4); MeshCoef1s3rdp2.slice(iAlt) = - 1.0*( MeshH2*MeshH3*MeshH4)/(h1*h2*(h2 + h3)*(h2 + h3 + h4)); + 1.0*( MeshH2 % MeshH3 % MeshH4)/(h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); MeshCoef1s3rdp3.slice(iAlt) = - -1.0*( MeshH1*MeshH3*MeshH4)/(MeshH2*h2*h3*(h3+h4)); + -1.0*( MeshH1 % MeshH3 % MeshH4)/(MeshH2 % h2 % h3 % (h3+h4)); MeshCoef1s3rdp4.slice(iAlt) = - 1.0*( MeshH1*MeshH2*MeshH4)/(MeshH3*(h3+h2)*h3*h4); + 1.0*( MeshH1 % MeshH2 % MeshH4)/(MeshH3 % (h3+h2) % h3 % h4); MeshCoef1s3rdp5.slice(iAlt) = - -1.0*( MeshH1*MeshH2*MeshH3)/(MeshH4*(h2+h3+h4)*(h3+h4)*h4); + -1.0*( MeshH1 % MeshH2 % MeshH3)/(MeshH4 % (h2+h3+h4) % (h3+h4) % h4); } } From 24f8dfab71f0f40175678697f06ee0066e7bb5ae Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:38:11 -0400 Subject: [PATCH 205/691] FEAT: different ways of dealing with neutral friction --- include/neutrals.h | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index f542832c..a7ef5e79 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -60,8 +60,11 @@ class Neutrals { std::vector velocity_vcgc; std::vector newVelocity_vcgc; - /// Acceleration of each species (m/s^2) + /// Acceleration of each species (m/s^2) due to friction term std::vector acc_neutral_friction; + + /// Coefficient for the friction term (sum of friction coefs with others) + arma_cube neutral_friction_coef; /// Acceleration of each species based on Eddy contribution. /// Only in vertical direction. @@ -528,10 +531,13 @@ class Neutrals { bool advect_vertical(Grid grid, Times time); arma_vec calc_friction_one_cell(int64_t iLong, int64_t iLat, int64_t iAlt, - arma_vec &vels); + precision_t dt, arma_vec &vels); - void calc_neutral_friction(); - + arma_vec calc_friction_one_cell_v2(int64_t iLon, int64_t iLat, int64_t iAlt, + arma_vec &vels); + + void calc_neutral_friction(precision_t dt); + void calc_neutral_friction_coefs(); }; #endif // INCLUDE_NEUTRALS_H_ From 36cc4b1aacbc23b3da653835b5ac127d82272bc1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:38:21 -0400 Subject: [PATCH 206/691] FEAT: different ways of dealing with neutral friction --- src/neutrals.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index e2634bab..c9ceda5e 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -40,6 +40,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.ionization_scgc.set_size(nLons, nLats, nAlts); tmp.acc_neutral_friction = make_cube_vector(nLons, nLats, nAlts, 3); + tmp.neutral_friction_coef.set_size(nLons, nLats, nAlts); tmp.acc_ion_drag = make_cube_vector(nLons, nLats, nAlts, 3); tmp.acc_eddy.set_size(nLons, nLats, nAlts); tmp.ionization_scgc.zeros(); From b37a244072d798f2108fa87325fd15f66f40af0d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:38:35 -0400 Subject: [PATCH 207/691] FEAT: different ways of dealing with neutral friction --- src/neutrals_momentum_friction.cpp | 195 +++++++++++++++++++++++++---- 1 file changed, 171 insertions(+), 24 deletions(-) diff --git a/src/neutrals_momentum_friction.cpp b/src/neutrals_momentum_friction.cpp index f585cdf7..1b432f48 100644 --- a/src/neutrals_momentum_friction.cpp +++ b/src/neutrals_momentum_friction.cpp @@ -10,8 +10,56 @@ // multiply by dt later. // --------------------------------------------------------------------- -arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, +arma_vec Neutrals::calc_friction_one_cell_v2(int64_t iLon, int64_t iLat, int64_t iAlt, arma_vec &vels) { + std::string function = "neutral_friction_one_cell_v2"; + static int iFunction = -1; + report.enter(function, iFunction); + precision_t ktom, temp_dij; + int64_t iSpecies, jSpecies, iSpecies_, jSpecies_; + + arma_vec acc(nSpeciesAdvect); + + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + + Neutrals::species_chars & advected_neutral = species[iSpecies_]; + + // ktom = boltzmann's constant * temperature / mass + ktom = + cKB * + temperature_scgc(iLon, iLat, iAlt) / + advected_neutral.mass; + + for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { + jSpecies_ = species_to_advect[jSpecies]; + + if (iSpecies_ == jSpecies_) + continue; + temp_dij = + 1e-4 * advected_neutral.diff0[jSpecies_] * + pow(temperature_scgc(iLon, iLat, iAlt), + advected_neutral.diff_exp[jSpecies_]) / + (density_scgc(iLon, iLat, iAlt)); + acc[iSpecies] = acc[iSpecies] + temp_dij * (vels[jSpecies] - vels[iSpecies]); + } + acc[iSpecies] = acc[iSpecies] * ktom; + + } + + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + if (iAlt == 2) std::cout << "acc : " << species[iSpecies_].cName << " " << acc(iSpecies) << " old " << vels(iSpecies) << "\n"; + } + + + report.exit(function); + return acc; +} + + +arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, + precision_t dt, arma_vec &vels) { std::string function = "neutral_friction_one_cell"; static int iFunction = -1; report.enter(function, iFunction); @@ -42,33 +90,45 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA // These coefficients demand that: // (1) density be in cm^-3 (hence the 1.0e-06) factor below // (2) Additionally, the Dij's are in cm^2/s, thus the 1.0e-04 factor + //if (iAlt == 2) + // std::cout << "diff0 : " << iSpecies_ << " " << jSpecies_ << " " << advected_neutral.diff0[jSpecies_] << " " << advected_neutral.diff_exp[jSpecies_] << "\n"; temp_dij = - 1e-4 * advected_neutral.diff0[jSpecies_] * + advected_neutral.diff0[jSpecies_] * pow(temperature_scgc(iLon, iLat, iAlt), - advected_neutral.diff_exp[jSpecies_]) / - (density_scgc(iLon, iLat, iAlt) * 1e-6); + advected_neutral.diff_exp[jSpecies_]) * 1000.0; + //1e-4 * advected_neutral.diff0[jSpecies_] * + //pow(temperature_scgc(iLon, iLat, iAlt), + // advected_neutral.diff_exp[jSpecies_]) / + //(density_scgc(iLon, iLat, iAlt) * 1e-6); coefmatrix(iSpecies, jSpecies) = - ktom * advected_neutral.density_scgc(iLon, iLat, iAlt) / - (temp_dij * density_scgc(iLon, iLat, iAlt)); + ktom * species[jSpecies_].density_scgc(iLon, iLat, iAlt) / temp_dij; + //(temp_dij * density_scgc(iLon, iLat, iAlt)); } // jSpec loop } // iSpec loop - matrix = -1 * coefmatrix; + matrix = -1 * coefmatrix * dt; // Fill in diagonal of matrix: for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) - matrix(iSpecies, iSpecies) = 1 + sum(coefmatrix.row(iSpecies)); + matrix(iSpecies, iSpecies) = 1 - sum(coefmatrix.row(iSpecies)); // initialize array of each neutral species' accelerations at (iLon, iLat, iAlt): arma_vec accs(nSpeciesAdvect, fill::zeros); // Solve system of equations: - arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); + //arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); + arma_vec new_vels = arma::solve(matrix, vels); // put the new values into the velocity cubes: - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) - accs(iSpecies) = new_vels(iSpecies) - vels(iSpecies); + //for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) + // accs(iSpecies) = new_vels(iSpecies) - vels(iSpecies); +/* + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + if (iAlt == 2) std::cout << "vels : " << species[iSpecies_].cName << " " << new_vels(iSpecies) << " old " << vels(iSpecies) << "\n"; + } + */ report.exit(function); return new_vels; } @@ -77,59 +137,146 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA // // --------------------------------------------------------------------- -void Neutrals::calc_neutral_friction() { +void Neutrals::calc_neutral_friction(precision_t dt) { std::string function = "calc_neutral_friction"; static int iFunction = -1; report.enter(function, iFunction); int64_t iAlt, iLat, iLon, iDir, iSpecies, iSpecies_; + int64_t jSpecies, jSpecies_; + + arma_cube ktom; + arma_cube coef; + arma_cube tpower; // Initialize all of the accelerations to zero: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { for (iDir = 0; iDir < 3; iDir++) species[iSpecies].acc_neutral_friction[iDir].zeros(); - + } if (input.get_advection_neutrals_vertical() != "hydro") { arma_vec vels(nSpeciesAdvect, fill::zeros); arma_vec acc(nSpeciesAdvect, fill::zeros); - arma_vec new_vels; + arma_vec new_vels(nSpeciesAdvect, fill::zeros); int64_t nXs = temperature_scgc.n_rows; int64_t nYs = temperature_scgc.n_cols; int64_t nZs = temperature_scgc.n_slices; - + int64_t nGCs = 2; +/* + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + // ktom = boltzmann's constant * temperature / mass + ktom = + cKB * + temperature_scgc / + species[iSpecies_].mass; + for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { + jSpecies_ = species_to_advect[jSpecies]; + if (iSpecies_ == jSpecies_) + continue; + tpower = pow(temperature_scgc, species[iSpecies_].diff_exp[jSpecies_]); + // NEED TO REMOVE /100!!! + coef = ktom % species[jSpecies_].density_scgc / + (species[iSpecies_].diff0[jSpecies_] * tpower) / 100.0; + species[iSpecies_].neutral_friction_coef = + species[iSpecies_].neutral_friction_coef + coef; + iDir = 2; + species[iSpecies_].acc_neutral_friction[iDir] = + species[iSpecies_].acc_neutral_friction[iDir] + + coef % species[iSpecies_].velocity_vcgc[iDir]; + } + } +*/ // Calculate friction terms for only species that advect. // - If only 1 species is advected, then it will have no friction if (nSpeciesAdvect > 1) { for (iAlt = 0; iAlt < nZs; iAlt++) { - for (iLat = 0; iLat < nYs; iLat++) { - for (iLon = 0; iLon < nXs; iLon++) { + for (iLat = nGCs; iLat < nYs - nGCs; iLat++) { + for (iLon = nGCs; iLon < nXs - nGCs; iLon++) { iDir = 2; //for (iDir = 0; iDir < 3; iDir++) { vels.zeros(); - //Put the old velocities into vels: + // The velocities are just after the vertical solver, so the velocities are + // the source terms for the friction solver. for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { iSpecies_ = species_to_advect[iSpecies]; vels(iSpecies) = - species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt); + species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt); } // = neutral_friction_one_cell(iLon, iLat, iAlt, vels); - acc = calc_friction_one_cell(iLon, iLat, iAlt, vels); + new_vels = calc_friction_one_cell(iLon, iLat, iAlt, dt, vels); for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { iSpecies_ = species_to_advect[iSpecies]; - //species[iSpecies_].velocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); - species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = - acc(iSpecies); + species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); + //species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = + // acc(iSpecies); } // iSpeciesAdvect //} // for direction } // for long } // for lat } // for alt } // if nSpecies > 1 + + } // if !hydro + + report.exit(function); + return; +} //calc_neutral_friction + + +// --------------------------------------------------------------------- +// +// --------------------------------------------------------------------- + +void Neutrals::calc_neutral_friction_coefs() { + + std::string function = "calc_neutral_friction_coefs"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t iAlt, iLat, iLon, iDir, iSpecies, iSpecies_; + int64_t jSpecies, jSpecies_; + + arma_cube ktom; + arma_cube coef; + arma_cube tpower; + + // Initialize all of the accelerations to zero: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies_].neutral_friction_coef.zeros(); + for (iDir = 0; iDir < 3; iDir++) + species[iSpecies].acc_neutral_friction[iDir].zeros(); + } + if (input.get_advection_neutrals_vertical() != "hydro") { + + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + // ktom = boltzmann's constant * temperature / mass + ktom = + cKB * + temperature_scgc / + species[iSpecies_].mass; + for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { + jSpecies_ = species_to_advect[jSpecies]; + if (iSpecies_ == jSpecies_) + continue; + tpower = pow(temperature_scgc, species[iSpecies_].diff_exp[jSpecies_]); + // NEED TO REMOVE /100!!! + coef = ktom % species[jSpecies_].density_scgc / + (species[iSpecies_].diff0[jSpecies_] * tpower) / 100.0; + species[iSpecies_].neutral_friction_coef = + species[iSpecies_].neutral_friction_coef + coef; + iDir = 2; + species[iSpecies_].acc_neutral_friction[iDir] = + species[iSpecies_].acc_neutral_friction[iDir] + + coef % species[iSpecies_].velocity_vcgc[iDir]; + } + } } // if !hydro report.exit(function); From d988a4c7c1acba99e2c6a696a7774a20faf1badc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:39:48 -0400 Subject: [PATCH 208/691] FEAT: different ways of dealing with neutral friction --- src/solver_vertical_rusanov.cpp | 138 ++++++++++++-------------------- 1 file changed, 52 insertions(+), 86 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index cc52871d..ebf5db75 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -252,20 +252,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, cMax_vcgc[2], gradDummy, diffDummy); - /* - if (iProc == 11) - std::cout << "gradlog : " - << iSpecies << " " - << species[iSpecies].density_scgc(7,19,17) << " " - << log_s(7,19,14) << " " - << log_s(7,19,15) << " " - << log_s(7,19,16) << " " - << log_s(7,19,17) << " " - << log_s(7,19,18) << " " - << log_s(7,19,19) << " " - << cMax_vcgc[2](7,19,17) << " " - << gradDummy(7,19,17) << "\n"; - */ + gradLogN_s[iSpecies] = gradDummy; diffLogN_s[iSpecies] = diffDummy; @@ -295,6 +282,12 @@ void Neutrals::solver_vertical_rusanov(Grid grid, // calculate vertical momentum due to eddy diffusion: vertical_momentum_eddy(grid); + bool useImplicitFriction = true; + + if (useImplicitFriction) { + calc_neutral_friction_coefs(); + } + // ----------------------------------------------------------- // Now calculate new states: precision_t mass; @@ -303,6 +296,8 @@ void Neutrals::solver_vertical_rusanov(Grid grid, arma_cube gmo(nXs, nYs, nZs); gmo = gamma_scgc - one; + arma_cube accTotal(nXs, nYs, nZs); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { if (species[iSpecies].DoAdvect) { @@ -316,43 +311,34 @@ void Neutrals::solver_vertical_rusanov(Grid grid, + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); + accTotal = + dt * grid.gravity_vcgc[2] + - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + + dt * diffVertVel_s[iSpecies] + - dt * species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] + + dt * v2or + + dt * species[iSpecies].acc_eddy + + dt * acc_coriolis[2] + + dt * grid.cent_acc_vcgc[2]; + // vertical velocities: - species[iSpecies].newVelocity_vcgc[2] = - species[iSpecies].velocity_vcgc[2] - - dt * (species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] - - v2or - - species[iSpecies].acc_eddy - - acc_coriolis[2] - - grid.cent_acc_vcgc[2] - + 1.0 * (temperature_scgc % gradLogN_s[iSpecies] * cKB / mass - + gradTemp * cKB / mass - + abs(grid.gravity_vcgc[2]))) - + dt * diffVertVel_s[iSpecies]; - /* - if (iProc == 11) { - std::cout << "den + vel : " - << iSpecies << " " - << species[iSpecies].density_scgc(7,19,17) << " " - << log_s(7,19,17) << " " - << species[iSpecies].velocity_vcgc[2](7,19,17) << " " - << species[iSpecies].newVelocity_vcgc[2](7,19,17) << " " - << species[iSpecies].acc_eddy(7,19,17) << " " - << velocity_vcgc[0](7,19,17) << " " - << velocity_vcgc[1](7,19,17) << " " - << cMax_vcgc[0](7,19,17) << " " - << cMax_vcgc[1](7,19,17) << " " - << cMax_vcgc[2](7,19,17) << " " - << gradLogN_s[iSpecies](7,19,17) << " " - << temperature_scgc(7,19,17) << " " - << gradTemp(7,19,17) << " " - << diffVertVel_s[iSpecies](7,19,17) << " " - << v2or(7,19,17) << "\n"; - } */ + if (useImplicitFriction) { + species[iSpecies].newVelocity_vcgc[2] = + (species[iSpecies].velocity_vcgc[2] + accTotal + + dt * species[iSpecies].acc_neutral_friction[2]) / + (1.0 + dt * species[iSpecies].neutral_friction_coef); + } else { + species[iSpecies].newVelocity_vcgc[2] = + (species[iSpecies].velocity_vcgc[2] + accTotal); + } + } else { species[iSpecies].newVelocity_vcgc[2].zeros(); species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; } } + if (!useImplicitFriction) + calc_neutral_friction(dt); newTemperature_scgc = temperature_scgc @@ -360,21 +346,11 @@ void Neutrals::solver_vertical_rusanov(Grid grid, + gmo % (temperature_scgc % divBulkVertVel)) + dt * diffTemp; -/* - if (iProc == 11) - std::cout << "temp : " - << temperature_scgc(7,19,17) << " " - << newTemperature_scgc(7,19,17) << " " - << velocity_vcgc[2](7,19,17) << " " - << gradTemp(7,19,17) << " " - << gmo(7,19,17) << " " - << divBulkVertVel(7,19,17) << " " - << diffTemp(7,19,17) << "\n"; -*/ + precision_t maxVerticalVelocity = 100.0; for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) - species[iSpecies].newVelocity_vcgc[2].clamp(-200,200); + species[iSpecies].newVelocity_vcgc[2].clamp(-maxVerticalVelocity, maxVerticalVelocity); newTemperature_scgc.clamp(150, 1e32); for (iX = nGCs; iX < nXs - nGCs; iX++) @@ -396,35 +372,25 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } -iX = 2; -iY = 4; - // Force the neutrals to move together with friction: - iSpecies = 3; - std::cout << "ver sol, before friction: " - << species[iSpecies].velocity_vcgc[2](iX,iY,1) << " " - << species[iSpecies].velocity_vcgc[2](iX,iY,2) << " " - << species[iSpecies].velocity_vcgc[2](iX,iY,3) << " " - << species[iSpecies].velocity_vcgc[2](iX,iY,4) << "\n"; - - mass = species[iSpecies].mass; - - for (int iAlt = 0; iAlt < 20; iAlt++) { - std::cout << iAlt << " " - << log(species[iSpecies].density_scgc(iX, iY,iAlt)) << " " - << temperature_scgc(iX,iY,iAlt) << " " - << species[iSpecies].velocity_vcgc[2](iX,iY,iAlt) << " " - << temperature_scgc(10,10,iAlt) * gradLogN_s[iSpecies](iX,iY,iAlt) * cKB / mass << " " - << gradTemp(iX,iY,iAlt) * cKB / mass << " " - << abs(grid.gravity_vcgc[2](iX,iY,iAlt)) << "\n"; + bool doPrintThis = false; + if (doPrintThis) { + iX = 2; + iY = 2; + iSpecies = 4; + mass = species[iSpecies].mass; + + for (int iAlt = 0; iAlt < 20; iAlt++) { + std::cout << iAlt << " " + << log(species[iSpecies].density_scgc(iX, iY,iAlt)) << " " + << temperature_scgc(iX,iY,iAlt) << " " + << species[iSpecies].velocity_vcgc[2](iX,iY,iAlt) << " " + << temperature_scgc(iX,iY,iAlt) * gradLogN_s[iSpecies](iX,iY,iAlt) * cKB / mass << " " + << gradTemp(iX,iY,iAlt) * cKB / mass << " " + << grid.gravity_vcgc[2](iX,iY,iAlt) << "\n"; + } } - - calc_neutral_friction(); - std::cout << "ver acc, after friction: " - << species[iSpecies].acc_neutral_friction[2](iX,iY,1) << " " - << species[iSpecies].acc_neutral_friction[2](iX,iY,2) << " " - << species[iSpecies].acc_neutral_friction[2](iX,iY,3) << " " - << species[iSpecies].acc_neutral_friction[2](iX,iY,4) << "\n"; - + //calc_neutral_friction(); +/* for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { if (species[iSpecies].DoAdvect) { species[iSpecies].velocity_vcgc[2] = @@ -432,7 +398,7 @@ iY = 4; species[iSpecies].acc_neutral_friction[2]; } } - std::cout << "here\n"; +*/ calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); From 60da461ecfd776d151d1574a74111b3cae8253a4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:42:48 -0400 Subject: [PATCH 209/691] BUG: changed the way to tell if cubesphere grid --- src/calc_dt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index d1c45e3f..65411c5d 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -16,7 +16,7 @@ precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { precision_t dt; - if (input.get_is_cubesphere()) + if (grid.iGridShape_ == grid.iCubesphere_) dt = calc_dt_cubesphere(grid, cMax_vcgc); else dt = calc_dt_sphere(grid, cMax_vcgc); From 1a4ba560a0013abd787f66657f60c0eb29c440e8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:43:16 -0400 Subject: [PATCH 210/691] BUG: need cmax for diffusion! --- src/advance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index 66d83b56..3d43c14f 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -56,7 +56,7 @@ bool advance(Planets &planet, neutrals.calc_bulk_velocity(); neutrals.calc_kappa_eddy(); neutrals.calc_viscosity(); - //neutrals.calc_cMax(); + neutrals.calc_cMax(); ions.fill_electrons(); ions.calc_sound_speed(); From d91143d4cf51574f1d6595c1f8c2b8f8c3986944 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 16:59:54 -0400 Subject: [PATCH 211/691] Q: not sure which BC I should use for the velocity --- src/neutrals_bcs.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index bcc35646..6b92dd7b 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -221,7 +221,8 @@ bool Neutrals::set_lower_bcs(Grid grid, //std::cout << "before project : " << iAlt << " " << iSpecies << " " // << species[iSpecies].velocity_vcgc[2](10,10,2) << "\n"; species[iSpecies].velocity_vcgc[2].slice(iAlt) = - project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); + species[iSpecies].velocity_vcgc[2].slice(iAlt+1); + //project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); } } // Force vertical velocities to be zero in the ghost cells: From 27cd547983ec5b11f66d7275f7eba7c43f2a3237 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 17:00:38 -0400 Subject: [PATCH 212/691] BUG: new way to call get_nZ --- src/neutrals_ics.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index b41249c2..98bcd7ce 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -30,7 +30,7 @@ bool Neutrals::initial_conditions(Grid grid, int64_t iLon, iLat, iAlt, iA; precision_t alt, r; - int64_t nAlts = grid.get_nZ(); + int64_t nAlts = grid.get_nZ(true); int64_t nGCs = grid.get_nGCs(); report.print(3, "Creating Neutrals initial_condition"); @@ -172,7 +172,6 @@ bool Neutrals::initial_conditions(Grid grid, } calc_scale_height(grid); set_lower_bcs(grid, time, indices); - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); From 1e237eeffa6b18e8a7663d0005eee0fe066d902f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 17:01:17 -0400 Subject: [PATCH 213/691] FEAT: vertical solver is better, so up CFL --- src/time.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/time.cpp b/src/time.cpp index cbef9756..6accc347 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -115,7 +115,7 @@ int Times::check_time_gate(precision_t dt_check) { void Times::calc_dt(precision_t dtNeutral, precision_t dtIon) { dt = end - current; - double cfl = 0.1; + double cfl = 0.25; if (cfl * dtNeutral < dt) dt = cfl * dtNeutral; From 3d33fe8bd2ab456283d27861abf01488c1930820 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 14 Oct 2024 17:01:59 -0400 Subject: [PATCH 214/691] DOC: removed cout statement --- src/calc_neutral_derived.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 4bf9905f..ac44d1ca 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -232,9 +232,6 @@ void Neutrals::calc_scale_height(Grid grid) { (species[iSpecies].mass * abs(grid.gravity_mag_scgc)); } - iSpecies = 3; - std::cout << "scale_height : " << species[iSpecies].scale_height_scgc(10,10,2) << "\n"; - // If we have eddy diffusion, the scale-heights need to be adjusted, // since all of the scale heights should be the same in the region // where eddy diffusion is dominant. From 5271b5f54e27bf85d4edd1833f6670c3c8d7362e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 16 Oct 2024 17:50:42 -0400 Subject: [PATCH 215/691] [feat]: Move dipole grid funcs to their own header file --- include/aether.h | 1 + include/grid.h | 14 +++-------- include/init_mag_grid.h | 52 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 include/init_mag_grid.h diff --git a/include/aether.h b/include/aether.h index fee1cad6..28c6a4b5 100644 --- a/include/aether.h +++ b/include/aether.h @@ -84,6 +84,7 @@ using json = nlohmann::json; // not done #include "grid.h" +#include "init_mag_grid.h" // Contains the neutral states and derived quantities #include "neutrals.h" diff --git a/include/grid.h b/include/grid.h index c36d6ee9..af2a761d 100644 --- a/include/grid.h +++ b/include/grid.h @@ -207,21 +207,13 @@ class Grid void calc_cent_acc(Planets planet); // Make mag-field grid: - std::pair lshell_to_qn_qs(Planets planet, - precision_t Lshell, - precision_t Lon, - precision_t AltMin); void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]); - std::pair fill_dipole_q_line(precision_t qN_, - precision_t qS_, - precision_t Gamma_, - int64_t nZ_, - precision_t Lshell_, - precision_t min_alt_); - std::pair qp_to_r_theta(precision_t q, precision_t p); + + void init_dipole_grid(Quadtree quadtree_ion, Planets planet); arma_vec rNorm1d, lat1dalong; + // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h new file mode 100644 index 00000000..59bf860e --- /dev/null +++ b/include/init_mag_grid.h @@ -0,0 +1,52 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + + +#ifndef INCLUDE_INIT_MAG_GRID_H_ +#define INCLUDE_INIT_MAG_GRID_H_ + +#include "aether.h" +#include "planets.h" +#include "grid.h" + +bool init_mag_grid(Grid &mGrid, Planets planet); + + +// Take limits & specs of field line, fill it with points. +// std::pair fill_dipole_q_line(precision_t qN_, +// precision_t qS_, +// precision_t Gamma_, +// int64_t nZ_, +// precision_t Lshell_, +// precision_t min_alt_); + + +// Analytic solution to get from q,p dipole coords to r,theta +// q coordinate along b-field line +// p l-shell +// return (r,theta) +std::pair qp_to_r_theta(precision_t q, precision_t p); + +// get the latitude spacing given the quadtree start&size, and the latitude limits +// extent quadtree up +// origin quadtree origin +// upper_lim upper latitude limit (input) +// lower_lim lower latitude limit (from min_apex) +// nLats number of latitudes (nY) +// spacing_factor (not supported yet), so always 1.0. +arma_vec baselat_spacing(precision_t extent, + precision_t origin, + precision_t upper_lim, + precision_t lower_lim, + int16_t nLats, + precision_t spacing_factor); + + +std::tuple fill_field_lines(arma_vec lShells, + int64_t nAlts, + int64_t nLats, + precision_t Gamma); + + +#endif // INCLUDE_INIT_GEO_GRID_H_ + From 8b937affef4801b08ad1e77e0b8eb29e2995f1c7 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 16 Oct 2024 17:53:49 -0400 Subject: [PATCH 216/691] [bug] add support for quadtree into dipole grid. -> the ghost cells aren't in yet though. changes to grid.cpp will support any variation of the dipole grid, from dipole to dipole6. Any number, really. --- include/inputs.h | 2 +- src/grid.cpp | 2 +- src/init_mag_grid.cpp | 318 +++++++++++++++++++++++++----------------- src/inputs.cpp | 11 +- src/quadtree.cpp | 8 ++ 5 files changed, 203 insertions(+), 138 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 03fc16c6..85f5bb77 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -63,7 +63,7 @@ class Inputs { // Only needed for Mag Field grid: // min_apex (not used) and LatStretch is used // as lat = min_lat + dlat where dlat = acos(cos(lat^stretch))^(1/stretch) - precision_t min_apex, LatStretch, FieldLineStretch, max_lat_dipole; + precision_t min_apex, LatStretch, FieldLineStretch, max_blat; // Some grid shapes allow specification of altitudes based on a file: std::string alt_file; diff --git a/src/grid.cpp b/src/grid.cpp index 50a65598..44d460a2 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -49,7 +49,7 @@ Grid::Grid(std::string gridtype) { iGridShape_ = iSphere_; if (mklower(grid_input.shape) == "cubesphere") iGridShape_ = iCubesphere_; - if (mklower(grid_input.shape) == "dipole") + if (grid_input.shape.find("dipole") != std::string::npos) iGridShape_ = iDipole_; geoLon_scgc.set_size(nX, nY, nZ); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 2671e1cc..0744fdcc 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -2,9 +2,8 @@ // Full license can be found in License.md #include -#include -#include "../include/aether.h" +#include "aether.h" // ---------------------------------------------------------------------- // Routine to convert p and q to r and theta. Can be solved iteratively, @@ -12,7 +11,7 @@ // https://arxiv.org/pdf/physics/0606044 // // ---------------------------------------------------------------------- -std::pair Grid::qp_to_r_theta(precision_t q, precision_t p) +std::pair qp_to_r_theta(precision_t q, precision_t p) { // return quanties precision_t r, theta; @@ -33,6 +32,153 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision return {r, theta}; } +arma_vec baselat_spacing(precision_t extent, + precision_t origin, + precision_t upper_lim, + precision_t lower_lim, + int16_t nLats, + precision_t spacing_factor) +{ + std::string function = "Grid::baselat_spacing"; + static int iFunction = -1; + report.enter(function, iFunction); + report.print(3, "baselates enter!"); + + // intermediate latitude values + precision_t lat_low, lat_high, lat_low0, lat_high0; + // intermediate calculation values + precision_t dlat, bb, aa, ang0, angq; + + // Now we can allocate the return array, + arma_vec Lats(nLats); + + // Noting the special case of 1 root node & 1 processor... + bool DO_FLIPBACK = false; + if (extent > 0.5) + { + DO_FLIPBACK = true; + nLats = nLats / 2; + extent = 0.5; + } + + // get the upper & lower latitude bounds for our division of the quadree + if (origin < 0) + { + // negative origin: lat_high = lat_low & vice-versa. + lat_low, lat_high = -lat_high, -lat_low; + lat_low0 = lat_low; + lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); + lat_high = lat_low0 - (lat_high - lat_low0) * (extent / .5 + origin / 0.5); + } + else + { + lat_low0 = lat_low; + lat_low = lat_low + (lat_high - lat_low) * (origin / 0.5); + lat_high = lat_low0 + (lat_high - lat_low0) * (extent / .5 + origin / 0.5); + } + + // normalized spacing in latitude + // NOTE: spacing factor != 1 will not work yet. but framework is here... + bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); + aa = lat_high - bb * pow(lat_high, spacing_factor); + dlat = (lat_high - lat_low) / (nLats); + report.print(3, "baselates laydown!"); + + for (int64_t j = 0; j < nLats; j++) + { + ang0 = lat_low + (j + 1) * dlat; + angq = aa + bb * pow(ang0, spacing_factor); + Lats[j] = angq; + } + report.print(3, "baselates flipback!"); + + if (DO_FLIPBACK) + for (int64_t j = 0; j < nLats; j++) + { + Lats[j + nLats] = -1 * Lats[j]; + } + report.print(3, "baselates flipbackdone!"); + + report.exit(function); + return Lats; +} + +// === SPACING ALONG FIELD LINE === // +// Coordinates along the field line to begin modeling +// - In dipole (p,q) coordinates +// - North & south hemisphere base + +std:: tuple fill_field_lines(arma_vec baseLats, + int64_t nAlts, + precision_t min_altRe, + precision_t Gamma) +{ + + std::string function = "Grid::fill_field_lines"; + static int iFunction = -1; + report.enter(function, iFunction); + + report.print(3, "entered!"); + + + int64_t nLats = baseLats.n_elem; + + precision_t q_S, q_N, delqp; + arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); + + // allocate & calculate some things outside of the main loop + // - mostly just factors to make the code easier to read + precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3, new_r; + // exp_q_dist is the fraction of total q-distance to step for each pt along field line + arma_vec exp_q_dist(nAlts); + + // temp holding of results from q,p -> r,theta conversion: + std:: pair r_theta; + + // Find L-Shell for each baseLat + // using L=R/sin2(theta), where theta is from north pole + arma_vec Lshells(nLats); + for (int64_t iLat = 0; iLat < nLats; iLat++) + Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); + report.print(3, "lshells!"); + + + int64_t nZby2 = nAlts / 2; + + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) + exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nZby2) / (nAlts / 10.0)), 2.0)); + + for (int iLat = 0; iLat < nLats; iLat++) + { + q_S = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); + q_N = -q_S; + + // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + for (int iAlt = 0; iAlt < nAlts; iAlt++) + { + // Doesn't have any lat/lon dependence so won't work for offset dipoles + delqp = (q_N - q_S) / (nAlts + 1); + qp0 = q_S + iAlt * (delqp); + delqp = min_altRe * delqp; + fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_S / delqp - 1); + ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); + delq = qp0 - q_S; + + // Q value at this point: + qp2 = q_S + ft * delq; + + r_theta = qp_to_r_theta(qp2, Lshells(iLat)); + bAlts(iLat, iAlt) = r_theta.first; + bLats(iLat, iAlt) = r_theta.second; + } + } + + report.exit(function); + return std::make_tuple(bLats, bAlts); +} + + // ---------------------------------------------------------------------- // Initialize the dipole grid. // - inputs (min_apex, min_alt, LatStretch, FieldLineStretch, max_lat_dipole) @@ -42,7 +188,9 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { - std::string function = "Grid::init_dipole_grid"; + using namespace std; + + string function = "Grid::init_dipole_grid"; static int iFunction = -1; report.enter(function, iFunction); @@ -62,37 +210,40 @@ void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Number of ghost cells: int64_t nGCs = get_nGCs(); - // Get inputs - report.print(3, "Setting inputs in dipole grid"); - precision_t min_apex = grid_input.min_apex * cKMtoM; + // Get inputs: precision_t min_alt = grid_input.alt_min * cKMtoM; precision_t LatStretch = grid_input.LatStretch; precision_t Gamma = grid_input.FieldLineStretch; - precision_t max_lat = grid_input.max_lat_dipole; + precision_t min_apex = grid_input.min_apex * cKMtoM; + precision_t max_lat = grid_input.max_blat; - // Normalize to planet radius... + // Normalize inputs to planet radius... precision_t planetRadius = planet.get_radius(0.0); - // L-Shell of minimum field line, normalized to planet radius - precision_t min_lshell = (min_apex + planetRadius) / planetRadius; // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; + if (LatStretch /= 1.0) + report.error("LatStretch values =/= 1 are not yet supported!"); + if (nAlts % 2 != 0) + report.exit("nAlts must be even!"); + // Get some coordinates and sizes in normalized coordinates: - arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); - arma_vec size_right_norm = quadtree_ion.get_vect("SR"); - arma_vec size_up_norm = quadtree_ion.get_vect("SU"); + arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin + arma_vec size_right_norm = quadtree_ion.get_vect("SR"); // lon_lims + arma_vec size_up_norm = quadtree_ion.get_vect("SU"); //[1] = lat_lims + report.print(3, "longitudes"); - // LONGITUDES: - // - Make a 1d vector - // - copy it into the 3d cube precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); + // if we are not doing anything in the lon direction, then set dlon to + // something reasonable: + if (!HasXdim) + dlon = 1.0 * cDtoR; - // Quick 1D check for longitudes: - // Same as geo_grid here... - if (!HasXdim) dlon = 1.0 * cDtoR; - + // Longitudes: + // - Make a 1d vector + // - copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; @@ -101,134 +252,41 @@ void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) for (iAlt = 0; iAlt < nAlts; iAlt++) magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; } + report.print(3, "longitudes point two"); - geoLon_scgc = magLon_scgc; - - // LATITUDES: - - // min_latitude calculated from min_lshell (min_apex input) - precision_t min_lat = get_lat_from_r_and_lshell(1.0, min_lshell); + // Latitudes: - // Lay down baseLat spacing according to an exponential factor. - // some intermediates: - precision_t del_lat, blat_min_, blat_max_, tmp_lat; - // Integers for field-line loops: - // - nF=nLats/2 (so nLats MUST be even) - // - nZ=nAlts*2 - (we fill up HALF field lines) - // - nZby2 = nAlts - // -> Plus, experinemtal support for altitude ghost cells... - int64_t nF = (nLats) / 2 , nZ = (nAlts) * 2, nZby2 = (nAlts); - // lShells and baseLats are currently set for southern hemisphere then mirrored - arma_vec Lshells(nF), baseLats(nF); + precision_t min_lat = acos(sqrt(1 / min_alt_re)); - blat_min_ = cos(pow(min_lat, 1.0 / LatStretch)); - blat_max_ = cos(pow(max_lat, 1.0 / LatStretch)); - del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); + // latitude of field line base: + // todo: needs support for variable stretching. it's like, halfway there. + arma_vec baseLats = baselat_spacing(size_up_norm[1], lower_left_norm[1], + max_lat, min_lat, nLats, 1.0); - // now make sure the user used 1 or an even number for nLats - if (nLats % 2 != 0) - { - if (!HasYdim) - { - del_lat = 1.0 * cDtoR; - report.print(0, "Running in single latitude dimension. Experinental!!"); - nF = 1; - } - else - report.error("Cannot use odd nLats with dipole grid!"); - } - - // loop over all cells - everything including the ghost cells - // -> This means some points will go over the pole (baseLat > +- 90 degrees) - // They're taken care of in the conversion to geographic coordinates. - for (int i = 0; i < nF; i++) - { - // first put down "linear" spacing - tmp_lat = blat_min_ + del_lat * (i - nGCs + 0.5); - // then scale it according to the exponent & acos - tmp_lat = pow(acos(tmp_lat), LatStretch); - // place values in array backwards, South pole -> equator. - baseLats(nF - i - 1) = -tmp_lat; - } - report.print(3, "Done setting base latitudes for dipole grid."); - - // Find L-Shell for each baseLat - // using L=R/sin2(theta), where theta is from north pole - for (int i = 0; i < nF; i++) - Lshells(i) = (min_alt_re) / pow(sin(cPI / 2 - baseLats(i)), 2.0); - - // SPACING ALONG FIELD LINE // - // Coordinates along the field line to begin modeling - // - In dipole (p,q) coordinates - // - North & south hemisphere base - precision_t q_S, q_N; - // constant stride, scaled later - precision_t delqp; - - // allocate & calculate some things outside of the main loop - // - mistly just factors to make the code easier to read - precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3, new_r; - // exp_q_dist is the fraction of total q distance to step for each pt along field line - arma_vec exp_q_dist(nZ), q_vals(nZ); - // stored mag. coords temporarily in bAlts and bLats. - arma_mat bAlts(nF, nZ), bLats(nF, nZ); - - // temp holding of results from q,p -> r,theta conversion: - std::pair r_theta; - - for (int i = 0; i < nAlts; i++) - exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); - - for (int i_nF = 0; i_nF < nF; i_nF++) - { - // min/max q - q_S = -cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); - q_N = -q_S; - - // calculate const. stride similar to sami2/3 (huba & joyce 2000) - // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // inlo loop thru southern hemisphere, mirror in north. - for (int i_nZ = 0; i_nZ < nAlts; i_nZ++) - { - // This won't work for offset dipoles. - // Doesn't have any lat/lon dependence. - delqp = (q_N - q_S) / (nZ + 1); - qp0 = q_S + i_nZ * (delqp); - delqp = min_alt_re * delqp; - fb0 = (1 - exp_q_dist(i_nZ)) / exp(-q_S / delqp - 1); - ft = exp_q_dist(i_nZ) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); - delq = qp0 - q_S; - - // Q value at this point: - qp2 = q_S + ft * delq; - - r_theta = qp_to_r_theta(qp2, Lshells(i_nF)); - bAlts(i_nF, i_nZ) = r_theta.first; - bLats(i_nF, i_nZ) = r_theta.second; - } - } - report.print(3, "Done generating q-spacing for dipole grid."); + report.print(3, "baselates done!"); + // Fill field lines! + arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); + std::tie(bLats, bAlts) = fill_field_lines(baseLats, nAlts, min_alt_re, Gamma); + arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); arma_cube r3d(nLons, nLats, nAlts); // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (iLat = 0; iLat < nLats / 2; iLat++) + for (int64_t iLat = 0; iLat < nLats / 2; iLat++) { - for (iLon = 0; iLon < nLons; iLon++) + for (int64_t iLon = 0; iLon < nLons; iLon++) { // Not currently used. Dipole isn't offset. Leaving just in case. // Lon = magPhi_scgc(iLon, iLat, 1); - for (iAlt = 0; iAlt < nAlts; iAlt++) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } r3d.tube(iLon, iLat) = rNorm1d * planetRadius; - r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; - magLat_scgc.tube(iLon, iLat) = lat1dAlong; magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; } } @@ -274,7 +332,7 @@ void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(4, "Done gravity calculations for the dipole grid."); - std::vector llr, xyz, xyzRot1, xyzRot2; + vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(magLon_scgc); llr.push_back(magLat_scgc); llr.push_back(r3d); diff --git a/src/inputs.cpp b/src/inputs.cpp index 15ea40d8..5206967f 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -495,19 +495,18 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) grid_specs.lon_max = min_max[1] * cDtoR; grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); - // The rest of the settings are different for mag/geo grids, // First take the magnetic options, then "else" should be (cube-)sphere - if (grid_specs.shape == "dipole") + if (grid_specs.shape.find("dipole") != std::string::npos) { - // min_apex MUST be more than min_alt: + // Latitude range (base of field line) is specified with max lat & min apex. + grid_specs.max_blat = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); if (grid_specs.min_apex <= grid_specs.alt_min) - { - report.error("Error in Inputs! min_apex must be more than min_alt!"); + { // min_apex MUST be more than min_alt: + report.exit("Dipole grid min_apex must be more than min_alt!"); } grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); - grid_specs.max_lat_dipole = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.FieldLineStretch = check_settings_pt(gridtype, "LineSpacing"); } else diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 317b8f10..be515e9c 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -18,6 +18,8 @@ int64_t iProcQuery = -1; Quadtree::Quadtree(std::string shape) { if (shape == "cubesphere") nRootNodes = 6; + if (shape == "dipole2") + nRootNodes = 2; else nRootNodes = 1; } @@ -60,6 +62,12 @@ void Quadtree::build(std::string gridtype) { ups = Dipole::UPS; IsSphere = true; } + if (grid_input.shape == "dipole2") { + origins = Dipole2::ORIGINS; + rights = Dipole2::RIGHTS; + ups = Dipole2::UPS; + IsSphere = true; + } arma_vec o(3), r(3), u(3); From 3d9472a975cc673360888d3d6da18c16ce71a6c5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 16 Oct 2024 18:29:43 -0400 Subject: [PATCH 217/691] [bug]: init_dipole_grid's errors are now handled correctly. rearrange where inputs are checked too. --- include/grid.h | 3 +-- include/init_mag_grid.h | 2 +- src/init_mag_grid.cpp | 19 ++++++++++++++----- src/inputs.cpp | 4 ---- src/main/main.cpp | 9 +++++---- 5 files changed, 21 insertions(+), 16 deletions(-) diff --git a/include/grid.h b/include/grid.h index af2a761d..534ef2c5 100644 --- a/include/grid.h +++ b/include/grid.h @@ -211,8 +211,7 @@ class Grid precision_t XyzGeo[3]); - void init_dipole_grid(Quadtree quadtree_ion, Planets planet); - arma_vec rNorm1d, lat1dalong; + bool init_dipole_grid(Quadtree quadtree_ion, Planets planet); // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h index 59bf860e..aa230e15 100644 --- a/include/init_mag_grid.h +++ b/include/init_mag_grid.h @@ -9,7 +9,7 @@ #include "planets.h" #include "grid.h" -bool init_mag_grid(Grid &mGrid, Planets planet); +bool init_dipole_grid(Grid &mGrid, Planets planet); // Take limits & specs of field line, fill it with points. diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 0744fdcc..436e4744 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -185,10 +185,12 @@ std:: tuple fill_field_lines(arma_vec baseLats, // are read from input files. And, of course, the numbers of each coordinate // - nLats must be even!! // ---------------------------------------------------------------------- -void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) +bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { using namespace std; + bool DidWork = true; + string function = "Grid::init_dipole_grid"; static int iFunction = -1; @@ -222,10 +224,17 @@ void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; - if (LatStretch /= 1.0) + if (LatStretch != 1){ report.error("LatStretch values =/= 1 are not yet supported!"); - if (nAlts % 2 != 0) - report.exit("nAlts must be even!"); + DidWork=false;} + + if (nAlts % 2 != 0){ + report.error("nAlts must be even!"); + DidWork=false;} + + if (min_alt >= min_apex){ + report.error("min_apex must be more than min_alt"); + DidWork=false;} // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin @@ -361,5 +370,5 @@ void Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(4, "Done filling dipole grid with b-field!"); report.exit(function); - return; + return DidWork; } diff --git a/src/inputs.cpp b/src/inputs.cpp index 5206967f..24af7a47 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -502,10 +502,6 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) // Latitude range (base of field line) is specified with max lat & min apex. grid_specs.max_blat = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); - if (grid_specs.min_apex <= grid_specs.alt_min) - { // min_apex MUST be more than min_alt: - report.exit("Dipole grid min_apex must be more than min_alt!"); - } grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); grid_specs.FieldLineStretch = check_settings_pt(gridtype, "LineSpacing"); } diff --git a/src/main/main.cpp b/src/main/main.cpp index 86adcd45..7bb8a8bf 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -98,10 +98,11 @@ int main() { Grid mGrid("ionGrid"); if (mGrid.iGridShape_ == mGrid.iDipole_) { - mGrid.set_IsDipole(true); - mGrid.init_dipole_grid(quadtree_ion, planet); - mGrid.set_IsGeoGrid(false); - } else { + didWork = mGrid.init_dipole_grid(quadtree_ion, planet); + if (!didWork) + throw std::string("init_dipole_grid failed!"); + } + else { std::cout << "Making Spherical Magnetic Grid\n"; mGrid.set_IsDipole(false); didWork = mGrid.init_geo_grid(quadtree, planet); From 40dd52d306dc68037fdd07830ec91a6e6135466d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 16 Oct 2024 18:31:18 -0400 Subject: [PATCH 218/691] [bug]: Update default input files to use 1 for baselat exponent --- share/run/UA/inputs/defaults.json | 2 +- share/run/aether.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 27a0d1c3..37f74488 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -89,7 +89,7 @@ "MaxAlt" : 5000.0, "LatMax":88.0, "LineSpacing":0.2, - "LatStretch":6.0, + "LatStretch":1.0, "dAltkm" : 5.0, "dAltScale" : 0.25, "IsUniformAlt" : true, diff --git a/share/run/aether.json b/share/run/aether.json index 261bbc36..4d19e93d 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -27,7 +27,7 @@ "ionGrid": { "dAltScale": 0.2, - "LatStretch": 6, + "LatStretch": 1, "Shape": "dipole", "nLatsPerBlock" : 22, "nAlts":159, From 99612f3f01ae3e48666044fe546f519c857fa42e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 29 Oct 2024 20:52:16 -0400 Subject: [PATCH 219/691] FEAT: flag to turn on and off part implicit neutral friction --- include/inputs.h | 4 +--- src/inputs.cpp | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 383634c6..05c6466e 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -156,9 +156,6 @@ class Inputs { \param iOutput int specifying which output file type to report on **/ std::string get_type_output(int iOutput); - - - /********************************************************************** \brief returns settings["Euv"]["dt"] @@ -488,6 +485,7 @@ class Inputs { **/ std::string get_advection_neutrals_vertical(); bool get_advection_neutrals_bulkwinds(); + bool get_advection_neutrals_implicitfriction(); /********************************************************************** diff --git a/src/inputs.cpp b/src/inputs.cpp index 3a0e78cf..ecb4bbaf 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -1283,6 +1283,9 @@ bool Inputs::get_advection_neutrals_bulkwinds() { return get_setting_bool("Advection", "Neutrals", "useBulkWinds"); } +bool Inputs::get_advection_neutrals_implicitfriction() { + return get_setting_bool("Advection", "Neutrals", "useImplicitFriction"); +} // -------------------------------------------------------------------------- // check to see if class is ok From 7e35b246ac5e9afdd8c6d93a5bf84971a47af975 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Oct 2024 09:14:29 -0400 Subject: [PATCH 220/691] FEAT: include two ways of computing neutral friction --- include/neutrals.h | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index a7ef5e79..1e2368c0 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -518,7 +518,6 @@ class Neutrals { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - void solver_vertical_rusanov(Grid grid, Times time); @@ -527,16 +526,28 @@ class Neutrals { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - bool advect_vertical(Grid grid, Times time); + /********************************************************************** + \brief Calculate the neutral friction in one cell using an implicit solver + \param iLong the longitude index + \param iLat the lat index + \param iAlt the altitude index + \param dt time step + \param vels updated velocity, which acts as a source term for the implicit solve + **/ arma_vec calc_friction_one_cell(int64_t iLong, int64_t iLat, int64_t iAlt, precision_t dt, arma_vec &vels); - arma_vec calc_friction_one_cell_v2(int64_t iLon, int64_t iLat, int64_t iAlt, - arma_vec &vels); + /********************************************************************** + \brief Calculate the neutral friction in all cells (calls one_cell above) + \param dt time step + **/ + void calc_neutral_friction_implicit(precision_t dt); - void calc_neutral_friction(precision_t dt); + /********************************************************************** + \brief Calculate the neutral friction coefficients for semi-implicit solver + **/ void calc_neutral_friction_coefs(); }; From d9a23c8e2c99e991ff12343e1edcd0e2fbaa2a4d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Oct 2024 09:15:04 -0400 Subject: [PATCH 221/691] FEAT: include two ways of computing neutral friction --- src/neutrals_momentum_friction.cpp | 132 ++++++----------------------- src/solver_vertical_rusanov.cpp | 4 +- 2 files changed, 27 insertions(+), 109 deletions(-) diff --git a/src/neutrals_momentum_friction.cpp b/src/neutrals_momentum_friction.cpp index 1b432f48..e211ed01 100644 --- a/src/neutrals_momentum_friction.cpp +++ b/src/neutrals_momentum_friction.cpp @@ -4,60 +4,14 @@ #include "aether.h" // --------------------------------------------------------------------- -// This calculates the acceleration due to neutral-neutral -// friction between species. -// dt was removed, since we can assume that it is 1.0 and then -// multiply by dt later. +// This calculates the velocities in one cell. The inputs are the +// updated velocities given all of the acceleration terms. This is the right +// side of the equation (source terms * dt + Vold). The velocities +// of all species are solved for together, since they are interdependent. +// This is done with a matrix inversion, and is the cell-by-cell +// implicit solver. There is a semi-implicit solver below. // --------------------------------------------------------------------- -arma_vec Neutrals::calc_friction_one_cell_v2(int64_t iLon, int64_t iLat, int64_t iAlt, - arma_vec &vels) { - std::string function = "neutral_friction_one_cell_v2"; - static int iFunction = -1; - report.enter(function, iFunction); - precision_t ktom, temp_dij; - int64_t iSpecies, jSpecies, iSpecies_, jSpecies_; - - arma_vec acc(nSpeciesAdvect); - - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - - Neutrals::species_chars & advected_neutral = species[iSpecies_]; - - // ktom = boltzmann's constant * temperature / mass - ktom = - cKB * - temperature_scgc(iLon, iLat, iAlt) / - advected_neutral.mass; - - for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { - jSpecies_ = species_to_advect[jSpecies]; - - if (iSpecies_ == jSpecies_) - continue; - temp_dij = - 1e-4 * advected_neutral.diff0[jSpecies_] * - pow(temperature_scgc(iLon, iLat, iAlt), - advected_neutral.diff_exp[jSpecies_]) / - (density_scgc(iLon, iLat, iAlt)); - acc[iSpecies] = acc[iSpecies] + temp_dij * (vels[jSpecies] - vels[iSpecies]); - } - acc[iSpecies] = acc[iSpecies] * ktom; - - } - - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - if (iAlt == 2) std::cout << "acc : " << species[iSpecies_].cName << " " << acc(iSpecies) << " old " << vels(iSpecies) << "\n"; - } - - - report.exit(function); - return acc; -} - - arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, precision_t dt, arma_vec &vels) { std::string function = "neutral_friction_one_cell"; @@ -88,56 +42,38 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA // temp_dij holds the dij binary coefficients based upon the formulation by Banks and Kokarts. // These coefficients demand that: - // (1) density be in cm^-3 (hence the 1.0e-06) factor below - // (2) Additionally, the Dij's are in cm^2/s, thus the 1.0e-04 factor - //if (iAlt == 2) - // std::cout << "diff0 : " << iSpecies_ << " " << jSpecies_ << " " << advected_neutral.diff0[jSpecies_] << " " << advected_neutral.diff_exp[jSpecies_] << "\n"; + // It is not clear where the 1000 comes from. Need to figure this out. temp_dij = advected_neutral.diff0[jSpecies_] * pow(temperature_scgc(iLon, iLat, iAlt), advected_neutral.diff_exp[jSpecies_]) * 1000.0; - //1e-4 * advected_neutral.diff0[jSpecies_] * - //pow(temperature_scgc(iLon, iLat, iAlt), - // advected_neutral.diff_exp[jSpecies_]) / - //(density_scgc(iLon, iLat, iAlt) * 1e-6); - coefmatrix(iSpecies, jSpecies) = ktom * species[jSpecies_].density_scgc(iLon, iLat, iAlt) / temp_dij; - //(temp_dij * density_scgc(iLon, iLat, iAlt)); } // jSpec loop } // iSpec loop matrix = -1 * coefmatrix * dt; - // Fill in diagonal of matrix: for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) matrix(iSpecies, iSpecies) = 1 - sum(coefmatrix.row(iSpecies)); // initialize array of each neutral species' accelerations at (iLon, iLat, iAlt): arma_vec accs(nSpeciesAdvect, fill::zeros); - // Solve system of equations: - //arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); - arma_vec new_vels = arma::solve(matrix, vels); + arma_vec new_vels = arma::solve(matrix, vels, solve_opts::fast); - // put the new values into the velocity cubes: - //for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) - // accs(iSpecies) = new_vels(iSpecies) - vels(iSpecies); -/* - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - if (iAlt == 2) std::cout << "vels : " << species[iSpecies_].cName << " " << new_vels(iSpecies) << " old " << vels(iSpecies) << "\n"; - } - */ report.exit(function); return new_vels; } // --------------------------------------------------------------------- -// +// This solves for the velocities using a fully implicit solver, where +// all of the velocities are solved for at the same time. This is slower +// since there needs to be a full matrix solve in each cell, but it ties +// the velocities together. // --------------------------------------------------------------------- - -void Neutrals::calc_neutral_friction(precision_t dt) { + +void Neutrals::calc_neutral_friction_implicit(precision_t dt) { std::string function = "calc_neutral_friction"; static int iFunction = -1; @@ -164,37 +100,14 @@ void Neutrals::calc_neutral_friction(precision_t dt) { int64_t nYs = temperature_scgc.n_cols; int64_t nZs = temperature_scgc.n_slices; int64_t nGCs = 2; -/* - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - // ktom = boltzmann's constant * temperature / mass - ktom = - cKB * - temperature_scgc / - species[iSpecies_].mass; - for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { - jSpecies_ = species_to_advect[jSpecies]; - if (iSpecies_ == jSpecies_) - continue; - tpower = pow(temperature_scgc, species[iSpecies_].diff_exp[jSpecies_]); - // NEED TO REMOVE /100!!! - coef = ktom % species[jSpecies_].density_scgc / - (species[iSpecies_].diff0[jSpecies_] * tpower) / 100.0; - species[iSpecies_].neutral_friction_coef = - species[iSpecies_].neutral_friction_coef + coef; - iDir = 2; - species[iSpecies_].acc_neutral_friction[iDir] = - species[iSpecies_].acc_neutral_friction[iDir] + - coef % species[iSpecies_].velocity_vcgc[iDir]; - } - } -*/ + // Calculate friction terms for only species that advect. // - If only 1 species is advected, then it will have no friction if (nSpeciesAdvect > 1) { - for (iAlt = 0; iAlt < nZs; iAlt++) { + for (iAlt = nGCs; iAlt < nZs - nGCs; iAlt++) { for (iLat = nGCs; iLat < nYs - nGCs; iLat++) { for (iLon = nGCs; iLon < nXs - nGCs; iLon++) { + // Only worry about the vertical direction for now: iDir = 2; //for (iDir = 0; iDir < 3; iDir++) { vels.zeros(); @@ -213,8 +126,6 @@ void Neutrals::calc_neutral_friction(precision_t dt) { for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { iSpecies_ = species_to_advect[iSpecies]; species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); - //species[iSpecies_].acc_neutral_friction[iDir](iLon, iLat, iAlt) = - // acc(iSpecies); } // iSpeciesAdvect //} // for direction } // for long @@ -230,7 +141,14 @@ void Neutrals::calc_neutral_friction(precision_t dt) { // --------------------------------------------------------------------- -// +// If we are solving this system semi-implicitly, we don't need to do a +// matrix solve in each cell, so we can calculate all of the variables +// before doing the time-stepping in the vertical solver. +// semi-implicit means using the current velocity on both the left and +// right sides of the equation, but using the old velocities for the +// other species. This means that the velocities are not consistent +// in any time-step unless they are close to steady-state, but they will +// move together. // --------------------------------------------------------------------- void Neutrals::calc_neutral_friction_coefs() { diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index ebf5db75..4343f49a 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -282,7 +282,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, // calculate vertical momentum due to eddy diffusion: vertical_momentum_eddy(grid); - bool useImplicitFriction = true; + bool useImplicitFriction = input.get_advection_neutrals_implicitfriction(); if (useImplicitFriction) { calc_neutral_friction_coefs(); @@ -338,7 +338,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } if (!useImplicitFriction) - calc_neutral_friction(dt); + calc_neutral_friction_implicit(dt); newTemperature_scgc = temperature_scgc From 9acb3779b9d95edbc57e50cfe04ce169f5660906 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Oct 2024 09:15:38 -0400 Subject: [PATCH 222/691] FEAT: include two ways of computing neutral friction --- share/run/UA/inputs/defaults.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 3c9afecc..add88047 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -24,10 +24,11 @@ "Neutrals" : { "Vertical" : "rusanov", "Horizontal" : "default", - "useBulkWinds" : true}, + "useBulkWinds" : true, + "useImplicitFriction" : true}, "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, + "Along" : "rusanov", + "Across" : "default"} }, "Student" : { "name" : "", From f73489266e3c5facf7fb51c9a419d26ec0d4b873 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Oct 2024 09:17:17 -0400 Subject: [PATCH 223/691] BUG: move closer to MSIS --- share/run/UA/inputs/earth.in | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index a77b5672..1afc7a87 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -28,10 +28,10 @@ BC is a density that is used in the lowest boundary cell if you #NEUTRALS name, mass, vibration, thermal_cond, thermal_exp, advect, BC -O, 16, 5, 5.6e-4, 0.69, 1, 5.0e17 +O, 16, 5, 5.6e-4, 0.69, 1, 7.0e17 N, 14, 5, 5.6e-4, 0.69, 1, 2.5e11 -O2, 32, 7, 3.6e-4, 0.69, 1, 4.0e18 -N2, 28, 7, 3.6e-4, 0.69, 1, 1.7e19 +O2, 32, 7, 3.6e-4, 0.69, 1, 2.0e18 +N2, 28, 7, 3.6e-4, 0.69, 1, 1.0e19 NO, 30, 7, 3.6e-4, 0.69, 1, 5.4e14 He, 4, 5, 5.6e-4, 0.69, 1, 1.5e14 N_2D, 14, 5, 5.6e-4, 0.69, 0, 2.5e9 From 7c6410716c9254319496da2a01f4b82f952bcb4a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:45:37 -0400 Subject: [PATCH 224/691] FEAT: allow neutrals to flow in horizontal direction --- src/advance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index 3d43c14f..29521001 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -95,7 +95,7 @@ bool advance(Planets &planet, neutrals.advect_vertical(gGrid, time); neutrals.exchange_old(gGrid); - //advect(gGrid, time, neutrals); + advect(gGrid, time, neutrals); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); From 322ecbecd28e48cecdb20e5e04a3ebae09243b36 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:48:52 -0400 Subject: [PATCH 225/691] STY: clean up code a bit --- src/aurora.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index 3e7e3a81..60faeb5e 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -144,7 +144,7 @@ void calc_aurora(Grid grid, }; static std::vector> CiArray; - static bool IsFirstTime = 1; + static bool IsFirstTime = true; // ENERGY BINS AND DE (E in eV) static precision_t min = 100; @@ -158,12 +158,11 @@ void calc_aurora(Grid grid, if (!neutrals.auroraInitialized) { // Initialize the aurora using the auroral csv file + report.print(1, "Reading aurora file"); read_aurora(neutrals, ions); } if (IsFirstTime) { - // Initialize the aurora using the auroral csv file - //read_aurora(neutrals, ions); precision_t lnE; @@ -192,8 +191,7 @@ void calc_aurora(Grid grid, CiArray.push_back(Ci); } - - IsFirstTime = 0; + IsFirstTime = false; } if (report.test_verbose(4)) @@ -225,8 +223,7 @@ void calc_aurora(Grid grid, arma_vec diff_energy_flux; bool DoDebug = false; - if (report.test_verbose(4)) - std::cout << "aurora - starting main loop!\n"; + report.print(4, "aurora - starting main loop!"); // loop through each altitude and calculate ionization for (iLon = 0; iLon < nLons ; iLon++) { From 782e4030a0c10e45954883766919b433180ec726 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:49:34 -0400 Subject: [PATCH 226/691] BUG: densities should be initialized to 1 not 0 --- src/calc_neutral_derived.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index ac44d1ca..2af75aa4 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -559,7 +559,7 @@ void Neutrals::calc_chapman(Grid grid) { xp3d = grid.radius_scgc / species[iSpecies].scale_height_scgc; y3d = sqrt(0.5 * xp3d) % abs(grid.cos_sza_scgc); - integral3d.fill(0.0); + integral3d.fill(1.0); iAlt = nAlts - 1; integral3d.slice(iAlt) = species[iSpecies].density_scgc.slice(iAlt) % From 43bf57a56cf3c28d2822c5a040804ef69657d4d4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:50:56 -0400 Subject: [PATCH 227/691] BUG/STY: dont calc gradient terms with small nalts --- src/fill_grid.cpp | 46 +++++++++++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 5cd90393..a83714cf 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -302,7 +302,6 @@ void Grid::calc_gravity(Planets planet) { // ----------------------------------------------------------------------------- void Grid::calc_grid_spacing(Planets planet) { - int64_t iLon, iLat, iAlt; report.print(3, "starting calc_grid_spacing"); @@ -315,8 +314,8 @@ void Grid::calc_grid_spacing(Planets planet) { lon_lat_radius.push_back(geoLon_scgc); lon_lat_radius.push_back(geoLat_scgc); lon_lat_radius.push_back(radius_scgc); - std::vector xyz; + std::vector xyz; xyz = transform_llr_to_xyz_3d(lon_lat_radius); geoX_scgc = xyz[0]; geoY_scgc = xyz[0]; @@ -333,6 +332,8 @@ void Grid::calc_alt_grid_spacing() { int64_t iAlt; + report.print(4, "starting calc_alt_grid_spacing"); + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { dalt_center_scgc.slice(iAlt) = (geoAlt_scgc.slice(iAlt + 1) - geoAlt_scgc.slice(iAlt - 1)) / 2.0; @@ -366,29 +367,32 @@ void Grid::calc_alt_grid_spacing() { arma_mat h1, h2, h3, h4, MeshH1, MeshH2, MeshH3, MeshH4; - for (iAlt = 0; iAlt < nGCs; iAlt++) { - h1 = dalt_lower_scgc.slice(iAlt + 2); - h2 = dalt_lower_scgc.slice(iAlt + 3); - h3 = dalt_lower_scgc.slice(iAlt + 4); - h4 = dalt_lower_scgc.slice(iAlt + 5); - MeshH1 = h1; - MeshH2 = h1 + h2; - MeshH3 = h1 + h2 + h3; - MeshH4 = h1 + h2 + h3 + h4; - MeshCoef1s3rdp1.slice(iAlt) = + if (HasZdim & nAlts > nGCs + 5) { + for (iAlt = 0; iAlt < nGCs; iAlt++) { + h1 = dalt_lower_scgc.slice(iAlt + 2); + h2 = dalt_lower_scgc.slice(iAlt + 3); + h3 = dalt_lower_scgc.slice(iAlt + 4); + h4 = dalt_lower_scgc.slice(iAlt + 5); + MeshH1 = h1; + MeshH2 = h1 + h2; + MeshH3 = h1 + h2 + h3; + MeshH4 = h1 + h2 + h3 + h4; + MeshCoef1s3rdp1.slice(iAlt) = -1.0*( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3)/ (MeshH1 % MeshH2 % MeshH3 % MeshH4); - MeshCoef1s3rdp2.slice(iAlt) = + MeshCoef1s3rdp2.slice(iAlt) = 1.0*( MeshH2 % MeshH3 % MeshH4)/(h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); - MeshCoef1s3rdp3.slice(iAlt) = + MeshCoef1s3rdp3.slice(iAlt) = -1.0*( MeshH1 % MeshH3 % MeshH4)/(MeshH2 % h2 % h3 % (h3+h4)); - MeshCoef1s3rdp4.slice(iAlt) = + MeshCoef1s3rdp4.slice(iAlt) = 1.0*( MeshH1 % MeshH2 % MeshH4)/(MeshH3 % (h3+h2) % h3 % h4); - MeshCoef1s3rdp5.slice(iAlt) = + MeshCoef1s3rdp5.slice(iAlt) = -1.0*( MeshH1 % MeshH2 % MeshH3)/(MeshH4 % (h2+h3+h4) % (h3+h4) % h4); + } } - + report.print(4, "ending calc_alt_grid_spacing"); + return; } // --------------------------------------- @@ -399,6 +403,8 @@ void Grid::calc_lat_grid_spacing() { int64_t iLat; + report.print(4, "starting calc_lat_grid_spacing"); + for (iLat = 1; iLat < nLats - 1; iLat++) { dlat_center_scgc.col(iLat) = (geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat - 1)) / 2.0; @@ -415,6 +421,7 @@ void Grid::calc_lat_grid_spacing() { // Make this into a distance: dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; + report.print(4, "ending calc_lat_grid_spacing"); } // --------------------------------------- @@ -425,6 +432,8 @@ void Grid::calc_long_grid_spacing() { int64_t iLon; + report.print(4, "starting calc_long_grid_spacing"); + for (iLon = 1; iLon < nLons - 1; iLon++) dlon_center_scgc.row(iLon) = (geoLon_scgc.row(iLon + 1) - geoLon_scgc.row(iLon - 1)) / 2.0; @@ -441,6 +450,9 @@ void Grid::calc_long_grid_spacing() { // Make this into a distance: dlon_center_dist_scgc = dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); + + report.print(4, "ending calc_long_grid_spacing"); + } // ----------------------------------------------------------------------------- From e1a96ac392c75fd667300204ad17c8c56617c6cd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:51:32 -0400 Subject: [PATCH 228/691] BUG: dont report error for perturb or satellites --- src/inputs.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index ecb4bbaf..2b9ba1bd 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -157,8 +157,7 @@ bool Inputs::check_settings(std::string key1) isOk = false; // perturb is non-essential, otherwise print error message - if (!isOk && key1 != "Perturb") - { + if (!isOk && key1 != "Perturb") { report.error("Error in setting : " + key1); std::cout << "Missing setting called! [" << key1 << "]\n"; } @@ -400,10 +399,11 @@ json Inputs::get_setting_json(std::string key1) if (settings.find(key1) != settings.end()) value = settings.at(key1); - else - { - isOk = false; - report.error("Error in setting : " + key1); + else { + if (key1 != "Perturb") { + isOk = false; + report.error("Error in setting : " + key1); + } } return value; @@ -427,8 +427,10 @@ json Inputs::get_setting_json(std::string key1, } else { - isOk = false; - report.error("Error in setting : " + key1); + if (key1 != "Satellites") { + isOk = false; + report.error("Error in setting : " + key1); + } } return value; From 6df42d16cf1ef8809fdd6dd3ec2d421aa972ae3e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 09:52:17 -0400 Subject: [PATCH 229/691] BUG: initialize variable better --- src/neutrals.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index c9ceda5e..44706375 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -26,31 +26,42 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.lower_bc_density = -1.0; tmp.density_scgc.set_size(nLons, nLats, nAlts); + tmp.density_scgc.ones(); tmp.newDensity_scgc.set_size(nLons, nLats, nAlts); + tmp.newDensity_scgc.ones(); tmp.velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.newVelocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int iDir = 0; iDir < 3; iDir++) { tmp.velocity_vcgc[iDir].zeros(); tmp.newVelocity_vcgc[iDir].zeros(); } tmp.chapman_scgc.set_size(nLons, nLats, nAlts); + tmp.chapman_scgc.ones(); tmp.scale_height_scgc.set_size(nLons, nLats, nAlts); + tmp.scale_height_scgc.ones(); + tmp.ionization_scgc.set_size(nLons, nLats, nAlts); + tmp.ionization_scgc.zeros(); tmp.acc_neutral_friction = make_cube_vector(nLons, nLats, nAlts, 3); - tmp.neutral_friction_coef.set_size(nLons, nLats, nAlts); tmp.acc_ion_drag = make_cube_vector(nLons, nLats, nAlts, 3); + for (int iDir = 0; iDir < 3; iDir++) { + tmp.acc_neutral_friction[iDir].zeros(); + tmp.acc_ion_drag[iDir].zeros(); + } + tmp.acc_eddy.set_size(nLons, nLats, nAlts); - tmp.ionization_scgc.zeros(); + tmp.acc_eddy.zeros(); + tmp.neutral_friction_coef.set_size(nLons, nLats, nAlts); + tmp.neutral_friction_coef.zeros(); tmp.concentration_scgc.set_size(nLons, nLats, nAlts); + tmp.concentration_scgc.zeros(); tmp.mass_concentration_scgc.set_size(nLons, nLats, nAlts); + tmp.mass_concentration_scgc.zeros(); - tmp.density_scgc.ones(); - tmp.chapman_scgc.ones(); - tmp.scale_height_scgc.ones(); + tmp.rho_alt_int_scgc.set_size(nLons, nLats, nAlts); tmp.rho_alt_int_scgc.zeros(); tmp.sources_scgc.set_size(nLons, nLats, nAlts); @@ -59,7 +70,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.losses_scgc.zeros(); tmp.nAuroraIonSpecies = 0; - tmp.Aurora_Coef = -1.0; + tmp.Aurora_Coef = 0.0; return tmp; } From 39d64e82f16b8ba3f3d438ab2d52ce1d2b353a7b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 10:17:08 -0400 Subject: [PATCH 230/691] STY: move initialize + verbose output --- src/electrodynamics.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 5b930da4..6caa0a5b 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -148,17 +148,17 @@ bool Electrodynamics::update(Planets planet, static int iFunction = -1; report.enter(function, iFunction); + // Default is to set everything to zero: + ions.potential_scgc.zeros(); + ions.eflux.zeros(); + ions.avee.ones(); + if (HaveElectrodynamicsFile || HaveFortranIe) { set_time(time.get_current()); gGrid.calc_sza(planet, time); gGrid.calc_gse(planet, time); gGrid.calc_mlt(); - // Default is to set everything to zero: - ions.potential_scgc.zeros(); - ions.eflux.zeros(); - ions.avee.ones(); - #ifdef FORTRAN if (HaveFortranIe) { @@ -181,9 +181,7 @@ bool Electrodynamics::update(Planets planet, int64_t nZs = gGrid.get_nZ(); int64_t iZ; - int iError; - for (iZ = 0; iZ < nZs; iZ++) { copy_mat_to_array(gGrid.magLocalTime_scgc.slice(iZ), mlt2d, true); copy_mat_to_array(gGrid.magLat_scgc.slice(iZ), lat2d, true); @@ -199,6 +197,10 @@ bool Electrodynamics::update(Planets planet, ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); copy_array_to_mat(avee2d, ions.avee, true); copy_array_to_mat(eflux2d, ions.eflux, true); + if (report.test_verbose(3)) { + std::cout << "I have eflux2d: " << ions.eflux << "\n"; + std::cout << "I have potential: " << ions.potential_scgc.slice(iZ) << "\n"; + } } } } From f9ef245a4b66bc8a1d186b9cfde6354559f729fd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 10:17:55 -0400 Subject: [PATCH 231/691] STY: verbose stuff --- src/aurora.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index 60faeb5e..dc93324b 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -194,8 +194,7 @@ void calc_aurora(Grid grid, IsFirstTime = false; } - if (report.test_verbose(4)) - std::cout << "aurora - done with init!\n"; + report.print(4, "aurora - done with init!"); arma_vec rhoH1d; arma_cube scale_height; From e093fb5c1229ad836b5efbb504b007c78a2e7406 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 10:32:23 -0400 Subject: [PATCH 232/691] BUG: needs to be executable --- tests/2d_alt/run_test.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 tests/2d_alt/run_test.sh diff --git a/tests/2d_alt/run_test.sh b/tests/2d_alt/run_test.sh old mode 100644 new mode 100755 From 5c9a1b66947f340961b44609551346772766c857 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 10:33:03 -0400 Subject: [PATCH 233/691] FEAT: updated to new grids --- tests/2d_alt/aether.json.2d | 59 +++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/tests/2d_alt/aether.json.2d b/tests/2d_alt/aether.json.2d index 282b398d..bd8e19cc 100644 --- a/tests/2d_alt/aether.json.2d +++ b/tests/2d_alt/aether.json.2d @@ -1,17 +1,38 @@ { - "GeoBlockSize" : { - "nLons" : 50, - "nLats" : 50, - "nAlts" : 1}, - - "GeoGrid" : { - "dAlt" : 2.0, - "IsUniformAlt" : true}, + "Ensembles" : { + "nMembers" : 1}, + + "Debug" : { + "iVerbose" : 0, + "iFunctionVerbose" : { + "Grid::create_altitudes": 0, + "Electrodynamics::update":0}, + "TimingPercent" : 1.0, + "dt" : 10.0, + "check_for_nans" : true + }, + + "StartTime" : [2011, 3, 20, 12, 0, 0], + "EndTime" : [2011, 3, 20, 13, 0, 0], + + "neuGrid" : { + "Shape" : "sphere", + "nLatsPerBlock" : 50, + "nLonsPerBlock" : 50, + "nAlts" : 1, + "MinAlt" : 100.0}, + + "ionGrid" : { + "Shape" : "sphere", + "nLatsPerBlock" : 50, + "nLonsPerBlock" : 44, + "nAlts" : 1, + "MinAlt" : 100.0}, "Euv" : { - "doUse" : false}, + "doUse" : true}, "Eddy" : { "UseInEnergy": false, @@ -24,22 +45,10 @@ "NO_cool" : false, "O_cool": false } }, - "Ensembles" : { - "nMembers" : 1}, - - "Debug" : { - "iVerbose" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "dt" : 10.0, - "check_for_nans" : false - }, - - "EndTime" : [2011, 3, 20, 1, 0, 0], - - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta", + "File": "UA/inputs/b20110320n_omni.bin"}, "Outputs" : { "type" : ["states"], From 73f4cdab6f5abb71a3472bc04171ed2f30ca7cc7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:24:24 -0400 Subject: [PATCH 234/691] BUG: need some error messages --- src/electrodynamics.cpp | 55 ++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 6caa0a5b..9b7947b7 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -109,7 +109,10 @@ void Electrodynamics::set_all_indices_for_ie(Times time, float au = indices.get_index(time_now, iAU_); float al = indices.get_index(time_now, iAL_); + if (imfbz < -1e31) report.error("There doesnt seem to be any IMF Bz!"); + if (report.test_verbose(3)) { + std::cout << "time now : " << time_now << "\n"; std::cout << "imf by : " << iBz_ << " " << imfby << "\n"; std::cout << "imf bz : " << iBz_ << " " << imfbz << "\n"; std::cout << "sw v : " << iVx_ << " " << swv << "\n"; @@ -148,6 +151,8 @@ bool Electrodynamics::update(Planets planet, static int iFunction = -1; report.enter(function, iFunction); + bool didWork = true; + // Default is to set everything to zero: ions.potential_scgc.zeros(); ions.eflux.zeros(); @@ -187,20 +192,48 @@ bool Electrodynamics::update(Planets planet, copy_mat_to_array(gGrid.magLat_scgc.slice(iZ), lat2d, true); ie_set_mlts(mlt2d, &iError); - ie_set_lats(lat2d, &iError); - ie_update_grid(&iError); - - ie_get_potential(pot2d, &iError); + if (iError != 0) { + didWork = false; + report.error("Error in ie_set_mlts"); + } + if (didWork) + ie_set_lats(lat2d, &iError); + if (iError != 0) { + didWork = false; + report.error("Error in ie_set_lats"); + } + if (didWork) + ie_update_grid(&iError); + if (iError != 0) { + didWork = false; + report.error("Error in ie_update_grid"); + } + if (didWork) + ie_get_potential(pot2d, &iError); + if (iError != 0) { + didWork = false; + report.error("Error in ie_get_potential"); + std::cout << "ie_get_potential iError : " << iError << "\n"; + } copy_array_to_mat(pot2d, ions.potential_scgc.slice(iZ), true); if (iZ == nZs - 1) { - ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); - copy_array_to_mat(avee2d, ions.avee, true); - copy_array_to_mat(eflux2d, ions.eflux, true); - if (report.test_verbose(3)) { - std::cout << "I have eflux2d: " << ions.eflux << "\n"; - std::cout << "I have potential: " << ions.potential_scgc.slice(iZ) << "\n"; + if (didWork) { + ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); + if (iError != 0) { + didWork = false; + report.error("Error in ie_get_electron_diffuse_aurora"); + std::cout << "ie_get_electron_diffuse_aurora iError : " << iError << "\n"; + } else { + copy_array_to_mat(avee2d, ions.avee, true); + copy_array_to_mat(eflux2d, ions.eflux, true); + if (report.test_verbose(3)) { + std::cout << "I have eflux2d: " << ions.eflux << "\n"; + std::cout << "I have potential: " << ions.potential_scgc.slice(iZ) << "\n"; + } + } } + } } } @@ -219,7 +252,7 @@ bool Electrodynamics::update(Planets planet, } report.exit(function); - return true; + return didWork; } // ----------------------------------------------------------------------------- From fa9132b8e0bdc6cbd320d5d4b044ca38c6f62783 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:25:02 -0400 Subject: [PATCH 235/691] BUG: send warnings if not omniweb file --- src/indices.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/indices.cpp b/src/indices.cpp index 388f42c5..72bee799 100644 --- a/src/indices.cpp +++ b/src/indices.cpp @@ -88,6 +88,8 @@ bool read_and_store_indices(Indices &indices) { // --------------------------------------------------- int nFiles = input.get_number_of_omniweb_files(); + if (report.test_verbose(1)) + std::cout << "Number of OMNIWeb files : " << nFiles << "\n"; if (nFiles > 0) { std::vector omniweb_files = input.get_omniweb_files(); @@ -117,7 +119,15 @@ bool read_and_store_indices(Indices &indices) { } // if } // for iVar } // for iFile - } // if nFiles + } else { + if (report.test_verbose(0)) { + std::cout << "--> WARNING : There were no OMNIWeb files specified!\n"; + std::cout << "--> : If this was not your intent, check the aether.json file\n"; + std::cout << "--> : line needs to be: \n"; + std::cout << "--> : \"OmniwebFiles\": [\"filename\"] \n"; + } + report.error("WARNING : OMNIWeb file not set!!!"); + } report.exit(function); return DidWork; From 3f3813256f1e5382d55b1686b259e5a31177850d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:26:48 -0400 Subject: [PATCH 236/691] BUG: need a default OMNI file --- share/run/UA/inputs/defaults.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index add88047..f353f4fa 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -121,7 +121,7 @@ "AuroraFile" : "UA/inputs/aurora_earth.csv", "IndicesLookupFile" : "UA/inputs/indices_lookup.json", - "OnmiwebFile" : [""], + "OmniwebFile" : ["UA/inputs/omni_20110319.txt"], "Logfile" : { "name" : ["UA/output/log_geo.txt", "UA/output/log_mag.txt"], From 1a17122cb2162cc51ce953759799e4ab9c8da0cf Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:31:02 -0400 Subject: [PATCH 237/691] BUG: get 2d test runs to work also --- tests/2d_alt/aether.json.2d | 14 +++++++++----- tests/2d_alt/run_test.sh | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/2d_alt/aether.json.2d b/tests/2d_alt/aether.json.2d index bd8e19cc..545e9037 100644 --- a/tests/2d_alt/aether.json.2d +++ b/tests/2d_alt/aether.json.2d @@ -8,7 +8,9 @@ "iVerbose" : 0, "iFunctionVerbose" : { "Grid::create_altitudes": 0, - "Electrodynamics::update":0}, + "Electrodynamics::update":0, + "Electrodynamics::set_all_indices_for_ie" : 0, + "read_and_store_indices": 0}, "TimingPercent" : 1.0, "dt" : 10.0, "check_for_nans" : true @@ -19,15 +21,15 @@ "neuGrid" : { "Shape" : "sphere", - "nLatsPerBlock" : 50, - "nLonsPerBlock" : 50, + "nLatsPerBlock" : 36, + "nLonsPerBlock" : 72, "nAlts" : 1, "MinAlt" : 100.0}, "ionGrid" : { "Shape" : "sphere", - "nLatsPerBlock" : 50, - "nLonsPerBlock" : 44, + "nLatsPerBlock" : 36, + "nLonsPerBlock" : 72, "nAlts" : 1, "MinAlt" : 100.0}, @@ -49,6 +51,8 @@ "Potential" : "Weimer05", "DiffuseAurora" : "fta", "File": "UA/inputs/b20110320n_omni.bin"}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], "Outputs" : { "type" : ["states"], diff --git a/tests/2d_alt/run_test.sh b/tests/2d_alt/run_test.sh index 2d625a82..a0f71093 100755 --- a/tests/2d_alt/run_test.sh +++ b/tests/2d_alt/run_test.sh @@ -11,5 +11,5 @@ cp ../aether.json.2d ./aether.json cd UA/output -~/bin/postAether.py -rm -alt=-1 -~/bin/aether_plot.py -var=Temperature -alt=2 3DALL_20110320_010000.nc +~/bin/postAether.py -rm +~/bin/aether_plot.py -var=Temperature_neutral -alt=2 3DALL_20110320_010000.nc From dad02b827703dacef5e1459ee0e447429f064ac1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:44:38 -0400 Subject: [PATCH 238/691] BUG: plotting issue --- tests/2d_alt/run_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/2d_alt/run_test.sh b/tests/2d_alt/run_test.sh index a0f71093..864bd282 100755 --- a/tests/2d_alt/run_test.sh +++ b/tests/2d_alt/run_test.sh @@ -12,4 +12,4 @@ cp ../aether.json.2d ./aether.json cd UA/output ~/bin/postAether.py -rm -~/bin/aether_plot.py -var=Temperature_neutral -alt=2 3DALL_20110320_010000.nc +~/bin/aether_plot_simple.py -var=Temperature_neutral -alt=2 3DALG_20110320_130000.nc From 40306e67efeadd3ae2ef9d948c27ed56ffff3802 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 1 Nov 2024 12:51:35 -0400 Subject: [PATCH 239/691] STY: Astyle, yo --- src/add_sources.cpp | 93 +++---- src/advance.cpp | 14 +- src/calc_chemical_sources.cpp | 2 + src/calc_dt.cpp | 196 +++++++------- src/calc_ion_drift.cpp | 2 +- src/calc_ion_temperature.cpp | 10 +- src/calc_neutral_derived.cpp | 86 +++--- src/dipole.cpp | 9 +- src/electrodynamics.cpp | 14 +- src/exchange_messages.cpp | 10 +- src/fill_grid.cpp | 31 +-- src/grid.cpp | 63 +++-- src/indices.cpp | 5 +- src/init_geo_grid.cpp | 20 +- src/init_mag_grid.cpp | 67 +++-- src/inputs.cpp | 390 ++++++++++------------------ src/ions.cpp | 8 +- src/ions_bcs.cpp | 164 ++++++------ src/neutral_ion_collisions.cpp | 52 ++-- src/neutrals.cpp | 29 ++- src/neutrals_bcs.cpp | 17 +- src/neutrals_energy.cpp | 16 +- src/neutrals_ics.cpp | 12 +- src/neutrals_momentum_friction.cpp | 62 +++-- src/neutrals_momentum_viscosity.cpp | 52 ++-- src/output.cpp | 2 +- src/output_netcdf.cpp | 2 +- src/quadtree.cpp | 6 +- src/solver_advection.cpp | 255 +++++++++--------- src/solver_conduction.cpp | 10 +- src/solver_coriolis.cpp | 4 +- src/solver_gradients.cpp | 7 +- src/solver_vertical_rusanov.cpp | 117 +++++---- src/tools.cpp | 16 +- src/transform.cpp | 78 ++---- 35 files changed, 955 insertions(+), 966 deletions(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index a527a2fd..b9eaf2a9 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -19,62 +19,63 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { precision_t dt = time.get_dt(); heating_sources_total = heating_euv_scgc - + heating_chemical_scgc - + heating_ion_friction_scgc - //+ heating_ion_heat_transfer_scgc - - O_cool_scgc - - NO_cool_scgc; - + + heating_chemical_scgc + + heating_ion_friction_scgc + //+ heating_ion_heat_transfer_scgc + - O_cool_scgc + - NO_cool_scgc; + // Solve the laplace equations using the source terms, // updating the neutral temperature: update_temperature(grid, time); int64_t iDir, iSpec, iSpecies; double tSim = time.get_simulation_time(); - + // Horizontal winds use bulk winds: - if (input.get_use_coriolis()) + if (input.get_use_coriolis()) acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); -/* - // Vertical winds use species winds: - for (iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { - // Pick out the advected neutral species: - species_chars & advected_neutral = species[species_to_advect[iSpec]]; - - iDir = 2; - // update velocities based on acceleration: - // reduce neutral friction until solver is added - advected_neutral.velocity_vcgc[iDir] = - advected_neutral.velocity_vcgc[iDir] + - dt * (ramp * grid.cent_acc_vcgc[iDir] + - ramp * acc_coriolis[iDir] + - advected_neutral.acc_neutral_friction[iDir] / 4.0 + - advected_neutral.acc_ion_drag[iDir] + - advected_neutral.acc_eddy); - } + /* + // Vertical winds use species winds: + for (iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { + // Pick out the advected neutral species: + species_chars & advected_neutral = species[species_to_advect[iSpec]]; - calc_mass_density(); - // Calculate bulk vertical winds: - velocity_vcgc[2].zeros(); - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - if (species[iSpecies].DoAdvect) { - velocity_vcgc[2] = velocity_vcgc[2] + - species[iSpecies].mass * species[iSpecies].density_scgc % - species[iSpecies].velocity_vcgc[2] / rho_scgc; + iDir = 2; + // update velocities based on acceleration: + // reduce neutral friction until solver is added + advected_neutral.velocity_vcgc[iDir] = + advected_neutral.velocity_vcgc[iDir] + + dt * (ramp * grid.cent_acc_vcgc[iDir] + + ramp * acc_coriolis[iDir] + + advected_neutral.acc_neutral_friction[iDir] / 4.0 + + advected_neutral.acc_ion_drag[iDir] + + advected_neutral.acc_eddy); } - - */ + + calc_mass_density(); + // Calculate bulk vertical winds: + velocity_vcgc[2].zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + if (species[iSpecies].DoAdvect) { + velocity_vcgc[2] = velocity_vcgc[2] + + species[iSpecies].mass * species[iSpecies].density_scgc % + species[iSpecies].velocity_vcgc[2] / rho_scgc; + } + + */ // Add Velocity sources to bulk winds: for (iDir = 0; iDir < 2; iDir++) { velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( - grid.cent_acc_vcgc[iDir] + - acc_coriolis[iDir] + - acc_ion_collisions[iDir]); + grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + + acc_ion_collisions[iDir]); acc_sources_total[iDir].zeros(); } + // Apply Viscosity: update_horizontal_velocity(grid, time); @@ -83,17 +84,17 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { for (iDir = 0; iDir < 2; iDir++) species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; - /* + /* // If we only consider the bulk winds in the horizontal direction: if (input.get_advection_neutrals_bulkwinds()) { // Calculate Coriolis: - if (input.get_use_coriolis()) + if (input.get_use_coriolis()) acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); // Add Velocity sources to bulk winds: for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( grid.cent_acc_vcgc[iDir] + - acc_coriolis[iDir] + + acc_coriolis[iDir] + acc_ion_collisions[iDir]); acc_sources_total[iDir].zeros(); } @@ -104,9 +105,9 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { // Pick out the advected neutral species: species_chars & advected_neutral = species[species_to_advect[iSpec]]; // Calculate Coriolis: - if (input.get_use_coriolis()) - acc_coriolis = coriolis(advected_neutral.velocity_vcgc, - planet.get_omega(), + if (input.get_use_coriolis()) + acc_coriolis = coriolis(advected_neutral.velocity_vcgc, + planet.get_omega(), grid.geoLat_scgc); for (int iDir = 0; iDir < 2; iDir++) { @@ -114,8 +115,8 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { // reduce neutral friction until solver is added advected_neutral.velocity_vcgc[iDir] = advected_neutral.velocity_vcgc[iDir] + - dt * (grid.cent_acc_vcgc[iDir] + - acc_coriolis[iDir] + + dt * (grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + advected_neutral.acc_neutral_friction[iDir] / 4.0 + advected_neutral.acc_ion_drag[iDir]); // eddy acceleration is only in the vertical direction: diff --git a/src/advance.cpp b/src/advance.cpp index 29521001..8a9391aa 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -65,7 +65,7 @@ bool advance(Planets &planet, precision_t dtNeutral = calc_dt(gGrid, neutrals.cMax_vcgc); precision_t dtIon = calc_dt(gGrid, ions.cMax_vcgc); time.calc_dt(dtNeutral, dtIon); - + neutralsMag.calc_mass_density(); neutralsMag.calc_mean_major_mass(); neutralsMag.calc_specific_heat(); @@ -85,9 +85,11 @@ bool advance(Planets &planet, neutralsMag.calc_scale_height(mGrid); if (didWork) - didWork = neutrals.set_bcs(gGrid, time, indices); + didWork = neutrals.set_bcs(gGrid, time, indices); + if (didWork) didWork = ions.set_bcs(gGrid, time, indices); + if (didWork) didWork = neutralsMag.set_bcs(mGrid, time, indices); @@ -99,7 +101,7 @@ bool advance(Planets &planet, if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); - + // ------------------------------------ // Calculate source terms next: @@ -111,6 +113,7 @@ bool advance(Planets &planet, neutrals, ions, indices); + if (didWork) didWork = calc_euv(planet, mGrid, @@ -126,6 +129,7 @@ bool advance(Planets &planet, time, indices, ions); + if (didWork) didWork = electrodynamics.update(planet, mGrid, @@ -154,8 +158,10 @@ bool advance(Planets &planet, calc_ion_collisions(neutrals, ions); neutrals.add_sources(time, planet, gGrid); + if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Add Sources"); + neutralsMag.add_sources(time, planet, mGrid); ions.calc_ion_temperature(neutrals, gGrid, time); @@ -180,11 +186,13 @@ bool advance(Planets &planet, if (didWork) didWork = output(neutrals, ions, gGrid, time, planet); + if (didWork) didWork = output(neutralsMag, ionsMag, mGrid, time, planet); if (didWork) didWork = logfile.write_logfile(indices, neutrals, ions, gGrid, time); + if (didWork) didWork = logfileMag.write_logfile(indices, neutralsMag, ionsMag, mGrid, time); diff --git a/src/calc_chemical_sources.cpp b/src/calc_chemical_sources.cpp index 7498c29b..8f9c7464 100644 --- a/src/calc_chemical_sources.cpp +++ b/src/calc_chemical_sources.cpp @@ -123,8 +123,10 @@ void Chemistry::calc_chemical_sources(Neutrals &neutrals, temp = ions.electron_temperature_scgc; else if (piecewiseTemp == "Tn") temp = neutrals.temperature_scgc; + // zero out the rate when it is outside of the temperature bounds: change3d.elem( find(temp < reactions[iReaction].min) ).zeros(); + if (reactions[iReaction].max > 0) change3d.elem( find(temp > reactions[iReaction].max) ).zeros(); } diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index 65411c5d..dc51d5b4 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -10,19 +10,19 @@ precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { - std::string function = "calc_dt"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "calc_dt"; + static int iFunction = -1; + report.enter(function, iFunction); - precision_t dt; + precision_t dt; - if (grid.iGridShape_ == grid.iCubesphere_) - dt = calc_dt_cubesphere(grid, cMax_vcgc); - else - dt = calc_dt_sphere(grid, cMax_vcgc); + if (grid.iGridShape_ == grid.iCubesphere_) + dt = calc_dt_cubesphere(grid, cMax_vcgc); + else + dt = calc_dt_sphere(grid, cMax_vcgc); - report.exit(function); - return dt; + report.exit(function); + return dt; } // -------------------------------------------------------------------------- @@ -31,39 +31,39 @@ precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { - std::string function = "calc_dt_sphere"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "calc_dt_sphere"; + static int iFunction = -1; + report.enter(function, iFunction); - precision_t dt; + precision_t dt; - arma_vec dta(4); - arma_cube dtCube; + arma_vec dta(4); + arma_cube dtCube; - // Longitudinal Direction: - dtCube = grid.dlon_center_dist_scgc / cMax_vcgc[0]; - dta(0) = dtCube.min(); + // Longitudinal Direction: + dtCube = grid.dlon_center_dist_scgc / cMax_vcgc[0]; + dta(0) = dtCube.min(); - // Latitudinal Direction: - dtCube = grid.dlat_center_dist_scgc / cMax_vcgc[1]; - dta(1) = dtCube.min(); + // Latitudinal Direction: + dtCube = grid.dlat_center_dist_scgc / cMax_vcgc[1]; + dta(1) = dtCube.min(); - // Vertical Direction: - dta(2) = calc_dt_vertical(grid, cMax_vcgc); + // Vertical Direction: + dta(2) = calc_dt_vertical(grid, cMax_vcgc); - // Set a minimum dt: - dta(3) = 10.0; + // Set a minimum dt: + dta(3) = 10.0; - dt = dta.min(); + dt = dta.min(); - if (report.test_verbose(3)) - std::cout << "dt (sphere) for neutrals : " << dt << "\n"; + if (report.test_verbose(3)) + std::cout << "dt (sphere) for neutrals : " << dt << "\n"; - if (report.test_verbose(4)) - std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; + if (report.test_verbose(4)) + std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; - report.exit(function); - return dt; + report.exit(function); + return dt; } // -------------------------------------------------------------------------- @@ -72,59 +72,60 @@ precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { - std::string function = "calc_dt_sphere"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t dt; - arma_vec dta(4); - - // Get some dimensions - int64_t nAlts = grid.get_nAlts(); - int64_t nXs = grid.get_nLons(); - int64_t nYs = grid.get_nLats(); - - // dtx dty for reference coordinate system - arma_cube dtx(nXs, nYs, nAlts); - arma_cube dty(nXs, nYs, nAlts); - - // A dummy constant one matrix - arma_mat dummy_1(nXs, nYs, fill::ones); - - // Loop through altitudes - for (int iAlt = 0; iAlt < nAlts; iAlt++) { - // Conver cMax to contravariant velocity first - arma_mat u1 = sqrt( - cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) % - cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) + - cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt) % - cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt)); - arma_mat u2 = sqrt( - cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) % - cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) + - cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt) % - cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt)); - dtx.slice(iAlt) = grid.drefx(iAlt) * dummy_1 / u1; - dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; - } - // Take minimum dts in each direction: - dta(0) = dtx.min(); - dta(1) = dty.min(); - // Vertical Direction: - dta(2) = calc_dt_vertical(grid, cMax_vcgc); - // Set a minimum dt: - dta(3) = 10.0; - // Take the minimum of all directions: - dt = dta.min(); - - if (report.test_verbose(3)) - std::cout << "dt (cubesphere) : " << dt << "\n"; - - if (report.test_verbose(4)) - std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; - - report.exit(function); - return dt; + std::string function = "calc_dt_sphere"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt; + arma_vec dta(4); + + // Get some dimensions + int64_t nAlts = grid.get_nAlts(); + int64_t nXs = grid.get_nLons(); + int64_t nYs = grid.get_nLats(); + + // dtx dty for reference coordinate system + arma_cube dtx(nXs, nYs, nAlts); + arma_cube dty(nXs, nYs, nAlts); + + // A dummy constant one matrix + arma_mat dummy_1(nXs, nYs, fill::ones); + + // Loop through altitudes + for (int iAlt = 0; iAlt < nAlts; iAlt++) { + // Conver cMax to contravariant velocity first + arma_mat u1 = sqrt( + cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) % + cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) + + cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt) % + cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt)); + arma_mat u2 = sqrt( + cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) % + cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) + + cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt) % + cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt)); + dtx.slice(iAlt) = grid.drefx(iAlt) * dummy_1 / u1; + dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; + } + + // Take minimum dts in each direction: + dta(0) = dtx.min(); + dta(1) = dty.min(); + // Vertical Direction: + dta(2) = calc_dt_vertical(grid, cMax_vcgc); + // Set a minimum dt: + dta(3) = 10.0; + // Take the minimum of all directions: + dt = dta.min(); + + if (report.test_verbose(3)) + std::cout << "dt (cubesphere) : " << dt << "\n"; + + if (report.test_verbose(4)) + std::cout << " derived from dt(x, y, z, extra) : " << dta << "\n"; + + report.exit(function); + return dt; } // -------------------------------------------------------------------------- @@ -133,17 +134,18 @@ precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { - std::string function = "calc_dt_vertical"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "calc_dt_vertical"; + static int iFunction = -1; + report.enter(function, iFunction); - precision_t dt; - if (grid.get_nZ(false) > 1) { - arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; - dt = dtz.min(); - } else - dt = 1e32; + precision_t dt; - report.exit(function); - return dt; + if (grid.get_nZ(false) > 1) { + arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; + dt = dtz.min(); + } else + dt = 1e32; + + report.exit(function); + return dt; } diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 76c7d51d..7ff0d708 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -198,7 +198,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, sum_rho = sum_rho + rho; for (int64_t iComp = 0; iComp < 3; iComp++) { - species[iIon].velocity_vcgc[iComp] = + species[iIon].velocity_vcgc[iComp] = species[iIon].perp_velocity_vcgc[iComp] + species[iIon].par_velocity_vcgc[iComp]; velocity_vcgc[iComp] = velocity_vcgc[iComp] + diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 6605b457..9a704269 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -60,12 +60,13 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc/1000.0 - 90.0) * 60.0; + temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 60.0; for (iIon = 0; iIon < nSpecies; iIon++) species[iIon].temperature_scgc = temperature_scgc; - //species[iIon].temperature_scgc = neutrals.temperature_scgc; - + + //species[iIon].temperature_scgc = neutrals.temperature_scgc; + report.exit(function); return; @@ -100,7 +101,8 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, lambda1d, front1d, sources1d, dalt1d, dt, nGCs, true); + conduction1d = solver_conduction(temp1d, lambda1d, front1d, sources1d, dalt1d, + dt, nGCs, true); // The conduction solver gives Tnew-Told, so divide by dt conduction_scgc.tube(iLon, iLat) = conduction1d / dt; diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 2af75aa4..04189bcc 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -17,7 +17,7 @@ void Neutrals::calc_viscosity() { report.enter(function, iFunction); viscosity_scgc = 0.00013 * sqrt(temperature_scgc % - mean_major_mass_scgc / cKB); + mean_major_mass_scgc / cKB); report.exit(function); return; @@ -89,7 +89,7 @@ void Neutrals::calc_concentration() { species[iSpecies].mass_concentration_scgc = species[iSpecies].mass * species[iSpecies].density_scgc / rho_scgc; } - + report.exit(function); return; } @@ -110,7 +110,7 @@ void Neutrals::calc_density_from_mass_concentration() { rho_scgc % species[iSpecies].mass_concentration_scgc / species[iSpecies].mass; } - + report.exit(function); return; } @@ -235,47 +235,47 @@ void Neutrals::calc_scale_height(Grid grid) { // If we have eddy diffusion, the scale-heights need to be adjusted, // since all of the scale heights should be the same in the region // where eddy diffusion is dominant. -/* - if (input.get_use_eddy_momentum()) { - // We need the mean major mass in the bottom-most cell, which we - // assume is the region where the atmosphere is well-mixed: - - // sum mass densities and densities to calculate mean major mass: - precision_t mTotal = 0.0, dTotal = 0.0, mmm; - // Need the mass density and the number density in the bottom slice: - arma_mat mSlice, dSlice; - - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - mSlice = - species[iSpecies].mass * - species[iSpecies].density_scgc.slice(0); - dSlice = - species[iSpecies].density_scgc.slice(0); - mTotal = mTotal + accu(mSlice); - dTotal = dTotal + accu(dSlice); + /* + if (input.get_use_eddy_momentum()) { + // We need the mean major mass in the bottom-most cell, which we + // assume is the region where the atmosphere is well-mixed: + + // sum mass densities and densities to calculate mean major mass: + precision_t mTotal = 0.0, dTotal = 0.0, mmm; + // Need the mass density and the number density in the bottom slice: + arma_mat mSlice, dSlice; + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + mSlice = + species[iSpecies].mass * + species[iSpecies].density_scgc.slice(0); + dSlice = + species[iSpecies].density_scgc.slice(0); + mTotal = mTotal + accu(mSlice); + dTotal = dTotal + accu(dSlice); + } + + mmm = mTotal / dTotal; + mmm = sync_mean_across_all_procs(mmm); + + // bulk scale height, assuming well mixed atmosphere: + arma_cube bulkH = + cKB * temperature_scgc / + (mmm * abs(grid.gravity_mag_scgc)); + + // percentage will go from 1 = use bulk scale, to 0 = use individual + arma_cube percentage = kappa_eddy_scgc / input.get_eddy_coef(); + arma_cube one = percentage; + one.ones(); + arma_cube omp = one - percentage; + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].scale_height_scgc = + omp % species[iSpecies].scale_height_scgc + + percentage % bulkH; + } } - - mmm = mTotal / dTotal; - mmm = sync_mean_across_all_procs(mmm); - - // bulk scale height, assuming well mixed atmosphere: - arma_cube bulkH = - cKB * temperature_scgc / - (mmm * abs(grid.gravity_mag_scgc)); - - // percentage will go from 1 = use bulk scale, to 0 = use individual - arma_cube percentage = kappa_eddy_scgc / input.get_eddy_coef(); - arma_cube one = percentage; - one.ones(); - arma_cube omp = one - percentage; - - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].scale_height_scgc = - omp % species[iSpecies].scale_height_scgc + - percentage % bulkH; - } - } -*/ + */ return; } diff --git a/src/dipole.cpp b/src/dipole.cpp index 8f1175ec..d97c66f3 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -18,8 +18,13 @@ precision_t get_lshell(precision_t lat, precision_t rNorm) { precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell) { precision_t cosLat = sqrt(r / lshell); - if (cosLat < -1.0) cosLat = -1.0; - if (cosLat > 1.0) cosLat = 1.0; + + if (cosLat < -1.0) + cosLat = -1.0; + + if (cosLat > 1.0) + cosLat = 1.0; + precision_t lat = acos(cosLat); return lat; } diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 9b7947b7..9c1aad5a 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -109,7 +109,8 @@ void Electrodynamics::set_all_indices_for_ie(Times time, float au = indices.get_index(time_now, iAU_); float al = indices.get_index(time_now, iAL_); - if (imfbz < -1e31) report.error("There doesnt seem to be any IMF Bz!"); + if (imfbz < -1e31) + report.error("There doesnt seem to be any IMF Bz!"); if (report.test_verbose(3)) { std::cout << "time now : " << time_now << "\n"; @@ -187,39 +188,49 @@ bool Electrodynamics::update(Planets planet, int64_t nZs = gGrid.get_nZ(); int64_t iZ; int iError; + for (iZ = 0; iZ < nZs; iZ++) { copy_mat_to_array(gGrid.magLocalTime_scgc.slice(iZ), mlt2d, true); copy_mat_to_array(gGrid.magLat_scgc.slice(iZ), lat2d, true); ie_set_mlts(mlt2d, &iError); + if (iError != 0) { didWork = false; report.error("Error in ie_set_mlts"); } + if (didWork) ie_set_lats(lat2d, &iError); + if (iError != 0) { didWork = false; report.error("Error in ie_set_lats"); } + if (didWork) ie_update_grid(&iError); + if (iError != 0) { didWork = false; report.error("Error in ie_update_grid"); } + if (didWork) ie_get_potential(pot2d, &iError); + if (iError != 0) { didWork = false; report.error("Error in ie_get_potential"); std::cout << "ie_get_potential iError : " << iError << "\n"; } + copy_array_to_mat(pot2d, ions.potential_scgc.slice(iZ), true); if (iZ == nZs - 1) { if (didWork) { ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); + if (iError != 0) { didWork = false; report.error("Error in ie_get_electron_diffuse_aurora"); @@ -227,6 +238,7 @@ bool Electrodynamics::update(Planets planet, } else { copy_array_to_mat(avee2d, ions.avee, true); copy_array_to_mat(eflux2d, ions.eflux, true); + if (report.test_verbose(3)) { std::cout << "I have eflux2d: " << ions.eflux << "\n"; std::cout << "I have potential: " << ions.potential_scgc.slice(iZ) << "\n"; diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 943b2e3d..a4d79c23 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -727,11 +727,11 @@ bool Neutrals::exchange_really_old(Grid &grid) { for (int i = 0; i < nSpecies; ++i) fill_corners(species[i].density_scgc, nG); - + fill_corners(temperature_scgc, nG); for (int iDir = 0; iDir < 3; iDir++) fill_corners(velocity_vcgc[iDir], nG); - + // Wait for all processors to be done. MPI_Barrier(aether_comm); @@ -905,7 +905,8 @@ bool exchange_one_var(Grid &grid, // This function is only needed if we do interpolation, which only happens in // the horizontal directions - if (!grid.get_HasXdim() & !grid.get_HasYdim()) return true; + if (!grid.get_HasXdim() & !grid.get_HasYdim()) + return true; std::string function = "exchange_one_var"; static int iFunction = -1; @@ -1205,7 +1206,8 @@ bool find_ghostcell_interpolation_coefs(Grid &grid) { // This function is only needed if we do interpolation, which only happens in // the horizontal directions - if (!grid.get_HasXdim() & !grid.get_HasYdim()) return true; + if (!grid.get_HasXdim() & !grid.get_HasYdim()) + return true; std::string function = "find_ghostcell_interpolation_coefs"; static int iFunction = -1; diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index a83714cf..a8e87ddc 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -289,9 +289,9 @@ void Grid::calc_gravity(Planets planet) { gravity_vcgc[1] = - gravity_vcgc[1]; gravity_vcgc[2] = - gravity_vcgc[2]; gravity_mag_scgc = sqrt( - gravity_vcgc[0] % gravity_vcgc[0] + - gravity_vcgc[1] % gravity_vcgc[1] + - gravity_vcgc[2] % gravity_vcgc[2]); + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); report.exit(function); return; @@ -377,20 +377,21 @@ void Grid::calc_alt_grid_spacing() { MeshH2 = h1 + h2; MeshH3 = h1 + h2 + h3; MeshH4 = h1 + h2 + h3 + h4; - MeshCoef1s3rdp1.slice(iAlt) = - -1.0*( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + - MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3)/ - (MeshH1 % MeshH2 % MeshH3 % MeshH4); - MeshCoef1s3rdp2.slice(iAlt) = - 1.0*( MeshH2 % MeshH3 % MeshH4)/(h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); - MeshCoef1s3rdp3.slice(iAlt) = - -1.0*( MeshH1 % MeshH3 % MeshH4)/(MeshH2 % h2 % h3 % (h3+h4)); - MeshCoef1s3rdp4.slice(iAlt) = - 1.0*( MeshH1 % MeshH2 % MeshH4)/(MeshH3 % (h3+h2) % h3 % h4); - MeshCoef1s3rdp5.slice(iAlt) = - -1.0*( MeshH1 % MeshH2 % MeshH3)/(MeshH4 % (h2+h3+h4) % (h3+h4) % h4); + MeshCoef1s3rdp1.slice(iAlt) = + -1.0 * ( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + + MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3) / + (MeshH1 % MeshH2 % MeshH3 % MeshH4); + MeshCoef1s3rdp2.slice(iAlt) = + 1.0 * ( MeshH2 % MeshH3 % MeshH4) / (h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); + MeshCoef1s3rdp3.slice(iAlt) = + -1.0 * ( MeshH1 % MeshH3 % MeshH4) / (MeshH2 % h2 % h3 % (h3 + h4)); + MeshCoef1s3rdp4.slice(iAlt) = + 1.0 * ( MeshH1 % MeshH2 % MeshH4) / (MeshH3 % (h3 + h2) % h3 % h4); + MeshCoef1s3rdp5.slice(iAlt) = + -1.0 * ( MeshH1 % MeshH2 % MeshH3) / (MeshH4 % (h2 + h3 + h4) % (h3 + h4) % h4); } } + report.print(4, "ending calc_alt_grid_spacing"); return; } diff --git a/src/grid.cpp b/src/grid.cpp index 834febd3..62767f7e 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -30,26 +30,46 @@ Grid::Grid(std::string gridtype) { grid_input.nZ == 1) Is0D = true; else { - if (grid_input.nY == 1 & grid_input.nZ == 1) Is1Dx = true; - if (grid_input.nX == 1 & grid_input.nZ == 1) Is1Dy = true; - if (grid_input.nX == 1 & grid_input.nY == 1) Is1Dz = true; + if (grid_input.nY == 1 & grid_input.nZ == 1) + Is1Dx = true; + + if (grid_input.nX == 1 & grid_input.nZ == 1) + Is1Dy = true; + + if (grid_input.nX == 1 & grid_input.nY == 1) + Is1Dz = true; + if (!Is1Dx & !Is1Dy & !Is1Dz) { - if (grid_input.nX == 1) Is2Dyz = true; - if (grid_input.nY == 1) Is2Dxz = true; - if (grid_input.nZ == 1) Is2Dxy = true; - if (!Is2Dyz & !Is2Dxz & !Is2Dxy) Is3D = true; + if (grid_input.nX == 1) + Is2Dyz = true; + + if (grid_input.nY == 1) + Is2Dxz = true; + + if (grid_input.nZ == 1) + Is2Dxy = true; + + if (!Is2Dyz & !Is2Dxz & !Is2Dxy) + Is3D = true; } } - if (grid_input.nX == 1) HasXdim = false; - if (grid_input.nY == 1) HasYdim = false; - if (grid_input.nZ == 1) HasZdim = false; + if (grid_input.nX == 1) + HasXdim = false; - if (mklower(grid_input.shape) == "sphere") + if (grid_input.nY == 1) + HasYdim = false; + + if (grid_input.nZ == 1) + HasZdim = false; + + if (mklower(grid_input.shape) == "sphere") iGridShape_ = iSphere_; - if (mklower(grid_input.shape) == "cubesphere") + + if (mklower(grid_input.shape) == "cubesphere") iGridShape_ = iCubesphere_; - if (mklower(grid_input.shape) == "dipole") + + if (mklower(grid_input.shape) == "dipole") iGridShape_ = iDipole_; geoLon_scgc.set_size(nX, nY, nZ); @@ -192,6 +212,7 @@ Grid::Grid(std::string gridtype) { IsExperimental = false; cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + for (int i = 0; i < 3; i++) cent_acc_vcgc[i].zeros(); @@ -406,7 +427,7 @@ void Grid::set_IsGeoGrid(bool value) { } // -------------------------------------------------------------------------- -// Set whether the grid is an experimental grid +// Set whether the grid is an experimental grid // -------------------------------------------------------------------------- void Grid::set_IsExperimental(bool value) { @@ -414,7 +435,7 @@ void Grid::set_IsExperimental(bool value) { } // -------------------------------------------------------------------------- -// Set whether the grid is a dipole grid +// Set whether the grid is a dipole grid // -------------------------------------------------------------------------- void Grid::set_IsDipole(bool value) { @@ -481,19 +502,19 @@ int64_t Grid::get_nX(bool includeGCs) { if (includeGCs) return nX; else - return nX - 2*nGCs; + return nX - 2 * nGCs; } int64_t Grid::get_nY(bool includeGCs) { if (includeGCs) return nY; else - return nY - 2*nGCs; + return nY - 2 * nGCs; } int64_t Grid::get_nZ(bool includeGCs) { if (includeGCs) return nZ; else - return nZ - 2*nGCs; + return nZ - 2 * nGCs; } int64_t Grid::get_nLons() { @@ -510,19 +531,19 @@ int64_t Grid::get_nLons(bool includeGCs) { if (includeGCs) return nLons; else - return nLons - 2*nGCs; + return nLons - 2 * nGCs; } int64_t Grid::get_nLats(bool includeGCs) { if (includeGCs) return nLats; else - return nLats - 2*nGCs; + return nLats - 2 * nGCs; } int64_t Grid::get_nAlts(bool includeGCs) { if (includeGCs) return nAlts; else - return nAlts - 2*nGCs; + return nAlts - 2 * nGCs; } int64_t Grid::get_nGCs() { diff --git a/src/indices.cpp b/src/indices.cpp index 72bee799..4dedf81d 100644 --- a/src/indices.cpp +++ b/src/indices.cpp @@ -88,6 +88,7 @@ bool read_and_store_indices(Indices &indices) { // --------------------------------------------------- int nFiles = input.get_number_of_omniweb_files(); + if (report.test_verbose(1)) std::cout << "Number of OMNIWeb files : " << nFiles << "\n"; @@ -122,10 +123,12 @@ bool read_and_store_indices(Indices &indices) { } else { if (report.test_verbose(0)) { std::cout << "--> WARNING : There were no OMNIWeb files specified!\n"; - std::cout << "--> : If this was not your intent, check the aether.json file\n"; + std::cout << + "--> : If this was not your intent, check the aether.json file\n"; std::cout << "--> : line needs to be: \n"; std::cout << "--> : \"OmniwebFiles\": [\"filename\"] \n"; } + report.error("WARNING : OMNIWeb file not set!!!"); } diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index e37de654..8bc7176e 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -652,7 +652,8 @@ void Grid::create_sphere_grid(Quadtree quadtree) { // if we are not doing anything in the lon direction, then set dlon to // something reasonable: - if (!HasXdim) dlon = 1.0 * cDtoR; + if (!HasXdim) + dlon = 1.0 * cDtoR; // Longitudes: // - Make a 1d vector @@ -671,7 +672,8 @@ void Grid::create_sphere_grid(Quadtree quadtree) { // if we are not doing anything in the lat direction, then set dlat to // something reasonable: - if (!HasYdim) dlat = 1.0 * cDtoR; + if (!HasYdim) + dlat = 1.0 * cDtoR; // Latitudes: // - Make a 1d vector @@ -781,7 +783,8 @@ void Grid::create_altitudes(Planets planet) { if (grid_input.IsUniformAlt) { for (iAlt = 0; iAlt < nAlts; iAlt++) // Convert km to m: - alt1d(iAlt) = (grid_input.alt_min + (iAlt - nGeoGhosts) * grid_input.daltKm) * cKMtoM; + alt1d(iAlt) = (grid_input.alt_min + (iAlt - nGeoGhosts) * grid_input.daltKm) * + cKMtoM; } else { json neutrals = planet.get_neutrals(); @@ -975,11 +978,17 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (iGridShape_ == iCubesphere_) { report.print(0, "Creating Cubesphere Grid"); - if (!Is0D & !Is1Dz) create_cubesphere_connection(quadtree); + + if (!Is0D & !Is1Dz) + create_cubesphere_connection(quadtree); + IsCubeSphereGrid = true; } else { report.print(0, "Creating Spherical Grid"); - if (!Is0D & !Is1Dz) create_sphere_connection(quadtree); + + if (!Is0D & !Is1Dz) + create_sphere_connection(quadtree); + IsCubeSphereGrid = false; } @@ -1005,6 +1014,7 @@ bool Grid::init_geo_grid(Quadtree quadtree, // Calculate the radius (for spherical or non-spherical) fill_grid_radius(planet); + // Correct the reference grid with correct length scale: // (with R = actual radius) if (iGridShape_ == iCubesphere_) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index e5d3164b..82d7953c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -12,8 +12,8 @@ // https://arxiv.org/pdf/physics/0606044 // // ---------------------------------------------------------------------- -std::pair Grid::qp_to_r_theta(precision_t q, precision_t p) -{ +std::pair Grid::qp_to_r_theta(precision_t q, + precision_t p) { // return quanties precision_t r, theta; // Intermediate quantities: @@ -22,7 +22,8 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); term2 = pow(term0, 1.0 / 3.0); - term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); + term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), + 3.0 / 2.0); r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); @@ -39,8 +40,7 @@ std::pair Grid::qp_to_r_theta(precision_t q, precision // are read from input files. And, of course, the numbers of each coordinate // - nLats must be even!! // ---------------------------------------------------------------------- -void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) -{ +void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) { std::string function = "Grid::init_dipole_grid"; static int iFunction = -1; @@ -91,13 +91,13 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // Quick 1D check for longitudes: // Same as geo_grid here... - if (!HasXdim) dlon = 1.0 * cDtoR; + if (!HasXdim) + dlon = 1.0 * cDtoR; for (iLon = 0; iLon < nLons; iLon++) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; - for (iLat = 0; iLat < nLats; iLat++) - { + for (iLat = 0; iLat < nLats; iLat++) { for (iAlt = 0; iAlt < nAlts; iAlt++) magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; } @@ -117,7 +117,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // - nZ=nAlts*2 - (we fill up HALF field lines) // - nZby2 = nAlts // -> Plus, experinemtal support for altitude ghost cells... - int64_t nF = (nLats) / 2 , nZ = (nAlts) * 2, nZby2 = (nAlts); + int64_t nF = (nLats) / 2, nZ = (nAlts) * 2, nZby2 = (nAlts); // lShells and baseLats are currently set for southern hemisphere then mirrored arma_vec Lshells(nF), baseLats(nF); @@ -126,23 +126,19 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) del_lat = (blat_max_ - blat_min_) / (nF - nGCs * 2.0); // now make sure the user used 1 or an even number for nLats - if (nLats % 2 != 0) - { - if (!HasYdim) - { + if (nLats % 2 != 0) { + if (!HasYdim) { del_lat = 1.0 * cDtoR; report.print(0, "Running in single latitude dimension. Experinental!!"); nF = 1; - } - else + } else report.error("Cannot use odd nLats with dipole grid!"); } // loop over all cells - everything including the ghost cells // -> This means some points will go over the pole (baseLat > +- 90 degrees) // They're taken care of in the conversion to geographic coordinates. - for (int i = 0; i < nF; i++) - { + for (int i = 0; i < nF; i++) { // first put down "linear" spacing tmp_lat = blat_min_ + del_lat * (i - nGCs + 0.5); // then scale it according to the exponent & acos @@ -150,6 +146,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // place values in array backwards, South pole -> equator. baseLats(nF - i - 1) = -tmp_lat; } + report.print(3, "Done setting base latitudes for dipole grid."); // Find L-Shell for each baseLat @@ -177,10 +174,10 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) std::pair r_theta; for (int i = 0; i < nAlts; i++) - exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), 2.0)); + exp_q_dist(i) = Gamma + (1 - Gamma) * exp(-pow(((i - nZby2) / (nZ / 10.0)), + 2.0)); - for (int i_nF = 0; i_nF < nF; i_nF++) - { + for (int i_nF = 0; i_nF < nF; i_nF++) { // min/max q q_S = -cos(cPI / 2 + baseLats(i_nF)) / pow(min_alt_re, 2.0); q_N = -q_S; @@ -188,8 +185,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // calculate const. stride similar to sami2/3 (huba & joyce 2000) // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == // inlo loop thru southern hemisphere, mirror in north. - for (int i_nZ = 0; i_nZ < nAlts; i_nZ++) - { + for (int i_nZ = 0; i_nZ < nAlts; i_nZ++) { // This won't work for offset dipoles. // Doesn't have any lat/lon dependence. delqp = (q_N - q_S) / (nZ + 1); @@ -207,6 +203,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) bLats(i_nF, i_nZ) = r_theta.second; } } + report.print(3, "Done generating q-spacing for dipole grid."); arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); @@ -214,25 +211,25 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (iLat = 0; iLat < nLats / 2; iLat++) - { - for (iLon = 0; iLon < nLons; iLon++) - { + for (iLat = 0; iLat < nLats / 2; iLat++) { + for (iLon = 0; iLon < nLons; iLon++) { // Not currently used. Dipole isn't offset. Leaving just in case. // Lon = magPhi_scgc(iLon, iLat, 1); - for (iAlt = 0; iAlt < nAlts; iAlt++) - { + for (iAlt = 0; iAlt < nAlts; iAlt++) { lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } + r3d.tube(iLon, iLat) = rNorm1d * planetRadius; r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; } } - report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); + + report.print(3, + "Done generating symmetric latitude & altitude spacing in dipole."); geoLat_scgc = magLat_scgc; magAlt_scgc = r3d - planetRadius; @@ -246,8 +243,7 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int iV = 0; iV < 3; iV++) - { + for (int iV = 0; iV < 3; iV++) { rad_unit_vcgc[iV].zeros(); gravity_vcgc[iV].zeros(); } @@ -268,9 +264,9 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); gravity_mag_scgc = sqrt( - gravity_vcgc[0] % gravity_vcgc[0] + - gravity_vcgc[1] % gravity_vcgc[1] + - gravity_vcgc[2] % gravity_vcgc[2]); + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); report.print(4, "Done gravity calculations for the dipole grid."); @@ -293,7 +289,8 @@ void Grid::init_dipole_grid(Quadtree quadtree, Planets planet) geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; - report.print(4, "Done dipole -> geographic transformations for the dipole grid."); + report.print(4, + "Done dipole -> geographic transformations for the dipole grid."); calc_alt_grid_spacing(); report.print(4, "Done altitude spacing for the dipole grid."); diff --git a/src/inputs.cpp b/src/inputs.cpp index 2b9ba1bd..aa36c3fc 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -15,8 +15,7 @@ Inputs input; // The setting of initial values should probably be moved. // ----------------------------------------------------------------------- -Inputs::Inputs(Times &time) -{ +Inputs::Inputs(Times &time) { // ------------------------------------------------ // Set some defaults: @@ -37,24 +36,18 @@ Inputs::Inputs(Times &time) nLatsGeo = 20; nAltsGeo = 40; - if (nLonsGeo == 1) - { + if (nLonsGeo == 1) { geo_grid_input.lon_min = 0.0; geo_grid_input.lon_max = 0.0; - } - else - { + } else { geo_grid_input.lon_min = 0.0; geo_grid_input.lon_max = 2.0 * cPI; } - if (nLatsGeo == 1) - { + if (nLatsGeo == 1) { geo_grid_input.lat_min = 0.0; geo_grid_input.lat_max = 0.0; - } - else - { + } else { geo_grid_input.lat_min = -cPI / 2; geo_grid_input.lat_max = cPI / 2; } @@ -71,8 +64,7 @@ Inputs::Inputs(Times &time) // Now read the input file: isOk = read_inputs_json(time); - if (report.test_verbose(1)) - { + if (report.test_verbose(1)) { std::cout << "Settings read in:\n"; std::cout << std::setw(2) << settings; } @@ -85,12 +77,10 @@ Inputs::Inputs(Times &time) // output the settings json to a file (for restart) // ----------------------------------------------------------------------- -bool Inputs::write_restart() -{ +bool Inputs::write_restart() { bool didWork = true; - if (iProc == 0) - { + if (iProc == 0) { std::string filename = get_setting_str("Restart", "OutDir"); filename = filename + "/settings.json"; didWork = write_json(filename, settings); @@ -115,25 +105,21 @@ std::string dummy_string = "unknown"; // 2 keys: bool Inputs::check_settings(std::string key1, - std::string key2) -{ + std::string key2) { if (report.test_verbose(2)) std::cout << "checking setting : " << key1 << " and " << key2 << "\n"; // try to find the keys first - if (settings.find(key1) != settings.end()) - { + if (settings.find(key1) != settings.end()) { if (settings.at(key1).find(key2) != settings.at(key1).end()) isOk = true; - } - else + } else // if we haven't found the keys print a message & set IsOk to false isOk = false; - if (!isOk) - { + if (!isOk) { report.error("Error in setting : " + key1 + " : " + key2); std::cout << "Missing setting called! [" << key1 << ", " << key2 << "]\n"; } @@ -144,8 +130,7 @@ bool Inputs::check_settings(std::string key1, // ----------------------------------------------------------------------- // 1 key: -bool Inputs::check_settings(std::string key1) -{ +bool Inputs::check_settings(std::string key1) { if (report.test_verbose(2)) std::cout << "checking setting : " << key1 << "\n"; @@ -172,38 +157,32 @@ bool Inputs::check_settings(std::string key1) // ----------------------------------------------------------------------- // a general int vector -std::vector Inputs::get_setting_intarr(std::string key1) -{ +std::vector Inputs::get_setting_intarr(std::string key1) { std::vector value; - if (check_settings(key1)) - { + if (check_settings(key1)) { int nPts = settings.at(key1).size(); isOk = true; for (int i = 0; i < nPts; i++) value.push_back(settings.at(key1).at(i)); - } - else + } else isOk = false; return value; } std::vector Inputs::get_setting_intarr(std::string key1, - std::string key2) -{ + std::string key2) { std::vector value; - if (check_settings(key1, key2)) - { + if (check_settings(key1, key2)) { int nPts = settings.at(key1).at(key2).size(); isOk = true; for (int i = 0; i < nPts; i++) value.push_back(settings.at(key1).at(key2).at(i)); - } - else + } else isOk = false; return value; @@ -212,14 +191,12 @@ std::vector Inputs::get_setting_intarr(std::string key1, // ----------------------------------------------------------------------- // A specific length int vector -std::vector Inputs::get_setting_timearr(std::string key1) -{ +std::vector Inputs::get_setting_timearr(std::string key1) { int nPtsTime = 7; std::vector outarr(nPtsTime, 0); std::vector timearr = get_setting_intarr(key1); - if (isOk) - { + if (isOk) { int nPts = timearr.size(); if (nPts > nPtsTime) @@ -235,8 +212,7 @@ std::vector Inputs::get_setting_timearr(std::string key1) // ----------------------------------------------------------------------- // a string with 1 key: -std::string Inputs::get_setting_str(std::string key1) -{ +std::string Inputs::get_setting_str(std::string key1) { std::string value = "unknown"; if (check_settings(key1)) @@ -249,8 +225,7 @@ std::string Inputs::get_setting_str(std::string key1) // a string with 2 keys: std::string Inputs::get_setting_str(std::string key1, - std::string key2) -{ + std::string key2) { std::string value = "unknown"; if (check_settings(key1, key2)) @@ -264,16 +239,14 @@ std::string Inputs::get_setting_str(std::string key1, std::string Inputs::get_setting_str(std::string key1, std::string key2, - std::string key3) -{ + std::string key3) { std::string value = "unknown"; isOk = false; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) if (settings.at(key1).at(key2).find(key3) != - settings.at(key1).at(key2).end()) - { + settings.at(key1).at(key2).end()) { value = settings.at(key1).at(key2).at(key3); isOk = true; } @@ -287,8 +260,7 @@ std::string Inputs::get_setting_str(std::string key1, // ----------------------------------------------------------------------- // an int with 1 key: -int64_t Inputs::get_setting_int(std::string key1) -{ +int64_t Inputs::get_setting_int(std::string key1) { int64_t value = LONG_MIN; if (check_settings(key1)) @@ -301,8 +273,7 @@ int64_t Inputs::get_setting_int(std::string key1) // an int with 2 keys: int64_t Inputs::get_setting_int(std::string key1, - std::string key2) -{ + std::string key2) { int64_t value = LONG_MIN; if (check_settings(key1, key2)) @@ -314,8 +285,7 @@ int64_t Inputs::get_setting_int(std::string key1, // ----------------------------------------------------------------------- // a bool with 1 key: -bool Inputs::get_setting_bool(std::string key1) -{ +bool Inputs::get_setting_bool(std::string key1) { bool value = false; if (check_settings(key1)) @@ -328,8 +298,7 @@ bool Inputs::get_setting_bool(std::string key1) // a bool with 2 keys: bool Inputs::get_setting_bool(std::string key1, - std::string key2) -{ + std::string key2) { bool value = false; if (check_settings(key1, key2)) @@ -343,16 +312,14 @@ bool Inputs::get_setting_bool(std::string key1, bool Inputs::get_setting_bool(std::string key1, std::string key2, - std::string key3) -{ + std::string key3) { bool value = false; isOk = false; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) if (settings.at(key1).at(key2).find(key3) != - settings.at(key1).at(key2).end()) - { + settings.at(key1).at(key2).end()) { value = settings.at(key1).at(key2).at(key3); isOk = true; } @@ -366,8 +333,7 @@ bool Inputs::get_setting_bool(std::string key1, // ----------------------------------------------------------------------- // a float with 1 key: -precision_t Inputs::get_setting_float(std::string key1) -{ +precision_t Inputs::get_setting_float(std::string key1) { precision_t value = std::numeric_limits::lowest(); if (check_settings(key1)) @@ -380,8 +346,7 @@ precision_t Inputs::get_setting_float(std::string key1) // a float with 2 key: precision_t Inputs::get_setting_float(std::string key1, - std::string key2) -{ + std::string key2) { precision_t value = std::numeric_limits::lowest(); if (check_settings(key1, key2)) @@ -393,8 +358,7 @@ precision_t Inputs::get_setting_float(std::string key1, // ----------------------------------------------------------------------- // a json with 1 key: -json Inputs::get_setting_json(std::string key1) -{ +json Inputs::get_setting_json(std::string key1) { json value; if (settings.find(key1) != settings.end()) @@ -413,20 +377,16 @@ json Inputs::get_setting_json(std::string key1) // a json with 2 keys: json Inputs::get_setting_json(std::string key1, - std::string key2) -{ + std::string key2) { json value; if (settings.find(key1) != settings.end()) if (settings.at(key1).find(key2) != settings.at(key1).end()) value = settings.at(key1).at(key2); - else - { + else { isOk = false; report.error("Error in setting : " + key1 + " : " + key2); - } - else - { + } else { if (key1 != "Satellites") { isOk = false; report.error("Error in setting : " + key1); @@ -440,8 +400,7 @@ json Inputs::get_setting_json(std::string key1, // a string with 2 keys: std::string Inputs::check_settings_str(std::string key1, - std::string key2) -{ + std::string key2) { if (check_settings(key1, key2)) return settings.at(key1).at(key2); @@ -451,10 +410,8 @@ std::string Inputs::check_settings_str(std::string key1, // ----------------------------------------------------------------------- // a string with 1 key: -std::string Inputs::check_settings_str(std::string key) -{ - if (get_setting_str(key) == dummy_string) - { +std::string Inputs::check_settings_str(std::string key) { + if (get_setting_str(key) == dummy_string) { isOk = false; return dummy_string; } @@ -466,8 +423,7 @@ std::string Inputs::check_settings_str(std::string key) // a float with 2 keys: precision_t Inputs::check_settings_pt(std::string key1, - std::string key2) -{ + std::string key2) { if (check_settings(key1, key2)) return settings.at(key1).at(key2); @@ -480,8 +436,7 @@ precision_t Inputs::check_settings_pt(std::string key1, // gridtype needs to be "neuGrid" or "ionGrid" // ----------------------------------------------------------------------- -Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) -{ +Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { Inputs::grid_input_struct grid_specs; @@ -500,25 +455,23 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) // The rest of the settings are different for mag/geo grids, // First take the magnetic options, then "else" should be (cube-)sphere - if (grid_specs.shape == "dipole") - { + if (grid_specs.shape == "dipole") { // min_apex MUST be more than min_alt: grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); + if (grid_specs.min_apex <= grid_specs.alt_min) - { report.error("Error in Inputs! min_apex must be more than min_alt!"); - } + grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); grid_specs.max_lat_dipole = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.FieldLineStretch = check_settings_pt(gridtype, "LineSpacing"); - } - else - { + } else { min_max = get_setting_intarr(gridtype, "LatRange"); grid_specs.lat_min = min_max[0] * cDtoR; grid_specs.lat_max = min_max[1] * cDtoR; grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); + if (grid_specs.IsUniformAlt) grid_specs.daltKm = check_settings_pt(gridtype, "dAltkm"); else @@ -537,32 +490,25 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) // This is needed, because we may want to check for verbose specifically // in a given json and not the normal settings json: -bool Inputs::set_verbose(json in) -{ +bool Inputs::set_verbose(json in) { bool didWork = true; int iVerbose = -1; // Want to set verbose level ASAP: - if (in.contains("Debug")) - { - if (in.at("Debug").contains("iVerbose")) - { + if (in.contains("Debug")) { + if (in.at("Debug").contains("iVerbose")) { iVerbose = in.at("Debug").at("iVerbose"); - if (in.at("Debug").contains("iProc")) - { + if (in.at("Debug").contains("iProc")) { if (iProc != in.at("Debug").at("iProc")) iVerbose = -1; } - } - else + } else didWork = false; - } - else + } else didWork = false; - if (iVerbose > 0) - { + if (iVerbose > 0) { std::cout << "Setting iVerbose : " << iVerbose << "\n"; report.set_verbose(iVerbose); } @@ -574,8 +520,7 @@ bool Inputs::set_verbose(json in) // Return total number of OMNIWeb files to read // ----------------------------------------------------------------------- -int Inputs::get_number_of_omniweb_files() -{ +int Inputs::get_number_of_omniweb_files() { if (settings.find("OmniwebFiles") != settings.end()) return settings.at("OmniwebFiles").size(); @@ -587,8 +532,7 @@ int Inputs::get_number_of_omniweb_files() // Return OMNIWeb file names as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_omniweb_files() -{ +std::vector Inputs::get_omniweb_files() { std::vector omniweb_files; int nFiles = get_number_of_omniweb_files(); @@ -602,8 +546,7 @@ std::vector Inputs::get_omniweb_files() // Return how often to output a given output type // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_output(int iOutput) -{ +precision_t Inputs::get_dt_output(int iOutput) { precision_t value = 0.0; int nOutputs = settings.at("Outputs").at("type").size(); @@ -617,8 +560,7 @@ precision_t Inputs::get_dt_output(int iOutput) // Return the output type // ----------------------------------------------------------------------- -std::string Inputs::get_type_output(int iOutput) -{ +std::string Inputs::get_type_output(int iOutput) { std::string value = "unknown"; int nOutputs = settings.at("Outputs").at("type").size(); @@ -632,8 +574,7 @@ std::string Inputs::get_type_output(int iOutput) // Set random number seed // ----------------------------------------------------------------------- -void Inputs::set_seed(int seed) -{ +void Inputs::set_seed(int seed) { settings["Seed"] = seed; updated_seed = seed; } @@ -642,8 +583,7 @@ void Inputs::set_seed(int seed) // Return random number seed that has been updated // ----------------------------------------------------------------------- -int Inputs::get_updated_seed() -{ +int Inputs::get_updated_seed() { std::default_random_engine get_random(updated_seed); updated_seed = get_random(); return updated_seed; @@ -653,8 +593,7 @@ int Inputs::get_updated_seed() // Return log file name // ----------------------------------------------------------------------- -std::string Inputs::get_logfile() -{ +std::string Inputs::get_logfile() { std::string logfile = get_setting_str("Logfile", "name"); if (nMembers > 1) @@ -667,30 +606,24 @@ std::string Inputs::get_logfile() // Return log file name // ----------------------------------------------------------------------- -std::string Inputs::get_logfile(int64_t iLog) -{ +std::string Inputs::get_logfile(int64_t iLog) { std::string logfile = "log.txt"; - if (check_settings("Logfile", "name")) - { + + if (check_settings("Logfile", "name")) { int64_t nLogs = settings.at("Logfile").at("name").size(); - if (nLogs == 1) - { + + if (nLogs == 1) { logfile = settings.at("Logfile").at("name").at(iLog); // logfile = get_setting_str("Logfile", "name"); - } - else - { - if (iLog > nLogs - 1) - { + } else { + if (iLog > nLogs - 1) { report.error("Error in getting logfile name!"); logfile = settings.at("Logfile").at("name").at(nLogs - 1); - } - else - { + } else logfile = settings.at("Logfile").at("name").at(iLog); - } } } + if (nMembers > 1) logfile = add_cmember(logfile); @@ -701,8 +634,7 @@ std::string Inputs::get_logfile(int64_t iLog) // Return the name of specified variables as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_species_vector() -{ +std::vector Inputs::get_species_vector() { std::vector species; const json &json_species = get_setting_json("Logfile", "species"); @@ -716,8 +648,7 @@ std::vector Inputs::get_species_vector() // Return the name of satellite files as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_files() -{ +std::vector Inputs::get_satellite_files() { std::vector files; const json &json_files = get_setting_json("Satellites", "files"); @@ -731,8 +662,7 @@ std::vector Inputs::get_satellite_files() // Return the output file names of satellites as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_names() -{ +std::vector Inputs::get_satellite_names() { std::vector names; const json &json_names = get_setting_json("Satellites", "names"); @@ -746,8 +676,7 @@ std::vector Inputs::get_satellite_names() // Return how oftern to write log file for satellites as a vector // ----------------------------------------------------------------------- -std::vector Inputs::get_satellite_dts() -{ +std::vector Inputs::get_satellite_dts() { std::vector dts; const json &json_dts = get_setting_json("Satellites", "dts"); @@ -767,8 +696,7 @@ std::vector Inputs::get_satellite_dts() // Return how oftern to write log file // ----------------------------------------------------------------------- -precision_t Inputs::get_logfile_dt() -{ +precision_t Inputs::get_logfile_dt() { return get_setting_float("Logfile", "dt"); } @@ -776,8 +704,7 @@ precision_t Inputs::get_logfile_dt() // Return whether to append or rewrite // ----------------------------------------------------------------------- -bool Inputs::get_logfile_append() -{ +bool Inputs::get_logfile_append() { return get_setting_bool("Logfile", "append"); } @@ -785,8 +712,7 @@ bool Inputs::get_logfile_append() // Return whether user is student // ----------------------------------------------------------------------- -bool Inputs::get_is_student() -{ +bool Inputs::get_is_student() { return get_setting_bool("Student", "is"); } @@ -794,8 +720,7 @@ bool Inputs::get_is_student() // Return student name // ----------------------------------------------------------------------- -std::string Inputs::get_student_name() -{ +std::string Inputs::get_student_name() { return check_settings_str("Student", "name"); } @@ -803,8 +728,7 @@ std::string Inputs::get_student_name() // Return whether grid is cubesphere or spherical // ----------------------------------------------------------------------- -bool Inputs::get_is_cubesphere() -{ +bool Inputs::get_is_cubesphere() { return get_setting_bool("CubeSphere", "is"); } @@ -812,8 +736,7 @@ bool Inputs::get_is_cubesphere() // Return whether to restart or not // ----------------------------------------------------------------------- -bool Inputs::get_do_restart() -{ +bool Inputs::get_do_restart() { return get_setting_bool("Restart", "do"); } @@ -821,8 +744,7 @@ bool Inputs::get_do_restart() // Return NO cooling // ----------------------------------------------------------------------- -bool Inputs::get_NO_cooling() -{ +bool Inputs::get_NO_cooling() { return get_setting_bool("Sources", "Neutrals", "NO_cool"); } @@ -830,8 +752,7 @@ bool Inputs::get_NO_cooling() // Return O cooling // ----------------------------------------------------------------------- -bool Inputs::get_O_cooling() -{ +bool Inputs::get_O_cooling() { return get_setting_bool("Sources", "Neutrals", "O_cool"); } @@ -859,8 +780,7 @@ bool Inputs::get_cent_acc() { // Return restart OUT directory // ----------------------------------------------------------------------- -std::string Inputs::get_restartout_dir() -{ +std::string Inputs::get_restartout_dir() { return check_settings_str("Restart", "OutDir"); } @@ -868,8 +788,7 @@ std::string Inputs::get_restartout_dir() // Return restart In directory // ----------------------------------------------------------------------- -std::string Inputs::get_restartin_dir() -{ +std::string Inputs::get_restartin_dir() { return check_settings_str("Restart", "InDir"); } @@ -877,8 +796,7 @@ std::string Inputs::get_restartin_dir() // dt for writing restart files // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_write_restarts() -{ +precision_t Inputs::get_dt_write_restarts() { return check_settings_pt("Restart", "dt"); } @@ -886,8 +804,7 @@ precision_t Inputs::get_dt_write_restarts() // Return magnetic field type (dipole and none defined now.) // ----------------------------------------------------------------------- -std::string Inputs::get_bfield_type() -{ +std::string Inputs::get_bfield_type() { return check_settings_str("BField"); } @@ -895,8 +812,7 @@ std::string Inputs::get_bfield_type() // Return whether to use EUV at all // ----------------------------------------------------------------------- -bool Inputs::get_euv_douse() -{ +bool Inputs::get_euv_douse() { return get_setting_bool("Euv", "doUse"); } @@ -905,8 +821,7 @@ bool Inputs::get_euv_douse() // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_north_file() -{ +std::string Inputs::get_electrodynamics_north_file() { return check_settings_str("Electrodynamics", "NorthFile"); } @@ -915,8 +830,7 @@ std::string Inputs::get_electrodynamics_north_file() // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_south_file() -{ +std::string Inputs::get_electrodynamics_south_file() { return check_settings_str("Electrodynamics", "SouthFile"); } @@ -925,8 +839,7 @@ std::string Inputs::get_electrodynamics_south_file() // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_file() -{ +std::string Inputs::get_electrodynamics_file() { return check_settings_str("Electrodynamics", "File"); } @@ -935,8 +848,7 @@ std::string Inputs::get_electrodynamics_file() // files that are for the empirical models reside // ----------------------------------------------------------------------- -std::string Inputs::get_electrodynamics_dir() -{ +std::string Inputs::get_electrodynamics_dir() { return check_settings_str("Electrodynamics", "Dir"); } @@ -944,8 +856,7 @@ std::string Inputs::get_electrodynamics_dir() // Return the Electrodynamics Potential Model // ----------------------------------------------------------------------- -std::string Inputs::get_potential_model() -{ +std::string Inputs::get_potential_model() { return mklower(check_settings_str("Electrodynamics", "Potential")); } @@ -953,8 +864,7 @@ std::string Inputs::get_potential_model() // Return the Electrodynamics Diffuse Auroral Model // ----------------------------------------------------------------------- -std::string Inputs::get_diffuse_auroral_model() -{ +std::string Inputs::get_diffuse_auroral_model() { return mklower(check_settings_str("Electrodynamics", "DiffuseAurora")); } @@ -962,8 +872,7 @@ std::string Inputs::get_diffuse_auroral_model() // Return the EUV model used (EUVAC only option now) // ----------------------------------------------------------------------- -std::string Inputs::get_euv_model() -{ +std::string Inputs::get_euv_model() { return mklower(check_settings_str("Euv", "Model")); } @@ -971,8 +880,7 @@ std::string Inputs::get_euv_model() // Return the heating efficiency of the neutrals for EUV // ----------------------------------------------------------------------- -precision_t Inputs::get_euv_heating_eff_neutrals() -{ +precision_t Inputs::get_euv_heating_eff_neutrals() { return check_settings_pt("Euv", "HeatingEfficiency"); } @@ -980,8 +888,7 @@ precision_t Inputs::get_euv_heating_eff_neutrals() // Return whether to include the photoelectron ionization // ----------------------------------------------------------------------- -bool Inputs::get_include_photoelectrons() -{ +bool Inputs::get_include_photoelectrons() { return get_setting_bool("Euv", "IncludePhotoElectrons"); } @@ -989,8 +896,7 @@ bool Inputs::get_include_photoelectrons() // Return how often to calculate EUV energy deposition // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_euv() -{ +precision_t Inputs::get_dt_euv() { return check_settings_pt("Euv", "dt"); } @@ -998,8 +904,7 @@ precision_t Inputs::get_dt_euv() // Return how often to report progress of simulation // ----------------------------------------------------------------------- -precision_t Inputs::get_dt_report() -{ +precision_t Inputs::get_dt_report() { return check_settings_pt("Debug", "dt"); } @@ -1007,8 +912,7 @@ precision_t Inputs::get_dt_report() // Return number of output types // ----------------------------------------------------------------------- -precision_t Inputs::get_n_outputs() -{ +precision_t Inputs::get_n_outputs() { return settings.at("Outputs").at("type").size(); } @@ -1016,8 +920,7 @@ precision_t Inputs::get_n_outputs() // Return original random number seed // ----------------------------------------------------------------------- -int Inputs::get_original_seed() -{ +int Inputs::get_original_seed() { return get_setting_int("Seed"); } @@ -1025,23 +928,19 @@ int Inputs::get_original_seed() // Return number of longitudes, latitudes, and altitudes in grid // ----------------------------------------------------------------------- -int Inputs::get_nLons(std::string gridtype) -{ +int Inputs::get_nLons(std::string gridtype) { return get_setting_int(gridtype, "nLonsPerBlock"); } -int Inputs::get_nLats(std::string gridtype) -{ +int Inputs::get_nLats(std::string gridtype) { return get_setting_int(gridtype, "nLatsPerBlock"); } -int Inputs::get_nAlts(std::string gridtype) -{ +int Inputs::get_nAlts(std::string gridtype) { return get_setting_int(gridtype, "nAlts"); } -std::string Inputs::get_grid_shape(std::string gridtype) -{ +std::string Inputs::get_grid_shape(std::string gridtype) { return mklower(get_setting_str(gridtype, "Shape")); } @@ -1049,8 +948,7 @@ std::string Inputs::get_grid_shape(std::string gridtype) // Return number of ensemble members // ----------------------------------------------------------------------- -int Inputs::get_nMembers() -{ +int Inputs::get_nMembers() { return check_settings_pt("Ensembles", "nMembers"); } @@ -1058,13 +956,11 @@ int Inputs::get_nMembers() // Return verbose variables // ----------------------------------------------------------------------- -int Inputs::get_verbose() -{ +int Inputs::get_verbose() { return check_settings_pt("Debug", "iVerbose"); } -int Inputs::get_verbose_proc() -{ +int Inputs::get_verbose_proc() { return get_setting_int("Debug", "iProc"); } @@ -1072,8 +968,7 @@ int Inputs::get_verbose_proc() // Return EUV file name // ----------------------------------------------------------------------- -std::string Inputs::get_euv_file() -{ +std::string Inputs::get_euv_file() { return check_settings_str("Euv", "File"); } @@ -1081,8 +976,7 @@ std::string Inputs::get_euv_file() // Return aurora file name // ----------------------------------------------------------------------- -std::string Inputs::get_aurora_file() -{ +std::string Inputs::get_aurora_file() { return check_settings_str("AuroraFile"); } @@ -1090,8 +984,7 @@ std::string Inputs::get_aurora_file() // Return Chemistry file name // ----------------------------------------------------------------------- -std::string Inputs::get_chemistry_file() -{ +std::string Inputs::get_chemistry_file() { return settings.at("ChemistryFile"); } @@ -1099,8 +992,7 @@ std::string Inputs::get_chemistry_file() // Return Collision file name // ----------------------------------------------------------------------- -std::string Inputs::get_collision_file() -{ +std::string Inputs::get_collision_file() { return check_settings_str("CollisionsFile"); } @@ -1108,8 +1000,7 @@ std::string Inputs::get_collision_file() // Return Indices Lookup Filename // ----------------------------------------------------------------------- -std::string Inputs::get_indices_lookup_file() -{ +std::string Inputs::get_indices_lookup_file() { return check_settings_str("IndicesLookupFile"); } @@ -1117,8 +1008,7 @@ std::string Inputs::get_indices_lookup_file() // Return F107 file to read // ----------------------------------------------------------------------- -std::string Inputs::get_f107_file() -{ +std::string Inputs::get_f107_file() { return check_settings_str("F107File"); } @@ -1126,8 +1016,7 @@ std::string Inputs::get_f107_file() // Return planet name // ----------------------------------------------------------------------- -std::string Inputs::get_planet() -{ +std::string Inputs::get_planet() { return get_setting_str("Planet", "name"); } @@ -1135,8 +1024,7 @@ std::string Inputs::get_planet() // Return file that contains (all) planetary characteristics // ----------------------------------------------------------------------- -std::string Inputs::get_planetary_file() -{ +std::string Inputs::get_planetary_file() { return check_settings_str("PlanetCharacteristicsFile"); } @@ -1145,8 +1033,7 @@ std::string Inputs::get_planetary_file() // a given planet // ----------------------------------------------------------------------- -std::string Inputs::get_planet_species_file() -{ +std::string Inputs::get_planet_species_file() { return check_settings_str("PlanetSpeciesFile"); } @@ -1155,8 +1042,7 @@ std::string Inputs::get_planet_species_file() // of individual ion specie temperature calculations // ----------------------------------------------------------------------- -bool Inputs::get_do_calc_bulk_ion_temp() -{ +bool Inputs::get_do_calc_bulk_ion_temp() { return get_setting_bool("DoCalcBulkIonTemp"); } @@ -1164,8 +1050,7 @@ bool Inputs::get_do_calc_bulk_ion_temp() // Return Eddy Coefficient // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_coef() -{ +precision_t Inputs::get_eddy_coef() { return get_setting_float("Eddy", "Coefficient"); } @@ -1173,8 +1058,7 @@ precision_t Inputs::get_eddy_coef() // Return pressure where Eddy Diffusion starts to drop off // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_bottom() -{ +precision_t Inputs::get_eddy_bottom() { return get_setting_float("Eddy", "BottomPressure"); } @@ -1182,8 +1066,7 @@ precision_t Inputs::get_eddy_bottom() // Return pressure where Eddy Diffusion becomes zero // ----------------------------------------------------------------------- -precision_t Inputs::get_eddy_top() -{ +precision_t Inputs::get_eddy_top() { return get_setting_float("Eddy", "TopPressure"); } @@ -1191,8 +1074,7 @@ precision_t Inputs::get_eddy_top() // // ----------------------------------------------------------------------- -bool Inputs::get_use_eddy_momentum() -{ +bool Inputs::get_use_eddy_momentum() { return get_setting_bool("Eddy", "UseInMomentum"); } @@ -1200,8 +1082,7 @@ bool Inputs::get_use_eddy_momentum() // // ----------------------------------------------------------------------- -bool Inputs::get_use_eddy_energy() -{ +bool Inputs::get_use_eddy_energy() { return get_setting_bool("Eddy", "UseInEnergy"); } @@ -1217,8 +1098,7 @@ json Inputs::get_perturb_values() { // Flag to check neutral and ions for nans and infinites // ----------------------------------------------------------------------- -bool Inputs::get_check_for_nans() -{ +bool Inputs::get_check_for_nans() { return get_setting_bool("Debug", "check_for_nans"); } @@ -1226,8 +1106,7 @@ bool Inputs::get_check_for_nans() // Checks to see if nan_test is needed // ----------------------------------------------------------------------- -bool Inputs::get_nan_test() -{ +bool Inputs::get_nan_test() { return get_setting_bool("Debug", "nan_test", "insert"); } @@ -1235,8 +1114,7 @@ bool Inputs::get_nan_test() // Returns which variable is being tested for nans // ----------------------------------------------------------------------- -std::string Inputs::get_nan_test_variable() -{ +std::string Inputs::get_nan_test_variable() { return get_setting_str("Debug", "nan_test", "variable"); } @@ -1244,8 +1122,7 @@ std::string Inputs::get_nan_test_variable() // Flag to have a latitude dependent radius, and by extension gravity // ----------------------------------------------------------------------- -bool Inputs::get_do_lat_dependent_radius() -{ +bool Inputs::get_do_lat_dependent_radius() { return get_setting_bool("Oblate", "isOblate"); } @@ -1253,8 +1130,7 @@ bool Inputs::get_do_lat_dependent_radius() // Flag to include J2 term in the gravity calculation // ----------------------------------------------------------------------- -bool Inputs::get_do_J2() -{ +bool Inputs::get_do_J2() { return get_setting_bool("Oblate", "isJ2"); } @@ -1262,8 +1138,7 @@ bool Inputs::get_do_J2() // // ----------------------------------------------------------------------- -json Inputs::get_initial_condition_types() -{ +json Inputs::get_initial_condition_types() { return get_setting_json("InitialConditions"); } @@ -1271,13 +1146,11 @@ json Inputs::get_initial_condition_types() // // ----------------------------------------------------------------------- -json Inputs::get_boundary_condition_types() -{ +json Inputs::get_boundary_condition_types() { return get_setting_json("BoundaryConditions"); } -std::string Inputs::get_advection_neutrals_vertical() -{ +std::string Inputs::get_advection_neutrals_vertical() { return get_setting_str("Advection", "Neutrals", "Vertical"); } @@ -1293,7 +1166,6 @@ bool Inputs::get_advection_neutrals_implicitfriction() { // check to see if class is ok // -------------------------------------------------------------------------- -bool Inputs::is_ok() -{ +bool Inputs::is_ok() { return isOk; } diff --git a/src/ions.cpp b/src/ions.cpp index 0e92c5f7..f0891845 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -265,10 +265,12 @@ void Ions::calc_sound_speed() { report.enter(function, iFunction); gamma_scgc.zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { gamma_scgc = gamma_scgc + species[iSpecies].density_scgc / (species[iSpecies].vibe - 2); } + gamma_scgc = gamma_scgc * 2.0 / density_scgc + 1.0; sound_scgc = sqrt(cKB * @@ -279,6 +281,7 @@ void Ions::calc_sound_speed() { if (report.test_verbose(2)) { std::cout << "max sound speed : " << sound_scgc.max() << "\n"; std::cout << "max gamma : " << gamma_scgc.max() << "\n"; + if (!all_finite(sound_scgc, "sound speed")) { std::cout << "sound speed has nans!\n"; report.report_errors(); @@ -340,9 +343,10 @@ void Ions::fill_electrons() { for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[nSpecies].density_scgc = species[nSpecies].density_scgc + species[iSpecies].density_scgc; - rho_scgc = rho_scgc + - species[iSpecies].mass * species[iSpecies].density_scgc; + rho_scgc = rho_scgc + + species[iSpecies].mass * species[iSpecies].density_scgc; } + density_scgc = species[nSpecies].density_scgc; mean_major_mass_scgc = rho_scgc / density_scgc; diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index 4166f2e9..518d797d 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -24,27 +24,27 @@ bool Ions::set_bcs(Grid grid, Times time, Indices indices) { - std::string function = "Ions::set_bcs"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "Ions::set_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); - bool didWork = true; + bool didWork = true; - if (grid.get_nZ(false) > 1) { - didWork = set_lower_bcs(grid, time, indices); + if (grid.get_nZ(false) > 1) { + didWork = set_lower_bcs(grid, time, indices); - if (didWork) - didWork = set_upper_bcs(grid); + if (didWork) + didWork = set_upper_bcs(grid); - if (didWork) - fill_electrons(); - } + if (didWork) + fill_electrons(); + } - if (!didWork) - report.error("issue with ion BCs!"); + if (!didWork) + report.error("issue with ion BCs!"); - report.exit(function); - return didWork; + report.exit(function); + return didWork; } //---------------------------------------------------------------------- @@ -53,44 +53,44 @@ bool Ions::set_bcs(Grid grid, bool Ions::set_upper_bcs(Grid grid) { - std::string function = "Ions::set_upper_bcs"; - static int iFunction = -1; - report.enter(function, iFunction); - - bool didWork = true; - - int64_t nAlts = grid.get_nZ(); - int64_t nX = grid.get_nX(), iX; - int64_t nY = grid.get_nY(), iY; - int64_t nGCs = grid.get_nGCs(); - int64_t iAlt; - arma_mat h; - arma_mat aveT; - - for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { - // Bulk Quantities: - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt - 1); - - // For each species: - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].temperature_scgc.slice(iAlt) = - species[iSpecies].temperature_scgc.slice(iAlt - 1); - - aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + - electron_temperature_scgc.slice(iAlt)); - // Calculate scale height for the species: - h = cKB / species[iSpecies].mass * - species[iSpecies].temperature_scgc.slice(iAlt) / - abs(grid.gravity_vcgc[2].slice(iAlt)); - // Assume each species falls of with (modified) hydrostatic: - species[iSpecies].density_scgc.slice(iAlt) = - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dalt_lower_scgc.slice(iAlt) / h); - } + std::string function = "Ions::set_upper_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork = true; + + int64_t nAlts = grid.get_nZ(); + int64_t nX = grid.get_nX(), iX; + int64_t nY = grid.get_nY(), iY; + int64_t nGCs = grid.get_nGCs(); + int64_t iAlt; + arma_mat h; + arma_mat aveT; + + for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { + // Bulk Quantities: + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt - 1); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].temperature_scgc.slice(iAlt) = + species[iSpecies].temperature_scgc.slice(iAlt - 1); + + aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + + electron_temperature_scgc.slice(iAlt)); + // Calculate scale height for the species: + h = cKB / species[iSpecies].mass * + species[iSpecies].temperature_scgc.slice(iAlt) / + abs(grid.gravity_vcgc[2].slice(iAlt)); + // Assume each species falls of with (modified) hydrostatic: + species[iSpecies].density_scgc.slice(iAlt) = + species[iSpecies].density_scgc.slice(iAlt - 1) % + exp(-grid.dalt_lower_scgc.slice(iAlt) / h); } + } - report.exit(function); - return didWork; + report.exit(function); + return didWork; } //---------------------------------------------------------------------- @@ -99,38 +99,38 @@ bool Ions::set_upper_bcs(Grid grid) { bool Ions::set_lower_bcs(Grid grid, Times time, Indices indices) { - std::string function = "Ions::set_lower_bcs"; - static int iFunction = -1; - report.enter(function, iFunction); - - bool didWork = true; - - int64_t nAlts = grid.get_nZ(); - int64_t nX = grid.get_nX(), iX; - int64_t nY = grid.get_nY(), iY; - int64_t nGCs = grid.get_nGCs(); - int64_t iAlt; - arma_mat h; - arma_mat aveT; - - for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { - // Bulk Quantities: - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); - - // For each species: - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - // assign all species temperatures the bulk temperature: - species[iSpecies].temperature_scgc.slice(iAlt) = - temperature_scgc.slice(iAlt); - // Assume each species falls off a bit. - // this BC shouldn't matter, since the bottom of the code - // should be in chemical equalibrium: - species[iSpecies].density_scgc.slice(iAlt) = - 0.95 * species[iSpecies].density_scgc.slice(iAlt + 1); - } + std::string function = "Ions::set_lower_bcs"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork = true; + + int64_t nAlts = grid.get_nZ(); + int64_t nX = grid.get_nX(), iX; + int64_t nY = grid.get_nY(), iY; + int64_t nGCs = grid.get_nGCs(); + int64_t iAlt; + arma_mat h; + arma_mat aveT; + + for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { + // Bulk Quantities: + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // assign all species temperatures the bulk temperature: + species[iSpecies].temperature_scgc.slice(iAlt) = + temperature_scgc.slice(iAlt); + // Assume each species falls off a bit. + // this BC shouldn't matter, since the bottom of the code + // should be in chemical equalibrium: + species[iSpecies].density_scgc.slice(iAlt) = + 0.95 * species[iSpecies].density_scgc.slice(iAlt + 1); } + } - report.exit(function); - return didWork; + report.exit(function); + return didWork; } diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index 0b8e4e07..358bd1bc 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -19,7 +19,7 @@ void calc_ion_collisions(Neutrals &neutrals, arma_cube rho_n(nX, nY, nZ); arma_cube rho_i(nX, nY, nZ); arma_cube rho_sum(nX, nY, nZ); - + // energy is the total energy transfered from ions to neutrals arma_cube energy(nX, nY, nZ); // beta is the sum of the collision frequencies * mass density of ions @@ -43,6 +43,7 @@ void calc_ion_collisions(Neutrals &neutrals, iIon_ = ions.species_to_advect[iIon]; Ions::species_chars & advected_ion = ions.species[iIon_]; rho_i = advected_ion.mass * advected_ion.density_scgc; + for (iNeutral = 0; iNeutral < neutrals.nSpeciesAdvect; iNeutral++) { iNeutral_ = neutrals.species_to_advect[iNeutral]; beta = beta + rho_i % advected_ion.nu_ion_neutral_vcgc[iNeutral_]; @@ -53,22 +54,27 @@ void calc_ion_collisions(Neutrals &neutrals, // (beta is included in the last step) // heat transfer between ions and neutrals: neutrals.heating_ion_heat_transfer_scgc = 3 * cKB / ions.mean_major_mass_scgc % - (ions.temperature_scgc - neutrals.temperature_scgc); + (ions.temperature_scgc - neutrals.temperature_scgc); + for (iDir = 0; iDir < 3; iDir++) { // need the velocity difference for momentum and energy eqns: vDiff = (ions.velocity_vcgc[iDir] - neutrals.velocity_vcgc[iDir]); // ion - neutral drag (acceleration): - neutrals.acc_ion_collisions[iDir] = + neutrals.acc_ion_collisions[iDir] = beta / neutrals.rho_scgc % vDiff; // Frictional heating between ions and neutrals: - neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc + vDiff % vDiff; + neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc + vDiff + % vDiff; } + // multiply by collision frequencies and convert // energy change to temperature change: - neutrals.heating_ion_friction_scgc = - beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); - neutrals.heating_ion_heat_transfer_scgc = - beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_friction_scgc = + beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % + neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc = + beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % + neutrals.Cv_scgc); } else { energy.zeros(); @@ -92,36 +98,40 @@ void calc_ion_collisions(Neutrals &neutrals, // Momentum = sum(B * (Vi - Vn)) // Energy = sum_neutrals(sum__ions(B/(Mi + Mn) * (Ti - Tn) + Mi * (Vi-Vn)^2)) - neutrals.heating_ion_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc + - 3 * cKB * one_over_masses * + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc + + 3 * cKB * one_over_masses * (ions.temperature_scgc - neutrals.temperature_scgc); for (iDir = 0; iDir < 3; iDir++) { vDiff = (advected_ion.par_velocity_vcgc[iDir] + advected_ion.perp_velocity_vcgc[iDir] - advected_neutral.velocity_vcgc[iDir]); - neutrals.heating_ion_friction_scgc = - neutrals.heating_ion_friction_scgc + + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc + (advected_ion.mass * one_over_masses) * vDiff % vDiff; momentum[iDir] = momentum[iDir] + beta % vDiff; } // for each ion - // - neutrals.heating_ion_friction_scgc = + + // + neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc % beta; - neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc = neutrals.heating_ion_heat_transfer_scgc % beta; } // for each ion + // Divide by the mass density to get the acceleration for (iDir = 0; iDir < 3; iDir++) - advected_neutral.acc_ion_drag[iDir] = momentum[iDir]/rho_n; + advected_neutral.acc_ion_drag[iDir] = momentum[iDir] / rho_n; } // for each neutral + // Convert from energy into K/s: - neutrals.heating_ion_friction_scgc = - neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); - neutrals.heating_ion_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % + neutrals.Cv_scgc); } // bulk neutral winds report.exit(function); diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 44706375..79463307 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -31,6 +31,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.newDensity_scgc.ones(); tmp.velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.newVelocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + for (int iDir = 0; iDir < 3; iDir++) { tmp.velocity_vcgc[iDir].zeros(); tmp.newVelocity_vcgc[iDir].zeros(); @@ -46,6 +47,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { tmp.acc_neutral_friction = make_cube_vector(nLons, nLats, nAlts, 3); tmp.acc_ion_drag = make_cube_vector(nLons, nLats, nAlts, 3); + for (int iDir = 0; iDir < 3; iDir++) { tmp.acc_neutral_friction[iDir].zeros(); tmp.acc_ion_drag[iDir].zeros(); @@ -156,7 +158,7 @@ Neutrals::Neutrals(Grid grid, heating_ion_friction_scgc.set_size(nLons, nLats, nAlts); heating_ion_friction_scgc.zeros(); heating_ion_heat_transfer_scgc.set_size(nLons, nLats, nAlts); - heating_ion_heat_transfer_scgc.zeros(); + heating_ion_heat_transfer_scgc.zeros(); O_cool_scgc.set_size(nLons, nLats, nAlts); O_cool_scgc.zeros(); NO_cool_scgc.set_size(nLons, nLats, nAlts); @@ -168,7 +170,7 @@ Neutrals::Neutrals(Grid grid, acc_ion_collisions = make_cube_vector(nLons, nLats, nAlts, 3); // bulk coriolis acceleration: acc_coriolis = make_cube_vector(nLons, nLats, nAlts, 3); - + // bulk ion_neutral collisional acceleration: acc_sources_total = make_cube_vector(nLons, nLats, nAlts, 3); @@ -245,8 +247,10 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, Grid grid) { int64_t iNeutral, iSpecies; + for (iNeutral = 0; iNeutral < nSpeciesAdvect; iNeutral++) { iSpecies = species_to_advect[iNeutral]; + // Integrate with hydrostatic equilibrium up: for (int iAlt = iStart; iAlt < iEnd; iAlt++) { species[iSpecies].density_scgc.slice(iAlt) = @@ -327,6 +331,7 @@ bool Neutrals::check_for_nonfinites(std::string location) { bool didWork = true; isBad = !all_finite(density_scgc, "density_scgc"); + if (isBad) { report.error("non-finite found in neutral density!"); report.error("from location : " + location); @@ -334,18 +339,21 @@ bool Neutrals::check_for_nonfinites(std::string location) { } int64_t iSpecies; + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { isBad = !all_finite(species[iSpecies].density_scgc, - species[iSpecies].cName + " density"); + species[iSpecies].cName + " density"); + if (isBad) { report.error("non-finite found in " + - species[iSpecies].cName + " density!"); + species[iSpecies].cName + " density!"); report.error("from location : " + location); didWork = false; } } - + isBad = !all_finite(temperature_scgc, "temperature_scgc"); + if (isBad) { report.error("non-finite found in neutral temperature!"); report.error("from location : " + location); @@ -353,24 +361,27 @@ bool Neutrals::check_for_nonfinites(std::string location) { } isBad = !all_finite(velocity_vcgc, "velocity_vcgc"); + if (isBad) { report.error("non-finite found in neutral velocity!"); report.error("from location : " + location); didWork = false; } + didWork = sync_across_all_procs(didWork); for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { isBad = !all_finite(species[iSpecies].velocity_vcgc, - species[iSpecies].cName + " velocity!"); + species[iSpecies].cName + " velocity!"); + if (isBad) { - report.error("non-finite found in " + - species[iSpecies].cName + " velocity!"); + report.error("non-finite found in " + + species[iSpecies].cName + " velocity!"); report.error("from location : " + location); didWork = false; } } - + return didWork; } diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 6b92dd7b..e9308e23 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -204,27 +204,30 @@ bool Neutrals::set_lower_bcs(Grid grid, temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); arma_mat sh_ave; + // fill the lower ghost cells with a hydrostatic solution: for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { for (iAlt = nGCs - 2; iAlt >= 0; iAlt--) { - sh_ave = - (species[iSpecies].scale_height_scgc.slice(iAlt) + - species[iSpecies].scale_height_scgc.slice(iAlt + 1))/2; + sh_ave = + (species[iSpecies].scale_height_scgc.slice(iAlt) + + species[iSpecies].scale_height_scgc.slice(iAlt + 1)) / 2; - species[iSpecies].density_scgc.slice(iAlt) = + species[iSpecies].density_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt + 1) % exp(grid.dalt_lower_scgc.slice(iAlt) / sh_ave); } + for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { //std::cout << "before project : " << iAlt << " " << iSpecies << " " // << species[iSpecies].velocity_vcgc[2](10,10,2) << "\n"; - species[iSpecies].velocity_vcgc[2].slice(iAlt) = - species[iSpecies].velocity_vcgc[2].slice(iAlt+1); - //project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); + species[iSpecies].velocity_vcgc[2].slice(iAlt) = + species[iSpecies].velocity_vcgc[2].slice(iAlt + 1); + //project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); } } + // Force vertical velocities to be zero in the ghost cells: for (iDir = 0; iDir < 2; iDir++) { for (iAlt = 0; iAlt < nGCs; iAlt++) { diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index ce63849c..893ab86e 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -64,19 +64,19 @@ void Neutrals::update_temperature(Grid grid, Times time) { conduction1d.zeros(); conduction1d = solver_conduction(temp1d, - lambda1d, - rhocvr21d, - sources1d, - dalt1d, - dt, - nGCs, - false); + lambda1d, + rhocvr21d, + sources1d, + dalt1d, + dt, + nGCs, + false); temperature_scgc.tube(iLon, iLat) = conduction1d; // Store the difference (as a rate), so we can output it later // if we want: conduction_scgc.tube(iLon, iLat) = - (conduction1d - temp1d)/dt - sources1d; + (conduction1d - temp1d) / dt - sources1d; } // lat } // lon diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 98bcd7ce..25fd5257 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -38,6 +38,7 @@ bool Neutrals::initial_conditions(Grid grid, if (input.get_do_restart()) { report.print(1, "Restarting! Reading neutral files!"); didWork = restart_file(input.get_restartin_dir(), DoRead); + if (!didWork) report.error("Reading Restart for Neutrals Failed!!!"); } else { @@ -148,9 +149,10 @@ bool Neutrals::initial_conditions(Grid grid, temp1d[iAlt] = (1.0 - r) * initial_temperatures[iA] + (r) * initial_temperatures[iA + 1]; - } + } } } + temperature_scgc.tube(iLon, iLat) = temp1d; } } @@ -168,13 +170,15 @@ bool Neutrals::initial_conditions(Grid grid, // Set the lower boundary condition: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); } + calc_scale_height(grid); set_lower_bcs(grid, time, indices); + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) - fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); - + fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); + } // type = planet } diff --git a/src/neutrals_momentum_friction.cpp b/src/neutrals_momentum_friction.cpp index e211ed01..f961236c 100644 --- a/src/neutrals_momentum_friction.cpp +++ b/src/neutrals_momentum_friction.cpp @@ -4,7 +4,7 @@ #include "aether.h" // --------------------------------------------------------------------- -// This calculates the velocities in one cell. The inputs are the +// This calculates the velocities in one cell. The inputs are the // updated velocities given all of the acceleration terms. This is the right // side of the equation (source terms * dt + Vold). The velocities // of all species are solved for together, since they are interdependent. @@ -12,8 +12,9 @@ // implicit solver. There is a semi-implicit solver below. // --------------------------------------------------------------------- -arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iAlt, - precision_t dt, arma_vec &vels) { +arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, + int64_t iAlt, + precision_t dt, arma_vec &vels) { std::string function = "neutral_friction_one_cell"; static int iFunction = -1; report.enter(function, iFunction); @@ -53,6 +54,7 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA } // iSpec loop matrix = -1 * coefmatrix * dt; + // Fill in diagonal of matrix: for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) matrix(iSpecies, iSpecies) = 1 - sum(coefmatrix.row(iSpecies)); @@ -72,7 +74,7 @@ arma_vec Neutrals::calc_friction_one_cell(int64_t iLon, int64_t iLat, int64_t iA // since there needs to be a full matrix solve in each cell, but it ties // the velocities together. // --------------------------------------------------------------------- - + void Neutrals::calc_neutral_friction_implicit(precision_t dt) { std::string function = "calc_neutral_friction"; @@ -91,6 +93,7 @@ void Neutrals::calc_neutral_friction_implicit(precision_t dt) { for (iDir = 0; iDir < 3; iDir++) species[iSpecies].acc_neutral_friction[iDir].zeros(); } + if (input.get_advection_neutrals_vertical() != "hydro") { arma_vec vels(nSpeciesAdvect, fill::zeros); @@ -110,23 +113,25 @@ void Neutrals::calc_neutral_friction_implicit(precision_t dt) { // Only worry about the vertical direction for now: iDir = 2; //for (iDir = 0; iDir < 3; iDir++) { - vels.zeros(); - - // The velocities are just after the vertical solver, so the velocities are - // the source terms for the friction solver. - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - vels(iSpecies) = - species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt); - } - - // = neutral_friction_one_cell(iLon, iLat, iAlt, vels); - new_vels = calc_friction_one_cell(iLon, iLat, iAlt, dt, vels); - - for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { - iSpecies_ = species_to_advect[iSpecies]; - species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt) = new_vels(iSpecies); - } // iSpeciesAdvect + vels.zeros(); + + // The velocities are just after the vertical solver, so the velocities are + // the source terms for the friction solver. + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + vels(iSpecies) = + species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, iAlt); + } + + // = neutral_friction_one_cell(iLon, iLat, iAlt, vels); + new_vels = calc_friction_one_cell(iLon, iLat, iAlt, dt, vels); + + for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { + iSpecies_ = species_to_advect[iSpecies]; + species[iSpecies_].newVelocity_vcgc[iDir](iLon, iLat, + iAlt) = new_vels(iSpecies); + } // iSpeciesAdvect + //} // for direction } // for long } // for lat @@ -141,7 +146,7 @@ void Neutrals::calc_neutral_friction_implicit(precision_t dt) { // --------------------------------------------------------------------- -// If we are solving this system semi-implicitly, we don't need to do a +// If we are solving this system semi-implicitly, we don't need to do a // matrix solve in each cell, so we can calculate all of the variables // before doing the time-stepping in the vertical solver. // semi-implicit means using the current velocity on both the left and @@ -167,9 +172,11 @@ void Neutrals::calc_neutral_friction_coefs() { // Initialize all of the accelerations to zero: for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies_].neutral_friction_coef.zeros(); + for (iDir = 0; iDir < 3; iDir++) species[iSpecies].acc_neutral_friction[iDir].zeros(); } + if (input.get_advection_neutrals_vertical() != "hydro") { for (iSpecies = 0; iSpecies < nSpeciesAdvect; iSpecies++) { @@ -179,18 +186,21 @@ void Neutrals::calc_neutral_friction_coefs() { cKB * temperature_scgc / species[iSpecies_].mass; + for (jSpecies = 0; jSpecies < nSpeciesAdvect; jSpecies++) { jSpecies_ = species_to_advect[jSpecies]; + if (iSpecies_ == jSpecies_) continue; + tpower = pow(temperature_scgc, species[iSpecies_].diff_exp[jSpecies_]); // NEED TO REMOVE /100!!! - coef = ktom % species[jSpecies_].density_scgc / - (species[iSpecies_].diff0[jSpecies_] * tpower) / 100.0; - species[iSpecies_].neutral_friction_coef = + coef = ktom % species[jSpecies_].density_scgc / + (species[iSpecies_].diff0[jSpecies_] * tpower) / 100.0; + species[iSpecies_].neutral_friction_coef = species[iSpecies_].neutral_friction_coef + coef; iDir = 2; - species[iSpecies_].acc_neutral_friction[iDir] = + species[iSpecies_].acc_neutral_friction[iDir] = species[iSpecies_].acc_neutral_friction[iDir] + coef % species[iSpecies_].velocity_vcgc[iDir]; } diff --git a/src/neutrals_momentum_viscosity.cpp b/src/neutrals_momentum_viscosity.cpp index 9782742a..4efaaaee 100644 --- a/src/neutrals_momentum_viscosity.cpp +++ b/src/neutrals_momentum_viscosity.cpp @@ -55,33 +55,33 @@ void Neutrals::update_horizontal_velocity(Grid grid, Times time) { // std::cout << " -> temp before: "; // display_vector(temperature_scgc.tube(11,2)); //} - + for (iDir = 0; iDir < 2; iDir++) { for (iLon = 0; iLon < nLons; iLon++) { - for (iLat = 0; iLat < nLats; iLat++) { - - vel1d = velocity_vcgc[iDir].tube(iLon, iLat); - lambda1d = lambda3d.tube(iLon, iLat); - rhor21d = rhor23d.tube(iLon, iLat); - sources1d.zeros(); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); - visc1d.zeros(); - - visc1d = solver_conduction(vel1d, - lambda1d, - rhor21d, - sources1d, - dalt1d, - dt, - nGCs, - false); - velocity_vcgc[iDir].tube(iLon, iLat) = visc1d; - - // Store the difference (as a rate), so we can output it later - // if we want: - //conduction_scgc.tube(iLon, iLat) = - // (conduction1d - temp1d)/dt - sources1d; - } // lat + for (iLat = 0; iLat < nLats; iLat++) { + + vel1d = velocity_vcgc[iDir].tube(iLon, iLat); + lambda1d = lambda3d.tube(iLon, iLat); + rhor21d = rhor23d.tube(iLon, iLat); + sources1d.zeros(); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + visc1d.zeros(); + + visc1d = solver_conduction(vel1d, + lambda1d, + rhor21d, + sources1d, + dalt1d, + dt, + nGCs, + false); + velocity_vcgc[iDir].tube(iLon, iLat) = visc1d; + + // Store the difference (as a rate), so we can output it later + // if we want: + //conduction_scgc.tube(iLon, iLat) = + // (conduction1d - temp1d)/dt - sources1d; + } // lat } // lon } @@ -89,7 +89,7 @@ void Neutrals::update_horizontal_velocity(Grid grid, Times time) { // std::cout << " -> temp after: "; // display_vector(temperature_scgc.tube(11,2)); //} - + } // if nAlts == 1 + 2*GCs report.exit(function); diff --git a/src/output.cpp b/src/output.cpp index a0c0d4bd..2c0e58f6 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -43,7 +43,7 @@ std::string get_filename_from_type(std::string type_output) { return filename; -} +} // ----------------------------------------------------------------------------- // Fills output containers and outputs them for common output types diff --git a/src/output_netcdf.cpp b/src/output_netcdf.cpp index beff7c9c..1c3e48df 100644 --- a/src/output_netcdf.cpp +++ b/src/output_netcdf.cpp @@ -161,7 +161,7 @@ bool OutputContainer::read_container_netcdf() { bool OutputContainer::write_container_netcdf() { bool didWork = true; - std::string whole_filename = directory+ filename + ".nc"; + std::string whole_filename = directory + filename + ".nc"; std::string UNITS = "units"; std::string LONG_NAME = "long_name"; diff --git a/src/quadtree.cpp b/src/quadtree.cpp index aba15239..714abb5f 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -2,7 +2,7 @@ // Full license can be found in License.md // Need to allow more types of grids. We have two axes of grids, really: -// - Neutral +// - Neutral // - Ion // Within each of those, we can have several types of grids: // - Cubesphere, this has 6 root nodes (2 polar, 4 equatorial) @@ -47,13 +47,15 @@ void Quadtree::build(std::string gridtype) { rights = CubeSphere::RIGHTS; ups = CubeSphere::UPS; IsCubeSphere = true; - } + } + if (grid_input.shape == "sphere") { origins = Sphere::ORIGINS; rights = Sphere::RIGHTS; ups = Sphere::UPS; IsSphere = true; } + if (grid_input.shape == "dipole") { origins = Sphere::ORIGINS; rights = Sphere::RIGHTS; diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 85b6dbfe..51df35f4 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -13,9 +13,9 @@ // --------------------------------------------------------- arma_vec limiter_mc(arma_vec &left, - arma_vec &right, - int64_t nPts, - int64_t nGCs) { + arma_vec &right, + int64_t nPts, + int64_t nGCs) { precision_t beta = 0.8; @@ -34,16 +34,19 @@ arma_vec limiter_mc(arma_vec &left, if (left(i) > 0 && right(i) > 0) { if (right(i) < limited(i)) limited(i) = right(i); - if (combined(i) < limited(i)) - limited(i) = combined(i); + + if (combined(i) < limited(i)) + limited(i) = combined(i); } else { - if (right(i) > limited(i)) - limited(i) = right(i); - if (combined(i) > limited(i)) - limited(i) = combined(i); + if (right(i) > limited(i)) + limited(i) = right(i); + + if (combined(i) > limited(i)) + limited(i) = combined(i); } } } + return limited; } @@ -54,9 +57,9 @@ arma_vec limiter_mc(arma_vec &left, // --------------------------------------------------------- arma_vec calc_grad_1d(arma_vec &values, - arma_vec &x, - int64_t nPts, - int64_t nGCs) { + arma_vec &x, + int64_t nPts, + int64_t nGCs) { arma_vec gradients = values * 0.0; arma_vec gradL = values * 0.0; @@ -70,24 +73,25 @@ arma_vec calc_grad_1d(arma_vec &values, arma_vec hv = values * 0.0; i = nGCs - 1; - h = 2.0 / (x(i+1) - x(i)); - gradR(i) = h * (factor1 * (values(i+1) - values(i)) - - factor2 * (values(i+2) - values(i-1))); - gradL(i) = (values(i) - values(i-1)) / (x(i) - x(i-1)); + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); + gradL(i) = (values(i) - values(i - 1)) / (x(i) - x(i - 1)); for (i = nGCs; i < nPts + nGCs; i++) { - h = 2.0 / (x(i) - x(i-1)); - gradL(i) = h * (factor1 * (values(i) - values(i-1)) - - factor2 * (values(i+1) - values(i-2))); - h = 2.0 / (x(i+1) - x(i)); - gradR(i) = h * (factor1 * (values(i+1) - values(i)) - - factor2 * (values(i+2) - values(i-1))); + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); } + i = nPts + nGCs; - h = 2.0 / (x(i) - x(i-1)); - gradL(i) = h * (factor1 * (values(i) - values(i-1)) - - factor2 * (values(i+1) - values(i-2))); - gradR(i) = (values(i+1) - values(i)) / (x(i+1) - x(i)); + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + gradR(i) = (values(i + 1) - values(i)) / (x(i + 1) - x(i)); gradients = limiter_mc(gradL, gradR, nPts, nGCs); @@ -100,9 +104,9 @@ arma_vec calc_grad_1d(arma_vec &values, // --------------------------------------------------------- arma_mat calc_grad(arma_mat values, - arma_mat x, - int64_t nGCs, - bool DoX) { + arma_mat x, + int64_t nGCs, + bool DoX) { arma_mat v2d, x2d; @@ -121,7 +125,8 @@ arma_mat calc_grad(arma_mat values, int64_t nPts = nX - 2 * nGCs; arma_vec values1d(nX); arma_vec x1d(nX); - for (int64_t j = 1; j < nY-1; j++) { + + for (int64_t j = 1; j < nY - 1; j++) { values1d = v2d.col(j); x1d = x2d.col(j); grad2d.col(j) = calc_grad_1d(values1d, x1d, nPts, nGCs); @@ -129,11 +134,12 @@ arma_mat calc_grad(arma_mat values, arma_mat gradients; - if (DoX) { + if (DoX) gradients = grad2d; - } else { + + else gradients = grad2d.t(); - } + return gradients; } @@ -144,10 +150,10 @@ arma_mat calc_grad(arma_mat values, // --------------------------------------------------------- arma_mat project_from_left(arma_mat values, - arma_mat gradients, - arma_mat x_centers, - arma_mat x_edges, - int64_t nGCs) { + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { int64_t nX = values.n_rows; int64_t nY = values.n_cols; @@ -160,12 +166,14 @@ arma_mat project_from_left(arma_mat values, for (int64_t j = 0; j < nY; j++) { for (int64_t i = 1; i < nX - 1; i++) { projected(i + 1, j) = values(i, j) + - gradients(i, j) * (x_edges(i + 1, j) - x_centers(i, j)); + gradients(i, j) * (x_edges(i + 1, j) - x_centers(i, j)); } + projected(1, j) = projected(2, j); projected(0, j) = projected(1, j); projected(nX, j) = projected(nX - 1, j); } + return projected; } @@ -177,10 +185,10 @@ arma_mat project_from_left(arma_mat values, // --------------------------------------------------------- arma_mat project_from_right(arma_mat values, - arma_mat gradients, - arma_mat x_centers, - arma_mat x_edges, - int64_t nGCs) { + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { int64_t nX = values.n_rows; int64_t nY = values.n_cols; @@ -192,12 +200,14 @@ arma_mat project_from_right(arma_mat values, for (int64_t j = 0; j < nY; j++) { for (int64_t i = 1; i < nX - 1; i++) { projected(i, j) = values(i, j) + - gradients(i, j) * (x_edges(i, j) - x_centers(i, j)); + gradients(i, j) * (x_edges(i, j) - x_centers(i, j)); } + projected(0, j) = projected(1, j); projected(nX - 1, j) = projected(nX - 2, j); projected(nX, j) = projected(nX - 1, j); } + return projected; } @@ -206,9 +216,9 @@ arma_mat project_from_right(arma_mat values, // --------------------------------------------------------- projection_struct project_to_edges(arma_mat &values, - arma_mat &x_centers, arma_mat &x_edges, - arma_mat &y_centers, arma_mat &y_edges, - int64_t nGCs) { + arma_mat &x_centers, arma_mat &x_edges, + arma_mat &y_centers, arma_mat &y_edges, + int64_t nGCs) { int64_t nX = values.n_rows; int64_t nY = values.n_cols; @@ -219,16 +229,16 @@ projection_struct project_to_edges(arma_mat &values, proj.gradDU = calc_grad(values.t(), y_centers.t(), nGCs, true).t(); proj.R = project_from_left(values, proj.gradLR, - x_centers, x_edges, nGCs); + x_centers, x_edges, nGCs); // Left side of edge from left proj.L = project_from_right(values, proj.gradLR, - x_centers, x_edges, nGCs); + x_centers, x_edges, nGCs); // Up side of edge from down (left) proj.U = project_from_left(values.t(), proj.gradDU.t(), - y_centers.t(), y_edges.t(), nGCs).t(); + y_centers.t(), y_edges.t(), nGCs).t(); // Down side of edge from up (right) proj.D = project_from_right(values.t(), proj.gradDU.t(), - y_centers.t(), y_edges.t(), nGCs).t(); + y_centers.t(), y_edges.t(), nGCs).t(); return proj; } @@ -238,10 +248,10 @@ projection_struct project_to_edges(arma_mat &values, // --------------------------------------------------------- precision_t calc_dt(arma_mat &xWidth, - arma_mat &yWidth, - arma_mat &wsLR, - arma_mat &wsDU, - int64_t nGCs) { + arma_mat &yWidth, + arma_mat &wsLR, + arma_mat &wsDU, + int64_t nGCs) { int64_t nX = xWidth.n_rows; int64_t nY = yWidth.n_cols; @@ -252,14 +262,19 @@ precision_t calc_dt(arma_mat &xWidth, for (int64_t j = nGCs; j < nY - nGCs; j++) { for (int64_t i = nGCs; i < nX - nGCs; i++) { - wsX = (wsLR(i+1, j) + wsLR(i, j))/2; + wsX = (wsLR(i + 1, j) + wsLR(i, j)) / 2; dtX = xWidth(i, j) / wsX; - wsY = (wsDU(i, j+1) + wsDU(i, j))/2; + wsY = (wsDU(i, j + 1) + wsDU(i, j)) / 2; dtY = yWidth(i, j) / wsY; - if (dtX < dt) dt = dtX; - if (dtY < dt) dt = dtY; + + if (dtX < dt) + dt = dtX; + + if (dtY < dt) + dt = dtY; } } + return dt; } @@ -281,7 +296,7 @@ void advect(Grid &grid, projection_struct tempP; projection_struct gammaP; - precision_t gamma = 5.0/3.0; + precision_t gamma = 5.0 / 3.0; precision_t dt = time.get_dt(); int64_t nGCs = grid.get_nGCs(); @@ -331,14 +346,15 @@ void advect(Grid &grid, for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { if (report.test_verbose(3)) - std::cout << "Advection: Working with iAlt: " << iAlt << "\n"; + std::cout << "Advection: Working with iAlt: " << iAlt << "\n"; xVel = neutrals.velocity_vcgc[0].slice(iAlt); yVel = neutrals.velocity_vcgc[1].slice(iAlt); rho = neutrals.rho_scgc.slice(iAlt); // this is "e", or temperature expressed as an energy gamma2d = neutrals.gamma_scgc.slice(iAlt); - t_to_e = 1.0 / (gamma2d - 1.0) * cKB / neutrals.mean_major_mass_scgc.slice(iAlt); + t_to_e = 1.0 / (gamma2d - 1.0) * cKB / neutrals.mean_major_mass_scgc.slice( + iAlt); temp = t_to_e % neutrals.temperature_scgc.slice(iAlt); // ------------------------------------------------ @@ -353,10 +369,10 @@ void advect(Grid &grid, xMomentum = rho % xVel; yMomentum = rho % yVel; - x = grid.x_Center.slice(iAlt) * grid.radius_scgc(1,1,iAlt); - y = grid.y_Center.slice(iAlt) * grid.radius_scgc(1,1,iAlt); - xEdges = grid.x_Left.slice(iAlt) * grid.radius_scgc(1,1,iAlt); - yEdges = grid.y_Down.slice(iAlt) * grid.radius_scgc(1,1,iAlt); + x = grid.x_Center.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + y = grid.y_Center.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + xEdges = grid.x_Left.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + yEdges = grid.y_Down.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); @@ -431,16 +447,20 @@ void advect(Grid &grid, wsU = sqrt(velU2) + sqrt(gammaP.U % (gammaP.U - 1) % tempP.U); wsLR = wsR; + for (int64_t i = 0; i < nX + 1; i++) { for (int64_t j = 0; j < nY; j++) { - if (wsL(i, j) > wsLR(i, j)) wsLR(i, j) = wsL(i, j); + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); } } wsDU = wsD; + for (int64_t i = 0; i < nX; i++) { for (int64_t j = 0; j < nY + 1; j++) { - if (wsU(i, j) > wsDU(i, j)) wsDU(i, j) = wsU(i, j); + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); } } @@ -473,40 +493,40 @@ void advect(Grid &grid, // Update values: report.print(3, "Advection: Updating equations of state"); - area = grid.cell_area.slice(iAlt) * grid.radius2_scgc(1,1,iAlt); - yWidth = grid.dy_Left.slice(iAlt) * grid.radius_scgc(1,1,iAlt); - xWidth = grid.dx_Down.slice(iAlt) * grid.radius_scgc(1,1,iAlt); - - geometry = + area = grid.cell_area.slice(iAlt) * grid.radius2_scgc(1, 1, iAlt); + yWidth = grid.dy_Left.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + xWidth = grid.dx_Down.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + + geometry = sin(grid.geoLat_scgc.slice(iAlt)) / cos(grid.geoLat_scgc.slice(iAlt)) / - grid.radius_scgc(1,1,iAlt); - + grid.radius_scgc(1, 1, iAlt); + for (int64_t j = nGCs; j < nY - nGCs; j++) { for (int64_t i = nGCs; i < nX - nGCs; i++) { - //if (i == nGCs) cout << "j = " << j << " " << xWidth(i,j) << "\n"; - rho(i,j) = rho(i,j) - dt * - (yWidth(i+1,j) * eq1FluxLR(i+1,j) - - yWidth(i,j) * eq1FluxLR(i,j) + - xWidth(i,j+1) * eq1FluxDU(i,j+1) - - xWidth(i,j) * eq1FluxDU(i,j)) / area(i,j); - xMomentum(i,j) = xMomentum(i,j) - dt * - ((yWidth(i+1,j) * eq2FluxLR(i+1,j) - - yWidth(i,j) * eq2FluxLR(i,j) + - xWidth(i,j+1) * eq2FluxDU(i,j+1) - - xWidth(i,j) * eq2FluxDU(i,j)) / area(i,j) - - geometry(i,j) * eq2Flux(i,j)); - yMomentum(i,j) = yMomentum(i,j) - dt * - ((yWidth(i+1,j) * eq3FluxLR(i+1,j) - - yWidth(i,j) * eq3FluxLR(i,j) + - xWidth(i,j+1) * eq3FluxDU(i,j+1) - - xWidth(i,j) * eq3FluxDU(i,j)) / area(i,j) + - geometry(i,j) * eq3Flux(i,j)); - totalE(i,j) = totalE(i,j) - dt * - (yWidth(i+1,j) * eq4FluxLR(i+1,j) - - yWidth(i,j) * eq4FluxLR(i,j) + - xWidth(i,j+1) * eq4FluxDU(i,j+1) - - xWidth(i,j) * eq4FluxDU(i,j)) / area(i,j); + //if (i == nGCs) cout << "j = " << j << " " << xWidth(i,j) << "\n"; + rho(i, j) = rho(i, j) - dt * + (yWidth(i + 1, j) * eq1FluxLR(i + 1, j) - + yWidth(i, j) * eq1FluxLR(i, j) + + xWidth(i, j + 1) * eq1FluxDU(i, j + 1) - + xWidth(i, j) * eq1FluxDU(i, j)) / area(i, j); + xMomentum(i, j) = xMomentum(i, j) - dt * + ((yWidth(i + 1, j) * eq2FluxLR(i + 1, j) - + yWidth(i, j) * eq2FluxLR(i, j) + + xWidth(i, j + 1) * eq2FluxDU(i, j + 1) - + xWidth(i, j) * eq2FluxDU(i, j)) / area(i, j) - + geometry(i, j) * eq2Flux(i, j)); + yMomentum(i, j) = yMomentum(i, j) - dt * + ((yWidth(i + 1, j) * eq3FluxLR(i + 1, j) - + yWidth(i, j) * eq3FluxLR(i, j) + + xWidth(i, j + 1) * eq3FluxDU(i, j + 1) - + xWidth(i, j) * eq3FluxDU(i, j)) / area(i, j) + + geometry(i, j) * eq3Flux(i, j)); + totalE(i, j) = totalE(i, j) - dt * + (yWidth(i + 1, j) * eq4FluxLR(i + 1, j) - + yWidth(i, j) * eq4FluxLR(i, j) + + xWidth(i, j + 1) * eq4FluxDU(i, j + 1) - + xWidth(i, j) * eq4FluxDU(i, j)) / area(i, j); } } @@ -517,42 +537,45 @@ void advect(Grid &grid, neutrals.velocity_vcgc[1].slice(iAlt) = yVel; temp = (totalE / rho - 0.5 * (xVel % xVel + yVel % yVel)) / t_to_e; temp.clamp(200, 2000); - + //precision_t fac, dm, dp; - + for (int64_t j = nGCs; j < nY - nGCs; j++) { for (int64_t i = nGCs; i < nX - nGCs; i++) { - //fac = 1.0; - //if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { - // fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); - //} - //dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); - //dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); - //if (temp(i,j) < dm) temp(i,j) = dm; - //if (temp(i,j) > dp) temp(i,j) = dp; - neutrals.temperature_scgc(i,j,iAlt) = temp(i,j); - - //dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); - //dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); - //if (rho(i,j) < dm) rho(i,j) = dm; - //if (rho(i,j) > dp) rho(i,j) = dp; - neutrals.rho_scgc(i,j,iAlt) = rho(i,j); + //fac = 1.0; + //if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { + // fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); + //} + //dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); + //dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); + //if (temp(i,j) < dm) temp(i,j) = dm; + //if (temp(i,j) > dp) temp(i,j) = dp; + neutrals.temperature_scgc(i, j, iAlt) = temp(i, j); + + //dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); + //dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); + //if (rho(i,j) < dm) rho(i,j) = dm; + //if (rho(i,j) > dp) rho(i,j) = dp; + neutrals.rho_scgc(i, j, iAlt) = rho(i, j); } } + if (report.test_verbose(3) && iAlt == 8) { - std::cout << "end t : " << neutrals.temperature_scgc.slice(iAlt).min() << " " << neutrals.temperature_scgc.slice(iAlt).max() << "\n"; + std::cout << "end t : " << neutrals.temperature_scgc.slice( + iAlt).min() << " " << neutrals.temperature_scgc.slice(iAlt).max() << "\n"; std::cout << "end temp : " << temp.min() << " " << temp.max() << "\n"; std::cout << "end xVel : " << xVel.min() << " " << xVel.max() << "\n"; std::cout << "end yVel : " << yVel.min() << " " << yVel.max() << "\n"; } } + neutrals.calc_density_from_mass_concentration(); // Assign bulk horizontal velocity to all species: for (int64_t iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) for (int64_t iDir = 0; iDir < 2; iDir++) neutrals.species[iSpecies].velocity_vcgc[iDir] = neutrals.velocity_vcgc[iDir]; - + report.exit(function); return; } diff --git a/src/solver_conduction.cpp b/src/solver_conduction.cpp index 3cc7639c..7616c7b2 100644 --- a/src/solver_conduction.cpp +++ b/src/solver_conduction.cpp @@ -58,10 +58,10 @@ arma_vec solver_conduction(arma_vec value, arma_vec d = -1.0 * (value / m + source % front * dt); // Lower BCs (fixed value): - a(nGCs-1) = 0.0; - b(nGCs-1) = -1.0; - c(nGCs-1) = 0.0; - d(nGCs-1) = -1.0 * value(nGCs-1); + a(nGCs - 1) = 0.0; + b(nGCs - 1) = -1.0; + c(nGCs - 1) = 0.0; + d(nGCs - 1) = -1.0 * value(nGCs - 1); // Upper BCs: // This assumes a constant-gradient BC (need to change for ion and ele temps. @@ -93,12 +93,14 @@ arma_vec solver_conduction(arma_vec value, if (return_diff) { conduction = result - value; + for (i = 0; i < nGCs; i++) { conduction(i) = 0.0; conduction(nPts - i - 1) = 0.0; } } else { conduction = result; + for (i = 0; i < nGCs; i++) { conduction(i) = value(i); conduction(nPts - nGCs + i) = conduction(nPts - nGCs - 1); diff --git a/src/solver_coriolis.cpp b/src/solver_coriolis.cpp index 46411fd5..7bb6cd1b 100644 --- a/src/solver_coriolis.cpp +++ b/src/solver_coriolis.cpp @@ -15,8 +15,8 @@ std::vector coriolis(std::vector velocity, arma_cube lat_scgc) { std::vector coriolis_vec(3); coriolis_vec[0] = ( - 2 * rotation_rate * velocity[1] % sin(lat_scgc) - - 2 * rotation_rate * velocity[2] % cos(lat_scgc)); + 2 * rotation_rate * velocity[1] % sin(lat_scgc) - + 2 * rotation_rate * velocity[2] % cos(lat_scgc)); coriolis_vec[1] = -2 * rotation_rate * velocity[0] % sin(lat_scgc); coriolis_vec[2] = 2 * rotation_rate * cos(lat_scgc) % velocity[1] * 0.0; return coriolis_vec; diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 8702fe89..e88231ad 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -179,10 +179,11 @@ arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { grid.MeshCoef1s3rdp4.slice(iAlt) % value.slice(iAlt + 4) + grid.MeshCoef1s3rdp5.slice(iAlt) % value.slice(iAlt + 5); */ - gradient = (value.slice(iAlt + 2) - value.slice(iAlt + 1)) / - grid.dalt_lower_scgc.slice(iAlt + 2); + gradient = (value.slice(iAlt + 2) - value.slice(iAlt + 1)) / + grid.dalt_lower_scgc.slice(iAlt + 2); - valueOut = value.slice(iAlt + 1) - gradient % grid.dalt_lower_scgc.slice(iAlt + 1); + valueOut = value.slice(iAlt + 1) - gradient % grid.dalt_lower_scgc.slice( + iAlt + 1); return valueOut; } diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 4343f49a..e533091f 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -76,7 +76,7 @@ void calc_facevalues_alts_rusanov(Grid &grid, for (iY = nGCs; iY < nYs - nGCs; iY++) dVarLimited(iX, iY, iZ) = limiter_mc(dVarUp(iX, iY), dVarDown(iX, iY), beta); - + for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { outLeft.slice(iZ) = inVar.slice(iZ - 1) + @@ -85,23 +85,24 @@ void calc_facevalues_alts_rusanov(Grid &grid, inVar.slice(iZ) - 0.5 * dVarLimited.slice(iZ) % grid.dalt_lower_scgc.slice(iZ); } + /* if (iProc == 11) std::cout << "facevalues : " - << inVar(7,19,17) << " " - << inVar(7,19,18) << " " - << inVar(7,19,19) << " " - << inVar(7,19,20) << " " - << dVarLimited(7,19,18) << " " - << grid.dalt_lower_scgc(7,19,17) << " " - << outRight(7, 19, 17) << " " - << outRight(7, 19, 18) << " " - << outLeft(7, 19, 17) << " " - << outLeft(7, 19, 18) << " " - << dVarUp(7, 19) << " " - << dVarDown(7, 19) << "\n"; + << inVar(7,19,17) << " " + << inVar(7,19,18) << " " + << inVar(7,19,19) << " " + << inVar(7,19,20) << " " + << dVarLimited(7,19,18) << " " + << grid.dalt_lower_scgc(7,19,17) << " " + << outRight(7, 19, 17) << " " + << outRight(7, 19, 18) << " " + << outLeft(7, 19, 17) << " " + << outLeft(7, 19, 18) << " " + << dVarUp(7, 19) << " " + << dVarDown(7, 19) << "\n"; */ - + return; } @@ -142,15 +143,16 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, (varLeft.slice(iZ + 1) + varRight.slice(iZ + 1) - varLeft.slice(iZ) - varRight.slice(iZ)) / grid.dalt_center_scgc.slice(iZ); + /* if (iProc == 11) std::cout << "calc_grad : " - << varLeft(7, 19, 17) << " " - << varLeft(7, 19, 18) << " " - << varRight(7, 19, 17) << " " - << varRight(7, 19, 18) << " " - << grid.dalt_center_scgc(7, 19, 17) << " " - << outGrad(7, 19, 17) << "\n"; + << varLeft(7, 19, 17) << " " + << varLeft(7, 19, 18) << " " + << varRight(7, 19, 17) << " " + << varRight(7, 19, 18) << " " + << grid.dalt_center_scgc(7, 19, 17) << " " + << outGrad(7, 19, 17) << "\n"; */ for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { for (iX = nGCs; iX < nXs - nGCs; iX++) @@ -284,9 +286,8 @@ void Neutrals::solver_vertical_rusanov(Grid grid, bool useImplicitFriction = input.get_advection_neutrals_implicitfriction(); - if (useImplicitFriction) { + if (useImplicitFriction) calc_neutral_friction_coefs(); - } // ----------------------------------------------------------- // Now calculate new states: @@ -311,20 +312,20 @@ void Neutrals::solver_vertical_rusanov(Grid grid, + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); - accTotal = - dt * grid.gravity_vcgc[2] - - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass - + dt * diffVertVel_s[iSpecies] - - dt * species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] - + dt * v2or - + dt * species[iSpecies].acc_eddy - + dt * acc_coriolis[2] - + dt * grid.cent_acc_vcgc[2]; + accTotal = + dt * grid.gravity_vcgc[2] + - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass + + dt * diffVertVel_s[iSpecies] + - dt * species[iSpecies].velocity_vcgc[2] % gradVertVel_s[iSpecies] + + dt * v2or + + dt * species[iSpecies].acc_eddy + + dt * acc_coriolis[2] + + dt * grid.cent_acc_vcgc[2]; // vertical velocities: if (useImplicitFriction) { species[iSpecies].newVelocity_vcgc[2] = - (species[iSpecies].velocity_vcgc[2] + accTotal + + (species[iSpecies].velocity_vcgc[2] + accTotal + dt * species[iSpecies].acc_neutral_friction[2]) / (1.0 + dt * species[iSpecies].neutral_friction_coef); } else { @@ -337,6 +338,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; } } + if (!useImplicitFriction) calc_neutral_friction_implicit(dt); @@ -350,7 +352,9 @@ void Neutrals::solver_vertical_rusanov(Grid grid, for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) - species[iSpecies].newVelocity_vcgc[2].clamp(-maxVerticalVelocity, maxVerticalVelocity); + species[iSpecies].newVelocity_vcgc[2].clamp(-maxVerticalVelocity, + maxVerticalVelocity); + newTemperature_scgc.clamp(150, 1e32); for (iX = nGCs; iX < nXs - nGCs; iX++) @@ -373,6 +377,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } bool doPrintThis = false; + if (doPrintThis) { iX = 2; iY = 2; @@ -380,33 +385,36 @@ void Neutrals::solver_vertical_rusanov(Grid grid, mass = species[iSpecies].mass; for (int iAlt = 0; iAlt < 20; iAlt++) { - std::cout << iAlt << " " - << log(species[iSpecies].density_scgc(iX, iY,iAlt)) << " " - << temperature_scgc(iX,iY,iAlt) << " " - << species[iSpecies].velocity_vcgc[2](iX,iY,iAlt) << " " - << temperature_scgc(iX,iY,iAlt) * gradLogN_s[iSpecies](iX,iY,iAlt) * cKB / mass << " " - << gradTemp(iX,iY,iAlt) * cKB / mass << " " - << grid.gravity_vcgc[2](iX,iY,iAlt) << "\n"; + std::cout << iAlt << " " + << log(species[iSpecies].density_scgc(iX, iY, iAlt)) << " " + << temperature_scgc(iX, iY, iAlt) << " " + << species[iSpecies].velocity_vcgc[2](iX, iY, iAlt) << " " + << temperature_scgc(iX, iY, iAlt) * gradLogN_s[iSpecies](iX, iY, + iAlt) * cKB / mass << " " + << gradTemp(iX, iY, iAlt) * cKB / mass << " " + << grid.gravity_vcgc[2](iX, iY, iAlt) << "\n"; } } + //calc_neutral_friction(); -/* - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - if (species[iSpecies].DoAdvect) { - species[iSpecies].velocity_vcgc[2] = - species[iSpecies].velocity_vcgc[2] + dt * - species[iSpecies].acc_neutral_friction[2]; + /* + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + if (species[iSpecies].DoAdvect) { + species[iSpecies].velocity_vcgc[2] = + species[iSpecies].velocity_vcgc[2] + dt * + species[iSpecies].acc_neutral_friction[2]; + } } - } -*/ + */ calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) { - velocity_vcgc[2] = velocity_vcgc[2] + - species[iSpecies].mass * species[iSpecies].density_scgc % - species[iSpecies].velocity_vcgc[2] / rho_scgc; + velocity_vcgc[2] = velocity_vcgc[2] + + species[iSpecies].mass * species[iSpecies].density_scgc % + species[iSpecies].velocity_vcgc[2] / rho_scgc; } report.exit(function); @@ -419,7 +427,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, // -------------------------------------------------------------------------- void Ions::solver_vertical_rusanov(Grid grid, - Times time) { + Times time) { std::string function = "Ions::solver_vertical_rusanov"; static int iFunction = -1; @@ -496,13 +504,12 @@ void Ions::solver_vertical_rusanov(Grid grid, + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); - } else { + } else species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; - } } for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - if (species[iSpecies].DoAdvect) + if (species[iSpecies].DoAdvect) species[iSpecies].density_scgc = species[iSpecies].newDensity_scgc; fill_electrons(); diff --git a/src/tools.cpp b/src/tools.cpp index ae7878a7..4a7635d7 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -127,20 +127,20 @@ void fill_corners(arma_cube &values, int64_t nGCs) { for (iGCy = 0; iGCy < nGCs; iGCy++) { // lower left: values.tube(iGCx, iGCy) = 0.5 * ( - values.tube(iGCx, nGCs) + - values.tube(nGCs, iGCy)); + values.tube(iGCx, nGCs) + + values.tube(nGCs, iGCy)); // lower right: values.tube(nXs - iGCx - 1, iGCy) = 0.5 * ( - values.tube(nXs - iGCx - 1, nGCs) + - values.tube(nXs - nGCs - 1, iGCy)); + values.tube(nXs - iGCx - 1, nGCs) + + values.tube(nXs - nGCs - 1, iGCy)); // upper left: values.tube(iGCx, nYs - iGCy - 1) = 0.5 * ( - values.tube(iGCx, nYs - nGCs - 1) + - values.tube(nGCs, nYs - iGCy - 1)); + values.tube(iGCx, nYs - nGCs - 1) + + values.tube(nGCs, nYs - iGCy - 1)); // upper right: values.tube(nXs - iGCx - 1, nYs - iGCy - 1) = 0.5 * ( - values.tube(nXs - iGCx - 1, nYs - nGCs - 1) + - values.tube(nXs - nGCs - 1, nYs - iGCy - 1)); + values.tube(nXs - iGCx - 1, nYs - nGCs - 1) + + values.tube(nXs - nGCs - 1, nYs - iGCy - 1)); } } diff --git a/src/transform.cpp b/src/transform.cpp index 74a2f494..05a9a9c0 100644 --- a/src/transform.cpp +++ b/src/transform.cpp @@ -10,8 +10,7 @@ // transform string to lower case // ----------------------------------------------------------------------- -std::string mklower(std::string inString) -{ +std::string mklower(std::string inString) { std::string outString = inString; int64_t nChars = outString.length(); @@ -27,8 +26,7 @@ std::string mklower(std::string inString) // - then in fortran, we convert back // ----------------------------------------------------------------------- -int *copy_string_to_int(std::string inString) -{ +int *copy_string_to_int(std::string inString) { const int length = inString.length(); // declaring character array int *outArray = new int[400]; @@ -48,8 +46,7 @@ int *copy_string_to_int(std::string inString) void copy_vector_to_array(std::vector vector_in, int64_t nElements, - precision_t *array_out) -{ + precision_t *array_out) { for (int64_t i = 0; i < nElements; i++) array_out[i] = vector_in[i]; @@ -60,20 +57,16 @@ void copy_vector_to_array(std::vector vector_in, // ----------------------------------------------------------------------- void copy_cube_to_array(arma_cube cube_in, - precision_t *array_out) -{ + precision_t *array_out) { int64_t nX = cube_in.n_rows; int64_t nY = cube_in.n_cols; int64_t nZ = cube_in.n_slices; int64_t iX, iY, iZ, index; - for (iX = 0; iX < nX; iX++) - { - for (iY = 0; iY < nY; iY++) - { - for (iZ = 0; iZ < nZ; iZ++) - { + for (iX = 0; iX < nX; iX++) { + for (iY = 0; iY < nY; iY++) { + for (iZ = 0; iZ < nZ; iZ++) { index = iX * nY * nZ + iY * nZ + iZ; array_out[index] = cube_in(iX, iY, iZ); } @@ -87,17 +80,14 @@ void copy_cube_to_array(arma_cube cube_in, void copy_mat_to_array(arma_mat mat_in, precision_t *array_out, - bool isFortran) -{ + bool isFortran) { int64_t nX = mat_in.n_rows; int64_t nY = mat_in.n_cols; int64_t iX, iY, index; - for (iX = 0; iX < nX; iX++) - { - for (iY = 0; iY < nY; iY++) - { + for (iX = 0; iX < nX; iX++) { + for (iY = 0; iY < nY; iY++) { if (isFortran) index = iY * nX + iX; else @@ -120,17 +110,14 @@ void copy_mat_to_array(arma_mat mat_in, void copy_array_to_mat(precision_t *array_in, arma_mat &mat_out, - bool isFortran) -{ + bool isFortran) { int64_t nX = mat_out.n_rows; int64_t nY = mat_out.n_cols; int64_t iX, iY, index; - for (iX = 0; iX < nX; iX++) - { - for (iY = 0; iY < nY; iY++) - { + for (iX = 0; iX < nX; iX++) { + for (iY = 0; iY < nY; iY++) { if (isFortran) index = iY * nX + iX; else @@ -146,8 +133,7 @@ void copy_array_to_mat(precision_t *array_in, // ----------------------------------------------------------------------- // Calculate the magnitude of a arma_cube vector // ----------------------------------------------------------------------- -arma_cube calc_magnitude(std::vector xyz) -{ +arma_cube calc_magnitude(std::vector xyz) { arma_cube r = sqrt(xyz[0] % xyz[0] + xyz[1] % xyz[1] + xyz[2] % xyz[2]); @@ -160,8 +146,7 @@ arma_cube calc_magnitude(std::vector xyz) // Use armidillo cubes // ----------------------------------------------------------------------- -std::vector transform_xyz_to_llr_3d(std::vector xyz) -{ +std::vector transform_xyz_to_llr_3d(std::vector xyz) { std::vector llr; arma_cube xy, r, lon; r = calc_magnitude(xyz); @@ -182,8 +167,7 @@ std::vector transform_xyz_to_llr_3d(std::vector xyz) // Use armidillo cubes // ----------------------------------------------------------------------- -std::vector transform_llr_to_xyz_3d(std::vector llr) -{ +std::vector transform_llr_to_xyz_3d(std::vector llr) { std::vector xyz; xyz.push_back(llr[2] % cos(llr[1]) % cos(llr[0])); xyz.push_back(llr[2] % cos(llr[1]) % sin(llr[0])); @@ -195,8 +179,7 @@ std::vector transform_llr_to_xyz_3d(std::vector llr) // Transform Longitude, Latitude, Radius to X, Y, Z // ----------------------------------------------------------------------- -void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) -{ +void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) { // llr_in[0] = longitude (in radians) // llr_in[1] = latitude (in radians) // llr_in[2] = radius @@ -211,8 +194,7 @@ void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]) // ----------------------------------------------------------------------- std::vector rotate_around_z_3d(std::vector XYZ_in, - precision_t angle) -{ + precision_t angle) { arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -235,8 +217,7 @@ std::vector rotate_around_z_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- std::vector rotate_around_y_3d(std::vector XYZ_in, - precision_t angle) -{ + precision_t angle) { arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -259,8 +240,7 @@ std::vector rotate_around_y_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- std::vector rotate_around_x_3d(std::vector XYZ_in, - precision_t angle) -{ + precision_t angle) { arma_cube X = XYZ_in[0]; arma_cube Y = XYZ_in[1]; @@ -283,8 +263,7 @@ std::vector rotate_around_x_3d(std::vector XYZ_in, // ----------------------------------------------------------------------- void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, - precision_t xyz_out[3]) -{ + precision_t xyz_out[3]) { precision_t ca = cos(angle_in); precision_t sa = sin(angle_in); xyz_out[0] = xyz_in[0] * ca + xyz_in[1] * sa; @@ -298,8 +277,7 @@ void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, // ----------------------------------------------------------------------- void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, - precision_t xyz_out[3]) -{ + precision_t xyz_out[3]) { precision_t ca = cos(angle_in); precision_t sa = sin(angle_in); xyz_out[0] = xyz_in[0] * ca - xyz_in[2] * sa; @@ -312,8 +290,7 @@ void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, // ----------------------------------------------------------------------- void transform_float_vector_to_array(std::vector input, - precision_t output[3]) -{ + precision_t output[3]) { for (int i = 0; i < 3; i++) output[i] = input[i]; } @@ -325,8 +302,7 @@ void transform_float_vector_to_array(std::vector input, void transform_vector_xyz_to_env(precision_t xyz_in[3], precision_t lon, precision_t lat, - precision_t env_out[3]) -{ + precision_t env_out[3]) { env_out[2] = xyz_in[0] * cos(lat) * cos(lon) + xyz_in[1] * cos(lat) * sin(lon) + xyz_in[2] * sin(lat); @@ -352,8 +328,7 @@ void transform_vector_xyz_to_env(precision_t xyz_in[3], void vector_diff(precision_t vect_in_1[3], precision_t vect_in_2[3], - precision_t vect_out[3]) -{ + precision_t vect_out[3]) { for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] - vect_in_2[i]; } @@ -364,8 +339,7 @@ void vector_diff(precision_t vect_in_1[3], void vector_add(precision_t vect_in_1[3], precision_t vect_in_2[3], - precision_t vect_out[3]) -{ + precision_t vect_out[3]) { for (int i = 0; i < 3; i++) vect_out[i] = vect_in_1[i] + vect_in_2[i]; } From 7daea5746daf1587d29f2b865d03230e8702a02a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 6 Nov 2024 11:12:18 -0500 Subject: [PATCH 240/691] BUG: undeclared variables --- ext/IE/EIE_IoLibrary.f90 | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/ext/IE/EIE_IoLibrary.f90 b/ext/IE/EIE_IoLibrary.f90 index 6116694b..f4af865e 100644 --- a/ext/IE/EIE_IoLibrary.f90 +++ b/ext/IE/EIE_IoLibrary.f90 @@ -281,6 +281,7 @@ subroutine IO_GetPotential(PotentialOut, iError) real, dimension(IOi_NeednMLTs,IOi_NeednLats) :: ValueOut real, dimension(IOi_NeednMLTs,IOi_NeednLats), intent(out) :: PotentialOut real :: Filler = 0.0 + integer :: iLat, iMlt iError = 0 @@ -302,6 +303,27 @@ subroutine IO_GetPotential(PotentialOut, iError) call IO_GetNonGridBasedPotential(ValueOut, iError) + ! In Weimer, there are sometimes 0 potentials. I don't know why. + if (maxval(abs(IOr2_NeedLats)) > 80.0) then + + do iMlt = 2, IOi_NeednMLTs - 1 + do iLat = 2, IOi_NeednLats - 1 + if (ValueOut(iMlt, iLat) == 0.0) then + if (ValueOut(iMlt, iLat - 1)*ValueOut(iMlt, iLat + 1) > 0) then + ! this is a "hole" in the potential, since the potential is + ! the same sign both above and below the current point. + ValueOut(iMlt, iLat) = ( & + ValueOut(iMlt - 1, iLat) + & + ValueOut(iMlt, iLat - 1) + & + ValueOut(iMlt + 1, iLat) + & + ValueOut(iMlt, iLat + 1))/4.0 + endif + endif + enddo + enddo + + endif + if (iError == 0) then PotentialOut = ValueOut else From 04b038aa9be0dee882b10960c9fd4473b843f407 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 6 Nov 2024 11:13:49 -0500 Subject: [PATCH 241/691] FEAT: enable 1D ion advection --- include/inputs.h | 3 ++- include/ions.h | 1 + src/advance.cpp | 4 +++- src/inputs.cpp | 4 ++++ 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 05c6466e..2211af72 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -487,7 +487,8 @@ class Inputs { bool get_advection_neutrals_bulkwinds(); bool get_advection_neutrals_implicitfriction(); - + std::string get_advection_ions_along(); + /********************************************************************** \brief returns settings[" \param diff --git a/include/ions.h b/include/ions.h index 38138764..2716c9e5 100644 --- a/include/ions.h +++ b/include/ions.h @@ -110,6 +110,7 @@ class Ions { bool set_bcs(Grid grid, Times time, Indices indices); bool set_upper_bcs(Grid grid); bool set_lower_bcs(Grid grid, Times time, Indices indices); + bool advect_vertical(Grid grid, Times time); int get_species_id(std::string name); void calc_efield(Grid grid); diff --git a/src/advance.cpp b/src/advance.cpp index 8a9391aa..70a5f281 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -93,8 +93,10 @@ bool advance(Planets &planet, if (didWork) didWork = neutralsMag.set_bcs(mGrid, time, indices); - if (gGrid.get_nAlts(false) > 1) + if (gGrid.get_nAlts(false) > 1) { neutrals.advect_vertical(gGrid, time); + ions.advect_vertical(gGrid, time); + } neutrals.exchange_old(gGrid); advect(gGrid, time, neutrals); diff --git a/src/inputs.cpp b/src/inputs.cpp index aa36c3fc..6a2ad25f 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -1154,6 +1154,10 @@ std::string Inputs::get_advection_neutrals_vertical() { return get_setting_str("Advection", "Neutrals", "Vertical"); } +std::string Inputs::get_advection_ions_along() { + return get_setting_str("Advection", "Ions", "Along"); +} + bool Inputs::get_advection_neutrals_bulkwinds() { return get_setting_bool("Advection", "Neutrals", "useBulkWinds"); } From d219856eb69d06244c6906b22728a0f0af68c538 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 6 Nov 2024 11:17:38 -0500 Subject: [PATCH 242/691] FEAT: enable 1D ion advection --- src/ions_advect.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/ions_advect.cpp diff --git a/src/ions_advect.cpp b/src/ions_advect.cpp new file mode 100644 index 00000000..b28690c7 --- /dev/null +++ b/src/ions_advect.cpp @@ -0,0 +1,33 @@ +// Copyright 2023, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md +// +// initial version - A. Ridley - July 28, 2023 + +#include "aether.h" + +// ----------------------------------------------------------------------------- +// This is where we will call the different advection schemes +// ----------------------------------------------------------------------------- + +bool Ions::advect_vertical(Grid grid, Times time) { + + bool didWork = true; + + std::string function = "Ions::advance_vertical"; + static int iFunction = -1; + report.enter(function, iFunction); + + if (input.get_advection_ions_along() == "rusanov") + solver_vertical_rusanov(grid, time); + else { + std::cout << "Parallel Ion Advection solver not found!\n"; + std::cout << " ==> Requested : " + << input.get_advection_ions_along() + << "\n"; + didWork = false; + } + + report.exit(function); + return didWork; +} + From b21d55979a382615afe21aa4b2ff89eb8fc76557 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 12 Nov 2024 10:24:39 -0500 Subject: [PATCH 243/691] FEAT: Dipole-> cartesian transform --- src/init_mag_grid.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 436e4744..9b300dd5 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -178,6 +178,51 @@ std:: tuple fill_field_lines(arma_vec baseLats, return std::make_tuple(bLats, bAlts); } +// ----------------------------------------------------------------------- +// Convert XyzDipole to XyzGeo +// +// ----------------------------------------------------------------------- + +void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) { + + std::string function = "Grid::init_dipole_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t XyzRemoveShift[3]; + precision_t XyzRemoveTilt[3]; + precision_t XyzRemoveRot[3]; + + // get planetary parameters, use radius at equator for Lshell reference + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t radius = planet.get_radius(0.0); + + + // get the dipole shift, but normalize it to equatorial radius + precision_t dipole_center[3]; + std::vector temp_dipole_center = planet.get_dipole_center(); + if ((temp_dipole_center[0] != 0) or (temp_dipole_center[1] != 0) or (temp_dipole_center[2] != 0)){ + report.print(0, "Dipole center != 0, but that is not supported yet. Setting to 0!"); + temp_dipole_center = {0,0,0}; + + } + + transform_float_vector_to_array(temp_dipole_center, dipole_center); + + dipole_center[0]=dipole_center[0]/radius; + dipole_center[1]=dipole_center[1]/radius; + dipole_center[2]=dipole_center[2]/radius; + + // Remove Tilt + transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); + + // Remove Rot + transform_rot_z(XyzRemoveTilt, magnetic_pole_rotation, XyzRemoveRot); + + // Remove Shift + vector_add(XyzRemoveRot, dipole_center, XyzGeo); +} // ---------------------------------------------------------------------- // Initialize the dipole grid. From 2026bc09f1d11d1b32af9da673640fe17eaa77c0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Nov 2024 20:15:05 -0500 Subject: [PATCH 244/691] DOC: Adding comments --- include/ions.h | 210 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 203 insertions(+), 7 deletions(-) diff --git a/include/ions.h b/include/ions.h index 2716c9e5..5ba4c07a 100644 --- a/include/ions.h +++ b/include/ions.h @@ -7,6 +7,20 @@ #include #include +/************************************************************** + * \class Ions + * + * \brief Defines the ion states + * + * The Ion class defines the ion states as well as a bunch + * of derived states and source/loss terms. + * + * \author Aaron Ridley + * + * \date 2021/03/28 + * + **************************************************************/ + class Ions { public: @@ -17,62 +31,123 @@ class Ions { int64_t nSpecies = 8; struct species_chars { + + /// Name of the species std::string cName; + + /// Mass of the species precision_t mass; + + /// Charge of the species int charge; + + /// Vibrational levels of the species int vibe; - int DoAdvect; + /// Advect or don't advect the species + bool DoAdvect; + + /// Ion neutral collision frequncies (calculated): + std::vector nu_ion_neutral_vcgc; + + /// Ion - Neutral collision frequency coeffient (non-resonant): std::vector nu_ion_neutral_coef; + + /// Whether the collision frequency is resonant of not: std::vector nu_is_resonant; - std::vector nu_ion_ion; - std::vector nu_ion_electron; + /// A bunch of parameters for calculating resonant collisions: std::vector nu_in_res_temp_min; std::vector nu_in_res_coef1; std::vector nu_in_res_coef2; std::vector nu_in_res_tn_frac; std::vector nu_in_res_ti_frac; - std::vector nu_ion_neutral_vcgc; + /// Ion - Ion Collision frequencies: + std::vector nu_ion_ion; + + /// Ion - Electron collision frequencies: + std::vector nu_ion_electron; // Sources and Losses: + /// Number density of species (/m3) arma_cube density_scgc; arma_cube newDensity_scgc; + + /// For all below: + /// Index 0 = x/longitudinal component of velocity + /// Index 1 = y/latitudinal + /// Index 2 = z/altitudinal/along the field line + + /// Parallel velocity of species (m/s) std::vector par_velocity_vcgc; + + /// Perpendicular velocity of the species (m/s) std::vector perp_velocity_vcgc; + + /// Total velocity of the species (m/s) + /// - this is the parallel + perpendicular together + /// and can be used on the spherical grid for advection std::vector velocity_vcgc; + /// Temperature of the given species: arma_cube temperature_scgc; + + /// Conduction source term: arma_cube conduction_scgc; + /// Ionization source term: arma_cube ionization_scgc; - + /// Total chemical sources and losses: arma_cube sources_scgc; arma_cube losses_scgc; }; // bulk quantities (states): + /// Bulk Density, which is the electron density (/m3): arma_cube density_scgc; + + /// Bulk velocity (m/s): std::vector velocity_vcgc; + + /// Bulk Temperature (K): arma_cube temperature_scgc; + + /// Bulk conduction term for the ions arma_cube conduction_scgc; + + /// Electron temperature arma_cube electron_temperature_scgc; + + /// Bulk mass density of the ions arma_cube rho_scgc; + + /// Mean major mass of the ions: arma_cube mean_major_mass_scgc; + + /// cMax is the sound speed + speed in each direction: std::vector cMax_vcgc; + + /// Bulk sound speed of the ions: arma_cube sound_scgc; + + /// Bulk gamma of the ions: arma_cube gamma_scgc; // This is the vector that will contain all of the different species: std::vector species; // Electrodynamics: + /// Electric potential: arma_cube potential_scgc; + /// Electric field: std::vector efield_vcgc; + /// E x B drift velocity (electron velocity): std::vector exb_vcgc; + /// Energy flux of diffuse electron aurora (mW/m2, tbc): arma_mat eflux; + /// Average energy of diffuse electron aurora (keV, tbc): arma_mat avee; /// Number of species to advect: @@ -96,34 +171,156 @@ class Ions { const std::string potential_name = "Potential"; const std::string potential_unit = "Volts"; - // ------------------------------ + // -------------------------------------------------------------------- // Functions: + /********************************************************************** + \brief Initialize the ions + \param grid The grid to define the ions on + \param planet contains information about the species to simulate + **/ Ions(Grid grid, Planets planet); + + /********************************************************************** + \brief Creates the variables within the species_chars structure + \param grid The grid to define the ions on + **/ species_chars create_species(Grid grid); + + /********************************************************************** + \brief + \param planet contains information about the species to simulate + **/ int read_planet_file(Planets planet); + + /********************************************************************** + \brief Initialize the ion temperature (to the neutral temperature) + \param neutrals the neutral class to grab the temperature from + \param grid The grid that the ions are defined on + **/ void init_ion_temperature(Neutrals neutrals, Grid grid); + + /********************************************************************** + \brief Sets the floor of the ion densities, just in case! + \param none + **/ void set_floor(); + + /********************************************************************** + \brief Sum the ion component densities to calculate the electron density + \param none + **/ void fill_electrons(); + + /********************************************************************** + \brief Calculates the sound speed of the ions + \param none + **/ void calc_sound_speed(); + + /********************************************************************** + \brief Calculates cMax of the ions + \param none + **/ void calc_cMax(); + + /********************************************************************** + \brief Sets the boundary conditions of the ions + \param grid The grid that the ions are defined on + \param time The time class to get dt and the current time + \param indices The indices class to get different indices that may be needed + **/ bool set_bcs(Grid grid, Times time, Indices indices); + + /********************************************************************** + \brief Sets the upper boundary conditions for the ions + \param grid The grid that the ions are defined on + **/ bool set_upper_bcs(Grid grid); + + /********************************************************************** + \brief Sets the lower boundary condition for the ions + \param grid The grid that the ions are defined on + \param time The time class to get dt and the current time + \param indices The indices class to get different indices that may be needed + **/ bool set_lower_bcs(Grid grid, Times time, Indices indices); + + /********************************************************************** + \brief Advect the ions along the 3rd dimension (could be altitude) + \param grid The grid that the ions are defined on + \param time The time class to get dt and the current time + **/ bool advect_vertical(Grid grid, Times time); + /********************************************************************** + \brief Get the ID of the ion species with the given name + \param name a string that describes the species + **/ int get_species_id(std::string name); + + /********************************************************************** + \brief Calculates the electric field + \param grid The grid that the ions are defined on + **/ void calc_efield(Grid grid); + + /********************************************************************** + \brief Calculates the E x B drift + \param grid The grid that the ions are defined on + **/ void calc_exb_drift(Grid grid); + + /********************************************************************** + \brief Calculate the ion drift + \param neutrals these are needed for the collision terms + \param grid The grid that the ions are defined on + \param dt the delta-t for the current time + **/ void calc_ion_drift(Neutrals neutrals, Grid grid, precision_t dt); + + /********************************************************************** + \brief Calculate the ion + electron pressure gradient + \param iIon which ion to act upon + \param grid this is the grid to solve the equation on + **/ std::vector calc_ion_electron_pressure_gradient(int64_t iIon, Grid grid); + + /********************************************************************** + \brief Calculates the ion temperature(s) on the given grid + \param neutrals these are needed for the collision terms + \param grid this is the grid to solve the equation on + \param time the time class to know dt + **/ void calc_ion_temperature(Neutrals neutrals, Grid grid, Times time); + + /********************************************************************** + \brief Calculates the electron temperature on the given grid + \param neutrals these are needed for the collision terms + \param grid this is the grid to solve the equation on + **/ void calc_electron_temperature(Neutrals neutrals, Grid grid); + + /********************************************************************** + \brief Check all of the variables for nonfinites, such as nans + \param none + **/ bool check_for_nonfinites(); + + /********************************************************************** + \brief Run through a test of an arma_cube to see if it contains nans + \param variable this is the variable to check + **/ void nan_test(std::string variable); + + /********************************************************************** + \brief Read or write to the restart file + \param dir the directory to read or write from/to + \param DoRead whether to read (true) or write (false) + **/ bool restart_file(std::string dir, bool DoRead); /********************************************************************** @@ -131,7 +328,6 @@ class Ions { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - void solver_vertical_rusanov(Grid grid, Times time); }; From b5fb243dc1aea0d27a3cf95c95ca9c5fb682d061 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Nov 2024 20:15:50 -0500 Subject: [PATCH 245/691] FEAT: change int to boolean --- include/neutrals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/neutrals.h b/include/neutrals.h index 1e2368c0..4bffd892 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -47,7 +47,7 @@ class Neutrals { precision_t vibe; /// Advect this species? (1 = yes, 0 = no) - int DoAdvect; + bool DoAdvect; /// Number density of species (/m3) arma_cube density_scgc; From 8ac260ac271d0f5b8064140332887303d5b814a2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 12 Nov 2024 20:16:12 -0500 Subject: [PATCH 246/691] DOC: date change --- src/ions_advect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ions_advect.cpp b/src/ions_advect.cpp index b28690c7..36bed83b 100644 --- a/src/ions_advect.cpp +++ b/src/ions_advect.cpp @@ -1,7 +1,7 @@ // Copyright 2023, the Aether Development Team (see doc/dev_team.md for members) // Full license can be found in License.md // -// initial version - A. Ridley - July 28, 2023 +// initial version - A. Ridley - Nov. 1, 2024 #include "aether.h" From d02467f2ab891276ef6e65bfba9eaab6315fa639 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Nov 2024 17:19:07 -0500 Subject: [PATCH 247/691] FEAT: Dipole grid spacing. Now in 3D!(irections) --- src/fill_grid.cpp | 158 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 094cc1e9..9fe7543f 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -433,3 +433,161 @@ void Grid::calc_cent_acc(Planets planet) { // Radial cent acc cent_acc_vcgc[2] = omega2 * radius_scgc % cos(geoLat_scgc) % cos(geoLat_scgc); } + + +void Grid::calc_dipole_grid_spacing(Planets planet) +{ + + int64_t iLon, iLat, iAlt; + + report.print(3, "starting calc_grid_spacing"); + + calc_alt_dipole_grid_spacing(); + calc_lat_dipole_grid_spacing(); + calc_long_dipole_grid_spacing(); + + std::vector lon_lat_radius; + lon_lat_radius.push_back(geoLon_scgc); + lon_lat_radius.push_back(geoLat_scgc); + lon_lat_radius.push_back(radius_scgc); + std::vector xyz; + + xyz = transform_llr_to_xyz_3d(lon_lat_radius); + geoX_scgc = xyz[0]; + geoY_scgc = xyz[0]; + geoZ_scgc = xyz[0]; + + report.print(3, "ending calc_grid_spacing"); +} + + +// for sanity (only marginally helpful): +inline arma_vec delTv(arma_vec theta){ + return (sqrt(3 * cos(theta) * cos(theta) + 1)); + } +// inline arma_cube delT(arma_cube theta){ +// return (sqrt(3 * cos(theta) % cos(theta) + 1)); +// } +inline arma_cube delTc(arma_cube theta){ + return (sqrt(3 * cos(theta) % cos(theta) + 1)); + } + +// --------------------------------------- +// Grid spacing for altitude: +// - Dipole grid needs to be handled differently! +// --------------------------------------- + +void Grid::calc_alt_dipole_grid_spacing() +{ + + int64_t iAlt; + // arma_vec alt_spacing; + precision_t planetRadius; + + + for (int64_t iLat = 1; iLat < nLats; iLat++) + { + + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) + { + dalt_center_scgc.slice(iAlt) = + // 1 / (magP_scgc.slice(iAlt + 1) + // % abs(sin(magLat_scgc.slice(iAlt + 1)) - sin(magLat_scgc.slice(iAlt -1)))) / 2.0; + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1) ) % (1/delTv(magLat_scgc.slice(iAlt + 1) )) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTv(magLat_scgc.slice(iAlt - 1) )) + )*2; + + dalt_lower_scgc.slice(iAlt) = + // 1 / (magP_scgc.slice(iAlt + 1) + // % abs(sin(magLat_scgc.slice(iAlt)) - sin(magLat_scgc.slice(iAlt-1)))); + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt) ) % (1/delTv(magLat_scgc.slice(iAlt) )) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTv(magLat_scgc.slice(iAlt - 1) )) + )*2; + } + } + + dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); + dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); + + dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); + iAlt = nAlts - 1; + dalt_lower_scgc.slice(iAlt) = + geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + + // For a stretched grid, calculate some useful quantities: + // lower is defined for the current cell, which + // means that upper(iAlt) is lower(iAlt+1) + // ratio = upper / lower + for (iAlt = 0; iAlt < nAlts - 1; iAlt++) + dalt_ratio_scgc.slice(iAlt) = + dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); + + iAlt = nAlts - 1; + dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); + + // Need the square of the ratio: + dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; +} + +// --------------------------------------- +// Grid spacing for latitude: +// Again, different for the dipole... +// - uhoh, might not be right. not actually perpendicular to q-p, but no way around that, i think. +// --------------------------------------- + +void Grid::calc_lat_dipole_grid_spacing() +{ + + int64_t iLat; + + for (iLat = 1; iLat < nLats - 1; iLat++) + { + dlat_center_scgc.col(iLat) = + abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1) ) % (1 / delTc(magLat_scgc.col(iLat + 1) )) + - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1) ) % (1 / delTc(magLat_scgc.col(iLat - 1) )) + )*2; + + } + + // Bottom (one sided): + iLat = 0; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); + // Top (one sided): + iLat = nLats - 1; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + + // Make this into a distance: + dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; +} + +// --------------------------------------- +// Grid spacing for longitude: +// --------------------------------------- + +void Grid::calc_long_dipole_grid_spacing() +{ + + int64_t iLon; + + for (iLon = 1; iLon < nLons - 1; iLon++) + dlon_center_scgc.row(iLon) = + (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + // this might be fine for the dipole, if it works for the geo grid... + + + // Bottom (one sided): + iLon = 0; + dlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); + // Top (one sided): + iLon = nLons - 1; + dlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); + + // Make this into a distance: + dlon_center_dist_scgc = + // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); + dlon_center_scgc % magAlt_scgc % abs(cos(magLat_scgc)); +} \ No newline at end of file From 577e396f29401037ac7942ba2e83f551f2c4e065 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:00:10 -0500 Subject: [PATCH 248/691] BUG: tweeking the lower BC --- share/run/UA/inputs/earth.in | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index 1afc7a87..4e693726 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -28,10 +28,10 @@ BC is a density that is used in the lowest boundary cell if you #NEUTRALS name, mass, vibration, thermal_cond, thermal_exp, advect, BC -O, 16, 5, 5.6e-4, 0.69, 1, 7.0e17 +O, 16, 5, 5.6e-4, 0.69, 1, 7.3e17 N, 14, 5, 5.6e-4, 0.69, 1, 2.5e11 -O2, 32, 7, 3.6e-4, 0.69, 1, 2.0e18 -N2, 28, 7, 3.6e-4, 0.69, 1, 1.0e19 +O2, 32, 7, 3.6e-4, 0.69, 1, 0.4e19 +N2, 28, 7, 3.6e-4, 0.69, 1, 0.8e19 NO, 30, 7, 3.6e-4, 0.69, 1, 5.4e14 He, 4, 5, 5.6e-4, 0.69, 1, 1.5e14 N_2D, 14, 5, 5.6e-4, 0.69, 0, 2.5e9 @@ -49,9 +49,9 @@ Here we can input a temperature profile for the initial condition: #TEMPERATURE alt, temp -100.0, 200.0 -200.0, 800.0 -300.0, 800.0 +100.0, 180.0 +200.0, 750.0 +300.0, 750.0 O+ is O+(4S) is the base state of O+, but is just called O+ O+ has excited states of O+(2D) and O+(2P). From 9559e4e78d1152d3c83c029d4006bd0387c4852a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:00:56 -0500 Subject: [PATCH 249/691] FEAT: advect NO+ and O+ only --- share/run/UA/inputs/earth.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index 4e693726..0d51273d 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -61,8 +61,8 @@ name, mass, charge, vibration, advect O+, 16, 1, 5, 1 O2+, 32, 1, 7, 0 N2+, 28, 1, 7, 0 -NO+, 30, 1, 7, 0 +NO+, 30, 1, 7, 1 N+, 14, 1, 5, 0 -He+, 4, 1, 5, 1 +He+, 4, 1, 5, 0 O+_2D, 16, 1, 5, 0 O+_2P, 16, 1, 5, 0 From 925c164fbab5d5b54d068cf5ad9a7a949b0059f0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:01:54 -0500 Subject: [PATCH 250/691] BUG: either horizontal advection or exchange messages kills vertical --- src/advance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 70a5f281..962b25ea 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -98,8 +98,8 @@ bool advance(Planets &planet, ions.advect_vertical(gGrid, time); } - neutrals.exchange_old(gGrid); - advect(gGrid, time, neutrals); + //neutrals.exchange_old(gGrid); + //advect(gGrid, time, neutrals); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); From de1c45297b7f34eb60197c29e006b80ca9ccc1e7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:02:46 -0500 Subject: [PATCH 251/691] BUG: not parallel flow was calculated --- src/calc_ion_drift.cpp | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 7ff0d708..0e0ef046 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -180,10 +180,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (int64_t iComp = 0; iComp < 3; iComp++) { top = rho_nuin % a_perp[iComp] + Nie % a_x_b[iComp]; species[iIon].perp_velocity_vcgc[iComp] = top / bottom; - } - } else { - // No Planetary Magnetic field - for (int64_t iComp = 0; iComp < 3; iComp++) { + a_par[iComp] = total_forcing[iComp]; // Steady state: species[iIon].par_velocity_vcgc[iComp] = @@ -191,6 +188,24 @@ void Ions::calc_ion_drift(Neutrals neutrals, //species[iIon].par_velocity_vcgc[iComp] = // (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / // (1 + nuin_sum * dt); + species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); +/* + std::cout << iComp << " " << iIon << " " << a_par[iComp](2,2,20) << " " << rho(2,2,20) << " " + << nuin_sum(2,2,20) << " " + << species[iIon].par_velocity_vcgc[iComp](2,2,20) << "\n"; */ + } + } else { + // No Planetary Magnetic field + for (int64_t iComp = 0; iComp < 3; iComp++) { + a_par[iComp] = total_forcing[iComp]; + // Steady state: + //species[iIon].par_velocity_vcgc[iComp] = + // a_par[iComp] / rho / nuin_sum; + species[iIon].par_velocity_vcgc[iComp] = + (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / + (1 + nuin_sum * dt); + species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); + } } From 63c92097870cc659fa5162e2edd3351be3de19fb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:03:14 -0500 Subject: [PATCH 252/691] FEAT: change to booleans --- src/ions.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ions.cpp b/src/ions.cpp index f0891845..acb6a033 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -154,6 +154,7 @@ int Ions::read_planet_file(Planets planet) { int iErr = 0; std::string hash; std::ifstream infile_ptr; + int doAdvect; report.print(3, "In read_planet_file for Ions"); @@ -166,7 +167,11 @@ int Ions::read_planet_file(Planets planet) { double mass = ions["mass"][iSpecies]; species[iSpecies].mass = mass * cAMU; species[iSpecies].charge = ions["charge"][iSpecies]; - species[iSpecies].DoAdvect = ions["advect"][iSpecies]; + doAdvect = ions["advect"][iSpecies]; + if (doAdvect == 0) + species[iSpecies].DoAdvect = false; + else + species[iSpecies].DoAdvect = true; species[iSpecies].vibe = ions["vibration"][iSpecies]; } From 653f8cc984b93f87619316ba87e514ea34bba0a0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:03:35 -0500 Subject: [PATCH 253/691] FEAT: change to booleans --- src/neutrals.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 79463307..19d0bb8e 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -198,6 +198,7 @@ int Neutrals::read_planet_file(Planets planet) { int iErr = 0; std::string hash; std::ifstream infile_ptr; + int doAdvect; report.print(3, "In read_planet_file for Neutrals"); @@ -213,7 +214,11 @@ int Neutrals::read_planet_file(Planets planet) { species[iSpecies].vibe = neutrals["vibration"][iSpecies]; species[iSpecies].thermal_cond = neutrals["thermal_cond"][iSpecies]; species[iSpecies].thermal_exp = neutrals["thermal_exp"][iSpecies]; - species[iSpecies].DoAdvect = neutrals["advect"][iSpecies]; + doAdvect = neutrals["advect"][iSpecies]; + if (doAdvect == 0) + species[iSpecies].DoAdvect = false; + else + species[iSpecies].DoAdvect = true; species[iSpecies].lower_bc_density = neutrals["BC"][iSpecies]; } From 2a53979d599cc26b8168f1919bb09935162a1339 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 09:05:00 -0500 Subject: [PATCH 254/691] STY: outputs commented out, need to clean --- src/solver_vertical_rusanov.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index e533091f..ee4ff2e6 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -311,7 +311,17 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); - +/* + std::cout << iSpecies << " " << log_s(2,2,19) << " " + << dt << " " + << divVertVel_s[iSpecies](2,2,19) << " " + << species[iSpecies].velocity_vcgc[2](2,2,19) << " " + << gradLogN_s[iSpecies](2,2,19) << " " + << species[iSpecies].velocity_vcgc[2](2,2,19) * gradLogN_s[iSpecies](2,2,19) << " " + << diffLogN_s[iSpecies](2,2,19) << " " + << species[iSpecies].density_scgc(2,2,19) << " " + << species[iSpecies].newDensity_scgc(2,2,19) << "\n"; +*/ accTotal = dt * grid.gravity_vcgc[2] - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass @@ -381,10 +391,10 @@ void Neutrals::solver_vertical_rusanov(Grid grid, if (doPrintThis) { iX = 2; iY = 2; - iSpecies = 4; + iSpecies = 0; mass = species[iSpecies].mass; - for (int iAlt = 0; iAlt < 20; iAlt++) { + for (int iAlt = 19; iAlt < 20; iAlt++) { std::cout << iAlt << " " << log(species[iSpecies].density_scgc(iX, iY, iAlt)) << " " << temperature_scgc(iX, iY, iAlt) << " " From d7517500b7e5d80e664ec0c6e519014bbf377064 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:33:20 -0500 Subject: [PATCH 255/691] BUG: Wrong onject types in fill_grid inlines --- src/fill_grid.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 9fe7543f..cc4e86c4 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -441,9 +441,12 @@ void Grid::calc_dipole_grid_spacing(Planets planet) int64_t iLon, iLat, iAlt; report.print(3, "starting calc_grid_spacing"); + report.print(3, "starting alt"); calc_alt_dipole_grid_spacing(); + report.print(3, "starting lat"); calc_lat_dipole_grid_spacing(); + report.print(3, "starting long"); calc_long_dipole_grid_spacing(); std::vector lon_lat_radius; @@ -462,12 +465,9 @@ void Grid::calc_dipole_grid_spacing(Planets planet) // for sanity (only marginally helpful): -inline arma_vec delTv(arma_vec theta){ - return (sqrt(3 * cos(theta) * cos(theta) + 1)); +inline arma_mat delTm(arma_mat theta){ + return (sqrt(3 * cos(theta) % cos(theta) + 1)); } -// inline arma_cube delT(arma_cube theta){ -// return (sqrt(3 * cos(theta) % cos(theta) + 1)); -// } inline arma_cube delTc(arma_cube theta){ return (sqrt(3 * cos(theta) % cos(theta) + 1)); } @@ -493,15 +493,15 @@ void Grid::calc_alt_dipole_grid_spacing() dalt_center_scgc.slice(iAlt) = // 1 / (magP_scgc.slice(iAlt + 1) // % abs(sin(magLat_scgc.slice(iAlt + 1)) - sin(magLat_scgc.slice(iAlt -1)))) / 2.0; - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1) ) % (1/delTv(magLat_scgc.slice(iAlt + 1) )) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTv(magLat_scgc.slice(iAlt - 1) )) + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1) ) % (1/delTm(magLat_scgc.slice(iAlt + 1) )) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTm(magLat_scgc.slice(iAlt - 1) )) )*2; dalt_lower_scgc.slice(iAlt) = // 1 / (magP_scgc.slice(iAlt + 1) // % abs(sin(magLat_scgc.slice(iAlt)) - sin(magLat_scgc.slice(iAlt-1)))); - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt) ) % (1/delTv(magLat_scgc.slice(iAlt) )) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTv(magLat_scgc.slice(iAlt - 1) )) + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt) ) % (1/delTm(magLat_scgc.slice(iAlt) )) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTm(magLat_scgc.slice(iAlt - 1) )) )*2; } } @@ -589,5 +589,5 @@ void Grid::calc_long_dipole_grid_spacing() // Make this into a distance: dlon_center_dist_scgc = // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); - dlon_center_scgc % magAlt_scgc % abs(cos(magLat_scgc)); + dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); } \ No newline at end of file From 1048e807398bf64687e04b05c21bf2c2afe21128 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:38:54 -0500 Subject: [PATCH 256/691] FEAT: mag2geo, spacing, etc. for dipole grid --- src/init_mag_grid.cpp | 83 +++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 9b300dd5..4288255c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -175,7 +175,40 @@ std:: tuple fill_field_lines(arma_vec baseLats, } report.exit(function); - return std::make_tuple(bLats, bAlts); + return; +} + +/////////////////////////////////////////// +// convert cell coordinates to geographic// +/////////////////////////////////////////// +std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, arma_cube magAlt, +Planets planet){ + std::string function = "Grid::init_dipole_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + std::vector llr, xyz_mag, xyz_geo, xyzRot1, xyzRot2; + llr.push_back(magLon); + llr.push_back(magLat); + llr.push_back(magAlt); + xyz_mag = transform_llr_to_xyz_3d(llr); + + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + std::vector dipole_center = planet.get_dipole_center(); + + // Reverse our dipole rotations: + xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); + xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); + + // offset dipole (not yet implemented): + // xyz_geo[0] = xyzRot2[0] + dipole_center[0]; + // xyz_geo[1] = xyzRot2[1] + dipole_center[1]; + // xyz_geo[2] = xyzRot2[2] + dipole_center[2]; + + // transform back to lon, lat, radius: + llr = transform_xyz_to_llr_3d(xyzRot2); + return llr; } // ----------------------------------------------------------------------- @@ -335,22 +368,13 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Not currently used. Dipole isn't offset. Leaving just in case. // Lon = magPhi_scgc(iLon, iLat, 1); - for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) - { - lat1dAlong(iAlt) = bLats(iLat, iAlt); - rNorm1d(iAlt) = bAlts(iLat, iAlt); - } - r3d.tube(iLon, iLat) = rNorm1d * planetRadius; - magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; - } - } - report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); - geoLat_scgc = magLat_scgc; - magAlt_scgc = r3d - planetRadius; - geoAlt_scgc = magAlt_scgc; + geoLon_scgc = llr[0]; + geoLat_scgc = llr[1]; + geoAlt_scgc = llr[2] - planetRadius; + report.print(4, "Done dipole -> geographic transformations for the dipole grid."); - report.print(4, "Beginning coordinate transformations of the dipole grid."); // Calculate the radius, of planet fill_grid_radius(planet); @@ -369,7 +393,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) arma_cube bm = sqrt(br % br + bt % bt); // Latitudinal direction of radial: arma_cube s = sign(magLat_scgc); - s.elem(find(s == 0)).ones(); + // s.elem(find(s == 0)).ones(); rad_unit_vcgc[1] = bt / bm % s; rad_unit_vcgc[2] = -br / bm; @@ -386,34 +410,17 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(4, "Done gravity calculations for the dipole grid."); - vector llr, xyz, xyzRot1, xyzRot2; - llr.push_back(magLon_scgc); - llr.push_back(magLat_scgc); - llr.push_back(r3d); - xyz = transform_llr_to_xyz_3d(llr); - - precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); - precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - - // Reverse our dipole rotations: - xyzRot1 = rotate_around_y_3d(xyz, magnetic_pole_tilt); - xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); - - // transform back to lon, lat, radius: - llr = transform_xyz_to_llr_3d(xyzRot2); - - geoLon_scgc = llr[0]; - geoLat_scgc = llr[1]; - geoAlt_scgc = llr[2] - planetRadius; - report.print(4, "Done dipole -> geographic transformations for the dipole grid."); - - calc_alt_grid_spacing(); + calc_dipole_grid_spacing(planet); report.print(4, "Done altitude spacing for the dipole grid."); // Calculate magnetic field and magnetic coordinates: fill_grid_bfield(planet); report.print(4, "Done filling dipole grid with b-field!"); + + // put back into altitude. we've been carrying around radius: + magAlt_scgc = magAlt_scgc - planetRadius; + report.exit(function); return DidWork; } From b6dea8c927a4a2c50c41edc653b89303db9c6cd1 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:39:29 -0500 Subject: [PATCH 257/691] feat: Store r,theta better for dipole grid --- src/init_mag_grid.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 4288255c..b84ffb12 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -174,6 +174,37 @@ std:: tuple fill_field_lines(arma_vec baseLats, } } + report.print(3, "QP-rtheta done!"); + + arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); + arma_cube r3d(nLons, nLats, nAlts); + precision_t planetRadius; + + // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + // This is wrong, but get_radius doesnt support latitude at the time of writing + planetRadius = planet.get_radius(bLats(0)); + + for (int64_t iLat = 0; iLat < nLats / 2; iLat++) + { + for (int64_t iLon = 0; iLon < nLons; iLon++) + { + // Not currently used. Dipole isn't offset. Leaving just in case. + // Lon = magPhi_scgc(iLon, iLat, 1); + + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) + { + lat1dAlong(iAlt) = bLats(iLat, iAlt); + rNorm1d(iAlt) = bAlts(iLat, iAlt); + } + r3d.tube(iLon, iLat) = rNorm1d * planetRadius; + magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; + } + } + + + magAlt_scgc = r3d;// - planetRadius; + geoAlt_scgc = magAlt_scgc; + report.exit(function); return; } From 58dbcde03629360b6a6fb60512d02045d6439b18 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:40:07 -0500 Subject: [PATCH 258/691] Clean up spacing along field line --- src/init_mag_grid.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index b84ffb12..5917317c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -155,18 +155,22 @@ std:: tuple fill_field_lines(arma_vec baseLats, // calculate const. stride similar to sami2/3 (huba & joyce 2000) // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + // Doesn't have any lat/lon dependence so won't work for offset dipoles + delqp = (q_N - q_S) / (nAlts + 1); + delqp = min_altRe * delqp; for (int iAlt = 0; iAlt < nAlts; iAlt++) { - // Doesn't have any lat/lon dependence so won't work for offset dipoles - delqp = (q_N - q_S) / (nAlts + 1); qp0 = q_S + iAlt * (delqp); - delqp = min_altRe * delqp; fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_S / delqp - 1); ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); delq = qp0 - q_S; // Q value at this point: qp2 = q_S + ft * delq; + for (int64_t iLon=0; iLon < nLons; iLon ++) { + magQ_scgc(iLon, iLat, iAlt) = qp2; + } + r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; From 87bee6f966f8c58208cf9a9d12171bf1c3fe39af Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:43:07 -0500 Subject: [PATCH 259/691] STY: Mostly docs, comments, debugging statements, etc. --- src/init_mag_grid.cpp | 78 ++++++++++++++++++++++--------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5917317c..c341da81 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -42,7 +42,6 @@ arma_vec baselat_spacing(precision_t extent, std::string function = "Grid::baselat_spacing"; static int iFunction = -1; report.enter(function, iFunction); - report.print(3, "baselates enter!"); // intermediate latitude values precision_t lat_low, lat_high, lat_low0, lat_high0; @@ -64,15 +63,15 @@ arma_vec baselat_spacing(precision_t extent, // get the upper & lower latitude bounds for our division of the quadree if (origin < 0) { - // negative origin: lat_high = lat_low & vice-versa. - lat_low, lat_high = -lat_high, -lat_low; + // negative origin: lat_high <=> lat_low, & vice-versa. + lat_low, lat_high = -upper_lim, -lower_lim; lat_low0 = lat_low; lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); lat_high = lat_low0 - (lat_high - lat_low0) * (extent / .5 + origin / 0.5); } else { - lat_low0 = lat_low; + lat_low0 = lower_lim; lat_low = lat_low + (lat_high - lat_low) * (origin / 0.5); lat_high = lat_low0 + (lat_high - lat_low0) * (extent / .5 + origin / 0.5); } @@ -82,7 +81,7 @@ arma_vec baselat_spacing(precision_t extent, bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); dlat = (lat_high - lat_low) / (nLats); - report.print(3, "baselates laydown!"); + report.print(4, "baselates laydown!"); for (int64_t j = 0; j < nLats; j++) { @@ -90,14 +89,14 @@ arma_vec baselat_spacing(precision_t extent, angq = aa + bb * pow(ang0, spacing_factor); Lats[j] = angq; } - report.print(3, "baselates flipback!"); + report.print(5, "baselates flipback!"); if (DO_FLIPBACK) for (int64_t j = 0; j < nLats; j++) { Lats[j + nLats] = -1 * Lats[j]; } - report.print(3, "baselates flipbackdone!"); + report.print(4, "baselates flipbackdone!"); report.exit(function); return Lats; @@ -108,19 +107,15 @@ arma_vec baselat_spacing(precision_t extent, // - In dipole (p,q) coordinates // - North & south hemisphere base -std:: tuple fill_field_lines(arma_vec baseLats, - int64_t nAlts, - precision_t min_altRe, - precision_t Gamma) +void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, + precision_t min_altRe, precision_t Gamma, + Planets planet) { std::string function = "Grid::fill_field_lines"; static int iFunction = -1; report.enter(function, iFunction); - report.print(3, "entered!"); - - int64_t nLats = baseLats.n_elem; precision_t q_S, q_N, delqp; @@ -140,20 +135,28 @@ std:: tuple fill_field_lines(arma_vec baseLats, arma_vec Lshells(nLats); for (int64_t iLat = 0; iLat < nLats; iLat++) Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); - report.print(3, "lshells!"); - + report.print(3, "lshells calculated!"); + + // for (int64_t iLon = 0; iLon < nLons; iLon ++){ + for (int64_t iLat = 0; iLat < nLats; iLat ++){ + magP_scgc.col(iLat) = magP_scgc.col(iLat) + Lshells(iLat); + } int64_t nZby2 = nAlts / 2; for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nZby2) / (nAlts / 10.0)), 2.0)); + report.print(3, "expQ"); for (int iLat = 0; iLat < nLats; iLat++) { q_S = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); q_N = -q_S; - // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // calculate const. stride similar to sami2/3 (huba & joyce 2000) + // and in schunk handbook : + // - millward et al (CTIP) ~p249-250 + // - Bailey & Balan ~p197 // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == // Doesn't have any lat/lon dependence so won't work for offset dipoles delqp = (q_N - q_S) / (nAlts + 1); @@ -261,7 +264,7 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec precision_t XyzRemoveTilt[3]; precision_t XyzRemoveRot[3]; - // get planetary parameters, use radius at equator for Lshell reference + // get planetary parameters precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); precision_t radius = planet.get_radius(0.0); @@ -295,7 +298,7 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec // ---------------------------------------------------------------------- // Initialize the dipole grid. // - inputs (min_apex, min_alt, LatStretch, FieldLineStretch, max_lat_dipole) -// are read from input files. And, of course, the numbers of each coordinate +// are read from input files. And the numbers of each coordinate. // - nLats must be even!! // ---------------------------------------------------------------------- bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) @@ -312,9 +315,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // turn the switch on! IsGeoGrid = false; IsMagGrid = true; + IsCubeSphereGrid=false; - // Dimension iterators - int64_t iLon, iLat, iAlt; + report.print(0, "Creating inter-node connections Grid"); + if (!Is0D & !Is1Dz) create_sphere_connection(quadtree_ion); report.print(0, "Creating Dipole Grid"); @@ -332,7 +336,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) precision_t min_apex = grid_input.min_apex * cKMtoM; precision_t max_lat = grid_input.max_blat; - // Normalize inputs to planet radius... + // Normalize inputs to planet radius... (update when earth is oblate) precision_t planetRadius = planet.get_radius(0.0); // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; @@ -363,21 +367,26 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) if (!HasXdim) dlon = 1.0 * cDtoR; + // Dimension iterators + int64_t iLon, iLat, iAlt; + // Longitudes: // - Make a 1d vector // - copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; - for (iLat = 0; iLat < nLats; iLat++) - { + for (iLat = 0; iLat < nLats; iLat++) { for (iAlt = 0; iAlt < nAlts; iAlt++) magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + // geoLon_Left.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; } + report.print(3, "longitudes point two"); // Latitudes: + // min_lat calculated from min_apex precision_t min_lat = acos(sqrt(1 / min_alt_re)); // latitude of field line base: @@ -385,23 +394,16 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) arma_vec baseLats = baselat_spacing(size_up_norm[1], lower_left_norm[1], max_lat, min_lat, nLats, 1.0); - report.print(3, "baselates done!"); + report.print(3, "baselats done!"); - // Fill field lines! - arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); - std::tie(bLats, bAlts) = fill_field_lines(baseLats, nAlts, min_alt_re, Gamma); + // arma_vec lShells(nLats); + // latitude & altitude of points on field lines (2D) + // arma_mat bLats(nLats, nAlts), bAlts(nLats, nAlts); + fill_field_lines(baseLats, nAlts, min_alt_re, Gamma, planet); - arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); - arma_cube r3d(nLons, nLats, nAlts); - - // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + + report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); - for (int64_t iLat = 0; iLat < nLats / 2; iLat++) - { - for (int64_t iLon = 0; iLon < nLons; iLon++) - { - // Not currently used. Dipole isn't offset. Leaving just in case. - // Lon = magPhi_scgc(iLon, iLat, 1); std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); From fcf5ab938d206b9627e9b9bf6b8145b968a4588e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 11:53:50 -0500 Subject: [PATCH 260/691] update headers to include init_mag_griod func's --- include/grid.h | 17 +++++++++++++++-- include/init_mag_grid.h | 25 +++++++++++-------------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/include/grid.h b/include/grid.h index 534ef2c5..bda58030 100644 --- a/include/grid.h +++ b/include/grid.h @@ -73,6 +73,10 @@ class Grid arma_cube magAlt_scgc, magZ_scgc; arma_cube magLocalTime_scgc; + // Dipole coordinates: + // Phi => Longitude + // P => L-shell + // Q => Distance along field line arma_cube magPhi_scgc; arma_cube magP_scgc; arma_cube magQ_scgc; @@ -190,6 +194,16 @@ class Grid void calc_alt_grid_spacing(); void calc_lat_grid_spacing(); void calc_long_grid_spacing(); + + void calc_dipole_grid_spacing(Planets planet); + void calc_alt_dipole_grid_spacing(); + void calc_lat_dipole_grid_spacing(); + void calc_long_dipole_grid_spacing(); + void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, + precision_t Gamma, Planets planet); + + // void calc_alt_dipole_grid_spacing(); + void fill_grid_radius(Planets planet); void calc_rad_unit(Planets planet); void calc_gravity(Planets planet); @@ -210,9 +224,8 @@ class Grid void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]); - bool init_dipole_grid(Quadtree quadtree_ion, Planets planet); - + // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h index aa230e15..80c29b9d 100644 --- a/include/init_mag_grid.h +++ b/include/init_mag_grid.h @@ -11,16 +11,6 @@ bool init_dipole_grid(Grid &mGrid, Planets planet); - -// Take limits & specs of field line, fill it with points. -// std::pair fill_dipole_q_line(precision_t qN_, -// precision_t qS_, -// precision_t Gamma_, -// int64_t nZ_, -// precision_t Lshell_, -// precision_t min_alt_); - - // Analytic solution to get from q,p dipole coords to r,theta // q coordinate along b-field line // p l-shell @@ -41,11 +31,18 @@ arma_vec baselat_spacing(precision_t extent, int16_t nLats, precision_t spacing_factor); +// Take limits & specs of field line, fill it with points. +// std:: tuple Grid::fill_field_lines (arma_vec lShells, +// int64_t nAlts, +// int64_t nLats, +// precision_t Gamma); + -std::tuple fill_field_lines(arma_vec lShells, - int64_t nAlts, - int64_t nLats, - precision_t Gamma); +// convert mag to geographic +std::vector mag_to_geo(arma_cube magLon, + arma_cube magLat, + arma_cube magAlt, + Planets planet); #endif // INCLUDE_INIT_GEO_GRID_H_ From 39a1c831e4b1e142cf1c3148f5cfbabf94be6828 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 13:42:02 -0500 Subject: [PATCH 261/691] BUG: repeat of O+ loss and remove newlines --- .../UA/inputs/chemistry_earth_richards.csv | 112 +++++++++--------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/share/run/UA/inputs/chemistry_earth_richards.csv b/share/run/UA/inputs/chemistry_earth_richards.csv index 52882a32..1f9bda8d 100644 --- a/share/run/UA/inputs/chemistry_earth_richards.csv +++ b/share/run/UA/inputs/chemistry_earth_richards.csv @@ -1,57 +1,55 @@ -name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,,uncertainty,,,,,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType,eol -reaction,name,name,name,goes to,name,name,name,mks,,,ratio,eV,,,,,,,K,T,dimensionless,T,K,K,"1: (numerator/temp)^exponent, 2: temp*exp(numerator/temp)", -R1,O+,N2,,,NO+,N,,1.20E-18,,,1,1.1,,0.1,,,,no validated,,,,,,,, -R2,He+,N2,,,He,N,N+,7.80E-16,,,1,0.28,,0.1,Anichich,1993,,gitm,,,,,,,, -R3,He+,N2,,,He,N2+,,5.20E-16,,,1,0,,0.1,,,,no heating?,,,,,,,, -R4,He+,NO,,,He,N+,O,1.35E-15,,,1,0,,0.1,,,,,,,,,,,, -R5,He+,NO,,,He,O+,N,1.00E-16,,,1,0,,0.1,,,,,,,,,,,, -R6,He+,O2,,,He,O+_2D,O,2.37E-16,,,1,0,,0.1,Bischof and Linder,1986,,,,,,,,,, -R7,He+,O2,,,He,O+_2P,O,6.04E-17,,,1,0,,0.1,,,,,,,,,,,, -R8,He+,O2,,,He,O+_4S,O,2.39E-17,,,1,0,,0.1,,,,,,,,,,,, -R9,He+,O2,,,He,O+,O_1D,4.60E-17,,,1,0,,0.1,,,,,,,,,,,, -R10,He+,O2,,,He,O2+,,9.20E-18,,,1,0,,0.1,,,,,,,,,,,, -R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,,0.1,,,,gitm,250,Te,0.7,,,,1, -R12,N,NO,,,N2,O,,3.40E-17,,,1,3.25,,0.1,Lee at al.,1978a+b,,gitm,,,,,,,, -R13,N,O2,,,NO,O,,1.50E-20,Tn*exp(-3270/Tn),,1,1.385,,0.1,Baulch et al,1994,,gitm,-3270,Tn,,,,,2, -R14,N,O2,,,NO,O_1S,,2.50E-17,,,1,0,,0.1,Kopp et al,1977,,??,,,,,,,, -R15,N+,NO,,,N2+,O,,8.33E-17,(300/Ti)^0.24,,1,2.2,,0.1,Fahey et al,1981,,gitm (n branch),300,Ti,0.24,,,,1, -R16,N+,NO,,,NO+,N,,4.72E-16,(300/Ti)^0.24,,1,3.4,,0.1,Anicich,1993,,gitm (n branch),300,Ti,0.24,,,,1, -R17,N+,O,,,O+,N,,2.20E-18,,,1,0.93,,0.1,Constantinides et al. (1979) + Bates (1989),,,gitm (n branch),,,,,,,, -R18,N+,O2,,,NO+,O_1D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.36,4.71,,0.1,Dotan et al. (1997) + OKeefe et al. (1986),,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1, -R18,,,,,,,,9.50E-16,,Ti>1000,,,,0.1,,,,,,,,,1000,,, -R19,N+,O2,,,NO+,O_3P,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1, -R19,,,,,,,,9.50E-16,,Ti>1000,,,,0.1,,,,,,,,,1000,,, -R20,N+,O2,,,O+_4S,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1, -R20,,,,,,,,9.50E-16,,Ti>1000,,,,0.1,,,,,,,,,1000,,, -R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1, -R21,,,,,,,,9.50E-16,,Ti>1000,,,,0.1,,,,,,,,,1000,,, -R22,N+,O2,,,O2+,N_4S,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.35,2.5,,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1, -R22,,,,,,,,9.50E-16,,Ti>1000,,,,0.1,,,,,,,,,1000,,, -R23,N2+,e-,,,N_2D,N_2D,,1.39E-13,(300/Te)^0.39,,0.56,1.04,,0.1,,,,gitm,300,Te,0.39,,,,1, -R24,N2+,e-,,,N,N,,2.20E-13,(300/Te)^0.39,,0.44,5.77,,0.1,Zipf,1980,,gitm,300,Te,0.39,,,,1, -R25,N2+,N_4S,,,N2,N+,,1.10E-17,,,1,2.48,,0.1,Ferguson,1973,,gitm,,,,,,,, -R26,N2+,NO,,,N2,NO+,,3.60E-16,,,1,6.33,,0.1,Scott et al.,1999,,gitm,,,,,,,, -R27,N2+,O,,,NO+,N_2D,,1.33E-16,(300/Ti)^0.44,Ti<=1500,1,0.7,,0.1,Scott et al.,1999,,gitm,300,Ti,0.44,Ti,0,1500,1, -R27,,,,,,,,6.55E-17,(Ti/1500)^0.2,Ti>1500,,,,0.1,,,,,1500,Ti,-0.2,,1500,,1, -R29,N2+,O,,,O+,N2,,7.00E-18,(300/Ti)^0.23,,1,1.96,,0.1,McFarland et al,1974,,gitm,300,Ti,0.23,,,,1, -R30,N2+,O2,,,O2+,N2,,5.10E-17,(300/Ti)^1.16,Ti<=1000,1,3.53,,0.1,Scott et al.,1999,,gitm,300,Ti,1.16,Ti,0,1000,1, -R30,,,,,,,,1.26E-17,(Ti/1000)^0.67,Ti>1000,,,,0.1,,,,,1000,Ti,-0.67,,1000,,1, -R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0,,0.1,Vejby-Christensen et al. (1998) and,,,,300,Te,0.85,,,,1, -R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,0,,0.1,Torr and Torr,1979,,,300,Te,0.85,,,,1, -R33,O+,H,,,O,H+,,6.40E-16,,,1,0,,0.1,Anicich,1993,,,,,,,,,, -R34,O+,N_2D,,,N+,O,,1.30E-16,,,1,0,,0.1,Constantinides et al. (1979) + Bates (1989),,,,,,,,,,, -R35,O+,N2,,,NO+,N,,1.20E-18,,,1,0,,0.1,St.-Maurice and Torr (1978) + Hierl et al. (1997),,,,,,,,,,, -R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,,0.1,Dotan and Viggiano,1999,,gitm,300,Ti,-0.87,,,,1, -R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,,0.1,,,,gitm,300,Ti,0.52,Ti,0,900,1, -R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,,0.1,,,,,900,Ti,-0.92,,900,,1, -R38,O+_2D,O2,,,O2+,O,,7.00E-17,,,1,4.865,,0.1,,,,gitm,,,,,,,, -R39,O+_2P,O2,,,O2+,O,,1.30E-16,,,1,6.54,,0.1,,,,gitm,,,,,,,, -R40,O+_2P,O2,,,O+,O2,,1.30E-16,,,1,5.016,,0.1,,,,gitm,,,,,,,, -R41,O2+,e-,,,O,O,,1.95E-13,(300/Te)^0.70,Ti<=1200,1,4.595,(BR averaged),0.1,Mehr and Biondi,1969,<--- Ti or Ti???,gitm,300,Te,0.7,Ti,0,1200,1, -R41,,,,,,,,7.39E-14,(1200/Te)^0.56,Ti>1200,,,,0.1,,,,,1200,Te,0.56,,1200,,1, -R42,O2+,N_2D,,,NO+,O,,1.80E-16,,,1,6.519,,0.1,Goldan,1966,,gitm,,,,,,,, -R43,O2+,N_2D,,,N+,O,O,8.65E-17,,,1,0,,0.1,O'Keefe,1986,<--- doesn't balance!,?????,,,,,,,, -R44,O2+,N_2P,,,N,O2+,,2.20E-18,,,1,3.565,,0.1,Zipf,1980,,gitm,,,,,,,, -R45,O2+,N,,,NO+,O,,1.00E-16,,,1,4.21,,0.1,Scott,1999,,gitm,,,,,,,, -R46,O2+,NO,,,NO+,O2+,,4.50E-16,,,1,2.813,,0.1,Midey and Viggiano,1999,,gitm,,,,,,,, - +name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,uncertainty,notes1,notes2,notes3,verification,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType,na,eol +reaction,name,name,name,goes to,name,name,name,mks,na,na,ratio,eV,na,na,na,na,na,K,T,dimensionless,T,K,K,1: (numerator/temp)^exponent,2: temp*exp(numerator/temp),eol +R2,He+,N2,,,He,N,N+,7.80E-16,,,1,0.28,0.1,Anichich,1993,,gitm,,,,,,,,,eol +R3,He+,N2,,,He,N2+,,5.20E-16,,,1,0,0.1,,,,no heating?,,,,,,,,,eol +R4,He+,NO,,,He,N+,O,1.35E-15,,,1,0,0.1,,,,,,,,,,,,,eol +R5,He+,NO,,,He,O+,N,1.00E-16,,,1,0,0.1,,,,,,,,,,,,,eol +R6,He+,O2,,,He,O+_2D,O,2.37E-16,,,1,0,0.1,Bischof and Linder,1986,,,,,,,,,,,eol +R7,He+,O2,,,He,O+_2P,O,6.04E-17,,,1,0,0.1,,,,,,,,,,,,,eol +R8,He+,O2,,,He,O+_4S,O,2.39E-17,,,1,0,0.1,,,,,,,,,,,,,eol +R9,He+,O2,,,He,O+,O_1D,4.60E-17,,,1,0,0.1,,,,,,,,,,,,,eol +R10,He+,O2,,,He,O2+,,9.20E-18,,,1,0,0.1,,,,,,,,,,,,,eol +R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,0.1,,,,gitm,250,Te,0.7,,,,1,,eol +R12,N,NO,,,N2,O,,3.40E-17,,,1,3.25,0.1,Lee at al.,1978a+b,,gitm,,,,,,,,,eol +R13,N,O2,,,NO,O,,1.50E-20,Tn*exp(-3270/Tn),,1,1.385,0.1,Baulch et al,1994,,gitm,-3270,Tn,,,,,2,,eol +R14,N,O2,,,NO,O_1S,,2.50E-17,,,1,0,0.1,Kopp et al,1977,,??,,,,,,,,,eol +R15,N+,NO,,,N2+,O,,8.33E-17,(300/Ti)^0.24,,1,2.2,0.1,Fahey et al,1981,,gitm (n branch),300,Ti,0.24,,,,1,,eol +R16,N+,NO,,,NO+,N,,4.72E-16,(300/Ti)^0.24,,1,3.4,0.1,Anicich,1993,,gitm (n branch),300,Ti,0.24,,,,1,,eol +R17,N+,O,,,O+,N,,2.20E-18,,,1,0.93,0.1,Constantinides et al. (1979) + Bates (1989),,,gitm (n branch),,,,,,,,,eol +R18,N+,O2,,,NO+,O_1D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.36,4.71,0.1,Dotan et al. (1997) + OKeefe et al. (1986),,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R18,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol +R19,N+,O2,,,NO+,O_3P,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R19,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol +R20,N+,O2,,,O+_4S,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R20,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol +R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R21,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol +R22,N+,O2,,,O2+,N_4S,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.35,2.5,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R22,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol +R23,N2+,e-,,,N_2D,N_2D,,1.39E-13,(300/Te)^0.39,,0.56,1.04,0.1,,,,gitm,300,Te,0.39,,,,1,,eol +R24,N2+,e-,,,N,N,,2.20E-13,(300/Te)^0.39,,0.44,5.77,0.1,Zipf,1980,,gitm,300,Te,0.39,,,,1,,eol +R25,N2+,N_4S,,,N2,N+,,1.10E-17,,,1,2.48,0.1,Ferguson,1973,,gitm,,,,,,,,,eol +R26,N2+,NO,,,N2,NO+,,3.60E-16,,,1,6.33,0.1,Scott et al.,1999,,gitm,,,,,,,,,eol +R27,N2+,O,,,NO+,N_2D,,1.33E-16,(300/Ti)^0.44,Ti<=1500,1,0.7,0.1,Scott et al.,1999,,gitm,300,Ti,0.44,Ti,0,1500,1,,eol +R27,,,,,,,,6.55E-17,(Ti/1500)^0.2,Ti>1500,,,0.1,,,,,1500,Ti,-0.2,,1500,,1,,eol +R29,N2+,O,,,O+,N2,,7.00E-18,(300/Ti)^0.23,,1,1.96,0.1,McFarland et al,1974,,gitm,300,Ti,0.23,,,,1,,eol +R30,N2+,O2,,,O2+,N2,,5.10E-17,(300/Ti)^1.16,Ti<=1000,1,3.53,0.1,Scott et al.,1999,,gitm,300,Ti,1.16,Ti,0,1000,1,,eol +R30,,,,,,,,1.26E-17,(Ti/1000)^0.67,Ti>1000,,,0.1,,,,,1000,Ti,-0.67,,1000,,1,,eol +R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0,0.1,Vejby-Christensen et al. (1998) and,,,,300,Te,0.85,,,,1,,eol +R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,0,0.1,Torr and Torr,1979,,,300,Te,0.85,,,,1,,eol +R33,O+,H,,,O,H+,,6.40E-16,,,1,0,0.1,Anicich,1993,,,,,,,,,,,eol +R34,O+,N_2D,,,N+,O,,1.30E-16,,,1,0,0.1,Constantinides et al. (1979) + Bates (1989),,,,,,,,,,,,eol +R35,O+,N2,,,NO+,N,,1.20E-18,,,1,0,0.1,St.-Maurice and Torr (1978) + Hierl et al. (1997),,,,,,,,,,,,eol +R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,0.1,Dotan and Viggiano,1999,,gitm,300,Ti,-0.87,,,,1,,eol +R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,0.1,,,,gitm,300,Ti,0.52,Ti,0,900,1,,eol +R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,0.1,,,,,900,Ti,-0.92,,900,,1,,eol +R38,O+_2D,O2,,,O2+,O,,7.00E-17,,,1,4.865,0.1,,,,gitm,,,,,,,,,eol +R39,O+_2P,O2,,,O2+,O,,1.30E-16,,,1,6.54,0.1,,,,gitm,,,,,,,,,eol +R40,O+_2P,O2,,,O+,O2,,1.30E-16,,,1,5.016,0.1,,,,gitm,,,,,,,,,eol +R41,O2+,e-,,,O,O,,1.95E-13,(300/Te)^0.70,Ti<=1200,1,4.595,0.1,Mehr and Biondi,1969,<--- Ti or Ti???,gitm,300,Te,0.7,Ti,0,1200,1,,eol +R41,,,,,,,,7.39E-14,(1200/Te)^0.56,Ti>1200,,,0.1,,,,,1200,Te,0.56,,1200,,1,,eol +R42,O2+,N_2D,,,NO+,O,,1.80E-16,,,1,6.519,0.1,Goldan,1966,,gitm,,,,,,,,,eol +R43,O2+,N_2D,,,N+,O,O,8.65E-17,,,1,0,0.1,O'Keefe,1986,<--- doesn't balance!,?????,,,,,,,,,eol +R44,O2+,N_2P,,,N,O2+,,2.20E-18,,,1,3.565,0.1,Zipf,1980,,gitm,,,,,,,,,eol +R45,O2+,N,,,NO+,O,,1.00E-16,,,1,4.21,0.1,Scott,1999,,gitm,,,,,,,,,eol +R46,O2+,NO,,,NO+,O2+,,4.50E-16,,,1,2.813,0.1,Midey and Viggiano,1999,,gitm,,,,,,,,,eol \ No newline at end of file From 4b9176f6452ec18541d78ed2b33cb8db87232990 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 13:42:33 -0500 Subject: [PATCH 262/691] FEAT: temp closer to MSIS --- share/run/UA/inputs/earth.in | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index 0d51273d..6a968640 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -40,7 +40,6 @@ H, 1, 5, 5.6e-4, 0.69, 0, 3.0e13 O_1D, 16, 5, 5.6e-4, 0.69, 0, 1.0e10 CO2, 46, 7, 3.6e-4, 0.69, 0, 4.5e15 - Here we can input a temperature profile for the initial condition: - below the lowest altitude, it will use the lowest alt - above the highest alt, it will use the highest alt @@ -49,9 +48,9 @@ Here we can input a temperature profile for the initial condition: #TEMPERATURE alt, temp -100.0, 180.0 -200.0, 750.0 -300.0, 750.0 +100.0, 200.0 +200.0, 800.0 +300.0, 800.0 O+ is O+(4S) is the base state of O+, but is just called O+ O+ has excited states of O+(2D) and O+(2P). From 2a4bf5a27e5103a7732aeb19cea6e4c34bb7d373 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 13:43:11 -0500 Subject: [PATCH 263/691] FEAT: check on dimensions before advecting --- src/advance.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 962b25ea..4c79f548 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -93,14 +93,20 @@ bool advance(Planets &planet, if (didWork) didWork = neutralsMag.set_bcs(mGrid, time, indices); + // advect in the 3rd dimension (vertical), but only if we have it: if (gGrid.get_nAlts(false) > 1) { neutrals.advect_vertical(gGrid, time); + if (didWork & input.get_check_for_nans()) + didWork = neutrals.check_for_nonfinites("After Vertical Neutral Advection"); ions.advect_vertical(gGrid, time); } - //neutrals.exchange_old(gGrid); - //advect(gGrid, time, neutrals); - + // advect in the 1st and 2nd dimensions (horizontal), but only if + // we have those dimensions: + if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { + neutrals.exchange_old(gGrid); + advect(gGrid, time, neutrals); + } if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); From 2c78ed8abe705a0468f7ae1a3fb0879a69ba29c0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 14 Nov 2024 13:43:59 -0500 Subject: [PATCH 264/691] FEAT: implicit parallel velocity --- src/calc_ion_drift.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 0e0ef046..eaa86390 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -181,18 +181,13 @@ void Ions::calc_ion_drift(Neutrals neutrals, top = rho_nuin % a_perp[iComp] + Nie % a_x_b[iComp]; species[iIon].perp_velocity_vcgc[iComp] = top / bottom; - a_par[iComp] = total_forcing[iComp]; // Steady state: - species[iIon].par_velocity_vcgc[iComp] = - a_par[iComp] / rho / nuin_sum; //species[iIon].par_velocity_vcgc[iComp] = - // (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / - // (1 + nuin_sum * dt); + // a_par[iComp] / rho / nuin_sum; + species[iIon].par_velocity_vcgc[iComp] = + (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / + (1 + nuin_sum * dt); species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); -/* - std::cout << iComp << " " << iIon << " " << a_par[iComp](2,2,20) << " " << rho(2,2,20) << " " - << nuin_sum(2,2,20) << " " - << species[iIon].par_velocity_vcgc[iComp](2,2,20) << "\n"; */ } } else { // No Planetary Magnetic field From 652f92c964c68ae1c671994143fdc7c990d9aa6f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 14 Nov 2024 19:38:54 -0500 Subject: [PATCH 265/691] BUG: Couple more issues fixed. latitudes are backwards now??? --- src/init_mag_grid.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index c341da81..ff4620ca 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -191,7 +191,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, // This is wrong, but get_radius doesnt support latitude at the time of writing planetRadius = planet.get_radius(bLats(0)); - for (int64_t iLat = 0; iLat < nLats / 2; iLat++) + for (int64_t iLat = 0; iLat < nLats; iLat++) { for (int64_t iLon = 0; iLon < nLons; iLon++) { @@ -208,9 +208,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, } } - - magAlt_scgc = r3d;// - planetRadius; - geoAlt_scgc = magAlt_scgc; + magAlt_scgc = r3d; report.exit(function); return; @@ -340,6 +338,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) precision_t planetRadius = planet.get_radius(0.0); // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; + precision_t min_apex_re = (min_apex + planetRadius) / planetRadius; + + std:: cout< Date: Mon, 18 Nov 2024 16:45:51 -0500 Subject: [PATCH 266/691] FEAT: solve ion temperature equation --- include/ions.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/include/ions.h b/include/ions.h index 5ba4c07a..3c739f57 100644 --- a/include/ions.h +++ b/include/ions.h @@ -102,6 +102,22 @@ class Ions { /// Total chemical sources and losses: arma_cube sources_scgc; arma_cube losses_scgc; + + // Heating terms: + /// Bulk collisional heating with neutrals and electrons (K/s) + arma_cube heating_neutral_friction_scgc; + arma_cube heating_electron_friction_scgc; + + /// Bulk collisional heating with neutrals and electrons (K/s) + arma_cube heating_neutral_heat_transfer_scgc; + arma_cube heating_electron_heat_transfer_scgc; + + /// Total heating sources + arma_cube heating_sources_total; + + /// Specific heat (constant volume): + arma_cube Cv_scgc; + }; // bulk quantities (states): @@ -138,6 +154,21 @@ class Ions { // This is the vector that will contain all of the different species: std::vector species; + // Heating terms: + /// Bulk collisional heating with neutrals and electrons (K/s) + arma_cube heating_neutral_friction_scgc; + arma_cube heating_electron_friction_scgc; + + /// Bulk collisional heating with neutrals and electrons (K/s) + arma_cube heating_neutral_heat_transfer_scgc; + arma_cube heating_electron_heat_transfer_scgc; + + /// Total heating sources + arma_cube heating_sources_total; + + /// Specific heat (constant volume): + arma_cube Cv_scgc; + // Electrodynamics: /// Electric potential: arma_cube potential_scgc; @@ -224,6 +255,11 @@ class Ions { **/ void calc_cMax(); + /********************************************************************** + \brief Calculate the individual and bulk specific heats + **/ + void calc_specific_heat(); + /********************************************************************** \brief Sets the boundary conditions of the ions \param grid The grid that the ions are defined on From 3f91dff103da6810834758f11fdc9d23606ccae2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 18 Nov 2024 16:46:54 -0500 Subject: [PATCH 267/691] STOP-GAP: solving for the ion temp on mag grid doesn't work yet --- src/advance.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 4c79f548..4b524d7d 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -61,6 +61,7 @@ bool advance(Planets &planet, ions.fill_electrons(); ions.calc_sound_speed(); ions.calc_cMax(); + ions.calc_specific_heat(); precision_t dtNeutral = calc_dt(gGrid, neutrals.cMax_vcgc); precision_t dtIon = calc_dt(gGrid, ions.cMax_vcgc); @@ -174,8 +175,8 @@ bool advance(Planets &planet, ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); - ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); - ionsMag.calc_electron_temperature(neutralsMag, mGrid); + //ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); + //ionsMag.calc_electron_temperature(neutralsMag, mGrid); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Advection"); From 397645629a71b450a148da7db4c27dadb7cb1903 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 18 Nov 2024 16:49:59 -0500 Subject: [PATCH 268/691] BUG: nuin needs to be zeroed between species --- src/calc_ion_drift.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index eaa86390..e89550a4 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -111,10 +111,10 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (int64_t iComp = 0; iComp < 3; iComp++) { species[iIon].perp_velocity_vcgc[iComp].zeros(); - species[iIon].par_velocity_vcgc[iComp].zeros(); } if (species[iIon].DoAdvect) { + nuin_sum.zeros(); // Need mass density for the current ion species: rho = species[iIon].mass * species[iIon].density_scgc; @@ -126,10 +126,10 @@ void Ions::calc_ion_drift(Neutrals neutrals, // This is assuming that the 3rd dim is radial. // Want actual gravity for 3rd dim - for (iDim = 0; iDim < 3; iDim ++) + for (iDim = 0; iDim < 3; iDim ++) { gravity_vcgc[iDim] = species[iIon].mass * grid.gravity_vcgc[iDim] % species[iIon].density_scgc; - + } // Neutral Wind Forcing: report.print(5, "neutral winds"); @@ -188,6 +188,10 @@ void Ions::calc_ion_drift(Neutrals neutrals, (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / (1 + nuin_sum * dt); species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); + + //std::cout << "par_vel : " << iIon << " " << iComp << " " << species[iIon].par_velocity_vcgc[iComp](2,2,10) + //<< " " << a_par[iComp](2,2,10) * dt / rho(2,2,10)<< "\n"; + } } else { // No Planetary Magnetic field From 61682d02bb275d9cac183d053051c894e74976fd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 18 Nov 2024 16:51:22 -0500 Subject: [PATCH 269/691] FEAT: ion temperature seems to work --- src/calc_ion_temperature.cpp | 98 +++++++++++++++++++++++------------- 1 file changed, 63 insertions(+), 35 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 9a704269..d54e05bf 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -41,11 +41,12 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, static int iFunction = -1; report.enter(function, iFunction); - int64_t iIon, iLon, iLat, nSpecs; + int64_t iIon, iLon, iLat, nSpecs, jIon; int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); int64_t nAlts = grid.get_nAlts(); int64_t nGCs = grid.get_nGCs(); + precision_t Mi, Mj; arma_vec temp1d(nAlts); arma_vec lambda1d(nAlts); @@ -53,6 +54,8 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, arma_vec dalt1d(nAlts); arma_vec conduction1d(nAlts); arma_vec sources1d(nAlts); + arma_vec ratios(nAlts); + arma_vec density_ratio(nAlts); arma_cube tempT(nLons, nLats, nAlts); arma_cube tempD(nLons, nLats, nAlts); @@ -60,21 +63,21 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 60.0; + //temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 100.0; - for (iIon = 0; iIon < nSpecies; iIon++) - species[iIon].temperature_scgc = temperature_scgc; + //for (iIon = 0; iIon < nSpecies; iIon++) + // species[iIon].temperature_scgc = temperature_scgc; //species[iIon].temperature_scgc = neutrals.temperature_scgc; - report.exit(function); - return; + //report.exit(function); + //return; // Loop over all species or assume only bulk calculation - if (input.get_do_calc_bulk_ion_temp()) - // First ion species only, currently is O+ - nSpecs = 1; - else +// if (input.get_do_calc_bulk_ion_temp()) +// // First ion species only, currently is O+ +// nSpecs = 1; +// else nSpecs = nSpecies; if (report.test_verbose(4)) { @@ -85,43 +88,66 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Loop over all species or assume only bulk calculation for (iIon = 0; iIon < nSpecs; iIon++) { - for (iLon = 0; iLon < nLons; iLon++) { - for (iLat = 0; iLat < nLats; iLat++) { - + //std::cout << "iIon : " << iIon << "\n"; + Mi = species[iIon].mass / cAMU; + for (iLon = nGCs; iLon < nLons - nGCs; iLon++) { + for (iLat = nGCs; iLat < nLats - nGCs; iLat++) { + //std::cout << "iLon, iLat : " << iLon << " " << iLat << "\n"; // --------------------------------------------------------------------- // Calculate heat flux (conduction) in 1D; loop over all lat,lon // --------------------------------------------------------------------- - temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); - lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) - / species[iIon].nu_ion_ion[iIon] / 8.0; - front1d = 2.0 / species[iIon].density_scgc.tube(iLon, iLat) - / cKB / 3.0; + ratios.zeros(); + for (jIon = 0; jIon < nSpecies; jIon++) { + if (jIon != iIon) { + Mj = species[jIon].mass / cAMU; + density_ratio = species[jIon].density_scgc.tube(iLon, iLat) / + species[iIon].density_scgc.tube(iLon, iLat); + density_ratio.clamp(0.001, 1000.0); + ratios = ratios + density_ratio * + (species[jIon].charge * species[jIon].charge / + species[iIon].charge / species[iIon].charge) * + sqrt(Mj / (Mi + Mj)) * + (3 * Mi * Mi + 1.6 * Mi * Mj + 1.3 * Mj * Mj)/ + ((Mi + Mj) * (Mi + Mj)); + } + } + temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); + temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); + temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); + lambda1d = 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * + pow(temp1d, 2.5) % (1 + 1.75 * ratios) * cE; + //lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) + // / species[iIon].nu_ion_ion[iIon] / 8.0; + front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); - sources1d.zeros(); + sources1d = (heating_neutral_friction_scgc.tube(iLon, iLat) + + heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); + sources1d = sources1d / front1d; + + //std::cout << "iIon lab : " << iIon << "\n" << lambda1d << "\n source:\n " << sources1d << "\n"; conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, lambda1d, front1d, sources1d, dalt1d, - dt, nGCs, true); + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, + dalt1d, + dt/100., + nGCs, + false); // The conduction solver gives Tnew-Told, so divide by dt - conduction_scgc.tube(iLon, iLat) = conduction1d / dt; + conduction1d.clamp(200, 5000); + species[iIon].temperature_scgc.tube(iLon, iLat) = conduction1d; + + //std::cout << "temp : " << conduction1d << "\n"; } // Lats } // Lons - - // ------------------------------------------------------------------------- - // Add temperature terms together to advance ion temperature - // As more temperature terms get coded, they are added to the parenthesis - // for inclusion in the advancement of the ion temperature - // ------------------------------------------------------------------------- - if (!input.get_do_calc_bulk_ion_temp()) { - species[iIon].temperature_scgc = species[iIon].temperature_scgc + - dt * (conduction_scgc); - } } // Ions - if (!input.get_do_calc_bulk_ion_temp()) { + //if (!input.get_do_calc_bulk_ion_temp()) { // Use the density averaged temperature to fill the bulk temperature tempT.zeros(); tempD.zeros(); @@ -134,8 +160,8 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, } temperature_scgc = tempT / tempD; - } - + //} +/* if (input.get_do_calc_bulk_ion_temp()) { // Add temperature terms together to advance bulk ion temperature temperature_scgc = temperature_scgc + dt * (conduction_scgc); @@ -144,7 +170,9 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, for (iIon = 0; iIon < nSpecies; iIon++) species[iIon].temperature_scgc = temperature_scgc; } +*/ + std::cout << "ion temp : " << temperature_scgc(2,2,20) << " " << neutrals.temperature_scgc(2,2,20) << "\n"; report.exit(function); return; } From 60c15c9afa68a1aa9df4848611bf19b1a497abe8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 18 Nov 2024 16:52:08 -0500 Subject: [PATCH 270/691] FEAT: store needed variables for heating --- src/ions.cpp | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/ions.cpp b/src/ions.cpp index acb6a033..5c1dbdb0 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -34,6 +34,19 @@ Ions::species_chars Ions::create_species(Grid grid) { tmp.losses_scgc.set_size(nLons, nLats, nAlts); tmp.losses_scgc.zeros(); + tmp.heating_neutral_friction_scgc.set_size(nLons, nLats, nAlts); + tmp.heating_neutral_friction_scgc.zeros(); + tmp.heating_electron_friction_scgc.set_size(nLons, nLats, nAlts); + tmp.heating_electron_friction_scgc.zeros(); + tmp.heating_neutral_heat_transfer_scgc.set_size(nLons, nLats, nAlts); + tmp.heating_neutral_heat_transfer_scgc.zeros(); + tmp.heating_electron_heat_transfer_scgc.set_size(nLons, nLats, nAlts); + tmp.heating_electron_heat_transfer_scgc.zeros(); + tmp.heating_sources_total.set_size(nLons, nLats, nAlts); + tmp.heating_sources_total.zeros(); + tmp.Cv_scgc.set_size(nLons, nLats, nAlts); + tmp.Cv_scgc.zeros(); + tmp.par_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.perp_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -92,6 +105,8 @@ Ions::Ions(Grid grid, Planets planet) { velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); cMax_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + Cv_scgc.set_size(nLons, nLats, nAlts); + Cv_scgc.zeros(); gamma_scgc.set_size(nLons, nLats, nAlts); gamma_scgc.ones(); sound_scgc.set_size(nLons, nLats, nAlts); @@ -329,6 +344,42 @@ void Ions::calc_cMax() { return; } +// ---------------------------------------------------------------------- +// Calculate a bunch of derived products: +// - Specific Heat at Constant Volume (Cv) +// ---------------------------------------------------------------------- + +void Ions::calc_specific_heat() { + + int64_t iSpecies; + + std::string function = "Ions::calc_specific_heat"; + static int iFunction = -1; + report.enter(function, iFunction); + + Cv_scgc.zeros(); + gamma_scgc.zeros(); + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // individual Cv for individual temperatures: + species[iSpecies].Cv_scgc = + (species[iSpecies].vibe - 2) * cKB / species[iSpecies].mass / 2; + // Bulk Cv for the bulk temperature: + Cv_scgc = Cv_scgc + + (species[iSpecies].vibe - 2) * + species[iSpecies].density_scgc * + cKB / species[iSpecies].mass; + gamma_scgc = gamma_scgc + + species[iSpecies].density_scgc / (species[iSpecies].vibe - 2); + } + // Bulk Cv and gamma are the density-weighted Cv and gamma + Cv_scgc = Cv_scgc / (2 * density_scgc); + gamma_scgc = gamma_scgc * 2.0 / density_scgc + 1.0; + + report.exit(function); + return; +} + // ----------------------------------------------------------------------------- // Calculate the electron density from the sum of all ion species @@ -346,13 +397,17 @@ void Ions::fill_electrons() { rho_scgc.zeros(); for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // Electron density is the last species: species[nSpecies].density_scgc = species[nSpecies].density_scgc + species[iSpecies].density_scgc; + // While we are at it, calculate the mass density too: rho_scgc = rho_scgc + species[iSpecies].mass * species[iSpecies].density_scgc; } + // The electron density is also stored as the bulk density: density_scgc = species[nSpecies].density_scgc; + // We can now calculate the mean major mass for ions too: mean_major_mass_scgc = rho_scgc / density_scgc; report.exit(function); From 503819bf11fae7c3a5e22c984063fdf308d75776 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 18 Nov 2024 16:53:03 -0500 Subject: [PATCH 271/691] FEAT: make ion heating symmetric with neutral heating --- src/neutral_ion_collisions.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index 358bd1bc..7eb6e20e 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -28,7 +28,7 @@ void calc_ion_collisions(Neutrals &neutrals, arma_cube vDiff(nX, nY, nZ); // momentum so we can divide by the mass density later std::vector momentum; - momentum = make_cube_vector(nX, nY, nZ, 3); + momentum = make_cube_vector(nX, nY, nZ, 3); beta.zeros(); @@ -67,14 +67,32 @@ void calc_ion_collisions(Neutrals &neutrals, % vDiff; } - // multiply by collision frequencies and convert - // energy change to temperature change: + // multiply by collision frequencies divide by two. The two is because we + // assumed that the ion and neutral masses (not rho) were the same above, + // and the bottom term has Mi + Mn and not just Mn. neutrals.heating_ion_friction_scgc = - beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % - neutrals.Cv_scgc); + beta % neutrals.heating_ion_friction_scgc / 2; neutrals.heating_ion_heat_transfer_scgc = - beta % neutrals.heating_ion_friction_scgc / (2 * neutrals.rho_scgc % - neutrals.Cv_scgc); + beta % neutrals.heating_ion_heat_transfer_scgc / 2; + + // The ions get the same amount of energy: + ions.heating_neutral_friction_scgc = 100*neutrals.heating_ion_friction_scgc; + // Temperature difference is reversed (ions giving energy to neutrals): + ions.heating_neutral_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc; + + // convert energy change to temperature change: + neutrals.heating_ion_friction_scgc = + neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc = + neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + std::cout << "ion heat : " << ions.heating_neutral_friction_scgc(2,2,25) << " " + << ions.heating_neutral_heat_transfer_scgc(2,2,25) << " " + << vDiff(2,2,25) << "\n"; + //ions.heating_neutral_friction_scgc = + // ions.heating_neutral_friction_scgc / (ions.rho_scgc % ions.Cv_scgc); + //ions.heating_neutral_heat_transfer_scgc = + // ions.heating_neutral_heat_transfer_scgc / (ions.rho_scgc % ions.Cv_scgc); + } else { energy.zeros(); From 4bf93437c32366ab0e59840cbb3c3cb2442855ca Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:26:49 -0500 Subject: [PATCH 272/691] BUG: seems like the ionization rates are off by 100 --- src/aurora.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index dc93324b..ff319116 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -220,6 +220,7 @@ void calc_aurora(Grid grid, precision_t avee; arma_vec diff_num_flux; arma_vec diff_energy_flux; + arma_vec b1d; bool DoDebug = false; report.print(4, "aurora - starting main loop!"); @@ -228,6 +229,7 @@ void calc_aurora(Grid grid, for (iLon = 0; iLon < nLons ; iLon++) { for (iLat = 0; iLat < nLats ; iLat++) { + // CHANGE eflux = ions.eflux(iLon, iLat); // in ergs/cm2/s avee = ions.avee(iLon, iLat); // in keV @@ -235,11 +237,12 @@ void calc_aurora(Grid grid, // Step 1: Calculate the height-integrated mass density: rhoH1d.zeros(); + b1d = abs(grid.bfield_unit_vcgc[2].tube(iLon,iLat)); for (iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) { rho_tube = neutrals.species[iSpecies].rho_alt_int_scgc.tube(iLon, iLat); - rhoH1d = rhoH1d + rho_tube; + rhoH1d = rhoH1d + rho_tube / b1d; } // Step 2: Calculate the distribution function: @@ -270,7 +273,8 @@ void calc_aurora(Grid grid, } // /cm3 -> /m3 - ionization1d = ionization1d * pcm3topm3; + // CHANGE!!!! + ionization1d = ionization1d * pcm3topm3/100.0; // Step 5: Distribute ionization among neutrals: // Need to figure out which species get what percentage of the From 2092e495d77f4b7d27a38d72823db9e826c424f8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:27:40 -0500 Subject: [PATCH 273/691] FEAT: do things as accelerations and not forces --- src/calc_ion_drift.cpp | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index e89550a4..16f47ea6 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -73,6 +73,9 @@ void Ions::calc_ion_drift(Neutrals neutrals, static int iFunction = -1; report.enter(function, iFunction); + // CHANGE !!! + dt = dt / 10.0; + int64_t nX = grid.get_nX(); int64_t nY = grid.get_nY(); int64_t nZ = grid.get_nZ(); @@ -87,8 +90,9 @@ void Ions::calc_ion_drift(Neutrals neutrals, calc_exb_drift(grid); std::vector gravity_vcgc = make_cube_vector(nX, nY, nZ, 3); - std::vector wind_forcing = make_cube_vector(nX, nY, nZ, 3); + std::vector wind_acc = make_cube_vector(nX, nY, nZ, 3); std::vector total_forcing = make_cube_vector(nX, nY, nZ, 3); + std::vector efield_acc = make_cube_vector(nX, nY, nZ, 3); int64_t iIon, iNeutral, iDim; @@ -114,7 +118,6 @@ void Ions::calc_ion_drift(Neutrals neutrals, } if (species[iIon].DoAdvect) { - nuin_sum.zeros(); // Need mass density for the current ion species: rho = species[iIon].mass * species[iIon].density_scgc; @@ -127,22 +130,23 @@ void Ions::calc_ion_drift(Neutrals neutrals, // This is assuming that the 3rd dim is radial. // Want actual gravity for 3rd dim for (iDim = 0; iDim < 3; iDim ++) { - gravity_vcgc[iDim] = species[iIon].mass * - grid.gravity_vcgc[iDim] % species[iIon].density_scgc; + gravity_vcgc[iDim] = grid.gravity_vcgc[iDim]; + grad_Pi_plus_Pe[iDim] = grad_Pi_plus_Pe[iDim] / rho; + efield_acc[iDim] = Nie % efield_vcgc[iDim] / rho; } // Neutral Wind Forcing: report.print(5, "neutral winds"); for (int64_t iComp = 0; iComp < 3; iComp++) - wind_forcing[iComp].zeros(); - + wind_acc[iComp].zeros(); + nuin_sum.zeros(); for (iNeutral = 0; iNeutral < neutrals.nSpecies; iNeutral++) { - rho_nuin = rho % species[iIon].nu_ion_neutral_vcgc[iNeutral]; + rho_nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; nuin_sum = nuin_sum + species[iIon].nu_ion_neutral_vcgc[iNeutral]; for (int64_t iComp = 0; iComp < 3; iComp++) { - wind_forcing[iComp] = wind_forcing[iComp] + - rho_nuin % neutrals.velocity_vcgc[iComp]; + wind_acc[iComp] = wind_acc[iComp] + + rho_nuin % neutrals.velocity_vcgc[iComp]; } } @@ -151,8 +155,8 @@ void Ions::calc_ion_drift(Neutrals neutrals, total_forcing[iComp] = - grad_Pi_plus_Pe[iComp] + gravity_vcgc[iComp] - + wind_forcing[iComp] - + Nie % efield_vcgc[iComp]; + + wind_acc[iComp] + + efield_acc[iComp]; } std::vector a_par = make_cube_vector(nX, nY, nZ, 3); @@ -178,15 +182,25 @@ void Ions::calc_ion_drift(Neutrals neutrals, bottom.clamp(1e-32, 1e32); for (int64_t iComp = 0; iComp < 3; iComp++) { + // I redefined A to be an acceleration instead of a force, which + // then changes the definition of top top = rho_nuin % a_perp[iComp] + Nie % a_x_b[iComp]; - species[iIon].perp_velocity_vcgc[iComp] = top / bottom; + species[iIon].perp_velocity_vcgc[iComp] = rho_nuin % top / bottom; // Steady state: //species[iIon].par_velocity_vcgc[iComp] = // a_par[iComp] / rho / nuin_sum; species[iIon].par_velocity_vcgc[iComp] = - (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt / rho) / + (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt) / (1 + nuin_sum * dt); + species[iIon].par_velocity_vcgc[iComp].slice(nZ-1).zeros(); + species[iIon].par_velocity_vcgc[iComp].slice(nZ-2).zeros(); + species[iIon].par_velocity_vcgc[iComp].slice(nZ-3) = species[iIon].par_velocity_vcgc[iComp].slice(nZ-4); +// if (iIon == 0 && iComp == 2) +// std::cout << "par : " << species[iIon].par_velocity_vcgc[iComp](2,2,25) << ' ' << +// a_par[iComp](2,2,25) << ' ' << +// nuin_sum(2,2,25) << ' ' << +// rho(2,2,25) << '\n'; species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); //std::cout << "par_vel : " << iIon << " " << iComp << " " << species[iIon].par_velocity_vcgc[iComp](2,2,10) From 543b22271539386fd1d21a527d431abd64afd5bc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:28:16 -0500 Subject: [PATCH 274/691] STY: change outputs --- src/euv.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/euv.cpp b/src/euv.cpp index c4a4069a..62104723 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -344,6 +344,11 @@ bool Euv::euvac(Times time, precision_t f107a = indices.get_f107a(time.get_current()); precision_t mean_f107 = (f107 + f107a) / 2.0; + if (report.test_verbose(4)) + std::cout << "F107, f107a, average : " + << f107 << " " << f107a + << " -> " << mean_f107 << "\n"; + for (int iWave = 0; iWave < nWavelengths; iWave++) { slope = 1.0 + euvac_afac[iWave] * (mean_f107 - 80.0); @@ -351,19 +356,15 @@ bool Euv::euvac(Times time, slope = 0.8; wavelengths_intensity_1au[iWave] = euvac_f74113[iWave] * slope * pcm2topm2; - } - if (report.test_verbose(4)) { - std::cout << "EUVAC output : " - << f107 << " " << f107a - << " -> " << mean_f107 << "\n"; - - for (int iWave = 0; iWave < nWavelengths; iWave++) { + if (report.test_verbose(4)) std::cout << " " << iWave << " " << wavelengths_short[iWave] << " " << wavelengths_long[iWave] << " " - << wavelengths_intensity_1au[iWave] << "\n"; - } + << wavelengths_intensity_1au[iWave]/1e12 << " " + << euvac_afac[iWave] * 100.0 << " " + << euvac_f74113[iWave]/1e9 << " " + << slope << "\n"; } report.exit(function); From f366cdd80606f84886570201116f6c7e03e0ea03 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:31:52 -0500 Subject: [PATCH 275/691] FEAT: 0 gradient of lambda at lower boundary --- src/calc_ion_temperature.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index d54e05bf..115b539b 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -63,7 +63,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - //temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 100.0; + //temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 50.0; //for (iIon = 0; iIon < nSpecies; iIon++) // species[iIon].temperature_scgc = temperature_scgc; @@ -116,6 +116,8 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); lambda1d = 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * pow(temp1d, 2.5) % (1 + 1.75 * ratios) * cE; + lambda1d(1) = lambda1d(2); + lambda1d(0) = lambda1d(2); //lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) // / species[iIon].nu_ion_ion[iIon] / 8.0; front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); @@ -172,7 +174,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, } */ - std::cout << "ion temp : " << temperature_scgc(2,2,20) << " " << neutrals.temperature_scgc(2,2,20) << "\n"; + //std::cout << "ion temp : " << temperature_scgc(2,2,5) << " " << neutrals.temperature_scgc(2,2,5) << "\n"; report.exit(function); return; } From 8928af9ed6641c00cb0fe9db1602a4cc6b96898d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:32:45 -0500 Subject: [PATCH 276/691] FEAT: improve upper BCs --- src/ions_bcs.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index 518d797d..3f61cbea 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -69,12 +69,16 @@ bool Ions::set_upper_bcs(Grid grid) { for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { // Bulk Quantities: - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt - 1); + // Constant gradient (ignoring grid spacing...) + temperature_scgc.slice(iAlt) = + 2 * temperature_scgc.slice(iAlt - 1) - temperature_scgc.slice(iAlt - 2); // For each species: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // Constant gradient (ignoring grid spacing...) species[iSpecies].temperature_scgc.slice(iAlt) = - species[iSpecies].temperature_scgc.slice(iAlt - 1); + 2 * species[iSpecies].temperature_scgc.slice(iAlt - 1) - + species[iSpecies].temperature_scgc.slice(iAlt - 2); aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + electron_temperature_scgc.slice(iAlt)); @@ -84,8 +88,11 @@ bool Ions::set_upper_bcs(Grid grid) { abs(grid.gravity_vcgc[2].slice(iAlt)); // Assume each species falls of with (modified) hydrostatic: species[iSpecies].density_scgc.slice(iAlt) = + species[iSpecies].temperature_scgc.slice(iAlt) / + species[iSpecies].temperature_scgc.slice(iAlt-1) % species[iSpecies].density_scgc.slice(iAlt - 1) % exp(-grid.dalt_lower_scgc.slice(iAlt) / h); + species[iSpecies].velocity_vcgc[2].slice(iAlt).zeros(); } } From 34381ba4da6f6c302a3ec36854cd6d80da074a90 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:33:31 -0500 Subject: [PATCH 277/691] remove output and take 100x out --- src/neutral_ion_collisions.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index 7eb6e20e..5c5983a9 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -76,7 +76,7 @@ void calc_ion_collisions(Neutrals &neutrals, beta % neutrals.heating_ion_heat_transfer_scgc / 2; // The ions get the same amount of energy: - ions.heating_neutral_friction_scgc = 100*neutrals.heating_ion_friction_scgc; + ions.heating_neutral_friction_scgc = neutrals.heating_ion_friction_scgc; // Temperature difference is reversed (ions giving energy to neutrals): ions.heating_neutral_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc; @@ -85,14 +85,9 @@ void calc_ion_collisions(Neutrals &neutrals, neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); neutrals.heating_ion_heat_transfer_scgc = neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); - std::cout << "ion heat : " << ions.heating_neutral_friction_scgc(2,2,25) << " " - << ions.heating_neutral_heat_transfer_scgc(2,2,25) << " " - << vDiff(2,2,25) << "\n"; - //ions.heating_neutral_friction_scgc = - // ions.heating_neutral_friction_scgc / (ions.rho_scgc % ions.Cv_scgc); - //ions.heating_neutral_heat_transfer_scgc = - // ions.heating_neutral_heat_transfer_scgc / (ions.rho_scgc % ions.Cv_scgc); - + //std::cout << "ion heat : " << ions.heating_neutral_friction_scgc(2,2,25) << " " + // << ions.heating_neutral_heat_transfer_scgc(2,2,25) << " " + // << vDiff(2,2,25) << "\n"; } else { energy.zeros(); From bece951213f358be52fcc292dcd9bd8590bbc0c1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:34:31 -0500 Subject: [PATCH 278/691] FEAT: dont do gradients if 1d --- src/solver_gradients.cpp | 107 ++++++++++++++++++++------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index e88231ad..639ea346 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -37,24 +37,25 @@ arma_cube calc_gradient_lon(arma_cube value, Grid grid) { arma_cube gradient(nLons, nLats, nAlts); gradient.zeros(); - // Interior: - for (iLon = 1; iLon < nLons - 1; iLon++) + if (grid.get_HasXdim()) { + // Interior: + for (iLon = 1; iLon < nLons - 1; iLon++) + gradient.row(iLon) = + (value.row(iLon + 1) - value.row(iLon - 1)) / + (2 * grid.dlon_center_dist_scgc.row(iLon)); + + // Lower (one sided): + iLon = 0; gradient.row(iLon) = - (value.row(iLon + 1) - value.row(iLon - 1)) / - (2 * grid.dlon_center_dist_scgc.row(iLon)); - - // Lower (one sided): - iLon = 0; - gradient.row(iLon) = - (value.row(iLon + 1) - value.row(iLon)) / - grid.dlon_center_dist_scgc.row(iLon); - - // Upper (one sided): - iLon = nLons - 1; - gradient.row(iLon) = - (value.row(iLon) - value.row(iLon - 1)) / - grid.dlon_center_dist_scgc.row(iLon); + (value.row(iLon + 1) - value.row(iLon)) / + grid.dlon_center_dist_scgc.row(iLon); + // Upper (one sided): + iLon = nLons - 1; + gradient.row(iLon) = + (value.row(iLon) - value.row(iLon - 1)) / + grid.dlon_center_dist_scgc.row(iLon); + } return gradient; } @@ -72,24 +73,25 @@ arma_cube calc_gradient_lat(arma_cube value, Grid grid) { arma_cube gradient(nLons, nLats, nAlts); gradient.zeros(); - // Interior: - for (iLat = 1; iLat < nLats - 1; iLat++) - gradient.col(iLat) = - (value.col(iLat + 1) - value.col(iLat - 1)) / - (2 * grid.dlat_center_dist_scgc.col(iLat)); - - // Lower (one sided): - iLat = 0; - gradient.col(iLat) = - (value.col(iLat + 1) - value.col(iLat)) / - grid.dlat_center_dist_scgc.col(iLat); + if (grid.get_HasYdim()) { + // Interior: + for (iLat = 1; iLat < nLats - 1; iLat++) + gradient.col(iLat) = + (value.col(iLat + 1) - value.col(iLat - 1)) / + (2 * grid.dlat_center_dist_scgc.col(iLat)); - // Upper (one sided): - iLat = nLats - 1; - gradient.col(iLat) = - (value.col(iLat) - value.col(iLat - 1)) / - grid.dlat_center_dist_scgc.col(iLat); + // Lower (one sided): + iLat = 0; + gradient.col(iLat) = + (value.col(iLat + 1) - value.col(iLat)) / + grid.dlat_center_dist_scgc.col(iLat); + // Upper (one sided): + iLat = nLats - 1; + gradient.col(iLat) = + (value.col(iLat) - value.col(iLat - 1)) / + grid.dlat_center_dist_scgc.col(iLat); + } return gradient; } @@ -108,28 +110,29 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { arma_cube gradient(nLons, nLats, nAlts); gradient.zeros(); - arma_cube one_minus_r2 = 1.0 - grid.dalt_ratio_sq_scgc; + if (grid.get_HasZdim()) { + arma_cube one_minus_r2 = 1.0 - grid.dalt_ratio_sq_scgc; + // Central part + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) + gradient.slice(iAlt) = + (value.slice(iAlt + 1) + - one_minus_r2.slice(iAlt) % value.slice(iAlt) + - grid.dalt_ratio_sq_scgc.slice(iAlt) % value.slice(iAlt - 1)) / + (grid.dalt_lower_scgc.slice(iAlt + 1) % + (1.0 + grid.dalt_ratio_scgc.slice(iAlt))); + + // lower boundary + iAlt = 0; + gradient.slice(iAlt) = + (value.slice(iAlt + 1) - value.slice(iAlt)) / + grid.dalt_lower_scgc.slice(iAlt); - // Central part - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) + // upper boundary + iAlt = nAlts - 1; gradient.slice(iAlt) = - (value.slice(iAlt + 1) - - one_minus_r2.slice(iAlt) % value.slice(iAlt) - - grid.dalt_ratio_sq_scgc.slice(iAlt) % value.slice(iAlt - 1)) / - (grid.dalt_lower_scgc.slice(iAlt + 1) % - (1.0 + grid.dalt_ratio_scgc.slice(iAlt))); - - // lower boundary - iAlt = 0; - gradient.slice(iAlt) = - (value.slice(iAlt + 1) - value.slice(iAlt)) / - grid.dalt_lower_scgc.slice(iAlt); - - // upper boundary - iAlt = nAlts - 1; - gradient.slice(iAlt) = - (value.slice(iAlt) - value.slice(iAlt - 1)) / - grid.dalt_lower_scgc.slice(iAlt); + (value.slice(iAlt) - value.slice(iAlt - 1)) / + grid.dalt_lower_scgc.slice(iAlt); + } return gradient; } From c92ccd5d290801c69d0ec0d1f426b430616d22b7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 12:35:27 -0500 Subject: [PATCH 279/691] advect actual density not log --- src/solver_vertical_rusanov.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index ee4ff2e6..40aa64b3 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -475,7 +475,8 @@ void Ions::solver_vertical_rusanov(Grid grid, if (species[iSpecies].DoAdvect) { // Log(number density): - log_s = log(species[iSpecies].density_scgc); + //log_s = log(species[iSpecies].density_scgc); + log_s = species[iSpecies].density_scgc; calc_grad_and_diff_alts_rusanov(grid, log_s, @@ -508,11 +509,13 @@ void Ions::solver_vertical_rusanov(Grid grid, // densities: log_s = - log(species[iSpecies].density_scgc) - - dt * (divVertVel_s[iSpecies] + + species[iSpecies].density_scgc + //log(species[iSpecies].density_scgc) + - dt * (//divVertVel_s[iSpecies] + species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + dt * diffLogN_s[iSpecies]; - species[iSpecies].newDensity_scgc = exp(log_s); + //species[iSpecies].newDensity_scgc = exp(log_s); + species[iSpecies].newDensity_scgc = log_s; } else species[iSpecies].newDensity_scgc = species[iSpecies].density_scgc; From f3bb8e4195db97adef2231d8e943f9f34a85924e Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 22 Nov 2024 13:41:08 -0500 Subject: [PATCH 280/691] BUG: corrected acc terms --- src/calc_ion_drift.cpp | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 16f47ea6..2e49c340 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -91,13 +91,13 @@ void Ions::calc_ion_drift(Neutrals neutrals, std::vector gravity_vcgc = make_cube_vector(nX, nY, nZ, 3); std::vector wind_acc = make_cube_vector(nX, nY, nZ, 3); - std::vector total_forcing = make_cube_vector(nX, nY, nZ, 3); + std::vector total_acc = make_cube_vector(nX, nY, nZ, 3); std::vector efield_acc = make_cube_vector(nX, nY, nZ, 3); int64_t iIon, iNeutral, iDim; std::vector grad_Pi_plus_Pe; - arma_cube rho, rho_nuin, nuin_sum, Nie, sum_rho; + arma_cube rho, nuin, nuin_sum, Nie, sum_rho; arma_cube top, bottom; nuin_sum.set_size(nX, nY, nZ); @@ -111,6 +111,10 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (int64_t iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp].zeros(); + std::vector a_par = make_cube_vector(nX, nY, nZ, 3); + std::vector a_perp = make_cube_vector(nX, nY, nZ, 3); + std::vector a_x_b; + for (iIon = 0; iIon < nSpecies; iIon++) { for (int64_t iComp = 0; iComp < 3; iComp++) { @@ -141,35 +145,31 @@ void Ions::calc_ion_drift(Neutrals neutrals, wind_acc[iComp].zeros(); nuin_sum.zeros(); for (iNeutral = 0; iNeutral < neutrals.nSpecies; iNeutral++) { - rho_nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; + nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; nuin_sum = nuin_sum + species[iIon].nu_ion_neutral_vcgc[iNeutral]; for (int64_t iComp = 0; iComp < 3; iComp++) { wind_acc[iComp] = wind_acc[iComp] + - rho_nuin % neutrals.velocity_vcgc[iComp]; + nuin % neutrals.velocity_vcgc[iComp]; } } // Total Forcing (sum everything - this is A_s): for (int64_t iComp = 0; iComp < 3; iComp++) { - total_forcing[iComp] = + total_acc[iComp] = - grad_Pi_plus_Pe[iComp] + gravity_vcgc[iComp] + wind_acc[iComp] + efield_acc[iComp]; } - std::vector a_par = make_cube_vector(nX, nY, nZ, 3); - std::vector a_perp = make_cube_vector(nX, nY, nZ, 3); - std::vector a_x_b; - if (grid.get_HasBField()) { // With a Planetary Magnetic field - arma_cube a_dot_b = dot_product(total_forcing, grid.bfield_unit_vcgc); + arma_cube a_dot_b = dot_product(total_acc, grid.bfield_unit_vcgc); for (int64_t iComp = 0; iComp < 3; iComp++) { a_par[iComp] = a_dot_b % grid.bfield_unit_vcgc[iComp]; - a_perp[iComp] = total_forcing[iComp] - a_par[iComp]; + a_perp[iComp] = total_acc[iComp] - a_par[iComp]; } a_x_b = cross_product(a_perp, grid.bfield_vcgc); @@ -177,15 +177,15 @@ void Ions::calc_ion_drift(Neutrals neutrals, // With floats, this can become 0, which then makes the // velocity a nan, so the clamp ensures that the bottom is not 0 bottom = - rho_nuin % rho_nuin + + rho % rho % nuin % nuin + Nie % Nie % grid.bfield_mag_scgc % grid.bfield_mag_scgc; bottom.clamp(1e-32, 1e32); for (int64_t iComp = 0; iComp < 3; iComp++) { // I redefined A to be an acceleration instead of a force, which // then changes the definition of top - top = rho_nuin % a_perp[iComp] + Nie % a_x_b[iComp]; - species[iIon].perp_velocity_vcgc[iComp] = rho_nuin % top / bottom; + top = rho % nuin % a_perp[iComp] + Nie % a_x_b[iComp]; + species[iIon].perp_velocity_vcgc[iComp] = rho % top / bottom; // Steady state: //species[iIon].par_velocity_vcgc[iComp] = @@ -196,21 +196,13 @@ void Ions::calc_ion_drift(Neutrals neutrals, species[iIon].par_velocity_vcgc[iComp].slice(nZ-1).zeros(); species[iIon].par_velocity_vcgc[iComp].slice(nZ-2).zeros(); species[iIon].par_velocity_vcgc[iComp].slice(nZ-3) = species[iIon].par_velocity_vcgc[iComp].slice(nZ-4); -// if (iIon == 0 && iComp == 2) -// std::cout << "par : " << species[iIon].par_velocity_vcgc[iComp](2,2,25) << ' ' << -// a_par[iComp](2,2,25) << ' ' << -// nuin_sum(2,2,25) << ' ' << -// rho(2,2,25) << '\n'; species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); - //std::cout << "par_vel : " << iIon << " " << iComp << " " << species[iIon].par_velocity_vcgc[iComp](2,2,10) - //<< " " << a_par[iComp](2,2,10) * dt / rho(2,2,10)<< "\n"; - } } else { // No Planetary Magnetic field for (int64_t iComp = 0; iComp < 3; iComp++) { - a_par[iComp] = total_forcing[iComp]; + a_par[iComp] = total_acc[iComp]; // Steady state: //species[iIon].par_velocity_vcgc[iComp] = // a_par[iComp] / rho / nuin_sum; From 64a874ebb15997086be859e69550467b89b04db4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 16:22:41 -0500 Subject: [PATCH 281/691] BUG: o+ excited states were misnamed --- share/run/UA/inputs/euv.csv | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/share/run/UA/inputs/euv.csv b/share/run/UA/inputs/euv.csv index 653acae8..3055b608 100644 --- a/share/run/UA/inputs/euv.csv +++ b/share/run/UA/inputs/euv.csv @@ -10,9 +10,9 @@ O2,O2+,ion,1.00E-22, m2,1.316,2.346,4.139,6.619,8.46,9.89,9.056,10.86,10.88,12.2 O2,O+,ion,1.00E-22, m2,0,1.46,3.368,4.281,4.91,5.9,5.332,5.94,5.93,5.212,4.56,4.703,4.818,4.94,5.347,5.139,4.44,3.88,3.824,1.85,1.03,0.962,0.191,0,0,0,0,0,0,0,0,0,0,0,0,0,0, No Comments O,O,abs,1.00E-22, m2,0.73,1.839,3.732,5.202,6.05,7.08,6.461,7.68,7.7,8.693,9.84,9.687,11.496,11.93,12.127,12.059,12.59,13.09,13.024,13.4,13.4,13.365,17.245,11.46,10.736,4,3.89,3.749,5.091,3.498,4.554,1.315,0,0,0,0,0, Last 5 are questionable O,O+,ion,1.00E-22, m2,0.19,0.486,0.952,1.311,1.539,1.77,1.628,1.92,1.925,2.259,2.559,2.523,3.073,3.34,3.394,3.421,3.65,3.92,3.62,3.61,3.88,4.25,5.128,4.89,6.739,4,3.89,3.749,5.091,3.498,4.554,1.315,0,0,0,0,0, Last 5 are questionable -O,O+2D,ion,1.00E-22, m2,0.206,0.529,1.171,1.762,2.138,2.62,2.325,2.842,2.849,3.446,3.936,3.883,4.896,5.37,5.459,5.427,5.67,6.02,5.91,6.17,6.29,6.159,11.453,6.57,3.997,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable -O,O+2P,ion,1.00E-22, m2,0.062,0.163,0.348,0.508,0.598,0.71,0.637,0.691,0.693,0.815,0.787,0.859,0.541,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable -O,O+2P*,ion,1.00E-22, m2,0.049,0.13,0.278,0.366,0.412,0.35,0.383,0.307,0.308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable +O,O+_2D,ion,1.00E-22, m2,0.206,0.529,1.171,1.762,2.138,2.62,2.325,2.842,2.849,3.446,3.936,3.883,4.896,5.37,5.459,5.427,5.67,6.02,5.91,6.17,6.29,6.159,11.453,6.57,3.997,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable +O,O+_2P,ion,1.00E-22, m2,0.062,0.163,0.348,0.508,0.598,0.71,0.637,0.691,0.693,0.815,0.787,0.859,0.541,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable +O,O+_2P*,ion,1.00E-22, m2,0.049,0.13,0.278,0.366,0.412,0.35,0.383,0.307,0.308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable O,O++,ion,1.00E-22, m2,0.088,0.186,0.215,0.11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, Last 5 are questionable N,N,abs,1.00E-22, m2,0.331,0.996,2.49,3.946,4.874,5.725,5.244,6.399,6.413,7.298,8.302,8.15,9.556,10.578,11.016,11.503,11.772,11.778,11.758,11.798,11.212,11.951,12.423,13.265,12.098,11.323,11.244,10.961,11.171,10.294,0.211,0,0,0,0,0,0, Last 5 are questionable N,N+,ion,1.00E-22, m2,0.286,0.878,2.3,3.778,4.787,5.725,5.192,6.399,6.413,7.298,8.302,8.15,9.556,10.578,11.016,11.503,11.772,11.778,11.758,11.798,11.212,11.951,12.423,13.265,12.098,11.323,11.244,10.961,11.171,10.294,0.211,0,0,0,0,0,0, Last 5 are questionable From 02efe00e3d0c48639c06d5df611a2919348e718d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 16:23:08 -0500 Subject: [PATCH 282/691] BUG: missed some excited states of o+ --- share/run/UA/inputs/chemistry_earth_richards.csv | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/share/run/UA/inputs/chemistry_earth_richards.csv b/share/run/UA/inputs/chemistry_earth_richards.csv index 1f9bda8d..a814dfdd 100644 --- a/share/run/UA/inputs/chemistry_earth_richards.csv +++ b/share/run/UA/inputs/chemistry_earth_richards.csv @@ -6,7 +6,7 @@ R4,He+,NO,,,He,N+,O,1.35E-15,,,1,0,0.1,,,,,,,,,,,,,eol R5,He+,NO,,,He,O+,N,1.00E-16,,,1,0,0.1,,,,,,,,,,,,,eol R6,He+,O2,,,He,O+_2D,O,2.37E-16,,,1,0,0.1,Bischof and Linder,1986,,,,,,,,,,,eol R7,He+,O2,,,He,O+_2P,O,6.04E-17,,,1,0,0.1,,,,,,,,,,,,,eol -R8,He+,O2,,,He,O+_4S,O,2.39E-17,,,1,0,0.1,,,,,,,,,,,,,eol +R8,He+,O2,,,He,O+,O,9.70E-16,,,1,0,0.1,,,,,,,,,,,,,eol R9,He+,O2,,,He,O+,O_1D,4.60E-17,,,1,0,0.1,,,,,,,,,,,,,eol R10,He+,O2,,,He,O2+,,9.20E-18,,,1,0,0.1,,,,,,,,,,,,,eol R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,0.1,,,,gitm,250,Te,0.7,,,,1,,eol @@ -20,7 +20,7 @@ R18,N+,O2,,,NO+,O_1D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.36,4.71,0.1,Dotan et al. R18,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol R19,N+,O2,,,NO+,O_3P,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol R19,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol -R20,N+,O2,,,O+_4S,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol +R20,N+,O2,,,O+,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol R20,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,0.1,,,,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,,eol R21,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,,,,1000,,,,eol @@ -39,7 +39,8 @@ R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0,0.1,Vejby-Christensen et al. (1 R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,0,0.1,Torr and Torr,1979,,,300,Te,0.85,,,,1,,eol R33,O+,H,,,O,H+,,6.40E-16,,,1,0,0.1,Anicich,1993,,,,,,,,,,,eol R34,O+,N_2D,,,N+,O,,1.30E-16,,,1,0,0.1,Constantinides et al. (1979) + Bates (1989),,,,,,,,,,,,eol -R35,O+,N2,,,NO+,N,,1.20E-18,,,1,0,0.1,St.-Maurice and Torr (1978) + Hierl et al. (1997),,,,,,,,,,,,eol +R35,O+,N2,,,NO+,N,,1.20E-18,(300/Ti)^-0.45,Ti<=1000,1,0,0.1,St.-Maurice and Torr (1978) + Hierl et al. (1997),,,,300,Ti,-0.45,Ti,0,1000,1,,eol +R35,,,,,,,,7.90E-19,(Ti/1000)^2.12,Ti>1000,1,0,0.1,,,,,1000,Ti,2.12,,1000,,1,,eol R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,0.1,Dotan and Viggiano,1999,,gitm,300,Ti,-0.87,,,,1,,eol R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,0.1,,,,gitm,300,Ti,0.52,Ti,0,900,1,,eol R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,0.1,,,,,900,Ti,-0.92,,900,,1,,eol @@ -52,4 +53,10 @@ R42,O2+,N_2D,,,NO+,O,,1.80E-16,,,1,6.519,0.1,Goldan,1966,,gitm,,,,,,,,,eol R43,O2+,N_2D,,,N+,O,O,8.65E-17,,,1,0,0.1,O'Keefe,1986,<--- doesn't balance!,?????,,,,,,,,,eol R44,O2+,N_2P,,,N,O2+,,2.20E-18,,,1,3.565,0.1,Zipf,1980,,gitm,,,,,,,,,eol R45,O2+,N,,,NO+,O,,1.00E-16,,,1,4.21,0.1,Scott,1999,,gitm,,,,,,,,,eol -R46,O2+,NO,,,NO+,O2+,,4.50E-16,,,1,2.813,0.1,Midey and Viggiano,1999,,gitm,,,,,,,,,eol \ No newline at end of file +R46,O2+,NO,,,NO+,O2+,,4.50E-16,,,1,2.813,0.1,Midey and Viggiano,1999,,gitm,,,,,,,,,eol +R47,O+_2D,,,,O+,,,7.70E-05,,,1,0,0.1,,,,gitm,,,,,,,,,eol +R48,O+_2P,,,,O+,,,4.70E-02,,,1,0,0.1,,,,gitm,,,,,,,,,eol +R49,O+_2D,O,,,O+,O,,1.00E-17,,,1,1.655,0.1,,,,gitm,,,,,,,,,eol +R49,O+_2P,O,,,O+,O,,4.00E-16,,,1,5,0.1,,,,gitm,,,,,,,,,eol +R49,O+_2D,e-,,,O+,e-,,6.03E-14,(300/Te)^0.5,,1,1.655,0.1,,,,gitm,300,Te,0.5,,,,1,,eol +R49,O+_2P,e-,,,O+,e-,,3.03E-14,(300/Te)^0.5,,1,5,0.1,,,,gitm,300,Te,0.5,,,,1,,eol \ No newline at end of file From a454d2559ee7b5ac94904d220674bf27525e7001 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 16:23:44 -0500 Subject: [PATCH 283/691] BUG: o+ split to include excited states --- share/run/UA/inputs/aurora_earth.csv | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/aurora_earth.csv b/share/run/UA/inputs/aurora_earth.csv index bdb78e96..5b58c444 100644 --- a/share/run/UA/inputs/aurora_earth.csv +++ b/share/run/UA/inputs/aurora_earth.csv @@ -1,3 +1,5 @@ N2,N2+,0.92 O2,O2+,1.00 -O,O+,0.56 +O,O+,0.224 +O,O+_2D,0.224 +O,O+_2P,0.112 From c3d04d03de95a68eb6b80d200f30edaed79bb19d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 16:24:44 -0500 Subject: [PATCH 284/691] FEAT: pull calculation of lambda --- include/ions.h | 11 +++++++++ src/ions.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/include/ions.h b/include/ions.h index 3c739f57..a7ab0c4f 100644 --- a/include/ions.h +++ b/include/ions.h @@ -118,6 +118,9 @@ class Ions { /// Specific heat (constant volume): arma_cube Cv_scgc; + /// Heat Conduction: + arma_cube lambda; + }; // bulk quantities (states): @@ -169,6 +172,9 @@ class Ions { /// Specific heat (constant volume): arma_cube Cv_scgc; + /// Head Conduction (bulk): + arma_cube lambda; + // Electrodynamics: /// Electric potential: arma_cube potential_scgc; @@ -260,6 +266,11 @@ class Ions { **/ void calc_specific_heat(); + /********************************************************************** + \brief Calculate the individual and bulk thermal conductivities + **/ + void calc_lambda(); + /********************************************************************** \brief Sets the boundary conditions of the ions \param grid The grid that the ions are defined on diff --git a/src/ions.cpp b/src/ions.cpp index 5c1dbdb0..5ae345d0 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -46,6 +46,8 @@ Ions::species_chars Ions::create_species(Grid grid) { tmp.heating_sources_total.zeros(); tmp.Cv_scgc.set_size(nLons, nLats, nAlts); tmp.Cv_scgc.zeros(); + tmp.lambda.set_size(nLons, nLats, nAlts); + tmp.lambda.zeros(); tmp.par_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); tmp.perp_velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -107,6 +109,8 @@ Ions::Ions(Grid grid, Planets planet) { Cv_scgc.set_size(nLons, nLats, nAlts); Cv_scgc.zeros(); + lambda.set_size(nLons, nLats, nAlts); + lambda.zeros(); gamma_scgc.set_size(nLons, nLats, nAlts); gamma_scgc.ones(); sound_scgc.set_size(nLons, nLats, nAlts); @@ -345,8 +349,61 @@ void Ions::calc_cMax() { } // ---------------------------------------------------------------------- -// Calculate a bunch of derived products: -// - Specific Heat at Constant Volume (Cv) +// Calculate thermal conduction (lambda) +// ---------------------------------------------------------------------- + +void Ions::calc_lambda() { + + int64_t iIon, jIon; + + std::string function = "Ions::calc_specific_heat"; + static int iFunction = -1; + report.enter(function, iFunction); + + lambda.zeros(); + precision_t Mi, Mj; + arma_cube density_ratio, ratios; + + // This sets the size: + ratios = density_scgc; + + for (iIon = 0; iIon < nSpecies; iIon++) { + + Mi = species[iIon].mass / cAMU; + ratios.zeros(); + + for (jIon = 0; jIon < nSpecies; jIon++) { + if (jIon != iIon) { + Mj = species[jIon].mass / cAMU; + density_ratio = species[jIon].density_scgc / + species[iIon].density_scgc; + density_ratio.clamp(0.001, 1000.0); + ratios = ratios + density_ratio * + (species[jIon].charge * species[jIon].charge / + species[iIon].charge / species[iIon].charge) * + sqrt(Mj / (Mi + Mj)) * + (3 * Mi * Mi + 1.6 * Mi * Mj + 1.3 * Mj * Mj)/ + ((Mi + Mj) * (Mi + Mj)); + } + species[iIon].lambda = + 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * + pow(species[iIon].temperature_scgc, 2.5) % (1 + 1.75 * ratios) * cE; + } + lambda = lambda + species[iIon].lambda % species[iIon].density_scgc; + } + lambda = lambda / density_scgc; + + //lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) + // / species[iIon].nu_ion_ion[iIon] / 8.0; + + + report.exit(function); + return; +} + + +// ---------------------------------------------------------------------- +// Calculate Specific Heat at Constant Volume (Cv) // ---------------------------------------------------------------------- void Ions::calc_specific_heat() { From f72443a4441aac5ede68b3dc46acae40e3ff3f06 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Nov 2024 16:25:10 -0500 Subject: [PATCH 285/691] FEAT: implement bulk temperature calculation --- src/calc_ion_temperature.cpp | 105 ++++++++++++++++------------------- 1 file changed, 47 insertions(+), 58 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 115b539b..4b0d02f5 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -78,7 +78,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // // First ion species only, currently is O+ // nSpecs = 1; // else - nSpecs = nSpecies; + nSpecs = nSpecies; if (report.test_verbose(4)) { std::cout << "Bulk ion temp flag: " << input.get_do_calc_bulk_ion_temp() ? @@ -86,71 +86,71 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, std::cout << " so 'number of ions' is " << nSpecs << "\n"; } - // Loop over all species or assume only bulk calculation - for (iIon = 0; iIon < nSpecs; iIon++) { - //std::cout << "iIon : " << iIon << "\n"; - Mi = species[iIon].mass / cAMU; + calc_lambda(); + + if (input.get_do_calc_bulk_ion_temp()) { for (iLon = nGCs; iLon < nLons - nGCs; iLon++) { for (iLat = nGCs; iLat < nLats - nGCs; iLat++) { - //std::cout << "iLon, iLat : " << iLon << " " << iLat << "\n"; - // --------------------------------------------------------------------- - // Calculate heat flux (conduction) in 1D; loop over all lat,lon - // --------------------------------------------------------------------- - ratios.zeros(); - for (jIon = 0; jIon < nSpecies; jIon++) { - if (jIon != iIon) { - Mj = species[jIon].mass / cAMU; - density_ratio = species[jIon].density_scgc.tube(iLon, iLat) / - species[iIon].density_scgc.tube(iLon, iLat); - density_ratio.clamp(0.001, 1000.0); - ratios = ratios + density_ratio * - (species[jIon].charge * species[jIon].charge / - species[iIon].charge / species[iIon].charge) * - sqrt(Mj / (Mi + Mj)) * - (3 * Mi * Mi + 1.6 * Mi * Mj + 1.3 * Mj * Mj)/ - ((Mi + Mj) * (Mi + Mj)); - } - } - temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); - temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); - temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); - lambda1d = 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * - pow(temp1d, 2.5) % (1 + 1.75 * ratios) * cE; + temp1d = temperature_scgc.tube(iLon, iLat); + lambda1d = lambda.tube(iLon, iLat); lambda1d(1) = lambda1d(2); lambda1d(0) = lambda1d(2); - //lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) - // / species[iIon].nu_ion_ion[iIon] / 8.0; - front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); + front1d = 3.0 / 2.0 * cKB * density_scgc.tube(iLon, iLat); dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); sources1d = (heating_neutral_friction_scgc.tube(iLon, iLat) + heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); sources1d = sources1d / front1d; - - //std::cout << "iIon lab : " << iIon << "\n" << lambda1d << "\n source:\n " << sources1d << "\n"; - conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, lambda1d, front1d, sources1d, dalt1d, - dt/100., + dt/10., nGCs, false); - // The conduction solver gives Tnew-Told, so divide by dt conduction1d.clamp(200, 5000); - species[iIon].temperature_scgc.tube(iLon, iLat) = conduction1d; - - //std::cout << "temp : " << conduction1d << "\n"; - - } // Lats - } // Lons - } // Ions + temperature_scgc.tube(iLon, iLat) = conduction1d; + } + } + for (iIon = 0; iIon < nSpecies; iIon++) + species[iIon].temperature_scgc = temperature_scgc; - //if (!input.get_do_calc_bulk_ion_temp()) { - // Use the density averaged temperature to fill the bulk temperature + } else { + + // Loop over all species or assume only bulk calculation + for (iIon = 0; iIon < nSpecs; iIon++) { + for (iLon = nGCs; iLon < nLons - nGCs; iLon++) { + for (iLat = nGCs; iLat < nLats - nGCs; iLat++) { + temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); + temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); + temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); + lambda1d = species[iIon].lambda.tube(iLon, iLat); + lambda1d(1) = lambda1d(2); + lambda1d(0) = lambda1d(2); + front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + sources1d = (species[iIon].heating_neutral_friction_scgc.tube(iLon, iLat) + + species[iIon].heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); + sources1d = sources1d / front1d; + + conduction1d.zeros(); // reset temp variable to zero + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, + dalt1d, + dt/10., + nGCs, + false); + + // The conduction solver gives Tnew-Told, so divide by dt + conduction1d.clamp(200, 5000); + species[iIon].temperature_scgc.tube(iLon, iLat) = conduction1d; + } // Lats + } // Lons + } // Ions tempT.zeros(); tempD.zeros(); @@ -162,19 +162,8 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, } temperature_scgc = tempT / tempD; - //} -/* - if (input.get_do_calc_bulk_ion_temp()) { - // Add temperature terms together to advance bulk ion temperature - temperature_scgc = temperature_scgc + dt * (conduction_scgc); - - // Use the bulk ion temperature to fill all ion specie temperatures - for (iIon = 0; iIon < nSpecies; iIon++) - species[iIon].temperature_scgc = temperature_scgc; } -*/ - //std::cout << "ion temp : " << temperature_scgc(2,2,5) << " " << neutrals.temperature_scgc(2,2,5) << "\n"; report.exit(function); return; } From 4db92d2cece86e84c3b09dbc624e28d942057bc3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Nov 2024 17:56:33 -0500 Subject: [PATCH 286/691] FEAT: add exchange messages for ions --- include/ions.h | 7 ++++ src/exchange_messages.cpp | 85 ++++++++++++++++++++++++++------------- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/include/ions.h b/include/ions.h index a7ab0c4f..521912c1 100644 --- a/include/ions.h +++ b/include/ions.h @@ -370,6 +370,13 @@ class Ions { **/ bool restart_file(std::string dir, bool DoRead); + /********************************************************************** + \brief Exchange messages between processors + \param grid The grid to define the ions on + **/ + // bool exchange(Grid &grid); + bool exchange_old(Grid &grid); + /********************************************************************** \brief Vertical advection solver - Rusanov \param grid The grid to define the neutrals on diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index a4d79c23..d7edeb13 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -3,37 +3,11 @@ #include "aether.h" -// ----------------------------------------------------------------------------- -// This is where all of the exchange messages routines will sit. -// -// Notes: -// - We are going to try to do asynchronous communications, which means we -// need to do the following: -// - pack all variables for all four faces -// - send all messages -// - receive all messages -// - unpack all four faces -// - To do this, we need to make send and receive buffers which can't be -// touched until everything is complete, so we will build a structure -// that contains both the send and receive buffers. -// -// - Direction standard: -// iDir == 0 => face 0 => right -// iDir == 1 => face 1 = up -// iDir == 2 => face 2 = left -// iDir == 3 => face 3 = down -// This is the side we are dealing with for the process. For example, -// iDir == 0 in sending could be iDir == 2 in receiving for blocks -// near the equator. -// ----------------------------------------------------------------------------- - - // ----------------------------------------------------------------------------- // This is the main exchange messages for the neutrals. // We are exchanging densities, temperatures, and velocities // ----------------------------------------------------------------------------- - bool Neutrals::exchange_old(Grid &grid) { std::string function = "Neutrals::exchange"; @@ -62,6 +36,63 @@ bool Neutrals::exchange_old(Grid &grid) { return DidWork; } +// ----------------------------------------------------------------------------- +// This is the main exchange messages for the neutrals. +// We are exchanging densities, temperatures, and velocities +// ----------------------------------------------------------------------------- + +bool Ions::exchange_old(Grid &grid) { + + std::string function = "Ions::exchange"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool DidWork = true; + int64_t nGCs = grid.get_nGCs(); + + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); + } + + DidWork = exchange_one_var(grid, temperature_scgc, false); + DidWork = exchange_one_var(grid, electron_temperature_scgc, false); + + // velocity components: + // reverse east across the pole: + DidWork = exchange_one_var(grid, velocity_vcgc[0], true); + // reverse north across the pole: + DidWork = exchange_one_var(grid, velocity_vcgc[1], true); + // don't reverse vertical across the pole: + DidWork = exchange_one_var(grid, velocity_vcgc[2], false); + + report.exit(function); + return DidWork; +} + + +// ----------------------------------------------------------------------------- +// This is where all of the exchange messages routines will sit. +// +// Notes: +// - We are going to try to do asynchronous communications, which means we +// need to do the following: +// - pack all variables for all four faces +// - send all messages +// - receive all messages +// - unpack all four faces +// - To do this, we need to make send and receive buffers which can't be +// touched until everything is complete, so we will build a structure +// that contains both the send and receive buffers. +// +// - Direction standard: +// iDir == 0 => face 0 => right +// iDir == 1 => face 1 = up +// iDir == 2 => face 2 = left +// iDir == 3 => face 3 = down +// This is the side we are dealing with for the process. For example, +// iDir == 0 in sending could be iDir == 2 in receiving for blocks +// near the equator. +// ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- @@ -343,9 +374,7 @@ bool pack_one_var_on_one_face(arma_cube var_scgc, // Current PE is the sender, so check if receiver exists: if (iReceiver > -1) { iP = 0; - DidWork = pack_border(var_scgc, buffer, &iP, nG, iDir); - } return DidWork; From a24225533e65d3aaec24660a62fe302a3ac54517 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Nov 2024 17:57:34 -0500 Subject: [PATCH 287/691] BUG: need bulk heating terms --- src/ions.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/ions.cpp b/src/ions.cpp index 5ae345d0..712ff592 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -116,6 +116,19 @@ Ions::Ions(Grid grid, Planets planet) { sound_scgc.set_size(nLons, nLats, nAlts); sound_scgc.ones(); + heating_neutral_friction_scgc.set_size(nLons, nLats, nAlts); + heating_neutral_friction_scgc.zeros(); + heating_electron_friction_scgc.set_size(nLons, nLats, nAlts); + heating_electron_friction_scgc.zeros(); + heating_neutral_heat_transfer_scgc.set_size(nLons, nLats, nAlts); + heating_neutral_heat_transfer_scgc.zeros(); + heating_electron_heat_transfer_scgc.set_size(nLons, nLats, nAlts); + heating_electron_heat_transfer_scgc.zeros(); + heating_sources_total.set_size(nLons, nLats, nAlts); + heating_sources_total.zeros(); + + + for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir].zeros(); cMax_vcgc[iDir].ones(); From f922f625b9b41f6b7b2dc1ee0d54e67c58e785bf Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Nov 2024 17:58:10 -0500 Subject: [PATCH 288/691] FEAT: calculate with bulk or individual winds --- src/neutral_ion_collisions.cpp | 68 +++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index 5c5983a9..981e4e77 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -15,13 +15,15 @@ void calc_ion_collisions(Neutrals &neutrals, int64_t nZ = neutrals.density_scgc.n_slices; int64_t nSpecies = neutrals.nSpecies, iSpecies; int64_t iDir, iIon, iIon_, iNeutral, iNeutral_; + precision_t Mi; arma_cube rho_n(nX, nY, nZ); arma_cube rho_i(nX, nY, nZ); arma_cube rho_sum(nX, nY, nZ); // energy is the total energy transfered from ions to neutrals - arma_cube energy(nX, nY, nZ); + arma_cube energy_heat(nX, nY, nZ); + arma_cube energy_friction(nX, nY, nZ); // beta is the sum of the collision frequencies * mass density of ions arma_cube beta(nX, nY, nZ); // velocity difference between ions and neutrals @@ -89,7 +91,15 @@ void calc_ion_collisions(Neutrals &neutrals, // << ions.heating_neutral_heat_transfer_scgc(2,2,25) << " " // << vDiff(2,2,25) << "\n"; } else { - energy.zeros(); + + // --------------------------------------------- + // Use Individual Neutral Winds + // --------------------------------------------- + + for (iIon = 0; iIon < ions.nSpecies; iIon++) { + ions.species[iIon].heating_neutral_friction_scgc.zeros(); + ions.species[iIon].heating_neutral_heat_transfer_scgc.zeros(); + } // Calculate acceleration due to ion drag. Based on Formula 4.124b in Ionospheres text. for (iNeutral = 0; iNeutral < neutrals.nSpeciesAdvect; iNeutral++) { @@ -100,38 +110,40 @@ void calc_ion_collisions(Neutrals &neutrals, for (iDir = 0; iDir < 3; iDir++) momentum[iDir].zeros(); - for (iIon = 0; iIon < ions.nSpeciesAdvect; iIon++) { - Ions::species_chars & advected_ion = ions.species[ions.species_to_advect[iIon]]; - rho_i = advected_ion.mass * advected_ion.density_scgc; - beta = rho_i % advected_ion.nu_ion_neutral_vcgc[iNeutral]; - precision_t one_over_masses = 1.0 / (advected_ion.mass + advected_neutral.mass); + for (iIon = 0; iIon < ions.nSpecies; iIon++) { + Mi = ions.species[iIon].mass; + rho_i = Mi * ions.species[iIon].density_scgc; + beta = rho_i % ions.species[iIon].nu_ion_neutral_vcgc[iNeutral]; + precision_t one_over_masses = 1.0 / (Mi + advected_neutral.mass); // B = rho_i * Nu_in // Acc (for each species) = sum_over_ions(B * (Vi - Vn)) / rho // Momentum = sum(B * (Vi - Vn)) // Energy = sum_neutrals(sum__ions(B/(Mi + Mn) * (Ti - Tn) + Mi * (Vi-Vn)^2)) + energy_heat = 3 * cKB * one_over_masses * + (ions.species[iIon].temperature_scgc - neutrals.temperature_scgc); + energy_heat = energy_heat % beta; neutrals.heating_ion_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc + - 3 * cKB * one_over_masses * - (ions.temperature_scgc - neutrals.temperature_scgc); + neutrals.heating_ion_heat_transfer_scgc + energy_heat; + energy_friction.zeros(); for (iDir = 0; iDir < 3; iDir++) { - vDiff = (advected_ion.par_velocity_vcgc[iDir] + - advected_ion.perp_velocity_vcgc[iDir] - + vDiff = (ions.species[iIon].velocity_vcgc[iDir] + advected_neutral.velocity_vcgc[iDir]); - neutrals.heating_ion_friction_scgc = - neutrals.heating_ion_friction_scgc + - (advected_ion.mass * one_over_masses) * vDiff % vDiff; + energy_friction = energy_friction + + (Mi * one_over_masses) * vDiff % vDiff % beta; momentum[iDir] = momentum[iDir] + beta % vDiff; - - } // for each ion - - // + } // for each direction neutrals.heating_ion_friction_scgc = - neutrals.heating_ion_friction_scgc % beta; - neutrals.heating_ion_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc % beta; + neutrals.heating_ion_friction_scgc + energy_friction; + + // The ions get the same amount of energy: + ions.species[iIon].heating_neutral_friction_scgc = + ions.species[iIon].heating_neutral_friction_scgc + energy_friction; + // Temperature difference is reversed (ions giving energy to neutrals): + ions.species[iIon].heating_neutral_heat_transfer_scgc = + ions.species[iIon].heating_neutral_heat_transfer_scgc - energy_heat; } // for each ion // Divide by the mass density to get the acceleration @@ -139,6 +151,18 @@ void calc_ion_collisions(Neutrals &neutrals, advected_neutral.acc_ion_drag[iDir] = momentum[iDir] / rho_n; } // for each neutral + // Take all of the individual ions energy and give them to bulk energy: + ions.heating_neutral_friction_scgc.zeros(); + ions.heating_neutral_heat_transfer_scgc.zeros(); + for (iIon = 0; iIon < ions.nSpecies; iIon++) { + ions.heating_neutral_friction_scgc = + ions.heating_neutral_friction_scgc + + ions.species[iSpecies].heating_neutral_friction_scgc; + ions.heating_neutral_heat_transfer_scgc = + ions.heating_neutral_heat_transfer_scgc + + ions.species[iSpecies].heating_neutral_heat_transfer_scgc; + } + // Convert from energy into K/s: neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); From dbaafd09be7c47658a3a1c7704e3b5d83d121044 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Nov 2024 17:58:44 -0500 Subject: [PATCH 289/691] FEAT: exchange messages for ions --- src/advance.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/advance.cpp b/src/advance.cpp index 4b524d7d..0b97cef3 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -106,6 +106,7 @@ bool advance(Planets &planet, // we have those dimensions: if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { neutrals.exchange_old(gGrid); + ions.exchange_old(gGrid); advect(gGrid, time, neutrals); } if (didWork & input.get_check_for_nans()) From 62563dadb24f4bf841ee436e7b7a751364aad072 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Nov 2024 17:59:11 -0500 Subject: [PATCH 290/691] FEAT: bulk vs individual temperatures --- src/calc_ion_temperature.cpp | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 4b0d02f5..28885dd6 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -63,21 +63,6 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, // Get the time step size precision_t dt = time.get_dt(); - //temperature_scgc = 200.0 + sqrt(grid.geoAlt_scgc / 1000.0 - 90.0) * 50.0; - - //for (iIon = 0; iIon < nSpecies; iIon++) - // species[iIon].temperature_scgc = temperature_scgc; - - //species[iIon].temperature_scgc = neutrals.temperature_scgc; - - //report.exit(function); - //return; - - // Loop over all species or assume only bulk calculation -// if (input.get_do_calc_bulk_ion_temp()) -// // First ion species only, currently is O+ -// nSpecs = 1; -// else nSpecs = nSpecies; if (report.test_verbose(4)) { @@ -88,6 +73,9 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, calc_lambda(); + // ------------------------------------------------- + // This is for calculating the bulk temperature: + // ------------------------------------------------- if (input.get_do_calc_bulk_ion_temp()) { for (iLon = nGCs; iLon < nLons - nGCs; iLon++) { for (iLat = nGCs; iLat < nLats - nGCs; iLat++) { @@ -119,8 +107,11 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, } else { - // Loop over all species or assume only bulk calculation - for (iIon = 0; iIon < nSpecs; iIon++) { + // ------------------------------------------------- + // This is for calculating the individual temperature: + // ------------------------------------------------- + + for (iIon = 0; iIon < nSpecies; iIon++) { for (iLon = nGCs; iLon < nLons - nGCs; iLon++) { for (iLat = nGCs; iLat < nLats - nGCs; iLat++) { temp1d = species[iIon].temperature_scgc.tube(iLon, iLat); From 0f9f73737ff8af4988ea5ece928ddd345ebe4205 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 9 Dec 2024 16:57:51 -0500 Subject: [PATCH 291/691] STY: clean up comment whitespace --- src/init_mag_grid.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index ff4620ca..f9b6004c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -214,9 +214,9 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, return; } -/////////////////////////////////////////// -// convert cell coordinates to geographic// -/////////////////////////////////////////// +//////////////////////////////////////////// +// convert cell coordinates to geographic // +//////////////////////////////////////////// std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, arma_cube magAlt, Planets planet){ std::string function = "Grid::init_dipole_grid"; From e012e966f00d881162d5c0db93d161b06146d897 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 16 Dec 2024 17:22:46 -0500 Subject: [PATCH 292/691] Clean up some of the debugging & create a template for dipole gravity (probably won't be used) --- src/init_mag_grid.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index f9b6004c..f9bd2aec 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -102,6 +102,15 @@ arma_vec baselat_spacing(precision_t extent, return Lats; } +// // Gravity vectors in the dipole basis +// void calc_dipole_gravity(Planets planet){ + +// // rhat = -(2*cos/(del)) qhat + (sin/(del)) phat + + +// } + + // === SPACING ALONG FIELD LINE === // // Coordinates along the field line to begin modeling // - In dipole (p,q) coordinates @@ -174,7 +183,6 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, magQ_scgc(iLon, iLat, iAlt) = qp2; } - r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; bLats(iLat, iAlt) = r_theta.second; @@ -340,8 +348,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; precision_t min_apex_re = (min_apex + planetRadius) / planetRadius; - std:: cout< Date: Mon, 16 Dec 2024 17:24:17 -0500 Subject: [PATCH 293/691] sty: clean up comments --- src/init_mag_grid.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index f9bd2aec..d232b05a 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -403,9 +403,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(3, "baselats done!"); - // arma_vec lShells(nLats); // latitude & altitude of points on field lines (2D) - // arma_mat bLats(nLats, nAlts), bAlts(nLats, nAlts); fill_field_lines(baseLats, nAlts, min_apex_re, Gamma, planet); From e2d00c9d8bc06418c2e1ac0b1e6ec2925165f36c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 16 Dec 2024 17:35:43 -0500 Subject: [PATCH 294/691] BUG: Fix indexing when inserting cells into dipole grid. it's weird to do it this way, but it works --- src/init_mag_grid.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index d232b05a..92805132 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -211,8 +211,9 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } - r3d.tube(iLon, iLat) = rNorm1d * planetRadius; - magLat_scgc.tube(iLon, nLats - iLat - 1) = -lat1dAlong; + // Indexing is weird, but consistent. Might be helpful to plot out... + r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; + magLat_scgc.tube(iLon, nLats - iLat - 1) = lat1dAlong; } } From 87511edf3091d2a9713a6713ba0049791202caa7 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 16 Dec 2024 19:27:16 -0500 Subject: [PATCH 295/691] STY: Formatting fill_grid.cpp and a comment describing what's going on. --- src/fill_grid.cpp | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index cc4e86c4..0efbf60e 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -434,15 +434,19 @@ void Grid::calc_cent_acc(Planets planet) { cent_acc_vcgc[2] = omega2 * radius_scgc % cos(geoLat_scgc) % cos(geoLat_scgc); } - void Grid::calc_dipole_grid_spacing(Planets planet) { int64_t iLon, iLat, iAlt; report.print(3, "starting calc_grid_spacing"); + + // This is close, but may need to be adjusted later. + // These quantities are obtained from integrating the scale factor (h) + // The along-field-line distance (alt) should be right, but the lat distance + // is the shortest distance from a point to the adjacent field line, not the adjacent cell. + report.print(3, "starting alt"); - calc_alt_dipole_grid_spacing(); report.print(3, "starting lat"); calc_lat_dipole_grid_spacing(); @@ -463,7 +467,6 @@ void Grid::calc_dipole_grid_spacing(Planets planet) report.print(3, "ending calc_grid_spacing"); } - // for sanity (only marginally helpful): inline arma_mat delTm(arma_mat theta){ return (sqrt(3 * cos(theta) % cos(theta) + 1)); @@ -484,25 +487,22 @@ void Grid::calc_alt_dipole_grid_spacing() // arma_vec alt_spacing; precision_t planetRadius; - for (int64_t iLat = 1; iLat < nLats; iLat++) { - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { + dalt_center_scgc.slice(iAlt) = - // 1 / (magP_scgc.slice(iAlt + 1) - // % abs(sin(magLat_scgc.slice(iAlt + 1)) - sin(magLat_scgc.slice(iAlt -1)))) / 2.0; - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1) ) % (1/delTm(magLat_scgc.slice(iAlt + 1) )) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTm(magLat_scgc.slice(iAlt - 1) )) - )*2; - + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) + % (1 / delTm(magLat_scgc.slice(iAlt + 1))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + dalt_lower_scgc.slice(iAlt) = - // 1 / (magP_scgc.slice(iAlt + 1) - // % abs(sin(magLat_scgc.slice(iAlt)) - sin(magLat_scgc.slice(iAlt-1)))); - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt) ) % (1/delTm(magLat_scgc.slice(iAlt) )) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1) ) % (1/delTm(magLat_scgc.slice(iAlt - 1) )) - )*2; + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) + % (1 / delTm(magLat_scgc.slice(iAlt))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; } } @@ -543,10 +543,10 @@ void Grid::calc_lat_dipole_grid_spacing() for (iLat = 1; iLat < nLats - 1; iLat++) { dlat_center_scgc.col(iLat) = - abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1) ) % (1 / delTc(magLat_scgc.col(iLat + 1) )) - - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1) ) % (1 / delTc(magLat_scgc.col(iLat - 1) )) - )*2; - + abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) + % (1 / delTc(magLat_scgc.col(iLat + 1))) + - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) + % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; } // Bottom (one sided): @@ -574,8 +574,7 @@ void Grid::calc_long_dipole_grid_spacing() for (iLon = 1; iLon < nLons - 1; iLon++) dlon_center_scgc.row(iLon) = (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; - // this might be fine for the dipole, if it works for the geo grid... - + // this might be fine for the dipole, if it works for the geo grid... // Bottom (one sided): iLon = 0; From 1ff1b9d2de28bf1bab5d470cd19ba0ed2c302a46 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 16 Dec 2024 20:06:00 -0500 Subject: [PATCH 296/691] doc: update comments in init_mag_grid field line spacing --- src/init_mag_grid.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 92805132..c71d63b3 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -163,10 +163,9 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, q_N = -q_S; // calculate const. stride similar to sami2/3 (huba & joyce 2000) - // and in schunk handbook : - // - millward et al (CTIP) ~p249-250 - // - Bailey & Balan ~p197 + // Note, this is not the: // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == + // but a different formula where the spacing is easily controlled. // Doesn't have any lat/lon dependence so won't work for offset dipoles delqp = (q_N - q_S) / (nAlts + 1); delqp = min_altRe * delqp; From ee7e07f75e68e2760399999a8db36af308384b6d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 14:33:54 -0500 Subject: [PATCH 297/691] BUG/DOC: Fixes in baselat spacing in init_mag_grid - clean up comments & report statements (typos) - lay down baselats in the same order as geo grid, make interpolation easier later! --- src/init_mag_grid.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index c71d63b3..301f606b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -63,7 +63,7 @@ arma_vec baselat_spacing(precision_t extent, // get the upper & lower latitude bounds for our division of the quadree if (origin < 0) { - // negative origin: lat_high <=> lat_low, & vice-versa. + // negative origin: lat_high <=> lat_low lat_low, lat_high = -upper_lim, -lower_lim; lat_low0 = lat_low; lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); @@ -81,7 +81,7 @@ arma_vec baselat_spacing(precision_t extent, bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); dlat = (lat_high - lat_low) / (nLats); - report.print(4, "baselates laydown!"); + report.print(4, "baselats laydown!"); for (int64_t j = 0; j < nLats; j++) { @@ -89,14 +89,16 @@ arma_vec baselat_spacing(precision_t extent, angq = aa + bb * pow(ang0, spacing_factor); Lats[j] = angq; } - report.print(5, "baselates flipback!"); + report.print(5, "baselats flipback!"); + // In the flipback case (single processor, global sim), we want baselats + // to be strictly increasing, same as geo grid! if (DO_FLIPBACK) for (int64_t j = 0; j < nLats; j++) { - Lats[j + nLats] = -1 * Lats[j]; + Lats[j + nLats] = -1 * Lats[nLats - j - 1]; } - report.print(4, "baselates flipbackdone!"); + report.print(4, "baselats flipback done!"); report.exit(function); return Lats; From e78d6db580642c51bcb9d81349241611b6db47b4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 14:36:37 -0500 Subject: [PATCH 298/691] DOC/BUG: field-line spacing bug & docs in init_mag_grid - the order stuff was placed was weird. - correct comments too --- src/init_mag_grid.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 301f606b..6150e708 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -115,8 +115,9 @@ arma_vec baselat_spacing(precision_t extent, // === SPACING ALONG FIELD LINE === // // Coordinates along the field line to begin modeling -// - In dipole (p,q) coordinates -// - North & south hemisphere base +// - Created in dipole (p,q) coordinates, stored as magnetic coords +// - North & south hemisphere base-latitudes, shouldn't be *too* hard to support offset +// dipole and/or oblate Earth. void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, precision_t Gamma, @@ -164,10 +165,10 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, q_S = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); q_N = -q_S; - // calculate const. stride similar to sami2/3 (huba & joyce 2000) - // Note, this is not the: + // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) + // Note this is not the: // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // but a different formula where the spacing is easily controlled. + // but a different formula where the spacing is more easily controlled. // Doesn't have any lat/lon dependence so won't work for offset dipoles delqp = (q_N - q_S) / (nAlts + 1); delqp = min_altRe * delqp; @@ -197,7 +198,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t planetRadius; // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - // This is wrong, but get_radius doesnt support latitude at the time of writing + // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. planetRadius = planet.get_radius(bLats(0)); for (int64_t iLat = 0; iLat < nLats; iLat++) @@ -212,13 +213,15 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } - // Indexing is weird, but consistent. Might be helpful to plot out... - r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; - magLat_scgc.tube(iLon, nLats - iLat - 1) = lat1dAlong; + // Lay things down in the same order as the geo grod. + magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; + // r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; + magLat_scgc.tube(iLon, iLat) = lat1dAlong; } } - magAlt_scgc = r3d; + // magAlt_scgc = r3d; + // magAlt_scgc.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; report.exit(function); return; @@ -366,7 +369,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin arma_vec size_right_norm = quadtree_ion.get_vect("SR"); // lon_lims arma_vec size_up_norm = quadtree_ion.get_vect("SU"); //[1] = lat_lims - report.print(3, "longitudes"); + report.print(3, "Initializing (dipole) longitudes"); precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; From f4cd32a411dae00da0215865af9f87d8350a2de4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 19:43:02 -0500 Subject: [PATCH 299/691] FEAT: Dipole edges: longitude --- include/grid.h | 14 +++++++++++++- src/init_mag_grid.cpp | 19 ++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/include/grid.h b/include/grid.h index bda58030..adb84b2c 100644 --- a/include/grid.h +++ b/include/grid.h @@ -81,6 +81,18 @@ class Grid arma_cube magP_scgc; arma_cube magQ_scgc; + // And the corners/edges for the magnetic grid: + arma_cube magLon_Left; + arma_cube magLon_Corner; + + arma_cube magLat_Down; + arma_cube magLat_Below; + arma_cube magLat_Corner; + + arma_cube magAlt_Down; + arma_cube magAlt_Below; + arma_cube magAlt_Corner; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; @@ -200,7 +212,7 @@ class Grid void calc_lat_dipole_grid_spacing(); void calc_long_dipole_grid_spacing(); void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, - precision_t Gamma, Planets planet); + void dipole_alt_edges(); // void calc_alt_dipole_grid_spacing(); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 6150e708..a286986e 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -374,6 +374,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); + + arma_vec lon1dLeft(nLons + 1); // if we are not doing anything in the lon direction, then set dlon to // something reasonable: if (!HasXdim) @@ -382,19 +384,26 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Dimension iterators int64_t iLon, iLat, iAlt; - // Longitudes: + // Longitudes (symmetric, for now): // - Make a 1d vector // - copy it into the 3d cube - for (iLon = 0; iLon < nLons; iLon++) + for (iLon = 0; iLon < nLons; iLon++){ lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; + lon1dLeft(iLon) = lon0 + (iLon - nGCs) * dlon; // corners + } + + lon1dLeft(nLons) = lon0 + (nLons - nGCs) * dlon; for (iLat = 0; iLat < nLats; iLat++) { - for (iAlt = 0; iAlt < nAlts; iAlt++) + for (iAlt = 0; iAlt < nAlts; iAlt++){ + // centers: magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; - // geoLon_Left.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + // left edges + magLon_Left.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + } } - report.print(3, "longitudes point two"); + report.print(3, "Done initializing longitudes, moving to latitude"); // Latitudes: From 80bdf830f6b9ad1e933c9ed9b8fb0d4b1086761a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 19:44:19 -0500 Subject: [PATCH 300/691] FEAT Dipole edges: latitude --- include/grid.h | 2 ++ src/init_mag_grid.cpp | 51 +++++++++++++++++++++++++++++++++++-------- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/include/grid.h b/include/grid.h index adb84b2c..212cc6ee 100644 --- a/include/grid.h +++ b/include/grid.h @@ -212,6 +212,8 @@ class Grid void calc_lat_dipole_grid_spacing(); void calc_long_dipole_grid_spacing(); void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, + precision_t Gamma, Planets planet, + bool isCorner); void dipole_alt_edges(); // void calc_alt_dipole_grid_spacing(); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a286986e..7507534c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -118,10 +118,14 @@ arma_vec baselat_spacing(precision_t extent, // - Created in dipole (p,q) coordinates, stored as magnetic coords // - North & south hemisphere base-latitudes, shouldn't be *too* hard to support offset // dipole and/or oblate Earth. +// isCorner is a bool, if false then the p's and q's are stored for later (p,q cell centers). +// Field line filling only needs to be redone for the "down" edges, left is the same p,q +// and then for "lower", we just shift the p,q after void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, precision_t Gamma, - Planets planet) + Planets planet, + bool isCorner=false) { std::string function = "Grid::fill_field_lines"; @@ -149,9 +153,10 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); report.print(3, "lshells calculated!"); - // for (int64_t iLon = 0; iLon < nLons; iLon ++){ + if (!isCorner){ for (int64_t iLat = 0; iLat < nLats; iLat ++){ magP_scgc.col(iLat) = magP_scgc.col(iLat) + Lshells(iLat); + } } int64_t nZby2 = nAlts / 2; @@ -181,10 +186,10 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, // Q value at this point: qp2 = q_S + ft * delq; - for (int64_t iLon=0; iLon < nLons; iLon ++) { + if (!isCorner){ + for (int64_t iLon=0; iLon < nLons; iLon ++) magQ_scgc(iLon, iLat, iAlt) = qp2; } - r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; bLats(iLat, iAlt) = r_theta.second; @@ -213,16 +218,21 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } - // Lay things down in the same order as the geo grod. + // Lay things down in the same order as the geo grid. + // Use isCorner to find out where to put them. + if (isCorner){ + // Down: baselatitudes are different, other edges dont need to be + // re-calculated w this func + magAlt_Down.tube(iLon, iLat) = rNorm1d * planetRadius; + magLat_Down.tube(iLon, iLat) = lat1dAlong; + } + else{ //centers magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; - // r3d.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; + } } } - // magAlt_scgc = r3d; - // magAlt_scgc.tube(iLon, nLats - iLat - 1) = rNorm1d * planetRadius; - report.exit(function); return; } @@ -415,10 +425,33 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) arma_vec baseLats = baselat_spacing(size_up_norm[1], lower_left_norm[1], max_lat, min_lat, nLats, 1.0); + // downward sides (latitude shifted by 1/2 step): + // TODO: This only works for linear latitude spacing, which is all that's supported right now. + // When the exponential spacing (or something else) is fixed, this needs updating. + precision_t dlat; + dlat = baseLats(1) - baseLats(0); + arma_vec baseLats_down(nLats + 1); + + // put one cell halfway btwn everything, leave 1st and last cell for now... + for (int64_t iLat = 1; iLat < nLats; iLat ++){ + baseLats_down(iLat) = baseLats(iLat-1) + (dlat * 0.5); + } + //Put in 1st and last cell. Done this way so it's easier to put in supercell or something else + baseLats_down(0) = baseLats(0) - dlat * 0.5; + baseLats_down(0) = baseLats(nLats-1) + dlat * 0.5; + + report.print(3, "baselats done!"); // latitude & altitude of points on field lines (2D) + // Cell centers fill_field_lines(baseLats, nAlts, min_apex_re, Gamma, planet); + // Corners (final bool argument) tells function to place stuff in the corner. + // This is only down for the "down" edges, where the base latitudes are different. + fill_field_lines(baseLats_down, nAlts, min_apex_re, Gamma, planet, true); + + report.print(4, "Field-aligned Edges"); + dipole_alt_edges(); report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); From a84246862e36d07c016029db4da1da4ce50abb14 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 19:44:46 -0500 Subject: [PATCH 301/691] FEAT: Set sizes of unique dipole edge cubes --- src/grid.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index 44d460a2..3310ed35 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -143,6 +143,18 @@ Grid::Grid(std::string gridtype) { magLocalTime_scgc.set_size(nX, nY, nZ); + magLon_Left.set_size(nX + 1, nY, nZ); + + magLat_Down.set_size(nX, nY + 1, nZ); + magLat_Below.set_size(nX, nY, nZ + 1); + + magAlt_Down.set_size(nX, nY + 1, nZ); + magAlt_Below.set_size(nX, nY, nZ + 1); + + magLon_Corner.set_size(nX + 1, nY + 1, nZ + 1); + magLat_Corner.set_size(nX + 1, nY + 1, nZ + 1); + magAlt_Corner.set_size(nX + 1, nY + 1, nZ + 1); + radius_scgc.set_size(nX, nY, nZ); radius2_scgc.set_size(nX, nY, nZ); radius2i_scgc.set_size(nX, nY, nZ); From 3ea99efcfc0e30a91faae9fbd016ac7193446742 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 19:47:32 -0500 Subject: [PATCH 302/691] FEAT: (q,p) -> (r,theta) func takes cubes as input now - Pretty sure this is correct... --- src/init_mag_grid.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 7507534c..5742c73e 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -32,6 +32,27 @@ std::pair qp_to_r_theta(precision_t q, precision_t p) return {r, theta}; } +std::pair qp_to_r_theta(arma_cube q, arma_cube p) +{ + // return quanties + arma_cube r, theta; + // Intermediate quantities: + arma_cube term0, term1, term2, term3; + + term0 = 256.0 / 27.0 * (q % q) % (p % p); + term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); + term2 = pow(term0, 1.0 / 3.0); + term3 = 0.5 * pow(((term1 % term1 + term1 % term2 + term2 % term2) / term1), 3.0 / 2.0); + + r = p % (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); + + // now that r is determined we can solve for theta + // theta = asin(sqrt(r/p)); + theta = asin(q % (r%r)); + + return {r, theta}; +} + arma_vec baselat_spacing(precision_t extent, precision_t origin, precision_t upper_lim, From b59854b03e145c62abc73cdb3fd6dee5895891de Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 23:27:41 -0500 Subject: [PATCH 303/691] FEAT: Lay down points on field line so it's easier to get to the corners later --- src/init_mag_grid.cpp | 53 +++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 12 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5742c73e..5844246f 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -172,6 +172,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, arma_vec Lshells(nLats); for (int64_t iLat = 0; iLat < nLats; iLat++) Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); + report.print(3, "lshells calculated!"); if (!isCorner){ @@ -179,6 +180,15 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, magP_scgc.col(iLat) = magP_scgc.col(iLat) + Lshells(iLat); } } + else{ + for (int64_t iLon = 0; iLon < nLons; iLon ++){ + for (int64_t iLat = 0; iLat < nLats; iLat ++){ + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + magP_Down(iLon, iLat, iAlt) = Lshells(iLat); + }}} + } + report.print(3, "dipole p-values stored for later."); + int64_t nZby2 = nAlts / 2; @@ -207,10 +217,17 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, // Q value at this point: qp2 = q_S + ft * delq; + if (!isCorner){ for (int64_t iLon=0; iLon < nLons; iLon ++) magQ_scgc(iLon, iLat, iAlt) = qp2; } + else { + // save the q for the "down" case: + for (int64_t iLon=0; iLon < nLons; iLon ++) + magQ_Down(iLon, iLat, iAlt) = qp2; + } + r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; bLats(iLat, iAlt) = r_theta.second; @@ -219,8 +236,12 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, report.print(3, "QP-rtheta done!"); + if (isCorner){ // we don't need the rest, yet + report.exit(function); + return; + } + arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); - arma_cube r3d(nLons, nLats, nAlts); precision_t planetRadius; // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -240,19 +261,11 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, rNorm1d(iAlt) = bAlts(iLat, iAlt); } // Lay things down in the same order as the geo grid. - // Use isCorner to find out where to put them. - if (isCorner){ - // Down: baselatitudes are different, other edges dont need to be - // re-calculated w this func - magAlt_Down.tube(iLon, iLat) = rNorm1d * planetRadius; - magLat_Down.tube(iLon, iLat) = lat1dAlong; - } - else{ //centers + //centers only magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; } } - } report.exit(function); return; @@ -422,7 +435,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; lon1dLeft(iLon) = lon0 + (iLon - nGCs) * dlon; // corners } - lon1dLeft(nLons) = lon0 + (nLons - nGCs) * dlon; for (iLat = 0; iLat < nLats; iLat++) { @@ -434,6 +446,13 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) } } + for (iAlt = 0; iAlt < nAlts + 1; iAlt++){ + for (iLat = 0; iLat < nLats + 1; iLat++) { + // Corners + magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + } + } + report.print(3, "Done initializing longitudes, moving to latitude"); // Latitudes: @@ -483,7 +502,17 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; - report.print(4, "Done dipole -> geographic transformations for the dipole grid."); + report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); + + // To get cell corner locations, we need lon_left(0), lat_down(1), and alt_below(2): + + + + llr = mag_to_geo(magLon_Corner, magLat_Corner, magAlt_Corner, planet); + geoLon_Corner = llr[0]; + geoLat_Corner = llr[1]; + geoAlt_Corner = llr[2] - planetRadius; + report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); // Calculate the radius, of planet fill_grid_radius(planet); From 24406d92060abb73c65b7d59d8ed6aa5f1b01a35 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 17 Dec 2024 23:30:48 -0500 Subject: [PATCH 304/691] FEAT: Fix the dipole corners. Updates to all grid files --- include/grid.h | 8 +++ src/grid.cpp | 7 +++ src/init_mag_grid.cpp | 126 +++++++++++++++++++++++++++++++++++++++--- 3 files changed, 133 insertions(+), 8 deletions(-) diff --git a/include/grid.h b/include/grid.h index 212cc6ee..f1cf689f 100644 --- a/include/grid.h +++ b/include/grid.h @@ -93,6 +93,14 @@ class Grid arma_cube magAlt_Below; arma_cube magAlt_Corner; + // these need to be stored in (p,q) coords for a bit, its messy: + arma_cube magP_Down; + arma_cube magP_Below; + arma_cube magQ_Down; + arma_cube magQ_Below; + arma_cube magP_Corner; + arma_cube magQ_Corner; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; diff --git a/src/grid.cpp b/src/grid.cpp index 3310ed35..c8ccaab2 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -155,6 +155,13 @@ Grid::Grid(std::string gridtype) { magLat_Corner.set_size(nX + 1, nY + 1, nZ + 1); magAlt_Corner.set_size(nX + 1, nY + 1, nZ + 1); + magP_Down.set_size(nX, nY + 1, nZ); + magP_Below.set_size(nX, nY, nZ + 1); + magQ_Down.set_size(nX, nY + 1, nZ); + magQ_Below.set_size(nX, nY, nZ + 1); + magP_Corner.set_size(nX + 1, nY + 1, nZ + 1); + magQ_Corner.set_size(nX + 1, nY + 1, nZ + 1); + radius_scgc.set_size(nX, nY, nZ); radius2_scgc.set_size(nX, nY, nZ); radius2i_scgc.set_size(nX, nY, nZ); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5844246f..8143fdb1 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -174,12 +174,12 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); report.print(3, "lshells calculated!"); - + if (!isCorner){ for (int64_t iLat = 0; iLat < nLats; iLat ++){ magP_scgc.col(iLat) = magP_scgc.col(iLat) + Lshells(iLat); } - } + } else{ for (int64_t iLon = 0; iLon < nLons; iLon ++){ for (int64_t iLat = 0; iLat < nLats; iLat ++){ @@ -220,8 +220,8 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, if (!isCorner){ for (int64_t iLon=0; iLon < nLons; iLon ++) - magQ_scgc(iLon, iLat, iAlt) = qp2; - } + magQ_scgc(iLon, iLat, iAlt) = qp2; + } else { // save the q for the "down" case: for (int64_t iLon=0; iLon < nLons; iLon ++) @@ -264,8 +264,8 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, //centers only magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; - } } + } report.exit(function); return; @@ -304,6 +304,117 @@ Planets planet){ return llr; } +// Use magP and magQ to make alt edges: +// This does the heavy lifting for the edges & corners of the dipole grid. +// These will be 1/2 way btwn each q point, which is pretty close to evenly spaced. +// They will not, however, line up from one field line to the next. +// It's not going to be *too* hard to get the corners to line up, but it messes with the +// orthogonality too much for me to figure out right now. +void Grid::dipole_alt_edges(){ + + std::string function = "Grid::dipole_alt_edges"; + static int iFunction = -1; + report.enter(function, iFunction); + + // P-coordinates will be the same along alt coord, we saved p-vals when we made them + // in the fill field line function. + precision_t pTmp; + + for (int64_t iLon = 0; iLon < nLons; iLon++) { + for (int64_t iLat = 0; iLat < nLats; iLat++) { + pTmp = magP_Down(iLon, iLat, 0); + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + magP_Corner(iLon, iLat, iAlt) = pTmp; + } + } + } + + // Here are some shortcuts that exploit the symmetry. + // This is done by each coord so cases like offset dipoles or oblate planets are easier later + + // first, use the fact that p is the same along each field line (alt) + for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { + magP_Corner(iLon, iLat, nAlts) = magP_Corner(iLon, iLat, nAlts - 1); + } + } +std::cout<<"2\n"; + + // next, take the final p-value (in lat) to be one more step in p. + // Will not be the same size as prev. cells, but that's (hopefully) ok + // And at high latitudes, that cell is going to be super awkward. + // This is what needs changing when it's supercell time #todo + for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { + for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt++) { + magP_Corner(iLon, nLats, iAlt) = (magP_Corner(iLon, nLats - 2, iAlt) - magP_Corner(nLons, nLats - 1, iAlt)) / 2 + + magP_Corner(iLon, nLats - 1, iAlt); + } + } +std::cout<<"3\n"; + + // // And final step, use the longitude symmetry. + // // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. + for (int64_t iAlt = 0; iAlt < nAlts-1; iAlt++) { + for (int64_t iLat = 0; iLat < nLats-1; iLat++) { + magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons-1, iLat, iAlt); + } + } +std::cout<<"4\n"; + + // For q-coord we'll avg q above and below the point... + // May need to change the dipole spacing func's to get this working exactly though. + // With how the field line pts are currently put in, there would be one edge at the equator (r=inf) + // so for the last point we'll take a step in q equal to the final center + the q-dist from the + // previous corner, to ensure the final center is within the final 2 corners. + precision_t qTmp; + + for (int64_t iLon = 0; iLon < nLons; iLon++) { + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + magQ_Corner(iLon, iLat, iAlt) = magQ_Down(iLon, iLat, iAlt); + } + } + } +std::cout<<"5\n"; + + // for last (alt) corner, take the same step as the prev corner to the highest center. + // this will force the highest corner to be above the last center + for (int64_t iLon = 0; iLon < nLons; iLon++) { + for (int64_t iLat = 0; iLat < nLats; iLat++) { + qTmp = 2*magQ_scgc(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, nAlts - 1); + magQ_Corner(iLon, iLat, nAlts) = qTmp; + } + } + + // last lon corner, copy previous. It's the same! + for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt ++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { + magQ_Corner(nLons, iLat, iAlt) = magQ_Corner(nLons - 1, iLat, iAlt); + } + } + // last lat corner is tricky. just take another latitude step, I guess. + // Will work for now. + for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt ++) { + for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { + magQ_Corner(iLon, nLats, iAlt) = (magQ_Corner(iLon, nLats - 2, iAlt) - magQ_Corner(nLons-1, nLats - 1, iAlt)) / 2 + + magQ_Corner(iLon, nLats - 1, iAlt); + } + } + +std::cout<<"6\n"; + + // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races + std::pair rtheta; + rtheta = qp_to_r_theta(magQ_Corner, magP_Corner); + magAlt_Below = rtheta.first; + magLat_Below = rtheta.second; + + + report.exit(function); + return; +} + + // ----------------------------------------------------------------------- // Convert XyzDipole to XyzGeo // @@ -472,11 +583,11 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) dlat = baseLats(1) - baseLats(0); arma_vec baseLats_down(nLats + 1); - // put one cell halfway btwn everything, leave 1st and last cell for now... + // put one cell halfway btwn each base latitude, leave 1st and last cell for now... for (int64_t iLat = 1; iLat < nLats; iLat ++){ baseLats_down(iLat) = baseLats(iLat-1) + (dlat * 0.5); } - //Put in 1st and last cell. Done this way so it's easier to put in supercell or something else + // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else baseLats_down(0) = baseLats(0) - dlat * 0.5; baseLats_down(0) = baseLats(nLats-1) + dlat * 0.5; @@ -493,7 +604,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(4, "Field-aligned Edges"); dipole_alt_edges(); - report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); From 7455f68c6eb65f06bc483e6792a9397527d39dd3 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 14:02:11 -0500 Subject: [PATCH 305/691] BUG: Lay down a half, not whole, dipole field line forgot to commit this earlier. Scale the exp_q_dist by nAlts, not nAlts/2 We can also switch to q_Start (and 0), instead of q_s and q_N --- src/init_mag_grid.cpp | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8143fdb1..79f242a3 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -155,7 +155,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, int64_t nLats = baseLats.n_elem; - precision_t q_S, q_N, delqp; + precision_t q_Start, delqp; arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); // allocate & calculate some things outside of the main loop @@ -189,34 +189,30 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, } report.print(3, "dipole p-values stored for later."); - - int64_t nZby2 = nAlts / 2; - for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) - exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nZby2) / (nAlts / 10.0)), 2.0)); + exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nAlts) / (nAlts / 5.0)), 2.0)); report.print(3, "expQ"); for (int iLat = 0; iLat < nLats; iLat++) { - q_S = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); - q_N = -q_S; + q_Start = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) // Note this is not the: // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == // but a different formula where the spacing is more easily controlled. // Doesn't have any lat/lon dependence so won't work for offset dipoles - delqp = (q_N - q_S) / (nAlts + 1); + delqp = (-q_Start) / (nAlts + 1); delqp = min_altRe * delqp; for (int iAlt = 0; iAlt < nAlts; iAlt++) { - qp0 = q_S + iAlt * (delqp); - fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_S / delqp - 1); - ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_S) / delqp); - delq = qp0 - q_S; + qp0 = q_Start + iAlt * (delqp); + fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_Start / delqp - 1); + ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_Start) / delqp); + delq = qp0 - q_Start; // Q value at this point: - qp2 = q_S + ft * delq; + qp2 = q_Start + ft * delq; if (!isCorner){ for (int64_t iLon=0; iLon < nLons; iLon ++) From 6c1ae5762064230b22430f06c287348125ad2434 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 14:03:34 -0500 Subject: [PATCH 306/691] STY: minor linting, some readability things in init_mag_grid & grid.h --- include/grid.h | 23 ++++++++++++----------- src/init_mag_grid.cpp | 8 +++++--- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/include/grid.h b/include/grid.h index f1cf689f..0b506b24 100644 --- a/include/grid.h +++ b/include/grid.h @@ -215,17 +215,6 @@ class Grid void calc_lat_grid_spacing(); void calc_long_grid_spacing(); - void calc_dipole_grid_spacing(Planets planet); - void calc_alt_dipole_grid_spacing(); - void calc_lat_dipole_grid_spacing(); - void calc_long_dipole_grid_spacing(); - void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, - precision_t Gamma, Planets planet, - bool isCorner); - void dipole_alt_edges(); - - // void calc_alt_dipole_grid_spacing(); - void fill_grid_radius(Planets planet); void calc_rad_unit(Planets planet); void calc_gravity(Planets planet); @@ -247,6 +236,18 @@ class Grid precision_t XyzGeo[3]); bool init_dipole_grid(Quadtree quadtree_ion, Planets planet); + // Support functions: + void calc_dipole_grid_spacing(Planets planet); + void calc_alt_dipole_grid_spacing(); + void calc_lat_dipole_grid_spacing(); + void calc_long_dipole_grid_spacing(); + void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, + precision_t Gamma, Planets planet, + bool isCorner); + void dipole_alt_edges(Planets planet); + + +void saveCubeToCSV(arma_cube cube, std::string filename); // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 79f242a3..a68383b2 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -23,11 +23,13 @@ std::pair qp_to_r_theta(precision_t q, precision_t p) term2 = pow(term0, 1.0 / 3.0); term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); - r = p * (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); + r = p * (4.0 * term3) / ((1.0 + term3) * (1.0 + sqrt(2.0 * term3 - 1.0))); // now that r is determined we can solve for theta // theta = asin(sqrt(r/p)); - theta = asin(q * pow(r, 2.0)); + theta = acos(q * pow(r, 2.0)); + // Then make sure its the correct sign & direction + theta = cPI/2 - theta; return {r, theta}; } @@ -261,7 +263,7 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; } - } + } report.exit(function); return; From daf6cfe93f92ab4759692037a6350b7f3bfaeb46 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 14:05:44 -0500 Subject: [PATCH 307/691] bug/feat Pass planet radius into dipole corner function in an effort to try and figure out why its wrong... --- src/init_mag_grid.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a68383b2..c16f7fa1 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -308,7 +308,7 @@ Planets planet){ // They will not, however, line up from one field line to the next. // It's not going to be *too* hard to get the corners to line up, but it messes with the // orthogonality too much for me to figure out right now. -void Grid::dipole_alt_edges(){ +void Grid::dipole_alt_edges(Planets planet){ std::string function = "Grid::dipole_alt_edges"; static int iFunction = -1; @@ -403,10 +403,13 @@ std::cout<<"6\n"; // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races std::pair rtheta; + precision_t planetRadius; rtheta = qp_to_r_theta(magQ_Corner, magP_Corner); - magAlt_Below = rtheta.first; magLat_Below = rtheta.second; + // Change if the dipole is offset and/or planet is oblate: + planetRadius = planet.get_radius(magLat_Below.at(1)); + magAlt_Below = rtheta.first * planetRadius; report.exit(function); return; From 11ba535b83800886184273176e77aedb02ee98a5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 17:39:34 -0500 Subject: [PATCH 308/691] bug/sty: dont rely on data being initialized to zero for magP in init_mag_grid --- src/init_mag_grid.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index c16f7fa1..bfa969b7 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -178,10 +178,14 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, report.print(3, "lshells calculated!"); if (!isCorner){ - for (int64_t iLat = 0; iLat < nLats; iLat ++){ - magP_scgc.col(iLat) = magP_scgc.col(iLat) + Lshells(iLat); + for (int64_t iLon = 0; iLon < nLons; iLon ++){ + for (int64_t iLat = 0; iLat < nLats; iLat ++){ + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + magP_scgc(iLon, iLat, iAlt) = Lshells(iLat); + } } } + } else{ for (int64_t iLon = 0; iLon < nLons; iLon ++){ for (int64_t iLat = 0; iLat < nLats; iLat ++){ From 142e5d7b2a608c34ceaf5d915b044e01565766f1 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 18:57:02 -0500 Subject: [PATCH 309/691] sty (bug?): make init_mag_grid be SUPER pedantic about local vs global vars if a var within a function has the same name as a global & it changes the value, let's just be really clear it's only the **local** var that should be changed. --- src/init_mag_grid.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index bfa969b7..a85d298e 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -69,7 +69,7 @@ arma_vec baselat_spacing(precision_t extent, // intermediate latitude values precision_t lat_low, lat_high, lat_low0, lat_high0; // intermediate calculation values - precision_t dlat, bb, aa, ang0, angq; + precision_t dlat, bb, aa, ang0, angq, nLats_here, extent_here; // Now we can allocate the return array, arma_vec Lats(nLats); @@ -79,8 +79,11 @@ arma_vec baselat_spacing(precision_t extent, if (extent > 0.5) { DO_FLIPBACK = true; - nLats = nLats / 2; - extent = 0.5; + nLats_here = nLats / 2; + extent_here = 0.5; + } + else{ + nLats_here = nLats; } // get the upper & lower latitude bounds for our division of the quadree @@ -90,23 +93,23 @@ arma_vec baselat_spacing(precision_t extent, lat_low, lat_high = -upper_lim, -lower_lim; lat_low0 = lat_low; lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); - lat_high = lat_low0 - (lat_high - lat_low0) * (extent / .5 + origin / 0.5); + lat_high = lat_low0 - (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); } else { lat_low0 = lower_lim; lat_low = lat_low + (lat_high - lat_low) * (origin / 0.5); - lat_high = lat_low0 + (lat_high - lat_low0) * (extent / .5 + origin / 0.5); + lat_high = lat_low0 + (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); } // normalized spacing in latitude // NOTE: spacing factor != 1 will not work yet. but framework is here... bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); - dlat = (lat_high - lat_low) / (nLats); + dlat = (lat_high - lat_low) / (nLats_here); report.print(4, "baselats laydown!"); - for (int64_t j = 0; j < nLats; j++) + for (int64_t j = 0; j < nLats_here; j++) { ang0 = lat_low + (j + 1) * dlat; angq = aa + bb * pow(ang0, spacing_factor); @@ -117,9 +120,9 @@ arma_vec baselat_spacing(precision_t extent, // In the flipback case (single processor, global sim), we want baselats // to be strictly increasing, same as geo grid! if (DO_FLIPBACK) - for (int64_t j = 0; j < nLats; j++) + for (int64_t j = 0; j < nLats_here; j++) { - Lats[j + nLats] = -1 * Lats[nLats - j - 1]; + Lats[j + nLats_here] = -1 * Lats[nLats_here - j - 1]; } report.print(4, "baselats flipback done!"); From f98514e7e22419e23860cc7b3dc2de227b68a739 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 18 Dec 2024 19:20:39 -0500 Subject: [PATCH 310/691] sty: more clear naming of vars, again, in init_mag_grid found a couple unused variables, and some that shared names w others --- src/init_mag_grid.cpp | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a85d298e..470845ea 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -148,7 +148,7 @@ arma_vec baselat_spacing(precision_t extent, // Field line filling only needs to be redone for the "down" edges, left is the same p,q // and then for "lower", we just shift the p,q after -void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, +void Grid::fill_field_lines(arma_vec baseLats, precision_t min_altRe, precision_t Gamma, Planets planet, bool isCorner=false) @@ -158,14 +158,14 @@ void Grid::fill_field_lines(arma_vec baseLats, int64_t nAlts, static int iFunction = -1; report.enter(function, iFunction); - int64_t nLats = baseLats.n_elem; + // int64_t nLats = baseLats.n_elem; precision_t q_Start, delqp; arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); // allocate & calculate some things outside of the main loop // - mostly just factors to make the code easier to read - precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3, new_r; + precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3; // exp_q_dist is the fraction of total q-distance to step for each pt along field line arma_vec exp_q_dist(nAlts); @@ -293,13 +293,13 @@ Planets planet){ precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - std::vector dipole_center = planet.get_dipole_center(); // Reverse our dipole rotations: xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); // offset dipole (not yet implemented): + // std::vector dipole_center = planet.get_dipole_center(); // xyz_geo[0] = xyzRot2[0] + dipole_center[0]; // xyz_geo[1] = xyzRot2[1] + dipole_center[1]; // xyz_geo[2] = xyzRot2[2] + dipole_center[2]; @@ -604,10 +604,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // latitude & altitude of points on field lines (2D) // Cell centers - fill_field_lines(baseLats, nAlts, min_apex_re, Gamma, planet); + fill_field_lines(baseLats, min_apex_re, Gamma, planet); // Corners (final bool argument) tells function to place stuff in the corner. // This is only down for the "down" edges, where the base latitudes are different. - fill_field_lines(baseLats_down, nAlts, min_apex_re, Gamma, planet, true); + fill_field_lines(baseLats_down, min_apex_re, Gamma, planet, true); report.print(4, "Field-aligned Edges"); dipole_alt_edges(); @@ -622,14 +622,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) geoAlt_scgc = llr[2] - planetRadius; report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); - // To get cell corner locations, we need lon_left(0), lat_down(1), and alt_below(2): - - - - llr = mag_to_geo(magLon_Corner, magLat_Corner, magAlt_Corner, planet); - geoLon_Corner = llr[0]; - geoLat_Corner = llr[1]; - geoAlt_Corner = llr[2] - planetRadius; + std::vector llr_corner = mag_to_geo(magLon_Corner, magLat_Corner, magAlt_Corner, planet); + geoLon_Corner = llr_corner[0]; + geoLat_Corner = llr_corner[1]; + geoAlt_Corner = llr_corner[2] - planetRadius; report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); // Calculate the radius, of planet From cbce9655658f99cd0501f541066c7f4d3f7bad7d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 09:50:44 -0500 Subject: [PATCH 311/691] BUG: Fix math in qp->r,theta for arma_cube in init_mag grid holy crap this was hard to find. Dipole looks (mostly) good now --- src/init_mag_grid.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 470845ea..9773eb30 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -41,15 +41,14 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) // Intermediate quantities: arma_cube term0, term1, term2, term3; - term0 = 256.0 / 27.0 * (q % q) % (p % p); + term0 = 256.0 / 27.0 * (q % q) % (p % p % p % p); term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); term2 = pow(term0, 1.0 / 3.0); term3 = 0.5 * pow(((term1 % term1 + term1 % term2 + term2 % term2) / term1), 3.0 / 2.0); - r = p % (4.0 * term3) / (1.0 + term3) / (1.0 + sqrt(2.0 * term3 - 1.0)); + r = p % (4.0 * term3) / ((1.0 + term3) % (1.0 + sqrt(2.0 * term3 - 1.0))); // now that r is determined we can solve for theta - // theta = asin(sqrt(r/p)); theta = asin(q % (r%r)); return {r, theta}; From 35e35ed2097945a1281d7d570025c51709be7545 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 09:55:32 -0500 Subject: [PATCH 312/691] BUGS: More robust handling of dipole corners, cleanup from last commits > this is "bad github practice" but there were some changes that got forgotten in previous commits. whoops. it's all going to the same place anyways, as they say :) --- include/grid.h | 2 +- src/init_mag_grid.cpp | 32 ++++++++++++++++---------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/include/grid.h b/include/grid.h index 0b506b24..41d8df26 100644 --- a/include/grid.h +++ b/include/grid.h @@ -241,7 +241,7 @@ class Grid void calc_alt_dipole_grid_spacing(); void calc_lat_dipole_grid_spacing(); void calc_long_dipole_grid_spacing(); - void fill_field_lines(arma_vec baseLats, int64_t nAlts, precision_t min_altRe, + void fill_field_lines(arma_vec baseLats, precision_t min_altRe, precision_t Gamma, Planets planet, bool isCorner); void dipole_alt_edges(Planets planet); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 9773eb30..8f8d5757 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -105,7 +105,7 @@ arma_vec baselat_spacing(precision_t extent, // NOTE: spacing factor != 1 will not work yet. but framework is here... bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); - dlat = (lat_high - lat_low) / (nLats_here); + dlat = (lat_high - lat_low) / (nLats_here+1); report.print(4, "baselats laydown!"); for (int64_t j = 0; j < nLats_here; j++) @@ -222,19 +222,19 @@ void Grid::fill_field_lines(arma_vec baseLats, // Q value at this point: qp2 = q_Start + ft * delq; - if (!isCorner){ - for (int64_t iLon=0; iLon < nLons; iLon ++) - magQ_scgc(iLon, iLat, iAlt) = qp2; - } - else { + if (isCorner){ // save the q for the "down" case: for (int64_t iLon=0; iLon < nLons; iLon ++) magQ_Down(iLon, iLat, iAlt) = qp2; - } - - r_theta = qp_to_r_theta(qp2, Lshells(iLat)); - bAlts(iLat, iAlt) = r_theta.first; - bLats(iLat, iAlt) = r_theta.second; + } + else { + for (int64_t iLon=0; iLon < nLons; iLon ++){ + magQ_scgc(iLon, iLat, iAlt) = qp2; + } + r_theta = qp_to_r_theta(qp2, Lshells(iLat)); + bAlts(iLat, iAlt) = r_theta.first; + bLats(iLat, iAlt) = r_theta.second; + } } } @@ -411,11 +411,11 @@ std::cout<<"6\n"; std::pair rtheta; precision_t planetRadius; rtheta = qp_to_r_theta(magQ_Corner, magP_Corner); - magLat_Below = rtheta.second; + magLat_Corner = rtheta.second; // Change if the dipole is offset and/or planet is oblate: - planetRadius = planet.get_radius(magLat_Below.at(1)); - magAlt_Below = rtheta.first * planetRadius; + planetRadius = planet.get_radius(magLat_scgc.at(1)); + magAlt_Corner = rtheta.first * planetRadius; report.exit(function); return; @@ -596,7 +596,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) } // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else baseLats_down(0) = baseLats(0) - dlat * 0.5; - baseLats_down(0) = baseLats(nLats-1) + dlat * 0.5; + // baseLats_down(0) = baseLats(nLats-1) + dlat * 0.5; report.print(3, "baselats done!"); @@ -609,7 +609,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) fill_field_lines(baseLats_down, min_apex_re, Gamma, planet, true); report.print(4, "Field-aligned Edges"); - dipole_alt_edges(); + dipole_alt_edges(planet); report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); From 5512844b2565fd682e95af336f77477f61dcc261 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 09:58:13 -0500 Subject: [PATCH 313/691] bugs/sty: clean up comments & debug statements in init_mag_grid --- src/init_mag_grid.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8f8d5757..59bdb238 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -280,7 +280,7 @@ void Grid::fill_field_lines(arma_vec baseLats, //////////////////////////////////////////// std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, arma_cube magAlt, Planets planet){ - std::string function = "Grid::init_dipole_grid"; + std::string function = "Grid::mag_to_geo"; static int iFunction = -1; report.enter(function, iFunction); @@ -305,6 +305,8 @@ Planets planet){ // transform back to lon, lat, radius: llr = transform_xyz_to_llr_3d(xyzRot2); + + report.exit(function); return llr; } @@ -342,7 +344,6 @@ void Grid::dipole_alt_edges(Planets planet){ magP_Corner(iLon, iLat, nAlts) = magP_Corner(iLon, iLat, nAlts - 1); } } -std::cout<<"2\n"; // next, take the final p-value (in lat) to be one more step in p. // Will not be the same size as prev. cells, but that's (hopefully) ok @@ -354,16 +355,14 @@ std::cout<<"2\n"; + magP_Corner(iLon, nLats - 1, iAlt); } } -std::cout<<"3\n"; - // // And final step, use the longitude symmetry. - // // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. + // And final step, use the longitude symmetry. + // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. for (int64_t iAlt = 0; iAlt < nAlts-1; iAlt++) { for (int64_t iLat = 0; iLat < nLats-1; iLat++) { magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons-1, iLat, iAlt); } } -std::cout<<"4\n"; // For q-coord we'll avg q above and below the point... // May need to change the dipole spacing func's to get this working exactly though. @@ -379,7 +378,6 @@ std::cout<<"4\n"; } } } -std::cout<<"5\n"; // for last (alt) corner, take the same step as the prev corner to the highest center. // this will force the highest corner to be above the last center @@ -405,8 +403,6 @@ std::cout<<"5\n"; } } -std::cout<<"6\n"; - // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races std::pair rtheta; precision_t planetRadius; @@ -429,7 +425,7 @@ std::cout<<"6\n"; void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) { - std::string function = "Grid::init_dipole_grid"; + std::string function = "Grid::convert_dipole_geo_xyz"; static int iFunction = -1; report.enter(function, iFunction); @@ -466,6 +462,10 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec // Remove Shift vector_add(XyzRemoveRot, dipole_center, XyzGeo); + + report.exit(function); + return; + } // ---------------------------------------------------------------------- @@ -573,7 +573,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) report.print(3, "Done initializing longitudes, moving to latitude"); - // Latitudes: + //////////////// + // Latitudes: // + //////////////// // min_lat calculated from min_apex precision_t min_lat = acos(sqrt(1 / min_apex_re)); From e01ce55e5ba865e34ee61d6abf5d1594c5706429 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 10:01:07 -0500 Subject: [PATCH 314/691] FEAT: New input name, and default opts, for ionGrid. This could break old input files, watch out! Seems ok on my end though... --- share/run/UA/inputs/defaults.json | 12 +++--------- share/run/aether.json | 7 ++++--- src/inputs.cpp | 4 +++- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 37f74488..f879aff9 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -78,22 +78,16 @@ "AltFile" : ""}, "ionGrid" : { - "Shape" : "sphere", - "LatRange" : [-90.0, 90.0], + "Shape" : "dipole", "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], + "LonRange" : [0.0, 360.0], "nLonsPerBlock" : 22, "nAlts" : 50, "MinAlt" : 80.0, "MinApex" : 120.0, - "MaxAlt" : 5000.0, "LatMax":88.0, - "LineSpacing":0.2, "LatStretch":1.0, - "dAltkm" : 5.0, - "dAltScale" : 0.25, - "IsUniformAlt" : true, - "AltFile" : ""}, + "dAltScale" : 0.6}, "Oblate" : { "isOblate" : false, diff --git a/share/run/aether.json b/share/run/aether.json index 4d19e93d..f84b7b2c 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -26,11 +26,12 @@ "IsUniformAlt" : false}, "ionGrid": { - "dAltScale": 0.2, + "dAltScale": 0.6, "LatStretch": 1, "Shape": "dipole", - "nLatsPerBlock" : 22, - "nAlts":159, + "nLonsPerBlock": 36, + "nLatsPerBlock" : 18, + "nAlts":36, "LatMax":88, "MinAlt":100.0, "MinApex":150.0 diff --git a/src/inputs.cpp b/src/inputs.cpp index 24af7a47..d5c20502 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -502,8 +502,10 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) // Latitude range (base of field line) is specified with max lat & min apex. grid_specs.max_blat = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); + // stretch the baselatitudes (not yet implemented) grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); - grid_specs.FieldLineStretch = check_settings_pt(gridtype, "LineSpacing"); + // controls the spacing of points along field line, <<1 for more pts at low alts + grid_specs.FieldLineStretch = check_settings_pt(gridtype, "dAltStretch"); } else { From b0fca87a58911112fc235b10b448e5684f9a197c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 10:11:10 -0500 Subject: [PATCH 315/691] BUG: Fix name of dAlt variable for ion grid in input files. --- share/run/UA/inputs/defaults.json | 2 +- share/run/aether.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index f879aff9..6a5218b3 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -87,7 +87,7 @@ "MinApex" : 120.0, "LatMax":88.0, "LatStretch":1.0, - "dAltScale" : 0.6}, + "dAltStretch" : 0.6}, "Oblate" : { "isOblate" : false, diff --git a/share/run/aether.json b/share/run/aether.json index f84b7b2c..23377986 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -26,7 +26,7 @@ "IsUniformAlt" : false}, "ionGrid": { - "dAltScale": 0.6, + "dAltStretch": 0.6, "LatStretch": 1, "Shape": "dipole", "nLonsPerBlock": 36, From c1bcad2d0da834adf8e696249963d46573554475 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 11:16:41 -0500 Subject: [PATCH 316/691] fix typo in grid.cpp --- src/grid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grid.cpp b/src/grid.cpp index c8ccaab2..67cdc509 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -23,7 +23,7 @@ Grid::Grid(std::string gridtype) { nZ = grid_input.nZ + nGCs * 2; nAlts = nZ; - // No set all of the logicals to make the flow a bit easier: + // Now set all of the logicals to make the flow a bit easier: if (grid_input.nX == 1 & grid_input.nY == 1 & From c884617fd3d2e6de71950055ae67d648edd70c6c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 13:31:10 -0500 Subject: [PATCH 317/691] STY: Continue enforcing local vs global vars having different names in mag_grid also move a couple functions around Just cleanin' up the code a bit --- include/grid.h | 16 ++++++++++++++++ include/init_mag_grid.h | 14 -------------- src/init_mag_grid.cpp | 19 +++++++------------ 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/include/grid.h b/include/grid.h index 41d8df26..65703984 100644 --- a/include/grid.h +++ b/include/grid.h @@ -93,6 +93,9 @@ class Grid arma_cube magAlt_Below; arma_cube magAlt_Corner; + //For easier interpolation: + arma_vec baseLats_down; + // these need to be stored in (p,q) coords for a bit, its messy: arma_cube magP_Down; arma_cube magP_Below; @@ -245,6 +248,19 @@ class Grid precision_t Gamma, Planets planet, bool isCorner); void dipole_alt_edges(Planets planet); + // get the latitude spacing given the quadtree start & size, and the latitude limits + // extent: quadtree up + // origin: quadtree origin + // upper_lim: upper latitude limit (input) + // lower_lim: lower latitude limit (from min_apex) + // nLats: number of latitudes (nY) + // spacing_factor: (not supported yet), so always 1.0. Will adjust baselat spacing, eventually. + arma_vec baselat_spacing(precision_t extent, + precision_t origin, + precision_t upper_lim, + precision_t lower_lim, + // int16_t nLats, + precision_t spacing_factor); void saveCubeToCSV(arma_cube cube, std::string filename); diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h index 80c29b9d..a9493aaa 100644 --- a/include/init_mag_grid.h +++ b/include/init_mag_grid.h @@ -17,20 +17,6 @@ bool init_dipole_grid(Grid &mGrid, Planets planet); // return (r,theta) std::pair qp_to_r_theta(precision_t q, precision_t p); -// get the latitude spacing given the quadtree start&size, and the latitude limits -// extent quadtree up -// origin quadtree origin -// upper_lim upper latitude limit (input) -// lower_lim lower latitude limit (from min_apex) -// nLats number of latitudes (nY) -// spacing_factor (not supported yet), so always 1.0. -arma_vec baselat_spacing(precision_t extent, - precision_t origin, - precision_t upper_lim, - precision_t lower_lim, - int16_t nLats, - precision_t spacing_factor); - // Take limits & specs of field line, fill it with points. // std:: tuple Grid::fill_field_lines (arma_vec lShells, // int64_t nAlts, diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 59bdb238..a79f512f 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -54,13 +54,11 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) return {r, theta}; } -arma_vec baselat_spacing(precision_t extent, +arma_vec Grid::baselat_spacing(precision_t extent, precision_t origin, precision_t upper_lim, precision_t lower_lim, - int16_t nLats, - precision_t spacing_factor) -{ + precision_t spacing_factor){ std::string function = "Grid::baselat_spacing"; static int iFunction = -1; report.enter(function, iFunction); @@ -147,18 +145,15 @@ arma_vec baselat_spacing(precision_t extent, // Field line filling only needs to be redone for the "down" edges, left is the same p,q // and then for "lower", we just shift the p,q after -void Grid::fill_field_lines(arma_vec baseLats, +void Grid::fill_field_lines(arma_vec baseLatsLoc, precision_t min_altRe, precision_t Gamma, Planets planet, - bool isCorner=false) -{ + bool isCorner=false){ std::string function = "Grid::fill_field_lines"; static int iFunction = -1; report.enter(function, iFunction); - // int64_t nLats = baseLats.n_elem; - precision_t q_Start, delqp; arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); @@ -175,7 +170,7 @@ void Grid::fill_field_lines(arma_vec baseLats, // using L=R/sin2(theta), where theta is from north pole arma_vec Lshells(nLats); for (int64_t iLat = 0; iLat < nLats; iLat++) - Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLats(iLat)), 2.0); + Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLatsLoc(iLat)), 2.0); report.print(3, "lshells calculated!"); @@ -203,7 +198,7 @@ void Grid::fill_field_lines(arma_vec baseLats, for (int iLat = 0; iLat < nLats; iLat++) { - q_Start = -cos(cPI / 2 + baseLats(iLat)) / pow(min_altRe, 2.0); + q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) // Note this is not the: @@ -583,7 +578,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // latitude of field line base: // todo: needs support for variable stretching. it's like, halfway there. arma_vec baseLats = baselat_spacing(size_up_norm[1], lower_left_norm[1], - max_lat, min_lat, nLats, 1.0); + max_lat, min_lat, 1.0); // downward sides (latitude shifted by 1/2 step): // TODO: This only works for linear latitude spacing, which is all that's supported right now. From 98f5831c601e053a817f453a229cca280ea3b210 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 17:20:10 -0500 Subject: [PATCH 318/691] feat: calculate last latitude's p,q in fill_field_line --- src/init_mag_grid.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a79f512f..32e26443 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -155,28 +155,30 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, report.enter(function, iFunction); precision_t q_Start, delqp; - arma_mat bAlts(nLats, nAlts), bLats(nLats, nAlts); // allocate & calculate some things outside of the main loop // - mostly just factors to make the code easier to read precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3; // exp_q_dist is the fraction of total q-distance to step for each pt along field line arma_vec exp_q_dist(nAlts); + + // corners/edges have one more lat dimension... + int64_t nLatLoc = baseLatsLoc.n_elem; // temp holding of results from q,p -> r,theta conversion: std:: pair r_theta; // Find L-Shell for each baseLat // using L=R/sin2(theta), where theta is from north pole - arma_vec Lshells(nLats); - for (int64_t iLat = 0; iLat < nLats; iLat++) + arma_vec Lshells(nLatLoc); + for (int64_t iLat = 0; iLat < nLatLoc; iLat++) Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLatsLoc(iLat)), 2.0); report.print(3, "lshells calculated!"); if (!isCorner){ for (int64_t iLon = 0; iLon < nLons; iLon ++){ - for (int64_t iLat = 0; iLat < nLats; iLat ++){ + for (int64_t iLat = 0; iLat < nLatLoc; iLat ++){ for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ magP_scgc(iLon, iLat, iAlt) = Lshells(iLat); } @@ -185,7 +187,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, } else{ for (int64_t iLon = 0; iLon < nLons; iLon ++){ - for (int64_t iLat = 0; iLat < nLats; iLat ++){ + for (int64_t iLat = 0; iLat < nLatLoc; iLat ++){ for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ magP_Down(iLon, iLat, iAlt) = Lshells(iLat); }}} @@ -196,7 +198,10 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nAlts) / (nAlts / 5.0)), 2.0)); report.print(3, "expQ"); - for (int iLat = 0; iLat < nLats; iLat++) + // mag alts and lats: + arma_mat bAlts(nLatLoc, nAlts), bLats(nLatLoc, nAlts); + + for (int iLat = 0; iLat < nLatLoc; iLat++) { q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); @@ -247,7 +252,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. planetRadius = planet.get_radius(bLats(0)); - for (int64_t iLat = 0; iLat < nLats; iLat++) + for (int64_t iLat = 0; iLat < nLatLoc; iLat++) { for (int64_t iLon = 0; iLon < nLons; iLon++) { From 8d5ba2ee7e442178e82282c599d7e4ada8384bf5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 17:39:11 -0500 Subject: [PATCH 319/691] bugs/feat: finally make dipole orthogonal in p-q holy crap this has been a week of hunting the smallest bugs and chasing down the most miniscule of errors Dipole looks great now, for realz this time. Works in 1 & 3 dimensions This commit makes baselats_down a global var, and changes how the corners are put in. There are no longer any zeros, nans, etc. note, some configurations of the grid *can* result in nan's at the poles, but these are rare - code beforte this commit would have the last field line shifted one q-step lower than it should be. this makes everything even & makes sure the centers and corners are lined up. --- include/grid.h | 2 +- src/grid.cpp | 2 ++ src/init_mag_grid.cpp | 60 ++++++++++++++++++------------------------- 3 files changed, 28 insertions(+), 36 deletions(-) diff --git a/include/grid.h b/include/grid.h index 65703984..9b774644 100644 --- a/include/grid.h +++ b/include/grid.h @@ -247,7 +247,7 @@ class Grid void fill_field_lines(arma_vec baseLats, precision_t min_altRe, precision_t Gamma, Planets planet, bool isCorner); - void dipole_alt_edges(Planets planet); + void dipole_alt_edges(Planets planet, precision_t min_altRe); // get the latitude spacing given the quadtree start & size, and the latitude limits // extent: quadtree up // origin: quadtree origin diff --git a/src/grid.cpp b/src/grid.cpp index 67cdc509..13d6f9da 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -162,6 +162,8 @@ Grid::Grid(std::string gridtype) { magP_Corner.set_size(nX + 1, nY + 1, nZ + 1); magQ_Corner.set_size(nX + 1, nY + 1, nZ + 1); + baseLats_down.set_size(nY + 1); + radius_scgc.set_size(nX, nY, nZ); radius2_scgc.set_size(nX, nY, nZ); radius2i_scgc.set_size(nX, nY, nZ); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 32e26443..d18d0b61 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -106,6 +106,15 @@ arma_vec Grid::baselat_spacing(precision_t extent, dlat = (lat_high - lat_low) / (nLats_here+1); report.print(4, "baselats laydown!"); + // edge case for 1-D + // In 1-D, the base latitudes will be 1/2 way between LatMax & minApex, + // dlat is adjustable if it doesn't suit your needs. + if (!HasYdim){ + DO_FLIPBACK=false; + dlat=1.0 * cDtoR; + nLats_here = nLats + 1; + } + for (int64_t j = 0; j < nLats_here; j++) { ang0 = lat_low + (j + 1) * dlat; @@ -167,6 +176,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // temp holding of results from q,p -> r,theta conversion: std:: pair r_theta; + report.print(3, " calculating lshells!"); // Find L-Shell for each baseLat // using L=R/sin2(theta), where theta is from north pole @@ -316,7 +326,7 @@ Planets planet){ // They will not, however, line up from one field line to the next. // It's not going to be *too* hard to get the corners to line up, but it messes with the // orthogonality too much for me to figure out right now. -void Grid::dipole_alt_edges(Planets planet){ +void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ std::string function = "Grid::dipole_alt_edges"; static int iFunction = -1; @@ -327,7 +337,7 @@ void Grid::dipole_alt_edges(Planets planet){ precision_t pTmp; for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { pTmp = magP_Down(iLon, iLat, 0); for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ magP_Corner(iLon, iLat, iAlt) = pTmp; @@ -344,38 +354,28 @@ void Grid::dipole_alt_edges(Planets planet){ magP_Corner(iLon, iLat, nAlts) = magP_Corner(iLon, iLat, nAlts - 1); } } - - // next, take the final p-value (in lat) to be one more step in p. - // Will not be the same size as prev. cells, but that's (hopefully) ok - // And at high latitudes, that cell is going to be super awkward. - // This is what needs changing when it's supercell time #todo - for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { - for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt++) { - magP_Corner(iLon, nLats, iAlt) = (magP_Corner(iLon, nLats - 2, iAlt) - magP_Corner(nLons, nLats - 1, iAlt)) / 2 - + magP_Corner(iLon, nLats - 1, iAlt); - } - } // And final step, use the longitude symmetry. // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. - for (int64_t iAlt = 0; iAlt < nAlts-1; iAlt++) { - for (int64_t iLat = 0; iLat < nLats-1; iLat++) { + for (int64_t iAlt = 0; iAlt < nAlts+1; iAlt++) { + for (int64_t iLat = 0; iLat < nLats+1; iLat++) { magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons-1, iLat, iAlt); } } - // For q-coord we'll avg q above and below the point... + // For q-coord we'll avg q_down (from different baseLat) above and below the point... // May need to change the dipole spacing func's to get this working exactly though. - // With how the field line pts are currently put in, there would be one edge at the equator (r=inf) - // so for the last point we'll take a step in q equal to the final center + the q-dist from the - // previous corner, to ensure the final center is within the final 2 corners. + // With how the field line pts are currently put in, this ends up being quite a hassle. + // Not to mention, there would be a corner at q=0 (so r=A_LOT). + // Top and bottom-most corners take the same q-step as the previous cell. precision_t qTmp; for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats; iLat++) { - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ - magQ_Corner(iLon, iLat, iAlt) = magQ_Down(iLon, iLat, iAlt); + for (int64_t iLat = 0; iLat < nLats+1; iLat++) { + for (int64_t iAlt = 1; iAlt < nAlts; iAlt ++){ + magQ_Corner(iLon, iLat, iAlt) = (magQ_Down(iLon, iLat, iAlt-1) + magQ_Down(iLon, iLat, iAlt))/2; } + magQ_Corner(iLon, iLat, 0) = (2*magQ_Corner(iLon, iLat, 1) - magQ_Corner(iLon, iLat, 2)); } } @@ -383,7 +383,7 @@ void Grid::dipole_alt_edges(Planets planet){ // this will force the highest corner to be above the last center for (int64_t iLon = 0; iLon < nLons; iLon++) { for (int64_t iLat = 0; iLat < nLats; iLat++) { - qTmp = 2*magQ_scgc(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, nAlts - 1); + qTmp = 2*magQ_Corner(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, nAlts - 2); magQ_Corner(iLon, iLat, nAlts) = qTmp; } } @@ -394,14 +394,6 @@ void Grid::dipole_alt_edges(Planets planet){ magQ_Corner(nLons, iLat, iAlt) = magQ_Corner(nLons - 1, iLat, iAlt); } } - // last lat corner is tricky. just take another latitude step, I guess. - // Will work for now. - for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt ++) { - for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { - magQ_Corner(iLon, nLats, iAlt) = (magQ_Corner(iLon, nLats - 2, iAlt) - magQ_Corner(nLons-1, nLats - 1, iAlt)) / 2 - + magQ_Corner(iLon, nLats - 1, iAlt); - } - } // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races std::pair rtheta; @@ -590,7 +582,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // When the exponential spacing (or something else) is fixed, this needs updating. precision_t dlat; dlat = baseLats(1) - baseLats(0); - arma_vec baseLats_down(nLats + 1); // put one cell halfway btwn each base latitude, leave 1st and last cell for now... for (int64_t iLat = 1; iLat < nLats; iLat ++){ @@ -598,8 +589,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) } // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else baseLats_down(0) = baseLats(0) - dlat * 0.5; - // baseLats_down(0) = baseLats(nLats-1) + dlat * 0.5; - + baseLats_down(nLats) = baseLats(nLats-1) + dlat * 0.5; report.print(3, "baselats done!"); @@ -611,7 +601,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) fill_field_lines(baseLats_down, min_apex_re, Gamma, planet, true); report.print(4, "Field-aligned Edges"); - dipole_alt_edges(planet); + dipole_alt_edges(planet, min_alt_re); report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); From f6d1222c17cdf7eb63b772b6f9ab1c0aa2a4b111 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 17:39:30 -0500 Subject: [PATCH 320/691] minor linting & consistency things --- src/init_mag_grid.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index d18d0b61..783869c0 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -200,7 +200,9 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, for (int64_t iLat = 0; iLat < nLatLoc; iLat ++){ for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ magP_Down(iLon, iLat, iAlt) = Lshells(iLat); - }}} + } + } + } } report.print(3, "dipole p-values stored for later."); @@ -260,7 +262,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. - planetRadius = planet.get_radius(bLats(0)); + planetRadius = planet.get_radius(bLats.at(0)); for (int64_t iLat = 0; iLat < nLatLoc; iLat++) { From eeba18f6b312227187b8c75fbdda28aece7fd4eb Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 17:45:09 -0500 Subject: [PATCH 321/691] "astyle, yo" --- src/init_mag_grid.cpp | 286 ++++++++++++++++++++++-------------------- 1 file changed, 147 insertions(+), 139 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 783869c0..6ce29c94 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -11,8 +11,8 @@ // https://arxiv.org/pdf/physics/0606044 // // ---------------------------------------------------------------------- -std::pair qp_to_r_theta(precision_t q, precision_t p) -{ +std::pair qp_to_r_theta(precision_t q, + precision_t p) { // return quanties precision_t r, theta; // Intermediate quantities: @@ -21,7 +21,8 @@ std::pair qp_to_r_theta(precision_t q, precision_t p) term0 = 256.0 / 27.0 * pow(q, 2.0) * pow(p, 4.0); term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); term2 = pow(term0, 1.0 / 3.0); - term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), 3.0 / 2.0); + term3 = 0.5 * pow(((pow(term1, 2) + term1 * term2 + pow(term2, 2)) / term1), + 3.0 / 2.0); r = p * (4.0 * term3) / ((1.0 + term3) * (1.0 + sqrt(2.0 * term3 - 1.0))); @@ -29,13 +30,12 @@ std::pair qp_to_r_theta(precision_t q, precision_t p) // theta = asin(sqrt(r/p)); theta = acos(q * pow(r, 2.0)); // Then make sure its the correct sign & direction - theta = cPI/2 - theta; + theta = cPI / 2 - theta; return {r, theta}; } -std::pair qp_to_r_theta(arma_cube q, arma_cube p) -{ +std::pair qp_to_r_theta(arma_cube q, arma_cube p) { // return quanties arma_cube r, theta; // Intermediate quantities: @@ -44,21 +44,22 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) term0 = 256.0 / 27.0 * (q % q) % (p % p % p % p); term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); term2 = pow(term0, 1.0 / 3.0); - term3 = 0.5 * pow(((term1 % term1 + term1 % term2 + term2 % term2) / term1), 3.0 / 2.0); + term3 = 0.5 * pow(((term1 % term1 + term1 % term2 + term2 % term2) / term1), + 3.0 / 2.0); r = p % (4.0 * term3) / ((1.0 + term3) % (1.0 + sqrt(2.0 * term3 - 1.0))); // now that r is determined we can solve for theta - theta = asin(q % (r%r)); + theta = asin(q % (r % r)); return {r, theta}; } arma_vec Grid::baselat_spacing(precision_t extent, - precision_t origin, - precision_t upper_lim, - precision_t lower_lim, - precision_t spacing_factor){ + precision_t origin, + precision_t upper_lim, + precision_t lower_lim, + precision_t spacing_factor) { std::string function = "Grid::baselat_spacing"; static int iFunction = -1; report.enter(function, iFunction); @@ -73,27 +74,22 @@ arma_vec Grid::baselat_spacing(precision_t extent, // Noting the special case of 1 root node & 1 processor... bool DO_FLIPBACK = false; - if (extent > 0.5) - { + + if (extent > 0.5) { DO_FLIPBACK = true; nLats_here = nLats / 2; extent_here = 0.5; - } - else{ + } else nLats_here = nLats; - } // get the upper & lower latitude bounds for our division of the quadree - if (origin < 0) - { + if (origin < 0) { // negative origin: lat_high <=> lat_low lat_low, lat_high = -upper_lim, -lower_lim; lat_low0 = lat_low; lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); lat_high = lat_low0 - (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); - } - else - { + } else { lat_low0 = lower_lim; lat_low = lat_low + (lat_high - lat_low) * (origin / 0.5); lat_high = lat_low0 + (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); @@ -101,35 +97,35 @@ arma_vec Grid::baselat_spacing(precision_t extent, // normalized spacing in latitude // NOTE: spacing factor != 1 will not work yet. but framework is here... - bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); + bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, + spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); - dlat = (lat_high - lat_low) / (nLats_here+1); + dlat = (lat_high - lat_low) / (nLats_here + 1); report.print(4, "baselats laydown!"); // edge case for 1-D // In 1-D, the base latitudes will be 1/2 way between LatMax & minApex, // dlat is adjustable if it doesn't suit your needs. - if (!HasYdim){ - DO_FLIPBACK=false; - dlat=1.0 * cDtoR; + if (!HasYdim) { + DO_FLIPBACK = false; + dlat = 1.0 * cDtoR; nLats_here = nLats + 1; } - for (int64_t j = 0; j < nLats_here; j++) - { + for (int64_t j = 0; j < nLats_here; j++) { ang0 = lat_low + (j + 1) * dlat; angq = aa + bb * pow(ang0, spacing_factor); Lats[j] = angq; } + report.print(5, "baselats flipback!"); // In the flipback case (single processor, global sim), we want baselats - // to be strictly increasing, same as geo grid! + // to be strictly increasing, same as geo grid! if (DO_FLIPBACK) for (int64_t j = 0; j < nLats_here; j++) - { Lats[j + nLats_here] = -1 * Lats[nLats_here - j - 1]; - } + report.print(4, "baselats flipback done!"); report.exit(function); @@ -148,16 +144,16 @@ arma_vec Grid::baselat_spacing(precision_t extent, // === SPACING ALONG FIELD LINE === // // Coordinates along the field line to begin modeling // - Created in dipole (p,q) coordinates, stored as magnetic coords -// - North & south hemisphere base-latitudes, shouldn't be *too* hard to support offset +// - North & south hemisphere base-latitudes, shouldn't be *too* hard to support offset // dipole and/or oblate Earth. // isCorner is a bool, if false then the p's and q's are stored for later (p,q cell centers). -// Field line filling only needs to be redone for the "down" edges, left is the same p,q +// Field line filling only needs to be redone for the "down" edges, left is the same p,q // and then for "lower", we just shift the p,q after - + void Grid::fill_field_lines(arma_vec baseLatsLoc, precision_t min_altRe, precision_t Gamma, - Planets planet, - bool isCorner=false){ + Planets planet, + bool isCorner = false) { std::string function = "Grid::fill_field_lines"; static int iFunction = -1; @@ -173,7 +169,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // corners/edges have one more lat dimension... int64_t nLatLoc = baseLatsLoc.n_elem; - + // temp holding of results from q,p -> r,theta conversion: std:: pair r_theta; report.print(3, " calculating lshells!"); @@ -181,51 +177,51 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // Find L-Shell for each baseLat // using L=R/sin2(theta), where theta is from north pole arma_vec Lshells(nLatLoc); + for (int64_t iLat = 0; iLat < nLatLoc; iLat++) Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLatsLoc(iLat)), 2.0); - + report.print(3, "lshells calculated!"); - if (!isCorner){ - for (int64_t iLon = 0; iLon < nLons; iLon ++){ - for (int64_t iLat = 0; iLat < nLatLoc; iLat ++){ - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + if (!isCorner) { + for (int64_t iLon = 0; iLon < nLons; iLon ++) { + for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) magP_scgc(iLon, iLat, iAlt) = Lshells(iLat); - } } } - } - else{ - for (int64_t iLon = 0; iLon < nLons; iLon ++){ - for (int64_t iLat = 0; iLat < nLatLoc; iLat ++){ - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + } else { + for (int64_t iLon = 0; iLon < nLons; iLon ++) { + for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) magP_Down(iLon, iLat, iAlt) = Lshells(iLat); - } } } } + report.print(3, "dipole p-values stored for later."); for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) - exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nAlts) / (nAlts / 5.0)), 2.0)); + exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nAlts) / + (nAlts / 5.0)), 2.0)); + report.print(3, "expQ"); // mag alts and lats: arma_mat bAlts(nLatLoc, nAlts), bLats(nLatLoc, nAlts); - for (int iLat = 0; iLat < nLatLoc; iLat++) - { + for (int iLat = 0; iLat < nLatLoc; iLat++) { q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); - // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) + // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) // Note this is not the: // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == // but a different formula where the spacing is more easily controlled. // Doesn't have any lat/lon dependence so won't work for offset dipoles delqp = (-q_Start) / (nAlts + 1); delqp = min_altRe * delqp; - for (int iAlt = 0; iAlt < nAlts; iAlt++) - { + + for (int iAlt = 0; iAlt < nAlts; iAlt++) { qp0 = q_Start + iAlt * (delqp); fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_Start / delqp - 1); ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_Start) / delqp); @@ -234,27 +230,26 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // Q value at this point: qp2 = q_Start + ft * delq; - if (isCorner){ + if (isCorner) { // save the q for the "down" case: - for (int64_t iLon=0; iLon < nLons; iLon ++) + for (int64_t iLon = 0; iLon < nLons; iLon ++) magQ_Down(iLon, iLat, iAlt) = qp2; - } - else { - for (int64_t iLon=0; iLon < nLons; iLon ++){ + } else { + for (int64_t iLon = 0; iLon < nLons; iLon ++) magQ_scgc(iLon, iLat, iAlt) = qp2; - } + r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; bLats(iLat, iAlt) = r_theta.second; - } + } } } report.print(3, "QP-rtheta done!"); - if (isCorner){ // we don't need the rest, yet - report.exit(function); - return; + if (isCorner) { // we don't need the rest, yet + report.exit(function); + return; } arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); @@ -262,20 +257,18 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. - planetRadius = planet.get_radius(bLats.at(0)); + planetRadius = planet.get_radius(bLats.at(0)); - for (int64_t iLat = 0; iLat < nLatLoc; iLat++) - { - for (int64_t iLon = 0; iLon < nLons; iLon++) - { + for (int64_t iLat = 0; iLat < nLatLoc; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { // Not currently used. Dipole isn't offset. Leaving just in case. // Lon = magPhi_scgc(iLon, iLat, 1); - for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) - { + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { lat1dAlong(iAlt) = bLats(iLat, iAlt); rNorm1d(iAlt) = bAlts(iLat, iAlt); } + // Lay things down in the same order as the geo grid. //centers only magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; @@ -290,8 +283,9 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, //////////////////////////////////////////// // convert cell coordinates to geographic // //////////////////////////////////////////// -std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, arma_cube magAlt, -Planets planet){ +std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, + arma_cube magAlt, + Planets planet) { std::string function = "Grid::mag_to_geo"; static int iFunction = -1; report.enter(function, iFunction); @@ -317,7 +311,7 @@ Planets planet){ // transform back to lon, lat, radius: llr = transform_xyz_to_llr_3d(xyzRot2); - + report.exit(function); return llr; } @@ -328,7 +322,7 @@ Planets planet){ // They will not, however, line up from one field line to the next. // It's not going to be *too* hard to get the corners to line up, but it messes with the // orthogonality too much for me to figure out right now. -void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ +void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe) { std::string function = "Grid::dipole_alt_edges"; static int iFunction = -1; @@ -337,32 +331,30 @@ void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ // P-coordinates will be the same along alt coord, we saved p-vals when we made them // in the fill field line function. precision_t pTmp; - + for (int64_t iLon = 0; iLon < nLons; iLon++) { for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { pTmp = magP_Down(iLon, iLat, 0); - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++){ + + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) magP_Corner(iLon, iLat, iAlt) = pTmp; - } } } // Here are some shortcuts that exploit the symmetry. // This is done by each coord so cases like offset dipoles or oblate planets are easier later - + // first, use the fact that p is the same along each field line (alt) for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) magP_Corner(iLon, iLat, nAlts) = magP_Corner(iLon, iLat, nAlts - 1); - } } // And final step, use the longitude symmetry. // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. - for (int64_t iAlt = 0; iAlt < nAlts+1; iAlt++) { - for (int64_t iLat = 0; iLat < nLats+1; iLat++) { - magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons-1, iLat, iAlt); - } + for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) + magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons - 1, iLat, iAlt); } // For q-coord we'll avg q_down (from different baseLat) above and below the point... @@ -373,28 +365,30 @@ void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ precision_t qTmp; for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats+1; iLat++) { - for (int64_t iAlt = 1; iAlt < nAlts; iAlt ++){ - magQ_Corner(iLon, iLat, iAlt) = (magQ_Down(iLon, iLat, iAlt-1) + magQ_Down(iLon, iLat, iAlt))/2; - } - magQ_Corner(iLon, iLat, 0) = (2*magQ_Corner(iLon, iLat, 1) - magQ_Corner(iLon, iLat, 2)); - } + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { + for (int64_t iAlt = 1; iAlt < nAlts; iAlt ++) + magQ_Corner(iLon, iLat, iAlt) = (magQ_Down(iLon, iLat, + iAlt - 1) + magQ_Down(iLon, iLat, iAlt)) / 2; + + magQ_Corner(iLon, iLat, 0) = (2 * magQ_Corner(iLon, iLat, 1) - magQ_Corner(iLon, + iLat, 2)); } + } // for last (alt) corner, take the same step as the prev corner to the highest center. // this will force the highest corner to be above the last center for (int64_t iLon = 0; iLon < nLons; iLon++) { for (int64_t iLat = 0; iLat < nLats; iLat++) { - qTmp = 2*magQ_Corner(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, nAlts - 2); + qTmp = 2 * magQ_Corner(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, + nAlts - 2); magQ_Corner(iLon, iLat, nAlts) = qTmp; } } // last lon corner, copy previous. It's the same! for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt ++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { + for (int64_t iLat = 0; iLat < nLats + 1; iLat++) magQ_Corner(nLons, iLat, iAlt) = magQ_Corner(nLons - 1, iLat, iAlt); - } } // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races @@ -404,7 +398,7 @@ void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ magLat_Corner = rtheta.second; // Change if the dipole is offset and/or planet is oblate: - planetRadius = planet.get_radius(magLat_scgc.at(1)); + planetRadius = planet.get_radius(magLat_scgc.at(1)); magAlt_Corner = rtheta.first * planetRadius; report.exit(function); @@ -414,11 +408,12 @@ void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe){ // ----------------------------------------------------------------------- // Convert XyzDipole to XyzGeo -// +// // ----------------------------------------------------------------------- -void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], precision_t XyzGeo[3]) { - +void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], + precision_t XyzGeo[3]) { + std::string function = "Grid::convert_dipole_geo_xyz"; static int iFunction = -1; report.enter(function, iFunction); @@ -432,21 +427,24 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); precision_t radius = planet.get_radius(0.0); - - // get the dipole shift, but normalize it to equatorial radius + + // get the dipole shift, but normalize it to equatorial radius precision_t dipole_center[3]; std::vector temp_dipole_center = planet.get_dipole_center(); - if ((temp_dipole_center[0] != 0) or (temp_dipole_center[1] != 0) or (temp_dipole_center[2] != 0)){ - report.print(0, "Dipole center != 0, but that is not supported yet. Setting to 0!"); - temp_dipole_center = {0,0,0}; + + if ((temp_dipole_center[0] != 0) or (temp_dipole_center[1] != 0) or + (temp_dipole_center[2] != 0)) { + report.print(0, + "Dipole center != 0, but that is not supported yet. Setting to 0!"); + temp_dipole_center = {0, 0, 0}; } transform_float_vector_to_array(temp_dipole_center, dipole_center); - dipole_center[0]=dipole_center[0]/radius; - dipole_center[1]=dipole_center[1]/radius; - dipole_center[2]=dipole_center[2]/radius; + dipole_center[0] = dipole_center[0] / radius; + dipole_center[1] = dipole_center[1] / radius; + dipole_center[2] = dipole_center[2] / radius; // Remove Tilt transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); @@ -455,7 +453,7 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec transform_rot_z(XyzRemoveTilt, magnetic_pole_rotation, XyzRemoveRot); // Remove Shift - vector_add(XyzRemoveRot, dipole_center, XyzGeo); + vector_add(XyzRemoveRot, dipole_center, XyzGeo); report.exit(function); return; @@ -468,8 +466,7 @@ void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], prec // are read from input files. And the numbers of each coordinate. // - nLats must be even!! // ---------------------------------------------------------------------- -bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) -{ +bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { using namespace std; bool DidWork = true; @@ -482,10 +479,12 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // turn the switch on! IsGeoGrid = false; IsMagGrid = true; - IsCubeSphereGrid=false; + IsCubeSphereGrid = false; report.print(0, "Creating inter-node connections Grid"); - if (!Is0D & !Is1Dz) create_sphere_connection(quadtree_ion); + + if (!Is0D & !Is1Dz) + create_sphere_connection(quadtree_ion); report.print(0, "Creating Dipole Grid"); @@ -509,17 +508,20 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; precision_t min_apex_re = (min_apex + planetRadius) / planetRadius; - if (LatStretch != 1){ + if (LatStretch != 1) { report.error("LatStretch values =/= 1 are not yet supported!"); - DidWork=false;} + DidWork = false; + } - if (nAlts % 2 != 0){ + if (nAlts % 2 != 0) { report.error("nAlts must be even!"); - DidWork=false;} + DidWork = false; + } - if (min_alt >= min_apex){ + if (min_alt >= min_apex) { report.error("min_apex must be more than min_alt"); - DidWork=false;} + DidWork = false; + } // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin @@ -532,6 +534,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) arma_vec lon1d(nLons); arma_vec lon1dLeft(nLons + 1); + // if we are not doing anything in the lon direction, then set dlon to // something reasonable: if (!HasXdim) @@ -543,14 +546,15 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Longitudes (symmetric, for now): // - Make a 1d vector // - copy it into the 3d cube - for (iLon = 0; iLon < nLons; iLon++){ + for (iLon = 0; iLon < nLons; iLon++) { lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; lon1dLeft(iLon) = lon0 + (iLon - nGCs) * dlon; // corners } + lon1dLeft(nLons) = lon0 + (nLons - nGCs) * dlon; for (iLat = 0; iLat < nLats; iLat++) { - for (iAlt = 0; iAlt < nAlts; iAlt++){ + for (iAlt = 0; iAlt < nAlts; iAlt++) { // centers: magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; // left edges @@ -558,9 +562,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) } } - for (iAlt = 0; iAlt < nAlts + 1; iAlt++){ + for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { for (iLat = 0; iLat < nLats + 1; iLat++) { - // Corners + // Corners magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } } @@ -586,12 +590,12 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) dlat = baseLats(1) - baseLats(0); // put one cell halfway btwn each base latitude, leave 1st and last cell for now... - for (int64_t iLat = 1; iLat < nLats; iLat ++){ - baseLats_down(iLat) = baseLats(iLat-1) + (dlat * 0.5); - } + for (int64_t iLat = 1; iLat < nLats; iLat ++) + baseLats_down(iLat) = baseLats(iLat - 1) + (dlat * 0.5); + // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else baseLats_down(0) = baseLats(0) - dlat * 0.5; - baseLats_down(nLats) = baseLats(nLats-1) + dlat * 0.5; + baseLats_down(nLats) = baseLats(nLats - 1) + dlat * 0.5; report.print(3, "baselats done!"); @@ -601,25 +605,30 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) // Corners (final bool argument) tells function to place stuff in the corner. // This is only down for the "down" edges, where the base latitudes are different. fill_field_lines(baseLats_down, min_apex_re, Gamma, planet, true); - + report.print(4, "Field-aligned Edges"); dipole_alt_edges(planet, min_alt_re); - - report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); + + report.print(3, + "Done generating symmetric latitude & altitude spacing in dipole."); - std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, + planet); geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; geoAlt_scgc = llr[2] - planetRadius; - report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); + report.print(4, + "Done dipole -> geographic transformations for the dipole grid centers."); - std::vector llr_corner = mag_to_geo(magLon_Corner, magLat_Corner, magAlt_Corner, planet); + std::vector llr_corner = mag_to_geo(magLon_Corner, magLat_Corner, + magAlt_Corner, planet); geoLon_Corner = llr_corner[0]; geoLat_Corner = llr_corner[1]; geoAlt_Corner = llr_corner[2] - planetRadius; - report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); + report.print(4, + "Done dipole -> geographic transformations for the dipole grid centers."); // Calculate the radius, of planet fill_grid_radius(planet); @@ -628,8 +637,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - for (int iV = 0; iV < 3; iV++) - { + for (int iV = 0; iV < 3; iV++) { rad_unit_vcgc[iV].zeros(); gravity_vcgc[iV].zeros(); } @@ -650,9 +658,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); gravity_mag_scgc = sqrt( - gravity_vcgc[0] % gravity_vcgc[0] + - gravity_vcgc[1] % gravity_vcgc[1] + - gravity_vcgc[2] % gravity_vcgc[2]); + gravity_vcgc[0] % gravity_vcgc[0] + + gravity_vcgc[1] % gravity_vcgc[1] + + gravity_vcgc[2] % gravity_vcgc[2]); report.print(4, "Done gravity calculations for the dipole grid."); From 8596234991e9a7bd903c96e34e4eaaf78ef271eb Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 19 Dec 2024 17:48:42 -0500 Subject: [PATCH 322/691] rm a func in grid.h from my debugging adventure whoops. aether doesn't need this lol --- include/grid.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/include/grid.h b/include/grid.h index 9b774644..11d077a0 100644 --- a/include/grid.h +++ b/include/grid.h @@ -262,9 +262,6 @@ class Grid // int16_t nLats, precision_t spacing_factor); - -void saveCubeToCSV(arma_cube cube, std::string filename); - // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); From 260c6b5ea8edd6096d436c4c9b5d4b28443e5d45 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 24 Dec 2024 10:24:12 -0500 Subject: [PATCH 323/691] FEAT: need electrodynamics for mag grid also --- include/advance.h | 1 + src/advance.cpp | 31 +++++++++++++++++-------------- src/main/main.cpp | 7 +++++-- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/include/advance.h b/include/advance.h index 1885020a..0f906b8c 100644 --- a/include/advance.h +++ b/include/advance.h @@ -44,6 +44,7 @@ bool advance(Planets &planet, Chemistry &chemistry, Chemistry &chemistryMag, Electrodynamics &electrodynamics, + Electrodynamics &electrodynamicsMag, Indices &indices, Logfile &logfile, Logfile &logfileMag); diff --git a/src/advance.cpp b/src/advance.cpp index 0b97cef3..f8c4d72b 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -22,6 +22,7 @@ bool advance(Planets &planet, Chemistry &chemistry, Chemistry &chemistryMag, Electrodynamics &electrodynamics, + Electrodynamics &electrodynamicsMag, Indices &indices, Logfile &logfile, Logfile &logfileMag) { @@ -109,8 +110,10 @@ bool advance(Planets &planet, ions.exchange_old(gGrid); advect(gGrid, time, neutrals); } - if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites("After Horizontal Advection"); + if (didWork & input.get_check_for_nans()) { + didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: After Horizontal Advection"); + } // ------------------------------------ // Calculate source terms next: @@ -141,23 +144,22 @@ bool advance(Planets &planet, ions); if (didWork) - didWork = electrodynamics.update(planet, - mGrid, - time, - indices, - ionsMag); - + didWork = electrodynamicsMag.update(planet, + mGrid, + time, + indices, + ionsMag); if (didWork) { calc_ion_neutral_coll_freq(neutrals, ions); ions.calc_ion_drift(neutrals, gGrid, time.get_dt()); calc_aurora(gGrid, neutrals, ions); - calc_aurora(mGrid, neutralsMag, ionsMag); + //calc_aurora(mGrid, neutralsMag, ionsMag); // Calculate chemistry on both grids: chemistry.calc_chemistry(neutrals, ions, time, gGrid); - chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); + //chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); if (input.get_O_cooling()) neutrals.calc_O_cool(); @@ -168,11 +170,12 @@ bool advance(Planets &planet, calc_ion_collisions(neutrals, ions); neutrals.add_sources(time, planet, gGrid); + //neutralsMag.add_sources(time, planet, mGrid); - if (didWork & input.get_check_for_nans()) - didWork = neutrals.check_for_nonfinites("After Add Sources"); - - neutralsMag.add_sources(time, planet, mGrid); + if (didWork & input.get_check_for_nans()) { + didWork = neutrals.check_for_nonfinites("Geo Grid: After Add Sources"); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: After Add Sources"); + } ions.calc_ion_temperature(neutrals, gGrid, time); ions.calc_electron_temperature(neutrals, gGrid); diff --git a/src/main/main.cpp b/src/main/main.cpp index 57a9d1e7..aa5f465a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -156,9 +156,11 @@ int main() { // Initialize electrodynamics and check if electrodynamics times // works with input time Electrodynamics electrodynamics(time); - if (!electrodynamics.is_ok()) - throw std::string("electrodynamics initialization failed!"); + throw std::string("electrodynamics on geo grid initialization failed!"); + Electrodynamics electrodynamicsMag(time); + if (!electrodynamicsMag.is_ok()) + throw std::string("electrodynamics on mag grid initialization failed!"); // If the user wants to restart, then get the time of the restart if (input.get_do_restart()) { @@ -212,6 +214,7 @@ int main() { chemistry, chemistryMag, electrodynamics, + electrodynamicsMag, indices, logfile, logfileMag); From 59a1786f2fd0df0d910a712d80ec37dcab06d1b6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 24 Dec 2024 10:26:19 -0500 Subject: [PATCH 324/691] BUG: downstream codes need to reset between grids --- src/electrodynamics.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 9c1aad5a..7a505f43 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -159,7 +159,7 @@ bool Electrodynamics::update(Planets planet, ions.eflux.zeros(); ions.avee.ones(); - if (HaveElectrodynamicsFile || HaveFortranIe) { + if (HaveElectrodynamicsFile || HaveFortranIe) { set_time(time.get_current()); gGrid.calc_sza(planet, time); gGrid.calc_gse(planet, time); @@ -171,11 +171,15 @@ bool Electrodynamics::update(Planets planet, report.print(3, "Using Fortran Electrodynamics!"); set_all_indices_for_ie(time, indices); + // Need to do this every time step, since we are switching between geo and mag grids. + int nXs = gGrid.get_nX(); + int nYs = gGrid.get_nY(); + int64_t nZs = gGrid.get_nZ(); + ie_set_nxs(&nXs); + ie_set_nys(&nYs); + if (!IsAllocated) { - int nXs = gGrid.get_nX(); - ie_set_nxs(&nXs); - int nYs = gGrid.get_nY(); - ie_set_nys(&nYs); + report.print(4, "Allocating variables in electrodynamics"); int64_t iTotal = nXs * nYs; mlt2d = static_cast(malloc(iTotal * sizeof(float))); lat2d = static_cast(malloc(iTotal * sizeof(float))); @@ -185,14 +189,13 @@ bool Electrodynamics::update(Planets planet, IsAllocated = true; } - int64_t nZs = gGrid.get_nZ(); int64_t iZ; int iError; for (iZ = 0; iZ < nZs; iZ++) { + report.print(5, "Looping through Altitudes..."); copy_mat_to_array(gGrid.magLocalTime_scgc.slice(iZ), mlt2d, true); copy_mat_to_array(gGrid.magLat_scgc.slice(iZ), lat2d, true); - ie_set_mlts(mlt2d, &iError); if (iError != 0) { @@ -228,6 +231,7 @@ bool Electrodynamics::update(Planets planet, copy_array_to_mat(pot2d, ions.potential_scgc.slice(iZ), true); if (iZ == nZs - 1) { + report.print(5, "Getting Aurora..."); if (didWork) { ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); @@ -236,7 +240,9 @@ bool Electrodynamics::update(Planets planet, report.error("Error in ie_get_electron_diffuse_aurora"); std::cout << "ie_get_electron_diffuse_aurora iError : " << iError << "\n"; } else { + report.print(5, "Copying avee2d..."); copy_array_to_mat(avee2d, ions.avee, true); + report.print(5, "Copying eflux2d..."); copy_array_to_mat(eflux2d, ions.eflux, true); if (report.test_verbose(3)) { From 000c2f471aa75d301d7561eab342d59af40a7e57 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Dec 2024 20:16:56 -0500 Subject: [PATCH 325/691] BUG: dont need the lat loop --- src/fill_grid.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 3c12e77e..b1782a88 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -528,10 +528,8 @@ void Grid::calc_alt_dipole_grid_spacing() // arma_vec alt_spacing; precision_t planetRadius; - for (int64_t iLat = 1; iLat < nLats; iLat++) - { - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) - { + //for (int64_t iLat = 1; iLat < nLats; iLat++) { + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { dalt_center_scgc.slice(iAlt) = abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) @@ -545,7 +543,7 @@ void Grid::calc_alt_dipole_grid_spacing() - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; } - } + //} dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); From 54103f38669fcc41341c6ca301f9bb786d8edc5f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 25 Dec 2024 20:19:57 -0500 Subject: [PATCH 326/691] FEAT: siplified chemistry leaving out H, He, and excited states of O and O+ --- share/run/UA/inputs/aurora_earth_simple.csv | 3 + .../run/UA/inputs/chemistry_earth_simple.csv | 75 ++++++++----------- share/run/UA/inputs/earth_simple.in | 60 +++++++++++++++ share/run/UA/inputs/euv_earth_simple.csv | 14 ++++ 4 files changed, 107 insertions(+), 45 deletions(-) create mode 100644 share/run/UA/inputs/aurora_earth_simple.csv create mode 100644 share/run/UA/inputs/earth_simple.in create mode 100644 share/run/UA/inputs/euv_earth_simple.csv diff --git a/share/run/UA/inputs/aurora_earth_simple.csv b/share/run/UA/inputs/aurora_earth_simple.csv new file mode 100644 index 00000000..1bea2b2c --- /dev/null +++ b/share/run/UA/inputs/aurora_earth_simple.csv @@ -0,0 +1,3 @@ +N2,N2+,0.92 +O2,O2+,1 +O,O+,0.56 \ No newline at end of file diff --git a/share/run/UA/inputs/chemistry_earth_simple.csv b/share/run/UA/inputs/chemistry_earth_simple.csv index 9f710d03..d20ccb0e 100644 --- a/share/run/UA/inputs/chemistry_earth_simple.csv +++ b/share/run/UA/inputs/chemistry_earth_simple.csv @@ -1,45 +1,30 @@ -name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,uncertainty,,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType,eol -reaction,name,name,name,goes to,name,name,name,mks,,,ratio,eV,,,K,T,dimensionless,T,K,K,"1: (numerator/temp)^exponent, 2: temp*exp(numerator/temp)",eol -R11,He+,e-,,,He,,,4.80E-18,(250/Te)^0.7,,1,0,0.1,gitm,250,Te,0.7,,,,1,eol -R23,N2+,e-,,,N_2D,N_2D,,1.39E-13,(300/Te)^0.39,,0.56,1.04,0.1,gitm,300,Te,0.39,,,,1,eol -R24,N2+,e-,,,N,N,,2.20E-13,(300/Te)^0.39,,0.44,5.77,0.1,gitm,300,Te,0.39,,,,1,eol -R26,N2+,NO,,,N2,NO+,,3.60E-16,,,1,6.33,0.1,gitm,,,,,,,,eol -R27,N2+,O,,,NO+,N_2D,,1.33E-16,(300/Ti)^0.44,Ti<=1500,1,0.7,0.1,gitm,300,Ti,0.44,Ti,0,1500,1,eol -R27,,,,,,,,6.55E-17,(Ti/1500)^0.2,Ti>1500,,,0.1,,1500,Ti,-0.2,,1500,,1,eol -R29,N2+,O,,,O+,N2,,7.00E-18,(300/Ti)^0.23,,1,1.96,0.1,gitm,300,Ti,0.23,,,,1,eol -R30,N2+,O2,,,O2+,N2,,5.10E-17,(300/Ti)^1.16,Ti<=1000,1,3.53,0.1,gitm,300,Ti,1.16,Ti,0,1000,1,eol -R30,,,,,,,,1.26E-17,(Ti/1000)^0.67,Ti>1000,,,0.1,,1000,Ti,-0.67,,1000,,1,eol -R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0.38,0.1,gitm,300,Te,0.85,,,,1,eol -R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,2.77,0.1,gitm,300,Te,0.85,,,,1,eol -R35,O+,N2,,,NO+,N,,1.20E-18,,,1,1.1,0.1,,,,,,,,,eol -R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,0.1,gitm,300,Ti,-0.87,,,,1,eol -R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,0.1,gitm,300,Ti,0.52,Ti,0,900,1,eol -R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,0.1,,900,Ti,-0.92,,900,,1,eol -R38,O+_2D,O2,,,O2+,O,,7.00E-17,,,1,4.865,0.1,gitm,,,,,,,,eol -R39,O+_2P,O2,,,O2+,O,,1.30E-16,,,1,6.54,0.1,gitm,,,,,,,,eol -R40,O+_2P,O2,,,O+,O2,,1.30E-16,,,1,5.016,0.1,gitm,,,,,,,,eol -R41,O2+,e-,,,O,O,,1.95E-13,(300/Te)^0.70,Ti<=1200,1,50,0.1,gitm,300,Te,0.7,Ti,0,1200,1,eol -R41,,,,,,,,7.39E-14,(1200/Te)^0.56,Ti>1200,,,0.1,,1200,Te,0.56,,1200,,1,eol -R46,O2+,NO,,,NO+,O2,,4.50E-16,,,1,2.813,0.1,gitm,,,,,,,,eol -R15,N+,NO,,,N2+,O,,8.33E-17,(300/Ti)^0.24,,1,2.2,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol -R16,N+,NO,,,NO+,N,,4.72E-16,(300/Ti)^0.24,,1,3.4,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol -R17,N+,O,,,O+,N,,2.20E-18,,,1,0.93,0.1,gitm (n branch),,,,,,,,eol -R18,N+,O2,,,NO+,O_1D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.36,4.71,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol -R18,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol -R19,N+,O2,,,NO+,O_3P,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol -R19,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol -R20,N+,O2,,,O+_4S,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol -R20,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol -R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol -R21,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol -R22,N+,O2,,,O2+,N_4S,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.35,2.5,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol -R22,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol -R2,He+,N2,,,He,N,N+,7.80E-16,,,1,0.28,0.1,gitm,,,,,,,,eol -R3,He+,N2,,,He,N2+,,5.20E-16,,,1,0,0.1,no heating?,,,,,,,,eol -R4,He+,NO,,,He,N+,O,1.35E-15,,,1,0,0.1,,,,,,,,,eol -R5,He+,NO,,,He,O+,N,1.00E-16,,,1,0,0.1,,,,,,,,,eol -R6,He+,O2,,,He,O+_2D,O,2.37E-16,,,1,0,0.1,,,,,,,,,eol -R7,He+,O2,,,He,O+_2P,O,6.04E-17,,,1,0,0.1,,,,,,,,,eol -R8,He+,O2,,,He,O+_4S,O,2.39E-17,,,1,0,0.1,,,,,,,,,eol -R9,He+,O2,,,He,O+,O_1D,4.60E-17,,,1,0,0.1,,,,,,,,,eol -R10,He+,O2,,,He,O2+,,9.20E-18,,,1,0,0.1,,,,,,,,,eol +name,loss1,loss2,loss3,->,source1,source2,source3,rate,temp dependent,Temp range,branching,heat,uncertainty,,Numerator,Denominator,Exponent,Piecewise,Min,Max,FormulaType,eol +reaction,name,name,name,goes to,name,name,name,mks,,,ratio,eV,,,K,T,dimensionless,T,K,K,"1: (numerator/temp)^exponent, 2: temp*exp(numerator/temp)",eol +R23,N2+,e-,,,N_2D,N_2D,,1.39E-13,(300/Te)^0.39,,0.56,1.04,0.1,gitm,300,Te,0.39,,,,1,eol +R24,N2+,e-,,,N,N,,2.20E-13,(300/Te)^0.39,,0.44,5.77,0.1,gitm,300,Te,0.39,,,,1,eol +R26,N2+,NO,,,N2,NO+,,3.60E-16,,,1,6.33,0.1,gitm,,,,,,,,eol +R27,N2+,O,,,NO+,N_2D,,1.33E-16,(300/Ti)^0.44,Ti<=1500,1,0.7,0.1,gitm,300,Ti,0.44,Ti,0,1500,1,eol +R27,,,,,,,,6.55E-17,(Ti/1500)^0.2,Ti>1500,,,0.1,,1500,Ti,-0.2,,1500,,1,eol +R29,N2+,O,,,O+,N2,,7.00E-18,(300/Ti)^0.23,,1,1.96,0.1,gitm,300,Ti,0.23,,,,1,eol +R30,N2+,O2,,,O2+,N2,,5.10E-17,(300/Ti)^1.16,Ti<=1000,1,3.53,0.1,gitm,300,Ti,1.16,Ti,0,1000,1,eol +R30,,,,,,,,1.26E-17,(Ti/1000)^0.67,Ti>1000,,,0.1,,1000,Ti,-0.67,,1000,,1,eol +R31,NO+,e-,,,N_2D,O,,3.40E-13,(300/Te)^0.85,,1,0.38,0.1,gitm,300,Te,0.85,,,,1,eol +R32,NO+,e-,,,N,O,,6.00E-14,(300/Te)^0.85,,1,2.77,0.1,gitm,300,Te,0.85,,,,1,eol +R35,O+,N2,,,NO+,N,,1.20E-18,,,1,1.1,0.1,,,,,,,,,eol +R36,O+,NO,,,NO+,O,,7.00E-19,(300/Ti)^-0.87,,1,4.36,0.1,gitm,300,Ti,-0.87,,,,1,eol +R37,O+,O2,,,O2+,O,,1.60E-17,(300/Ti)^0.52,Ti<=900,1,1.55,0.1,gitm,300,Ti,0.52,Ti,0,900,1,eol +R37,,,,,,,,9.00E-18,(Ti/900)^0.92,Ti>900,,,0.1,,900,Ti,-0.92,,900,,1,eol +R41,O2+,e-,,,O,O,,1.95E-13,(300/Te)^0.70,Ti<=1200,1,50,0.1,gitm,300,Te,0.7,Ti,0,1200,1,eol +R41,,,,,,,,7.39E-14,(1200/Te)^0.56,Ti>1200,,,0.1,,1200,Te,0.56,,1200,,1,eol +R46,O2+,NO,,,NO+,O2,,4.50E-16,,,1,2.813,0.1,gitm,,,,,,,,eol +R15,N+,NO,,,N2+,O,,8.33E-17,(300/Ti)^0.24,,1,2.2,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol +R16,N+,NO,,,NO+,N,,4.72E-16,(300/Ti)^0.24,,1,3.4,0.1,gitm (n branch),300,Ti,0.24,,,,1,eol +R17,N+,O,,,O+,N,,2.20E-18,,,1,0.93,0.1,gitm (n branch),,,,,,,,eol +R19,N+,O2,,,NO+,O,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.09,6.67,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R19,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R20,N+,O2,,,O+,NO,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.05,2.31,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R20,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R21,N+,O2,,,O2+,N_2D,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.15,0.1,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R21,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol +R22,N+,O2,,,O2+,N_4S,,5.50E-16,(300/Ti)^0.45,Ti<=1000,0.35,2.5,0.1,gitm (n branch),300,Ti,0.45,Ti,0,1000,1,eol +R22,,,,,,,,9.50E-16,,Ti>1000,,,0.1,,,,,,1000,,,eol \ No newline at end of file diff --git a/share/run/UA/inputs/earth_simple.in b/share/run/UA/inputs/earth_simple.in new file mode 100644 index 00000000..94a75ac8 --- /dev/null +++ b/share/run/UA/inputs/earth_simple.in @@ -0,0 +1,60 @@ + +name is the character string that identifies the species + +O(3P) is the base state of neutral atomic oxygen and is called O. +O(1D) is an excited state of oxygen and is NOT INCLUDED +N(4S) is the base state of neutral atomic nitrogen and is called N. +N(2D) is an excited state of nitrogen and is called N_2D +N(2P) is an excited state of nitrogen and is called N_2P + +Vibration is the degrees of freedom for the atom/molecule + +thermal conduction is typically: +Lambda = (N1 * A1 * T^c1 + N2 * A2 * T^c2 + ... ) / (N1+N2+...) +thermal_cond is the A for the particular species +thermal_exp is the c for the particular species + +mass is in amu + +advect is whether the species is advected or not + +BC is a density that is used in the lowest boundary cell if you + want a constant boundary condition. + Set to a real value to use this. + Set to a negative number if you want to use a different BC. + In this example file, the values are from 96.87 km Jan 1, 2013 + O_1D is made up. + + +#NEUTRALS +name, mass, vibration, thermal_cond, thermal_exp, advect, BC +O, 16, 5, 5.6e-4, 0.69, 1, 7.3e17 +N, 14, 5, 5.6e-4, 0.69, 1, 2.5e11 +O2, 32, 7, 3.6e-4, 0.69, 1, 0.4e19 +N2, 28, 7, 3.6e-4, 0.69, 1, 0.8e19 +NO, 30, 7, 3.6e-4, 0.69, 1, 5.4e14 +N_2D, 14, 5, 5.6e-4, 0.69, 0, 2.5e9 +N_2P, 14, 5, 5.6e-4, 0.69, 0, 2.5e7 + +Here we can input a temperature profile for the initial condition: + - below the lowest altitude, it will use the lowest alt + - above the highest alt, it will use the highest alt + - in between, linear interpolation + - altitudes in km + +#TEMPERATURE +alt, temp +100.0, 200.0 +200.0, 800.0 +300.0, 800.0 + +O+ is O+(4S) is the base state of O+, but is just called O+ +O+ has excited states of O+(2D) and O+(2P) - NOT INCLUDED! + +#IONS +name, mass, charge, vibration, advect +O+, 16, 1, 5, 1 +O2+, 32, 1, 7, 0 +N2+, 28, 1, 7, 0 +NO+, 30, 1, 7, 0 +N+, 14, 1, 5, 0 diff --git a/share/run/UA/inputs/euv_earth_simple.csv b/share/run/UA/inputs/euv_earth_simple.csv new file mode 100644 index 00000000..bfa73dcf --- /dev/null +++ b/share/run/UA/inputs/euv_earth_simple.csv @@ -0,0 +1,14 @@ +Short,,wave,1, Angstroms,50,100,150,200,256.3,284.15,250,303.31,303.78,300,368.07,350,400,465.22,450,500,554.37,584.33,550,609.76,629.73,600,650,703.31,700,765.15,770.41,789.36,750,800,850,900,977.02,950,1025.72,1031.91,1000, No Comments +Long,,wave,1, Angstroms,100,150,200,250,256.3,284.15,300,303.31,303.78,350,368.07,400,450,465.22,500,550,554.37,584.33,600,609.76,629.73,650,700,703.31,750,765.15,770.41,789.36,800,850,900,950,977.02,1000,1025.72,1031.91,1050, No Comments +F74113, , ,1.00E+09, /cm2/s,1.2,0.45,4.8,3.1,0.46,0.21,1.679,0.8,6.9,0.965,0.65,0.314,0.383,0.29,0.285,0.452,0.72,1.27,0.357,0.53,1.59,0.342,0.23,0.36,0.141,0.17,0.26,0.702,0.758,1.625,3.537,3,4.4,1.475,3.5,2.1,2.467, No Comments +AFAC, , ,1, ,1.00E-02,7.13E-03,1.34E-02,1.95E-02,2.78E-03,1.38E-01,2.65E-02,2.50E-02,3.33E-03,2.25E-02,6.59E-03,3.65E-02,7.41E-03,7.49E-03,2.02E-02,8.76E-03,3.27E-03,5.16E-03,3.66E-03,1.62E-02,3.33E-03,1.18E-02,4.27E-03,3.04E-03,4.75E-03,3.85E-03,1.28E-02,3.28E-03,4.77E-03,4.82E-03,5.68E-03,4.98E-03,3.94E-03,4.42E-03,5.18E-03,5.28E-03,4.38E-03, No Comments +N2,N2,abs,1.00E-22, m2,0.72,2.261,4.958,8.392,10.21,10.9,10.493,11.67,11.7,13.857,16.91,16.395,21.675,23.16,23.471,24.501,24.13,22.4,22.787,22.79,23.37,23.339,31.755,26.54,24.662,120.49,14.18,16.487,33.578,16.992,20.249,9.68,2.24,50.988,0,0,0, No Comments +N2,N2+,ion,1.00E-22, m2,0.443,1.479,3.153,5.226,6.781,8.1,7.347,9.18,9.21,11.6,15.35,14.669,20.692,22.1,22.772,24.468,24.13,22.4,22.787,22.79,23.37,23.339,29.235,25.48,15.06,65.8,8.5,8.86,14.274,0,0,0,0,0,0,0,0, No Comments +N2,N+,ion,1.00E-22, m2,0.277,0.782,1.805,3.166,3.42,2.8,3.145,2.49,2.49,2.257,1.56,1.726,0.982,1.06,0.699,0.033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, No Comments +O2,O2,abs,1.00E-22, m2,1.316,3.806,7.509,10.9,13.37,15.79,14.387,16.8,16.81,17.438,18.32,18.118,20.31,21.91,23.101,24.606,26.04,22.72,26.61,28.07,32.06,26.017,21.919,27.44,28.535,20.8,18.91,26.668,22.145,16.631,8.562,12.817,18.73,21.108,1.63,1.05,1.346, No Comments +O2,O2+,ion,1.00E-22, m2,1.316,2.346,4.139,6.619,8.46,9.89,9.056,10.86,10.88,12.229,13.76,13.418,15.49,16.97,17.754,19.469,21.6,18.84,22.789,24.54,30.07,23.974,21.116,23.75,23.805,11.72,8.47,10.191,10.597,6.413,5.494,9.374,15.54,13.94,1.05,0,0.259, No Comments +O2,O+,ion,1.00E-22, m2,0,1.46,3.368,4.281,4.91,5.9,5.332,5.94,5.93,5.212,4.56,4.703,4.818,4.94,5.347,5.139,4.44,3.88,3.824,1.85,1.03,0.962,0.191,0,0,0,0,0,0,0,0,0,0,0,0,0,0, No Comments +O,O,abs,1.00E-22, m2,0.73,1.839,3.732,5.202,6.05,7.08,6.461,7.68,7.7,8.693,9.84,9.687,11.496,11.93,12.127,12.059,12.59,13.09,13.024,13.4,13.4,13.365,17.245,11.46,10.736,4,3.89,3.749,5.091,3.498,4.554,1.315,0,0,0,0,0, Last 5 are questionable +O,O+,ion,1.00E-22, m2,0.507,1.308,2.749,3.947,4.687,5.45,4.973,5.76,5.775,6.52,7.282,7.265,8.51,8.71,8.853,8.848,9.32,9.94,9.53,9.78,10.17,10.409,16.581,11.46,10.736,4,3.89,3.749,5.091,3.498,4.554,1.315,0,0,0,0,0, +N,N,abs,1.00E-22, m2,0.331,0.996,2.49,3.946,4.874,5.725,5.244,6.399,6.413,7.298,8.302,8.15,9.556,10.578,11.016,11.503,11.772,11.778,11.758,11.798,11.212,11.951,12.423,13.265,12.098,11.323,11.244,10.961,11.171,10.294,0.211,0,0,0,0,0,0, Last 5 are questionable +N,N+,ion,1.00E-22, m2,0.286,0.878,2.3,3.778,4.787,5.725,5.192,6.399,6.413,7.298,8.302,8.15,9.556,10.578,11.016,11.503,11.772,11.778,11.758,11.798,11.212,11.951,12.423,13.265,12.098,11.323,11.244,10.961,11.171,10.294,0.211,0,0,0,0,0,0, Last 5 are questionable \ No newline at end of file From 717e110b262ec74a6aabad7694292333796ddc0e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:38:16 -0500 Subject: [PATCH 327/691] BUG: need both dAlt and dAlong3rdAxis --- include/grid.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/include/grid.h b/include/grid.h index ac831228..b7d05e7f 100644 --- a/include/grid.h +++ b/include/grid.h @@ -143,11 +143,17 @@ class Grid arma_cube sza_scgc; arma_cube cos_sza_scgc; + // dalt should be the altitudinal change along the third dimension, + // but is really the distance between grid points. arma_cube dalt_center_scgc; arma_cube dalt_lower_scgc; arma_cube dalt_ratio_scgc; arma_cube dalt_ratio_sq_scgc; + // dr is the radial change along the third dimension, which is + // primarily needed for building a hydrostatic solution + arma_cube dr_lower_scgc; + arma_cube MeshCoefm2; arma_cube MeshCoefm1; arma_cube MeshCoefp0; From 50176fe3b29644f1bb15b64c085cd43d8eaa64d2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:38:43 -0500 Subject: [PATCH 328/691] BUG: need both dAlt and dAlong3rdAxis --- src/grid.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/grid.cpp b/src/grid.cpp index 41e2a7d8..fd8eca48 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -193,6 +193,7 @@ Grid::Grid(std::string gridtype) { dalt_lower_scgc.set_size(nX, nY, nZ); dalt_ratio_scgc.set_size(nX, nY, nZ); dalt_ratio_sq_scgc.set_size(nX, nY, nZ); + dr_lower_scgc.set_size(nX, nY, nZ); MeshCoef1s3rdp1.set_size(nX, nY, nGCs); MeshCoef1s3rdp2.set_size(nX, nY, nGCs); From a5d86dccb7604ee677b269df1eee4e5bb1c4317b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:41:33 -0500 Subject: [PATCH 329/691] BUG: need both dAlt and dAlong3rdAxis --- src/fill_grid.cpp | 48 ++++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index b1782a88..7cc3f047 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -339,15 +339,20 @@ void Grid::calc_alt_grid_spacing() { (geoAlt_scgc.slice(iAlt + 1) - geoAlt_scgc.slice(iAlt - 1)) / 2.0; dalt_lower_scgc.slice(iAlt) = geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); } dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); + dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); iAlt = nAlts - 1; dalt_lower_scgc.slice(iAlt) = geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); // For a stretched grid, calculate some useful quantities: // lower is defined for the current cell, which @@ -475,6 +480,10 @@ void Grid::calc_cent_acc(Planets planet) { cent_acc_vcgc[2] = omega2 * radius_scgc % cos(geoLat_scgc) % cos(geoLat_scgc); } +// ----------------------------------------------------------------------------- +// Calaculate Grid Spacing for Dipole Grid +// ----------------------------------------------------------------------------- + void Grid::calc_dipole_grid_spacing(Planets planet) { @@ -516,42 +525,43 @@ inline arma_cube delTc(arma_cube theta){ return (sqrt(3 * cos(theta) % cos(theta) + 1)); } -// --------------------------------------- +// ----------------------------------------------------------------------------- // Grid spacing for altitude: // - Dipole grid needs to be handled differently! -// --------------------------------------- +// ----------------------------------------------------------------------------- -void Grid::calc_alt_dipole_grid_spacing() -{ +void Grid::calc_alt_dipole_grid_spacing() { int64_t iAlt; - // arma_vec alt_spacing; precision_t planetRadius; - //for (int64_t iLat = 1; iLat < nLats; iLat++) { - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { - dalt_center_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) - % (1 / delTm(magLat_scgc.slice(iAlt + 1))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + dalt_center_scgc.slice(iAlt) = + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) + % (1 / delTm(magLat_scgc.slice(iAlt + 1))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - dalt_lower_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) - % (1 / delTm(magLat_scgc.slice(iAlt))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - } - //} + dalt_lower_scgc.slice(iAlt) = + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) + % (1 / delTm(magLat_scgc.slice(iAlt))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + } dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); + dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); iAlt = nAlts - 1; dalt_lower_scgc.slice(iAlt) = geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); // For a stretched grid, calculate some useful quantities: // lower is defined for the current cell, which From 118d00289245849630e81ad2eb1012e3d976efd4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:42:28 -0500 Subject: [PATCH 330/691] FEAT: allow a floor and max on neutral densities --- include/neutrals.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/neutrals.h b/include/neutrals.h index 4bffd892..64c69f52 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -309,6 +309,11 @@ class Neutrals { int64_t iEnd, Grid grid); + /********************************************************************** + \brief Limit the density to a floor and a ceiling + **/ + void clamp_density(); + /********************************************************************** \brief Calculate the bulk mass density from individual species densities **/ From b6cb44ee45850c2e977c05586b0a0f7c0a4889f1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:44:41 -0500 Subject: [PATCH 331/691] BUG: use dr instead of dalt --- src/neutrals.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 19d0bb8e..b1eb02e6 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -262,11 +262,10 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, temperature_scgc.slice(iAlt - 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dalt_lower_scgc.slice(iAlt) / + exp(-grid.dr_lower_scgc.slice(iAlt) / species[iSpecies].scale_height_scgc.slice(iAlt)); } } - calc_mass_density(); return; } @@ -287,10 +286,9 @@ void Neutrals::fill_with_hydrostatic(int64_t iSpecies, temperature_scgc.slice(iAlt - 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dalt_lower_scgc.slice(iAlt) / + exp(-grid.dr_lower_scgc.slice(iAlt) / species[iSpecies].scale_height_scgc.slice(iAlt)); } - calc_mass_density(); return; } From 38f6461edfb72e215995941d76fc37aab199eb10 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:45:58 -0500 Subject: [PATCH 332/691] FEAT: add more calculations on magnetic grid --- src/advance.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index f8c4d72b..90b1a7fe 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -59,23 +59,37 @@ bool advance(Planets &planet, neutrals.calc_viscosity(); neutrals.calc_cMax(); + neutralsMag.clamp_density(); + neutralsMag.calc_mass_density(); + neutralsMag.calc_mean_major_mass(); + neutralsMag.calc_specific_heat(); + neutralsMag.calc_concentration(); + neutralsMag.calc_pressure(); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: before bulk velocity"); + neutralsMag.calc_bulk_velocity(); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: After bulk velocity"); + + neutralsMag.calc_kappa_eddy(); + neutralsMag.calc_cMax(); + + didWork = neutralsMag.check_for_nonfinites("Ion Grid: After extras"); + + ions.fill_electrons(); ions.calc_sound_speed(); ions.calc_cMax(); ions.calc_specific_heat(); + ionsMag.fill_electrons(); + ionsMag.calc_sound_speed(); + ionsMag.calc_cMax(); + ionsMag.calc_specific_heat(); + precision_t dtNeutral = calc_dt(gGrid, neutrals.cMax_vcgc); precision_t dtIon = calc_dt(gGrid, ions.cMax_vcgc); time.calc_dt(dtNeutral, dtIon); - neutralsMag.calc_mass_density(); - neutralsMag.calc_mean_major_mass(); - neutralsMag.calc_specific_heat(); - neutralsMag.calc_concentration(); - neutralsMag.calc_pressure(); - neutralsMag.calc_bulk_velocity(); - neutralsMag.calc_kappa_eddy(); - neutralsMag.calc_cMax(); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: after calc dt"); // ------------------------------------ // Do advection first : @@ -92,8 +106,11 @@ bool advance(Planets &planet, if (didWork) didWork = ions.set_bcs(gGrid, time, indices); - if (didWork) - didWork = neutralsMag.set_bcs(mGrid, time, indices); + //if (didWork) + // didWork = neutralsMag.set_bcs(mGrid, time, indices); + + didWork = neutralsMag.check_for_nonfinites("Ion Grid: set bcs"); + // advect in the 3rd dimension (vertical), but only if we have it: if (gGrid.get_nAlts(false) > 1) { @@ -152,14 +169,16 @@ bool advance(Planets &planet, if (didWork) { calc_ion_neutral_coll_freq(neutrals, ions); + calc_ion_neutral_coll_freq(neutralsMag, ionsMag); ions.calc_ion_drift(neutrals, gGrid, time.get_dt()); + ionsMag.calc_ion_drift(neutralsMag, mGrid, time.get_dt()); calc_aurora(gGrid, neutrals, ions); - //calc_aurora(mGrid, neutralsMag, ionsMag); + calc_aurora(mGrid, neutralsMag, ionsMag); // Calculate chemistry on both grids: chemistry.calc_chemistry(neutrals, ions, time, gGrid); - //chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); + chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); if (input.get_O_cooling()) neutrals.calc_O_cool(); From a3b662b978b5d8ed9f59c099789d52a20ef84279 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:46:55 -0500 Subject: [PATCH 333/691] BUG: dont need to do aurora in ghostcells --- src/aurora.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index ff319116..f3765ca1 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -126,6 +126,7 @@ void calc_aurora(Grid grid, int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); int64_t nAlts = grid.get_nAlts(); + int64_t nGcs = grid.get_nGCs(); // DENSITY INTEGRAL CALULATION ( done in calc_neutral_derived.cpp line // 170 rho_alt_int_scgc species[iSpecies].rho_alt_int_scgc = @@ -164,6 +165,7 @@ void calc_aurora(Grid grid, if (IsFirstTime) { + report.print(4, "aurora - initializing"); precision_t lnE; for (int64_t iBin = 0; iBin < nBins; iBin++) { @@ -192,10 +194,9 @@ void calc_aurora(Grid grid, CiArray.push_back(Ci); } IsFirstTime = false; + report.print(4, "aurora - done with init!"); } - report.print(4, "aurora - done with init!"); - arma_vec rhoH1d; arma_cube scale_height; arma_vec ionization1d; @@ -226,8 +227,8 @@ void calc_aurora(Grid grid, report.print(4, "aurora - starting main loop!"); // loop through each altitude and calculate ionization - for (iLon = 0; iLon < nLons ; iLon++) { - for (iLat = 0; iLat < nLats ; iLat++) { + for (iLon = nGcs; iLon < nLons - nGcs; iLon++) { + for (iLat = nGcs; iLat < nLats - nGcs ; iLat++) { // CHANGE eflux = ions.eflux(iLon, iLat); // in ergs/cm2/s @@ -244,7 +245,6 @@ void calc_aurora(Grid grid, neutrals.species[iSpecies].rho_alt_int_scgc.tube(iLon, iLat); rhoH1d = rhoH1d + rho_tube / b1d; } - // Step 2: Calculate the distribution function: diff_num_flux = calculate_maxwellian(eflux, avee, From 4296716e7a78d81e308fabecc227d3b0db7e8d25 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:48:25 -0500 Subject: [PATCH 334/691] BUG: use dr for chapman integrals and dalt for aurora integrals --- src/calc_neutral_derived.cpp | 37 +++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 04189bcc..9020a94d 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -47,6 +47,26 @@ void Neutrals::calc_kappa_eddy() { return; } + +// ---------------------------------------------------------------------- +// Calculate mass density and number density: +// ---------------------------------------------------------------------- + +void Neutrals::clamp_density() { + + std::string function = "Neutrals::clamp_density"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t iSpecies; + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].density_scgc.clamp(1.0, 1e32); + } + + report.exit(function); + return; +} + // ---------------------------------------------------------------------- // Calculate mass density and number density: // ---------------------------------------------------------------------- @@ -181,7 +201,6 @@ void Neutrals::calc_bulk_velocity() { velocity_vcgc[iDir] = velocity_vcgc[iDir] / rho_advected; } - report.exit(function); return; } @@ -565,14 +584,20 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].density_scgc.slice(iAlt) % species[iSpecies].scale_height_scgc.slice(iAlt); + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice(iAlt); + for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { + // dr is used here instead of dalt, since we only want the radial integration, while + // dalt is the integral along the 3rd dimension. integral3d.slice(iAlt) = integral3d.slice(iAlt + 1) + species[iSpecies].density_scgc.slice(iAlt) % - grid.dalt_lower_scgc.slice(iAlt + 1); + grid.dr_lower_scgc.slice(iAlt + 1); + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = + species[iSpecies].rho_alt_int_scgc.slice(iAlt + 1) + + species[iSpecies].density_scgc.slice(iAlt) % + grid.dalt_lower_scgc.slice(iAlt + 1); } - species[iSpecies].rho_alt_int_scgc = integral3d * species[iSpecies].mass; - erfcy3d = (a + b * y3d) / (c + d * y3d + y3d % y3d); for (iLon = 0; iLon < nLons ; iLon++) @@ -589,8 +614,7 @@ void Neutrals::calc_chapman(Grid grid) { for (iLon = 0; iLon < nLons ; iLon++) { for (iLat = 0; iLat < nLats ; iLat++) { - - dAlt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + dAlt1d = grid.dr_lower_scgc.tube(iLon, iLat); sza1d = grid.sza_scgc.tube(iLon, iLat); integral1d = integral3d.tube(iLon, iLat); log_int1d = log_int3d.tube(iLon, iLat); @@ -599,7 +623,6 @@ void Neutrals::calc_chapman(Grid grid) { erfcy1d = erfcy3d.tube(iLon, iLat); radius1d = grid.radius_scgc.tube(iLon, iLat); H1d = species[iSpecies].scale_height_scgc.tube(iLon, iLat); - for (iAlt = nGCs; iAlt < nAlts; iAlt++) { // This is on the dayside: if (sza1d(iAlt) < cPI / 2 || sza1d(iAlt) > 3 * cPI / 2) { From b6c1dd79886a9c758b013de0bc8134d0d759f52d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:49:41 -0500 Subject: [PATCH 335/691] FEAT: incorporate GCs in latitudinal direction --- src/init_mag_grid.cpp | 178 ++++++++++++++++++++++++++++++++---------- 1 file changed, 138 insertions(+), 40 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index f2d466bb..3899a17b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -57,6 +57,25 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) { return {r, theta}; } +// ---------------------------------------------------------------------- +// The general idea here is to make the physical cells within the +// upper and lower limits. The cell EDGES will be these limits, so +// that the cell CENTERS (which this function calculates) will be +// 1/2 dlat away from these locations. +// The two limits coming in are the lowest northern latitude field line +// and the highest northern latitude field line (i.e., they are both +// positive values and are over half the domain.) +// If the block is touching the equator boundaries or the polar +// boundaries, then these ghost cells extend beyond these boundaries and +// the EDGES go to [-88, -1, 1, or 88] degrees latitude, depending on +// the boundary. This function deals with CENTERS, though, so the +// centers are selected so the the edges will be correct when calculated +// down stream. +// If we are running on 1 processor only, then this is all thrown out +// the window and code puts the centers are the +/- upper_lim. It first +// builds the southern hemisphere with nLats/2 points, then mirrors them. +// ---------------------------------------------------------------------- + arma_vec Grid::baselat_spacing(precision_t extent, precision_t origin, precision_t upper_lim, @@ -66,10 +85,15 @@ arma_vec Grid::baselat_spacing(precision_t extent, static int iFunction = -1; report.enter(function, iFunction); + if (report.test_verbose(3)) + std::cout << "inputs : " << iProc << " " << extent << " " << origin << " " + << lower_lim * cRtoD << " " << lower_lim * cRtoD << "\n"; + // intermediate latitude values precision_t lat_low, lat_high, lat_low0, lat_high0; // intermediate calculation values precision_t dlat, bb, aa, ang0, angq, nLats_here, extent_here; + precision_t dlat0, dlatLower, dLatUpper; // Now we can allocate the return array, arma_vec Lats(nLats); @@ -77,59 +101,123 @@ arma_vec Grid::baselat_spacing(precision_t extent, // Noting the special case of 1 root node & 1 processor... bool DO_FLIPBACK = false; + int64_t iStart, iEnd; + if (extent > 0.5) { + // This is when running on 1 processor: DO_FLIPBACK = true; nLats_here = nLats / 2; extent_here = 0.5; - } else - nLats_here = nLats; + iStart = 0; + iEnd = nLats_here; + } else { + // Span only physical cells with extent: + nLats_here = nLats - 2 * nGCs; + extent_here = extent; + // Want to fill in only physical cells, then do ghostcells later: + iStart = nGCs; + iEnd = nLats - nGCs; + } // get the upper & lower latitude bounds for our division of the quadree if (origin < 0) { - // negative origin: lat_high <=> lat_low + // negative origin == Southern hemisphere: lat_high <=> lat_low lat_low, lat_high = -upper_lim, -lower_lim; lat_low0 = lat_low; - lat_low = lat_low - (lat_high - lat_low) * (origin / 0.5); - lat_high = lat_low0 - (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); + lat_low = -lower_lim + (upper_lim - lower_lim) * (origin / 0.5); + lat_high = lat_low + (upper_lim - lower_lim) * (extent_here / 0.5); } else { + // Northern hemisphere: + lat_low, lat_high = lower_lim, upper_lim; lat_low0 = lower_lim; - lat_low = lat_low + (lat_high - lat_low) * (origin / 0.5); - lat_high = lat_low0 + (lat_high - lat_low0) * (extent_here / .5 + origin / 0.5); + lat_low = lower_lim + (upper_lim - lower_lim) * (origin / 0.5); + lat_high = lat_low + (upper_lim - lower_lim) * (extent_here / 0.5); } - + if (report.test_verbose(3)) + std::cout << "lat_low, lat_high : " + << lat_low*cRtoD << " " << lat_high*cRtoD << " " << lower_lim << " " << upper_lim << "\n"; // normalized spacing in latitude // NOTE: spacing factor != 1 will not work yet. but framework is here... bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, spacing_factor)); aa = lat_high - bb * pow(lat_high, spacing_factor); - dlat = (lat_high - lat_low) / (nLats_here + 1); - report.print(4, "baselats laydown!"); + dlat = (lat_high - lat_low) / (nLats_here); + // Save dlat so that we can use it in ghostcells if they are interior: + dlat0 = dlat; - // edge case for 1-D - // In 1-D, the base latitudes will be 1/2 way between LatMax & minApex, - // dlat is adjustable if it doesn't suit your needs. if (!HasYdim) { + // edge case for 1-D (or no latitudinal extent, really) + // In 1-D, the base latitudes will be 1/2 way between LatMax & minApex, + // dlat is adjustable if it doesn't suit your needs. DO_FLIPBACK = false; dlat = 1.0 * cDtoR; nLats_here = nLats + 1; } - for (int64_t j = 0; j < nLats_here; j++) { - ang0 = lat_low + (j + 1) * dlat; + // Fill in physical cell centers: + for (int64_t j = iStart; j < iEnd; j++) { + ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; angq = aa + bb * pow(ang0, spacing_factor); Lats[j] = angq; } - report.print(5, "baselats flipback!"); - - // In the flipback case (single processor, global sim), we want baselats - // to be strictly increasing, same as geo grid! - if (DO_FLIPBACK) + if (DO_FLIPBACK) { + // In the flipback case (single processor, global sim), we want baselats + // to be strictly increasing, same as geo grid! + // remember : nLats_here = nLats / 2 for (int64_t j = 0; j < nLats_here; j++) + // mirror south to north: Lats[j + nLats_here] = -1 * Lats[nLats_here - j - 1]; - - report.print(4, "baselats flipback done!"); - + } else { + // Here we are filling ghostcells, first the lower GCs, then the upper GCs. + // If they are interior GCs, use the default dlat. If they are exterior GCs + // (i.e., poleward of max lat or equatorward of min lat), then adjust the dlat + // to force the last cell edges to be at [-89.9, -1, 1, 89.9] depending on cells. + // Do the lower ghostcells: + // If the GCs are interior, leave dlat alone. + dlat = dlat0; + // South polar region: + if (fabs( fabs(lat_low) - fabs(upper_lim)) < 0.001) { + if (report.test_verbose(2)) + std::cout << "Near south pole!\n"; + dlat = (89.9 * cDtoR + lat_low) / nGCs; + } + // North equatorial region: + if (fabs( fabs(lat_low) - fabs(lower_lim)) < 0.001) { + if (report.test_verbose(2)) + std::cout << "Near northern equator!\n"; + dlat = (lat_low - 1.0 * cDtoR) / nGCs; + } + // Fill in GCs: + for (int64_t j = 0; j < iStart; j++) { + ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; + angq = aa + bb * pow(ang0, spacing_factor); + Lats[j] = angq; + } + // Do the upper ghostcells: + // If the GCs are interior, leave dlat alone. + dlat = dlat0; + // North polar region: + if (lat_high == upper_lim) { + if (report.test_verbose(2)) + std::cout << "Near north pole!\n"; + dlat = (89.9 * cDtoR - lat_high) / nGCs; + } + // South equatorial region: + if (fabs( fabs(lat_high) - fabs(lower_lim)) < 0.001) { + if (report.test_verbose(2)) + std::cout << "Near southern equator!\n"; + dlat = -(1.0 * cDtoR + lat_high) / nGCs; + } + // Fill in the GCs: + for (int64_t j = iEnd; j < nLats; j++) { + ang0 = lat_high + (float(j - iEnd) + 0.5) * dlat; + angq = aa + bb * pow(ang0, spacing_factor); + Lats[j] = angq; + } + } + if (report.test_verbose(3)) + std::cout << "Lats from baselat_spacing :\n" << Lats * cRtoD << "\n"; report.exit(function); return Lats; } @@ -209,9 +297,18 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, report.print(3, "expQ"); + // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. + precision_t planetRadius = planet.get_radius(0.0); + // mag alts and lats: arma_mat bAlts(nLatLoc, nAlts), bLats(nLatLoc, nAlts); + if (report.test_verbose(3)) + std::cout << "Setting min alt (actually r in Re) : " + << min_altRe << " " + << planetRadius << " " + << (min_altRe - 1.0) * planetRadius/1000.0 << "\n"; + for (int iLat = 0; iLat < nLatLoc; iLat++) { q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); @@ -255,11 +352,8 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, } arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); - precision_t planetRadius; // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. - planetRadius = planet.get_radius(bLats.at(0)); for (int64_t iLat = 0; iLat < nLatLoc; iLat++) { for (int64_t iLon = 0; iLon < nLons; iLon++) { @@ -273,7 +367,7 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // Lay things down in the same order as the geo grid. //centers only - magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; + magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; magLat_scgc.tube(iLon, iLat) = lat1dAlong; } } @@ -473,8 +567,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { using namespace std; bool DidWork = true; - - string function = "Grid::init_dipole_grid"; static int iFunction = -1; report.enter(function, iFunction); @@ -486,8 +578,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { report.print(0, "Creating inter-node connections Grid"); - if (!Is0D & !Is1Dz) - create_sphere_connection(quadtree_ion); + //if (!Is0D & !Is1Dz) + // create_sphere_connection(quadtree_ion); report.print(0, "Creating Dipole Grid"); @@ -536,7 +628,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t lon0 = lower_left_norm(0) * cPI; arma_vec lon1d(nLons); - arma_vec lon1dLeft(nLons + 1); // if we are not doing anything in the lon direction, then set dlon to @@ -586,9 +677,15 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // latitude of field line base: // todo: needs support for variable stretching. it's like, halfway there. - arma_vec baseLats = baselat_spacing(size_up_norm[1], lower_left_norm[1], + + if (report.test_verbose(2)) + std::cout << "computing baselats : " << max_lat* cRtoD << " " << min_lat* cRtoD << "\n"; + arma_vec baseLats = baselat_spacing(size_up_norm(1), lower_left_norm(1), max_lat, min_lat, 1.0); + if (report.test_verbose(2)) + std::cout << "baselats : " << baseLats * cRtoD << "\n"; + // downward sides (latitude shifted by 1/2 step): // TODO: This only works for linear latitude spacing, which is all that's supported right now. // When the exponential spacing (or something else) is fixed, this needs updating. @@ -597,20 +694,23 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // put one cell halfway btwn each base latitude, leave 1st and last cell for now... for (int64_t iLat = 1; iLat < nLats; iLat ++) - baseLats_down(iLat) = baseLats(iLat - 1) + (dlat * 0.5); + baseLats_down(iLat) = (baseLats(iLat - 1) + baseLats(iLat))/2.0; // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else - baseLats_down(0) = baseLats(0) - dlat * 0.5; - baseLats_down(nLats) = baseLats(nLats - 1) + dlat * 0.5; + baseLats_down(0) = baseLats(0) * 1.5 - baseLats(1) * 0.5; + baseLats_down(nLats) = baseLats(nLats - 1) * 1.5 - baseLats(nLats - 2) * 0.5; + + if (report.test_verbose(2)) + std::cout << "baselats_down : " << baseLats_down * cRtoD << "\n"; report.print(3, "baselats done!"); // latitude & altitude of points on field lines (2D) // Cell centers - fill_field_lines(baseLats, min_apex_re, Gamma, planet); + fill_field_lines(baseLats, min_alt_re, Gamma, planet); // Corners (final bool argument) tells function to place stuff in the corner. // This is only down for the "down" edges, where the base latitudes are different. - fill_field_lines(baseLats_down, min_apex_re, Gamma, planet, true); + fill_field_lines(baseLats_down, min_alt_re, Gamma, planet, true); report.print(4, "Field-aligned Edges"); dipole_alt_edges(planet, min_alt_re); @@ -618,8 +718,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { report.print(3, "Done generating symmetric latitude & altitude spacing in dipole."); - - std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); From aacefb9351f7f1256e0b982618afb596a79087f8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:50:45 -0500 Subject: [PATCH 336/691] BUG: set max_depth --- src/init_parallel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index b8cc58a9..c940148a 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -23,8 +23,7 @@ std::string cGrid; MPI_Comm aether_comm; -bool init_parallel(Quadtree &quadtree, -Quadtree &quadtree_ion) { +bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion) { bool DidWork = true; @@ -55,6 +54,7 @@ Quadtree &quadtree_ion) { << nProcsPerNode << "\n"; quadtree.max_depth = round(log(nProcsPerNode) / log(4)); + quadtree_ion.max_depth = round(log(nProcsPerNode) / log(4)); if (report.test_verbose(2)) std::cout << "Quadtree max depth : " << quadtree.max_depth << "\n"; From 058f93da18a84cfdd2300bf312998b308ecbe42a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:52:05 -0500 Subject: [PATCH 337/691] FEAT: change reporting levels --- src/inputs.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index 87e8ee41..cdae8a26 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -66,6 +66,7 @@ Inputs::Inputs(Times &time) { if (report.test_verbose(1)) { std::cout << "Settings read in:\n"; + std::cout << "iProc : " << iProc << "\n"; std::cout << std::setw(2) << settings; } @@ -106,7 +107,7 @@ std::string dummy_string = "unknown"; bool Inputs::check_settings(std::string key1, std::string key2) { - if (report.test_verbose(2)) + if (report.test_verbose(5)) std::cout << "checking setting : " << key1 << " and " << key2 << "\n"; @@ -131,7 +132,7 @@ bool Inputs::check_settings(std::string key1, // 1 key: bool Inputs::check_settings(std::string key1) { - if (report.test_verbose(2)) + if (report.test_verbose(5)) std::cout << "checking setting : " << key1 << "\n"; // try to find the keys first From 6dce1f5a372a6cafae1baf78baa8c9fbdac6a126 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:53:01 -0500 Subject: [PATCH 338/691] FEAT: clamp initial densities --- src/neutrals_ics.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 25fd5257..cb1729b3 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -159,12 +159,6 @@ bool Neutrals::initial_conditions(Grid grid, } else temp1d = 200.0; - // spread the 1D temperature across the globe: - for (iLon = 0; iLon < nLons; iLon++) { - for (iLat = 0; iLat < nLats; iLat++) - temperature_scgc.tube(iLon, iLat) = temp1d; - } - // Make the initial condition in the lower ghost cells to be consistent // with the actual lowwer BC: // Set the lower boundary condition: @@ -173,15 +167,21 @@ bool Neutrals::initial_conditions(Grid grid, fill(species[iSpecies].lower_bc_density); } + report.print(2, "Calculating scale height"); calc_scale_height(grid); + report.print(2, "setting lower BCs"); set_lower_bcs(grid, time, indices); + report.print(2, "Filling with hydrostatic"); for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); } // type = planet } + // ensure that the densities are all within bounds: + clamp_density(); + if (!didWork) report.error("Issue with initial conditions!"); From 51ddca5d5e5dfe5c902d1094f01f3ae728ca2756 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 14:53:46 -0500 Subject: [PATCH 339/691] BUG: rounding error can cause acos to be nan --- src/transform.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/transform.cpp b/src/transform.cpp index 05a9a9c0..524fe9da 100644 --- a/src/transform.cpp +++ b/src/transform.cpp @@ -148,11 +148,13 @@ arma_cube calc_magnitude(std::vector xyz) { std::vector transform_xyz_to_llr_3d(std::vector xyz) { std::vector llr; - arma_cube xy, r, lon; + arma_cube xy, r, lon, rat; r = calc_magnitude(xyz); xy = sqrt(xyz[0] % xyz[0] + xyz[1] % xyz[1]); - lon = acos(xyz[0] / xy); + rat = xyz[0] / xy; + rat.clamp(-0.99999, 0.99999); + lon = acos(rat); uvec ind_ = find(xyz[1] < 0.0); lon.elem(ind_) = 2 * cPI - lon.elem(ind_); llr.push_back(lon); From c7751d5d8fd11eb68e06d960c551f54d68007103 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 15:15:17 -0500 Subject: [PATCH 340/691] BUG: dont push to pole if user doen't want --- src/init_mag_grid.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 3899a17b..ad4f0c1f 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -188,6 +188,12 @@ arma_vec Grid::baselat_spacing(precision_t extent, std::cout << "Near northern equator!\n"; dlat = (lat_low - 1.0 * cDtoR) / nGCs; } + // The user may not want to go all the way to the pole or the equator. + // if we are very close to the pole or equator, then the calculated dlat + // will be small so we don't hit either. If we are far enough away from + // either, we can just leave dlat alone. + if (dlat > dlat0) + dlat = dlat0; // Fill in GCs: for (int64_t j = 0; j < iStart; j++) { ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; @@ -209,6 +215,12 @@ arma_vec Grid::baselat_spacing(precision_t extent, std::cout << "Near southern equator!\n"; dlat = -(1.0 * cDtoR + lat_high) / nGCs; } + // The user may not want to go all the way to the pole or the equator. + // if we are very close to the pole or equator, then the calculated dlat + // will be small so we don't hit either. If we are far enough away from + // either, we can just leave dlat alone. + if (dlat > dlat0) + dlat = dlat0; // Fill in the GCs: for (int64_t j = iEnd; j < nLats; j++) { ang0 = lat_high + (float(j - iEnd) + 0.5) * dlat; From 09caa021cdab78853d7f180f28c6696eb17ed9ce Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 15:16:00 -0500 Subject: [PATCH 341/691] take away perp ion velocity for now --- src/calc_ion_drift.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 2e49c340..5b33f367 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -219,7 +219,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (int64_t iComp = 0; iComp < 3; iComp++) { species[iIon].velocity_vcgc[iComp] = - species[iIon].perp_velocity_vcgc[iComp] + + //species[iIon].perp_velocity_vcgc[iComp] + species[iIon].par_velocity_vcgc[iComp]; velocity_vcgc[iComp] = velocity_vcgc[iComp] + rho % (species[iIon].velocity_vcgc[iComp]); From 1a74fe0ad15b8da89cae81de15c0f80a5f095644 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 29 Dec 2024 15:19:48 -0500 Subject: [PATCH 342/691] STY: Astyle, yo! --- src/advance.cpp | 5 ++- src/aurora.cpp | 8 ++-- src/calc_euv.cpp | 1 + src/calc_ion_drift.cpp | 13 +++--- src/calc_ion_temperature.cpp | 30 +++++++------- src/calc_neutral_derived.cpp | 14 ++++--- src/electrodynamics.cpp | 1 + src/euv.cpp | 4 +- src/exchange_messages.cpp | 3 +- src/fill_grid.cpp | 71 ++++++++++++++++----------------- src/grid.cpp | 2 +- src/init_mag_grid.cpp | 46 +++++++++++++++------ src/inputs.cpp | 7 +--- src/ions.cpp | 34 +++++++++------- src/ions_bcs.cpp | 6 +-- src/neutral_ion_collisions.cpp | 27 ++++++++----- src/neutrals.cpp | 8 +++- src/neutrals_ics.cpp | 1 + src/quadtree.cpp | 2 + src/solver_gradients.cpp | 10 +++-- src/solver_vertical_rusanov.cpp | 24 +++++------ 21 files changed, 183 insertions(+), 134 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 90b1a7fe..4c051867 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -115,18 +115,21 @@ bool advance(Planets &planet, // advect in the 3rd dimension (vertical), but only if we have it: if (gGrid.get_nAlts(false) > 1) { neutrals.advect_vertical(gGrid, time); + if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Neutral Advection"); + ions.advect_vertical(gGrid, time); } - // advect in the 1st and 2nd dimensions (horizontal), but only if + // advect in the 1st and 2nd dimensions (horizontal), but only if // we have those dimensions: if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { neutrals.exchange_old(gGrid); ions.exchange_old(gGrid); advect(gGrid, time, neutrals); } + if (didWork & input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); didWork = neutralsMag.check_for_nonfinites("Ion Grid: After Horizontal Advection"); diff --git a/src/aurora.cpp b/src/aurora.cpp index f3765ca1..bc793ed9 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -193,6 +193,7 @@ void calc_aurora(Grid grid, CiArray.push_back(Ci); } + IsFirstTime = false; report.print(4, "aurora - done with init!"); } @@ -229,7 +230,7 @@ void calc_aurora(Grid grid, // loop through each altitude and calculate ionization for (iLon = nGcs; iLon < nLons - nGcs; iLon++) { for (iLat = nGcs; iLat < nLats - nGcs ; iLat++) { - + // CHANGE eflux = ions.eflux(iLon, iLat); // in ergs/cm2/s avee = ions.avee(iLon, iLat); // in keV @@ -238,13 +239,14 @@ void calc_aurora(Grid grid, // Step 1: Calculate the height-integrated mass density: rhoH1d.zeros(); - b1d = abs(grid.bfield_unit_vcgc[2].tube(iLon,iLat)); + b1d = abs(grid.bfield_unit_vcgc[2].tube(iLon, iLat)); for (iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) { rho_tube = neutrals.species[iSpecies].rho_alt_int_scgc.tube(iLon, iLat); rhoH1d = rhoH1d + rho_tube / b1d; } + // Step 2: Calculate the distribution function: diff_num_flux = calculate_maxwellian(eflux, avee, @@ -274,7 +276,7 @@ void calc_aurora(Grid grid, // /cm3 -> /m3 // CHANGE!!!! - ionization1d = ionization1d * pcm3topm3/100.0; + ionization1d = ionization1d * pcm3topm3 / 100.0; // Step 5: Distribute ionization among neutrals: // Need to figure out which species get what percentage of the diff --git a/src/calc_euv.cpp b/src/calc_euv.cpp index be2d4d8e..2c971f2d 100644 --- a/src/calc_euv.cpp +++ b/src/calc_euv.cpp @@ -110,6 +110,7 @@ void calc_ionization_heating(Euv euv, neutrals.species[iSpecies].chapman_scgc.slice(iAlt); } } + intensity2d = euv.wavelengths_intensity_top[iWave] * exp(-1.0 * tau2d); for (iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) { diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 5b33f367..ab1c6acb 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -117,9 +117,8 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (iIon = 0; iIon < nSpecies; iIon++) { - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (int64_t iComp = 0; iComp < 3; iComp++) species[iIon].perp_velocity_vcgc[iComp].zeros(); - } if (species[iIon].DoAdvect) { @@ -138,12 +137,15 @@ void Ions::calc_ion_drift(Neutrals neutrals, grad_Pi_plus_Pe[iDim] = grad_Pi_plus_Pe[iDim] / rho; efield_acc[iDim] = Nie % efield_vcgc[iDim] / rho; } + // Neutral Wind Forcing: report.print(5, "neutral winds"); for (int64_t iComp = 0; iComp < 3; iComp++) wind_acc[iComp].zeros(); + nuin_sum.zeros(); + for (iNeutral = 0; iNeutral < neutrals.nSpecies; iNeutral++) { nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; nuin_sum = nuin_sum + species[iIon].nu_ion_neutral_vcgc[iNeutral]; @@ -193,9 +195,10 @@ void Ions::calc_ion_drift(Neutrals neutrals, species[iIon].par_velocity_vcgc[iComp] = (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt) / (1 + nuin_sum * dt); - species[iIon].par_velocity_vcgc[iComp].slice(nZ-1).zeros(); - species[iIon].par_velocity_vcgc[iComp].slice(nZ-2).zeros(); - species[iIon].par_velocity_vcgc[iComp].slice(nZ-3) = species[iIon].par_velocity_vcgc[iComp].slice(nZ-4); + species[iIon].par_velocity_vcgc[iComp].slice(nZ - 1).zeros(); + species[iIon].par_velocity_vcgc[iComp].slice(nZ - 2).zeros(); + species[iIon].par_velocity_vcgc[iComp].slice(nZ - 3) = + species[iIon].par_velocity_vcgc[iComp].slice(nZ - 4); species[iIon].par_velocity_vcgc[iComp].clamp(-100, 100); } diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 28885dd6..caf8cfe2 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -86,22 +86,23 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, front1d = 3.0 / 2.0 * cKB * density_scgc.tube(iLon, iLat); dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); sources1d = (heating_neutral_friction_scgc.tube(iLon, iLat) + - heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); + heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); sources1d = sources1d / front1d; conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, - lambda1d, - front1d, - sources1d, + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, dalt1d, - dt/10., - nGCs, + dt / 10., + nGCs, false); // The conduction solver gives Tnew-Told, so divide by dt conduction1d.clamp(200, 5000); temperature_scgc.tube(iLon, iLat) = conduction1d; } } + for (iIon = 0; iIon < nSpecies; iIon++) species[iIon].temperature_scgc = temperature_scgc; @@ -123,17 +124,17 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); sources1d = (species[iIon].heating_neutral_friction_scgc.tube(iLon, iLat) + - species[iIon].heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); + species[iIon].heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); sources1d = sources1d / front1d; conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, - lambda1d, - front1d, - sources1d, + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, dalt1d, - dt/10., - nGCs, + dt / 10., + nGCs, false); // The conduction solver gives Tnew-Told, so divide by dt @@ -142,6 +143,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, } // Lats } // Lons } // Ions + tempT.zeros(); tempD.zeros(); diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 9020a94d..b470bbc7 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -59,9 +59,9 @@ void Neutrals::clamp_density() { report.enter(function, iFunction); int64_t iSpecies; - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.clamp(1.0, 1e32); - } report.exit(function); return; @@ -201,6 +201,7 @@ void Neutrals::calc_bulk_velocity() { velocity_vcgc[iDir] = velocity_vcgc[iDir] / rho_advected; } + report.exit(function); return; } @@ -592,10 +593,10 @@ void Neutrals::calc_chapman(Grid grid) { integral3d.slice(iAlt) = integral3d.slice(iAlt + 1) + species[iSpecies].density_scgc.slice(iAlt) % grid.dr_lower_scgc.slice(iAlt + 1); - species[iSpecies].rho_alt_int_scgc.slice(iAlt) = - species[iSpecies].rho_alt_int_scgc.slice(iAlt + 1) + - species[iSpecies].density_scgc.slice(iAlt) % - grid.dalt_lower_scgc.slice(iAlt + 1); + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = + species[iSpecies].rho_alt_int_scgc.slice(iAlt + 1) + + species[iSpecies].density_scgc.slice(iAlt) % + grid.dalt_lower_scgc.slice(iAlt + 1); } erfcy3d = (a + b * y3d) / (c + d * y3d + y3d % y3d); @@ -623,6 +624,7 @@ void Neutrals::calc_chapman(Grid grid) { erfcy1d = erfcy3d.tube(iLon, iLat); radius1d = grid.radius_scgc.tube(iLon, iLat); H1d = species[iSpecies].scale_height_scgc.tube(iLon, iLat); + for (iAlt = nGCs; iAlt < nAlts; iAlt++) { // This is on the dayside: if (sza1d(iAlt) < cPI / 2 || sza1d(iAlt) > 3 * cPI / 2) { diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 7a505f43..678fad4f 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -232,6 +232,7 @@ bool Electrodynamics::update(Planets planet, if (iZ == nZs - 1) { report.print(5, "Getting Aurora..."); + if (didWork) { ie_get_electron_diffuse_aurora(eflux2d, avee2d, &iError); diff --git a/src/euv.cpp b/src/euv.cpp index 62104723..e97a47a0 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -361,9 +361,9 @@ bool Euv::euvac(Times time, std::cout << " " << iWave << " " << wavelengths_short[iWave] << " " << wavelengths_long[iWave] << " " - << wavelengths_intensity_1au[iWave]/1e12 << " " + << wavelengths_intensity_1au[iWave] / 1e12 << " " << euvac_afac[iWave] * 100.0 << " " - << euvac_f74113[iWave]/1e9 << " " + << euvac_f74113[iWave] / 1e9 << " " << slope << "\n"; } diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index d7edeb13..5ede03a6 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -50,9 +50,8 @@ bool Ions::exchange_old(Grid &grid) { bool DidWork = true; int64_t nGCs = grid.get_nGCs(); - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); - } DidWork = exchange_one_var(grid, temperature_scgc, false); DidWork = exchange_one_var(grid, electron_temperature_scgc, false); diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 7cc3f047..e29c72db 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -484,18 +484,17 @@ void Grid::calc_cent_acc(Planets planet) { // Calaculate Grid Spacing for Dipole Grid // ----------------------------------------------------------------------------- -void Grid::calc_dipole_grid_spacing(Planets planet) -{ +void Grid::calc_dipole_grid_spacing(Planets planet) { int64_t iLon, iLat, iAlt; report.print(3, "starting calc_grid_spacing"); - - // This is close, but may need to be adjusted later. + + // This is close, but may need to be adjusted later. // These quantities are obtained from integrating the scale factor (h) // The along-field-line distance (alt) should be right, but the lat distance // is the shortest distance from a point to the adjacent field line, not the adjacent cell. - + report.print(3, "starting alt"); calc_alt_dipole_grid_spacing(); report.print(3, "starting lat"); @@ -518,12 +517,12 @@ void Grid::calc_dipole_grid_spacing(Planets planet) } // for sanity (only marginally helpful): -inline arma_mat delTm(arma_mat theta){ +inline arma_mat delTm(arma_mat theta) { return (sqrt(3 * cos(theta) % cos(theta) + 1)); - } -inline arma_cube delTc(arma_cube theta){ +} +inline arma_cube delTc(arma_cube theta) { return (sqrt(3 * cos(theta) % cos(theta) + 1)); - } +} // ----------------------------------------------------------------------------- // Grid spacing for altitude: @@ -538,16 +537,16 @@ void Grid::calc_alt_dipole_grid_spacing() { for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { dalt_center_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) - % (1 / delTm(magLat_scgc.slice(iAlt + 1))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) + % (1 / delTm(magLat_scgc.slice(iAlt + 1))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; dalt_lower_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) - % (1 / delTm(magLat_scgc.slice(iAlt))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) + % (1 / delTm(magLat_scgc.slice(iAlt))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; dr_lower_scgc.slice(iAlt) = radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); } @@ -559,9 +558,9 @@ void Grid::calc_alt_dipole_grid_spacing() { dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); iAlt = nAlts - 1; dalt_lower_scgc.slice(iAlt) = - geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); dr_lower_scgc.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); // For a stretched grid, calculate some useful quantities: // lower is defined for the current cell, which @@ -569,7 +568,7 @@ void Grid::calc_alt_dipole_grid_spacing() { // ratio = upper / lower for (iAlt = 0; iAlt < nAlts - 1; iAlt++) dalt_ratio_scgc.slice(iAlt) = - dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); + dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); iAlt = nAlts - 1; dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); @@ -584,28 +583,26 @@ void Grid::calc_alt_dipole_grid_spacing() { // - uhoh, might not be right. not actually perpendicular to q-p, but no way around that, i think. // --------------------------------------- -void Grid::calc_lat_dipole_grid_spacing() -{ +void Grid::calc_lat_dipole_grid_spacing() { int64_t iLat; - for (iLat = 1; iLat < nLats - 1; iLat++) - { + for (iLat = 1; iLat < nLats - 1; iLat++) { dlat_center_scgc.col(iLat) = - abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) - % (1 / delTc(magLat_scgc.col(iLat + 1))) - - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) - % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; + abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) + % (1 / delTc(magLat_scgc.col(iLat + 1))) + - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) + % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; } // Bottom (one sided): iLat = 0; dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); + geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); // Top (one sided): iLat = nLats - 1; dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); // Make this into a distance: dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; @@ -615,27 +612,27 @@ void Grid::calc_lat_dipole_grid_spacing() // Grid spacing for longitude: // --------------------------------------- -void Grid::calc_long_dipole_grid_spacing() -{ +void Grid::calc_long_dipole_grid_spacing() { int64_t iLon; for (iLon = 1; iLon < nLons - 1; iLon++) dlon_center_scgc.row(iLon) = - (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + // this might be fine for the dipole, if it works for the geo grid... // Bottom (one sided): iLon = 0; dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); + magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); // Top (one sided): iLon = nLons - 1; dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); + magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); // Make this into a distance: dlon_center_dist_scgc = - // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); - dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); + // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); + dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); } \ No newline at end of file diff --git a/src/grid.cpp b/src/grid.cpp index fd8eca48..001ebd99 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -68,7 +68,7 @@ Grid::Grid(std::string gridtype) { if (mklower(grid_input.shape) == "cubesphere") iGridShape_ = iCubesphere_; - + //lowercase, check for any number of dipole, so dipole2 matches & dipole does too if (mklower(grid_input.shape).find("dipole") != std::string::npos) iGridShape_ = iDipole_; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index ad4f0c1f..28a7a2a4 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -60,15 +60,15 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) { // ---------------------------------------------------------------------- // The general idea here is to make the physical cells within the // upper and lower limits. The cell EDGES will be these limits, so -// that the cell CENTERS (which this function calculates) will be -// 1/2 dlat away from these locations. +// that the cell CENTERS (which this function calculates) will be +// 1/2 dlat away from these locations. // The two limits coming in are the lowest northern latitude field line // and the highest northern latitude field line (i.e., they are both // positive values and are over half the domain.) -// If the block is touching the equator boundaries or the polar +// If the block is touching the equator boundaries or the polar // boundaries, then these ghost cells extend beyond these boundaries and // the EDGES go to [-88, -1, 1, or 88] degrees latitude, depending on -// the boundary. This function deals with CENTERS, though, so the +// the boundary. This function deals with CENTERS, though, so the // centers are selected so the the edges will be correct when calculated // down stream. // If we are running on 1 processor only, then this is all thrown out @@ -86,7 +86,7 @@ arma_vec Grid::baselat_spacing(precision_t extent, report.enter(function, iFunction); if (report.test_verbose(3)) - std::cout << "inputs : " << iProc << " " << extent << " " << origin << " " + std::cout << "inputs : " << iProc << " " << extent << " " << origin << " " << lower_lim * cRtoD << " " << lower_lim * cRtoD << "\n"; // intermediate latitude values @@ -133,9 +133,12 @@ arma_vec Grid::baselat_spacing(precision_t extent, lat_low = lower_lim + (upper_lim - lower_lim) * (origin / 0.5); lat_high = lat_low + (upper_lim - lower_lim) * (extent_here / 0.5); } + if (report.test_verbose(3)) - std::cout << "lat_low, lat_high : " - << lat_low*cRtoD << " " << lat_high*cRtoD << " " << lower_lim << " " << upper_lim << "\n"; + std::cout << "lat_low, lat_high : " + << lat_low*cRtoD << " " << lat_high*cRtoD << " " << lower_lim << " " << + upper_lim << "\n"; + // normalized spacing in latitude // NOTE: spacing factor != 1 will not work yet. but framework is here... bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, @@ -176,51 +179,64 @@ arma_vec Grid::baselat_spacing(precision_t extent, // Do the lower ghostcells: // If the GCs are interior, leave dlat alone. dlat = dlat0; + // South polar region: if (fabs( fabs(lat_low) - fabs(upper_lim)) < 0.001) { if (report.test_verbose(2)) std::cout << "Near south pole!\n"; + dlat = (89.9 * cDtoR + lat_low) / nGCs; } + // North equatorial region: if (fabs( fabs(lat_low) - fabs(lower_lim)) < 0.001) { if (report.test_verbose(2)) std::cout << "Near northern equator!\n"; + dlat = (lat_low - 1.0 * cDtoR) / nGCs; } + // The user may not want to go all the way to the pole or the equator. // if we are very close to the pole or equator, then the calculated dlat // will be small so we don't hit either. If we are far enough away from // either, we can just leave dlat alone. if (dlat > dlat0) dlat = dlat0; + // Fill in GCs: for (int64_t j = 0; j < iStart; j++) { ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; angq = aa + bb * pow(ang0, spacing_factor); Lats[j] = angq; } + // Do the upper ghostcells: // If the GCs are interior, leave dlat alone. dlat = dlat0; + // North polar region: if (lat_high == upper_lim) { if (report.test_verbose(2)) std::cout << "Near north pole!\n"; + dlat = (89.9 * cDtoR - lat_high) / nGCs; } + // South equatorial region: if (fabs( fabs(lat_high) - fabs(lower_lim)) < 0.001) { if (report.test_verbose(2)) std::cout << "Near southern equator!\n"; + dlat = -(1.0 * cDtoR + lat_high) / nGCs; } + // The user may not want to go all the way to the pole or the equator. // if we are very close to the pole or equator, then the calculated dlat // will be small so we don't hit either. If we are far enough away from // either, we can just leave dlat alone. if (dlat > dlat0) dlat = dlat0; + // Fill in the GCs: for (int64_t j = iEnd; j < nLats; j++) { ang0 = lat_high + (float(j - iEnd) + 0.5) * dlat; @@ -228,8 +244,10 @@ arma_vec Grid::baselat_spacing(precision_t extent, Lats[j] = angq; } } + if (report.test_verbose(3)) std::cout << "Lats from baselat_spacing :\n" << Lats * cRtoD << "\n"; + report.exit(function); return Lats; } @@ -316,10 +334,10 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, arma_mat bAlts(nLatLoc, nAlts), bLats(nLatLoc, nAlts); if (report.test_verbose(3)) - std::cout << "Setting min alt (actually r in Re) : " - << min_altRe << " " - << planetRadius << " " - << (min_altRe - 1.0) * planetRadius/1000.0 << "\n"; + std::cout << "Setting min alt (actually r in Re) : " + << min_altRe << " " + << planetRadius << " " + << (min_altRe - 1.0) * planetRadius / 1000.0 << "\n"; for (int iLat = 0; iLat < nLatLoc; iLat++) { q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); @@ -691,7 +709,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // todo: needs support for variable stretching. it's like, halfway there. if (report.test_verbose(2)) - std::cout << "computing baselats : " << max_lat* cRtoD << " " << min_lat* cRtoD << "\n"; + std::cout << "computing baselats : " << max_lat* cRtoD << " " << min_lat* cRtoD + << "\n"; + arma_vec baseLats = baselat_spacing(size_up_norm(1), lower_left_norm(1), max_lat, min_lat, 1.0); @@ -706,7 +726,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // put one cell halfway btwn each base latitude, leave 1st and last cell for now... for (int64_t iLat = 1; iLat < nLats; iLat ++) - baseLats_down(iLat) = (baseLats(iLat - 1) + baseLats(iLat))/2.0; + baseLats_down(iLat) = (baseLats(iLat - 1) + baseLats(iLat)) / 2.0; // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else baseLats_down(0) = baseLats(0) * 1.5 - baseLats(1) * 0.5; diff --git a/src/inputs.cpp b/src/inputs.cpp index cdae8a26..f5fa1065 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -456,8 +456,7 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { // The rest of the settings are different for mag/geo grids, // First take the magnetic options, then "else" should be (cube-)sphere - if (grid_specs.shape.find("dipole") != std::string::npos) - { + if (grid_specs.shape.find("dipole") != std::string::npos) { // Latitude range (base of field line) is specified with max lat & min apex. grid_specs.max_blat = check_settings_pt(gridtype, "LatMax") * cDtoR; grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); @@ -465,9 +464,7 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); // controls the spacing of points along field line, <<1 for more pts at low alts grid_specs.FieldLineStretch = check_settings_pt(gridtype, "dAltStretch"); - } - else - { + } else { min_max = get_setting_intarr(gridtype, "LatRange"); grid_specs.lat_min = min_max[0] * cDtoR; grid_specs.lat_max = min_max[1] * cDtoR; diff --git a/src/ions.cpp b/src/ions.cpp index 712ff592..081f47a3 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -200,10 +200,12 @@ int Ions::read_planet_file(Planets planet) { species[iSpecies].mass = mass * cAMU; species[iSpecies].charge = ions["charge"][iSpecies]; doAdvect = ions["advect"][iSpecies]; - if (doAdvect == 0) + + if (doAdvect == 0) species[iSpecies].DoAdvect = false; else - species[iSpecies].DoAdvect = true; + species[iSpecies].DoAdvect = true; + species[iSpecies].vibe = ions["vibration"][iSpecies]; } @@ -388,22 +390,25 @@ void Ions::calc_lambda() { for (jIon = 0; jIon < nSpecies; jIon++) { if (jIon != iIon) { Mj = species[jIon].mass / cAMU; - density_ratio = species[jIon].density_scgc / - species[iIon].density_scgc; + density_ratio = species[jIon].density_scgc / + species[iIon].density_scgc; density_ratio.clamp(0.001, 1000.0); - ratios = ratios + density_ratio * - (species[jIon].charge * species[jIon].charge / - species[iIon].charge / species[iIon].charge) * - sqrt(Mj / (Mi + Mj)) * - (3 * Mi * Mi + 1.6 * Mi * Mj + 1.3 * Mj * Mj)/ - ((Mi + Mj) * (Mi + Mj)); + ratios = ratios + density_ratio * + (species[jIon].charge * species[jIon].charge / + species[iIon].charge / species[iIon].charge) * + sqrt(Mj / (Mi + Mj)) * + (3 * Mi * Mi + 1.6 * Mi * Mj + 1.3 * Mj * Mj) / + ((Mi + Mj) * (Mi + Mj)); } - species[iIon].lambda = - 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * - pow(species[iIon].temperature_scgc, 2.5) % (1 + 1.75 * ratios) * cE; + + species[iIon].lambda = + 3.1e6 / sqrt(Mi) / pow(species[iIon].charge, 4) * + pow(species[iIon].temperature_scgc, 2.5) % (1 + 1.75 * ratios) * cE; } + lambda = lambda + species[iIon].lambda % species[iIon].density_scgc; } + lambda = lambda / density_scgc; //lambda1d = 25.0 * cKB * pow(temp1d, 2.5) * (cKB / species[iIon].mass) @@ -432,7 +437,7 @@ void Ions::calc_specific_heat() { for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { // individual Cv for individual temperatures: - species[iSpecies].Cv_scgc = + species[iSpecies].Cv_scgc = (species[iSpecies].vibe - 2) * cKB / species[iSpecies].mass / 2; // Bulk Cv for the bulk temperature: Cv_scgc = Cv_scgc + @@ -442,6 +447,7 @@ void Ions::calc_specific_heat() { gamma_scgc = gamma_scgc + species[iSpecies].density_scgc / (species[iSpecies].vibe - 2); } + // Bulk Cv and gamma are the density-weighted Cv and gamma Cv_scgc = Cv_scgc / (2 * density_scgc); gamma_scgc = gamma_scgc * 2.0 / density_scgc + 1.0; diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index 3f61cbea..29d4cc89 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -70,7 +70,7 @@ bool Ions::set_upper_bcs(Grid grid) { for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { // Bulk Quantities: // Constant gradient (ignoring grid spacing...) - temperature_scgc.slice(iAlt) = + temperature_scgc.slice(iAlt) = 2 * temperature_scgc.slice(iAlt - 1) - temperature_scgc.slice(iAlt - 2); // For each species: @@ -88,8 +88,8 @@ bool Ions::set_upper_bcs(Grid grid) { abs(grid.gravity_vcgc[2].slice(iAlt)); // Assume each species falls of with (modified) hydrostatic: species[iSpecies].density_scgc.slice(iAlt) = - species[iSpecies].temperature_scgc.slice(iAlt) / - species[iSpecies].temperature_scgc.slice(iAlt-1) % + species[iSpecies].temperature_scgc.slice(iAlt) / + species[iSpecies].temperature_scgc.slice(iAlt - 1) % species[iSpecies].density_scgc.slice(iAlt - 1) % exp(-grid.dalt_lower_scgc.slice(iAlt) / h); species[iSpecies].velocity_vcgc[2].slice(iAlt).zeros(); diff --git a/src/neutral_ion_collisions.cpp b/src/neutral_ion_collisions.cpp index 981e4e77..88a7f86d 100644 --- a/src/neutral_ion_collisions.cpp +++ b/src/neutral_ion_collisions.cpp @@ -80,13 +80,15 @@ void calc_ion_collisions(Neutrals &neutrals, // The ions get the same amount of energy: ions.heating_neutral_friction_scgc = neutrals.heating_ion_friction_scgc; // Temperature difference is reversed (ions giving energy to neutrals): - ions.heating_neutral_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc; + ions.heating_neutral_heat_transfer_scgc = - + neutrals.heating_ion_heat_transfer_scgc; // convert energy change to temperature change: neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); neutrals.heating_ion_heat_transfer_scgc = - neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); + neutrals.heating_ion_heat_transfer_scgc / (neutrals.rho_scgc % + neutrals.Cv_scgc); //std::cout << "ion heat : " << ions.heating_neutral_friction_scgc(2,2,25) << " " // << ions.heating_neutral_heat_transfer_scgc(2,2,25) << " " // << vDiff(2,2,25) << "\n"; @@ -122,27 +124,29 @@ void calc_ion_collisions(Neutrals &neutrals, // Energy = sum_neutrals(sum__ions(B/(Mi + Mn) * (Ti - Tn) + Mi * (Vi-Vn)^2)) energy_heat = 3 * cKB * one_over_masses * - (ions.species[iIon].temperature_scgc - neutrals.temperature_scgc); + (ions.species[iIon].temperature_scgc - neutrals.temperature_scgc); energy_heat = energy_heat % beta; neutrals.heating_ion_heat_transfer_scgc = neutrals.heating_ion_heat_transfer_scgc + energy_heat; energy_friction.zeros(); + for (iDir = 0; iDir < 3; iDir++) { vDiff = (ions.species[iIon].velocity_vcgc[iDir] + advected_neutral.velocity_vcgc[iDir]); energy_friction = energy_friction + - (Mi * one_over_masses) * vDiff % vDiff % beta; + (Mi * one_over_masses) * vDiff % vDiff % beta; momentum[iDir] = momentum[iDir] + beta % vDiff; } // for each direction + neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc + energy_friction; - + // The ions get the same amount of energy: - ions.species[iIon].heating_neutral_friction_scgc = + ions.species[iIon].heating_neutral_friction_scgc = ions.species[iIon].heating_neutral_friction_scgc + energy_friction; // Temperature difference is reversed (ions giving energy to neutrals): - ions.species[iIon].heating_neutral_heat_transfer_scgc = + ions.species[iIon].heating_neutral_heat_transfer_scgc = ions.species[iIon].heating_neutral_heat_transfer_scgc - energy_heat; } // for each ion @@ -154,15 +158,16 @@ void calc_ion_collisions(Neutrals &neutrals, // Take all of the individual ions energy and give them to bulk energy: ions.heating_neutral_friction_scgc.zeros(); ions.heating_neutral_heat_transfer_scgc.zeros(); + for (iIon = 0; iIon < ions.nSpecies; iIon++) { - ions.heating_neutral_friction_scgc = - ions.heating_neutral_friction_scgc + + ions.heating_neutral_friction_scgc = + ions.heating_neutral_friction_scgc + ions.species[iSpecies].heating_neutral_friction_scgc; - ions.heating_neutral_heat_transfer_scgc = + ions.heating_neutral_heat_transfer_scgc = ions.heating_neutral_heat_transfer_scgc + ions.species[iSpecies].heating_neutral_heat_transfer_scgc; } - + // Convert from energy into K/s: neutrals.heating_ion_friction_scgc = neutrals.heating_ion_friction_scgc / (neutrals.rho_scgc % neutrals.Cv_scgc); diff --git a/src/neutrals.cpp b/src/neutrals.cpp index b1eb02e6..78f84fc9 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -215,10 +215,12 @@ int Neutrals::read_planet_file(Planets planet) { species[iSpecies].thermal_cond = neutrals["thermal_cond"][iSpecies]; species[iSpecies].thermal_exp = neutrals["thermal_exp"][iSpecies]; doAdvect = neutrals["advect"][iSpecies]; - if (doAdvect == 0) + + if (doAdvect == 0) species[iSpecies].DoAdvect = false; else - species[iSpecies].DoAdvect = true; + species[iSpecies].DoAdvect = true; + species[iSpecies].lower_bc_density = neutrals["BC"][iSpecies]; } @@ -266,6 +268,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, species[iSpecies].scale_height_scgc.slice(iAlt)); } } + calc_mass_density(); return; } @@ -289,6 +292,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iSpecies, exp(-grid.dr_lower_scgc.slice(iAlt) / species[iSpecies].scale_height_scgc.slice(iAlt)); } + calc_mass_density(); return; } diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index cb1729b3..e66ba51d 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -173,6 +173,7 @@ bool Neutrals::initial_conditions(Grid grid, set_lower_bcs(grid, time, indices); report.print(2, "Filling with hydrostatic"); + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 6810570f..8cc813e4 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -18,6 +18,7 @@ int64_t iProcQuery = -1; Quadtree::Quadtree(std::string shape) { if (shape == "cubesphere") nRootNodes = 6; + if (shape == "dipole2") nRootNodes = 2; else @@ -64,6 +65,7 @@ void Quadtree::build(std::string gridtype) { ups = Dipole::UPS; IsSphere = true; } + if (grid_input.shape == "dipole2") { origins = Dipole2::ORIGINS; rights = Dipole2::RIGHTS; diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 639ea346..50b3749c 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -56,6 +56,7 @@ arma_cube calc_gradient_lon(arma_cube value, Grid grid) { (value.row(iLon) - value.row(iLon - 1)) / grid.dlon_center_dist_scgc.row(iLon); } + return gradient; } @@ -92,6 +93,7 @@ arma_cube calc_gradient_lat(arma_cube value, Grid grid) { (value.col(iLat) - value.col(iLat - 1)) / grid.dlat_center_dist_scgc.col(iLat); } + return gradient; } @@ -112,14 +114,15 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { if (grid.get_HasZdim()) { arma_cube one_minus_r2 = 1.0 - grid.dalt_ratio_sq_scgc; + // Central part for (iAlt = 1; iAlt < nAlts - 1; iAlt++) gradient.slice(iAlt) = (value.slice(iAlt + 1) - - one_minus_r2.slice(iAlt) % value.slice(iAlt) - - grid.dalt_ratio_sq_scgc.slice(iAlt) % value.slice(iAlt - 1)) / + - one_minus_r2.slice(iAlt) % value.slice(iAlt) + - grid.dalt_ratio_sq_scgc.slice(iAlt) % value.slice(iAlt - 1)) / (grid.dalt_lower_scgc.slice(iAlt + 1) % - (1.0 + grid.dalt_ratio_scgc.slice(iAlt))); + (1.0 + grid.dalt_ratio_scgc.slice(iAlt))); // lower boundary iAlt = 0; @@ -133,6 +136,7 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { (value.slice(iAlt) - value.slice(iAlt - 1)) / grid.dalt_lower_scgc.slice(iAlt); } + return gradient; } diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 40aa64b3..8027cd94 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -311,17 +311,17 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); -/* - std::cout << iSpecies << " " << log_s(2,2,19) << " " - << dt << " " - << divVertVel_s[iSpecies](2,2,19) << " " - << species[iSpecies].velocity_vcgc[2](2,2,19) << " " - << gradLogN_s[iSpecies](2,2,19) << " " - << species[iSpecies].velocity_vcgc[2](2,2,19) * gradLogN_s[iSpecies](2,2,19) << " " - << diffLogN_s[iSpecies](2,2,19) << " " - << species[iSpecies].density_scgc(2,2,19) << " " - << species[iSpecies].newDensity_scgc(2,2,19) << "\n"; -*/ + /* + std::cout << iSpecies << " " << log_s(2,2,19) << " " + << dt << " " + << divVertVel_s[iSpecies](2,2,19) << " " + << species[iSpecies].velocity_vcgc[2](2,2,19) << " " + << gradLogN_s[iSpecies](2,2,19) << " " + << species[iSpecies].velocity_vcgc[2](2,2,19) * gradLogN_s[iSpecies](2,2,19) << " " + << diffLogN_s[iSpecies](2,2,19) << " " + << species[iSpecies].density_scgc(2,2,19) << " " + << species[iSpecies].newDensity_scgc(2,2,19) << "\n"; + */ accTotal = dt * grid.gravity_vcgc[2] - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass @@ -512,7 +512,7 @@ void Ions::solver_vertical_rusanov(Grid grid, species[iSpecies].density_scgc //log(species[iSpecies].density_scgc) - dt * (//divVertVel_s[iSpecies] + - species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + dt * diffLogN_s[iSpecies]; //species[iSpecies].newDensity_scgc = exp(log_s); species[iSpecies].newDensity_scgc = log_s; From 9ce1738e46dc0844e347bf2ae9fae50a12af09b4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 2 Jan 2025 21:45:16 -0500 Subject: [PATCH 343/691] discussions on coodinate systems within Aether --- doc/internals/coordinates.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 doc/internals/coordinates.md diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md new file mode 100644 index 00000000..03d4b6dd --- /dev/null +++ b/doc/internals/coordinates.md @@ -0,0 +1,29 @@ +# Coordinates in Aether + +There are a variety of coordinates in Aether. This document describes some of them. + +## Spherical Coordinates + +The easiest coordinate system to understand within Aether is the spherical system, which is a longitude, latitude, radial (LLR) coordinate system. When the planet is a pure sphere, the LLR system is orthogonal - meaning that the grid lines up perfectly with the lines of constant longitude, latitude, and radius. + +In Aether, longitude and latitude are expressed in radians and are positive towards the east and towards the north. Radius is expressed in meters and is positive away from the planet (upwards). In Aether, often Altitude is used instead of radius. When the planet is a perfect sphere, these are offset by a constant value. + +If the planet is an oblate spheriod, then the equator is larger than the pole, so that the planetary radius is dependent on latitude. Aether is currently set up so that Altitude is not dependent on latitude or longitude, so that if an oblate spheriod is used, then a constant altitude would have a radius that is dependent on latitude. This means that the coordinate system is not purely orthogonal. At this time, this is not dealt with properly. + +Because Aether considers gravity to be a function of radius and explicitly includes the centrifugal acceleration, the pertubation away from a perfect sphere should mostly cancel. + +## i, j, k Coordinates + +As described in the grid.md file, Aether uses a logical '(i, j, k)' 3D grid structure. Therefore, we refer to the 'primary' coordinates as the ijk coordinate system. What this means is that the i-coordinate is in the i-direction, the j-coordinate is in the j-direction, and the k-coordinate is in the k-direction. + +For the (perfectly) spherical grid, the i-coordinate is longitude, the j-coordinate is latitude, and the k-coordinate is radius. + +For the Cubedsphere grid, the i-coordinate is RIGHT, the j-coodinate is UP, and the k-coordinate is radius. Each face of the cubedsphere has the same coordinate system, but only with reference to that face. This means that if each face is looked at independently, the lower left corner is at (about) i = -45, j = -45 deg, while the upper right corner is at i = +45, j = +45 deg. Radius is treated the same as in a spherical grid. + +Should the official coordinates be in the native coordinates (which could be different for each system), or should the coordinates be in meters, such that when gradients are taken, they are in /m? + +Maybe we could have: + +i_scgc, j_scgc, k_scgc - coordinates in the native coordinates (radians, meters, etc.) +im_scgc, jm_scgc, km_scgc - coordinate in meters + From a7b0a03ad8457eb0d98e8227f68b6b9b0a9ae810 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 3 Jan 2025 08:55:24 -0500 Subject: [PATCH 344/691] a bit more added --- doc/internals/coordinates.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md index 03d4b6dd..0979b943 100644 --- a/doc/internals/coordinates.md +++ b/doc/internals/coordinates.md @@ -27,3 +27,15 @@ Maybe we could have: i_scgc, j_scgc, k_scgc - coordinates in the native coordinates (radians, meters, etc.) im_scgc, jm_scgc, km_scgc - coordinate in meters +The question is what variables do we need? + +Locations: +- Cell Centers (these are the center of each volume) +- Cell Edges in the i, j, k directions (these are the center of each area) +- Cell Corners + +All locations should be described in the following coordinates: +- i, j, k +- lon, lat, radius (+alt) +- magnetic lon, invariant lat? + From a7c9e59102175b93c30f5015e77b491fd807be5c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 5 Jan 2025 09:19:42 -0500 Subject: [PATCH 345/691] FEAT: move grid spacing functions to new file --- src/fill_grid.cpp | 300 +----------------------------------- src/grid_spacing.cpp | 355 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 359 insertions(+), 296 deletions(-) create mode 100644 src/grid_spacing.cpp diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index e29c72db..4377a90c 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -90,7 +90,7 @@ void Grid::calc_gse(Planets planet, Times time) { // --------------------------------------------------------------------------- // Fill in Magnetic Local Time -// - This assumes that the GE coordinates have been calculated +// - This assumes that the GSE coordinates have been calculated // and filled in! // --------------------------------------------------------------------------- @@ -170,8 +170,9 @@ void Grid::fill_grid_bfield(Planets planet) { bfield_info = get_bfield(lon, lat, alt, DoDebug, planet); - + // This is Invariant Latitude magLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; + magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; bfield_mag_scgc(iLon, iLat, iAlt) = 0.0; @@ -301,7 +302,7 @@ void Grid::calc_gravity(Planets planet) { // Fill in XYZ in geo and mag coordinates // ----------------------------------------------------------------------------- -void Grid::calc_grid_spacing(Planets planet) { +void Grid::calc_grid_spacing_old(Planets planet) { int64_t iLon, iLat, iAlt; report.print(3, "starting calc_grid_spacing"); @@ -324,143 +325,6 @@ void Grid::calc_grid_spacing(Planets planet) { report.print(3, "ending calc_grid_spacing"); } -// --------------------------------------- -// Grid spacing for altitude: -// --------------------------------------- - -void Grid::calc_alt_grid_spacing() { - - int64_t iAlt; - - report.print(4, "starting calc_alt_grid_spacing"); - - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { - dalt_center_scgc.slice(iAlt) = - (geoAlt_scgc.slice(iAlt + 1) - geoAlt_scgc.slice(iAlt - 1)) / 2.0; - dalt_lower_scgc.slice(iAlt) = - geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - } - - dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); - dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); - - dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); - dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); - iAlt = nAlts - 1; - dalt_lower_scgc.slice(iAlt) = - geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - - // For a stretched grid, calculate some useful quantities: - // lower is defined for the current cell, which - // means that upper(iAlt) is lower(iAlt+1) - // ratio = upper / lower - for (iAlt = 0; iAlt < nAlts - 1; iAlt++) - dalt_ratio_scgc.slice(iAlt) = - dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); - - iAlt = nAlts - 1; - dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); - - // Need the square of the ratio: - dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; - - // Calculate the one-sided 3rd order gradient coefficients for the lower BC: - - arma_mat h1, h2, h3, h4, MeshH1, MeshH2, MeshH3, MeshH4; - - if (HasZdim & nAlts > nGCs + 5) { - for (iAlt = 0; iAlt < nGCs; iAlt++) { - h1 = dalt_lower_scgc.slice(iAlt + 2); - h2 = dalt_lower_scgc.slice(iAlt + 3); - h3 = dalt_lower_scgc.slice(iAlt + 4); - h4 = dalt_lower_scgc.slice(iAlt + 5); - MeshH1 = h1; - MeshH2 = h1 + h2; - MeshH3 = h1 + h2 + h3; - MeshH4 = h1 + h2 + h3 + h4; - MeshCoef1s3rdp1.slice(iAlt) = - -1.0 * ( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + - MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3) / - (MeshH1 % MeshH2 % MeshH3 % MeshH4); - MeshCoef1s3rdp2.slice(iAlt) = - 1.0 * ( MeshH2 % MeshH3 % MeshH4) / (h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); - MeshCoef1s3rdp3.slice(iAlt) = - -1.0 * ( MeshH1 % MeshH3 % MeshH4) / (MeshH2 % h2 % h3 % (h3 + h4)); - MeshCoef1s3rdp4.slice(iAlt) = - 1.0 * ( MeshH1 % MeshH2 % MeshH4) / (MeshH3 % (h3 + h2) % h3 % h4); - MeshCoef1s3rdp5.slice(iAlt) = - -1.0 * ( MeshH1 % MeshH2 % MeshH3) / (MeshH4 % (h2 + h3 + h4) % (h3 + h4) % h4); - } - } - - report.print(4, "ending calc_alt_grid_spacing"); - return; -} - -// --------------------------------------- -// Grid spacing for latitude: -// --------------------------------------- - -void Grid::calc_lat_grid_spacing() { - - int64_t iLat; - - report.print(4, "starting calc_lat_grid_spacing"); - - for (iLat = 1; iLat < nLats - 1; iLat++) { - dlat_center_scgc.col(iLat) = - (geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat - 1)) / 2.0; - } - - // Bottom (one sided): - iLat = 0; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); - // Top (one sided): - iLat = nLats - 1; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); - - // Make this into a distance: - dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; - report.print(4, "ending calc_lat_grid_spacing"); -} - -// --------------------------------------- -// Grid spacing for longitude: -// --------------------------------------- - -void Grid::calc_long_grid_spacing() { - - int64_t iLon; - - report.print(4, "starting calc_long_grid_spacing"); - - for (iLon = 1; iLon < nLons - 1; iLon++) - dlon_center_scgc.row(iLon) = - (geoLon_scgc.row(iLon + 1) - geoLon_scgc.row(iLon - 1)) / 2.0; - - // Bottom (one sided): - iLon = 0; - dlon_center_scgc.row(iLon) = - geoLon_scgc.row(iLon + 1) - geoLon_scgc.row(iLon); - // Top (one sided): - iLon = nLons - 1; - dlon_center_scgc.row(iLon) = - geoLon_scgc.row(iLon) - geoLon_scgc.row(iLon - 1); - - // Make this into a distance: - dlon_center_dist_scgc = - dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); - - report.print(4, "ending calc_long_grid_spacing"); - -} - // ----------------------------------------------------------------------------- // Calaculate centripetal acceleration // ----------------------------------------------------------------------------- @@ -480,159 +344,3 @@ void Grid::calc_cent_acc(Planets planet) { cent_acc_vcgc[2] = omega2 * radius_scgc % cos(geoLat_scgc) % cos(geoLat_scgc); } -// ----------------------------------------------------------------------------- -// Calaculate Grid Spacing for Dipole Grid -// ----------------------------------------------------------------------------- - -void Grid::calc_dipole_grid_spacing(Planets planet) { - - int64_t iLon, iLat, iAlt; - - report.print(3, "starting calc_grid_spacing"); - - // This is close, but may need to be adjusted later. - // These quantities are obtained from integrating the scale factor (h) - // The along-field-line distance (alt) should be right, but the lat distance - // is the shortest distance from a point to the adjacent field line, not the adjacent cell. - - report.print(3, "starting alt"); - calc_alt_dipole_grid_spacing(); - report.print(3, "starting lat"); - calc_lat_dipole_grid_spacing(); - report.print(3, "starting long"); - calc_long_dipole_grid_spacing(); - - std::vector lon_lat_radius; - lon_lat_radius.push_back(geoLon_scgc); - lon_lat_radius.push_back(geoLat_scgc); - lon_lat_radius.push_back(radius_scgc); - std::vector xyz; - - xyz = transform_llr_to_xyz_3d(lon_lat_radius); - geoX_scgc = xyz[0]; - geoY_scgc = xyz[0]; - geoZ_scgc = xyz[0]; - - report.print(3, "ending calc_grid_spacing"); -} - -// for sanity (only marginally helpful): -inline arma_mat delTm(arma_mat theta) { - return (sqrt(3 * cos(theta) % cos(theta) + 1)); -} -inline arma_cube delTc(arma_cube theta) { - return (sqrt(3 * cos(theta) % cos(theta) + 1)); -} - -// ----------------------------------------------------------------------------- -// Grid spacing for altitude: -// - Dipole grid needs to be handled differently! -// ----------------------------------------------------------------------------- - -void Grid::calc_alt_dipole_grid_spacing() { - - int64_t iAlt; - precision_t planetRadius; - - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { - - dalt_center_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) - % (1 / delTm(magLat_scgc.slice(iAlt + 1))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - - dalt_lower_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) - % (1 / delTm(magLat_scgc.slice(iAlt))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - dr_lower_scgc.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - } - - dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); - dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); - - dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); - dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); - iAlt = nAlts - 1; - dalt_lower_scgc.slice(iAlt) = - geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - - // For a stretched grid, calculate some useful quantities: - // lower is defined for the current cell, which - // means that upper(iAlt) is lower(iAlt+1) - // ratio = upper / lower - for (iAlt = 0; iAlt < nAlts - 1; iAlt++) - dalt_ratio_scgc.slice(iAlt) = - dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); - - iAlt = nAlts - 1; - dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); - - // Need the square of the ratio: - dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; -} - -// --------------------------------------- -// Grid spacing for latitude: -// Again, different for the dipole... -// - uhoh, might not be right. not actually perpendicular to q-p, but no way around that, i think. -// --------------------------------------- - -void Grid::calc_lat_dipole_grid_spacing() { - - int64_t iLat; - - for (iLat = 1; iLat < nLats - 1; iLat++) { - dlat_center_scgc.col(iLat) = - abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) - % (1 / delTc(magLat_scgc.col(iLat + 1))) - - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) - % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; - } - - // Bottom (one sided): - iLat = 0; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); - // Top (one sided): - iLat = nLats - 1; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); - - // Make this into a distance: - dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; -} - -// --------------------------------------- -// Grid spacing for longitude: -// --------------------------------------- - -void Grid::calc_long_dipole_grid_spacing() { - - int64_t iLon; - - for (iLon = 1; iLon < nLons - 1; iLon++) - dlon_center_scgc.row(iLon) = - (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; - - // this might be fine for the dipole, if it works for the geo grid... - - // Bottom (one sided): - iLon = 0; - dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); - // Top (one sided): - iLon = nLons - 1; - dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); - - // Make this into a distance: - dlon_center_dist_scgc = - // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); - dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); -} \ No newline at end of file diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp new file mode 100644 index 00000000..bce04cfa --- /dev/null +++ b/src/grid_spacing.cpp @@ -0,0 +1,355 @@ +// Copyright 2025, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include "aether.h" + +// ----------------------------------------------------------------------------- +// Fill in XYZ in geo and mag coordinates +// ----------------------------------------------------------------------------- + +void Grid::calc_grid_spacing(Planets planet) { + int64_t iLon, iLat, iAlt; + + report.print(3, "starting calc_grid_spacing"); + + calc_alt_grid_spacing(); + calc_lat_grid_spacing(); + calc_long_grid_spacing(); + + std::vector lon_lat_radius; + lon_lat_radius.push_back(geoLon_scgc); + lon_lat_radius.push_back(geoLat_scgc); + lon_lat_radius.push_back(radius_scgc); + + std::vector xyz; + xyz = transform_llr_to_xyz_3d(lon_lat_radius); + geoX_scgc = xyz[0]; + geoY_scgc = xyz[0]; + geoZ_scgc = xyz[0]; + + report.print(3, "ending calc_grid_spacing"); +} + +// --------------------------------------- +// Grid spacing for altitude: +// --------------------------------------- + +void Grid::calc_alt_grid_spacing() { + + int64_t iAlt; + + report.print(4, "starting calc_alt_grid_spacing"); + + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { + dalt_center_scgc.slice(iAlt) = + (geoAlt_scgc.slice(iAlt + 1) - geoAlt_scgc.slice(iAlt - 1)) / 2.0; + dalt_lower_scgc.slice(iAlt) = + geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + } + + dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); + dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); + + dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); + dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); + iAlt = nAlts - 1; + dalt_lower_scgc.slice(iAlt) = + geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + + // For a stretched grid, calculate some useful quantities: + // lower is defined for the current cell, which + // means that upper(iAlt) is lower(iAlt+1) + // ratio = upper / lower + for (iAlt = 0; iAlt < nAlts - 1; iAlt++) + dalt_ratio_scgc.slice(iAlt) = + dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); + + iAlt = nAlts - 1; + dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); + + // Need the square of the ratio: + dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; + + // Calculate the one-sided 3rd order gradient coefficients for the lower BC: + + arma_mat h1, h2, h3, h4, MeshH1, MeshH2, MeshH3, MeshH4; + + if (HasZdim & nAlts > nGCs + 5) { + for (iAlt = 0; iAlt < nGCs; iAlt++) { + h1 = dalt_lower_scgc.slice(iAlt + 2); + h2 = dalt_lower_scgc.slice(iAlt + 3); + h3 = dalt_lower_scgc.slice(iAlt + 4); + h4 = dalt_lower_scgc.slice(iAlt + 5); + MeshH1 = h1; + MeshH2 = h1 + h2; + MeshH3 = h1 + h2 + h3; + MeshH4 = h1 + h2 + h3 + h4; + MeshCoef1s3rdp1.slice(iAlt) = + -1.0 * ( MeshH2 % MeshH3 % MeshH4 + MeshH1 % MeshH3 % MeshH4 + + MeshH1 % MeshH2 % MeshH4 + MeshH1 % MeshH2 % MeshH3) / + (MeshH1 % MeshH2 % MeshH3 % MeshH4); + MeshCoef1s3rdp2.slice(iAlt) = + 1.0 * ( MeshH2 % MeshH3 % MeshH4) / (h1 % h2 % (h2 + h3) % (h2 + h3 + h4)); + MeshCoef1s3rdp3.slice(iAlt) = + -1.0 * ( MeshH1 % MeshH3 % MeshH4) / (MeshH2 % h2 % h3 % (h3 + h4)); + MeshCoef1s3rdp4.slice(iAlt) = + 1.0 * ( MeshH1 % MeshH2 % MeshH4) / (MeshH3 % (h3 + h2) % h3 % h4); + MeshCoef1s3rdp5.slice(iAlt) = + -1.0 * ( MeshH1 % MeshH2 % MeshH3) / (MeshH4 % (h2 + h3 + h4) % (h3 + h4) % h4); + } + } + + report.print(4, "ending calc_alt_grid_spacing"); + return; +} + +// --------------------------------------- +// Grid spacing for latitude: +// --------------------------------------- + +void Grid::calc_lat_grid_spacing() { + + int64_t iLat; + + report.print(4, "starting calc_lat_grid_spacing"); + + for (iLat = 1; iLat < nLats - 1; iLat++) { + dlat_center_scgc.col(iLat) = + (geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat - 1)) / 2.0; + } + + // Bottom (one sided): + iLat = 0; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); + // Top (one sided): + iLat = nLats - 1; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + + // Make this into a distance: + dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; + report.print(4, "ending calc_lat_grid_spacing"); +} + +// --------------------------------------- +// Grid spacing for longitude: +// --------------------------------------- + +void Grid::calc_long_grid_spacing() { + + int64_t iLon; + + report.print(4, "starting calc_long_grid_spacing"); + + for (iLon = 1; iLon < nLons - 1; iLon++) + dlon_center_scgc.row(iLon) = + (geoLon_scgc.row(iLon + 1) - geoLon_scgc.row(iLon - 1)) / 2.0; + + // Bottom (one sided): + iLon = 0; + dlon_center_scgc.row(iLon) = + geoLon_scgc.row(iLon + 1) - geoLon_scgc.row(iLon); + // Top (one sided): + iLon = nLons - 1; + dlon_center_scgc.row(iLon) = + geoLon_scgc.row(iLon) - geoLon_scgc.row(iLon - 1); + + // Make this into a distance: + dlon_center_dist_scgc = + dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); + + report.print(4, "ending calc_long_grid_spacing"); + +} + +// --------------------------------------- +// Grid spacing for magnetic longitude: +// --------------------------------------- + +void Grid::calc_maglong_grid_spacing() { + + int64_t iLon; + + report.print(4, "starting calc_maglong_grid_spacing"); + + for (iLon = 1; iLon < nLons - 1; iLon++) + dmlon_center_scgc.row(iLon) = + (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + + // Bottom (one sided): + iLon = 0; + dmlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); + // Top (one sided): + iLon = nLons - 1; + dmlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); + + // Make this into a distance: + dmlon_center_dist_scgc = + dmlon_center_scgc % radius_scgc % abs(cos(magLat_scgc)); + + report.print(4, "ending calc_maglong_grid_spacing"); +} + +// ----------------------------------------------------------------------------- +// Calaculate Grid Spacing for Dipole Grid +// ----------------------------------------------------------------------------- + +void Grid::calc_dipole_grid_spacing(Planets planet) { + + int64_t iLon, iLat, iAlt; + + report.print(3, "starting calc_grid_spacing"); + + // This is close, but may need to be adjusted later. + // These quantities are obtained from integrating the scale factor (h) + // The along-field-line distance (alt) should be right, but the lat distance + // is the shortest distance from a point to the adjacent field line, not the adjacent cell. + + report.print(3, "starting alt"); + calc_alt_dipole_grid_spacing(); + report.print(3, "starting lat"); + calc_lat_dipole_grid_spacing(); + report.print(3, "starting long"); + calc_long_dipole_grid_spacing(); + + std::vector lon_lat_radius; + lon_lat_radius.push_back(geoLon_scgc); + lon_lat_radius.push_back(geoLat_scgc); + lon_lat_radius.push_back(radius_scgc); + std::vector xyz; + + xyz = transform_llr_to_xyz_3d(lon_lat_radius); + geoX_scgc = xyz[0]; + geoY_scgc = xyz[0]; + geoZ_scgc = xyz[0]; + + report.print(3, "ending calc_grid_spacing"); +} + +// for sanity (only marginally helpful): +inline arma_mat delTm(arma_mat theta) { + return (sqrt(3 * cos(theta) % cos(theta) + 1)); +} +inline arma_cube delTc(arma_cube theta) { + return (sqrt(3 * cos(theta) % cos(theta) + 1)); +} + +// ----------------------------------------------------------------------------- +// Grid spacing for altitude: +// - Dipole grid needs to be handled differently! +// ----------------------------------------------------------------------------- + +void Grid::calc_alt_dipole_grid_spacing() { + + int64_t iAlt; + precision_t planetRadius; + + for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { + + dalt_center_scgc.slice(iAlt) = + abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) + % (1 / delTm(magLat_scgc.slice(iAlt + 1))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + + dalt_lower_scgc.slice(iAlt) = + abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) + % (1 / delTm(magLat_scgc.slice(iAlt))) + - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) + % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + } + + dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); + dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); + + dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); + dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); + iAlt = nAlts - 1; + dalt_lower_scgc.slice(iAlt) = + geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); + dr_lower_scgc.slice(iAlt) = + radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); + + // For a stretched grid, calculate some useful quantities: + // lower is defined for the current cell, which + // means that upper(iAlt) is lower(iAlt+1) + // ratio = upper / lower + for (iAlt = 0; iAlt < nAlts - 1; iAlt++) + dalt_ratio_scgc.slice(iAlt) = + dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); + + iAlt = nAlts - 1; + dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); + + // Need the square of the ratio: + dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; +} + +// --------------------------------------- +// Grid spacing for latitude: +// Again, different for the dipole... +// - uhoh, might not be right. not actually perpendicular to q-p, but no way around that, i think. +// --------------------------------------- + +void Grid::calc_lat_dipole_grid_spacing() { + + int64_t iLat; + + for (iLat = 1; iLat < nLats - 1; iLat++) { + dlat_center_scgc.col(iLat) = + abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) + % (1 / delTc(magLat_scgc.col(iLat + 1))) + - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) + % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; + } + + // Bottom (one sided): + iLat = 0; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); + // Top (one sided): + iLat = nLats - 1; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + + // Make this into a distance: + dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; +} + +// --------------------------------------- +// Grid spacing for longitude: +// --------------------------------------- + +void Grid::calc_long_dipole_grid_spacing() { + + int64_t iLon; + + for (iLon = 1; iLon < nLons - 1; iLon++) + dlon_center_scgc.row(iLon) = + (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + + // this might be fine for the dipole, if it works for the geo grid... + + // Bottom (one sided): + iLon = 0; + dlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); + // Top (one sided): + iLon = nLons - 1; + dlon_center_scgc.row(iLon) = + magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); + + // Make this into a distance: + dlon_center_dist_scgc = + // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); + dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); +} From 20a2b2cd1917ac75b009199e3e4665215572abb6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 5 Jan 2025 10:14:55 -0500 Subject: [PATCH 346/691] FEAT: describe coordinate systems --- doc/internals/coordinates.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md index 0979b943..7c69aa6c 100644 --- a/doc/internals/coordinates.md +++ b/doc/internals/coordinates.md @@ -39,3 +39,34 @@ All locations should be described in the following coordinates: - lon, lat, radius (+alt) - magnetic lon, invariant lat? + +# Coordinate Systems + +## GEO - Geographic coordinate system (or geodetic) +- Longitude (radians) - radians east of prime meridian (0 - 2pi) +- Latitude (radians) - angle between the equatorial plane and point. For oblate spheriod, this angle is not the same as the angle orthogonal to the surface of the planet and the equatorial plane. +- Radius (meters) - the distance to the center of the planet (Altitude is often used instead). + +## PCPF - Planet-centered Planet-fixed or Geocentric coordinate system +- Cartesian coordinates of Geographic coordinate system in meters (X, Y, Z). +- X (meters) - aligned with the equator and prime meridian +- Z (meters) - aligned with rotation axis of the planet +- Y (meters) - completes the right-hand coordinate system + +## PSE - Planetary Solar Ecliptic coordinates +- Cartesian coordinates tying together planet and Sun +- X (meters) - points from the center of the planet to the Sun +- Y (meters) - points from the center of the planet towards dusk and opposite planet's motion around the sun +- Z (meters) - orthogonal to the ecliptic plane + +## Dipole Coordinates +- Longitude (radians) - radians east of the meridian that contains the north magnetic pole and north rotation axis +- P (?) - Identifies the field line, related to L-shell +- Q (meters?) - The distance along the field line from some reference point, related to magnetic latitude. + +## More Dipole Coordinates +- L-shell (Planetary Radii) - The distance from the planet's center at which the magnetic field encounters the dipole's equatorial plane +- Magnetic Latitude (radians) - angle between the dipole's equatorial plane and the point. +- Invariant Latitude (degrees) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet. This is constant along the field-line and is related to the L-Shell. +- Magnetic Local Time (hours) - Angle between the sun, the north magnetic pole, and the point. Explicitly, this is done in PSE XY coordinates, ignoring the Z coorinate. + From f55f70b06958360eeedee2f8ab0122911a41cf6b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 5 Jan 2025 10:16:01 -0500 Subject: [PATCH 347/691] rearranged a bit --- doc/internals/coordinates.md | 62 +++++++++++++++++++----------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md index 7c69aa6c..418e0412 100644 --- a/doc/internals/coordinates.md +++ b/doc/internals/coordinates.md @@ -1,3 +1,35 @@ + +# Coordinate Systems + +## GEO - Geographic coordinate system (or geodetic) +- Longitude (radians) - radians east of prime meridian (0 - 2pi) +- Latitude (radians) - angle between the equatorial plane and point. For oblate spheriod, this angle is not the same as the angle orthogonal to the surface of the planet and the equatorial plane. +- Radius (meters) - the distance to the center of the planet (Altitude is often used instead). + +## PCPF - Planet-centered Planet-fixed or Geocentric coordinate system +- Cartesian coordinates of Geographic coordinate system in meters (X, Y, Z). +- X (meters) - aligned with the equator and prime meridian +- Z (meters) - aligned with rotation axis of the planet +- Y (meters) - completes the right-hand coordinate system + +## PSE - Planetary Solar Ecliptic coordinates +- Cartesian coordinates tying together planet and Sun +- X (meters) - points from the center of the planet to the Sun +- Y (meters) - points from the center of the planet towards dusk and opposite planet's motion around the sun +- Z (meters) - orthogonal to the ecliptic plane + +## Dipole Coordinates +- Longitude (radians) - radians east of the meridian that contains the north magnetic pole and north rotation axis +- P (?) - Identifies the field line, related to L-shell +- Q (meters?) - The distance along the field line from some reference point, related to magnetic latitude. + +## More Dipole Coordinates +- L-shell (Planetary Radii) - The distance from the planet's center at which the magnetic field encounters the dipole's equatorial plane +- Magnetic Latitude (radians) - angle between the dipole's equatorial plane and the point. +- Invariant Latitude (degrees) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet. This is constant along the field-line and is related to the L-Shell. +- Magnetic Local Time (hours) - Angle between the sun, the north magnetic pole, and the point. Explicitly, this is done in PSE XY coordinates, ignoring the Z coorinate. + + # Coordinates in Aether There are a variety of coordinates in Aether. This document describes some of them. @@ -40,33 +72,3 @@ All locations should be described in the following coordinates: - magnetic lon, invariant lat? -# Coordinate Systems - -## GEO - Geographic coordinate system (or geodetic) -- Longitude (radians) - radians east of prime meridian (0 - 2pi) -- Latitude (radians) - angle between the equatorial plane and point. For oblate spheriod, this angle is not the same as the angle orthogonal to the surface of the planet and the equatorial plane. -- Radius (meters) - the distance to the center of the planet (Altitude is often used instead). - -## PCPF - Planet-centered Planet-fixed or Geocentric coordinate system -- Cartesian coordinates of Geographic coordinate system in meters (X, Y, Z). -- X (meters) - aligned with the equator and prime meridian -- Z (meters) - aligned with rotation axis of the planet -- Y (meters) - completes the right-hand coordinate system - -## PSE - Planetary Solar Ecliptic coordinates -- Cartesian coordinates tying together planet and Sun -- X (meters) - points from the center of the planet to the Sun -- Y (meters) - points from the center of the planet towards dusk and opposite planet's motion around the sun -- Z (meters) - orthogonal to the ecliptic plane - -## Dipole Coordinates -- Longitude (radians) - radians east of the meridian that contains the north magnetic pole and north rotation axis -- P (?) - Identifies the field line, related to L-shell -- Q (meters?) - The distance along the field line from some reference point, related to magnetic latitude. - -## More Dipole Coordinates -- L-shell (Planetary Radii) - The distance from the planet's center at which the magnetic field encounters the dipole's equatorial plane -- Magnetic Latitude (radians) - angle between the dipole's equatorial plane and the point. -- Invariant Latitude (degrees) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet. This is constant along the field-line and is related to the L-Shell. -- Magnetic Local Time (hours) - Angle between the sun, the north magnetic pole, and the point. Explicitly, this is done in PSE XY coordinates, ignoring the Z coorinate. - From 9053e81ced5e2f0003ba86c392522db93fa18c4f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 5 Jan 2025 10:28:51 -0500 Subject: [PATCH 348/691] FEAT: move cubesphere grid functions to their own file --- src/grid_cubesphere.cpp | 592 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 592 insertions(+) create mode 100644 src/grid_cubesphere.cpp diff --git a/src/grid_cubesphere.cpp b/src/grid_cubesphere.cpp new file mode 100644 index 00000000..d5c6742d --- /dev/null +++ b/src/grid_cubesphere.cpp @@ -0,0 +1,592 @@ +// Copyright 2025, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + + +#include "aether.h" + +// ---------------------------------------------------------------------- +// Create connectivity between the nodes for message passing for cubesphere +// ---------------------------------------------------------------------- + +void Grid::create_cubesphere_connection(Quadtree quadtree) { + + std::string function = "Grid::create_cubesphere_connection"; + static int iFunction = -1; + report.enter(function, iFunction); + + IsLatLonGrid = false; + + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec middle_norm = quadtree.get_vect("MID"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + // These points go off the edge to the next block in each direction: + arma_vec down_norm = middle_norm - 0.51 * size_up_norm; + arma_vec up_norm = middle_norm + 0.51 * size_up_norm; + arma_vec left_norm = middle_norm - 0.51 * size_right_norm; + arma_vec right_norm = middle_norm + 0.51 * size_right_norm; + + // Find those points in the quadtree to figure out which processor + // they are on + iProcYm = quadtree.find_point(down_norm) + iMember * nGrids; + iProcYp = quadtree.find_point(up_norm) + iMember * nGrids; + iProcXm = quadtree.find_point(left_norm) + iMember * nGrids; + iProcXp = quadtree.find_point(right_norm) + iMember * nGrids; + + // Need to know which side the current block is on and which side each + // of the blocks in the different directions is on. Need this so we can + // know how to unpack the variables after the message pass. + iRoot = quadtree.find_root(middle_norm); + iRootYm = quadtree.find_root(down_norm); + iRootYp = quadtree.find_root(up_norm); + iRootXm = quadtree.find_root(left_norm); + iRootXp = quadtree.find_root(right_norm); + + // These should be the exact edge of the face. + // The from and to processors should get these in the same place, + // so they can be used to match which processor to send / receive info + edge_Xp = middle_norm + size_right_norm / 2.0; + edge_Xm = middle_norm - size_right_norm / 2.0; + edge_Yp = middle_norm + size_up_norm / 2.0; + edge_Ym = middle_norm - size_up_norm / 2.0; + + if (report.test_verbose(2)) + std::cout << "connectivity : " + << " iProc : " << iProc << "\n" + << " isnorth : " << DoesTouchNorthPole << "\n" + << " issouth : " << DoesTouchSouthPole << "\n" + << " iProcXp : " << iProcXp << "\n" + << " iProcYp : " << iProcYp << "\n" + << " iProcXm : " << iProcXm << "\n" + << " iProcYm : " << iProcYm << "\n" + << " iRoot : " << iRoot << "\n" + << " iRootXp : " << iRootXp << "\n" + << " iRootYp : " << iRootYp << "\n" + << " iRootXm : " << iRootXm << "\n" + << " iRootYm : " << iRootYm << "\n"; + + int64_t iProcSelf = quadtree.find_point(middle_norm); + + report.exit(function); + return; +} + +// ---------------------------------------------------------------------- +// This function takes the normalized coordinates and makes latitude +// and longitude arrays from them. It can do this for the corners or +// edges, depending on the offset. +// ---------------------------------------------------------------------- + +void fill_cubesphere_lat_lon_from_norms(Quadtree quadtree, + arma_vec dr, + arma_vec du, + arma_vec ll, + int64_t nGCs, + precision_t left_off, + precision_t down_off, + arma_mat &lat2d, + arma_mat &lon2d, + arma_mat &refx, + arma_mat &refy) { + + int64_t nX = lat2d.n_rows; + int64_t nY = lat2d.n_cols; + + double xn, yn, zn, rn; + double xp, yp, zp, rp, latp, lonp; + + double a = sqrt(3); + + arma_vec xyz, xyzn, xyz_wrapped; + + // Loop through each point and derive the coordinate + for (int iDU = 0; iDU < nY; iDU++) { + for (int iLR = 0; iLR < nX; iLR++) { + + // the offsets are so we can find cell centers, edges, and corners + double iD = iDU - nGCs + down_off; + double iL = iLR - nGCs + left_off; + + // This is the normalized coordinate: + xyz = ll + dr * iL + du * iD; + // Ghost cells could be off the edge, so wrap to other face: + //xyz_wrapped = quadtree.wrap_point_cubesphere(xyz) * a; + xyz_wrapped = xyz * a; + // Normalize the coordinate to a unit vector: + xyzn = normalise(xyz_wrapped); + xp = xyzn(0); + yp = xyzn(1); + zp = xyzn(2); + + // Derive lat and lon from unit vector: + latp = asin(zp); + // offset for lon is to put the left edge of face 0 at 0 longitude: + lonp = atan2(yp, xp) + 3 * cPI / 4; + + if (lonp > cTWOPI) + lonp = lonp - cTWOPI; + + if (lonp < 0.0) + lonp = lonp + cTWOPI; + + lat2d(iLR, iDU) = latp; + lon2d(iLR, iDU) = lonp; + + // refx and refy are the X, Y coordinates on the side of the CUBE + // Identify sides, then apply correct transformation law + // Face 1 to 4, equator faces with face 1 starting at the meridian + // Face 5, North Pole (different from book def) + // Face 6, South Pole (different from book def) + // Note face number are subtracted by one to comply with + // computer indexing + // Lon are displaced by cPI/4 as coordinates are generated + // with a right displacement of cPI/4 + if (quadtree.iSide == 1 - 1) { + refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4.); + refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4.); + } else if (quadtree.iSide == 2 - 1) { + refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4. - cPI / 2.); + refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - cPI / 2.); + } else if (quadtree.iSide == 3 - 1) { + refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4. - cPI); + refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - cPI); + } else if (quadtree.iSide == 4 - 1) { + refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4 - 3 * cPI / 2.); + refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - 3 * cPI / 2.); + } else if (quadtree.iSide == 5 - 1) { + refx(iLR, iDU) = -sqrt(3) / 3 * sin(lonp - 3 * cPI / 4.) / tan(latp); + refy(iLR, iDU) = -sqrt(3) / 3 * cos(lonp - 3 * cPI / 4.) / tan(latp); + } else if (quadtree.iSide == 6 - 1) { + refx(iLR, iDU) = sqrt(3) / 3 * sin(lonp - 3 * cPI / 4.) / tan(latp); + refy(iLR, iDU) = -sqrt(3) / 3 * cos(lonp - 3 * cPI / 4.) / tan(latp); + } + } + } + + return; +} + +// ---------------------------------------------------------------------- +// This function takes in lat-lon and reference xy coordinates to +// generate transformation and metric tensors +// ---------------------------------------------------------------------- +void transformation_metrics(Quadtree quadtree, + arma_mat &lat2d, + arma_mat &lon2d, + arma_mat &refx, + arma_mat &refy, + arma_mat &A11, + arma_mat &A12, + arma_mat &A21, + arma_mat &A22, + arma_mat &A11_inv, + arma_mat &A12_inv, + arma_mat &A21_inv, + arma_mat &A22_inv, + arma_mat &g11_upper, + arma_mat &g12_upper, + arma_mat &g21_upper, + arma_mat &g22_upper, + arma_mat &sqrt_g, + arma_mat &refx_angle, + arma_mat &refy_angle) { + + int64_t nX = lat2d.n_rows; + int64_t nY = lat2d.n_cols; + // Assume R = 1 (since lat-lon/ xy generation assumes unit vect) + double R = 1; + double a = R / sqrt(3); + double xref, yref, rref, xy; + double latp, lonp; + double g; + + // Loop through each point and derive the coordinate + for (int j = 0; j < nY; j++) { + for (int i = 0; i < nX; i++) { + xref = refx(i, j); + yref = refy(i, j); + xy = std::sqrt(xref * xref + yref * yref); + rref = std::sqrt(xref * xref + yref * yref + a * a); + + // Want to calculate angles based on x, y, z + refx_angle(i, j) = asin(xref / rref); + refy_angle(i, j) = asin(yref / rref); + + latp = lat2d(i, j); + lonp = lon2d(i, j); + + sqrt_g(i, j) = R * R * a / (rref * rref * rref); + g = sqrt_g(i, j) * sqrt_g(i, j); + + // metric tensor with lower indices + double front_factor = R * R / (rref * rref * rref * rref); + double g11 = front_factor * (a * a + yref * yref); + double g12 = -front_factor * xref * yref; + double g21 = -front_factor * xref * yref; + double g22 = front_factor * (a * a + xref * xref); + + // metric tensor with upper indices + g11_upper(i, j) = g22 / g; + g12_upper(i, j) = -g12 / g; + g21_upper(i, j) = -g21 / g; + g22_upper(i, j) = g11 / g; + + // Identify sides, then apply correct transformation law + // Face 1 to 4, equator faces with face 1 starting at the meridian + // Face 5, North Pole (different from book def) + // Face 6, South Pole (different from book def) + // Note face number are subtracted by one to comply with + // computer indexing + if (quadtree.iSide == 1 - 1) { + double p1 = R * cos(latp) * cos(lonp - cPI / 4.) / a; + A11(i, j) = p1 * cos(lonp - cPI / 4.); + A12(i, j) = 0; + A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4.); + A22(i, j) = p1 * cos(latp); + + double p2 = a / cos(latp) / cos(lonp - cPI / 4.) / R; + A11_inv(i, j) = p2 / cos(lonp - cPI / 4.); + A12_inv(i, j) = 0; + A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4.); + A22_inv(i, j) = p2 / cos(latp); + } else if (quadtree.iSide == 2 - 1) { + double p1 = R * cos(latp) * cos(lonp - cPI / 4. - cPI / 2.) / a; + A11(i, j) = p1 * cos(lonp - cPI / 4. - cPI / 2.); + A12(i, j) = 0; + A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - cPI / 2.); + A22(i, j) = p1 * cos(latp); + + double p2 = a / cos(latp) / cos(lonp - cPI / 4. - cPI / 2.) / R; + A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - cPI / 2.); + A12_inv(i, j) = 0; + A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - cPI / 2.); + A22_inv(i, j) = p2 / cos(latp); + } else if (quadtree.iSide == 3 - 1) { + double p1 = R * cos(latp) * cos(lonp - cPI / 4. - cPI) / a; + A11(i, j) = p1 * cos(lonp - cPI / 4. - cPI); + A12(i, j) = 0; + A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - cPI); + A22(i, j) = p1 * cos(latp); + + double p2 = a / cos(latp) / cos(lonp - cPI / 4. - cPI) / R; + A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - cPI); + A12_inv(i, j) = 0; + A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - cPI); + A22_inv(i, j) = p2 / cos(latp); + } else if (quadtree.iSide == 4 - 1) { + double p1 = R * cos(latp) * cos(lonp - cPI / 4. - 3 * cPI / 2.) / a; + A11(i, j) = p1 * cos(lonp - cPI / 4. - 3 * cPI / 2.); + A12(i, j) = 0; + A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - 3 * cPI / 2.); + A22(i, j) = p1 * cos(latp); + + double p2 = a / cos(latp) / cos(lonp - cPI / 4. - 3 * cPI / 2.) / R; + A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - 3 * cPI / 2.); + A12_inv(i, j) = 0; + A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - 3 * cPI / 2.); + A22_inv(i, j) = p2 / cos(latp); + } else if (quadtree.iSide == 6 - + 1) { // Face 5 and 6 are flipped than Nair's formulation + double p1 = R * sin(latp) / a; + A11(i, j) = p1 * cos(lonp - 3 * cPI / 4.); + A12(i, j) = p1 * sin(lonp - 3 * cPI / 4.); + A21(i, j) = -p1 * sin(latp) * sin(lonp - 3 * cPI / 4.); + A22(i, j) = p1 * sin(latp) * cos(lonp - 3 * cPI / 4.); + + double p2 = a / R / sin(latp) / sin(latp); + A11_inv(i, j) = p2 * sin(latp) * cos(lonp - 3 * cPI / 4.); + A12_inv(i, j) = -p2 * sin(lonp - 3 * cPI / 4.); + A21_inv(i, j) = p2 * sin(latp) * sin(lonp - 3 * cPI / 4.); + A22_inv(i, j) = p2 * cos(lonp - 3 * cPI / 4.); + } else if (quadtree.iSide == 5 - + 1) { // Face 5 and 6 are flipped than Nair's formulation + double p1 = R * sin(latp) / a; + A11(i, j) = -p1 * cos(lonp - 3 * cPI / 4.); + A12(i, j) = p1 * sin(lonp - 3 * cPI / 4.); + A21(i, j) = p1 * sin(latp) * sin(lonp - 3 * cPI / 4.); + A22(i, j) = p1 * sin(latp) * cos(lonp - 3 * cPI / 4.); + + double p2 = a / R / sin(latp) / sin(latp); + A11_inv(i, j) = -p2 * sin(latp) * cos(lonp - 3 * cPI / 4.); + A12_inv(i, j) = p2 * sin(lonp - 3 * cPI / 4.); + A21_inv(i, j) = p2 * sin(latp) * sin(lonp - 3 * cPI / 4.); + A22_inv(i, j) = p2 * cos(lonp - 3 * cPI / 4.); + } + } + } +} + +// ---------------------------------------------------------------------- +// Create a geographic grid +// - if restarting, read in the grid +// - if not restarting, initialize the grid +// ---------------------------------------------------------------------- + +void Grid::create_cubesphere_grid(Quadtree quadtree) { + + std::string function = "Grid::create_cubesphere_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + arma_vec dr(3), du(3), ll(3); + double xn, yn, zn, rn; + double xp, yp, zp, rp, latp, lonp; + + double a = sqrt(3); + + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + dr = size_right_norm / (nLons - 2 * nGCs); + du = size_up_norm / (nLats - 2 * nGCs); + ll = lower_left_norm; + + int64_t iAlt, iLon, iLat; + + // --------------------------------------------- + // Cell Centers + // --------------------------------------------- + arma_mat lat2d(nLons, nLats); + arma_mat lon2d(nLons, nLats); + arma_mat refx(nLons, nLats); + arma_mat refy(nLons, nLats); + arma_mat A11(nLons, nLats); + arma_mat A12(nLons, nLats); + arma_mat A21(nLons, nLats); + arma_mat A22(nLons, nLats); + arma_mat A11_inv(nLons, nLats); + arma_mat A12_inv(nLons, nLats); + arma_mat A21_inv(nLons, nLats); + arma_mat A22_inv(nLons, nLats); + arma_mat g11_upper(nLons, nLats); + arma_mat g12_upper(nLons, nLats); + arma_mat g21_upper(nLons, nLats); + arma_mat g22_upper(nLons, nLats); + arma_mat sqrt_g(nLons, nLats); + arma_mat refx_angle_temp(nLons, nLats); + arma_mat refy_angle_temp(nLons, nLats); + fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.5, 0.5, + lat2d, lon2d, refx, refy); + + transformation_metrics(quadtree, lat2d, lon2d, refx, refy, + A11, A12, A21, A22, A11_inv, A12_inv, + A21_inv, A22_inv, g11_upper, g12_upper, + g21_upper, g22_upper, sqrt_g, + refx_angle_temp, refy_angle_temp); + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + refx_angle.slice(iAlt) = refx_angle_temp; + refy_angle.slice(iAlt) = refy_angle_temp; + + geoLon_scgc.slice(iAlt) = lon2d; + geoLat_scgc.slice(iAlt) = lat2d; + refx_scgc.slice(iAlt) = refx; + refy_scgc.slice(iAlt) = refy; + A11_scgc.slice(iAlt) = A11; + A12_scgc.slice(iAlt) = A12; + A21_scgc.slice(iAlt) = A21; + A22_scgc.slice(iAlt) = A22; + A11_inv_scgc.slice(iAlt) = A11_inv; + A12_inv_scgc.slice(iAlt) = A12_inv; + A21_inv_scgc.slice(iAlt) = A21_inv; + A22_inv_scgc.slice(iAlt) = A22_inv; + g11_upper_scgc.slice(iAlt) = g11_upper; + g12_upper_scgc.slice(iAlt) = g12_upper; + g21_upper_scgc.slice(iAlt) = g21_upper; + g22_upper_scgc.slice(iAlt) = g22_upper; + sqrt_g_scgc.slice(iAlt) = sqrt_g; + } + + // --------------------------------------------- + // Left Sides - edges on left side (no offset left) + // --------------------------------------------- + arma_mat lat2d_left(nLons + 1, nLats); + arma_mat lon2d_left(nLons + 1, nLats); + arma_mat refx_left(nLons + 1, nLats); + arma_mat refy_left(nLons + 1, nLats); + arma_mat A11_left(nLons + 1, nLats); + arma_mat A12_left(nLons + 1, nLats); + arma_mat A21_left(nLons + 1, nLats); + arma_mat A22_left(nLons + 1, nLats); + arma_mat A11_inv_left(nLons + 1, nLats); + arma_mat A12_inv_left(nLons + 1, nLats); + arma_mat A21_inv_left(nLons + 1, nLats); + arma_mat A22_inv_left(nLons + 1, nLats); + arma_mat g11_upper_left(nLons + 1, nLats); + arma_mat g12_upper_left(nLons + 1, nLats); + arma_mat g21_upper_left(nLons + 1, nLats); + arma_mat g22_upper_left(nLons + 1, nLats); + arma_mat sqrt_g_left(nLons + 1, nLats); + arma_mat refx_angle_left_temp(nLons + 1, nLats); + arma_mat refy_angle_left_temp(nLons + 1, nLats); + fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.0, 0.5, + lat2d_left, lon2d_left, + refx_left, refy_left); + + transformation_metrics(quadtree, + lat2d_left, lon2d_left, refx_left, refy_left, + A11_left, A12_left, A21_left, A22_left, + A11_inv_left, A12_inv_left, + A21_inv_left, A22_inv_left, + g11_upper_left, g12_upper_left, + g21_upper_left, g22_upper_left, + sqrt_g_left, + refx_angle_left_temp, refy_angle_left_temp); + + refx_angle_Left = refx_angle_left_temp; + refy_angle_Left = refy_angle_left_temp; + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLon_Left.slice(iAlt) = lon2d_left; + geoLat_Left.slice(iAlt) = lat2d_left; + refx_Left.slice(iAlt) = refx_left; + refy_Left.slice(iAlt) = refy_left; + A11_Left.slice(iAlt) = A11_left; + A12_Left.slice(iAlt) = A12_left; + A21_Left.slice(iAlt) = A21_left; + A22_Left.slice(iAlt) = A22_left; + A11_inv_Left.slice(iAlt) = A11_inv_left; + A12_inv_Left.slice(iAlt) = A12_inv_left; + A21_inv_Left.slice(iAlt) = A21_inv_left; + A22_inv_Left.slice(iAlt) = A22_inv_left; + g11_upper_Left.slice(iAlt) = g11_upper_left; + g12_upper_Left.slice(iAlt) = g12_upper_left; + g21_upper_Left.slice(iAlt) = g21_upper_left; + g22_upper_Left.slice(iAlt) = g22_upper_left; + sqrt_g_Left.slice(iAlt) = sqrt_g_left; + } + + // --------------------------------------------- + // Down Sides - edges on down side (no offset down) + // --------------------------------------------- + arma_mat lat2d_down(nLons, nLats + 1); + arma_mat lon2d_down(nLons, nLats + 1); + arma_mat refx_down(nLons, nLats + 1); + arma_mat refy_down(nLons, nLats + 1); + arma_mat A11_down(nLons, nLats + 1); + arma_mat A12_down(nLons, nLats + 1); + arma_mat A21_down(nLons, nLats + 1); + arma_mat A22_down(nLons, nLats + 1); + arma_mat A11_inv_down(nLons, nLats + 1); + arma_mat A12_inv_down(nLons, nLats + 1); + arma_mat A21_inv_down(nLons, nLats + 1); + arma_mat A22_inv_down(nLons, nLats + 1); + arma_mat g11_upper_down(nLons, nLats + 1); + arma_mat g12_upper_down(nLons, nLats + 1); + arma_mat g21_upper_down(nLons, nLats + 1); + arma_mat g22_upper_down(nLons, nLats + 1); + arma_mat sqrt_g_down(nLons, nLats + 1); + arma_mat refx_angle_down_temp(nLons, nLats + 1); + arma_mat refy_angle_down_temp(nLons, nLats + 1); + + fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.5, 0.0, + lat2d_down, lon2d_down, + refx_down, refy_down); + + transformation_metrics(quadtree, + lat2d_down, lon2d_down, refx_down, refy_down, + A11_down, A12_down, A21_down, A22_down, + A11_inv_down, A12_inv_down, + A21_inv_down, A22_inv_down, + g11_upper_down, g12_upper_down, + g21_upper_down, g22_upper_down, + sqrt_g_down, + refx_angle_down_temp, refy_angle_down_temp); + refx_angle_Down = refx_angle_down_temp; + refy_angle_Down = refy_angle_down_temp; + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLon_Down.slice(iAlt) = lon2d_down; + geoLat_Down.slice(iAlt) = lat2d_down; + refx_Down.slice(iAlt) = refx_down; + refy_Down.slice(iAlt) = refy_down; + A11_Down.slice(iAlt) = A11_down; + A12_Down.slice(iAlt) = A12_down; + A21_Down.slice(iAlt) = A21_down; + A22_Down.slice(iAlt) = A22_down; + A11_inv_Down.slice(iAlt) = A11_inv_down; + A12_inv_Down.slice(iAlt) = A12_inv_down; + A21_inv_Down.slice(iAlt) = A21_inv_down; + A22_inv_Down.slice(iAlt) = A22_inv_down; + g11_upper_Down.slice(iAlt) = g11_upper_down; + g12_upper_Down.slice(iAlt) = g12_upper_down; + g21_upper_Down.slice(iAlt) = g21_upper_down; + g22_upper_Down.slice(iAlt) = g22_upper_down; + sqrt_g_Down.slice(iAlt) = sqrt_g_down; + } + + // --------------------------------------------- + // Corners (lower left) - no offsets + // --------------------------------------------- + arma_mat lat2d_corner(nLons + 1, nLats + 1); + arma_mat lon2d_corner(nLons + 1, nLats + 1); + arma_mat refx_corner(nLons + 1, nLats + 1); + arma_mat refy_corner(nLons + 1, nLats + 1); + fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.0, 0.0, + lat2d_corner, lon2d_corner, + refx_corner, refy_corner); + + for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { + geoLon_Corner.slice(iAlt) = lon2d_corner; + geoLat_Corner.slice(iAlt) = lat2d_corner; + refx_Corner.slice(iAlt) = refx_corner; + refy_Corner.slice(iAlt) = refy_corner; + } + + report.exit(function); + return; +} + +// ---------------------------------------------------------------------- +// Corrects xy grid by scaling the R used in xy coordinate generation +// and transformation laws, as in previous generation R = 1. +// This function should only be used when cubesphere is used. +// Assumes radius of planet and altitude are constant +// ---------------------------------------------------------------------- + +void Grid::correct_xy_grid(Planets planet) { + std::string function = "Grid::correct_xy_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t iAlt; + + // initialize grid drefx drefy + drefx = arma_vec(nAlts); + drefy = arma_vec(nAlts); + + // Planet.get_radius() takes in latitude + // but at current stage is unimplemented + // Anyway, we use equator radius as assumption for CubeSphere + // CubeSphere must be a perfect sphere!! + precision_t planet_R = planet.get_radius(0); + + // radius of planet + altitude + // just pick alt at (0,0) loction + arma_vec R_Alts = geoAlt_scgc.tube(0, 0) + planet_R; + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + precision_t R = R_Alts(iAlt); + refx_scgc.slice(iAlt) *= R; + refy_scgc.slice(iAlt) *= R; + + // Addition: Get a copy of dx dy + arma_mat curr_refx = refx_scgc.slice(iAlt); + arma_mat curr_refy = refy_scgc.slice(iAlt); + + drefx(iAlt) = curr_refx(1, 0) - curr_refx(0, 0); + drefy(iAlt) = curr_refy(0, 1) - curr_refy(0, 0); + + refx_Left.slice(iAlt) *= R; + refy_Left.slice(iAlt) *= R; + refx_Down.slice(iAlt) *= R; + refy_Down.slice(iAlt) *= R; + refx_Corner.slice(iAlt) *= R; + refy_Corner.slice(iAlt) *= R; + } + + report.exit(function); + return; +} From 6b5ebcb9c82e421cf2c5317770821145b5874809 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sun, 5 Jan 2025 10:29:10 -0500 Subject: [PATCH 349/691] FEAT: move cubesphere grid functions to their own file --- src/init_geo_grid.cpp | 586 ------------------------------------------ 1 file changed, 586 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 8bc7176e..e142b688 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -6,540 +6,6 @@ #include "aether.h" #include -// ---------------------------------------------------------------------- -// Create connectivity between the nodes for message passing for cubesphere -// ---------------------------------------------------------------------- - -void Grid::create_cubesphere_connection(Quadtree quadtree) { - - std::string function = "Grid::create_cubesphere_connection"; - static int iFunction = -1; - report.enter(function, iFunction); - - IsLatLonGrid = false; - - arma_vec lower_left_norm = quadtree.get_vect("LL"); - arma_vec middle_norm = quadtree.get_vect("MID"); - arma_vec size_right_norm = quadtree.get_vect("SR"); - arma_vec size_up_norm = quadtree.get_vect("SU"); - - // These points go off the edge to the next block in each direction: - arma_vec down_norm = middle_norm - 0.51 * size_up_norm; - arma_vec up_norm = middle_norm + 0.51 * size_up_norm; - arma_vec left_norm = middle_norm - 0.51 * size_right_norm; - arma_vec right_norm = middle_norm + 0.51 * size_right_norm; - - // Find those points in the quadtree to figure out which processor - // they are on - iProcYm = quadtree.find_point(down_norm) + iMember * nGrids; - iProcYp = quadtree.find_point(up_norm) + iMember * nGrids; - iProcXm = quadtree.find_point(left_norm) + iMember * nGrids; - iProcXp = quadtree.find_point(right_norm) + iMember * nGrids; - - // Need to know which side the current block is on and which side each - // of the blocks in the different directions is on. Need this so we can - // know how to unpack the variables after the message pass. - iRoot = quadtree.find_root(middle_norm); - iRootYm = quadtree.find_root(down_norm); - iRootYp = quadtree.find_root(up_norm); - iRootXm = quadtree.find_root(left_norm); - iRootXp = quadtree.find_root(right_norm); - - // These should be the exact edge of the face. - // The from and to processors should get these in the same place, - // so they can be used to match which processor to send / receive info - edge_Xp = middle_norm + size_right_norm / 2.0; - edge_Xm = middle_norm - size_right_norm / 2.0; - edge_Yp = middle_norm + size_up_norm / 2.0; - edge_Ym = middle_norm - size_up_norm / 2.0; - - if (report.test_verbose(2)) - std::cout << "connectivity : " - << " iProc : " << iProc << "\n" - << " isnorth : " << DoesTouchNorthPole << "\n" - << " issouth : " << DoesTouchSouthPole << "\n" - << " iProcXp : " << iProcXp << "\n" - << " iProcYp : " << iProcYp << "\n" - << " iProcXm : " << iProcXm << "\n" - << " iProcYm : " << iProcYm << "\n" - << " iRoot : " << iRoot << "\n" - << " iRootXp : " << iRootXp << "\n" - << " iRootYp : " << iRootYp << "\n" - << " iRootXm : " << iRootXm << "\n" - << " iRootYm : " << iRootYm << "\n"; - - int64_t iProcSelf = quadtree.find_point(middle_norm); - - report.exit(function); - return; -} - -// ---------------------------------------------------------------------- -// This function takes the normalized coordinates and makes latitude -// and longitude arrays from them. It can do this for the corners or -// edges, depending on the offset. -// ---------------------------------------------------------------------- - -void fill_cubesphere_lat_lon_from_norms(Quadtree quadtree, - arma_vec dr, - arma_vec du, - arma_vec ll, - int64_t nGCs, - precision_t left_off, - precision_t down_off, - arma_mat &lat2d, - arma_mat &lon2d, - arma_mat &refx, - arma_mat &refy) { - - int64_t nX = lat2d.n_rows; - int64_t nY = lat2d.n_cols; - - double xn, yn, zn, rn; - double xp, yp, zp, rp, latp, lonp; - - double a = sqrt(3); - - arma_vec xyz, xyzn, xyz_wrapped; - - // Loop through each point and derive the coordinate - for (int iDU = 0; iDU < nY; iDU++) { - for (int iLR = 0; iLR < nX; iLR++) { - - // the offsets are so we can find cell centers, edges, and corners - double iD = iDU - nGCs + down_off; - double iL = iLR - nGCs + left_off; - - // This is the normalized coordinate: - xyz = ll + dr * iL + du * iD; - // Ghost cells could be off the edge, so wrap to other face: - //xyz_wrapped = quadtree.wrap_point_cubesphere(xyz) * a; - xyz_wrapped = xyz * a; - // Normalize the coordinate to a unit vector: - xyzn = normalise(xyz_wrapped); - xp = xyzn(0); - yp = xyzn(1); - zp = xyzn(2); - - // Derive lat and lon from unit vector: - latp = asin(zp); - // offset for lon is to put the left edge of face 0 at 0 longitude: - lonp = atan2(yp, xp) + 3 * cPI / 4; - - if (lonp > cTWOPI) - lonp = lonp - cTWOPI; - - if (lonp < 0.0) - lonp = lonp + cTWOPI; - - lat2d(iLR, iDU) = latp; - lon2d(iLR, iDU) = lonp; - - // refx and refy are the X, Y coordinates on the side of the CUBE - // Identify sides, then apply correct transformation law - // Face 1 to 4, equator faces with face 1 starting at the meridian - // Face 5, North Pole (different from book def) - // Face 6, South Pole (different from book def) - // Note face number are subtracted by one to comply with - // computer indexing - // Lon are displaced by cPI/4 as coordinates are generated - // with a right displacement of cPI/4 - if (quadtree.iSide == 1 - 1) { - refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4.); - refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4.); - } else if (quadtree.iSide == 2 - 1) { - refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4. - cPI / 2.); - refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - cPI / 2.); - } else if (quadtree.iSide == 3 - 1) { - refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4. - cPI); - refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - cPI); - } else if (quadtree.iSide == 4 - 1) { - refx(iLR, iDU) = sqrt(3) / 3 * tan(lonp - cPI / 4 - 3 * cPI / 2.); - refy(iLR, iDU) = sqrt(3) / 3 * tan(latp) / cos(lonp - cPI / 4. - 3 * cPI / 2.); - } else if (quadtree.iSide == 5 - 1) { - refx(iLR, iDU) = -sqrt(3) / 3 * sin(lonp - 3 * cPI / 4.) / tan(latp); - refy(iLR, iDU) = -sqrt(3) / 3 * cos(lonp - 3 * cPI / 4.) / tan(latp); - } else if (quadtree.iSide == 6 - 1) { - refx(iLR, iDU) = sqrt(3) / 3 * sin(lonp - 3 * cPI / 4.) / tan(latp); - refy(iLR, iDU) = -sqrt(3) / 3 * cos(lonp - 3 * cPI / 4.) / tan(latp); - } - } - } - - return; -} - -// ---------------------------------------------------------------------- -// This function takes in lat-lon and reference xy coordinates to -// generate transformation and metric tensors -// ---------------------------------------------------------------------- -void transformation_metrics(Quadtree quadtree, - arma_mat &lat2d, - arma_mat &lon2d, - arma_mat &refx, - arma_mat &refy, - arma_mat &A11, - arma_mat &A12, - arma_mat &A21, - arma_mat &A22, - arma_mat &A11_inv, - arma_mat &A12_inv, - arma_mat &A21_inv, - arma_mat &A22_inv, - arma_mat &g11_upper, - arma_mat &g12_upper, - arma_mat &g21_upper, - arma_mat &g22_upper, - arma_mat &sqrt_g, - arma_mat &refx_angle, - arma_mat &refy_angle) { - - int64_t nX = lat2d.n_rows; - int64_t nY = lat2d.n_cols; - // Assume R = 1 (since lat-lon/ xy generation assumes unit vect) - double R = 1; - double a = R / sqrt(3); - double xref, yref, rref, xy; - double latp, lonp; - double g; - - // Loop through each point and derive the coordinate - for (int j = 0; j < nY; j++) { - for (int i = 0; i < nX; i++) { - xref = refx(i, j); - yref = refy(i, j); - xy = std::sqrt(xref * xref + yref * yref); - rref = std::sqrt(xref * xref + yref * yref + a * a); - - // Want to calculate angles based on x, y, z - refx_angle(i, j) = asin(xref / rref); - refy_angle(i, j) = asin(yref / rref); - - latp = lat2d(i, j); - lonp = lon2d(i, j); - - sqrt_g(i, j) = R * R * a / (rref * rref * rref); - g = sqrt_g(i, j) * sqrt_g(i, j); - - // metric tensor with lower indices - double front_factor = R * R / (rref * rref * rref * rref); - double g11 = front_factor * (a * a + yref * yref); - double g12 = -front_factor * xref * yref; - double g21 = -front_factor * xref * yref; - double g22 = front_factor * (a * a + xref * xref); - - // metric tensor with upper indices - g11_upper(i, j) = g22 / g; - g12_upper(i, j) = -g12 / g; - g21_upper(i, j) = -g21 / g; - g22_upper(i, j) = g11 / g; - - // Identify sides, then apply correct transformation law - // Face 1 to 4, equator faces with face 1 starting at the meridian - // Face 5, North Pole (different from book def) - // Face 6, South Pole (different from book def) - // Note face number are subtracted by one to comply with - // computer indexing - if (quadtree.iSide == 1 - 1) { - double p1 = R * cos(latp) * cos(lonp - cPI / 4.) / a; - A11(i, j) = p1 * cos(lonp - cPI / 4.); - A12(i, j) = 0; - A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4.); - A22(i, j) = p1 * cos(latp); - - double p2 = a / cos(latp) / cos(lonp - cPI / 4.) / R; - A11_inv(i, j) = p2 / cos(lonp - cPI / 4.); - A12_inv(i, j) = 0; - A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4.); - A22_inv(i, j) = p2 / cos(latp); - } else if (quadtree.iSide == 2 - 1) { - double p1 = R * cos(latp) * cos(lonp - cPI / 4. - cPI / 2.) / a; - A11(i, j) = p1 * cos(lonp - cPI / 4. - cPI / 2.); - A12(i, j) = 0; - A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - cPI / 2.); - A22(i, j) = p1 * cos(latp); - - double p2 = a / cos(latp) / cos(lonp - cPI / 4. - cPI / 2.) / R; - A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - cPI / 2.); - A12_inv(i, j) = 0; - A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - cPI / 2.); - A22_inv(i, j) = p2 / cos(latp); - } else if (quadtree.iSide == 3 - 1) { - double p1 = R * cos(latp) * cos(lonp - cPI / 4. - cPI) / a; - A11(i, j) = p1 * cos(lonp - cPI / 4. - cPI); - A12(i, j) = 0; - A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - cPI); - A22(i, j) = p1 * cos(latp); - - double p2 = a / cos(latp) / cos(lonp - cPI / 4. - cPI) / R; - A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - cPI); - A12_inv(i, j) = 0; - A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - cPI); - A22_inv(i, j) = p2 / cos(latp); - } else if (quadtree.iSide == 4 - 1) { - double p1 = R * cos(latp) * cos(lonp - cPI / 4. - 3 * cPI / 2.) / a; - A11(i, j) = p1 * cos(lonp - cPI / 4. - 3 * cPI / 2.); - A12(i, j) = 0; - A21(i, j) = -p1 * sin(latp) * sin(lonp - cPI / 4. - 3 * cPI / 2.); - A22(i, j) = p1 * cos(latp); - - double p2 = a / cos(latp) / cos(lonp - cPI / 4. - 3 * cPI / 2.) / R; - A11_inv(i, j) = p2 / cos(lonp - cPI / 4. - 3 * cPI / 2.); - A12_inv(i, j) = 0; - A21_inv(i, j) = p2 * tan(latp) * tan(lonp - cPI / 4. - 3 * cPI / 2.); - A22_inv(i, j) = p2 / cos(latp); - } else if (quadtree.iSide == 6 - - 1) { // Face 5 and 6 are flipped than Nair's formulation - double p1 = R * sin(latp) / a; - A11(i, j) = p1 * cos(lonp - 3 * cPI / 4.); - A12(i, j) = p1 * sin(lonp - 3 * cPI / 4.); - A21(i, j) = -p1 * sin(latp) * sin(lonp - 3 * cPI / 4.); - A22(i, j) = p1 * sin(latp) * cos(lonp - 3 * cPI / 4.); - - double p2 = a / R / sin(latp) / sin(latp); - A11_inv(i, j) = p2 * sin(latp) * cos(lonp - 3 * cPI / 4.); - A12_inv(i, j) = -p2 * sin(lonp - 3 * cPI / 4.); - A21_inv(i, j) = p2 * sin(latp) * sin(lonp - 3 * cPI / 4.); - A22_inv(i, j) = p2 * cos(lonp - 3 * cPI / 4.); - } else if (quadtree.iSide == 5 - - 1) { // Face 5 and 6 are flipped than Nair's formulation - double p1 = R * sin(latp) / a; - A11(i, j) = -p1 * cos(lonp - 3 * cPI / 4.); - A12(i, j) = p1 * sin(lonp - 3 * cPI / 4.); - A21(i, j) = p1 * sin(latp) * sin(lonp - 3 * cPI / 4.); - A22(i, j) = p1 * sin(latp) * cos(lonp - 3 * cPI / 4.); - - double p2 = a / R / sin(latp) / sin(latp); - A11_inv(i, j) = -p2 * sin(latp) * cos(lonp - 3 * cPI / 4.); - A12_inv(i, j) = p2 * sin(lonp - 3 * cPI / 4.); - A21_inv(i, j) = p2 * sin(latp) * sin(lonp - 3 * cPI / 4.); - A22_inv(i, j) = p2 * cos(lonp - 3 * cPI / 4.); - } - } - } -} - -// ---------------------------------------------------------------------- -// Create a geographic grid -// - if restarting, read in the grid -// - if not restarting, initialize the grid -// ---------------------------------------------------------------------- - -void Grid::create_cubesphere_grid(Quadtree quadtree) { - - std::string function = "Grid::create_cubesphere_grid"; - static int iFunction = -1; - report.enter(function, iFunction); - - arma_vec dr(3), du(3), ll(3); - double xn, yn, zn, rn; - double xp, yp, zp, rp, latp, lonp; - - double a = sqrt(3); - - arma_vec lower_left_norm = quadtree.get_vect("LL"); - arma_vec size_right_norm = quadtree.get_vect("SR"); - arma_vec size_up_norm = quadtree.get_vect("SU"); - - dr = size_right_norm / (nLons - 2 * nGCs); - du = size_up_norm / (nLats - 2 * nGCs); - ll = lower_left_norm; - - int64_t iAlt, iLon, iLat; - - // --------------------------------------------- - // Cell Centers - // --------------------------------------------- - arma_mat lat2d(nLons, nLats); - arma_mat lon2d(nLons, nLats); - arma_mat refx(nLons, nLats); - arma_mat refy(nLons, nLats); - arma_mat A11(nLons, nLats); - arma_mat A12(nLons, nLats); - arma_mat A21(nLons, nLats); - arma_mat A22(nLons, nLats); - arma_mat A11_inv(nLons, nLats); - arma_mat A12_inv(nLons, nLats); - arma_mat A21_inv(nLons, nLats); - arma_mat A22_inv(nLons, nLats); - arma_mat g11_upper(nLons, nLats); - arma_mat g12_upper(nLons, nLats); - arma_mat g21_upper(nLons, nLats); - arma_mat g22_upper(nLons, nLats); - arma_mat sqrt_g(nLons, nLats); - arma_mat refx_angle_temp(nLons, nLats); - arma_mat refy_angle_temp(nLons, nLats); - fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.5, 0.5, - lat2d, lon2d, refx, refy); - - transformation_metrics(quadtree, lat2d, lon2d, refx, refy, - A11, A12, A21, A22, A11_inv, A12_inv, - A21_inv, A22_inv, g11_upper, g12_upper, - g21_upper, g22_upper, sqrt_g, - refx_angle_temp, refy_angle_temp); - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - refx_angle.slice(iAlt) = refx_angle_temp; - refy_angle.slice(iAlt) = refy_angle_temp; - - geoLon_scgc.slice(iAlt) = lon2d; - geoLat_scgc.slice(iAlt) = lat2d; - refx_scgc.slice(iAlt) = refx; - refy_scgc.slice(iAlt) = refy; - A11_scgc.slice(iAlt) = A11; - A12_scgc.slice(iAlt) = A12; - A21_scgc.slice(iAlt) = A21; - A22_scgc.slice(iAlt) = A22; - A11_inv_scgc.slice(iAlt) = A11_inv; - A12_inv_scgc.slice(iAlt) = A12_inv; - A21_inv_scgc.slice(iAlt) = A21_inv; - A22_inv_scgc.slice(iAlt) = A22_inv; - g11_upper_scgc.slice(iAlt) = g11_upper; - g12_upper_scgc.slice(iAlt) = g12_upper; - g21_upper_scgc.slice(iAlt) = g21_upper; - g22_upper_scgc.slice(iAlt) = g22_upper; - sqrt_g_scgc.slice(iAlt) = sqrt_g; - } - - // --------------------------------------------- - // Left Sides - edges on left side (no offset left) - // --------------------------------------------- - arma_mat lat2d_left(nLons + 1, nLats); - arma_mat lon2d_left(nLons + 1, nLats); - arma_mat refx_left(nLons + 1, nLats); - arma_mat refy_left(nLons + 1, nLats); - arma_mat A11_left(nLons + 1, nLats); - arma_mat A12_left(nLons + 1, nLats); - arma_mat A21_left(nLons + 1, nLats); - arma_mat A22_left(nLons + 1, nLats); - arma_mat A11_inv_left(nLons + 1, nLats); - arma_mat A12_inv_left(nLons + 1, nLats); - arma_mat A21_inv_left(nLons + 1, nLats); - arma_mat A22_inv_left(nLons + 1, nLats); - arma_mat g11_upper_left(nLons + 1, nLats); - arma_mat g12_upper_left(nLons + 1, nLats); - arma_mat g21_upper_left(nLons + 1, nLats); - arma_mat g22_upper_left(nLons + 1, nLats); - arma_mat sqrt_g_left(nLons + 1, nLats); - arma_mat refx_angle_left_temp(nLons + 1, nLats); - arma_mat refy_angle_left_temp(nLons + 1, nLats); - fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.0, 0.5, - lat2d_left, lon2d_left, - refx_left, refy_left); - - transformation_metrics(quadtree, - lat2d_left, lon2d_left, refx_left, refy_left, - A11_left, A12_left, A21_left, A22_left, - A11_inv_left, A12_inv_left, - A21_inv_left, A22_inv_left, - g11_upper_left, g12_upper_left, - g21_upper_left, g22_upper_left, - sqrt_g_left, - refx_angle_left_temp, refy_angle_left_temp); - - refx_angle_Left = refx_angle_left_temp; - refy_angle_Left = refy_angle_left_temp; - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - geoLon_Left.slice(iAlt) = lon2d_left; - geoLat_Left.slice(iAlt) = lat2d_left; - refx_Left.slice(iAlt) = refx_left; - refy_Left.slice(iAlt) = refy_left; - A11_Left.slice(iAlt) = A11_left; - A12_Left.slice(iAlt) = A12_left; - A21_Left.slice(iAlt) = A21_left; - A22_Left.slice(iAlt) = A22_left; - A11_inv_Left.slice(iAlt) = A11_inv_left; - A12_inv_Left.slice(iAlt) = A12_inv_left; - A21_inv_Left.slice(iAlt) = A21_inv_left; - A22_inv_Left.slice(iAlt) = A22_inv_left; - g11_upper_Left.slice(iAlt) = g11_upper_left; - g12_upper_Left.slice(iAlt) = g12_upper_left; - g21_upper_Left.slice(iAlt) = g21_upper_left; - g22_upper_Left.slice(iAlt) = g22_upper_left; - sqrt_g_Left.slice(iAlt) = sqrt_g_left; - } - - // --------------------------------------------- - // Down Sides - edges on down side (no offset down) - // --------------------------------------------- - arma_mat lat2d_down(nLons, nLats + 1); - arma_mat lon2d_down(nLons, nLats + 1); - arma_mat refx_down(nLons, nLats + 1); - arma_mat refy_down(nLons, nLats + 1); - arma_mat A11_down(nLons, nLats + 1); - arma_mat A12_down(nLons, nLats + 1); - arma_mat A21_down(nLons, nLats + 1); - arma_mat A22_down(nLons, nLats + 1); - arma_mat A11_inv_down(nLons, nLats + 1); - arma_mat A12_inv_down(nLons, nLats + 1); - arma_mat A21_inv_down(nLons, nLats + 1); - arma_mat A22_inv_down(nLons, nLats + 1); - arma_mat g11_upper_down(nLons, nLats + 1); - arma_mat g12_upper_down(nLons, nLats + 1); - arma_mat g21_upper_down(nLons, nLats + 1); - arma_mat g22_upper_down(nLons, nLats + 1); - arma_mat sqrt_g_down(nLons, nLats + 1); - arma_mat refx_angle_down_temp(nLons, nLats + 1); - arma_mat refy_angle_down_temp(nLons, nLats + 1); - - fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.5, 0.0, - lat2d_down, lon2d_down, - refx_down, refy_down); - - transformation_metrics(quadtree, - lat2d_down, lon2d_down, refx_down, refy_down, - A11_down, A12_down, A21_down, A22_down, - A11_inv_down, A12_inv_down, - A21_inv_down, A22_inv_down, - g11_upper_down, g12_upper_down, - g21_upper_down, g22_upper_down, - sqrt_g_down, - refx_angle_down_temp, refy_angle_down_temp); - refx_angle_Down = refx_angle_down_temp; - refy_angle_Down = refy_angle_down_temp; - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - geoLon_Down.slice(iAlt) = lon2d_down; - geoLat_Down.slice(iAlt) = lat2d_down; - refx_Down.slice(iAlt) = refx_down; - refy_Down.slice(iAlt) = refy_down; - A11_Down.slice(iAlt) = A11_down; - A12_Down.slice(iAlt) = A12_down; - A21_Down.slice(iAlt) = A21_down; - A22_Down.slice(iAlt) = A22_down; - A11_inv_Down.slice(iAlt) = A11_inv_down; - A12_inv_Down.slice(iAlt) = A12_inv_down; - A21_inv_Down.slice(iAlt) = A21_inv_down; - A22_inv_Down.slice(iAlt) = A22_inv_down; - g11_upper_Down.slice(iAlt) = g11_upper_down; - g12_upper_Down.slice(iAlt) = g12_upper_down; - g21_upper_Down.slice(iAlt) = g21_upper_down; - g22_upper_Down.slice(iAlt) = g22_upper_down; - sqrt_g_Down.slice(iAlt) = sqrt_g_down; - } - - // --------------------------------------------- - // Corners (lower left) - no offsets - // --------------------------------------------- - arma_mat lat2d_corner(nLons + 1, nLats + 1); - arma_mat lon2d_corner(nLons + 1, nLats + 1); - arma_mat refx_corner(nLons + 1, nLats + 1); - arma_mat refy_corner(nLons + 1, nLats + 1); - fill_cubesphere_lat_lon_from_norms(quadtree, dr, du, ll, nGCs, 0.0, 0.0, - lat2d_corner, lon2d_corner, - refx_corner, refy_corner); - - for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { - geoLon_Corner.slice(iAlt) = lon2d_corner; - geoLat_Corner.slice(iAlt) = lat2d_corner; - refx_Corner.slice(iAlt) = refx_corner; - refy_Corner.slice(iAlt) = refy_corner; - } - - report.exit(function); - return; -} // ---------------------------------------------------------------------- // Create connectivity between the nodes for message passing for sphere @@ -908,58 +374,6 @@ void Grid::create_altitudes(Planets planet) { return; } -// ---------------------------------------------------------------------- -// Corrects xy grid by scaling the R used in xy coordinate generation -// and transformation laws, as in previous generation R = 1. -// This function should only be used when cubesphere is used. -// Assumes radius of planet and altitude are constant -// ---------------------------------------------------------------------- - -void Grid::correct_xy_grid(Planets planet) { - std::string function = "Grid::correct_xy_grid"; - static int iFunction = -1; - report.enter(function, iFunction); - - int64_t iAlt; - - // initialize grid drefx drefy - drefx = arma_vec(nAlts); - drefy = arma_vec(nAlts); - - // Planet.get_radius() takes in latitude - // but at current stage is unimplemented - // Anyway, we use equator radius as assumption for CubeSphere - // CubeSphere must be a perfect sphere!! - precision_t planet_R = planet.get_radius(0); - - // radius of planet + altitude - // just pick alt at (0,0) loction - arma_vec R_Alts = geoAlt_scgc.tube(0, 0) + planet_R; - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - precision_t R = R_Alts(iAlt); - refx_scgc.slice(iAlt) *= R; - refy_scgc.slice(iAlt) *= R; - - // Addition: Get a copy of dx dy - arma_mat curr_refx = refx_scgc.slice(iAlt); - arma_mat curr_refy = refy_scgc.slice(iAlt); - - drefx(iAlt) = curr_refx(1, 0) - curr_refx(0, 0); - drefy(iAlt) = curr_refy(0, 1) - curr_refy(0, 0); - - refx_Left.slice(iAlt) *= R; - refy_Left.slice(iAlt) *= R; - refx_Down.slice(iAlt) *= R; - refy_Down.slice(iAlt) *= R; - refx_Corner.slice(iAlt) *= R; - refy_Corner.slice(iAlt) *= R; - } - - report.exit(function); - return; -} - // ---------------------------------------------------------------------- // Initialize the geographic grid. At the moment, this is a simple // Lon/Lat/Alt grid. The grid structure is general enough that each From 22ef72b59d3703298da808e070d862c81efa5209 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 7 Jan 2025 15:41:53 -0500 Subject: [PATCH 350/691] BUG: Centripetal acceleration is checked, but not included in input files. This seems redundant, since "Centripetal" is also checked, but this prevents the error... Mayber instead we should check just one or the other. --- share/run/UA/inputs/defaults.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index e4735e1b..1f9c296a 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -101,7 +101,8 @@ "Sources" : { "Grid" : { "Centripetal" : true, - "Coriolis" : true }, + "Coriolis" : true, + "Cent_acc": true }, "Neutrals" : { "NO_cool" : false, "O_cool": false } }, From 194853b1536b70b99ff548dc5495078af0f87c45 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 7 Jan 2025 15:54:52 -0500 Subject: [PATCH 351/691] BUG: If outputting from main fails, note that it's the "initial" output --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index aa5f465a..f8395890 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -177,7 +177,7 @@ int main() { didWork = output(neutralsMag, ionsMag, mGrid, time, planet); } if (!didWork) - throw std::string("output failed!"); + throw std::string("Initial output failed!"); // This is advancing now... We are not coupling, so set dt_couple to the // end of the simulation From d1137eee63de4f71e1d56e4f1aa6c4b39435c834 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 7 Jan 2025 15:56:23 -0500 Subject: [PATCH 352/691] BUG: Check output "dt" separately from "type", allows us to make sure each type has a dt > Otherwise, there are out-of-range json errors with mo more info. --- src/inputs.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index f5fa1065..50981d04 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -547,10 +547,13 @@ std::vector Inputs::get_omniweb_files() { precision_t Inputs::get_dt_output(int iOutput) { precision_t value = 0.0; - int nOutputs = settings.at("Outputs").at("type").size(); + int nOutputs = settings.at("Outputs").at("dt").size(); if (iOutput < nOutputs) value = settings.at("Outputs").at("dt").at(iOutput); + else{ + report.error("Output Error; more output types than dt's provided."); + } return value; } From cfdabb07f3e45795ea09408777339074bc759caf Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 7 Jan 2025 15:57:08 -0500 Subject: [PATCH 353/691] FEAT: Check if dt was specified for each output type (better error handling) --- src/output.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/output.cpp b/src/output.cpp index 2c0e58f6..db9a77b6 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -87,7 +87,14 @@ bool output(const Neutrals &neutrals, for (int iOutput = 0; iOutput < nOutputs; iOutput++) { - if (time.check_time_gate(input.get_dt_output(iOutput))) { + // make sure the output dt is set correctly. Otherwise these errors aren't caught correctly. + precision_t dt_output = input.get_dt_output(iOutput); + if (dt_output == 0.0){ + report.exit(function); + return false; + } + + if (time.check_time_gate(dt_output)) { // ------------------------------------------------------------ // Store time in all of the files: From 58c1f4e20b20b1a287b43a3bacfadaaadf615dd6 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 7 Jan 2025 15:57:59 -0500 Subject: [PATCH 354/691] FEAT: if "ion" output type is specified, output magnetic coordinates > I really wanted to get these out. That's why I did all those previous commits. --- src/output.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/output.cpp b/src/output.cpp index db9a77b6..2a16a8c0 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -251,7 +251,7 @@ bool output(const Neutrals &neutrals, grid.radius_scgc); } - if (type_output == "bfield") { + if (type_output == "bfield" || type_output == "ions") { AllOutputContainers[iOutput].store_variable("mlat", "Magnetic Latitude", "degrees", From a96d38f2ac47c0cab9e6ad87b0324bf00f479415 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 9 Jan 2025 16:44:29 -0500 Subject: [PATCH 355/691] FEAT: Get set up for doing e- temp --- src/calc_electron_temperature.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 2489cde9..51fbe5f7 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -9,8 +9,20 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { + std::string function = "Ions::calc_electron_temperature"; + static int iFunction = -1; + report.enter(function, iFunction); + electron_temperature_scgc = neutrals.temperature_scgc; + report.exit(function); } - +// -------------------------------------------------------------------------- +// Heating terms: +// - [ ] photoelectrons +// - [ ] auroral ionization +// - [ ] e- ion collisions +// - [ ] e- neutral collisions (elastic & inelastic) +// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) +// -------------------------------------------------------------------------- From 7c132c22dbd35d3d2975fe825d241a29502e7e2e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 9 Jan 2025 16:54:48 -0500 Subject: [PATCH 356/691] FEAT: add photoelectron heating to calc_e- temp and move some docs around... --- src/calc_electron_temperature.cpp | 72 +++++++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 8 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 51fbe5f7..86ff1e04 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -3,6 +3,19 @@ #include "../include/aether.h" +// -------------------------------------------------------------------------- +// Heating terms: +// - [x] photoelectrons +// - [ ] auroral ionization +// - [ ] e- ion collisions +// - [ ] e- neutral collisions (elastic & inelastic) +// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) +// -------------------------------------------------------------------------- + +arma_cube calc_photoelectron_heating(Neutrals &neutrals, Ions &ions); + + + // -------------------------------------------------------------------------- // TODO (#24): this currently just sets the electron temperature to the neutral temperature // -------------------------------------------------------------------------- @@ -13,16 +26,59 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { static int iFunction = -1; report.enter(function, iFunction); + arma_cube Qphe = calc_photoelectron_heating(neutrals, *this); + electron_temperature_scgc = neutrals.temperature_scgc; report.exit(function); } -// -------------------------------------------------------------------------- -// Heating terms: -// - [ ] photoelectrons -// - [ ] auroral ionization -// - [ ] e- ion collisions -// - [ ] e- neutral collisions (elastic & inelastic) -// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) -// -------------------------------------------------------------------------- +/// @brief Calculates photoelectron heating efficiency and heating rate +/// @details Based on two key references: +/// 1. Swartz & Nisbet (1972) +/// 2. Smithro & Solomon (2008) +/// +/// Uses equations 9-12 from (Zhu & Ridley, 2016) +/// https://doi.org/10.1016/j.jastp.2016.01.005 +/// +/// @param neutrals +/// @param ions +/// @return Qphe +arma_cube calc_photoelectron_heating(Neutrals &neutrals, + Ions &ions) { + + int64_t nIons = ions.nSpecies; + int64_t nNeutrals = neutrals.nSpecies; + + // from Swartz & Nisbet (1972): we need neutral species id's for o2, n2 & o + int64_t inO2 = neutrals.get_species_id("O2"); + int64_t inN2 = neutrals.get_species_id("N2"); + int64_t inO = neutrals.get_species_id("O"); + + arma_cube epsilon, x, logx; + + x = ions.density_scgc / (neutrals.species[inO2].density_scgc + + neutrals.species[inN2].density_scgc + + neutrals.species[inO].density_scgc); + // should rarely need to be used: + x.clamp(2e-8, 10.0); + + logx = log(x); + + epsilon = exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) + - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) + - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) + )*1.6e-19; + + arma_cube Qphe = epsilon, IonsIonizationRate = epsilon; + + IonsIonizationRate.zeros(); + + for (int64_t iIon = 0; iIon < nIons; iIon++) { + IonsIonizationRate += ions.species[iIon].ionization_scgc; + } + + Qphe = Qphe % IonsIonizationRate; + + return Qphe; +} From bacb51116707c7baecced0713e54e1aaf4ea756a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 9 Jan 2025 17:17:38 -0500 Subject: [PATCH 357/691] STY: Change layout, easier to work on it this way... --- src/calc_electron_temperature.cpp | 93 ++++++++++++++++++------------- 1 file changed, 55 insertions(+), 38 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 86ff1e04..16c13d69 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -3,36 +3,6 @@ #include "../include/aether.h" -// -------------------------------------------------------------------------- -// Heating terms: -// - [x] photoelectrons -// - [ ] auroral ionization -// - [ ] e- ion collisions -// - [ ] e- neutral collisions (elastic & inelastic) -// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) -// -------------------------------------------------------------------------- - -arma_cube calc_photoelectron_heating(Neutrals &neutrals, Ions &ions); - - - -// -------------------------------------------------------------------------- -// TODO (#24): this currently just sets the electron temperature to the neutral temperature -// -------------------------------------------------------------------------- - -void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { - - std::string function = "Ions::calc_electron_temperature"; - static int iFunction = -1; - report.enter(function, iFunction); - - arma_cube Qphe = calc_photoelectron_heating(neutrals, *this); - - electron_temperature_scgc = neutrals.temperature_scgc; - - report.exit(function); -} - /// @brief Calculates photoelectron heating efficiency and heating rate /// @details Based on two key references: /// 1. Swartz & Nisbet (1972) @@ -44,11 +14,12 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { /// @param neutrals /// @param ions /// @return Qphe -arma_cube calc_photoelectron_heating(Neutrals &neutrals, - Ions &ions) { +arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); - int64_t nIons = ions.nSpecies; - int64_t nNeutrals = neutrals.nSpecies; + +// Since this is used a few times, calculate it separately & pass it to the functions. +// From (Smithro and Solomon, 2008) +arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { // from Swartz & Nisbet (1972): we need neutral species id's for o2, n2 & o int64_t inO2 = neutrals.get_species_id("O2"); @@ -58,8 +29,8 @@ arma_cube calc_photoelectron_heating(Neutrals &neutrals, arma_cube epsilon, x, logx; x = ions.density_scgc / (neutrals.species[inO2].density_scgc - + neutrals.species[inN2].density_scgc - + neutrals.species[inO].density_scgc); + + neutrals.species[inN2].density_scgc + + neutrals.species[inO].density_scgc); // should rarely need to be used: x.clamp(2e-8, 10.0); @@ -69,16 +40,62 @@ arma_cube calc_photoelectron_heating(Neutrals &neutrals, - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) )*1.6e-19; + return exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) + - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) + - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) + )*1.6e-19;} - arma_cube Qphe = epsilon, IonsIonizationRate = epsilon; +// -------------------------------------------------------------------------- +// Heating terms: +// - [x] photoelectrons +// - [ ] auroral ionization +// - [ ] e- ion collisions +// - [ ] e- neutral collisions (elastic & inelastic) +// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) +// -------------------------------------------------------------------------- + + + + +// -------------------------------------------------------------------------- +// TODO (#24): this currently just sets the electron temperature to the neutral temperature +// -------------------------------------------------------------------------- + +void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { + + std::string function = "Ions::calc_electron_temperature"; + static int iFunction = -1; + report.enter(function, iFunction); + + arma_cube epsilon = calc_epsilon(neutrals, *this); + + arma_cube Qphe = calc_photoelectron_heating(*this, epsilon); + electron_temperature_scgc = neutrals.temperature_scgc; + + report.exit(function); +} + + +// -------------------------------------------------------------------------- +// Calculate photoelectron heating +// -------------------------------------------------------------------------- +arma_cube calc_photoelectron_heating(Ions &ions, + arma_cube epsilon) { + + int64_t nIons = ions.nSpecies; + + // Initialize Qphe & IonsIonizationRate (sum of ionization rates) + // to the same size as epsilon and then zero them out: + // (Qphe is the product of epsilon & IonsIonizationRate, so is not zeroed.) + arma_cube Qphe = epsilon, IonsIonizationRate = epsilon; IonsIonizationRate.zeros(); for (int64_t iIon = 0; iIon < nIons; iIon++) { IonsIonizationRate += ions.species[iIon].ionization_scgc; } - Qphe = Qphe % IonsIonizationRate; + Qphe = epsilon % IonsIonizationRate; return Qphe; } From 7adbaa43dd92b049087f599c6ca2e4c4ac92969e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 9 Jan 2025 17:45:05 -0500 Subject: [PATCH 358/691] FEAT: Calculate Ionozation portion of e- temp (Qaurora & QIonPrecip) - NOTE:Qaurora & QIonPrecip are the same in Aether, were separate in GITM. and some small style changes. And I returned epsilon wrong --- src/calc_electron_temperature.cpp | 48 ++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 16c13d69..825e3a23 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -3,20 +3,27 @@ #include "../include/aether.h" -/// @brief Calculates photoelectron heating efficiency and heating rate -/// @details Based on two key references: -/// 1. Swartz & Nisbet (1972) -/// 2. Smithro & Solomon (2008) +/// @brief Calculates photoelectron heating +/// @details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) /// /// Uses equations 9-12 from (Zhu & Ridley, 2016) /// https://doi.org/10.1016/j.jastp.2016.01.005 /// -/// @param neutrals /// @param ions +/// @param epsilon /// @return Qphe arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); +/// @brief Calculates auroral heating +/// @details NOTE: in GITM this is solved separately for ion precipitation & auroral +/// ionization. In Aether these are both in ions.species[iIon].ionization_scgc... +/// @param ions +/// @param epsilon +/// @return Qaurora +arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); + + // Since this is used a few times, calculate it separately & pass it to the functions. // From (Smithro and Solomon, 2008) arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { @@ -40,15 +47,13 @@ arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) )*1.6e-19; - return exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) - - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) - - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) - )*1.6e-19;} + return epsilon; +} // -------------------------------------------------------------------------- // Heating terms: // - [x] photoelectrons -// - [ ] auroral ionization +// - [x] auroral ionization (from ion precipitation & auroral ionization) // - [ ] e- ion collisions // - [ ] e- neutral collisions (elastic & inelastic) // - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) @@ -71,6 +76,8 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { arma_cube Qphe = calc_photoelectron_heating(*this, epsilon); + arma_cube QIonization = calc_ionization_heating(*this, epsilon); + electron_temperature_scgc = neutrals.temperature_scgc; report.exit(function); @@ -99,3 +106,24 @@ arma_cube calc_photoelectron_heating(Ions &ions, return Qphe; } + + +// -------------------------------------------------------------------------- +// Calculate ionization heating +// -------------------------------------------------------------------------- +arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){ + int64_t nIons = ions.nSpecies; + + // auroral heating efficiency coefficient + precision_t auroheat = 1.0; + + int64_t iO_3P_ = ions.get_species_id("O_3P_"); + int64_t iO2_ = ions.get_species_id("O2_"); + int64_t iN2_ = ions.get_species_id("N2_"); + + arma_cube QIonization = auroheat * epsilon % (ions.species[iO_3P_].ionization_scgc + + ions.species[iO2_].ionization_scgc + + ions.species[iN2_].ionization_scgc); + + return QIonization; +} \ No newline at end of file From c9b6fcd299b9a2e61ee0d29368c328909d9da78b Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 10 Jan 2025 15:20:08 -0500 Subject: [PATCH 359/691] FEAT: Electron-ion collisional heating & improve calc_e- temp again - fix layout of things - add inputs & stuff - actually enter the functions we want to - fix issues w species in photoelectron/ionization --- include/inputs.h | 18 +++ include/ions.h | 7 +- src/calc_electron_temperature.cpp | 202 ++++++++++++++++++++++++------ src/calc_ion_temperature.cpp | 17 +++ src/inputs.cpp | 24 ++++ 5 files changed, 228 insertions(+), 40 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 3bd5a9ae..91d93017 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -435,6 +435,24 @@ class Inputs { **/ bool get_O_cooling(); + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludePhotoElectronHeating"] + \param none + **/ + bool get_do_photoelectron_heating(); + + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludeIonizationHeating"] + \param none + **/ + bool get_do_ionization_heating(); + + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludeElectronIonCollisionalHeating"] + \param none + **/ + bool get_do_electron_ion_collisional_heating(); + /********************************************************************** \brief returns settings[" \param diff --git a/include/ions.h b/include/ions.h index 521912c1..d8e09987 100644 --- a/include/ions.h +++ b/include/ions.h @@ -172,9 +172,14 @@ class Ions { /// Specific heat (constant volume): arma_cube Cv_scgc; - /// Head Conduction (bulk): + /// Heat Conduction (bulk): arma_cube lambda; + /// Electron temperature calculations need to know if some neutral species are present + bool has_nO; + bool has_nO2; + bool has_nN2; + // Electrodynamics: /// Electric potential: arma_cube potential_scgc; diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 825e3a23..a74644be 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -3,6 +3,15 @@ #include "../include/aether.h" +/// @brief Calculate epsilon +/// @details intermediate variable used in photoelectron & ionization heating +/// From (Smithro & Solomon, 2008). +/// @param neutrals +/// @param ions +/// @return epsilon +arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions); + + /// @brief Calculates photoelectron heating /// @details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) /// @@ -24,37 +33,22 @@ arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); -// Since this is used a few times, calculate it separately & pass it to the functions. -// From (Smithro and Solomon, 2008) -arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { - - // from Swartz & Nisbet (1972): we need neutral species id's for o2, n2 & o - int64_t inO2 = neutrals.get_species_id("O2"); - int64_t inN2 = neutrals.get_species_id("N2"); - int64_t inO = neutrals.get_species_id("O"); - - arma_cube epsilon, x, logx; - - x = ions.density_scgc / (neutrals.species[inO2].density_scgc - + neutrals.species[inN2].density_scgc - + neutrals.species[inO].density_scgc); - // should rarely need to be used: - x.clamp(2e-8, 10.0); +/// @brief Calculates electron-ion collisions +/// @details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003 +/// - This differs slightly from the GITM implementation, which assumes several ion species are present. +/// Instead, here we use each ion species for the sum. +/// - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5 +/// - This is capable of handling BOTH the bulk & individual ion temperatures +/// @param ions +/// @return Qeicp +std::vector calc_electron_ion_collisions(Ions &ions); - logx = log(x); - - epsilon = exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) - - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) - - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) - )*1.6e-19; - return epsilon; -} // -------------------------------------------------------------------------- // Heating terms: // - [x] photoelectrons // - [x] auroral ionization (from ion precipitation & auroral ionization) -// - [ ] e- ion collisions +// - [x] e- ion collisions // - [ ] e- neutral collisions (elastic & inelastic) // - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) // -------------------------------------------------------------------------- @@ -72,11 +66,44 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { static int iFunction = -1; report.enter(function, iFunction); - arma_cube epsilon = calc_epsilon(neutrals, *this); + arma_cube epsilon, Qphe, QIonization; + // electron-ion collisions return a vector of cubes, one for Qe, one for Qi: + std::vector Qeic; + arma_cube Qeicm, Qeicp; + + // Initialize everything to zero! + + epsilon.set_size(grid.get_nLons(), grid.get_nLats(), grid.get_nAlts()); + epsilon.zeros(); + Qphe = epsilon; + QIonization = epsilon; + Qeicm = epsilon; + Qeicp = epsilon; + + + // Needed for both ionization & photoelectron heating: + if (input.get_do_ionization_heating() || input.get_do_photoelectron_heating()) { + epsilon = calc_epsilon(neutrals, *this); + } + + // Photoelectron heating + if (input.get_do_photoelectron_heating()) { + Qphe = calc_photoelectron_heating(*this, epsilon); + } + + // Ionization heating (includes all ionization sources) + if (input.get_do_ionization_heating()) { + QIonization = calc_ionization_heating(*this, epsilon); + } + + // electron-ion collisions + if (input.get_do_electron_ion_collisional_heating()) { + Qeic = calc_electron_ion_collisions(*this); + Qeicp = Qeic[0]; // Ions + Qeicm = Qeic[1]; // Electrons + } - arma_cube Qphe = calc_photoelectron_heating(*this, epsilon); - arma_cube QIonization = calc_ionization_heating(*this, epsilon); electron_temperature_scgc = neutrals.temperature_scgc; @@ -84,18 +111,58 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { } + +// Since this is used a few times, calculate it separately & pass it to the functions. +// From (Smithro and Solomon, 2008) +arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { + + std::string function = "calc_epsilon"; + static int iFunction = -1; + report.enter(function, iFunction); + + // from Swartz & Nisbet (1972): we need neutral species id's for o2, n2 & o + int64_t inO2 = neutrals.get_species_id("O2"); + int64_t inN2 = neutrals.get_species_id("N2"); + int64_t inO = neutrals.get_species_id("O"); + + arma_cube epsilon, x, logx; + + x = ions.density_scgc / (neutrals.species[inO2].density_scgc + + neutrals.species[inN2].density_scgc + + neutrals.species[inO].density_scgc); + // should rarely need to be used: + x.clamp(2e-8, 10.0); + + logx = log(x); + + epsilon = exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) + - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) + - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) + )*1.6e-19; + + report.exit(function); + return epsilon; +} + + + // -------------------------------------------------------------------------- // Calculate photoelectron heating // -------------------------------------------------------------------------- arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon) { + + std::string function = "calc_photoelectron_heating"; + static int iFunction = -1; + report.enter(function, iFunction); int64_t nIons = ions.nSpecies; // Initialize Qphe & IonsIonizationRate (sum of ionization rates) // to the same size as epsilon and then zero them out: // (Qphe is the product of epsilon & IonsIonizationRate, so is not zeroed.) - arma_cube Qphe = epsilon, IonsIonizationRate = epsilon; + arma_cube Qphe, IonsIonizationRate; + IonsIonizationRate.set_size(epsilon.n_rows, epsilon.n_cols, epsilon.n_slices); IonsIonizationRate.zeros(); for (int64_t iIon = 0; iIon < nIons; iIon++) { @@ -104,6 +171,7 @@ arma_cube calc_photoelectron_heating(Ions &ions, Qphe = epsilon % IonsIonizationRate; + report.exit(function); return Qphe; } @@ -112,18 +180,74 @@ arma_cube calc_photoelectron_heating(Ions &ions, // Calculate ionization heating // -------------------------------------------------------------------------- arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){ - int64_t nIons = ions.nSpecies; - // auroral heating efficiency coefficient - precision_t auroheat = 1.0; + std::string function = "calc_ionization_heating"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t nIons = ions.nSpecies; - int64_t iO_3P_ = ions.get_species_id("O_3P_"); - int64_t iO2_ = ions.get_species_id("O2_"); - int64_t iN2_ = ions.get_species_id("N2_"); + // auroral heating efficiency coefficient + precision_t auroheat = 1.0; - arma_cube QIonization = auroheat * epsilon % (ions.species[iO_3P_].ionization_scgc - + ions.species[iO2_].ionization_scgc - + ions.species[iN2_].ionization_scgc); + int64_t iO_3P = ions.get_species_id("O+"); + int64_t iO2P = ions.get_species_id("O2+"); + int64_t iN2P = ions.get_species_id("N2+"); - return QIonization; + arma_cube QIonization = auroheat * epsilon % (ions.species[iO_3P].ionization_scgc + + ions.species[iO2P].ionization_scgc + + ions.species[iN2P].ionization_scgc); + + + report.exit(function); + return QIonization; +} + +// -------------------------------------------------------------------------- +// Calculate electron-ion collisions +// -------------------------------------------------------------------------- +std::vector calc_electron_ion_collisions(Ions &ions){ + + std::string function = "calc_electron_ion_collisions"; + static int iFunction = -1; + report.enter(function, iFunction); + + arma_cube Qeicp; + Qeicp.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qeicp.zeros(); + arma_cube Qeicm = Qeicp; + + int64_t nSpecies = ions.nSpecies; + + if (input.get_do_calc_bulk_ion_temp()){ + // This is used when we calculate bulk ion temperature! + + // Use all species, not just major species (different from GITM) + for (int64_t iSpecies = 0; iSpecies < nSpecies - 1; iSpecies++) { + Qeicp += ions.species[iSpecies].density_scgc + / (ions.species[nSpecies].mass + ions.species[iSpecies].mass); + } + + Qeicp = Qeicp % ions.density_scgc * ions.species[nSpecies].mass * 3.0 * cKB + % (ions.temperature_scgc - ions.electron_temperature_scgc) + * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); + } + else{ + // Individual ion temperatures: + // Use all species, not just major species (different from GITM) + for (int64_t iSpecies = 0; iSpecies < nSpecies - 1; iSpecies++) { + Qeicp += ions.species[iSpecies].density_scgc + % (ions.species[iSpecies].temperature_scgc - ions.electron_temperature_scgc) + / (ions.species[nSpecies].mass + ions.species[iSpecies].mass); + } + + Qeicp = Qeicp % ions.density_scgc * ions.species[nSpecies].mass * 3.0 * cKB + * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); + } + + std::vector Qeic = {Qeicp, Qeicp % ions.electron_temperature_scgc}; + + report.exit(function); + + return Qeic; } \ No newline at end of file diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index caf8cfe2..8d0aad8b 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -27,6 +27,23 @@ void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { temperature_scgc = neutrals.temperature_scgc; + // For electron temperature, we need to check if some species are present or not. + // Do this check now & set a bool or vector: + bool has_nO = false; + bool has_nO2 = false; + bool has_nN2 = false; + + if (neutrals.get_species_id("O") > -1) + has_nO = true; + if (neutrals.get_species_id("O2") > -1) + has_nO2 = true; + if (neutrals.get_species_id("N2") > -1) + has_nN2 = true; + if ((!has_nO && !has_nO2 && !has_nN2) + && (input.get_do_photoelectron_heating() || input.get_do_ionization_heating())) { + report.error("Ion photoelectron & ionization heating require neutral O, O2, and N2 to be present."); + } + return; } diff --git a/src/inputs.cpp b/src/inputs.cpp index f5fa1065..781b5415 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -755,6 +755,30 @@ bool Inputs::get_O_cooling() { return get_setting_bool("Sources", "Neutrals", "O_cool"); } +// ----------------------------------------------------------------------- +// Return whether to include the photoelectron heating +// ----------------------------------------------------------------------- + +bool Inputs::get_do_photoelectron_heating() { + return get_setting_bool("Sources", "Ions", "IncludePhotoElectronHeating"); +} + +// ----------------------------------------------------------------------- +// Return whether to include (all) ionization heating +// ----------------------------------------------------------------------- + +bool Inputs::get_do_ionization_heating() { + return get_setting_bool("Sources", "Ions", "IncludeIonizationHeating"); +} + +// ----------------------------------------------------------------------- +// Return whether to include electron-ion collisional heating +// ----------------------------------------------------------------------- + +bool Inputs::get_do_electron_ion_collisional_heating() { + return get_setting_bool("Sources", "Ions", "IncludeElectronIonCollisionalHeating"); +} + // ----------------------------------------------------------------------- // Return centripetal acceleration // ----------------------------------------------------------------------- From c6c03b8f312a38d5c7d6284c5b1c0177d10700ac Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 21:46:55 -0500 Subject: [PATCH 360/691] DOC: corrected some things --- include/dipole.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/dipole.h b/include/dipole.h index ffa016d9..c8aed455 100644 --- a/include/dipole.h +++ b/include/dipole.h @@ -59,7 +59,7 @@ namespace Dipole2 { *************************************************/ namespace Dipole4 { - /// The normalized origins of each face of the cube (i.e. corner) + /// The normalized origins of each node (i.e. corner) static const arma_mat ORIGINS = { { 0.0, -0.5, 0.0}, { 1.0, -0.5, 0.0}, @@ -67,7 +67,7 @@ namespace Dipole4 { { 0.0, 0.0, 0.0} }; - /// Normalized right steps in cube + /// Normalized right steps in node static const arma_mat RIGHTS = { {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, @@ -75,7 +75,7 @@ namespace Dipole4 { {1.0, 0.0, 0.0} }; - /// Normalized up steps in cube + /// Normalized up steps in node static const arma_mat UPS = { {0.0, 0.5, 0.0}, {0.0, 0.5, 0.0}, From ab1d194d1530d26fc30e8cdaa3aab7d2443f9e52 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 21:49:09 -0500 Subject: [PATCH 361/691] FEAT: changed to native coordinate systems --- include/grid.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/include/grid.h b/include/grid.h index b7d05e7f..5f3db430 100644 --- a/include/grid.h +++ b/include/grid.h @@ -69,8 +69,15 @@ class Grid // These define the magnetic grid: // Armidillo Cube Versions: arma_cube magLon_scgc, magX_scgc; + // The magnetic latitude and altitude need to be defined better. This should be the angle between + // magnetic equator and the point, but sometimes it is invariant latitude. arma_cube magLat_scgc, magY_scgc; + // This is often just the altitude.... arma_cube magAlt_scgc, magZ_scgc; + // Invariant latitude is the magnetic latitude that the field line hits at the lowest altitude. + // This is basically the L-shell, but models want it expressed as latitude and not L-shell. + arma_cube magInvLat_scgc; + // This is the angle from the sun, to the magnetic pole to the point. arma_cube magLocalTime_scgc; // Dipole coordinates: @@ -152,7 +159,55 @@ class Grid // dr is the radial change along the third dimension, which is // primarily needed for building a hydrostatic solution - arma_cube dr_lower_scgc; + arma_cube dr_edge; + + // i, j, k are the three directions, so these are the grid spacing + // between the cell centers in each direction, aligned with the grid + arma_cube i_center_scgc; + arma_cube j_center_scgc; + arma_cube k_center_scgc; + + // edges are defined in the direction of the coordinate, shifted -half + // a cell in that direction. + arma_cube i_edge_scgc; + arma_cube j_edge_scgc; + arma_cube k_edge_scgc; + + // corners are defined as shifted by -half a cell in each direction + arma_cube i_corner_scgc; + arma_cube j_corner_scgc; + arma_cube k_corner_scgc; + + // native distances in native units: + arma_cube di_center_scgc; + arma_cube dj_center_scgc; + arma_cube dk_center_scgc; + + // native distance in meters + arma_cube di_center_m_scgc; + arma_cube dj_center_m_scgc; + arma_cube dk_center_m_scgc; + + // Gradients on the edges really only have to be between cells, so they + // can be defined at the interfaces (n-1 of them) + arma_cube di_edge; + arma_cube dj_edge; + arma_cube dk_edge; + // in meters: + arma_cube di_edge_m; + arma_cube dj_edge_m; + arma_cube dk_edge_m; + + // These are for stretched grids: + arma_cube di_ratio; + arma_cube di_ratio_sq; + arma_cube di_one_minus_r2; + arma_cube dj_ratio; + arma_cube dj_ratio_sq; + arma_cube dj_one_minus_r2; + arma_cube dk_ratio; + arma_cube dk_ratio_sq; + arma_cube dk_one_minus_r2; arma_cube MeshCoefm2; arma_cube MeshCoefm1; @@ -236,16 +291,21 @@ class Grid bool get_Is1Dy(); bool get_Is1Dz(); - void fill_grid(Planets planet); + //void fill_grid(Planets planet); void correct_xy_grid(Planets planet); void calc_sza(Planets planet, Times time); void calc_gse(Planets planet, Times time); void calc_mlt(); + void calc_xyz(Planets planet); void calc_grid_spacing(Planets planet); void calc_alt_grid_spacing(); void calc_lat_grid_spacing(); void calc_long_grid_spacing(); + void calc_maglong_grid_spacing(); + void calc_i_grid_spacing(); + void calc_j_grid_spacing(); + void calc_k_grid_spacing(); void fill_grid_radius(Planets planet); void calc_rad_unit(Planets planet); From 10c33cea91fbd529a06c2314b868579bbe012222 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 21:51:44 -0500 Subject: [PATCH 362/691] FEAT: changed to native coordinate systems --- src/grid_spacing.cpp | 265 ++++++++++++++++++++++------ src/init_geo_grid.cpp | 237 +------------------------ src/init_mag_grid.cpp | 30 +++- src/solver_gradients.cpp | 366 +++++++++++++++++++++++++++++++-------- 4 files changed, 533 insertions(+), 365 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index bce04cfa..81c786f6 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -16,16 +16,9 @@ void Grid::calc_grid_spacing(Planets planet) { calc_lat_grid_spacing(); calc_long_grid_spacing(); - std::vector lon_lat_radius; - lon_lat_radius.push_back(geoLon_scgc); - lon_lat_radius.push_back(geoLat_scgc); - lon_lat_radius.push_back(radius_scgc); - - std::vector xyz; - xyz = transform_llr_to_xyz_3d(lon_lat_radius); - geoX_scgc = xyz[0]; - geoY_scgc = xyz[0]; - geoZ_scgc = xyz[0]; + calc_i_grid_spacing(); + calc_j_grid_spacing(); + calc_k_grid_spacing(); report.print(3, "ending calc_grid_spacing"); } @@ -45,7 +38,7 @@ void Grid::calc_alt_grid_spacing() { (geoAlt_scgc.slice(iAlt + 1) - geoAlt_scgc.slice(iAlt - 1)) / 2.0; dalt_lower_scgc.slice(iAlt) = geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = + dr_edge.slice(iAlt) = radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); } @@ -53,11 +46,11 @@ void Grid::calc_alt_grid_spacing() { dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); - dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); + dr_edge.slice(0) = dr_edge.slice(1); iAlt = nAlts - 1; dalt_lower_scgc.slice(iAlt) = geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = + dr_edge.slice(iAlt) = radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); // For a stretched grid, calculate some useful quantities: @@ -108,34 +101,60 @@ void Grid::calc_alt_grid_spacing() { } // --------------------------------------- -// Grid spacing for latitude: +// Grid spacing for native k axis: // --------------------------------------- -void Grid::calc_lat_grid_spacing() { +void Grid::calc_k_grid_spacing() { - int64_t iLat; + int64_t iZ; - report.print(4, "starting calc_lat_grid_spacing"); + report.print(4, "starting calc_k_grid_spacing"); - for (iLat = 1; iLat < nLats - 1; iLat++) { - dlat_center_scgc.col(iLat) = - (geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat - 1)) / 2.0; + for (iZ = 1; iZ < nZ - 1; iZ++) { + dk_center_scgc.slice(iZ) = + (k_center_scgc.slice(iZ + 1) - k_center_scgc.slice(iZ - 1)) / 2.0; + dk_edge.slice(iZ) = + k_center_scgc.slice(iZ) - k_center_scgc.slice(iZ - 1); + dr_edge.slice(iZ) = + radius_scgc.slice(iZ) - radius_scgc.slice(iZ - 1); } - // Bottom (one sided): - iLat = 0; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); - // Top (one sided): - iLat = nLats - 1; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + dk_center_scgc.slice(0) = dk_center_scgc.slice(1); + dk_center_scgc.slice(nZ - 1) = dk_center_scgc.slice(nZ - 2); - // Make this into a distance: - dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; - report.print(4, "ending calc_lat_grid_spacing"); + dk_edge.slice(0) = dk_edge.slice(1); + dr_edge.slice(0) = dr_edge.slice(1); + iZ = nAlts - 1; + dk_edge.slice(iZ) = + k_center_scgc.slice(iZ) - k_center_scgc.slice(iZ - 1); + dr_edge.slice(iZ) = + radius_scgc.slice(iZ) - radius_scgc.slice(iZ - 1); + + // For a stretched grid, calculate some useful quantities: + // lower is defined for the current cell, which + // means that upper(iZ) is lower(iZ+1) + // ratio = upper / lower + for (iZ = 0; iZ < nZ - 1; iZ++) + dk_ratio.slice(iZ) = + dk_edge.slice(iZ + 1) / dk_edge.slice(iZ); + + iZ = nZ - 1; + dk_ratio.slice(iZ) = dk_ratio.slice(iZ - 1); + + // Need the square of the ratio: + dk_ratio_sq = dk_ratio % dk_ratio; + dk_one_minus_r2 = 1.0 - dk_ratio_sq; + + // k is in meters: + dk_edge_m = dk_edge; + dk_center_m_scgc = dk_center_scgc; + + report.print(4, "ending calc_k_grid_spacing"); + return; } + + // --------------------------------------- // Grid spacing for longitude: // --------------------------------------- @@ -164,37 +183,154 @@ void Grid::calc_long_grid_spacing() { dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); report.print(4, "ending calc_long_grid_spacing"); +} + +// --------------------------------------- +// Grid spacing for native i direction: +// --------------------------------------- + +void Grid::calc_i_grid_spacing() { + + int64_t iX; + + report.print(4, "starting calc_i_grid_spacing"); + + for (iX = 1; iX < nX - 1; iX++) { + di_center_scgc.row(iX) = + (i_center_scgc.row(iX + 1) - i_center_scgc.row(iX - 1)) / 2.0; + di_edge.row(iX) = + i_center_scgc.row(iX) - i_center_scgc.row(iX - 1); + } + // Bottom (one sided): + iX = 0; + di_center_scgc.row(iX) = + i_center_scgc.row(iX + 1) - i_center_scgc.row(iX); + di_edge.row(iX) = + i_center_scgc.row(iX + 1) - i_center_scgc.row(iX); + // Top (one sided): + iX = nX - 1; + di_center_scgc.row(iX) = + i_center_scgc.row(iX) - i_center_scgc.row(iX - 1); + di_edge.row(iX) = + i_center_scgc.row(iX) - i_center_scgc.row(iX - 1); + + // Make this into a distance. This assumes that the native i coordinate is in + // radians, which is true for sphere, cubesphere, and dipole grid. + di_center_m_scgc = di_center_scgc % radius_scgc; + di_edge_m = di_edge % radius_scgc; + + // If the shape is a sphere, then the first coordinate is longitude. The physical + // distance needs to be changed by the cos of the latitude, which is the j coordinate. + if (iGridShape_ == iSphere_) { + di_center_m_scgc = di_center_m_scgc % abs(cos(j_center_scgc)); + // edge is in-line with the j center + di_edge_m = di_edge_m % abs(cos(j_center_scgc)); + } + // Need a similar thing for the dipole grid here! + if (iGridShape_ == iDipole_) { + // do something here! + } + + // For a stretched grid, calculate some useful quantities: + // lower is defined for the current cell, which + // means that upper(iZ) is lower(iZ+1) + // ratio = upper / lower + for (iX = 0; iX < nX - 1; iX++) + di_ratio.row(iX) = + di_edge.row(iX + 1) / di_edge.row(iX); + + iX = nX - 1; + di_ratio.row(iX) = di_ratio.row(iX - 1); + + // Need the square of the ratio: + di_ratio_sq = di_ratio % di_ratio; + di_one_minus_r2 = 1.0 - di_ratio_sq; + report.print(4, "ending calc_i_grid_spacing"); } // --------------------------------------- -// Grid spacing for magnetic longitude: +// Grid spacing for latitude: // --------------------------------------- -void Grid::calc_maglong_grid_spacing() { +void Grid::calc_lat_grid_spacing() { - int64_t iLon; + int64_t iLat; - report.print(4, "starting calc_maglong_grid_spacing"); + report.print(4, "starting calc_lat_grid_spacing"); - for (iLon = 1; iLon < nLons - 1; iLon++) - dmlon_center_scgc.row(iLon) = - (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; + for (iLat = 1; iLat < nLats - 1; iLat++) { + dlat_center_scgc.col(iLat) = + (geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat - 1)) / 2.0; + } // Bottom (one sided): - iLon = 0; - dmlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); + iLat = 0; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); // Top (one sided): - iLon = nLons - 1; - dmlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); + iLat = nLats - 1; + dlat_center_scgc.col(iLat) = + geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); + + // Make this into a distance: + dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; + report.print(4, "ending calc_lat_grid_spacing"); +} + +// --------------------------------------- +// Grid spacing for native j direction: +// --------------------------------------- + +void Grid::calc_j_grid_spacing() { + + int64_t iY; + + report.print(4, "starting calc_j_grid_spacing"); + + for (iY = 1; iY < nY - 1; iY++) { + dj_center_scgc.col(iY) = + (j_center_scgc.col(iY + 1) - j_center_scgc.col(iY - 1)) / 2.0; + dj_edge.col(iY) = + j_center_scgc.col(iY) - j_center_scgc.col(iY - 1); + } + + // Bottom (one sided): + iY = 0; + dj_center_scgc.col(iY) = + j_center_scgc.col(iY + 1) - j_center_scgc.col(iY); + dj_edge.col(iY) = + j_center_scgc.col(iY + 1) - j_center_scgc.col(iY); + // Top (one sided): + iY = nY - 1; + dj_center_scgc.col(iY) = + j_center_scgc.col(iY) - j_center_scgc.col(iY - 1); + dj_edge.col(iY) = + j_center_scgc.col(iY) - j_center_scgc.col(iY - 1); // Make this into a distance: - dmlon_center_dist_scgc = - dmlon_center_scgc % radius_scgc % abs(cos(magLat_scgc)); + if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_) { + dj_center_m_scgc = dj_center_scgc % radius_scgc; + dj_edge_m = dj_edge % radius_scgc; + } + // Need to do something for the dipole grid? - report.print(4, "ending calc_maglong_grid_spacing"); + // For a stretched grid, calculate some useful quantities: + // egde is defined for the current cell, which + // means that upper(iY) is lower(iY+1) + // ratio = upper / lower + for (iY = 0; iY < nY - 1; iY++) + dj_ratio.col(iY) = + dj_edge.col(iY + 1) / dj_edge.col(iY); + + iY = nY - 1; + dj_ratio.col(iY) = dj_ratio.col(iY - 1); + + // Need the square of the ratio: + dj_ratio_sq = dj_ratio % dj_ratio; + dj_one_minus_r2 = 1.0 - dj_ratio_sq; + + report.print(4, "ending calc_j_grid_spacing"); } // ----------------------------------------------------------------------------- @@ -205,7 +341,7 @@ void Grid::calc_dipole_grid_spacing(Planets planet) { int64_t iLon, iLat, iAlt; - report.print(3, "starting calc_grid_spacing"); + report.print(3, "starting calc_dipole_grid_spacing"); // This is close, but may need to be adjusted later. // These quantities are obtained from integrating the scale factor (h) @@ -219,6 +355,8 @@ void Grid::calc_dipole_grid_spacing(Planets planet) { report.print(3, "starting long"); calc_long_dipole_grid_spacing(); + calc_i_grid_spacing(); + std::vector lon_lat_radius; lon_lat_radius.push_back(geoLon_scgc); lon_lat_radius.push_back(geoLat_scgc); @@ -230,7 +368,7 @@ void Grid::calc_dipole_grid_spacing(Planets planet) { geoY_scgc = xyz[0]; geoZ_scgc = xyz[0]; - report.print(3, "ending calc_grid_spacing"); + report.print(3, "ending calc_dipole_grid_spacing"); } // for sanity (only marginally helpful): @@ -258,40 +396,57 @@ void Grid::calc_alt_dipole_grid_spacing() { % (1 / delTm(magLat_scgc.slice(iAlt + 1))) - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; + dk_center_scgc.slice(iAlt) = dalt_center_scgc.slice(iAlt); dalt_lower_scgc.slice(iAlt) = abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) % (1 / delTm(magLat_scgc.slice(iAlt))) - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - dr_lower_scgc.slice(iAlt) = + dk_edge.slice(iAlt) = dalt_lower_scgc.slice(iAlt); + + dr_edge.slice(iAlt) = radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); } dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); + dk_center_scgc.slice(0) = dalt_center_scgc.slice(0); + dk_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); - dr_lower_scgc.slice(0) = dr_lower_scgc.slice(1); + dr_edge.slice(0) = dr_edge.slice(1); + dk_edge.slice(0) = dalt_lower_scgc.slice(1); iAlt = nAlts - 1; dalt_lower_scgc.slice(iAlt) = - geoAlt_scgc.slice(iAlt) - geoAlt_scgc.slice(iAlt - 1); - dr_lower_scgc.slice(iAlt) = + magAlt_scgc.slice(iAlt) - magAlt_scgc.slice(iAlt - 1); + dk_edge.slice(iAlt) = dalt_lower_scgc.slice(iAlt); + dr_edge.slice(iAlt) = radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); // For a stretched grid, calculate some useful quantities: // lower is defined for the current cell, which // means that upper(iAlt) is lower(iAlt+1) // ratio = upper / lower - for (iAlt = 0; iAlt < nAlts - 1; iAlt++) + for (iAlt = 0; iAlt < nAlts - 1; iAlt++) { dalt_ratio_scgc.slice(iAlt) = dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); + dk_ratio.slice(iAlt) = + dk_edge.slice(iAlt + 1) / dk_edge.slice(iAlt); + } iAlt = nAlts - 1; dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); + dk_ratio.slice(iAlt) = dk_ratio.slice(iAlt - 1); // Need the square of the ratio: dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; + dk_ratio_sq = dk_ratio % dk_ratio; + dk_one_minus_r2 = 1.0 - dk_ratio_sq; + + // k is in meters: + dk_edge_m = dk_edge; + dk_center_m_scgc = dk_center_scgc; } // --------------------------------------- @@ -323,6 +478,8 @@ void Grid::calc_lat_dipole_grid_spacing() { // Make this into a distance: dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; + dj_center_scgc = dlat_center_scgc; + dj_center_m_scgc = dlat_center_dist_scgc; } // --------------------------------------- diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index e142b688..2da9bf87 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -6,230 +6,6 @@ #include "aether.h" #include - -// ---------------------------------------------------------------------- -// Create connectivity between the nodes for message passing for sphere -// ---------------------------------------------------------------------- - -void Grid::create_sphere_connection(Quadtree quadtree) { - - std::string function = "Grid::create_sphere_connection"; - static int iFunction = -1; - report.enter(function, iFunction); - - IsLatLonGrid = true; - - // Get some coordinates and sizes in normalized coordinates: - arma_vec lower_left_norm = quadtree.get_vect("LL"); - arma_vec middle_norm = quadtree.get_vect("MID"); - arma_vec size_right_norm = quadtree.get_vect("SR"); - arma_vec size_up_norm = quadtree.get_vect("SU"); - - // Move to the next block in 4 directions: - arma_vec down_norm = middle_norm - 0.51 * size_up_norm; - arma_vec up_norm = middle_norm + 0.51 * size_up_norm; - arma_vec left_norm = middle_norm - 0.51 * size_right_norm; - arma_vec right_norm = middle_norm + 0.51 * size_right_norm; - - // The first component could wrap around: - right_norm(0) = fmod(right_norm(0), quadtree.limit_high(0)); - left_norm(0) = fmod((left_norm(0) + quadtree.limit_high(0)), - quadtree.limit_high(0)); - - // These should be the exact edge of the face. - // The from and to processors should get these in the same place, - // so they can be used to match which processor to send / receive info - edge_Xp = middle_norm + size_right_norm / 2.0; - // wrap in longitude: - edge_Xp(0) = fmod(edge_Xp(0), quadtree.limit_high(0)); - edge_Xm = middle_norm - size_right_norm / 2.0; - edge_Yp = middle_norm + size_up_norm / 2.0; - edge_Ym = middle_norm - size_up_norm / 2.0; - - iProcYm = quadtree.find_point(down_norm) + iMember * nGrids; - iProcYp = quadtree.find_point(up_norm) + iMember * nGrids; - iProcXm = quadtree.find_point(left_norm) + iMember * nGrids; - iProcXp = quadtree.find_point(right_norm) + iMember * nGrids; - - iRoot = quadtree.find_root(middle_norm); - iRootYm = quadtree.find_root(down_norm); - iRootYp = quadtree.find_root(up_norm); - iRootXm = quadtree.find_root(left_norm); - iRootXp = quadtree.find_root(right_norm); - - // Check if touching South Pole: - if (lower_left_norm(1) == quadtree.limit_low(1)) { - DoesTouchSouthPole = true; - - // edges need to be adjusted to deal with longitudes, since the - // pole will 180deg different for the from and to processors - if (edge_Ym(0) < 1.0) - edge_Ym(0) += 0.5; - else - edge_Ym(0) -= 0.5; - } - - // Check if touching North Pole: - if (lower_left_norm(1) + size_up_norm(1) == quadtree.limit_high(1)) { - DoesTouchNorthPole = true; - - // edge need to be adjusted to deal with longitudes, since the - // pole will 180deg different for the from and to processors - if (edge_Yp(0) < 1.0) - edge_Yp(0) += 0.5; - else - edge_Yp(0) -= 0.5; - } - - if (report.test_verbose(2)) - std::cout << "connectivity : " - << " iProc : " << iProc << "\n" - << " isnorth : " << DoesTouchNorthPole << "\n" - << " issouth : " << DoesTouchSouthPole << "\n" - << " iProcYm : " << iProcYm << "\n" - << " iProcYp : " << iProcYp << "\n" - << " iProcXm : " << iProcXm << "\n" - << " iProcXp : " << iProcXp << "\n"; - - report.exit(function); - return; -} - -// ---------------------------------------------------------------------- -// Create a spherical grid with lon/lat/alt coordinates -// ---------------------------------------------------------------------- - -void Grid::create_sphere_grid(Quadtree quadtree) { - - std::string function = "Grid::create_simple_lat_lon_alt_grid"; - static int iFunction = -1; - report.enter(function, iFunction); - - int64_t iLon, iLat, iAlt; - - // Get some coordinates and sizes in normalized coordinates: - arma_vec lower_left_norm = quadtree.get_vect("LL"); - arma_vec size_right_norm = quadtree.get_vect("SR"); - arma_vec size_up_norm = quadtree.get_vect("SU"); - - precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); - precision_t lon0 = lower_left_norm(0) * cPI; - arma_vec lon1d(nLons); - - // if we are not doing anything in the lon direction, then set dlon to - // something reasonable: - if (!HasXdim) - dlon = 1.0 * cDtoR; - - // Longitudes: - // - Make a 1d vector - // - copy it into the 3d cube - for (iLon = 0; iLon < nLons; iLon++) - lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; - - for (iLat = 0; iLat < nLats; iLat++) { - for (iAlt = 0; iAlt < nAlts; iAlt++) - geoLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; - } - - precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); - precision_t lat0 = lower_left_norm(1) * cPI; - arma_vec lat1d(nLats); - - // if we are not doing anything in the lat direction, then set dlat to - // something reasonable: - if (!HasYdim) - dlat = 1.0 * cDtoR; - - // Latitudes: - // - Make a 1d vector - // - copy it into the 3d cube - for (iLat = 0; iLat < nLats; iLat++) - lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; - - for (iLon = 0; iLon < nLons; iLon++) { - for (iAlt = 0; iAlt < nAlts; iAlt++) - geoLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; - } - - arma_cube cos_lat = cos(geoLat_scgc); - cos_lat.elem( find(cos_lat < 0.00001) ).fill(0.00001); - - y_Center = geoLat_scgc; - x_Center = geoLon_scgc % cos_lat; - cell_area = dlat * dlon * cos_lat; - - // --------------------------------------------- - // Left Sides - edges on left side (no offset left) - // --------------------------------------------- - arma_mat lat2d_left(nLons + 1, nLats); - arma_mat lon2d_left(nLons + 1, nLats); - - for (iLat = 0; iLat < nLats; iLat++) { - for (iLon = 0; iLon < nLons + 1; iLon++) { - lat2d_left(iLon, iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; - lon2d_left(iLon, iLat) = lon0 + (iLon - nGCs) * dlon; - } - } - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - geoLon_Left.slice(iAlt) = lon2d_left; - geoLat_Left.slice(iAlt) = lat2d_left; - } - - arma_cube cos_lat_L = cos(geoLat_Left); - cos_lat_L.elem( find(cos_lat_L < 0.00001) ).fill(0.00001); - - x_Left = geoLon_Left % cos_lat_L; - dy_Left.set_size(nLons, nLats, nAlts); - dy_Left.fill(dlat); - - // --------------------------------------------- - // Down Sides - edges on down side (no offset lat) - // --------------------------------------------- - arma_mat lat2d_down(nLons, nLats + 1); - arma_mat lon2d_down(nLons, nLats + 1); - - for (iLat = 0; iLat < nLats + 1; iLat++) { - for (iLon = 0; iLon < nLons; iLon++) { - lat2d_down(iLon, iLat) = lat0 + (iLat - nGCs) * dlat; - lon2d_down(iLon, iLat) = lon0 + (iLon - nGCs + 0.5) * dlon; - } - } - - for (iAlt = 0; iAlt < nAlts; iAlt++) { - geoLon_Down.slice(iAlt) = lon2d_down; - geoLat_Down.slice(iAlt) = lat2d_down; - } - - arma_cube cos_lat_D = cos(geoLat_Down); - cos_lat_D.elem( find(cos_lat_D < 0.00001) ).fill(0.00001); - - y_Down = geoLat_Down; - dx_Down = dlon * cos_lat_D; - - // --------------------------------------------- - // Corner Sides - corner (no offset lat or lon) - // --------------------------------------------- - arma_mat lat2d_corner(nLons + 1, nLats + 1); - arma_mat lon2d_corner(nLons + 1, nLats + 1); - - for (iLat = 0; iLat < nLats + 1; iLat++) { - for (iLon = 0; iLon < nLons + 1; iLon++) { - lat2d_corner(iLon, iLat) = lat0 + (iLat - nGCs) * dlat; - lon2d_corner(iLon, iLat) = lon0 + (iLon - nGCs) * dlon; - } - } - - for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { - geoLon_Corner.slice(iAlt) = lon2d_corner; - geoLat_Corner.slice(iAlt) = lat2d_corner; - } - - report.exit(function); - return; -} - // ---------------------------------------------------------------------- // Create a spherical grid with lon/lat/alt coordinates // ---------------------------------------------------------------------- @@ -361,13 +137,17 @@ void Grid::create_altitudes(Planets planet) { for (iLon = 0; iLon < nLons; iLon++) { for (iLat = 0; iLat < nLats; iLat++) { geoAlt_scgc.tube(iLon, iLat) = alt1d; + k_center_scgc.tube(iLon, iLat) = alt1d; geoAlt_Below.tube(iLon, iLat) = alt1d_below; + k_edge_scgc.tube(iLon, iLat) = alt1d_below; } } for (iLon = 0; iLon < nLons + 1; iLon++) { - for (iLat = 0; iLat < nLats + 1; iLat++) + for (iLat = 0; iLat < nLats + 1; iLat++) { geoAlt_Corner.tube(iLon, iLat) = alt1d_below; + k_corner_scgc.tube(iLon, iLat) = alt1d_below; + } } report.exit(function); @@ -392,17 +172,13 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (iGridShape_ == iCubesphere_) { report.print(0, "Creating Cubesphere Grid"); - if (!Is0D & !Is1Dz) create_cubesphere_connection(quadtree); - IsCubeSphereGrid = true; } else { report.print(0, "Creating Spherical Grid"); - if (!Is0D & !Is1Dz) create_sphere_connection(quadtree); - IsCubeSphereGrid = false; } @@ -459,6 +235,9 @@ bool Grid::init_geo_grid(Quadtree quadtree, IsGeoGrid = false; } + // Calculate PFPC coordinates (i.e., XYZ from LLR) + calc_xyz(planet); + // Calculate grid spacing calc_grid_spacing(planet); //calculate radial unit vector (for spherical or oblate planet) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 28a7a2a4..648bd4ab 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -306,15 +306,20 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, if (!isCorner) { for (int64_t iLon = 0; iLon < nLons; iLon ++) { for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) { magP_scgc(iLon, iLat, iAlt) = Lshells(iLat); + j_center_scgc(iLon, iLat, iAlt) = Lshells(iLat); + } } } } else { for (int64_t iLon = 0; iLon < nLons; iLon ++) { for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) { magP_Down(iLon, iLat, iAlt) = Lshells(iLat); + j_edge_scgc(iLon, iLat, iAlt) = Lshells(iLat); + j_corner_scgc(iLon, iLat, iAlt) = Lshells(iLat); + } } } } @@ -361,11 +366,17 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, if (isCorner) { // save the q for the "down" case: - for (int64_t iLon = 0; iLon < nLons; iLon ++) + for (int64_t iLon = 0; iLon < nLons; iLon ++) { magQ_Down(iLon, iLat, iAlt) = qp2; + if (iLat < nLats) + k_edge_scgc(iLon, iLat, iAlt) = qp2; + k_corner_scgc(iLon, iLat, iAlt) = qp2; + } } else { - for (int64_t iLon = 0; iLon < nLons; iLon ++) + for (int64_t iLon = 0; iLon < nLons; iLon ++) { magQ_scgc(iLon, iLat, iAlt) = qp2; + k_center_scgc(iLon, iLat, iAlt) = qp2; + } r_theta = qp_to_r_theta(qp2, Lshells(iLat)); bAlts(iLat, iAlt) = r_theta.first; @@ -683,16 +694,18 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iAlt = 0; iAlt < nAlts; iAlt++) { // centers: magLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + i_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; // left edges magLon_Left.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + i_edge_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } } - for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { for (iLat = 0; iLat < nLats + 1; iLat++) { // Corners magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } } @@ -744,6 +757,13 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // This is only down for the "down" edges, where the base latitudes are different. fill_field_lines(baseLats_down, min_alt_re, Gamma, planet, true); + // The baseLats are the Invariant Latitudes of the grid, so we can just fill in all of the + // points with these values + for (iAlt = 0; iAlt < nAlts; iAlt++) + for (iLat = 0; iLat < nLats; iLat++) + for (iLon = 0; iLon < nLons; iLon++) + magInvLat_scgc(iLon, iLat, iAlt) = baseLats(iLat); + report.print(4, "Field-aligned Edges"); dipole_alt_edges(planet, min_alt_re); diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 50b3749c..3446199f 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -4,139 +4,348 @@ #include "../include/aether.h" // -------------------------------------------------------------------------- -// Calculate the gradient in the longitudinal direction +// Calculate the gradient in all directions, returning a vector +// It is assumed that this is lon, lat, rad // -------------------------------------------------------------------------- std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { std::vector gradient_vcgc; - + if (report.test_verbose(4)) { + std::cout << "grid shape (1 = sphere; 2 = cube; 3 = dipole) : " << grid.iGridShape_ << "\n"; + display_vector("gradient, value : ", value_scgc.tube(9,9)); + } if (grid.iGridShape_ == grid.iCubesphere_) gradient_vcgc = calc_gradient_cubesphere(value_scgc, grid); - else { - gradient_vcgc.push_back(calc_gradient_lon(value_scgc, grid)); - gradient_vcgc.push_back(calc_gradient_lat(value_scgc, grid)); + + report.print(4, "Going into calc_gradient_lon"); + gradient_vcgc.push_back(calc_gradient2o_i(value_scgc, grid)); + if (report.test_verbose(4)) + display_vector("gradient[0] : ", gradient_vcgc[0].tube(9,9)); + + report.print(4, "Going into calc_gradient_lat"); + gradient_vcgc.push_back(calc_gradient2o_j(value_scgc, grid)); + if (report.test_verbose(4)) + display_vector("gradient[1] : ", gradient_vcgc[1].tube(9,9)); + + report.print(4, "Going into calc_gradient_alt"); gradient_vcgc.push_back(calc_gradient_alt(value_scgc, grid)); + if (report.test_verbose(4)) + display_vector("gradient[2] : ", gradient_vcgc[2].tube(9,9)); } return gradient_vcgc; } // -------------------------------------------------------------------------- -// Calculate the gradient in the longitudinal direction +// Routines related to native i - direction +// - 2nd order uniform grid +// - 4th order uniform grid +// - 2nd order stretched grid // -------------------------------------------------------------------------- -arma_cube calc_gradient_lon(arma_cube value, Grid grid) { +// -------------------------------------------------------------------------- +// Calculate the 2nd order gradient in the native i direction +// - these formulas assume that the grid is uniform. +// -------------------------------------------------------------------------- - int64_t nLons = grid.get_nLons(); - int64_t nLats = grid.get_nLats(); - int64_t nAlts = grid.get_nAlts(); - int64_t iLon; +arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { - arma_cube gradient(nLons, nLats, nAlts); + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iX; + + arma_cube gradient(nX, nY, nZ); gradient.zeros(); if (grid.get_HasXdim()) { // Interior: - for (iLon = 1; iLon < nLons - 1; iLon++) - gradient.row(iLon) = - (value.row(iLon + 1) - value.row(iLon - 1)) / - (2 * grid.dlon_center_dist_scgc.row(iLon)); + for (iX = 1; iX < nX - 1; iX++) + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX - 1)) / + (2 * grid.di_center_m_scgc.row(iX)); // Lower (one sided): - iLon = 0; - gradient.row(iLon) = - (value.row(iLon + 1) - value.row(iLon)) / - grid.dlon_center_dist_scgc.row(iLon); + iX = 0; + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX)) / + grid.di_center_m_scgc.row(iX); // Upper (one sided): - iLon = nLons - 1; - gradient.row(iLon) = - (value.row(iLon) - value.row(iLon - 1)) / - grid.dlon_center_dist_scgc.row(iLon); + iX = nX - 1; + gradient.row(iX) = + (value.row(iX) - value.row(iX - 1)) / + grid.di_center_m_scgc.row(iX); } + return gradient; +} + +// -------------------------------------------------------------------------- +// Calculate the 4th gradient in the native i direction +// - these formulas assume that the grid is uniform. +// -------------------------------------------------------------------------- + +arma_cube calc_gradient4o_i(arma_cube value, Grid grid) { + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iX; + + arma_cube gradient(nX, nY, nZ); + gradient.zeros(); + if (grid.get_HasXdim()) { + // Interior, 5 point sencil: + for (iX = 2; iX < nX - 2; iX++) + gradient.row(iX) = (-value.row(iX + 2) + + 8 * value.row(iX + 1) - + 8 * value.row(iX - 1) + + value.row(iX - 2)) / + (12. * grid.di_center_m_scgc.row(iX)); + + // Points just inside edges (2nd order): + iX = 1; + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX - 1)) / + (2 * grid.di_center_m_scgc.row(iX)); + iX = nX-2; + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX - 1)) / + (2 * grid.di_center_m_scgc.row(iX)); + + // Points at the edges (1st order): + iX = 0; + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX)) / + grid.di_center_m_scgc.row(iX); + iX = nX - 1; + gradient.row(iX) = + (value.row(iX) - value.row(iX - 1)) / + grid.di_center_m_scgc.row(iX); + } return gradient; } // -------------------------------------------------------------------------- -// Calculate the gradient in the latitudinal direction +// Calculate the 2nd order gradient in the native i-direction, +// assuming a stretched grid // -------------------------------------------------------------------------- -arma_cube calc_gradient_lat(arma_cube value, Grid grid) { +arma_cube calc_gradient_stretched_i(arma_cube value, Grid grid) { - int64_t nLons = grid.get_nLons(); - int64_t nLats = grid.get_nLats(); - int64_t nAlts = grid.get_nAlts(); - int64_t iLat; + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iX; - arma_cube gradient(nLons, nLats, nAlts); + arma_cube gradient(nX, nY, nZ); + gradient.zeros(); + + if (grid.get_HasXdim()) { + // Central part + for (iX = 1; iX < nX - 1; iX++) + gradient.row(iX) = + (value.row(iX + 1) + - grid.di_one_minus_r2.row(iX) % value.row(iX) + - grid.di_ratio_sq.row(iX) % value.row(iX - 1)) / + (grid.di_edge_m.row(iX + 1) % + (1.0 + grid.di_ratio.row(iX))); + + // Points at the edges (1st order): + iX = 0; + gradient.row(iX) = + (value.row(iX + 1) - value.row(iX)) / + grid.di_center_m_scgc.row(iX); + iX = nX - 1; + gradient.row(iX) = + (value.row(iX) - value.row(iX - 1)) / + grid.di_center_m_scgc.row(iX); + } + return gradient; +} + + + +// -------------------------------------------------------------------------- +// Calculate the gradient in the longitudinal direction +// -------------------------------------------------------------------------- + +arma_cube calc_gradient_lon(arma_cube value, Grid grid) { + return calc_gradient2o_i(value, grid); +} + +// -------------------------------------------------------------------------- +// Calculate the 2nd order gradient in the native j direction +// - these formulas assume that the grid is uniform. +// -------------------------------------------------------------------------- + +arma_cube calc_gradient2o_j(arma_cube value, Grid grid) { + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iY; + + arma_cube gradient(nX, nY, nZ); gradient.zeros(); if (grid.get_HasYdim()) { // Interior: - for (iLat = 1; iLat < nLats - 1; iLat++) - gradient.col(iLat) = - (value.col(iLat + 1) - value.col(iLat - 1)) / - (2 * grid.dlat_center_dist_scgc.col(iLat)); + for (iY = 1; iY < nY - 1; iY++) + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY - 1)) / + (2 * grid.dj_center_m_scgc.col(iY)); // Lower (one sided): - iLat = 0; - gradient.col(iLat) = - (value.col(iLat + 1) - value.col(iLat)) / - grid.dlat_center_dist_scgc.col(iLat); + iY = 0; + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY)) / + grid.dj_center_m_scgc.col(iY); // Upper (one sided): - iLat = nLats - 1; - gradient.col(iLat) = - (value.col(iLat) - value.col(iLat - 1)) / - grid.dlat_center_dist_scgc.col(iLat); + iY = nY - 1; + gradient.col(iY) = + (value.col(iY) - value.col(iY - 1)) / + grid.dj_center_m_scgc.col(iY); } + return gradient; +} + +// -------------------------------------------------------------------------- +// Calculate the 4th order gradient in the native j direction +// - these formulas assume that the grid is uniform. +// -------------------------------------------------------------------------- + +arma_cube calc_gradient4o_j(arma_cube value, Grid grid) { + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iY; + + arma_cube gradient(nX, nY, nZ); + gradient.zeros(); + if (grid.get_HasYdim()) { + // Interior: + for (iY = 2; iY < nY - 2; iY++) + gradient.col(iY) = (-value.col(iY + 2) + + 8 * value.col(iY + 1) - + 8 * value.col(iY - 1) + + value.col(iY - 2)) / + (12. * grid.dj_center_m_scgc.col(iY)); + + // Points just inside edges (2nd order): + iY = 1; + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY - 1)) / + (2 * grid.dj_center_m_scgc.col(iY)); + iY = nY-2; + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY - 1)) / + (2 * grid.dj_center_m_scgc.col(iY)); + + // Lower (one sided): + iY = 0; + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY)) / + grid.dj_center_m_scgc.row(iY); + + // Upper (one sided): + iY = nY - 1; + gradient.col(iY) = + (value.col(iY) - value.col(iY - 1)) / + grid.dj_center_m_scgc.col(iY); + } return gradient; } +// -------------------------------------------------------------------------- +// Calculate the 2nd order gradient in the native j-direction, +// assuming a stretched grid +// -------------------------------------------------------------------------- + +arma_cube calc_gradient_stretched_j(arma_cube value, Grid grid) { + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iY; + + arma_cube gradient(nX, nY, nZ); + gradient.zeros(); + + if (grid.get_HasYdim()) { + // Central part + for (iY = 1; iY < nY - 1; iY++) + gradient.col(iY) = + (value.col(iY + 1) + - grid.dj_one_minus_r2.col(iY) % value.col(iY) + - grid.dj_ratio_sq.col(iY) % value.col(iY - 1)) / + (grid.dj_edge_m.col(iY + 1) % + (1.0 + grid.dj_ratio.col(iY))); + + // Points at the edges (1st order): + iY = 0; + gradient.col(iY) = + (value.col(iY + 1) - value.col(iY)) / + grid.dj_center_m_scgc.col(iY); + iY = nY - 1; + gradient.col(iY) = + (value.col(iY) - value.col(iY - 1)) / + grid.dj_center_m_scgc.col(iY); + } + return gradient; +} + +// -------------------------------------------------------------------------- +// Calculate the gradient in the latitudinal direction +// -------------------------------------------------------------------------- + +arma_cube calc_gradient_lat(arma_cube value, Grid grid) { + return calc_gradient2o_j(value, grid); +} + // -------------------------------------------------------------------------- // Calculate the gradient in the altitudinal direction // -------------------------------------------------------------------------- arma_cube calc_gradient_alt(arma_cube value, Grid grid) { - int64_t nLons = grid.get_nLons(); - int64_t nLats = grid.get_nLats(); - int64_t nAlts = grid.get_nAlts(); + int64_t nX = grid.get_nLons(); + int64_t nY = grid.get_nLats(); + int64_t nZ = grid.get_nAlts(); int64_t nGCs = grid.get_nGCs(); - int64_t iAlt; + int64_t iK; - arma_cube gradient(nLons, nLats, nAlts); + arma_cube gradient(nX, nY, nZ); gradient.zeros(); if (grid.get_HasZdim()) { - arma_cube one_minus_r2 = 1.0 - grid.dalt_ratio_sq_scgc; - // Central part - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) - gradient.slice(iAlt) = - (value.slice(iAlt + 1) - - one_minus_r2.slice(iAlt) % value.slice(iAlt) - - grid.dalt_ratio_sq_scgc.slice(iAlt) % value.slice(iAlt - 1)) / - (grid.dalt_lower_scgc.slice(iAlt + 1) % - (1.0 + grid.dalt_ratio_scgc.slice(iAlt))); + for (iK = 1; iK < nZ - 1; iK++) + gradient.slice(iK) = + (value.slice(iK + 1) + - grid.dk_one_minus_r2.slice(iK) % value.slice(iK) + - grid.dk_ratio_sq.slice(iK) % value.slice(iK - 1)) / + (grid.dk_edge_m.slice(iK + 1) % + (1.0 + grid.dk_ratio.slice(iK))); // lower boundary - iAlt = 0; - gradient.slice(iAlt) = - (value.slice(iAlt + 1) - value.slice(iAlt)) / - grid.dalt_lower_scgc.slice(iAlt); + iK = 0; + gradient.slice(iK) = + (value.slice(iK + 1) - value.slice(iK)) / + grid.dk_edge_m.slice(iK); // upper boundary - iAlt = nAlts - 1; - gradient.slice(iAlt) = - (value.slice(iAlt) - value.slice(iAlt - 1)) / - grid.dalt_lower_scgc.slice(iAlt); + iK = nZ - 1; + gradient.slice(iK) = + (value.slice(iK) - value.slice(iK - 1)) / + grid.dk_edge_m.slice(iK); } - return gradient; } @@ -166,7 +375,6 @@ arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid) { return gradient; } - // -------------------------------------------------------------------------- // Calculate the 3rd order (on-sided) gradient in the altitudinal direction // - this is only defined for the bottom ghostcells! @@ -232,23 +440,27 @@ std::vector calc_gradient_cubesphere(arma_cube value, Grid grid) { // Only update interior cells // May vectorize for future improvements - if (nGCs >= - 2) { // if more than 1 nGCs, we do fourth order, some foolproofing in case we go into debug hell + // if more than 1 nGCs, we do fourth order, some foolproofing in case we go into debug hell + if (nGCs >= 2) { for (int j = nGCs; j < nYs - nGCs; j++) { for (int i = nGCs; i < nXs - nGCs; i++) { - grad_x_curr(i, j) = (-curr_value(i + 2, j) + 8 * curr_value(i + 1, - j) - 8 * curr_value(i - 1, j) + curr_value(i - 2, j)) * (1. / 12. / dx); - grad_y_curr(i, j) = (-curr_value(i, j + 2) + 8 * curr_value(i, - j + 1) - 8 * curr_value(i, j - 1) + curr_value(i, j - 2)) * (1. / 12. / dy); + grad_x_curr(i, j) = (-curr_value(i + 2, j) + + 8 * curr_value(i + 1, j) - + 8 * curr_value(i - 1, j) + + curr_value(i - 2, j)) * (1. / 12. / dx); + grad_y_curr(i, j) = (-curr_value(i, j + 2) + + 8 * curr_value(i, j + 1) - + 8 * curr_value(i, j - 1) + + curr_value(i, j - 2)) * (1. / 12. / dy); } } } else { // otherwise we do second order for (int j = nGCs; j < nYs - nGCs; j++) { for (int i = nGCs; i < nXs - nGCs; i++) { - grad_x_curr(i, j) = (curr_value(i + 1, j) - curr_value(i - 1, - j)) * (1. / 2. / dx); - grad_y_curr(i, j) = (curr_value(i, j + 1) - curr_value(i, - j - 1)) * (1. / 2. / dy); + grad_x_curr(i, j) = (curr_value(i + 1, j) - + curr_value(i - 1, j)) * (1. / 2. / dx); + grad_y_curr(i, j) = (curr_value(i, j + 1) - + curr_value(i, j - 1)) * (1. / 2. / dy); } } } From a5dcfb23e7f3e08ac7c33dc35fbf56692a230b29 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 21:52:25 -0500 Subject: [PATCH 363/691] FEAT: moved grid spacing to its own file --- src/fill_grid.cpp | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 4377a90c..2e0b2418 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -285,7 +285,6 @@ void Grid::calc_gravity(Planets planet) { // *this is the grid class.... gravity_vcgc = calc_gradient_vector(gravity_potential_scgc, *this); - gravity_vcgc[0] = - gravity_vcgc[0]; gravity_vcgc[1] = - gravity_vcgc[1]; gravity_vcgc[2] = - gravity_vcgc[2]; @@ -293,7 +292,6 @@ void Grid::calc_gravity(Planets planet) { gravity_vcgc[0] % gravity_vcgc[0] + gravity_vcgc[1] % gravity_vcgc[1] + gravity_vcgc[2] % gravity_vcgc[2]); - report.exit(function); return; } @@ -302,15 +300,9 @@ void Grid::calc_gravity(Planets planet) { // Fill in XYZ in geo and mag coordinates // ----------------------------------------------------------------------------- -void Grid::calc_grid_spacing_old(Planets planet) { +void Grid::calc_xyz(Planets planet) { int64_t iLon, iLat, iAlt; - report.print(3, "starting calc_grid_spacing"); - - calc_alt_grid_spacing(); - calc_lat_grid_spacing(); - calc_long_grid_spacing(); - std::vector lon_lat_radius; lon_lat_radius.push_back(geoLon_scgc); lon_lat_radius.push_back(geoLat_scgc); From e49024e46fd409c1fee93cf0511ac7ad0c221e9c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 21:59:26 -0500 Subject: [PATCH 364/691] FEAT: 2nd order and 4th order gradients in the native directions --- include/solvers.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/solvers.h b/include/solvers.h index 35b8a64b..02e805e7 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -90,6 +90,16 @@ std::vector calc_gradient_cubesphere(arma_cube value, Grid grid); arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid); arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt); +// Calculate 4th-order gradients in the native coordinate system: +arma_cube calc_gradient4o_i(arma_cube value, Grid grid); +arma_cube calc_gradient4o_j(arma_cube value, Grid grid); +arma_cube calc_gradient4o_k(arma_cube value, Grid grid); + +// Calculate 2nd-order gradients in the native coordinate system: +arma_cube calc_gradient2o_i(arma_cube value, Grid grid); +arma_cube calc_gradient2o_j(arma_cube value, Grid grid); +arma_cube calc_gradient2o_k(arma_cube value, Grid grid); + // interpolation in 1D precision_t linear_interpolation(const precision_t y0, const precision_t y1, From b81a5f3b5e58291e6805fe85148700c04671e0ff Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:00:06 -0500 Subject: [PATCH 365/691] FEAT: functions having to do with the spherical grid --- src/grid_sphere.cpp | 236 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 src/grid_sphere.cpp diff --git a/src/grid_sphere.cpp b/src/grid_sphere.cpp new file mode 100644 index 00000000..41b6f2f4 --- /dev/null +++ b/src/grid_sphere.cpp @@ -0,0 +1,236 @@ +// Copyright 2025, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include "aether.h" + + +// ---------------------------------------------------------------------- +// Create connectivity between the nodes for message passing for sphere +// ---------------------------------------------------------------------- + +void Grid::create_sphere_connection(Quadtree quadtree) { + + std::string function = "Grid::create_sphere_connection"; + static int iFunction = -1; + report.enter(function, iFunction); + + IsLatLonGrid = true; + + // Get some coordinates and sizes in normalized coordinates: + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec middle_norm = quadtree.get_vect("MID"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + // Move to the next block in 4 directions: + arma_vec down_norm = middle_norm - 0.51 * size_up_norm; + arma_vec up_norm = middle_norm + 0.51 * size_up_norm; + arma_vec left_norm = middle_norm - 0.51 * size_right_norm; + arma_vec right_norm = middle_norm + 0.51 * size_right_norm; + + // The first component could wrap around: + right_norm(0) = fmod(right_norm(0), quadtree.limit_high(0)); + left_norm(0) = fmod((left_norm(0) + quadtree.limit_high(0)), + quadtree.limit_high(0)); + + // These should be the exact edge of the face. + // The from and to processors should get these in the same place, + // so they can be used to match which processor to send / receive info + edge_Xp = middle_norm + size_right_norm / 2.0; + // wrap in longitude: + edge_Xp(0) = fmod(edge_Xp(0), quadtree.limit_high(0)); + edge_Xm = middle_norm - size_right_norm / 2.0; + edge_Yp = middle_norm + size_up_norm / 2.0; + edge_Ym = middle_norm - size_up_norm / 2.0; + + iProcYm = quadtree.find_point(down_norm) + iMember * nGrids; + iProcYp = quadtree.find_point(up_norm) + iMember * nGrids; + iProcXm = quadtree.find_point(left_norm) + iMember * nGrids; + iProcXp = quadtree.find_point(right_norm) + iMember * nGrids; + + iRoot = quadtree.find_root(middle_norm); + iRootYm = quadtree.find_root(down_norm); + iRootYp = quadtree.find_root(up_norm); + iRootXm = quadtree.find_root(left_norm); + iRootXp = quadtree.find_root(right_norm); + + // Check if touching South Pole: + if (lower_left_norm(1) == quadtree.limit_low(1)) { + DoesTouchSouthPole = true; + + // edges need to be adjusted to deal with longitudes, since the + // pole will 180deg different for the from and to processors + if (edge_Ym(0) < 1.0) + edge_Ym(0) += 0.5; + else + edge_Ym(0) -= 0.5; + } + + // Check if touching North Pole: + if (lower_left_norm(1) + size_up_norm(1) == quadtree.limit_high(1)) { + DoesTouchNorthPole = true; + + // edge need to be adjusted to deal with longitudes, since the + // pole will 180deg different for the from and to processors + if (edge_Yp(0) < 1.0) + edge_Yp(0) += 0.5; + else + edge_Yp(0) -= 0.5; + } + + if (report.test_verbose(2)) + std::cout << "connectivity : " + << " iProc : " << iProc << "\n" + << " isnorth : " << DoesTouchNorthPole << "\n" + << " issouth : " << DoesTouchSouthPole << "\n" + << " iProcYm : " << iProcYm << "\n" + << " iProcYp : " << iProcYp << "\n" + << " iProcXm : " << iProcXm << "\n" + << " iProcXp : " << iProcXp << "\n"; + + report.exit(function); + return; +} + +// ---------------------------------------------------------------------- +// Create a spherical grid with lon/lat/alt coordinates +// ---------------------------------------------------------------------- + +void Grid::create_sphere_grid(Quadtree quadtree) { + + std::string function = "Grid::create_simple_lat_lon_alt_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t iLon, iLat, iAlt; + + // Get some coordinates and sizes in normalized coordinates: + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); + precision_t lon0 = lower_left_norm(0) * cPI; + arma_vec lon1d(nLons); + + // if we are not doing anything in the lon direction, then set dlon to + // something reasonable: + if (!HasXdim) + dlon = 1.0 * cDtoR; + + // Longitudes: + // - Make a 1d vector + // - copy it into the 3d cube + for (iLon = 0; iLon < nLons; iLon++) + lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; + + for (iLat = 0; iLat < nLats; iLat++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + i_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; + } + } + + precision_t dlat = size_up_norm(1) * cPI / (nLats - 2 * nGCs); + precision_t lat0 = lower_left_norm(1) * cPI; + arma_vec lat1d(nLats); + + // if we are not doing anything in the lat direction, then set dlat to + // something reasonable: + if (!HasYdim) + dlat = 1.0 * cDtoR; + + // Latitudes: + // - Make a 1d vector + // - copy it into the 3d cube + for (iLat = 0; iLat < nLats; iLat++) + lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; + + for (iLon = 0; iLon < nLons; iLon++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + j_center_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + } + } + + arma_cube cos_lat = cos(geoLat_scgc); + cos_lat.elem( find(cos_lat < 0.00001) ).fill(0.00001); + + y_Center = geoLat_scgc; + x_Center = geoLon_scgc % cos_lat; + cell_area = dlat * dlon * cos_lat; + + // --------------------------------------------- + // Left Sides - edges on left side (no offset left) + // --------------------------------------------- + arma_mat lat2d_left(nLons + 1, nLats); + arma_mat lon2d_left(nLons + 1, nLats); + + for (iLat = 0; iLat < nLats; iLat++) { + for (iLon = 0; iLon < nLons + 1; iLon++) { + lat2d_left(iLon, iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; + lon2d_left(iLon, iLat) = lon0 + (iLon - nGCs) * dlon; + } + } + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLon_Left.slice(iAlt) = lon2d_left; + geoLat_Left.slice(iAlt) = lat2d_left; + i_edge_scgc.slice(iAlt) = lon2d_left; + } + + arma_cube cos_lat_L = cos(geoLat_Left); + cos_lat_L.elem( find(cos_lat_L < 0.00001) ).fill(0.00001); + + x_Left = geoLon_Left % cos_lat_L; + dy_Left.set_size(nLons, nLats, nAlts); + dy_Left.fill(dlat); + + // --------------------------------------------- + // Down Sides - edges on down side (no offset lat) + // --------------------------------------------- + arma_mat lat2d_down(nLons, nLats + 1); + arma_mat lon2d_down(nLons, nLats + 1); + + for (iLat = 0; iLat < nLats + 1; iLat++) { + for (iLon = 0; iLon < nLons; iLon++) { + lat2d_down(iLon, iLat) = lat0 + (iLat - nGCs) * dlat; + lon2d_down(iLon, iLat) = lon0 + (iLon - nGCs + 0.5) * dlon; + } + } + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + geoLon_Down.slice(iAlt) = lon2d_down; + geoLat_Down.slice(iAlt) = lat2d_down; + j_edge_scgc.slice(iAlt) = lat2d_down; + } + + arma_cube cos_lat_D = cos(geoLat_Down); + cos_lat_D.elem( find(cos_lat_D < 0.00001) ).fill(0.00001); + + y_Down = geoLat_Down; + dx_Down = dlon * cos_lat_D; + + // --------------------------------------------- + // Corner Sides - corner (no offset lat or lon) + // --------------------------------------------- + arma_mat lat2d_corner(nLons + 1, nLats + 1); + arma_mat lon2d_corner(nLons + 1, nLats + 1); + + for (iLat = 0; iLat < nLats + 1; iLat++) { + for (iLon = 0; iLon < nLons + 1; iLon++) { + lat2d_corner(iLon, iLat) = lat0 + (iLat - nGCs) * dlat; + lon2d_corner(iLon, iLat) = lon0 + (iLon - nGCs) * dlon; + } + } + + for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { + geoLon_Corner.slice(iAlt) = lon2d_corner; + geoLat_Corner.slice(iAlt) = lat2d_corner; + i_corner_scgc.slice(iAlt) = lon2d_corner; + j_corner_scgc.slice(iAlt) = lat2d_corner; + } + + report.exit(function); + return; +} From a568ef8b97931943a4fd924299ecc6efc7b60191 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:01:05 -0500 Subject: [PATCH 366/691] FEAT: display a vector with a string in front --- include/tools.h | 6 ++++++ src/tools.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/tools.h b/include/tools.h index edc1f379..e780e31b 100644 --- a/include/tools.h +++ b/include/tools.h @@ -65,6 +65,12 @@ std::string add_cmember(std::string inString); void display_vector(arma_vec vec); +// ---------------------------------------------------------------------- +// Display an armadillo vector with a strong name in front +// ---------------------------------------------------------------------- + +void display_vector(std::string, arma_vec vec); + // ---------------------------------------------------------------------- // synchronize a (boolean) variable across all processors // ---------------------------------------------------------------------- diff --git a/src/tools.cpp b/src/tools.cpp index 4a7635d7..26a8a113 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -159,6 +159,18 @@ void display_vector(arma_vec vec) { std::cout << "\n"; } +// ---------------------------------------------------------------------------- +// Neatly display an armadillo vector with a name +// ---------------------------------------------------------------------------- + +void display_vector(std::string name, arma_vec vec) { + std::cout << name << " "; + for (int64_t i = 0; i < vec.n_rows; i++) + std::cout << vec(i) << " "; + + std::cout << "\n"; +} + // ---------------------------------------------------------------------------- // synchronize a (boolean) variable across all processors // ---------------------------------------------------------------------------- From b6852f101bcc712219715de632c9e5bb63b8857e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:02:06 -0500 Subject: [PATCH 367/691] DOC: remove incorrect doc --- src/calc_ion_temperature.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index caf8cfe2..8db03280 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -137,7 +137,6 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, nGCs, false); - // The conduction solver gives Tnew-Told, so divide by dt conduction1d.clamp(200, 5000); species[iIon].temperature_scgc.tube(iLon, iLat) = conduction1d; } // Lats From 13a1b49fafd67f87de6001bd6ee267cf0562eb5c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:04:23 -0500 Subject: [PATCH 368/691] FEAT: density integrals corrected to new delta-variable names --- src/calc_neutral_derived.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index b470bbc7..62577a31 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -589,14 +589,14 @@ void Neutrals::calc_chapman(Grid grid) { for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { // dr is used here instead of dalt, since we only want the radial integration, while - // dalt is the integral along the 3rd dimension. + // dk is the spacing along the 3rd dimension. integral3d.slice(iAlt) = integral3d.slice(iAlt + 1) + species[iSpecies].density_scgc.slice(iAlt) % - grid.dr_lower_scgc.slice(iAlt + 1); + grid.dr_edge.slice(iAlt + 1); species[iSpecies].rho_alt_int_scgc.slice(iAlt) = species[iSpecies].rho_alt_int_scgc.slice(iAlt + 1) + species[iSpecies].density_scgc.slice(iAlt) % - grid.dalt_lower_scgc.slice(iAlt + 1); + grid.dk_edge_m.slice(iAlt + 1); } erfcy3d = (a + b * y3d) / (c + d * y3d + y3d % y3d); @@ -615,7 +615,7 @@ void Neutrals::calc_chapman(Grid grid) { for (iLon = 0; iLon < nLons ; iLon++) { for (iLat = 0; iLat < nLats ; iLat++) { - dAlt1d = grid.dr_lower_scgc.tube(iLon, iLat); + dAlt1d = grid.dr_edge.tube(iLon, iLat); sza1d = grid.sza_scgc.tube(iLon, iLat); integral1d = integral3d.tube(iLon, iLat); log_int1d = log_int3d.tube(iLon, iLat); From 5b7bb109c5dfee2579a42c5647260053afe49714 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:05:46 -0500 Subject: [PATCH 369/691] FEAT: rename grid and use invariant latitude --- src/electrodynamics.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/electrodynamics.cpp b/src/electrodynamics.cpp index 678fad4f..aa91450a 100644 --- a/src/electrodynamics.cpp +++ b/src/electrodynamics.cpp @@ -142,7 +142,7 @@ void Electrodynamics::set_all_indices_for_ie(Times time, // ----------------------------------------------------------------------------- bool Electrodynamics::update(Planets planet, - Grid gGrid, + Grid grid, Times time, Indices &indices, Ions &ions) { @@ -161,9 +161,9 @@ bool Electrodynamics::update(Planets planet, if (HaveElectrodynamicsFile || HaveFortranIe) { set_time(time.get_current()); - gGrid.calc_sza(planet, time); - gGrid.calc_gse(planet, time); - gGrid.calc_mlt(); + grid.calc_sza(planet, time); + grid.calc_gse(planet, time); + grid.calc_mlt(); #ifdef FORTRAN @@ -172,9 +172,9 @@ bool Electrodynamics::update(Planets planet, set_all_indices_for_ie(time, indices); // Need to do this every time step, since we are switching between geo and mag grids. - int nXs = gGrid.get_nX(); - int nYs = gGrid.get_nY(); - int64_t nZs = gGrid.get_nZ(); + int nXs = grid.get_nX(); + int nYs = grid.get_nY(); + int64_t nZs = grid.get_nZ(); ie_set_nxs(&nXs); ie_set_nys(&nYs); @@ -194,8 +194,8 @@ bool Electrodynamics::update(Planets planet, for (iZ = 0; iZ < nZs; iZ++) { report.print(5, "Looping through Altitudes..."); - copy_mat_to_array(gGrid.magLocalTime_scgc.slice(iZ), mlt2d, true); - copy_mat_to_array(gGrid.magLat_scgc.slice(iZ), lat2d, true); + copy_mat_to_array(grid.magLocalTime_scgc.slice(iZ), mlt2d, true); + copy_mat_to_array(grid.magInvLat_scgc.slice(iZ), lat2d, true); ie_set_mlts(mlt2d, &iError); if (iError != 0) { @@ -262,8 +262,8 @@ bool Electrodynamics::update(Planets planet, if (HaveElectrodynamicsFile) { report.print(3, "Setting electrodynamics from file!"); auto electrodynamics_values = - get_electrodynamics(gGrid.magLat_scgc, - gGrid.magLocalTime_scgc); + get_electrodynamics(grid.magInvLat_scgc, + grid.magLocalTime_scgc); ions.potential_scgc = std::get<0>(electrodynamics_values); ions.eflux = std::get<1>(electrodynamics_values); ions.avee = std::get<2>(electrodynamics_values); From 2c321344fdf002f922073bc0e1df1775302874db Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:06:17 -0500 Subject: [PATCH 370/691] FEAT: initialize all of the new variables --- src/grid.cpp | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/src/grid.cpp b/src/grid.cpp index 001ebd99..f074d4b7 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -153,6 +153,7 @@ Grid::Grid(std::string gridtype) { magLon_scgc.set_size(nX, nY, nZ); magLat_scgc.set_size(nX, nY, nZ); magAlt_scgc.set_size(nX, nY, nZ); + magInvLat_scgc.set_size(nX, nY, nZ); magPhi_scgc.set_size(nX, nY, nZ); magP_scgc.set_size(nX, nY, nZ); @@ -193,7 +194,46 @@ Grid::Grid(std::string gridtype) { dalt_lower_scgc.set_size(nX, nY, nZ); dalt_ratio_scgc.set_size(nX, nY, nZ); dalt_ratio_sq_scgc.set_size(nX, nY, nZ); - dr_lower_scgc.set_size(nX, nY, nZ); + dr_edge.set_size(nX, nY, nZ); + + i_center_scgc.set_size(nX, nY, nZ); + j_center_scgc.set_size(nX, nY, nZ); + k_center_scgc.set_size(nX, nY, nZ); + i_edge_scgc.set_size(nX + 1, nY, nZ); + j_edge_scgc.set_size(nX, nY + 1, nZ); + k_edge_scgc.set_size(nX, nY, nZ + 1); + i_corner_scgc.set_size(nX + 1, nY + 1, nZ + 1); + j_corner_scgc.set_size(nX + 1, nY + 1, nZ + 1); + k_corner_scgc.set_size(nX + 1, nY + 1, nZ + 1); + + di_center_scgc.set_size(nX, nY, nZ); + dj_center_scgc.set_size(nX, nY, nZ); + dk_center_scgc.set_size(nX, nY, nZ); + + di_center_m_scgc.set_size(nX, nY, nZ); + dj_center_m_scgc.set_size(nX, nY, nZ); + dk_center_m_scgc.set_size(nX, nY, nZ); + + di_edge.set_size(nX, nY, nZ); + di_edge_m.set_size(nX, nY, nZ); + // For stretched grids along i: + di_ratio.set_size(nX, nY, nZ); + di_ratio_sq.set_size(nX, nY, nZ); + di_one_minus_r2.set_size(nX, nY, nZ); + + dj_edge.set_size(nX, nY, nZ); + dj_edge_m.set_size(nX, nY, nZ); + // For stretched grids along j: + dj_ratio.set_size(nX, nY, nZ); + dj_ratio_sq.set_size(nX, nY, nZ); + dj_one_minus_r2.set_size(nX, nY, nZ); + + dk_edge.set_size(nX, nY, nZ); + dk_edge_m.set_size(nX, nY, nZ); + // For stretched grids along k: + dk_ratio.set_size(nX, nY, nZ); + dk_ratio_sq.set_size(nX, nY, nZ); + dk_one_minus_r2.set_size(nX, nY, nZ); MeshCoef1s3rdp1.set_size(nX, nY, nGCs); MeshCoef1s3rdp2.set_size(nX, nY, nGCs); From dde7bc6cbb8eab3252cb17c21a5eafff33d54054 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:07:27 -0500 Subject: [PATCH 371/691] BUG: should return true for ok and false for bad --- src/ions.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ions.cpp b/src/ions.cpp index 081f47a3..68076df6 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -262,17 +262,17 @@ void Ions::nan_test(std::string variable) { //---------------------------------------------------------------------- bool Ions::check_for_nonfinites() { - bool non_finites_exist = false; + bool didWork = true; if (!all_finite(density_scgc, "density_scgc") || !all_finite(temperature_scgc, "temperature_scgc") || !all_finite(velocity_vcgc, "velocity_vcgc")) - non_finites_exist = true; + didWork = false; - if (non_finites_exist) + if (!didWork) throw std::string("Check for nonfinites failed!!!\n"); - return non_finites_exist; + return didWork; } // ----------------------------------------------------------------------------- From cf1a996805a6c792526aa73d26947d5994ff66d4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:08:06 -0500 Subject: [PATCH 372/691] FEAT: check if initial values are ok --- src/main/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index aa5f465a..692c8b90 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -103,7 +103,6 @@ int main() { throw std::string("init_dipole_grid failed!"); } else { - std::cout << "Making Spherical Magnetic Grid\n"; mGrid.set_IsDipole(false); didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); @@ -131,7 +130,11 @@ int main() { if (input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites("After Inputs"); + if (!didWork) + throw std::string("NaNs found in Neutrals in Initialize!\n"); didWork = ions.check_for_nonfinites(); + if (!didWork) + throw std::string("NaNs found in Ions in Initialize!\n"); } // ----------------------------------------------------------------- From 6f396a89358d53411b104394de0fd1cac0df5259 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:08:37 -0500 Subject: [PATCH 373/691] lower changed to edge --- src/neutrals.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 78f84fc9..9e11889a 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -264,7 +264,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, temperature_scgc.slice(iAlt - 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dr_lower_scgc.slice(iAlt) / + exp(-grid.dr_edge.slice(iAlt) / species[iSpecies].scale_height_scgc.slice(iAlt)); } } @@ -289,7 +289,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iSpecies, temperature_scgc.slice(iAlt - 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dr_lower_scgc.slice(iAlt) / + exp(-grid.dr_edge.slice(iAlt) / species[iSpecies].scale_height_scgc.slice(iAlt)); } From c2e8c2cb75ddbc4b5272ac5339d6dcef08c5e32f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 10 Jan 2025 22:09:03 -0500 Subject: [PATCH 374/691] STY: spacing --- src/neutrals_ics.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index e66ba51d..619451b0 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -162,21 +162,18 @@ bool Neutrals::initial_conditions(Grid grid, // Make the initial condition in the lower ghost cells to be consistent // with the actual lowwer BC: // Set the lower boundary condition: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.slice(0). fill(species[iSpecies].lower_bc_density); } - report.print(2, "Calculating scale height"); calc_scale_height(grid); report.print(2, "setting lower BCs"); set_lower_bcs(grid, time, indices); - report.print(2, "Filling with hydrostatic"); - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); - } // type = planet } From 51f6a3318f34e282b330e9ab18c4d7683b6e9557 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 13 Jan 2025 16:59:04 -0500 Subject: [PATCH 375/691] BUG: Fixx off-by-1 error in loops over ion species --- src/calc_electron_temperature.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index a74644be..9926ea5f 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -33,7 +33,7 @@ arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); -/// @brief Calculates electron-ion collisions +/// @brief Calculates electron-ion (elastic) collisional heating /// @details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003 /// - This differs slightly from the GITM implementation, which assumes several ion species are present. /// Instead, here we use each ion species for the sum. @@ -223,22 +223,22 @@ std::vector calc_electron_ion_collisions(Ions &ions){ // This is used when we calculate bulk ion temperature! // Use all species, not just major species (different from GITM) - for (int64_t iSpecies = 0; iSpecies < nSpecies - 1; iSpecies++) { + for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { Qeicp += ions.species[iSpecies].density_scgc - / (ions.species[nSpecies].mass + ions.species[iSpecies].mass); + / (cME + ions.species[iSpecies].mass); } - Qeicp = Qeicp % ions.density_scgc * ions.species[nSpecies].mass * 3.0 * cKB + Qeicp = Qeicp % ions.density_scgc * cME * 3.0 * cKB % (ions.temperature_scgc - ions.electron_temperature_scgc) * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); } else{ // Individual ion temperatures: // Use all species, not just major species (different from GITM) - for (int64_t iSpecies = 0; iSpecies < nSpecies - 1; iSpecies++) { + for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { Qeicp += ions.species[iSpecies].density_scgc % (ions.species[iSpecies].temperature_scgc - ions.electron_temperature_scgc) - / (ions.species[nSpecies].mass + ions.species[iSpecies].mass); + / (cME + ions.species[iSpecies].mass); } Qeicp = Qeicp % ions.density_scgc * ions.species[nSpecies].mass * 3.0 * cKB From eb6c610e9f65b0c99f318c602aa629dab4ca1059 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 11:09:40 -0500 Subject: [PATCH 376/691] FEAT: Calculate e-/ion friction in collision function --- src/calc_electron_temperature.cpp | 35 ++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 9926ea5f..25d3c402 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -40,7 +40,7 @@ arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); /// - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5 /// - This is capable of handling BOTH the bulk & individual ion temperatures /// @param ions -/// @return Qeicp +/// @return vector std::vector calc_electron_ion_collisions(Ions &ions); @@ -67,9 +67,10 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { report.enter(function, iFunction); arma_cube epsilon, Qphe, QIonization; - // electron-ion collisions return a vector of cubes, one for Qe, one for Qi: + + // electron-ion collisions return a vector of cubes, one for Qe, one for Qi, one for friction: std::vector Qeic; - arma_cube Qeicm, Qeicp; + arma_cube Qeicm, Qeicp, Qeic_v; // Initialize everything to zero! @@ -79,6 +80,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { QIonization = epsilon; Qeicm = epsilon; Qeicp = epsilon; + Qeic_v = epsilon; // Needed for both ionization & photoelectron heating: @@ -99,8 +101,9 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { // electron-ion collisions if (input.get_do_electron_ion_collisional_heating()) { Qeic = calc_electron_ion_collisions(*this); - Qeicp = Qeic[0]; // Ions - Qeicm = Qeic[1]; // Electrons + Qeicp = Qeic[0]; + Qeicm = Qeic[1]; + Qeic_v = Qeic[2]; // Friction } @@ -216,12 +219,14 @@ std::vector calc_electron_ion_collisions(Ions &ions){ Qeicp.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); Qeicp.zeros(); arma_cube Qeicm = Qeicp; + // Friction things + arma_cube Qeic_v = Qeicp, dv2_ei = Qeicp; int64_t nSpecies = ions.nSpecies; if (input.get_do_calc_bulk_ion_temp()){ // This is used when we calculate bulk ion temperature! - + report.print(3, "Using bulk ion temperature for electron-ion collisions"); // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { Qeicp += ions.species[iSpecies].density_scgc @@ -234,6 +239,7 @@ std::vector calc_electron_ion_collisions(Ions &ions){ } else{ // Individual ion temperatures: + report.print(3, "Using individual ion temperatures for electron-ion collisions"); // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { Qeicp += ions.species[iSpecies].density_scgc @@ -241,11 +247,24 @@ std::vector calc_electron_ion_collisions(Ions &ions){ / (cME + ions.species[iSpecies].mass); } - Qeicp = Qeicp % ions.density_scgc * ions.species[nSpecies].mass * 3.0 * cKB + Qeicp = Qeicp % ions.density_scgc * cME * 3.0 * cKB * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); } - std::vector Qeic = {Qeicp, Qeicp % ions.electron_temperature_scgc}; + report.print(3, "Calculating frictional heating"); + + // delta velocity **2 btwn e- & ions: + // This uses the bulk ion velocity, not the individual ion velocity. + // (Different from GITM): Uses all species' densities (so just ne), not just o+, o2+, n2+, no+, n+ + for (int64_t iDir = 0; iDir < 3; iDir++) { + dv2_ei += pow(ions.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2); + } + Qeic_v = ions.density_scgc * cME % dv2_ei * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5) + % (ions.density_scgc); + + std::vector Qeic = {Qeicp, + Qeicp % ions.electron_temperature_scgc, + Qeic_v}; report.exit(function); From 4472be527e7b968038af6fdab8c7420a138bf1ee Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 11:12:34 -0500 Subject: [PATCH 377/691] FEAT: electron/neutral (elastic) collisions & friction > should these get saved in the `heating_electron_friction_scgc`, etc. variables? probably - And should we, instead, calculate these things elsewhere? --- include/inputs.h | 6 ++ src/calc_electron_temperature.cpp | 98 +++++++++++++++++++++++++++++++ src/inputs.cpp | 9 +++ 3 files changed, 113 insertions(+) diff --git a/include/inputs.h b/include/inputs.h index 91d93017..82c57588 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -453,6 +453,12 @@ class Inputs { **/ bool get_do_electron_ion_collisional_heating(); + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludeElectronNeutralCollisionalHeating"] + \param none + **/ + bool get_do_electron_neutral_collisional_heating(); + /********************************************************************** \brief returns settings[" \param diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 25d3c402..31ea8efc 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -44,6 +44,14 @@ arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); std::vector calc_electron_ion_collisions(Ions &ions); +/// @brief Calculates electron-neutral elastic collisional heating +/// @details From Schunk and Nagy 2009 +/// @param ions +/// @param neutrals +/// @return vector +std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &neutrals); + + // -------------------------------------------------------------------------- // Heating terms: // - [x] photoelectrons @@ -71,6 +79,10 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { // electron-ion collisions return a vector of cubes, one for Qe, one for Qi, one for friction: std::vector Qeic; arma_cube Qeicm, Qeicp, Qeic_v; + + // (elastic) Electron-neutral collisions: + std::vector Qenc; + arma_cube Qencm, Qencp, Qenc_v; // Initialize everything to zero! @@ -81,6 +93,11 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { Qeicm = epsilon; Qeicp = epsilon; Qeic_v = epsilon; + Qencm = epsilon; + Qencp = epsilon; + Qenc_v = epsilon; + + report.print(4, "Calculating epsilon"); // Needed for both ionization & photoelectron heating: @@ -106,6 +123,15 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { Qeic_v = Qeic[2]; // Friction } + report.print(4, "Calculating electron-neutral collisions"); + + // electron-neutral collisions + if (input.get_do_electron_neutral_collisional_heating()) { + Qenc = calc_electron_neutral_collisions(*this, neutrals); + Qencp = Qenc[0]; + Qencm = Qenc[1]; + Qenc_v = Qenc[2]; // Friction + } electron_temperature_scgc = neutrals.temperature_scgc; @@ -269,4 +295,76 @@ std::vector calc_electron_ion_collisions(Ions &ions){ report.exit(function); return Qeic; +} + +// -------------------------------------------------------------------------- +// Calculate electron-neutral collisions +// -------------------------------------------------------------------------- +std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &neutrals){ + + std::string function = "calc_electron_neutral_collisions"; + static int iFunction = -1; + report.enter(function, iFunction); + + // initialize & zero the quantities we need: + arma_cube Qenc; + Qenc.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qenc.zeros(); + arma_cube Qencp = Qenc; + arma_cube Qencm = Qenc; + // frictional things: + arma_cube dv2_en = Qenc; + arma_cube Qenc_v = Qenc; + + int64_t inO2 = neutrals.get_species_id("O2"); + int64_t inN2 = neutrals.get_species_id("N2"); + int64_t inO = neutrals.get_species_id("O"); + + Qenc = ions.density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - ions.electron_temperature_scgc) + % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 + % (1 - 1.21e-4 * ions.electron_temperature_scgc) + % ions.electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 + % (1 + 3.60e-2 * pow(ions.electron_temperature_scgc, 0.5)) + % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 + % (1 + 5.70e-4 * ions.electron_temperature_scgc) + % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) + ); + + Qencp = ions.density_scgc * cME * 3.0 * cKB + % ((2.33e-11*neutrals.species[inN2].density_scgc*1.e-6 + % (1 - 1.21e-4*ions.electron_temperature_scgc) + % ions.electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 + % (1 + 3.60e-2 * pow(ions.electron_temperature_scgc, 0.5)) + % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 + % (1 + 5.70e-4*ions.electron_temperature_scgc) + % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) + ); + + // delta velocity **2 btwn e- & neutrals: + for (int64_t iDir = 0; iDir < 3; iDir++) { + dv2_en += pow(neutrals.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2); + } + + + Qenc_v = ions.density_scgc * cME % dv2_en + %(2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 + % (1 - 1.21e-4 * ions.electron_temperature_scgc) % ions.electron_temperature_scgc * neutrals.species[inN2].mass + /(cME + neutrals.species[inN2].mass) + + 1.82e-10*neutrals.species[inO2].density_scgc*1.e-6%(1 + 3.60e-2*pow(ions.electron_temperature_scgc, 0.5)) + % pow(ions.electron_temperature_scgc, 0.5) *neutrals.species[inO2].mass + /(cME + neutrals.species[inO2].mass) + + 8.90e-11*neutrals.species[inO].density_scgc*1.e-6%(1 + 5.70e-4*ions.electron_temperature_scgc) + %pow(ions.electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass) + ); + + + Qencm = Qencp % neutrals.temperature_scgc; + + report.exit(function); + + return std::vector {Qencp, Qencm, Qenc_v}; } \ No newline at end of file diff --git a/src/inputs.cpp b/src/inputs.cpp index 781b5415..a9134abf 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -779,6 +779,15 @@ bool Inputs::get_do_electron_ion_collisional_heating() { return get_setting_bool("Sources", "Ions", "IncludeElectronIonCollisionalHeating"); } +// ----------------------------------------------------------------------- +// Return whether to include electron-neutral collisional heating +// ----------------------------------------------------------------------- + +bool Inputs::get_do_electron_neutral_collisional_heating() { + return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralCollisionalHeating"); +} + + // ----------------------------------------------------------------------- // Return centripetal acceleration // ----------------------------------------------------------------------- From 97409ac710b4f9e10e173a295659e21666931bef Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 11:13:17 -0500 Subject: [PATCH 378/691] DOC: Add more debugging info & better comments in cet --- src/calc_electron_temperature.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 31ea8efc..59447827 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -74,6 +74,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { static int iFunction = -1; report.enter(function, iFunction); + // Photoelectron, (all) ionization heating terms: arma_cube epsilon, Qphe, QIonization; // electron-ion collisions return a vector of cubes, one for Qe, one for Qi, one for friction: @@ -99,22 +100,28 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { report.print(4, "Calculating epsilon"); - + // Needed for both ionization & photoelectron heating: if (input.get_do_ionization_heating() || input.get_do_photoelectron_heating()) { epsilon = calc_epsilon(neutrals, *this); } + report.print(4, "Calculating photoelectron heating"); + // Photoelectron heating if (input.get_do_photoelectron_heating()) { Qphe = calc_photoelectron_heating(*this, epsilon); } + report.print(4, "Calculating ionization heating"); + // Ionization heating (includes all ionization sources) if (input.get_do_ionization_heating()) { QIonization = calc_ionization_heating(*this, epsilon); } + report.print(4, "Calculating electron-ion collisions"); + // electron-ion collisions if (input.get_do_electron_ion_collisional_heating()) { Qeic = calc_electron_ion_collisions(*this); @@ -367,4 +374,4 @@ std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &ne report.exit(function); return std::vector {Qencp, Qencm, Qenc_v}; -} \ No newline at end of file + } \ No newline at end of file From b38bde0323db2015e3a9bb346d7f1a4a7f47296a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 11:27:58 -0500 Subject: [PATCH 379/691] FEAT: Improve how cet & init_ion temp check for required neutral species --- include/ions.h | 5 ----- src/calc_electron_temperature.cpp | 8 ++++++++ src/calc_ion_temperature.cpp | 23 +++++++++-------------- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/include/ions.h b/include/ions.h index d8e09987..8ab6ef60 100644 --- a/include/ions.h +++ b/include/ions.h @@ -175,11 +175,6 @@ class Ions { /// Heat Conduction (bulk): arma_cube lambda; - /// Electron temperature calculations need to know if some neutral species are present - bool has_nO; - bool has_nO2; - bool has_nN2; - // Electrodynamics: /// Electric potential: arma_cube potential_scgc; diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 59447827..5d744188 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -160,6 +160,10 @@ arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { int64_t inO2 = neutrals.get_species_id("O2"); int64_t inN2 = neutrals.get_species_id("N2"); int64_t inO = neutrals.get_species_id("O"); + + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + report.error("Could not find O, N2, or O2 in neutrals species list"); + } arma_cube epsilon, x, logx; @@ -327,6 +331,10 @@ std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &ne int64_t inN2 = neutrals.get_species_id("N2"); int64_t inO = neutrals.get_species_id("O"); + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + report.error("Could not find O, N2, or O2 in neutrals species list"); + } + Qenc = ions.density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - ions.electron_temperature_scgc) % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 % (1 - 1.21e-4 * ions.electron_temperature_scgc) diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 8d0aad8b..132df899 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -28,20 +28,15 @@ void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { temperature_scgc = neutrals.temperature_scgc; // For electron temperature, we need to check if some species are present or not. - // Do this check now & set a bool or vector: - bool has_nO = false; - bool has_nO2 = false; - bool has_nN2 = false; - - if (neutrals.get_species_id("O") > -1) - has_nO = true; - if (neutrals.get_species_id("O2") > -1) - has_nO2 = true; - if (neutrals.get_species_id("N2") > -1) - has_nN2 = true; - if ((!has_nO && !has_nO2 && !has_nN2) - && (input.get_do_photoelectron_heating() || input.get_do_ionization_heating())) { - report.error("Ion photoelectron & ionization heating require neutral O, O2, and N2 to be present."); + // Do this check now & warn if needed: + if ((neutrals.get_species_id("O") == -1) + || (neutrals.get_species_id("O2") == -1) + ||(neutrals.get_species_id("N2") == -1)){ + if (input.get_do_photoelectron_heating() + || input.get_do_ionization_heating() + || input.get_do_electron_neutral_collisional_heating()) { + report.error("Your electron temperature sources require neutral O, O2, and N2 to be present."); + } } return; From 293fb6c14b5136038e863868ffa0c603b362e4d2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 13:26:33 -0500 Subject: [PATCH 380/691] FEAT: Electron - neutral inelastic collsisions And change the name of the elastic collisions so they're separate... --- include/inputs.h | 11 +- src/calc_electron_temperature.cpp | 200 ++++++++++++++++++++++++++++-- src/calc_ion_temperature.cpp | 2 +- src/inputs.cpp | 13 +- 4 files changed, 212 insertions(+), 14 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 82c57588..2b87cf36 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -454,10 +454,17 @@ class Inputs { bool get_do_electron_ion_collisional_heating(); /********************************************************************** - \brief returns settings["Sources"]["Ions"]["IncludeElectronNeutralCollisionalHeating"] + \brief returns settings["Sources"]["Ions"]["IncludeElectronNeutralElasticCollisionalHeating"] \param none **/ - bool get_do_electron_neutral_collisional_heating(); + bool get_do_electron_neutral_elastic_collisional_heating(); + + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludeElectronNeutralInelasticCollisionalHeating"] + \param none + **/ + bool get_do_electron_neutral_inelastic_collisional_heating(); + /********************************************************************** \brief returns settings[" diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 5d744188..4d9a9684 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -49,7 +49,17 @@ std::vector calc_electron_ion_collisions(Ions &ions); /// @param ions /// @param neutrals /// @return vector -std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &neutrals); +std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals); + +/// @brief Calculates electron-neutral inelastic collisional heating +/// @details From Schunk and Nagy 2009 pages 277, 282. +/// This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration. +/// See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 +/// @param ions +/// @param neutrals +/// @return vector +std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals); + // -------------------------------------------------------------------------- @@ -132,14 +142,21 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { report.print(4, "Calculating electron-neutral collisions"); - // electron-neutral collisions - if (input.get_do_electron_neutral_collisional_heating()) { - Qenc = calc_electron_neutral_collisions(*this, neutrals); + // electron-neutral Elastic collisions + if (input.get_do_electron_neutral_elastic_collisional_heating()) { + Qenc = calc_electron_neutral_elastic_collisions(*this, neutrals); Qencp = Qenc[0]; Qencm = Qenc[1]; Qenc_v = Qenc[2]; // Friction } + // electron-neutral inelastic collisions + if (input.get_do_electron_neutral_inelastic_collisional_heating()) { + Qenc = calc_electron_neutral_inelastic_collisions(*this, neutrals); + Qencp = Qenc[0]; + Qencm = Qenc[1]; + Qenc_v = Qenc[2]; // Friction + } electron_temperature_scgc = neutrals.temperature_scgc; @@ -309,11 +326,11 @@ std::vector calc_electron_ion_collisions(Ions &ions){ } // -------------------------------------------------------------------------- -// Calculate electron-neutral collisions +// Calculate electron-neutral elastic collisions // -------------------------------------------------------------------------- -std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &neutrals){ +std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals){ - std::string function = "calc_electron_neutral_collisions"; + std::string function = "calc_electron_neutral_elastic_collisions"; static int iFunction = -1; report.enter(function, iFunction); @@ -382,4 +399,171 @@ std::vector calc_electron_neutral_collisions(Ions &ions, Neutrals &ne report.exit(function); return std::vector {Qencp, Qencm, Qenc_v}; - } \ No newline at end of file + } + +// -------------------------------------------------------------------------- +// Calculate electron-neutral inelasticcollisions +// -------------------------------------------------------------------------- +std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals){ + + std::string function = "calc_electron_neutral_inelastic_collisions"; + static int iFunction = -1; + report.enter(function, iFunction); + + // initialize & zero the quantities we need: + arma_cube Qrot; + Qrot.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qrot.zeros(); // N2, O2 roration (Shunk & Nagy pp. 277) + arma_cube Qrotp = Qrot; + arma_cube Qrotm = Qrot; + arma_cube Qf = Qrot; //fine structure heating rate (Shunk & Nagy pp. 282) + arma_cube Qfp = Qrot, Qfm = Qrot; + arma_cube Qexc = Qrot; // O(1D) exitation + arma_cube Qexcp = Qrot, Qexcm = Qrot; + arma_cube Qvib_O2 = Qrot; // O2 vibration + arma_cube logQ = Qrot, Qvib_O2p = Qrot, Qvib_O2m = Qrot; + arma_cube Qvib_N2 = Qrot; // N2 vibration (Pavlov, 1998a) + + int64_t inO2 = neutrals.get_species_id("O2"); + int64_t inN2 = neutrals.get_species_id("N2"); + int64_t inO = neutrals.get_species_id("O"); + + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + report.error("Could not find O, N2, or O2 in neutrals species list"); + } + + // some aliases for common quantities + arma_cube ne = ions.density_scgc; + arma_cube Te = ions.electron_temperature_scgc; + arma_cube Ti = ions.temperature_scgc; + arma_cube Tn = neutrals.temperature_scgc; + arma_cube no2 = neutrals.species[inO2].density_scgc; + arma_cube nn2 = neutrals.species[inN2].density_scgc; + arma_cube no = neutrals.species[inO].density_scgc; + + // Make sure (Ti && Te) > Tn everywhere (from GITM): + arma::uvec Ti_mask = find(Ti <= Tn); + arma::uvec Te_mask = find(Te <= Tn); + Ti.elem(Ti_mask) = Tn.elem(Ti_mask) * 1.0001; + Te.elem(Ti_mask) = Tn.elem(Te_mask) * 1.0001; + + // N2, O2 rotation (Shunk & Nagy pp. 277) + Qrot = 3.5e-14*ne*1.e-6%nn2*1.e-6%(Tn - Te)/(pow(Te,0.5)) + + 5.2e-15*ne*1.e-6%no2*1.e-6%(Tn - Te)/(pow(Te, 0.5)); + Qrot = Qrot*1.6e-13; // eV cm-3 s -> J m-3 + + Qrotp = 3.5e-14*ne*1.e-6%nn2*1.e-6/(pow(Te,0.5)) // N2 + + 5.2e-15*ne*1.e-6%no2*1.e-6/(pow(Te, 0.5)); // O2 + Qrotp = Qrotp*1.6e-13; + Qrotm = Qrotp%Tn; + + // fine strcture heating rate by Shunk and Nagy Page 282 + Qf = 0.0; + arma_cube Dfine = 5.0 + exp(-326.6/Tn) + 3.0 *exp(-227.7/Tn); + arma_cube s10 = 8.249e-16*pow(Te, 0.6) % exp(-227.7/Tn); + Qf = ne%no * 1.e-12/Dfine%(s10%(1.-exp(98.9*(1/Te - 1/Tn))) + + 1.191e-11*(1.-exp(326.6*(1/Te - 1/Tn))) + + 1.863e-11*(1.-exp(227.7*(1/Te - 1/Tn)))); + Qf = -Qf*1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 + + Qfp = 0.0; + Qfm = Qf; + + // O(1D) excitation + arma_cube te_exc = Te.clamp(0.0, 18000.0); + arma_cube dexc = 2.4e4 + 0.3*(te_exc - 1500.) - 1.947e-5*(te_exc - 1500.)%(te_exc - 4000.); + Qexc = 1.57e-12*ne%no*1.e-12%exp(dexc%(te_exc - 3000.)/3000./te_exc) + %(exp(-22713*(te_exc - Tn)/te_exc/Tn) - 1); + Qexc = Qexc*1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 + + Qexcp = 0.0; + Qexcm = Qexc; + + // O2 vibration: + + // Calculated differently from GITM, but the result is the same... + // GITM clamped e- temp before calculating, but that makles things really hard here. + // Instead we will use all Te's, and then limit the outputs after. + + arma_cube logQ = (5.0148e-31*pow(Te,9) - 1.5346e-26*pow(Te,8) + + 2.0127e-22*pow(Te,7) - 1.4791e-18*pow(Te,6) + + 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4) + + 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2) + + 0.0267*Te - 19.9171); + // GITM's Te_6000 was from 300 - 6000, which corresponds to ~-15.9 & 198.3 for logQ + // Mask the values outside of this range... + // TODO: Should we do it this way or just use the clamp? + logQ.clamp(-15.9, 198.273); + logQ.elem( find(logQ < -15.9) ).fill(-20.0); + + + Qvib_O2 = ne % no2 * 1.e-12 % exp10(logQ) % (1 - exp(2239. * (1. / Te - 1. / Tn))); + Qvib_O2 = -Qvib_O2*1.6e-13; + Qvib_O2p = 0.; + Qvib_O2m = Qvib_O2; + + + // N2 vibration from Pavlov 1998a + + // we'll use the same loop GITM uses: + arma_vec Av0 = {2.025, -7.066, -8.211, -9.713, -10.353, -10.819, -10.183, -12.698, -14.710, -17.538}; + arma_vec Bv0 = {8.782e-4, 1.001e-2, 1.092e-2, 1.204e-2, 1.243e-2, 1.244e-2, 1.185e-2, 1.309e-2, 1.409e-2, 1.6e-2}; + arma_vec Cv0 = {2.954e-7, -3.066e-6, -3.369e-6, -3.732e-6, -3.850e-6, -3.771e-6, -3.570e-6, -3.952e-6, -4.249e-6, -4.916e-6}; + arma_vec Dv0 = {-9.562e-11, 4.436e-10, 4.891e-10, 5.431e-10, 5.6e-10, 5.385e-10, 5.086e-10, 5.636e-10, 6.058e-10, 7.128e-10}; + arma_vec Fv0 = {7.252e-15, -2.449e-14, -2.706e-14, -3.008e-14, -3.1e-14, -2.936e-14, -2.769e-14, -3.071e-14, -3.3e-14, -3.941e-14}; + + precision_t Av0L = -6.462; + precision_t Bv0L = 3.151e-2; + precision_t Cv0L = -4.075e-5; + precision_t Dv0L = 2.439e-8; + precision_t Fv0L = -5.479e-12; + + arma_vec Av1 = {-3.413, -4.16, -5.193, -5.939, -8.261, -8.185, -10.823, -11.273}; + arma_vec Bv1 = {7.326e-3, 7.803e-3, 8.36e-3, 8.807e-3, 1.01e-2, 1.01e-2, 1.199e-2, 1.283e-2}; + arma_vec Cv1 = {-2.2e-6, -2.352e-6, -2.526e-6, -2.669e-6, -3.039e-6, -3.039e-6, -3.62e-6, -3.879e-6}; + arma_vec Dv1 = {3.128e-10, 3.352e-10, 3.606e-10, 3.806e-10, 4.318e-10, 4.318e-10, 5.159e-10, 5.534e-10}; + arma_vec Fv1 = {-1.702e-14, -1.828e-14, -1.968e-14, -2.073e-14, -2.347e-14, -2.347e-14, -2.81e-14, -3.016e-14}; + + arma_vec logQv0, logQv1; + logQv0.set_size(10); + logQv1.set_size(8); + + double tte; // since we need the min of this & 6000 & std::min can't accept precision_t + precision_t ttn, tte_6000; + + for (int64_t iLon = 0; iLon < ions.density_scgc.n_rows; iLon++) { //nLons + for (int64_t iLat = 0; iLat < ions.density_scgc.n_cols; iLat++) { // nLats + for (int64_t iAlt = 0; iAlt < ions.density_scgc.n_slices; iAlt++) { // nAlts + tte = Te(iLon, iLat, iAlt); + ttn = Tn(iLon, iLat, iAlt); + tte_6000 = std::min(tte, 6000.0); + logQv0 = -20.0; + logQv1 = -20.0; + + if (tte <= 1500 && tte > 300) { + logQv0(0) = Av0L + Bv0L * tte + Cv0L * pow(tte, 2) + Dv0L * pow(tte, 3) + Fv0L * pow(tte, 4) - 16.0; + Qvib_N2(iLon, iLat, iAlt) = (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(0)) + * (1.0 - exp(3353.0 * (1.0 / tte - 1.0 / ttn))); + } else if (tte > 1500) { + for (int iLevel = 0; iLevel < 10; iLevel++) { + logQv0(iLevel) = Av0(iLevel) + Bv0(iLevel) * tte_6000 + Cv0(iLevel) * pow(tte, 2) + + Dv0(iLevel) * pow(tte, 3) + Fv0(iLevel) * pow(tte, 4) - 16.0; + Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(0)) + * (1.0 - exp((iLevel + 1) * 3353.0 * (1.0 / tte - 1.0 / ttn))); + } + + for (int iLevel = 0; iLevel < 8; iLevel++) { + logQv1(iLevel) = Av1(iLevel) + Bv1(iLevel) * tte_6000 + Cv1(iLevel) * pow(tte_6000, 2) + + Dv1(iLevel) * pow(tte_6000, 3) + Fv1(iLevel) * pow(tte_6000, 4) - 16.0; + Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp(-3353.0 / ttn) + * exp10(logQv1(iLevel)) + * (1.0 - exp(iLevel * 3353.0 * (1.0 / tte - 1.0 / ttn))); + } + } + } + } + } + + Qvib_N2 = -ne % nn2 * 1.e-12 % Qvib_N2 * 1.6e-13; + + } diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 132df899..cf006481 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -34,7 +34,7 @@ void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { ||(neutrals.get_species_id("N2") == -1)){ if (input.get_do_photoelectron_heating() || input.get_do_ionization_heating() - || input.get_do_electron_neutral_collisional_heating()) { + || input.get_do_electron_neutral_elastic_collisional_heating()) { report.error("Your electron temperature sources require neutral O, O2, and N2 to be present."); } } diff --git a/src/inputs.cpp b/src/inputs.cpp index a9134abf..e20daf5e 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -780,13 +780,20 @@ bool Inputs::get_do_electron_ion_collisional_heating() { } // ----------------------------------------------------------------------- -// Return whether to include electron-neutral collisional heating +// Return whether to include electron-neutral elastic collisional heating // ----------------------------------------------------------------------- -bool Inputs::get_do_electron_neutral_collisional_heating() { - return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralCollisionalHeating"); +bool Inputs::get_do_electron_neutral_elastic_collisional_heating() { + return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralElasticCollisionalHeating"); } +// ----------------------------------------------------------------------- +// Return whether to include electron-neutral inelastic collisional heating +// ----------------------------------------------------------------------- + +bool Inputs::get_do_electron_neutral_inelastic_collisional_heating() { + return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralInelasticCollisionalHeating"); +} // ----------------------------------------------------------------------- // Return centripetal acceleration From 7b20346f70f16b9e9f8bee38ada3944709b26bd2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 14:35:33 -0500 Subject: [PATCH 381/691] BUG: inelastic collisions, etc. bugfixes in cet. now it compiles --- src/calc_electron_temperature.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 4d9a9684..caadcc79 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -95,6 +95,10 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { std::vector Qenc; arma_cube Qencm, Qencp, Qenc_v; + // Inelastic electron-neutral collisions: + std::vector Qenc_inelastic; + arma_cube Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2; + // Initialize everything to zero! epsilon.set_size(grid.get_nLons(), grid.get_nLats(), grid.get_nAlts()); @@ -152,10 +156,13 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { // electron-neutral inelastic collisions if (input.get_do_electron_neutral_inelastic_collisional_heating()) { - Qenc = calc_electron_neutral_inelastic_collisions(*this, neutrals); - Qencp = Qenc[0]; - Qencm = Qenc[1]; - Qenc_v = Qenc[2]; // Friction + Qenc_inelastic = calc_electron_neutral_inelastic_collisions(*this, neutrals); + Qrotm = Qenc_inelastic[0]; + Qrotp = Qenc_inelastic[1]; + Qf = Qenc_inelastic[2]; + Qexc = Qenc_inelastic[3]; + Qvib_O2 = Qenc_inelastic[4]; + Qvib_N2 = Qenc_inelastic[5]; } electron_temperature_scgc = neutrals.temperature_scgc; @@ -485,11 +492,11 @@ std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Ne // GITM clamped e- temp before calculating, but that makles things really hard here. // Instead we will use all Te's, and then limit the outputs after. - arma_cube logQ = (5.0148e-31*pow(Te,9) - 1.5346e-26*pow(Te,8) - + 2.0127e-22*pow(Te,7) - 1.4791e-18*pow(Te,6) - + 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4) - + 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2) - + 0.0267*Te - 19.9171); + logQ = (5.0148e-31*pow(Te,9) - 1.5346e-26*pow(Te,8) + + 2.0127e-22*pow(Te,7) - 1.4791e-18*pow(Te,6) + + 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4) + + 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2) + + 0.0267*Te - 19.9171); // GITM's Te_6000 was from 300 - 6000, which corresponds to ~-15.9 & 198.3 for logQ // Mask the values outside of this range... // TODO: Should we do it this way or just use the clamp? @@ -565,5 +572,6 @@ std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Ne } Qvib_N2 = -ne % nn2 * 1.e-12 % Qvib_N2 * 1.6e-13; - + + return std::vector {Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2}; } From 4e4c5bdb0b2cb20530f9b3184aa62e0a1ea2c432 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 16:01:42 -0500 Subject: [PATCH 382/691] FEAT: Add all e- temp sources to defaults.json --- share/run/UA/inputs/defaults.json | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index e4735e1b..e0f04590 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -104,7 +104,13 @@ "Coriolis" : true }, "Neutrals" : { "NO_cool" : false, - "O_cool": false } }, + "O_cool": false }, + "Ions":{ + "IncludePhotoElectronHeating": true, + "IncludeIonizationHeating": true, + "IncludeElectronIonCollisionalHeating":true, + "IncludeElectronNeutralElasticCollisionalHeating":true, + "IncludeElectronNeutralInelasticCollisionalHeating":true }, "Seed" : 0, From 1b371c8309a1a15d528f8a9f802d7959285e1eea Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 14 Jan 2025 16:07:00 -0500 Subject: [PATCH 383/691] FEAT: Template for thermoelectric current in cet.cpp --- src/calc_electron_temperature.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index caadcc79..75fa24fa 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -60,6 +60,11 @@ std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neut /// @return vector std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals); +/// @brief Calculate the thermoelectric current +/// @param ions +/// @param grid +/// @return arma_cube JParaAlt +std::vector calc_thermoelectric_current(Ions &ions, Grid &grid); // -------------------------------------------------------------------------- @@ -99,6 +104,9 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { std::vector Qenc_inelastic; arma_cube Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2; + // Thermoelectric Current + arma_cube JParaAlt; + // Initialize everything to zero! epsilon.set_size(grid.get_nLons(), grid.get_nLats(), grid.get_nAlts()); @@ -165,6 +173,9 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { Qvib_N2 = Qenc_inelastic[5]; } + // Thermoelectric current + + electron_temperature_scgc = neutrals.temperature_scgc; report.exit(function); @@ -575,3 +586,18 @@ std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Ne return std::vector {Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2}; } + +arma_cube calc_thermoelectric_current(Ions ions, Grid grid){ + + std::string function = "calc_thermoelectric_current"; + static int iFunction = -1; + report.enter(function, iFunction); + + arma_cube JuTotal = ions.density_scgc * cE; + + report.exit(function); + + return JuTotal; + + +} \ No newline at end of file From 1a20cd5c89cddcfb5290de3ac296939bdd543560 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 15 Jan 2025 11:41:40 -0500 Subject: [PATCH 384/691] BUG: Missing "}" in defaults.json --- share/run/UA/inputs/defaults.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index e0f04590..6443cb60 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -110,7 +110,8 @@ "IncludeIonizationHeating": true, "IncludeElectronIonCollisionalHeating":true, "IncludeElectronNeutralElasticCollisionalHeating":true, - "IncludeElectronNeutralInelasticCollisionalHeating":true }, + "IncludeElectronNeutralInelasticCollisionalHeating":true} + }, "Seed" : 0, From 2ec6d2588d4b000194feb8adec264c65b0334d69 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 17 Jan 2025 13:06:21 -0500 Subject: [PATCH 385/691] FEAT: Allow solver_conduction to use sources w linear dependence on `value` - especially useful for e- temp, where there are sources with & without dependence on temperature > This does not yet address the BC's. But that is doable now that we know how to use optional arguments w functions. --- include/solvers.h | 3 ++- src/solver_conduction.cpp | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/include/solvers.h b/include/solvers.h index 35b8a64b..4a6c9375 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -40,7 +40,8 @@ arma_vec solver_conduction( arma_vec dx, precision_t dt, int64_t nGCs, - bool return_diff); + bool return_diff = false, + arma_vec source2 = arma_vec()); arma_cube solver_chemistry(arma_cube density, arma_cube source, diff --git a/src/solver_conduction.cpp b/src/solver_conduction.cpp index 7616c7b2..4a3b041e 100644 --- a/src/solver_conduction.cpp +++ b/src/solver_conduction.cpp @@ -25,7 +25,9 @@ arma_vec solver_conduction(arma_vec value, arma_vec dx, precision_t dt, int64_t nGCs, - bool return_diff) { + bool return_diff, // (optional) False by default (return new `value`) + arma_vec source2 // (optional) Sources dependent on `value` + ) { int64_t nPts = value.n_elem; @@ -47,6 +49,12 @@ arma_vec solver_conduction(arma_vec value, arma_vec conduction(nPts); conduction.zeros(); + // If source2 is not given, set it to zero: + if (source2.n_elem == 0){ + source2.set_size(source.n_elem); + source2.zeros(); + } + int64_t i; for (i = nGCs; i < nPts - nGCs; i++) @@ -54,7 +62,7 @@ arma_vec solver_conduction(arma_vec value, arma_vec a = di / du22 % r - dl / du12 % r % r; arma_vec c = di / du22 + dl / du12; - arma_vec b = -1.0 / m - di / du22 % (1.0 + r) - dl / du12 % (1.0 - r % r); + arma_vec b = -1.0 / m - di / du22 % (1.0 + r) - dl / du12 % (1.0 - r % r) + source2 % front * dt; arma_vec d = -1.0 * (value / m + source % front * dt); // Lower BCs (fixed value): From 3de1996ce8b52480c39138bb10da99f433838ae3 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 17 Jan 2025 13:08:53 -0500 Subject: [PATCH 386/691] FEAT: pass time into calc_e- temp so it can use solver_conduction --- include/ions.h | 3 ++- src/advance.cpp | 2 +- src/calc_electron_temperature.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/ions.h b/include/ions.h index 8ab6ef60..7f507900 100644 --- a/include/ions.h +++ b/include/ions.h @@ -348,8 +348,9 @@ class Ions { \brief Calculates the electron temperature on the given grid \param neutrals these are needed for the collision terms \param grid this is the grid to solve the equation on + \param time the time class to know dt **/ - void calc_electron_temperature(Neutrals neutrals, Grid grid); + void calc_electron_temperature(Neutrals neutrals, Grid grid, Times time); /********************************************************************** \brief Check all of the variables for nonfinites, such as nans diff --git a/src/advance.cpp b/src/advance.cpp index 4c051867..4e81d5e2 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -200,7 +200,7 @@ bool advance(Planets &planet, } ions.calc_ion_temperature(neutrals, gGrid, time); - ions.calc_electron_temperature(neutrals, gGrid); + ions.calc_electron_temperature(neutrals, gGrid, time); //ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); //ionsMag.calc_electron_temperature(neutralsMag, mGrid); diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 75fa24fa..713562db 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -83,7 +83,7 @@ std::vector calc_thermoelectric_current(Ions &ions, Grid &grid); // TODO (#24): this currently just sets the electron temperature to the neutral temperature // -------------------------------------------------------------------------- -void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid) { +void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { std::string function = "Ions::calc_electron_temperature"; static int iFunction = -1; From 90d7fbfd4467780071a846e90c7df1cf4c7a32f4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 17 Jan 2025 13:12:59 -0500 Subject: [PATCH 387/691] STY: Move e- temp functions to ions.h, other cleanup --- include/ions.h | 64 ++++++++++++++++ src/calc_electron_temperature.cpp | 118 +++++++----------------------- 2 files changed, 92 insertions(+), 90 deletions(-) diff --git a/include/ions.h b/include/ions.h index 7f507900..e67d4fd4 100644 --- a/include/ions.h +++ b/include/ions.h @@ -352,6 +352,70 @@ class Ions { **/ void calc_electron_temperature(Neutrals neutrals, Grid grid, Times time); + /********************************************************************** + /// @brief Calculate epsilon + /// @details intermediate variable used in photoelectron & ionization heating + /// From (Smithro & Solomon, 2008). + /// @param neutrals + /// @param ions + /// @return epsilon + **/ + arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions); + + /********************************************************************** + \brief Calculates photoelectron heating + \details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) + Uses equations 9-12 from (Zhu & Ridley, 2016) + https://doi.org/10.1016/j.jastp.2016.01.005 + \param ions + \param epsilon + \return Qphe + **/ + arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); + + /********************************************************************** + \brief Calculates auroral heating + \details NOTE: in GITM this is solved separately for ion precipitation & auroral + ionization. In Aether these are both in ions.species[iIon].ionization_scgc... + \param ions + \param epsilon + \return Qaurora + **/ + arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); + + /********************************************************************** + \brief Calculates electron-ion (elastic) collisional heating + \details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003 + - This differs slightly from the GITM implementation, which assumes several ion species are present. + Instead, here we use each ion species for the sum. + - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5 + - This is capable of handling BOTH the bulk & individual ion temperatures + \param ions + \return vector + **/ + std::vector calc_electron_ion_collisions(Ions &ions); + + /********************************************************************** + \brief Calculates electron-neutral elastic collisional heating + \details From Schunk and Nagy 2009 + \param ions + \param neutrals + \return vector + **/ + std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals); + + /********************************************************************** + \brief Calculates the electron-neutral inelastic collisional heating + \details From Schunk and Nagy 2009 pages 277, 282. + This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration. + See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 + \param ions + \param neutrals + \return vector + **/ + std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals); + + /********************************************************************** \brief Check all of the variables for nonfinites, such as nans \param none diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 713562db..fbf0760f 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -3,81 +3,6 @@ #include "../include/aether.h" -/// @brief Calculate epsilon -/// @details intermediate variable used in photoelectron & ionization heating -/// From (Smithro & Solomon, 2008). -/// @param neutrals -/// @param ions -/// @return epsilon -arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions); - - -/// @brief Calculates photoelectron heating -/// @details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) -/// -/// Uses equations 9-12 from (Zhu & Ridley, 2016) -/// https://doi.org/10.1016/j.jastp.2016.01.005 -/// -/// @param ions -/// @param epsilon -/// @return Qphe -arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); - - -/// @brief Calculates auroral heating -/// @details NOTE: in GITM this is solved separately for ion precipitation & auroral -/// ionization. In Aether these are both in ions.species[iIon].ionization_scgc... -/// @param ions -/// @param epsilon -/// @return Qaurora -arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); - - -/// @brief Calculates electron-ion (elastic) collisional heating -/// @details From Schunk and Nagy 2009, and Bei-Chen Zhang and Y. Kamide 2003 -/// - This differs slightly from the GITM implementation, which assumes several ion species are present. -/// Instead, here we use each ion species for the sum. -/// - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5 -/// - This is capable of handling BOTH the bulk & individual ion temperatures -/// @param ions -/// @return vector -std::vector calc_electron_ion_collisions(Ions &ions); - - -/// @brief Calculates electron-neutral elastic collisional heating -/// @details From Schunk and Nagy 2009 -/// @param ions -/// @param neutrals -/// @return vector -std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals); - -/// @brief Calculates electron-neutral inelastic collisional heating -/// @details From Schunk and Nagy 2009 pages 277, 282. -/// This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration. -/// See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 -/// @param ions -/// @param neutrals -/// @return vector -std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals); - -/// @brief Calculate the thermoelectric current -/// @param ions -/// @param grid -/// @return arma_cube JParaAlt -std::vector calc_thermoelectric_current(Ions &ions, Grid &grid); - - -// -------------------------------------------------------------------------- -// Heating terms: -// - [x] photoelectrons -// - [x] auroral ionization (from ion precipitation & auroral ionization) -// - [x] e- ion collisions -// - [ ] e- neutral collisions (elastic & inelastic) -// - [ ] e- chemistry (O2, V2 vibration; O fine structure, O exitation) -// -------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------- // 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) { arma_cube Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2; // Thermoelectric Current - arma_cube JParaAlt; + arma_mat JParallel; - // Initialize everything to zero! + int64_t nLons = grid.get_nLons(); + int64_t nLats = grid.get_nLats(); + int64_t nAlts = grid.get_nAlts(); + int64_t nGCs = grid.get_nGCs(); - epsilon.set_size(grid.get_nLons(), grid.get_nLats(), grid.get_nAlts()); + // Initialize everything to zero! + epsilon.set_size(nLons, nLats, nAlts); epsilon.zeros(); Qphe = epsilon; QIonization = epsilon; @@ -119,8 +48,16 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { Qencm = epsilon; Qencp = epsilon; Qenc_v = epsilon; + Qrotm = epsilon; + Qrotp = epsilon; + Qf = epsilon; + Qexc = epsilon; + Qvib_O2 = epsilon; + Qvib_N2 = epsilon; report.print(4, "Calculating epsilon"); + + // ============= ADD SOURCES ================= // Needed for both ionization & photoelectron heating: @@ -152,7 +89,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { Qeic_v = Qeic[2]; // Friction } - report.print(4, "Calculating electron-neutral collisions"); + report.print(4, "Calculating electron-neutral elastic collisions"); // electron-neutral Elastic collisions if (input.get_do_electron_neutral_elastic_collisional_heating()) { @@ -185,7 +122,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // Since this is used a few times, calculate it separately & pass it to the functions. // From (Smithro and Solomon, 2008) -arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { +arma_cube Ions::calc_epsilon(Neutrals &neutrals, Ions &ions) { std::string function = "calc_epsilon"; static int iFunction = -1; @@ -224,7 +161,7 @@ arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions) { // -------------------------------------------------------------------------- // Calculate photoelectron heating // -------------------------------------------------------------------------- -arma_cube calc_photoelectron_heating(Ions &ions, +arma_cube Ions::calc_photoelectron_heating(Ions &ions, arma_cube epsilon) { std::string function = "calc_photoelectron_heating"; @@ -254,7 +191,7 @@ arma_cube calc_photoelectron_heating(Ions &ions, // -------------------------------------------------------------------------- // Calculate ionization heating // -------------------------------------------------------------------------- -arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){ +arma_cube Ions::calc_ionization_heating(Ions &ions, arma_cube epsilon){ std::string function = "calc_ionization_heating"; static int iFunction = -1; @@ -281,7 +218,7 @@ arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon){ // -------------------------------------------------------------------------- // Calculate electron-ion collisions // -------------------------------------------------------------------------- -std::vector calc_electron_ion_collisions(Ions &ions){ +std::vector Ions::calc_electron_ion_collisions(Ions &ions){ std::string function = "calc_electron_ion_collisions"; static int iFunction = -1; @@ -346,7 +283,7 @@ std::vector calc_electron_ion_collisions(Ions &ions){ // -------------------------------------------------------------------------- // Calculate electron-neutral elastic collisions // -------------------------------------------------------------------------- -std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals){ std::string function = "calc_electron_neutral_elastic_collisions"; static int iFunction = -1; @@ -381,7 +318,7 @@ std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neut % (1 + 5.70e-4 * ions.electron_temperature_scgc) % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) ); - +report.print(6, "Qenc done"); Qencp = ions.density_scgc * cME * 3.0 * cKB % ((2.33e-11*neutrals.species[inN2].density_scgc*1.e-6 % (1 - 1.21e-4*ions.electron_temperature_scgc) @@ -393,12 +330,13 @@ std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neut % (1 + 5.70e-4*ions.electron_temperature_scgc) % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) ); +report.print(6, "Qencp done"); // delta velocity **2 btwn e- & neutrals: for (int64_t iDir = 0; iDir < 3; iDir++) { dv2_en += pow(neutrals.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2); } - + report.print(6, "dv2 done"); Qenc_v = ions.density_scgc * cME % dv2_en %(2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 @@ -411,6 +349,7 @@ std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neut %pow(ions.electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass) ); +report.print(6, "Qencv done"); Qencm = Qencp % neutrals.temperature_scgc; @@ -422,7 +361,7 @@ std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neut // -------------------------------------------------------------------------- // Calculate electron-neutral inelasticcollisions // -------------------------------------------------------------------------- -std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals){ std::string function = "calc_electron_neutral_inelastic_collisions"; static int iFunction = -1; @@ -508,11 +447,10 @@ std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Ne + 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4) + 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2) + 0.0267*Te - 19.9171); - // GITM's Te_6000 was from 300 - 6000, which corresponds to ~-15.9 & 198.3 for logQ + // GITM's Te_6000 was used when 300 Date: Tue, 21 Jan 2025 17:26:52 -0500 Subject: [PATCH 388/691] STY: Finish moving e- temp into Ions class --- include/ions.h | 19 ++-- src/advance.cpp | 4 +- src/calc_electron_temperature.cpp | 156 +++++++++++++++--------------- 3 files changed, 87 insertions(+), 92 deletions(-) diff --git a/include/ions.h b/include/ions.h index e67d4fd4..dab8c87a 100644 --- a/include/ions.h +++ b/include/ions.h @@ -357,31 +357,28 @@ class Ions { /// @details intermediate variable used in photoelectron & ionization heating /// From (Smithro & Solomon, 2008). /// @param neutrals - /// @param ions /// @return epsilon **/ - arma_cube calc_epsilon(Neutrals &neutrals, Ions &ions); + arma_cube calc_epsilon(Neutrals &neutrals); /********************************************************************** \brief Calculates photoelectron heating \details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) Uses equations 9-12 from (Zhu & Ridley, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 - \param ions \param epsilon \return Qphe **/ - arma_cube calc_photoelectron_heating(Ions &ions, arma_cube epsilon); + arma_cube calc_photoelectron_heating(arma_cube epsilon); /********************************************************************** \brief Calculates auroral heating \details NOTE: in GITM this is solved separately for ion precipitation & auroral ionization. In Aether these are both in ions.species[iIon].ionization_scgc... - \param ions \param epsilon \return Qaurora **/ - arma_cube calc_ionization_heating(Ions &ions, arma_cube epsilon); + arma_cube calc_ionization_heating(arma_cube epsilon); /********************************************************************** \brief Calculates electron-ion (elastic) collisional heating @@ -390,31 +387,27 @@ class Ions { Instead, here we use each ion species for the sum. - electon-ion collision frequency (from Schunk and Nagy 2009) = 5.45E-5 - This is capable of handling BOTH the bulk & individual ion temperatures - \param ions \return vector **/ - std::vector calc_electron_ion_collisions(Ions &ions); + std::vector calc_electron_ion_collisions(); /********************************************************************** \brief Calculates electron-neutral elastic collisional heating \details From Schunk and Nagy 2009 - \param ions \param neutrals \return vector **/ - std::vector calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals); + std::vector calc_electron_neutral_elastic_collisions(Neutrals &neutrals); /********************************************************************** \brief Calculates the electron-neutral inelastic collisional heating \details From Schunk and Nagy 2009 pages 277, 282. This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration. See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 - \param ions \param neutrals \return vector **/ - std::vector calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals); - + std::vector calc_electron_neutral_inelastic_collisions(Neutrals &neutrals); /********************************************************************** \brief Check all of the variables for nonfinites, such as nans diff --git a/src/advance.cpp b/src/advance.cpp index 4e81d5e2..65c0b94a 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -200,9 +200,9 @@ bool advance(Planets &planet, } ions.calc_ion_temperature(neutrals, gGrid, time); - ions.calc_electron_temperature(neutrals, gGrid, time); + // ions.calc_electron_temperature(neutrals, gGrid, time); //ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); - //ionsMag.calc_electron_temperature(neutralsMag, mGrid); + ionsMag.calc_electron_temperature(neutralsMag, mGrid, time); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Advection"); diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index fbf0760f..4c479630 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -62,28 +62,28 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // Needed for both ionization & photoelectron heating: if (input.get_do_ionization_heating() || input.get_do_photoelectron_heating()) { - epsilon = calc_epsilon(neutrals, *this); + epsilon = calc_epsilon(neutrals); } report.print(4, "Calculating photoelectron heating"); // Photoelectron heating if (input.get_do_photoelectron_heating()) { - Qphe = calc_photoelectron_heating(*this, epsilon); + Qphe = calc_photoelectron_heating(epsilon); } report.print(4, "Calculating ionization heating"); // Ionization heating (includes all ionization sources) if (input.get_do_ionization_heating()) { - QIonization = calc_ionization_heating(*this, epsilon); + QIonization = calc_ionization_heating(epsilon); } report.print(4, "Calculating electron-ion collisions"); // electron-ion collisions if (input.get_do_electron_ion_collisional_heating()) { - Qeic = calc_electron_ion_collisions(*this); + Qeic = calc_electron_ion_collisions(); Qeicp = Qeic[0]; Qeicm = Qeic[1]; Qeic_v = Qeic[2]; // Friction @@ -93,7 +93,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // electron-neutral Elastic collisions if (input.get_do_electron_neutral_elastic_collisional_heating()) { - Qenc = calc_electron_neutral_elastic_collisions(*this, neutrals); + Qenc = calc_electron_neutral_elastic_collisions(neutrals); Qencp = Qenc[0]; Qencm = Qenc[1]; Qenc_v = Qenc[2]; // Friction @@ -101,7 +101,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // electron-neutral inelastic collisions if (input.get_do_electron_neutral_inelastic_collisional_heating()) { - Qenc_inelastic = calc_electron_neutral_inelastic_collisions(*this, neutrals); + Qenc_inelastic = calc_electron_neutral_inelastic_collisions(neutrals); Qrotm = Qenc_inelastic[0]; Qrotp = Qenc_inelastic[1]; Qf = Qenc_inelastic[2]; @@ -122,9 +122,9 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // Since this is used a few times, calculate it separately & pass it to the functions. // From (Smithro and Solomon, 2008) -arma_cube Ions::calc_epsilon(Neutrals &neutrals, Ions &ions) { +arma_cube Ions::calc_epsilon(Neutrals &neutrals) { - std::string function = "calc_epsilon"; + std::string function = "Ions::calc_epsilon"; static int iFunction = -1; report.enter(function, iFunction); @@ -139,7 +139,7 @@ arma_cube Ions::calc_epsilon(Neutrals &neutrals, Ions &ions) { arma_cube epsilon, x, logx; - x = ions.density_scgc / (neutrals.species[inO2].density_scgc + x = density_scgc / (neutrals.species[inO2].density_scgc + neutrals.species[inN2].density_scgc + neutrals.species[inO].density_scgc); // should rarely need to be used: @@ -161,14 +161,13 @@ arma_cube Ions::calc_epsilon(Neutrals &neutrals, Ions &ions) { // -------------------------------------------------------------------------- // Calculate photoelectron heating // -------------------------------------------------------------------------- -arma_cube Ions::calc_photoelectron_heating(Ions &ions, - arma_cube epsilon) { +arma_cube Ions::calc_photoelectron_heating(arma_cube epsilon) { - std::string function = "calc_photoelectron_heating"; + std::string function = "Ions::calc_photoelectron_heating"; static int iFunction = -1; report.enter(function, iFunction); - int64_t nIons = ions.nSpecies; + int64_t nIons = nSpecies; // Initialize Qphe & IonsIonizationRate (sum of ionization rates) // to the same size as epsilon and then zero them out: @@ -178,7 +177,7 @@ arma_cube Ions::calc_photoelectron_heating(Ions &ions, IonsIonizationRate.zeros(); for (int64_t iIon = 0; iIon < nIons; iIon++) { - IonsIonizationRate += ions.species[iIon].ionization_scgc; + IonsIonizationRate += species[iIon].ionization_scgc; } Qphe = epsilon % IonsIonizationRate; @@ -191,24 +190,24 @@ arma_cube Ions::calc_photoelectron_heating(Ions &ions, // -------------------------------------------------------------------------- // Calculate ionization heating // -------------------------------------------------------------------------- -arma_cube Ions::calc_ionization_heating(Ions &ions, arma_cube epsilon){ +arma_cube Ions::calc_ionization_heating(arma_cube epsilon){ - std::string function = "calc_ionization_heating"; + std::string function = "Ions::calc_ionization_heating"; static int iFunction = -1; report.enter(function, iFunction); - int64_t nIons = ions.nSpecies; + int64_t nIons = nSpecies; // auroral heating efficiency coefficient precision_t auroheat = 1.0; - int64_t iO_3P = ions.get_species_id("O+"); - int64_t iO2P = ions.get_species_id("O2+"); - int64_t iN2P = ions.get_species_id("N2+"); + int64_t iO_3P = get_species_id("O+"); + int64_t iO2P = get_species_id("O2+"); + int64_t iN2P = get_species_id("N2+"); - arma_cube QIonization = auroheat * epsilon % (ions.species[iO_3P].ionization_scgc - + ions.species[iO2P].ionization_scgc - + ions.species[iN2P].ionization_scgc); + arma_cube QIonization = auroheat * epsilon % (species[iO_3P].ionization_scgc + + species[iO2P].ionization_scgc + + species[iN2P].ionization_scgc); report.exit(function); @@ -218,46 +217,46 @@ arma_cube Ions::calc_ionization_heating(Ions &ions, arma_cube epsilon){ // -------------------------------------------------------------------------- // Calculate electron-ion collisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_ion_collisions(Ions &ions){ +std::vector Ions::calc_electron_ion_collisions(){ - std::string function = "calc_electron_ion_collisions"; + std::string function = "Ions::calc_electron_ion_collisions"; static int iFunction = -1; report.enter(function, iFunction); arma_cube Qeicp; - Qeicp.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qeicp.set_size(density_scgc.n_rows, density_scgc.n_cols, density_scgc.n_slices); Qeicp.zeros(); arma_cube Qeicm = Qeicp; // Friction things arma_cube Qeic_v = Qeicp, dv2_ei = Qeicp; - int64_t nSpecies = ions.nSpecies; + int64_t nSpecies = nSpecies; if (input.get_do_calc_bulk_ion_temp()){ // This is used when we calculate bulk ion temperature! report.print(3, "Using bulk ion temperature for electron-ion collisions"); // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - Qeicp += ions.species[iSpecies].density_scgc - / (cME + ions.species[iSpecies].mass); + Qeicp += species[iSpecies].density_scgc + / (cME + species[iSpecies].mass); } - Qeicp = Qeicp % ions.density_scgc * cME * 3.0 * cKB - % (ions.temperature_scgc - ions.electron_temperature_scgc) - * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); + Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB + % (temperature_scgc - electron_temperature_scgc) + * 5.45e-5 / pow(electron_temperature_scgc, 1.5); } else{ // Individual ion temperatures: report.print(3, "Using individual ion temperatures for electron-ion collisions"); // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - Qeicp += ions.species[iSpecies].density_scgc - % (ions.species[iSpecies].temperature_scgc - ions.electron_temperature_scgc) - / (cME + ions.species[iSpecies].mass); + Qeicp += species[iSpecies].density_scgc + % (species[iSpecies].temperature_scgc - electron_temperature_scgc) + / (cME + species[iSpecies].mass); } - Qeicp = Qeicp % ions.density_scgc * cME * 3.0 * cKB - * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5); + Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB + * 5.45e-5 / pow(electron_temperature_scgc, 1.5); } report.print(3, "Calculating frictional heating"); @@ -266,13 +265,13 @@ std::vector Ions::calc_electron_ion_collisions(Ions &ions){ // This uses the bulk ion velocity, not the individual ion velocity. // (Different from GITM): Uses all species' densities (so just ne), not just o+, o2+, n2+, no+, n+ for (int64_t iDir = 0; iDir < 3; iDir++) { - dv2_ei += pow(ions.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2); + dv2_ei += pow(velocity_vcgc[iDir] - exb_vcgc[iDir], 2); } - Qeic_v = ions.density_scgc * cME % dv2_ei * 5.45e-5 / pow(ions.electron_temperature_scgc, 1.5) - % (ions.density_scgc); + Qeic_v = density_scgc * cME % dv2_ei * 5.45e-5 / pow(electron_temperature_scgc, 1.5) + % (density_scgc); std::vector Qeic = {Qeicp, - Qeicp % ions.electron_temperature_scgc, + Qeicp % electron_temperature_scgc, Qeic_v}; report.exit(function); @@ -283,15 +282,15 @@ std::vector Ions::calc_electron_ion_collisions(Ions &ions){ // -------------------------------------------------------------------------- // Calculate electron-neutral elastic collisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_neutral_elastic_collisions(Ions &ions, Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_elastic_collisions(Neutrals &neutrals){ - std::string function = "calc_electron_neutral_elastic_collisions"; + std::string function = "Ions::calc_electron_neutral_elastic_collisions"; static int iFunction = -1; report.enter(function, iFunction); // initialize & zero the quantities we need: arma_cube Qenc; - Qenc.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qenc.set_size(density_scgc.n_rows, density_scgc.n_cols, density_scgc.n_slices); Qenc.zeros(); arma_cube Qencp = Qenc; arma_cube Qencm = Qenc; @@ -307,46 +306,46 @@ std::vector Ions::calc_electron_neutral_elastic_collisions(Ions &ions report.error("Could not find O, N2, or O2 in neutrals species list"); } - Qenc = ions.density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - ions.electron_temperature_scgc) + Qenc = density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - electron_temperature_scgc) % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 - % (1 - 1.21e-4 * ions.electron_temperature_scgc) - % ions.electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + % (1 - 1.21e-4 * electron_temperature_scgc) + % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 - % (1 + 3.60e-2 * pow(ions.electron_temperature_scgc, 0.5)) - % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 - % (1 + 5.70e-4 * ions.electron_temperature_scgc) - % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) + % (1 + 5.70e-4 * electron_temperature_scgc) + % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) ); report.print(6, "Qenc done"); - Qencp = ions.density_scgc * cME * 3.0 * cKB + Qencp = density_scgc * cME * 3.0 * cKB % ((2.33e-11*neutrals.species[inN2].density_scgc*1.e-6 - % (1 - 1.21e-4*ions.electron_temperature_scgc) - % ions.electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + % (1 - 1.21e-4*electron_temperature_scgc) + % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 - % (1 + 3.60e-2 * pow(ions.electron_temperature_scgc, 0.5)) - % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 - % (1 + 5.70e-4*ions.electron_temperature_scgc) - % pow(ions.electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) + % (1 + 5.70e-4*electron_temperature_scgc) + % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) ); report.print(6, "Qencp done"); // delta velocity **2 btwn e- & neutrals: for (int64_t iDir = 0; iDir < 3; iDir++) { - dv2_en += pow(neutrals.velocity_vcgc[iDir] - ions.exb_vcgc[iDir], 2); + dv2_en += pow(neutrals.velocity_vcgc[iDir] - exb_vcgc[iDir], 2); } report.print(6, "dv2 done"); - Qenc_v = ions.density_scgc * cME % dv2_en + Qenc_v = density_scgc * cME % dv2_en %(2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 - % (1 - 1.21e-4 * ions.electron_temperature_scgc) % ions.electron_temperature_scgc * neutrals.species[inN2].mass + % (1 - 1.21e-4 * electron_temperature_scgc) % electron_temperature_scgc * neutrals.species[inN2].mass /(cME + neutrals.species[inN2].mass) - + 1.82e-10*neutrals.species[inO2].density_scgc*1.e-6%(1 + 3.60e-2*pow(ions.electron_temperature_scgc, 0.5)) - % pow(ions.electron_temperature_scgc, 0.5) *neutrals.species[inO2].mass + + 1.82e-10*neutrals.species[inO2].density_scgc*1.e-6%(1 + 3.60e-2*pow(electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5) *neutrals.species[inO2].mass /(cME + neutrals.species[inO2].mass) - + 8.90e-11*neutrals.species[inO].density_scgc*1.e-6%(1 + 5.70e-4*ions.electron_temperature_scgc) - %pow(ions.electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass) + + 8.90e-11*neutrals.species[inO].density_scgc*1.e-6%(1 + 5.70e-4*electron_temperature_scgc) + %pow(electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass) ); report.print(6, "Qencv done"); @@ -361,15 +360,15 @@ report.print(6, "Qencv done"); // -------------------------------------------------------------------------- // Calculate electron-neutral inelasticcollisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &ions, Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals &neutrals){ - std::string function = "calc_electron_neutral_inelastic_collisions"; + std::string function = "Ions::calc_electron_neutral_inelastic_collisions"; static int iFunction = -1; report.enter(function, iFunction); // initialize & zero the quantities we need: arma_cube Qrot; - Qrot.set_size(ions.density_scgc.n_rows, ions.density_scgc.n_cols, ions.density_scgc.n_slices); + Qrot.set_size(density_scgc.n_rows, density_scgc.n_cols, density_scgc.n_slices); Qrot.zeros(); // N2, O2 roration (Shunk & Nagy pp. 277) arma_cube Qrotp = Qrot; arma_cube Qrotm = Qrot; @@ -390,9 +389,9 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &io } // some aliases for common quantities - arma_cube ne = ions.density_scgc; - arma_cube Te = ions.electron_temperature_scgc; - arma_cube Ti = ions.temperature_scgc; + arma_cube ne = density_scgc; + arma_cube Te = electron_temperature_scgc; + arma_cube Ti = temperature_scgc; arma_cube Tn = neutrals.temperature_scgc; arma_cube no2 = neutrals.species[inO2].density_scgc; arma_cube nn2 = neutrals.species[inN2].density_scgc; @@ -402,7 +401,7 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &io arma::uvec Ti_mask = find(Ti <= Tn); arma::uvec Te_mask = find(Te <= Tn); Ti.elem(Ti_mask) = Tn.elem(Ti_mask) * 1.0001; - Te.elem(Ti_mask) = Tn.elem(Te_mask) * 1.0001; + Te.elem(Te_mask) = Tn.elem(Te_mask) * 1.0001; // N2, O2 rotation (Shunk & Nagy pp. 277) Qrot = 3.5e-14*ne*1.e-6%nn2*1.e-6%(Tn - Te)/(pow(Te,0.5)) @@ -487,9 +486,9 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &io double tte; // since we need the min of this & 6000 & std::min can't accept precision_t precision_t ttn, tte_6000; - for (int64_t iLon = 0; iLon < ions.density_scgc.n_rows; iLon++) { //nLons - for (int64_t iLat = 0; iLat < ions.density_scgc.n_cols; iLat++) { // nLats - for (int64_t iAlt = 0; iAlt < ions.density_scgc.n_slices; iAlt++) { // nAlts + for (int64_t iLon = 0; iLon < density_scgc.n_rows; iLon++) { //nLons + for (int64_t iLat = 0; iLat < density_scgc.n_cols; iLat++) { // nLats + for (int64_t iAlt = 0; iAlt < density_scgc.n_slices; iAlt++) { // nAlts tte = Te(iLon, iLat, iAlt); ttn = Tn(iLon, iLat, iAlt); tte_6000 = std::min(tte, 6000.0); @@ -522,12 +521,15 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Ions &io Qvib_N2 = -ne % nn2 * 1.e-12 % Qvib_N2 * 1.6e-13; + report.exit(function); + report.print(6, "Qenc done"); + return std::vector {Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2}; } -arma_cube calc_thermoelectric_current(Ions ions, Grid grid){ +arma_mat Ions::calc_thermoelectric_current(Grid &grid){ - std::string function = "calc_thermoelectric_current"; + std::string function = "Ions::calc_thermoelectric_current"; static int iFunction = -1; report.enter(function, iFunction); From 1222e4f4823a3cc35f401e74e3dcf54e1844602d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 21 Jan 2025 17:28:45 -0500 Subject: [PATCH 389/691] FEAT: Add thermoelectric heating (it's not working yet though) --- include/inputs.h | 6 ++++ include/ions.h | 9 ++++++ src/calc_electron_temperature.cpp | 52 +++++++++++++++++++++++++------ src/inputs.cpp | 8 +++++ 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 2b87cf36..c753d874 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -466,6 +466,12 @@ class Inputs { bool get_do_electron_neutral_inelastic_collisional_heating(); + /********************************************************************** + \brief returns settings["Sources"]["Ions"]["IncludeThermoelectricHeating"] + \param none + **/ + bool get_do_thermoelectric_heating(); + /********************************************************************** \brief returns settings[" \param diff --git a/include/ions.h b/include/ions.h index dab8c87a..52609cee 100644 --- a/include/ions.h +++ b/include/ions.h @@ -409,6 +409,15 @@ class Ions { **/ std::vector calc_electron_neutral_inelastic_collisions(Neutrals &neutrals); + /********************************************************************** + \brief Calculate the thermoelectric current (same at all altitudes) + \details Use eq. 6 of https://doi.org/10.1016/j.jastp.2016.01.005 + - Since we do not know e- parallel velocity, the dipole needs to do it this way too. + \param grid + \return arma_mat JParaAlt + **/ + arma_mat calc_thermoelectric_current(Grid &grid); + /********************************************************************** \brief Check all of the variables for nonfinites, such as nans \param none diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 4c479630..fcc3f837 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -110,10 +110,12 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { Qvib_N2 = Qenc_inelastic[5]; } - // Thermoelectric current - - - electron_temperature_scgc = neutrals.temperature_scgc; + if (input.get_do_thermoelectric_heating()) { + report.print(4, "Calculating thermoelectric heating"); + report.error("Thermoelectric heating is not working yet."); + // Get JPar (Thermoelectric current) + JParallel = calc_thermoelectric_current(grid); + } report.exit(function); } @@ -533,11 +535,43 @@ arma_mat Ions::calc_thermoelectric_current(Grid &grid){ static int iFunction = -1; report.enter(function, iFunction); - arma_cube JuTotal = ions.density_scgc * cE; + std::vector JTotal; - report.exit(function); + arma_mat JParallel; + JParallel.set_size(density_scgc.n_rows, density_scgc.n_cols); + JParallel.zeros(); + + // with the dipole, the field-aligned current is in the k^ direction + // But we do not solve for e- velocity (and exb is 0 parallel to B), so we cannot do this: + // if (grid.iGridShape_ == grid.iDipole_){ + // for (int64_t iAlt = 0; iAlt < ions.density_scgc.n_slices; iAlt++){ + // JParallel += (ions.density_scgc.slice(iAlt) * cE % (ions.velocity_vcgc[2].slice(iAlt) - ions.exb_vcgc[2].slice(iAlt))) + // * grid.dalt_center_scgc[iAlt]; + // } + // } + + // else{ + // We need to solve for J_Parallel with Equation (6) of (Zhu et al., 2016) + // http://dx.doi.org/10.1016/j.jastp.2016.01.005 - using \nabla \dot J + JTotal.push_back(cE * density_scgc % (velocity_vcgc[0] - exb_vcgc[0])); + JTotal.push_back(cE * density_scgc % (velocity_vcgc[1] - exb_vcgc[1])); + JTotal.push_back(cE * density_scgc % (velocity_vcgc[2] - exb_vcgc[2])); + + arma_cube JuTotalDotB = dot_product(JTotal, grid.bfield_vcgc); + arma_cube divJperp; + + divJperp.set_size(density_scgc.n_rows, density_scgc.n_cols, density_scgc.n_slices); + divJperp.zeros(); + + for (int64_t iDir =0; iDir < 3; iDir ++){ + divJperp += calc_gradient_vector(JTotal[iDir], grid)[iDir]; + divJperp -= calc_gradient_vector(JuTotalDotB, grid)[iDir] % grid.bfield_unit_vcgc[iDir]; + divJperp -= calc_gradient_vector(JuTotalDotB, grid)[iDir] % JuTotalDotB; + } - return JuTotal; - + for (int64_t iAlt = 0; iAlt < density_scgc.n_slices; iAlt++){ + JParallel -= divJperp.slice(iAlt) % grid.dalt_center_scgc.slice(iAlt);} -} \ No newline at end of file + report.exit(function); + return JParallel; + } \ No newline at end of file diff --git a/src/inputs.cpp b/src/inputs.cpp index e20daf5e..1243ffce 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -795,6 +795,14 @@ bool Inputs::get_do_electron_neutral_inelastic_collisional_heating() { return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralInelasticCollisionalHeating"); } +// ----------------------------------------------------------------------- +// Return whether to include heating from thermoelectric currents +// ----------------------------------------------------------------------- + +bool Inputs::get_do_thermoelectric_heating() { + return get_setting_bool("Sources", "Ions", "IncludeThermoelectricHeating"); +} + // ----------------------------------------------------------------------- // Return centripetal acceleration // ----------------------------------------------------------------------- From b11292d4b98063f7d6c8851e61073d8a1c441274 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 21 Jan 2025 17:29:29 -0500 Subject: [PATCH 390/691] FEAT: Actually calculate new e- temp --- src/calc_electron_temperature.cpp | 56 +++++++++++++++++++++++++++++++ src/solver_conduction.cpp | 2 ++ 2 files changed, 58 insertions(+) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index fcc3f837..45a50b59 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -117,6 +117,62 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { JParallel = calc_thermoelectric_current(grid); } + report.print(4, "Calculating electron temperature"); + + arma_cube sources = Qphe + Qencm + Qeicm + Qrotm + Qf + Qexc + Qvib_O2 + Qvib_N2 + + QIonization + Qenc_v + Qeic_v; + arma_cube sources_temp_dependent = Qencp + Qeicp + Qrotp; + + + // ============= CALCULATE TEMPERATURE ================= + arma_vec temp1d(nAlts); + arma_vec lambda1d(nAlts); + arma_vec front1d(nAlts); + arma_vec dalt1d(nAlts); + arma_vec conduction1d(nAlts); + arma_vec sources1d(nAlts); + arma_vec sources_tempdep_1d(nAlts); + arma_vec ratios(nAlts); + arma_vec density_ratio(nAlts); + + // Get the time step size + precision_t dt = time.get_dt(); + + + for (int64_t iLon = nGCs; iLon < nLons - nGCs; iLon++) { + for (int64_t iLat = nGCs; iLat < nLats - nGCs; iLat++) { + temp1d = electron_temperature_scgc.tube(iLon, iLat); + temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); + temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); + lambda1d = lambda.tube(iLon, iLat); + lambda1d(1) = lambda1d(2); + lambda1d(0) = lambda1d(2); + front1d = 3.0 / 2.0 * cKB * species[nSpecies].density_scgc.tube(iLon, iLat); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + sources1d = sources.tube(iLon, iLat); + sources1d = sources1d / front1d; + + sources_tempdep_1d = sources_temp_dependent.tube(iLon, iLat); + sources_tempdep_1d = sources_tempdep_1d / front1d; + + conduction1d.zeros(); // reset temp variable to zero + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, + dalt1d, + dt / 10., + nGCs, + false, + sources_tempdep_1d); + + // The conduction solver gives Tnew-Told, so divide by dt + conduction1d.clamp(200, 6000); + electron_temperature_scgc.tube(iLon, iLat) = conduction1d; + }} + + // electron_temperature_scgc = neutrals.temperature_scgc; + report.exit(function); } diff --git a/src/solver_conduction.cpp b/src/solver_conduction.cpp index 4a3b041e..ff353a11 100644 --- a/src/solver_conduction.cpp +++ b/src/solver_conduction.cpp @@ -16,6 +16,8 @@ // - At this point, the bottom BC is fixed, while the top BC is zero gradient // - The dx variable is assumed to be distance between the CURRENT cell center // (i) and the cell center of the cell BELOW the current one (i-1). +// +// The last two arguments are optional, with default values set in the func declaration. // ----------------------------------------------------------------------- arma_vec solver_conduction(arma_vec value, From 78eb30bcd66a36bd6ce0422d9dd977323205dbd4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 21 Jan 2025 17:30:36 -0500 Subject: [PATCH 391/691] BUG: Fix off-by-1 (or 2) errors in cet --- src/calc_electron_temperature.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 45a50b59..cc80e991 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -558,19 +558,19 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals Qvib_N2(iLon, iLat, iAlt) = (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(0)) * (1.0 - exp(3353.0 * (1.0 / tte - 1.0 / ttn))); } else if (tte > 1500) { + logQv0 = Av0 + Bv0 * tte + Cv0 * pow(tte, 2) + Dv0 * pow(tte, 3) + Fv0 * pow(tte, 4) - 16.0; + logQv1 = Av1 + Bv1 * tte + Cv1 * pow(tte, 2) + Dv1 * pow(tte, 3) + Fv1 * pow(tte, 4) - 16.0; + for (int iLevel = 0; iLevel < 10; iLevel++) { - logQv0(iLevel) = Av0(iLevel) + Bv0(iLevel) * tte_6000 + Cv0(iLevel) * pow(tte, 2) - + Dv0(iLevel) * pow(tte, 3) + Fv0(iLevel) * pow(tte, 4) - 16.0; - Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(0)) + Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(iLevel)) * (1.0 - exp((iLevel + 1) * 3353.0 * (1.0 / tte - 1.0 / ttn))); } for (int iLevel = 0; iLevel < 8; iLevel++) { - logQv1(iLevel) = Av1(iLevel) + Bv1(iLevel) * tte_6000 + Cv1(iLevel) * pow(tte_6000, 2) - + Dv1(iLevel) * pow(tte_6000, 3) + Fv1(iLevel) * pow(tte_6000, 4) - 16.0; + // GITM did this loop from 2-9, which is out of bounds, so we correct for iLevel here) Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp(-3353.0 / ttn) * exp10(logQv1(iLevel)) - * (1.0 - exp(iLevel * 3353.0 * (1.0 / tte - 1.0 / ttn))); + * (1.0 - exp((iLevel + 2) * 3353.0 * (1.0 / tte - 1.0 / ttn))); } } } From 552d3f7d9acf9e7dfd0f2bf939fcf3138f2d91d5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 21 Jan 2025 17:31:07 -0500 Subject: [PATCH 392/691] MAINT: Standardize where messages are logged from --- src/calc_electron_temperature.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index cc80e991..56763894 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -65,42 +65,46 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { epsilon = calc_epsilon(neutrals); } - report.print(4, "Calculating photoelectron heating"); // Photoelectron heating if (input.get_do_photoelectron_heating()) { + report.print(4, "Calculating photoelectron heating"); Qphe = calc_photoelectron_heating(epsilon); } - report.print(4, "Calculating ionization heating"); - // Ionization heating (includes all ionization sources) if (input.get_do_ionization_heating()) { + report.print(4, "Calculating ionization heating"); QIonization = calc_ionization_heating(epsilon); } - report.print(4, "Calculating electron-ion collisions"); // electron-ion collisions if (input.get_do_electron_ion_collisional_heating()) { + report.print(4, "Calculating electron-ion collisions"); + Qeic = calc_electron_ion_collisions(); Qeicp = Qeic[0]; Qeicm = Qeic[1]; Qeic_v = Qeic[2]; // Friction } - report.print(4, "Calculating electron-neutral elastic collisions"); // electron-neutral Elastic collisions if (input.get_do_electron_neutral_elastic_collisional_heating()) { + report.print(4, "Calculating electron-neutral elastic collisions"); + Qenc = calc_electron_neutral_elastic_collisions(neutrals); Qencp = Qenc[0]; Qencm = Qenc[1]; Qenc_v = Qenc[2]; // Friction } + // electron-neutral inelastic collisions if (input.get_do_electron_neutral_inelastic_collisional_heating()) { + report.print(4, "Calculating electron-neutral inelastic collisions"); + Qenc_inelastic = calc_electron_neutral_inelastic_collisions(neutrals); Qrotm = Qenc_inelastic[0]; Qrotp = Qenc_inelastic[1]; From 887a969dc76add093e963a00b650c296b29a951f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 17 Feb 2025 20:31:37 -0500 Subject: [PATCH 393/691] FEAT: print out a vector with title --- include/tools.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/tools.h b/include/tools.h index e780e31b..20b1948a 100644 --- a/include/tools.h +++ b/include/tools.h @@ -70,6 +70,7 @@ void display_vector(arma_vec vec); // ---------------------------------------------------------------------- void display_vector(std::string, arma_vec vec); +void display_vector(std::string, std::vector vec); // ---------------------------------------------------------------------- // synchronize a (boolean) variable across all processors From de7cc3509e43a91e608603fd7cf493454ff7a960 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 17 Feb 2025 20:31:56 -0500 Subject: [PATCH 394/691] FEAT: print out a vector with title --- src/tools.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/tools.cpp b/src/tools.cpp index 26a8a113..c37e499f 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -171,6 +171,19 @@ void display_vector(std::string name, arma_vec vec) { std::cout << "\n"; } +// ---------------------------------------------------------------------------- +// Neatly display a c++ vector with a name +// ---------------------------------------------------------------------------- + +void display_vector(std::string name, std::vector vec) { + std::cout << name << " "; + for (int64_t i = 0; i < vec.size(); i++) + std::cout << vec[i] << " "; + + std::cout << "\n"; +} + + // ---------------------------------------------------------------------------- // synchronize a (boolean) variable across all processors // ---------------------------------------------------------------------------- From 8afedf025fd49a0e8ad3f4fbd5037047b4fa70dc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 17 Feb 2025 20:43:33 -0500 Subject: [PATCH 395/691] BUG: Fix issue with vector --- src/aurora.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/aurora.cpp b/src/aurora.cpp index bc793ed9..0ecd0c83 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -155,7 +155,7 @@ void calc_aurora(Grid grid, static int nBins = 101; static arma_vec auroral_energies(nBins); static arma_vec auroral_energy_widths(nBins); - std::vector Ci; + std::vector Ci(8); if (!neutrals.auroraInitialized) { // Initialize the aurora using the auroral csv file @@ -177,20 +177,15 @@ void calc_aurora(Grid grid, auroral_energy_widths = calc_bin_widths(auroral_energies); for (int64_t iBin = 0; iBin < nBins; iBin++) { - lnE = log(auroral_energies(iBin)); - // loop through Pij values to get vector of Ci values. This is // directly from Fang et al., [2010]: for (int i = 0; i < 8; i++) { precision_t tot = 0; - for (int j = 0; j < 4; j++) tot = tot + Pij.at(i, j) * pow(lnE, j); - - Ci.push_back(exp(tot)); + Ci[i] = exp(tot); } - CiArray.push_back(Ci); } @@ -262,7 +257,6 @@ void calc_aurora(Grid grid, arma_vec temp; ionization1d.zeros(); - for (int iBin = 0; iBin < nBins; iBin++) { Ci = CiArray[iBin]; temp = calculate_fang_v2(auroral_energies(iBin), @@ -275,8 +269,7 @@ void calc_aurora(Grid grid, } // /cm3 -> /m3 - // CHANGE!!!! - ionization1d = ionization1d * pcm3topm3 / 100.0; + ionization1d = ionization1d * pcm3topm3 /100.0; // Step 5: Distribute ionization among neutrals: // Need to figure out which species get what percentage of the From 8c2d8249d9a64d3cce73754ebcc42f7988811eb2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Mon, 17 Feb 2025 20:44:28 -0500 Subject: [PATCH 396/691] BUG: density to mass density --- src/calc_neutral_derived.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 62577a31..856349f5 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -585,7 +585,7 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].density_scgc.slice(iAlt) % species[iSpecies].scale_height_scgc.slice(iAlt); - species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice(iAlt); + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice(iAlt) * species[iSpecies].mass; for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { // dr is used here instead of dalt, since we only want the radial integration, while @@ -596,7 +596,7 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].rho_alt_int_scgc.slice(iAlt) = species[iSpecies].rho_alt_int_scgc.slice(iAlt + 1) + species[iSpecies].density_scgc.slice(iAlt) % - grid.dk_edge_m.slice(iAlt + 1); + grid.dk_edge_m.slice(iAlt + 1) * species[iSpecies].mass; } erfcy3d = (a + b * y3d) / (c + d * y3d + y3d % y3d); From 4ea4cf19862e16149039ecb9ac985a7cffe94917 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:02:13 -0500 Subject: [PATCH 397/691] FEAT: need to store grid type as string --- include/grid.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/grid.h b/include/grid.h index 5f3db430..fed807e9 100644 --- a/include/grid.h +++ b/include/grid.h @@ -256,6 +256,7 @@ class Grid void set_variable_sizes(); bool get_IsGeoGrid(); + std::string get_gridtype(); bool get_HasBField(); void set_IsGeoGrid(bool value); void set_IsExperimental(bool value); @@ -449,6 +450,7 @@ class Grid bool IsExperimental; bool IsMagGrid; bool IsDipole = false; + std::string gridType; int64_t nX, nLons; int64_t nY, nLats; From 9965aad28a073a3eb89dd8272f0904f4b7674cdb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:02:57 -0500 Subject: [PATCH 398/691] FEAT: need to store grid type as string --- src/grid.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index f074d4b7..9ed462c3 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -16,6 +16,8 @@ Grid::Grid(std::string gridtype) { Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); + gridType = gridtype; + nX = grid_input.nX + nGCs * 2; nLons = nX; nY = grid_input.nY + nGCs * 2; @@ -465,6 +467,14 @@ bool Grid::get_IsGeoGrid() { return IsGeoGrid; } +// -------------------------------------------------------------------------- +// Return grid type (neu or ion) +// -------------------------------------------------------------------------- + +std::string Grid::get_gridtype() { + return gridType; +} + // -------------------------------------------------------------------------- // Get whether the grid is a experimental (return true for experimental) // -------------------------------------------------------------------------- From 2386f1b428d84716464b0022d33793ef3730ecae Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:03:41 -0500 Subject: [PATCH 399/691] FEAT: restart for both grid types --- include/ions.h | 2 +- src/ions.cpp | 8 +++----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/include/ions.h b/include/ions.h index 521912c1..133a1be5 100644 --- a/include/ions.h +++ b/include/ions.h @@ -368,7 +368,7 @@ class Ions { \param dir the directory to read or write from/to \param DoRead whether to read (true) or write (false) **/ - bool restart_file(std::string dir, bool DoRead); + bool restart_file(std::string dir, std::string cGridtype, bool DoRead); /********************************************************************** \brief Exchange messages between processors diff --git a/src/ions.cpp b/src/ions.cpp index 68076df6..7d06721a 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -127,8 +127,6 @@ Ions::Ions(Grid grid, Planets planet) { heating_sources_total.set_size(nLons, nLats, nAlts); heating_sources_total.zeros(); - - for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir].zeros(); cMax_vcgc[iDir].ones(); @@ -167,7 +165,7 @@ Ions::Ions(Grid grid, Planets planet) { if (input.get_do_restart()) { report.print(1, "Restarting! Reading ion files!"); - bool DidWork = restart_file(input.get_restartin_dir(), DoRead); + bool DidWork = restart_file(input.get_restartin_dir(), grid.get_gridtype(), DoRead); if (!DidWork) std::cout << "Reading Restart for Ions Failed!!!\n"; @@ -521,7 +519,7 @@ int Ions::get_species_id(std::string name) { // Read/Write restart files for the ions //---------------------------------------------------------------------- -bool Ions::restart_file(std::string dir, bool DoRead) { +bool Ions::restart_file(std::string dir, std::string cGridtype, bool DoRead) { std::string filename; bool DidWork = true; @@ -529,7 +527,7 @@ bool Ions::restart_file(std::string dir, bool DoRead) { OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_filename("ions_" + cMember + "_" + cGrid); + RestartContainer.set_filename("ions_" + cMember + "_" + cGrid + "_" + cGridtype); try { if (DoRead) From 63d7cd4fabfcafaff4f8217fa6b5df9f45d6bb5a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:04:36 -0500 Subject: [PATCH 400/691] FEAT: restart for both grid types, output velocity --- include/neutrals.h | 2 +- src/neutrals.cpp | 20 ++++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index 64c69f52..4d9e1499 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -470,7 +470,7 @@ class Neutrals { \param dir directory to write restart files \param DoRead read the restart files if true, write if false **/ - bool restart_file(std::string dir, bool DoRead); + bool restart_file(std::string dir, std::string cGridtype, bool DoRead); /********************************************************************** \brief Exchange messages between processors diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 9e11889a..fc00cc8c 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -422,7 +422,7 @@ int Neutrals::get_species_id(std::string name) { // Read/Write restart files for the neutrals //---------------------------------------------------------------------- -bool Neutrals::restart_file(std::string dir, bool DoRead) { +bool Neutrals::restart_file(std::string dir, std::string cGridtype, bool DoRead) { std::string filename; bool DidWork = true; @@ -431,7 +431,7 @@ bool Neutrals::restart_file(std::string dir, bool DoRead) { OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_filename("neutrals_" + cMember + "_" + cGrid); + RestartContainer.set_filename("neutrals_" + cMember + "_" + cGrid + "_" + cGridtype); try { if (DoRead) @@ -451,6 +451,22 @@ bool Neutrals::restart_file(std::string dir, bool DoRead) { RestartContainer.store_variable(cName, density_unit, species[iSpecies].density_scgc); + + // ---------------------------- + // Velocity (per neutral) + // ---------------------------- + for (int iDir = 0; iDir < 3; iDir++) { + cName = velocity_name[iDir] + " (" + species[iSpecies].cName + ")"; + + if (DoRead) + species[iSpecies].velocity_vcgc[iDir] = + RestartContainer.get_element_value(cName); + else + RestartContainer.store_variable(cName, + velocity_unit, + species[iSpecies]. + velocity_vcgc[iDir]); + } } cName = temperature_name; From dc312af63b753456c7186b779e5acfba76f35a4a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:06:06 -0500 Subject: [PATCH 401/691] BUG: restart with both grids --- src/advance.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 4c051867..6cfae2a0 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -213,8 +213,10 @@ bool advance(Planets &planet, if (time.check_time_gate(input.get_dt_write_restarts())) { report.print(3, "Writing restart files"); - neutrals.restart_file(input.get_restartout_dir(), DoWrite); - ions.restart_file(input.get_restartout_dir(), DoWrite); + neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); + neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); + ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); + ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); time.restart_file(input.get_restartout_dir(), DoWrite); } } From f9e029f4e9d9fb5698085b0cb13fad60c1f46533 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:07:24 -0500 Subject: [PATCH 402/691] FEAT: restart both grids, clean code --- src/main/main.cpp | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 692c8b90..8f7de97c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -24,7 +24,6 @@ int main() { try { // Create inputs (reading the input file): input = Inputs(time); - if (!input.is_ok()) throw std::string("input initialization failed!"); @@ -37,57 +36,48 @@ int main() { // cubesphere (6 root) Quadtree quadtree(input.get_grid_shape("neuGrid")); Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); - if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); // Initialize MPI and parallel aspects of the code: didWork = init_parallel(quadtree, quadtree_ion); - if (!didWork) throw std::string("init_parallel failed!"); // Everything should be set for the inputs now, so write a restart file: didWork = input.write_restart(); - if (!didWork) throw std::string("input.write_restart failed!"); // Initialize the EUV system: Euv euv; - if (!euv.is_ok()) throw std::string("EUV initialization failed!"); // Initialize the planet: Planets planet; - MPI_Barrier(aether_comm); - if (!planet.is_ok()) throw std::string("planet initialization failed!"); // Initialize the indices, read the files, and perturb: Indices indices; didWork = read_and_store_indices(indices); - MPI_Barrier(aether_comm); - if (!didWork) throw std::string("read_and_store_indices failed!"); // Perturb the inputs if user has asked for this indices.perturb(); - MPI_Barrier(aether_comm); // Initialize Geographic grid: Grid gGrid("neuGrid"); didWork = gGrid.init_geo_grid(quadtree, planet); - MPI_Barrier(aether_comm); - if (!didWork) throw std::string("init_geo_grid failed!"); // Find interpolation coefs for the ghostcells if cubesphere grid - didWork = find_ghostcell_interpolation_coefs(gGrid); + //didWork = find_ghostcell_interpolation_coefs(gGrid); + //if (!didWork) + // throw std::string("find_ghostcell_interpolation_coefs failed!"); // Calculate centripetal acceleration, since this is a constant // vector on the grid: @@ -107,14 +97,13 @@ int main() { didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); } - // Initialize Neutrals on geographic grid: + + // Initialize Neutrals on geographic and magnetic grids: Neutrals neutrals(gGrid, planet, time, indices); - // Initialize Neutrals on magnetic grid: Neutrals neutralsMag(mGrid, planet, time, indices); - // Initialize Ions on geographic grid: + // Initialize Ions on geographic and magnetic grids: Ions ions(gGrid, planet); - // Initialize Ions on magnetic grid: Ions ionsMag(mGrid, planet); // ----------------------------------------------------------------- @@ -151,9 +140,8 @@ int main() { read_collision_file(neutrals, ions); read_collision_file(neutralsMag, ionsMag); - // Initialize ion temperatures from neutral temperature + // Initialize ion temperatures from neutral temperature (both grids) ions.init_ion_temperature(neutrals, gGrid); - // Initialize ion temperatures from neutral temperature (on Mag Grid) ionsMag.init_ion_temperature(neutralsMag, mGrid); // Initialize electrodynamics and check if electrodynamics times @@ -239,12 +227,14 @@ int main() { if (!time.check_time_gate(input.get_dt_write_restarts())) { report.print(3, "Writing restart files"); - didWork = neutrals.restart_file(input.get_restartout_dir(), DoWrite); + didWork = neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); + didWork = neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); if (!didWork) throw std::string("Writing Restart for Neutrals Failed!!!\n"); - didWork = ions.restart_file(input.get_restartout_dir(), DoWrite); + didWork = ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); + didWork = ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); if (!didWork) throw std::string("Writing Restart for Ions Failed!!!\n"); From 8827cbfc809c10f6433d8c6737cb4eedf9efed44 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:08:20 -0500 Subject: [PATCH 403/691] MEH: dont do restarts with grid --- src/init_geo_grid.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 2da9bf87..b5452193 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -182,25 +182,25 @@ bool Grid::init_geo_grid(Quadtree quadtree, IsCubeSphereGrid = false; } - if (input.get_do_restart() & iGridShape_ != iCubesphere_) { - report.print(1, "Restarting! Reading grid files!"); - DidWork = read_restart(input.get_restartin_dir()); - } else { + //if (input.get_do_restart() & iGridShape_ != iCubesphere_) { + // report.print(1, "Restarting! Reading grid files!"); + // DidWork = read_restart(input.get_restartin_dir()); + //} else { if (iGridShape_ == iCubesphere_) { - if (input.get_do_restart()) - report.print(0, "Not restarting the grid - it is too complicated!"); + //if (input.get_do_restart()) + // report.print(0, "Not restarting the grid - it is too complicated!"); create_cubesphere_grid(quadtree); } else create_sphere_grid(quadtree); - MPI_Barrier(aether_comm); + //MPI_Barrier(aether_comm); create_altitudes(planet); init_connection(); - DidWork = write_restart(input.get_restartout_dir()); - } + //DidWork = write_restart(input.get_restartout_dir()); + //} // Calculate the radius (for spherical or non-spherical) fill_grid_radius(planet); From 0f94f7ea6853a2592759f81b1f781fd474ff0a7a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:09:56 -0500 Subject: [PATCH 404/691] BUG: restart both grids --- src/neutrals_ics.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 619451b0..3ccea6b8 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -7,7 +7,10 @@ // ----------------------------------------------------------------------------- // Set initial conditions for the neutrals. -// Two methods implemented so far: +// If user wants to restart, then read the restart files. +// Otherwise, initialize the neutrals. +// +// Two methods of initialization implemented so far: // - Planet: Use fixed density values in the planet.in file and the // temperature profile to set the densities and temperature. // Densities are filled with hydrostatic solution. @@ -35,9 +38,12 @@ bool Neutrals::initial_conditions(Grid grid, report.print(3, "Creating Neutrals initial_condition"); + // ---------------------------------------------------------- + // Restart file: + if (input.get_do_restart()) { report.print(1, "Restarting! Reading neutral files!"); - didWork = restart_file(input.get_restartin_dir(), DoRead); + didWork = restart_file(input.get_restartin_dir(), grid.get_gridtype(), DoRead); if (!didWork) report.error("Reading Restart for Neutrals Failed!!!"); @@ -46,6 +52,9 @@ bool Neutrals::initial_conditions(Grid grid, json ics = input.get_initial_condition_types(); std::string icsType = mklower(ics["type"]); + // ---------------------------------------------------------- + // MSIS: + if (icsType == "msis") { report.print(2, "Using MSIS for Initial Conditions"); @@ -98,6 +107,9 @@ bool Neutrals::initial_conditions(Grid grid, } // msis init worked ok } // type = msis + // ---------------------------------------------------------- + // Planet: + if (icsType == "planet") { report.print(2, "Using planet for Initial Conditions"); @@ -161,7 +173,6 @@ bool Neutrals::initial_conditions(Grid grid, // Make the initial condition in the lower ghost cells to be consistent // with the actual lowwer BC: - // Set the lower boundary condition: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.slice(0). From cf3089ba1f83f06bfc31f1d5cd180aaa1e91bfc1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Feb 2025 14:11:00 -0500 Subject: [PATCH 405/691] UPDATE: restart test updated --- tests/restarts/aether.first.json | 30 ++++++++++++++++++++++++------ tests/restarts/aether.second.json | 16 ++-------------- tests/restarts/aether.whole.json | 30 ++++++++++++++++++++++++------ tests/restarts/run_test.sh | 19 +++++++++++++------ 4 files changed, 63 insertions(+), 32 deletions(-) diff --git a/tests/restarts/aether.first.json b/tests/restarts/aether.first.json index 614f0596..9fec0780 100644 --- a/tests/restarts/aether.first.json +++ b/tests/restarts/aether.first.json @@ -5,19 +5,37 @@ "iVerbose" : 0, "dt" : 10.0}, - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, + "neuGrid" : { + "nLons" : 12, + "nLats" : 12, + "nAlts" : 30}, + + "ionGrid": { + "dAltStretch": 0.2, + "LatStretch": 1, + "Shape": "dipole", + "nLonsPerBlock": 18, + "nLatsPerBlock" : 18, + "nAlts":36, + "LatMax":88, + "MinAlt": 80.0, + "MinApex": 125.0 + }, "StartTime" : [2011, 3, 20, 0, 0, 0], - "EndTime" : [2011, 3, 20, 0, 15, 0], + "EndTime" : [2011, 3, 20, 0, 5, 0], "Electrodynamics" : { - "File" : "UA/inputs/b20110320n_omni.bin"}, + "Potential" : "Weimer05", + "DiffuseAurora" : "fta", + "File": "UA/inputs/b20110320n_omni.bin"}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + "Outputs" : { + "type" : ["states"], + "dt" : [60]}, + "Restart" : { "do" : false, "dt" : 900.0} diff --git a/tests/restarts/aether.second.json b/tests/restarts/aether.second.json index 1852fdd1..d9aa928b 100644 --- a/tests/restarts/aether.second.json +++ b/tests/restarts/aether.second.json @@ -5,21 +5,9 @@ "iVerbose" : 0, "dt" : 10.0}, - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - - "StartTime" : [2011, 3, 20, 0, 0, 0], - "EndTime" : [2011, 3, 20, 0, 30, 0], + "EndTime" : [2011, 3, 20, 0, 10, 0], - "Electrodynamics" : { - "File" : "UA/inputs/b20110320n_omni.bin"}, - - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - "Restart" : { - "do" : true, - "dt" : 900.0} + "do" : true} } diff --git a/tests/restarts/aether.whole.json b/tests/restarts/aether.whole.json index 3403f37f..53b964d9 100644 --- a/tests/restarts/aether.whole.json +++ b/tests/restarts/aether.whole.json @@ -5,19 +5,37 @@ "iVerbose" : 0, "dt" : 10.0}, - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, + "neuGrid" : { + "nLons" : 12, + "nLats" : 12, + "nAlts" : 30}, + + "ionGrid": { + "dAltStretch": 0.2, + "LatStretch": 1, + "Shape": "dipole", + "nLonsPerBlock": 18, + "nLatsPerBlock" : 18, + "nAlts":36, + "LatMax":88, + "MinAlt": 80.0, + "MinApex": 125.0 + }, "StartTime" : [2011, 3, 20, 0, 0, 0], - "EndTime" : [2011, 3, 20, 0, 30, 0], + "EndTime" : [2011, 3, 20, 0, 10, 0], "Electrodynamics" : { - "File" : "UA/inputs/b20110320n_omni.bin"}, + "Potential" : "Weimer05", + "DiffuseAurora" : "fta", + "File": "UA/inputs/b20110320n_omni.bin"}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + "Outputs" : { + "type" : ["states"], + "dt" : [60]}, + "Restart" : { "do" : false, "dt" : 900.0} diff --git a/tests/restarts/run_test.sh b/tests/restarts/run_test.sh index 1373de1e..1389ad96 100755 --- a/tests/restarts/run_test.sh +++ b/tests/restarts/run_test.sh @@ -7,20 +7,25 @@ cd run.halves # first part of the run cp ../aether.first.json ./aether.json ./aether + cd UA ; rm -f restartIn ; cp -R restartOut restartIn ; cd .. # second part of the run cp ../aether.second.json ./aether.json ./aether + + # plot the output cd UA/output ../../../../../srcPython/postAether.py -alt=-1 -rm # [O]: -aether_plot_simple.py -var=density_O -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=density_O -alt=250 3DALG_20110320_00*.nc # Tn: -aether_plot_simple.py -var=Temperature_neutral -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=Temperature_neutral -alt=250 3DALG_20110320_00*.nc # [e-] -aether_plot_simple.py -var=density_e- -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=density_e- -alt=120 3DALG_20110320_00*.nc +# East Velocity +aether_plot_simple.py -var=velocity_east_neutral -alt=250 3DALG_20110320_00*.nc cd ../../.. @@ -32,11 +37,13 @@ cp ../aether.whole.json ./aether.json cd UA/output ../../../../../srcPython/postAether.py -alt=-1 -rm # [O]: -aether_plot_simple.py -var=density_O -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=density_O -alt=250 3DALG_20110320_00*.nc # Tn: -aether_plot_simple.py -var=Temperature_neutral -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=Temperature_neutral -alt=250 3DALG_20110320_00*.nc # [e-] -aether_plot_simple.py -var=density_e- -alt=250 3DALL_20110320_003000.nc +aether_plot_simple.py -var=density_e- -alt=120 3DALG_20110320_00*.nc +# East Velocity +aether_plot_simple.py -var=velocity_east_neutral -alt=250 3DALG_20110320_00*.nc cd ../../.. From 4a9c80492bae1395b4712fdae28d6417699067d6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:05:15 -0500 Subject: [PATCH 406/691] Allow more failures --- src/read_input_file.cpp | 102 ++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 52 deletions(-) diff --git a/src/read_input_file.cpp b/src/read_input_file.cpp index 842c2c06..389e0878 100644 --- a/src/read_input_file.cpp +++ b/src/read_input_file.cpp @@ -31,74 +31,72 @@ bool Inputs::read_inputs_json(Times &time) { isOk = set_verbose(settings); try { - // Then read in user perturbations on those defaults: user_inputs = read_json("aether.json"); - isOk = set_verbose(user_inputs); - - // Read in a restart file also if user specified it. - // - Here we merge the restart inputs with the defaults inputs - // - This is BEFORE the user inputs are merged!!! - - if (user_inputs.contains("Restart")) { - if (user_inputs["Restart"].contains("do")) { - if (user_inputs["Restart"]["do"]) { - std::string restart_file = get_setting_str("Restart", "InDir"); - restart_file = restart_file + "/settings.json"; - json restart_inputs; - restart_inputs = read_json(restart_file); - // This forces the logfile to append. User can override - // if they really want: - restart_inputs["Logfile"]["append"] = true; - settings.merge_patch(restart_inputs); - } + } catch (...) { + report.error("Error in reading inputs!"); + isOk = false; + } + + isOk = set_verbose(user_inputs); + + // Read in a restart file also if user specified it. + // - Here we merge the restart inputs with the defaults inputs + // - This is BEFORE the user inputs are merged!!! + if (user_inputs.contains("Restart")) { + if (user_inputs["Restart"].contains("do")) { + if (user_inputs["Restart"]["do"]) { + std::string restart_file = get_setting_str("Restart", "InDir"); + restart_file = restart_file + "/settings.json"; + json restart_inputs; + restart_inputs = read_json(restart_file); + // This forces the logfile to append. User can override + // if they really want: + restart_inputs["Logfile"]["append"] = true; + settings.merge_patch(restart_inputs); } } + } - // Merge the defaults/restart settings with the user provided - // settings, with the default/restart settings being the default: - settings.merge_patch(user_inputs); - - //change planet file to the one specified on aether.json: - if (isOk) - settings["PlanetSpeciesFile"] = get_setting_str("Planet", "file"); + // Merge the defaults/restart settings with the user provided + // settings, with the default/restart settings being the default: + settings.merge_patch(user_inputs); - std::string planet_filename = get_setting_str("PlanetSpeciesFile"); - report.print(1, "Using planet file : " + planet_filename); + //change planet file to the one specified on aether.json: + if (isOk) + settings["PlanetSpeciesFile"] = get_setting_str("Planet", "file"); - // Debug Stuff: - if (isOk) - report.set_verbose(get_setting_int("Debug", "iVerbose")); + std::string planet_filename = get_setting_str("PlanetSpeciesFile"); + report.print(1, "Using planet file : " + planet_filename); - if (isOk) - report.set_DefaultVerbose(get_setting_int("Debug", "iVerbose")); + // Debug Stuff: + if (isOk) + report.set_verbose(get_setting_int("Debug", "iVerbose")); - if (isOk) - report.set_doInheritVerbose(get_setting_bool("Debug", "doInheritVerbose")); + if (isOk) + report.set_DefaultVerbose(get_setting_int("Debug", "iVerbose")); - if (isOk) - report.set_timing_depth(get_setting_int("Debug", "iTimingDepth")); + if (isOk) + report.set_doInheritVerbose(get_setting_bool("Debug", "doInheritVerbose")); - if (isOk) - report.set_timing_percent(get_setting_float("Debug", "TimingPercent")); + if (isOk) + report.set_timing_depth(get_setting_int("Debug", "iTimingDepth")); - if (isOk) - report.set_iProc(get_setting_int("Debug", "iProc")); + if (isOk) + report.set_timing_percent(get_setting_float("Debug", "TimingPercent")); - for (auto &item : settings["Debug"]["iFunctionVerbose"].items()) - report.set_FunctionVerbose(item.key(), item.value()); + if (isOk) + report.set_iProc(get_setting_int("Debug", "iProc")); - // Capture time information: - if (isOk) - time.set_times(get_setting_timearr("StartTime")); + for (auto &item : settings["Debug"]["iFunctionVerbose"].items()) + report.set_FunctionVerbose(item.key(), item.value()); - if (isOk) - time.set_end_time(get_setting_timearr("EndTime")); + // Capture time information: + if (isOk) + time.set_times(get_setting_timearr("StartTime")); - } catch (...) { - report.error("Error in reading inputs!"); - isOk = false; - } + if (isOk) + time.set_end_time(get_setting_timearr("EndTime")); return isOk; } From e8199d94ad5ac70d5e5a1c1fc54397944ffe9811 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:05:52 -0500 Subject: [PATCH 407/691] FEAT: create series of restarts --- srcPython/run_restarts.py | 276 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100755 srcPython/run_restarts.py diff --git a/srcPython/run_restarts.py b/srcPython/run_restarts.py new file mode 100755 index 00000000..3945eeec --- /dev/null +++ b/srcPython/run_restarts.py @@ -0,0 +1,276 @@ +#!/usr/bin/env python3 + +import argparse +import datetime as dt +import json +import os + +# ---------------------------------------------------------------------- +# Function to parse input arguments +# ---------------------------------------------------------------------- + +def get_args_restart(): + + parser = argparse.ArgumentParser(description = + 'Run series of restarts for Aether') + parser.add_argument('-input', + help = 'aether json file for whole run', + default = 'aether.json.whole') + + parser.add_argument('-mpi', + help = 'mpirun command', + default = 'mpirun') + + parser.add_argument('-post', + help = 'post processing command', + default = '~/bin/postAether.py') + + parser.add_argument('-aether', + help = 'aether command', + default = './aether') + + parser.add_argument('-rundir', + help = 'path to the default run directory', + default = './share/run') + + parser.add_argument('-restarts', + help = 'number of restarts', + default = 1, type = int) + + parser.add_argument('-ensembles', + help = 'number of ensemble members', + default = 3, type = int) + + parser.add_argument('-blocks', + help = 'number of blocks in each ensemble member', + default = 1, type = int) + + parser.add_argument('-totaltime', + help = 'total time (in seconds) of run (-1 = ignore)', + default = -1, type = int) + + parser.add_argument('-test', \ + help='just output the files and dont run', \ + action="store_true") + + parser.add_argument('-dowhole', \ + help='include the whole run for comparison', \ + action="store_true") + + args = parser.parse_args() + + return args + +# ---------------------------------------------------------------------- +# Get the start time, end time, and delta-t from the whole run dict: +# ---------------------------------------------------------------------- + +def get_times(wholeDict): + + if ('StartTime' in wholeDict): + st = wholeDict['StartTime'] + startTime = dt.datetime(st[0], st[1], st[2], st[3], st[4], st[5]) + else: + startTime = None + if ('EndTime' in wholeDict): + et = wholeDict['EndTime'] + endTime = dt.datetime(et[0], et[1], et[2], et[3], et[4], et[5]) + else: + endTime = None + if (startTime and endTime): + deltaTime = (endTime - startTime).total_seconds() + else: + deltaTime = -1.0 + + return startTime, endTime, deltaTime + +# ---------------------------------------------------------------------- +# run os command +# ---------------------------------------------------------------------- + +def run(command, isTest, isVerbose): + if (isVerbose): + print(' -> Running : ', command) + if (not isTest): + os.system(command) + return + +# ---------------------------------------------------------------------- +# Main code: +# ---------------------------------------------------------------------- + +if __name__ == '__main__': + + args = get_args_restart() + + isVerbose = True + + inFile = args.input + nRestarts = args.restarts + nMembers = args.ensembles + nBlocks = args.blocks + + nProcs = nBlocks * nMembers + + aetherCommand = args.aether + + runDir = args.rundir + notInRunDir = False + + if (not os.path.exists(aetherCommand)): + print('-> Can not find aether command : ', aetherCommand) + notInRunDir = True + + if (not os.path.exists('./UA')): + print('-> Can not find UA directory!') + notInRunDir = True + + if (notInRunDir): + if (os.path.exists(runDir)): + print('Found rundir... copying') + dirPre = './run.restarts' + cdPre = 'cd ' + dirPre + ' ; ' + cdPost = ' ; cd ..' + command = 'rm -rf ' + dirPre + command = 'cp -r ' + runDir + ' ' + dirPre + run(command, args.test, isVerbose) + else: + print('-> Can not find rundir to copy!') + print('use -rundir to tell where to find the default run directory') + exit() + else: + cdPre = '' + cdPost = '' + dirPre = '.' + + runCommand = cdPre + args.mpi + ' -np %d ' % nProcs + runCommand = runCommand + aetherCommand + cdPost + + postCommand = args.post + ' -rm' + + print('Number of Ensemble Members : ', nMembers) + print('Number of blocks in each member : ', nBlocks) + print(' --> nProcessors : ', nProcs) + + with open(inFile, 'r') as filePointer: + # Reading from json file + wholeDict = json.load(filePointer) + filePointer.close() + + sTime, eTime, dTime = get_times(wholeDict) + + if (args.totaltime > 0): + dTime = args.totaltime + + if (dTime < 0.0): + print('Some sort of error determining time interval for run') + print('please check StartTime and EndTime in whole run file') + exit() + + if ('Perturb' in wholeDict): + perturb = wholeDict['Perturb'] + else: + perturb = {'f107': {'Mean' : 1.0, + 'Std' : 0.0, + 'Add': False, + 'Constant': True}} + wholeDict['Perturb'] = perturb + + if ('Ensembles' in wholeDict): + wholeDict['Ensembles']['nMembers'] = nMembers + else: + wholeDict['Ensembles']['nMembers'] = nMembers + + interval = dTime / (nRestarts + 1) + + if ('Restart' in wholeDict): + wholeDict['Restart']['do'] = False + wholeDict['Restart']['dt'] = interval + else: + wholeDict['Restart'] = {'do' : False, + 'dt' : interval} + + subDict = {'Ensembles' : {'nMembers': nMembers}, + 'Restart': {'do' : True, 'dt': interval}, + 'Perturb': perturb} + + print(' --> StartTime set to : ', sTime) + + for iRun in range(nRestarts + 2): + + isTest = args.test + if (iRun == 0): + if (not args.dowhole): + isTest = True + + cRun = '%04d' % iRun + print('Iteration: ', iRun) + if (iRun > 0): + endtime = sTime + dt.timedelta(seconds = interval * iRun) + else: + endtime = sTime + dt.timedelta(seconds = dTime) + endtimeAsArray = [endtime.year, + endtime.month, + endtime.day, + endtime.hour, + endtime.minute, + endtime.second] + print(' --> EndTime set to : ', endtime) + + if (args.test): + outFile = dirPre + '/aether_' + cRun + '.json' + else: + outFile = dirPre + '/aether.json' + + if (iRun <= 1): + wholeDict['EndTime'] = endtimeAsArray + jsonObject = json.dumps(wholeDict) + else: + subDict['EndTime'] = endtimeAsArray + jsonObject = json.dumps(subDict) + + print(' --> Writing File : ', outFile) + with open(outFile, "w") as outfile: + outfile.write(jsonObject) + + # ------------------------------------------------------------------ + # run Aether + command = runCommand + ' 2>&1 | tee output_' + cRun + '.log' + run(command, isTest, isVerbose) + + # ---------------------- + # remove target directories + command = \ + 'cd ' + dirPre + '/UA ; ' + \ + 'rm -rf output_' + cRun + \ + ' ; cd ..' + cdPost + run(command, isTest, isVerbose) + + command = \ + 'cd ' + dirPre + '/UA ; ' + \ + 'rm -rf restartOut_' + cRun + \ + ' ; cd ..' + cdPost + run(command, isTest, isVerbose) + + # ---------------------- + # Post Processing + command = \ + 'cd ' + dirPre + '/UA/output ; ' + \ + postCommand + \ + ' ; cd .. ; ' + \ + 'mv output output_' + cRun + \ + ' ; mkdir output ' + \ + ' ; cd ..' + cdPost + run(command, isTest, isVerbose) + + # ---------------------- + # Set up restart directories + command = \ + 'cd ' + dirPre + '/UA ; ' + \ + 'mv restartOut restartOut_' + cRun + \ + ' ; rm -f ./restartIn ' + \ + ' ; ln -s restartOut_' + cRun + ' ./restartIn ' + \ + ' ; mkdir restartOut ' + \ + ' ; cd ..' + cdPost + run(command, isTest, isVerbose) + From 2638ff9415e0646fed06f413b7e54f90f16250d2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:14:32 -0500 Subject: [PATCH 408/691] BUG: actually run remove command --- srcPython/run_restarts.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/srcPython/run_restarts.py b/srcPython/run_restarts.py index 3945eeec..c89a63e3 100755 --- a/srcPython/run_restarts.py +++ b/srcPython/run_restarts.py @@ -128,10 +128,12 @@ def run(command, isTest, isVerbose): if (notInRunDir): if (os.path.exists(runDir)): print('Found rundir... copying') + dirPre = './run.restarts' cdPre = 'cd ' + dirPre + ' ; ' cdPost = ' ; cd ..' command = 'rm -rf ' + dirPre + run(command, args.test, isVerbose) command = 'cp -r ' + runDir + ' ' + dirPre run(command, args.test, isVerbose) else: From 40063d7131b423f439ddbc65a8f1e9f353f33fb0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:21:18 -0500 Subject: [PATCH 409/691] FEAT: developed python code for restarts --- tests/restart_ensembles/aether.json.restart1 | 67 -------------------- tests/restart_ensembles/aether.json.restart2 | 67 -------------------- tests/restart_ensembles/aether.json.start | 67 -------------------- 3 files changed, 201 deletions(-) delete mode 100644 tests/restart_ensembles/aether.json.restart1 delete mode 100644 tests/restart_ensembles/aether.json.restart2 delete mode 100644 tests/restart_ensembles/aether.json.start diff --git a/tests/restart_ensembles/aether.json.restart1 b/tests/restart_ensembles/aether.json.restart1 deleted file mode 100644 index ecf11375..00000000 --- a/tests/restart_ensembles/aether.json.restart1 +++ /dev/null @@ -1,67 +0,0 @@ - -{ - "Ensembles" : { - "nMembers" : 5}, - - "Perturb": { - "f107" : { "Mean" : 1.0, - "Std" : 0.1, - "Add" : false, - "Constant" : true}, - "f107a" : { "Mean" : 1.0, - "Std" : 0.02, - "Add" : false, - "Constant" : true}}, - - "Restart" : { - "do" : true, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0}, - - "Debug" : { - "iVerbose" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "dt" : 10.0, - "check_for_nans" : false - }, - - "EndTime" : [2011, 3, 20, 0, 10, 0], - - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - - "GeoGrid" : { - "dAlt" : 0.25, - "IsUniformAlt" : false}, - - "InitialConditions" : { - "type" : "msis"}, - - "BoundaryConditions" : { - "type" : "msis"}, - - "Advection" : { - "Neutrals" : { - "Vertical" : "hydro", - "Horizontal" : "default"}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, - - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", - - "Outputs" : { - "type" : ["states"], - "dt" : [900] }, - - "DoCalcBulkIonTemp" : false, - - "PlanetFile" : "UA/inputs/earth.in" - -} diff --git a/tests/restart_ensembles/aether.json.restart2 b/tests/restart_ensembles/aether.json.restart2 deleted file mode 100644 index 2d83d738..00000000 --- a/tests/restart_ensembles/aether.json.restart2 +++ /dev/null @@ -1,67 +0,0 @@ - -{ - "Ensembles" : { - "nMembers" : 5}, - - "Perturb": { - "f107" : { "Mean" : 0.9, - "Std" : 0.1, - "Add" : false, - "Constant" : true}, - "f107a" : { "Mean" : 1.0, - "Std" : 0.02, - "Add" : false, - "Constant" : true}}, - - "Restart" : { - "do" : true, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0}, - - "Debug" : { - "iVerbose" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "dt" : 10.0, - "check_for_nans" : false - }, - - "EndTime" : [2011, 3, 20, 0, 10, 0], - - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - - "GeoGrid" : { - "dAlt" : 0.25, - "IsUniformAlt" : false}, - - "InitialConditions" : { - "type" : "msis"}, - - "BoundaryConditions" : { - "type" : "msis"}, - - "Advection" : { - "Neutrals" : { - "Vertical" : "hydro", - "Horizontal" : "default"}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, - - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", - - "Outputs" : { - "type" : ["states"], - "dt" : [900] }, - - "DoCalcBulkIonTemp" : false, - - "PlanetFile" : "UA/inputs/earth.in" - -} diff --git a/tests/restart_ensembles/aether.json.start b/tests/restart_ensembles/aether.json.start deleted file mode 100644 index da15c5ee..00000000 --- a/tests/restart_ensembles/aether.json.start +++ /dev/null @@ -1,67 +0,0 @@ - -{ - "Ensembles" : { - "nMembers" : 5}, - - "Perturb": { - "f107" : { "Mean" : 1.0, - "Std" : 0.1, - "Add" : false, - "Constant" : true}, - "f107a" : { "Mean" : 1.0, - "Std" : 0.02, - "Add" : false, - "Constant" : true}}, - - "Restart" : { - "do" : false, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0}, - - "Debug" : { - "iVerbose" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "dt" : 10.0, - "check_for_nans" : false - }, - - "EndTime" : [2011, 3, 20, 0, 5, 0], - - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - - "GeoGrid" : { - "dAlt" : 0.25, - "IsUniformAlt" : false}, - - "InitialConditions" : { - "type" : "msis"}, - - "BoundaryConditions" : { - "type" : "msis"}, - - "Advection" : { - "Neutrals" : { - "Vertical" : "hydro", - "Horizontal" : "default"}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, - - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", - - "Outputs" : { - "type" : ["states"], - "dt" : [900] }, - - "DoCalcBulkIonTemp" : false, - - "PlanetFile" : "UA/inputs/earth.in" - -} From ef641ee7899bb23aeeb6924335308da943d079b4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:22:09 -0500 Subject: [PATCH 410/691] UPDATED to latest --- tests/restart_ensembles/aether.json.whole | 60 +++++++++-------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/tests/restart_ensembles/aether.json.whole b/tests/restart_ensembles/aether.json.whole index 5805cf9b..5cb6453a 100644 --- a/tests/restart_ensembles/aether.json.whole +++ b/tests/restart_ensembles/aether.json.whole @@ -7,36 +7,33 @@ "f107" : { "Mean" : 1.0, "Std" : 0.1, "Add" : false, - "Constant" : true}, - "f107a" : { "Mean" : 1.0, - "Std" : 0.02, - "Add" : false, - "Constant" : true}}, + "Constant" : true}}, "Restart" : { "do" : false, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0}, + "dt" : 900.0}, "Debug" : { - "iVerbose" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "dt" : 10.0, - "check_for_nans" : false - }, + "iVerbose" : 0}, + "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 10, 0], - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - - "GeoGrid" : { - "dAlt" : 0.25, - "IsUniformAlt" : false}, + "neuGrid" : { + "nLons" : 12, + "nLats" : 12, + "nAlts" : 30}, + + "ionGrid": { + "dAltStretch": 0.2, + "LatStretch": 1, + "Shape": "dipole", + "nLonsPerBlock": 18, + "nLatsPerBlock" : 18, + "nAlts":36, + "LatMax":88, + "MinAlt": 80.0, + "MinApex": 125.0}, "InitialConditions" : { "type" : "msis"}, @@ -44,24 +41,15 @@ "BoundaryConditions" : { "type" : "msis"}, - "Advection" : { - "Neutrals" : { - "Vertical" : "hydro", - "Horizontal" : "default"}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta", + "File": "UA/inputs/b20110320n_omni.bin"}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - - "ElectrodynamicsFile" : "UA/inputs/b20110320n_omni.bin", "Outputs" : { "type" : ["states"], - "dt" : [900] }, - - "DoCalcBulkIonTemp" : false, - - "PlanetFile" : "UA/inputs/earth.in" + "dt" : [60] } } From 64024f19a48cacd8f9f00ce55dd5831fe486fedb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 28 Feb 2025 08:22:46 -0500 Subject: [PATCH 411/691] FEAT: use python code for restarts --- tests/restart_ensembles/run_all.sh | 39 +++++------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/tests/restart_ensembles/run_all.sh b/tests/restart_ensembles/run_all.sh index 64de4caa..c5afae65 100755 --- a/tests/restart_ensembles/run_all.sh +++ b/tests/restart_ensembles/run_all.sh @@ -1,38 +1,11 @@ #!/bin/sh -rm -rf run.test -cp -R ../../share/run ./run.test -cd run.test +NPROC=5 +TOTALTIME=180 +MPI=/Users/ridley/Software/Mpi/installed/bin/mpirun +NTIMES=2 -rm -f aether.json UA/output/* -rm -rf UA/restart* ; mkdir UA/restartOut -rm -rf UA/output_whole -rm -rf UA/output_nonperturbed -rm -rf UA/output_perturbed -rm -rf UA/output_save - -cp ../aether.json.whole aether.json -mpirun -np 20 ./aether -cd UA/output ; ../../../../../srcPython/plot_logfiles.py -vars=10 log_m00*.txt ; cd - -cd UA ; mv output output_whole ; mkdir output ; cd - -rm -f aether.json - -rm -f aether.json UA/output/* UA/restartOut/* -cp ../aether.json.start aether.json -mpirun -np 20 ./aether -cd UA ; mv restartOut restartIn ; mkdir restartOut ; cd - -cd UA ; cp -R output output_save ; cd .. - -rm -f aether.json -cp ../aether.json.restart1 aether.json -mpirun -np 20 ./aether -cd UA/output ; ../../../../../srcPython/plot_logfiles.py -vars=10 log_m00*.txt ; cd - -cd UA ; mv output output_nonperturbed ; cp -R output_save output ; cd - - -rm -f aether.json -cp ../aether.json.restart2 aether.json -mpirun -np 20 ./aether -cd UA/output ; ../../../../../srcPython/plot_logfiles.py -vars=10 log_m00*.txt ; cd - -cd UA ; mv output output_perturbed ; mkdir output ; cd - +# include -dowhole to run the whole simulation as comparison: +../../srcPython/run_restarts.py -totaltime=${TOTALTIME} -mpi=${MPI} -rundir=../../share/run -ensembles=${NPROC} -restarts=${NTIMES} From 55a855f194d487bab6e3fc01517502e4816ed5d3 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 28 Feb 2025 08:36:12 -0500 Subject: [PATCH 412/691] FEAT: better place for mpirun --- tests/restart_ensembles/run_all.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/restart_ensembles/run_all.sh b/tests/restart_ensembles/run_all.sh index c5afae65..6d2c6d49 100755 --- a/tests/restart_ensembles/run_all.sh +++ b/tests/restart_ensembles/run_all.sh @@ -2,7 +2,7 @@ NPROC=5 TOTALTIME=180 -MPI=/Users/ridley/Software/Mpi/installed/bin/mpirun +MPI=/usr/bin/mpirun NTIMES=2 # include -dowhole to run the whole simulation as comparison: From e2caabe5c7da3a583a2417757b60b7c02d7edbee Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 28 Feb 2025 10:29:49 -0500 Subject: [PATCH 413/691] BUG: need / in path --- src/output_netcdf.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/output_netcdf.cpp b/src/output_netcdf.cpp index 1c3e48df..4a30ef9e 100644 --- a/src/output_netcdf.cpp +++ b/src/output_netcdf.cpp @@ -68,7 +68,7 @@ void output_netcdf_3d(std::vector count_start, bool OutputContainer::read_container_netcdf() { bool didWork = true; - std::string whole_filename = directory + filename + ".nc"; + std::string whole_filename = directory + '/' + filename + ".nc"; std::string UNITS = "units"; try { @@ -161,7 +161,7 @@ bool OutputContainer::read_container_netcdf() { bool OutputContainer::write_container_netcdf() { bool didWork = true; - std::string whole_filename = directory + filename + ".nc"; + std::string whole_filename = directory + '/' + filename + ".nc"; std::string UNITS = "units"; std::string LONG_NAME = "long_name"; From 567fd991e00442688ee8028de42b0c18c204e70d Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 7 Mar 2025 14:30:52 -0500 Subject: [PATCH 414/691] change cos_lat limits and use clamp --- src/grid_sphere.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/grid_sphere.cpp b/src/grid_sphere.cpp index 41b6f2f4..8f940ff9 100644 --- a/src/grid_sphere.cpp +++ b/src/grid_sphere.cpp @@ -154,7 +154,7 @@ void Grid::create_sphere_grid(Quadtree quadtree) { } arma_cube cos_lat = cos(geoLat_scgc); - cos_lat.elem( find(cos_lat < 0.00001) ).fill(0.00001); + cos_lat.clamp(0.0001, 1.0); y_Center = geoLat_scgc; x_Center = geoLon_scgc % cos_lat; @@ -180,7 +180,7 @@ void Grid::create_sphere_grid(Quadtree quadtree) { } arma_cube cos_lat_L = cos(geoLat_Left); - cos_lat_L.elem( find(cos_lat_L < 0.00001) ).fill(0.00001); + cos_lat_L.clamp(0.0001, 1.0); x_Left = geoLon_Left % cos_lat_L; dy_Left.set_size(nLons, nLats, nAlts); @@ -206,7 +206,7 @@ void Grid::create_sphere_grid(Quadtree quadtree) { } arma_cube cos_lat_D = cos(geoLat_Down); - cos_lat_D.elem( find(cos_lat_D < 0.00001) ).fill(0.00001); + cos_lat_D.clamp(0.0001, 1.0); y_Down = geoLat_Down; dx_Down = dlon * cos_lat_D; From 4f1ffafeec0876be47cd48d2c6a310aca1fd4f0e Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 7 Mar 2025 14:31:55 -0500 Subject: [PATCH 415/691] FEAT: enable dipole6 --- src/quadtree.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 8cc813e4..26a3c4a4 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -18,11 +18,14 @@ int64_t iProcQuery = -1; Quadtree::Quadtree(std::string shape) { if (shape == "cubesphere") nRootNodes = 6; - + if (shape == "sphere") + nRootNodes = 1; + if (shape == "dipole") + nRootNodes = 1; if (shape == "dipole2") nRootNodes = 2; - else - nRootNodes = 1; + if (shape == "dipole6") + nRootNodes = 6; } // -------------------------------------------------------------------------- @@ -73,6 +76,13 @@ void Quadtree::build(std::string gridtype) { IsSphere = true; } + if (grid_input.shape == "dipole6") { + origins = Dipole6::ORIGINS; + rights = Dipole6::RIGHTS; + ups = Dipole6::UPS; + IsSphere = true; + } + arma_vec o(3), r(3), u(3); // This captures the limits of the sphere, independent of what the From dba20a07934f5b24b71a8e67eddf55370570460b Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 7 Mar 2025 14:33:08 -0500 Subject: [PATCH 416/691] getting to work --- src/solver_advection.cpp | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 51df35f4..570b1984 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -343,6 +343,8 @@ void advect(Grid &grid, arma_mat t_to_e; + precision_t duflux, lrflux, cosdrop; + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { if (report.test_verbose(3)) @@ -424,13 +426,13 @@ void advect(Grid &grid, eq2FluxD = rhoP.D % xVelP.D % yVelP.D; eq2FluxU = rhoP.U % xVelP.U % yVelP.U; eq2Flux = rho % xVel % yVel; - + eq3FluxR = rhoP.R % xVelP.R % yVelP.R; eq3FluxL = rhoP.L % xVelP.L % yVelP.L; eq3FluxD = rhoP.D % (yVelP.D % yVelP.D + (gammaP.D - 1) % tempP.D); eq3FluxU = rhoP.U % (yVelP.U % yVelP.U + (gammaP.U - 1) % tempP.U); eq3Flux = rho % (yVel % yVel + (gamma2d - 1) % temp); - + eq4FluxL = rhoP.L % xVelP.L % (0.5 * velL2 + gammaP.L % tempP.L); eq4FluxR = rhoP.R % xVelP.R % (0.5 * velR2 + gammaP.R % tempP.R); eq4FluxD = rhoP.D % yVelP.D % (0.5 * velD2 + gammaP.D % tempP.D); @@ -499,29 +501,36 @@ void advect(Grid &grid, geometry = sin(grid.geoLat_scgc.slice(iAlt)) / - cos(grid.geoLat_scgc.slice(iAlt)) / - grid.radius_scgc(1, 1, iAlt); + cos(grid.geoLat_scgc.slice(iAlt)); + + geometry.clamp(-100.0, 100.0); + geometry = geometry / grid.radius_scgc(1, 1, iAlt); for (int64_t j = nGCs; j < nY - nGCs; j++) { for (int64_t i = nGCs; i < nX - nGCs; i++) { - //if (i == nGCs) cout << "j = " << j << " " << xWidth(i,j) << "\n"; rho(i, j) = rho(i, j) - dt * (yWidth(i + 1, j) * eq1FluxLR(i + 1, j) - yWidth(i, j) * eq1FluxLR(i, j) + xWidth(i, j + 1) * eq1FluxDU(i, j + 1) - xWidth(i, j) * eq1FluxDU(i, j)) / area(i, j); + lrflux = 1.0 * ( + (yWidth(i + 1, j) * eq2FluxLR(i + 1, j) - + yWidth(i, j) * eq2FluxLR(i, j)) / area(i,j) - + geometry(i, j) * eq2Flux(i, j)); xMomentum(i, j) = xMomentum(i, j) - dt * - ((yWidth(i + 1, j) * eq2FluxLR(i + 1, j) - - yWidth(i, j) * eq2FluxLR(i, j) + - xWidth(i, j + 1) * eq2FluxDU(i, j + 1) - - xWidth(i, j) * eq2FluxDU(i, j)) / area(i, j) - - geometry(i, j) * eq2Flux(i, j)); + ((xWidth(i, j + 1) * eq2FluxDU(i, j + 1) - + xWidth(i, j) * eq2FluxDU(i, j)) / area(i, j) + + lrflux); + duflux = 1.0 * ( + (xWidth(i, j + 1) * eq3FluxDU(i, j + 1) - + xWidth(i, j) * eq3FluxDU(i, j)) / area(i, j) + + geometry(i, j) * eq3Flux(i, j)); + yMomentum(i, j) = yMomentum(i, j) - dt * ((yWidth(i + 1, j) * eq3FluxLR(i + 1, j) - - yWidth(i, j) * eq3FluxLR(i, j) + - xWidth(i, j + 1) * eq3FluxDU(i, j + 1) - - xWidth(i, j) * eq3FluxDU(i, j)) / area(i, j) + - geometry(i, j) * eq3Flux(i, j)); + yWidth(i, j) * eq3FluxLR(i, j))/ area(i, j) + + duflux); + totalE(i, j) = totalE(i, j) - dt * (yWidth(i + 1, j) * eq4FluxLR(i + 1, j) - yWidth(i, j) * eq4FluxLR(i, j) + From 43a3c67dc060c6ad6ad040667bcfd79ae8dd38e5 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Fri, 7 Mar 2025 14:33:58 -0500 Subject: [PATCH 417/691] BUG: need to pass all densities --- src/exchange_messages.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 5ede03a6..bd5964ab 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -18,8 +18,8 @@ bool Neutrals::exchange_old(Grid &grid) { int64_t nGCs = grid.get_nGCs(); for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - if (species[iSpecies].DoAdvect) - DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); + //if (species[iSpecies].DoAdvect) + DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); } DidWork = exchange_one_var(grid, temperature_scgc, false); @@ -1033,14 +1033,14 @@ bool exchange_one_var(Grid &grid, MPI_Barrier(aether_comm); // If this is a cubesphere grid, interpolate ghostcells to their proper location - if (grid.IsCubeSphereGrid & grid.gcInterpolationSet) { - report.print(3, "Interpolating Ghostcells to Proper Location"); - var_scgc = interpolate_ghostcells(var_to_pass, grid); - var_to_pass = var_scgc; - } + //if (grid.IsCubeSphereGrid & grid.gcInterpolationSet) { + // report.print(3, "Interpolating Ghostcells to Proper Location"); + // var_scgc = interpolate_ghostcells(var_to_pass, grid); + // var_to_pass = var_scgc; + //} // Now we fill in the corners so that we don't have zero values there: - fill_corners(var_to_pass, nG); + //fill_corners(var_to_pass, nG); report.exit(function); return DidWork; From abea9579f1be7336f94bd26ca7ae55b2b1f53e93 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 8 Mar 2025 20:41:43 -0500 Subject: [PATCH 418/691] STY: Astyle, yo --- src/advance.cpp | 6 ++- src/aurora.cpp | 7 +++- src/calc_neutral_derived.cpp | 3 +- src/grid_spacing.cpp | 3 ++ src/init_geo_grid.cpp | 24 ++++++----- src/init_mag_grid.cpp | 6 ++- src/ions.cpp | 6 ++- src/neutrals.cpp | 6 ++- src/neutrals_ics.cpp | 2 + src/quadtree.cpp | 6 ++- src/solver_advection.cpp | 34 +++++++-------- src/solver_gradients.cpp | 81 +++++++++++++++++++++--------------- src/tools.cpp | 2 + 13 files changed, 114 insertions(+), 72 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 6cfae2a0..023a73d5 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -213,8 +213,10 @@ bool advance(Planets &planet, if (time.check_time_gate(input.get_dt_write_restarts())) { report.print(3, "Writing restart files"); - neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); - neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); + neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), + DoWrite); + neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), + DoWrite); ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); time.restart_file(input.get_restartout_dir(), DoWrite); diff --git a/src/aurora.cpp b/src/aurora.cpp index 0ecd0c83..93a731bc 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -178,14 +178,18 @@ void calc_aurora(Grid grid, for (int64_t iBin = 0; iBin < nBins; iBin++) { lnE = log(auroral_energies(iBin)); + // loop through Pij values to get vector of Ci values. This is // directly from Fang et al., [2010]: for (int i = 0; i < 8; i++) { precision_t tot = 0; + for (int j = 0; j < 4; j++) tot = tot + Pij.at(i, j) * pow(lnE, j); + Ci[i] = exp(tot); } + CiArray.push_back(Ci); } @@ -257,6 +261,7 @@ void calc_aurora(Grid grid, arma_vec temp; ionization1d.zeros(); + for (int iBin = 0; iBin < nBins; iBin++) { Ci = CiArray[iBin]; temp = calculate_fang_v2(auroral_energies(iBin), @@ -269,7 +274,7 @@ void calc_aurora(Grid grid, } // /cm3 -> /m3 - ionization1d = ionization1d * pcm3topm3 /100.0; + ionization1d = ionization1d * pcm3topm3 / 100.0; // Step 5: Distribute ionization among neutrals: // Need to figure out which species get what percentage of the diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 856349f5..541dbb77 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -585,7 +585,8 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].density_scgc.slice(iAlt) % species[iSpecies].scale_height_scgc.slice(iAlt); - species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice(iAlt) * species[iSpecies].mass; + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice( + iAlt) * species[iSpecies].mass; for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { // dr is used here instead of dalt, since we only want the radial integration, while diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 81c786f6..ea3e4d74 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -201,6 +201,7 @@ void Grid::calc_i_grid_spacing() { di_edge.row(iX) = i_center_scgc.row(iX) - i_center_scgc.row(iX - 1); } + // Bottom (one sided): iX = 0; di_center_scgc.row(iX) = @@ -226,6 +227,7 @@ void Grid::calc_i_grid_spacing() { // edge is in-line with the j center di_edge_m = di_edge_m % abs(cos(j_center_scgc)); } + // Need a similar thing for the dipole grid here! if (iGridShape_ == iDipole_) { // do something here! @@ -313,6 +315,7 @@ void Grid::calc_j_grid_spacing() { dj_center_m_scgc = dj_center_scgc % radius_scgc; dj_edge_m = dj_edge % radius_scgc; } + // Need to do something for the dipole grid? // For a stretched grid, calculate some useful quantities: diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index b5452193..78b75acb 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -172,13 +172,17 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (iGridShape_ == iCubesphere_) { report.print(0, "Creating Cubesphere Grid"); + if (!Is0D & !Is1Dz) create_cubesphere_connection(quadtree); + IsCubeSphereGrid = true; } else { report.print(0, "Creating Spherical Grid"); + if (!Is0D & !Is1Dz) create_sphere_connection(quadtree); + IsCubeSphereGrid = false; } @@ -186,20 +190,20 @@ bool Grid::init_geo_grid(Quadtree quadtree, // report.print(1, "Restarting! Reading grid files!"); // DidWork = read_restart(input.get_restartin_dir()); //} else { - if (iGridShape_ == iCubesphere_) { - //if (input.get_do_restart()) - // report.print(0, "Not restarting the grid - it is too complicated!"); + if (iGridShape_ == iCubesphere_) { + //if (input.get_do_restart()) + // report.print(0, "Not restarting the grid - it is too complicated!"); - create_cubesphere_grid(quadtree); - } else - create_sphere_grid(quadtree); + create_cubesphere_grid(quadtree); + } else + create_sphere_grid(quadtree); - //MPI_Barrier(aether_comm); - create_altitudes(planet); + //MPI_Barrier(aether_comm); + create_altitudes(planet); - init_connection(); + init_connection(); - //DidWork = write_restart(input.get_restartout_dir()); + //DidWork = write_restart(input.get_restartout_dir()); //} // Calculate the radius (for spherical or non-spherical) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 648bd4ab..d9b56927 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -368,8 +368,10 @@ void Grid::fill_field_lines(arma_vec baseLatsLoc, // save the q for the "down" case: for (int64_t iLon = 0; iLon < nLons; iLon ++) { magQ_Down(iLon, iLat, iAlt) = qp2; + if (iLat < nLats) k_edge_scgc(iLon, iLat, iAlt) = qp2; + k_corner_scgc(iLon, iLat, iAlt) = qp2; } } else { @@ -757,11 +759,11 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // This is only down for the "down" edges, where the base latitudes are different. fill_field_lines(baseLats_down, min_alt_re, Gamma, planet, true); - // The baseLats are the Invariant Latitudes of the grid, so we can just fill in all of the + // The baseLats are the Invariant Latitudes of the grid, so we can just fill in all of the // points with these values for (iAlt = 0; iAlt < nAlts; iAlt++) for (iLat = 0; iLat < nLats; iLat++) - for (iLon = 0; iLon < nLons; iLon++) + for (iLon = 0; iLon < nLons; iLon++) magInvLat_scgc(iLon, iLat, iAlt) = baseLats(iLat); report.print(4, "Field-aligned Edges"); diff --git a/src/ions.cpp b/src/ions.cpp index 7d06721a..07e60010 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -165,7 +165,8 @@ Ions::Ions(Grid grid, Planets planet) { if (input.get_do_restart()) { report.print(1, "Restarting! Reading ion files!"); - bool DidWork = restart_file(input.get_restartin_dir(), grid.get_gridtype(), DoRead); + bool DidWork = restart_file(input.get_restartin_dir(), grid.get_gridtype(), + DoRead); if (!DidWork) std::cout << "Reading Restart for Ions Failed!!!\n"; @@ -527,7 +528,8 @@ bool Ions::restart_file(std::string dir, std::string cGridtype, bool DoRead) { OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_filename("ions_" + cMember + "_" + cGrid + "_" + cGridtype); + RestartContainer.set_filename("ions_" + cMember + "_" + cGrid + "_" + + cGridtype); try { if (DoRead) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index fc00cc8c..471cbb67 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -422,7 +422,8 @@ int Neutrals::get_species_id(std::string name) { // Read/Write restart files for the neutrals //---------------------------------------------------------------------- -bool Neutrals::restart_file(std::string dir, std::string cGridtype, bool DoRead) { +bool Neutrals::restart_file(std::string dir, std::string cGridtype, + bool DoRead) { std::string filename; bool DidWork = true; @@ -431,7 +432,8 @@ bool Neutrals::restart_file(std::string dir, std::string cGridtype, bool DoRead) OutputContainer RestartContainer; RestartContainer.set_directory(dir); - RestartContainer.set_filename("neutrals_" + cMember + "_" + cGrid + "_" + cGridtype); + RestartContainer.set_filename("neutrals_" + cMember + "_" + cGrid + "_" + + cGridtype); try { if (DoRead) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 3ccea6b8..225eeb19 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -178,11 +178,13 @@ bool Neutrals::initial_conditions(Grid grid, species[iSpecies].density_scgc.slice(0). fill(species[iSpecies].lower_bc_density); } + report.print(2, "Calculating scale height"); calc_scale_height(grid); report.print(2, "setting lower BCs"); set_lower_bcs(grid, time, indices); report.print(2, "Filling with hydrostatic"); + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); } // type = planet diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 26a3c4a4..d22d42ae 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -18,12 +18,16 @@ int64_t iProcQuery = -1; Quadtree::Quadtree(std::string shape) { if (shape == "cubesphere") nRootNodes = 6; + if (shape == "sphere") nRootNodes = 1; + if (shape == "dipole") nRootNodes = 1; + if (shape == "dipole2") nRootNodes = 2; + if (shape == "dipole6") nRootNodes = 6; } @@ -82,7 +86,7 @@ void Quadtree::build(std::string gridtype) { ups = Dipole6::UPS; IsSphere = true; } - + arma_vec o(3), r(3), u(3); // This captures the limits of the sphere, independent of what the diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 570b1984..1e69c7bc 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -344,7 +344,7 @@ void advect(Grid &grid, arma_mat t_to_e; precision_t duflux, lrflux, cosdrop; - + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { if (report.test_verbose(3)) @@ -426,13 +426,13 @@ void advect(Grid &grid, eq2FluxD = rhoP.D % xVelP.D % yVelP.D; eq2FluxU = rhoP.U % xVelP.U % yVelP.U; eq2Flux = rho % xVel % yVel; - + eq3FluxR = rhoP.R % xVelP.R % yVelP.R; eq3FluxL = rhoP.L % xVelP.L % yVelP.L; eq3FluxD = rhoP.D % (yVelP.D % yVelP.D + (gammaP.D - 1) % tempP.D); eq3FluxU = rhoP.U % (yVelP.U % yVelP.U + (gammaP.U - 1) % tempP.U); eq3Flux = rho % (yVel % yVel + (gamma2d - 1) % temp); - + eq4FluxL = rhoP.L % xVelP.L % (0.5 * velL2 + gammaP.L % tempP.L); eq4FluxR = rhoP.R % xVelP.R % (0.5 * velR2 + gammaP.R % tempP.R); eq4FluxD = rhoP.D % yVelP.D % (0.5 * velD2 + gammaP.D % tempP.D); @@ -513,24 +513,24 @@ void advect(Grid &grid, yWidth(i, j) * eq1FluxLR(i, j) + xWidth(i, j + 1) * eq1FluxDU(i, j + 1) - xWidth(i, j) * eq1FluxDU(i, j)) / area(i, j); - lrflux = 1.0 * ( - (yWidth(i + 1, j) * eq2FluxLR(i + 1, j) - - yWidth(i, j) * eq2FluxLR(i, j)) / area(i,j) - - geometry(i, j) * eq2Flux(i, j)); + lrflux = 1.0 * ( + (yWidth(i + 1, j) * eq2FluxLR(i + 1, j) - + yWidth(i, j) * eq2FluxLR(i, j)) / area(i, j) - + geometry(i, j) * eq2Flux(i, j)); xMomentum(i, j) = xMomentum(i, j) - dt * - ((xWidth(i, j + 1) * eq2FluxDU(i, j + 1) - - xWidth(i, j) * eq2FluxDU(i, j)) / area(i, j) + - lrflux); - duflux = 1.0 * ( - (xWidth(i, j + 1) * eq3FluxDU(i, j + 1) - - xWidth(i, j) * eq3FluxDU(i, j)) / area(i, j) + - geometry(i, j) * eq3Flux(i, j)); + ((xWidth(i, j + 1) * eq2FluxDU(i, j + 1) - + xWidth(i, j) * eq2FluxDU(i, j)) / area(i, j) + + lrflux); + duflux = 1.0 * ( + (xWidth(i, j + 1) * eq3FluxDU(i, j + 1) - + xWidth(i, j) * eq3FluxDU(i, j)) / area(i, j) + + geometry(i, j) * eq3Flux(i, j)); yMomentum(i, j) = yMomentum(i, j) - dt * ((yWidth(i + 1, j) * eq3FluxLR(i + 1, j) - - yWidth(i, j) * eq3FluxLR(i, j))/ area(i, j) + - duflux); - + yWidth(i, j) * eq3FluxLR(i, j)) / area(i, j) + + duflux); + totalE(i, j) = totalE(i, j) - dt * (yWidth(i + 1, j) * eq4FluxLR(i + 1, j) - yWidth(i, j) * eq4FluxLR(i, j) + diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 3446199f..6843eaa3 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -11,28 +11,34 @@ std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { std::vector gradient_vcgc; + if (report.test_verbose(4)) { - std::cout << "grid shape (1 = sphere; 2 = cube; 3 = dipole) : " << grid.iGridShape_ << "\n"; - display_vector("gradient, value : ", value_scgc.tube(9,9)); + std::cout << "grid shape (1 = sphere; 2 = cube; 3 = dipole) : " << + grid.iGridShape_ << "\n"; + display_vector("gradient, value : ", value_scgc.tube(9, 9)); } + if (grid.iGridShape_ == grid.iCubesphere_) gradient_vcgc = calc_gradient_cubesphere(value_scgc, grid); else { report.print(4, "Going into calc_gradient_lon"); gradient_vcgc.push_back(calc_gradient2o_i(value_scgc, grid)); + if (report.test_verbose(4)) - display_vector("gradient[0] : ", gradient_vcgc[0].tube(9,9)); + display_vector("gradient[0] : ", gradient_vcgc[0].tube(9, 9)); report.print(4, "Going into calc_gradient_lat"); gradient_vcgc.push_back(calc_gradient2o_j(value_scgc, grid)); + if (report.test_verbose(4)) - display_vector("gradient[1] : ", gradient_vcgc[1].tube(9,9)); + display_vector("gradient[1] : ", gradient_vcgc[1].tube(9, 9)); report.print(4, "Going into calc_gradient_alt"); gradient_vcgc.push_back(calc_gradient_alt(value_scgc, grid)); + if (report.test_verbose(4)) - display_vector("gradient[2] : ", gradient_vcgc[2].tube(9,9)); + display_vector("gradient[2] : ", gradient_vcgc[2].tube(9, 9)); } return gradient_vcgc; @@ -79,6 +85,7 @@ arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { (value.row(iX) - value.row(iX - 1)) / grid.di_center_m_scgc.row(iX); } + return gradient; } @@ -100,18 +107,18 @@ arma_cube calc_gradient4o_i(arma_cube value, Grid grid) { if (grid.get_HasXdim()) { // Interior, 5 point sencil: for (iX = 2; iX < nX - 2; iX++) - gradient.row(iX) = (-value.row(iX + 2) + - 8 * value.row(iX + 1) - - 8 * value.row(iX - 1) + - value.row(iX - 2)) / - (12. * grid.di_center_m_scgc.row(iX)); + gradient.row(iX) = (-value.row(iX + 2) + + 8 * value.row(iX + 1) - + 8 * value.row(iX - 1) + + value.row(iX - 2)) / + (12. * grid.di_center_m_scgc.row(iX)); // Points just inside edges (2nd order): iX = 1; gradient.row(iX) = (value.row(iX + 1) - value.row(iX - 1)) / (2 * grid.di_center_m_scgc.row(iX)); - iX = nX-2; + iX = nX - 2; gradient.row(iX) = (value.row(iX + 1) - value.row(iX - 1)) / (2 * grid.di_center_m_scgc.row(iX)); @@ -126,6 +133,7 @@ arma_cube calc_gradient4o_i(arma_cube value, Grid grid) { (value.row(iX) - value.row(iX - 1)) / grid.di_center_m_scgc.row(iX); } + return gradient; } @@ -143,7 +151,7 @@ arma_cube calc_gradient_stretched_i(arma_cube value, Grid grid) { arma_cube gradient(nX, nY, nZ); gradient.zeros(); - + if (grid.get_HasXdim()) { // Central part for (iX = 1; iX < nX - 1; iX++) @@ -164,6 +172,7 @@ arma_cube calc_gradient_stretched_i(arma_cube value, Grid grid) { (value.row(iX) - value.row(iX - 1)) / grid.di_center_m_scgc.row(iX); } + return gradient; } @@ -211,6 +220,7 @@ arma_cube calc_gradient2o_j(arma_cube value, Grid grid) { (value.col(iY) - value.col(iY - 1)) / grid.dj_center_m_scgc.col(iY); } + return gradient; } @@ -232,21 +242,21 @@ arma_cube calc_gradient4o_j(arma_cube value, Grid grid) { if (grid.get_HasYdim()) { // Interior: for (iY = 2; iY < nY - 2; iY++) - gradient.col(iY) = (-value.col(iY + 2) + - 8 * value.col(iY + 1) - - 8 * value.col(iY - 1) + - value.col(iY - 2)) / - (12. * grid.dj_center_m_scgc.col(iY)); + gradient.col(iY) = (-value.col(iY + 2) + + 8 * value.col(iY + 1) - + 8 * value.col(iY - 1) + + value.col(iY - 2)) / + (12. * grid.dj_center_m_scgc.col(iY)); // Points just inside edges (2nd order): iY = 1; gradient.col(iY) = - (value.col(iY + 1) - value.col(iY - 1)) / - (2 * grid.dj_center_m_scgc.col(iY)); - iY = nY-2; + (value.col(iY + 1) - value.col(iY - 1)) / + (2 * grid.dj_center_m_scgc.col(iY)); + iY = nY - 2; gradient.col(iY) = - (value.col(iY + 1) - value.col(iY - 1)) / - (2 * grid.dj_center_m_scgc.col(iY)); + (value.col(iY + 1) - value.col(iY - 1)) / + (2 * grid.dj_center_m_scgc.col(iY)); // Lower (one sided): iY = 0; @@ -260,6 +270,7 @@ arma_cube calc_gradient4o_j(arma_cube value, Grid grid) { (value.col(iY) - value.col(iY - 1)) / grid.dj_center_m_scgc.col(iY); } + return gradient; } @@ -277,7 +288,7 @@ arma_cube calc_gradient_stretched_j(arma_cube value, Grid grid) { arma_cube gradient(nX, nY, nZ); gradient.zeros(); - + if (grid.get_HasYdim()) { // Central part for (iY = 1; iY < nY - 1; iY++) @@ -298,6 +309,7 @@ arma_cube calc_gradient_stretched_j(arma_cube value, Grid grid) { (value.col(iY) - value.col(iY - 1)) / grid.dj_center_m_scgc.col(iY); } + return gradient; } @@ -346,6 +358,7 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { (value.slice(iK) - value.slice(iK - 1)) / grid.dk_edge_m.slice(iK); } + return gradient; } @@ -441,25 +454,25 @@ std::vector calc_gradient_cubesphere(arma_cube value, Grid grid) { // May vectorize for future improvements // if more than 1 nGCs, we do fourth order, some foolproofing in case we go into debug hell - if (nGCs >= 2) { + if (nGCs >= 2) { for (int j = nGCs; j < nYs - nGCs; j++) { for (int i = nGCs; i < nXs - nGCs; i++) { - grad_x_curr(i, j) = (-curr_value(i + 2, j) + - 8 * curr_value(i + 1, j) - - 8 * curr_value(i - 1, j) + - curr_value(i - 2, j)) * (1. / 12. / dx); - grad_y_curr(i, j) = (-curr_value(i, j + 2) + - 8 * curr_value(i, j + 1) - - 8 * curr_value(i, j - 1) + - curr_value(i, j - 2)) * (1. / 12. / dy); + grad_x_curr(i, j) = (-curr_value(i + 2, j) + + 8 * curr_value(i + 1, j) - + 8 * curr_value(i - 1, j) + + curr_value(i - 2, j)) * (1. / 12. / dx); + grad_y_curr(i, j) = (-curr_value(i, j + 2) + + 8 * curr_value(i, j + 1) - + 8 * curr_value(i, j - 1) + + curr_value(i, j - 2)) * (1. / 12. / dy); } } } else { // otherwise we do second order for (int j = nGCs; j < nYs - nGCs; j++) { for (int i = nGCs; i < nXs - nGCs; i++) { - grad_x_curr(i, j) = (curr_value(i + 1, j) - + grad_x_curr(i, j) = (curr_value(i + 1, j) - curr_value(i - 1, j)) * (1. / 2. / dx); - grad_y_curr(i, j) = (curr_value(i, j + 1) - + grad_y_curr(i, j) = (curr_value(i, j + 1) - curr_value(i, j - 1)) * (1. / 2. / dy); } } diff --git a/src/tools.cpp b/src/tools.cpp index c37e499f..dc2f621f 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -165,6 +165,7 @@ void display_vector(arma_vec vec) { void display_vector(std::string name, arma_vec vec) { std::cout << name << " "; + for (int64_t i = 0; i < vec.n_rows; i++) std::cout << vec(i) << " "; @@ -177,6 +178,7 @@ void display_vector(std::string name, arma_vec vec) { void display_vector(std::string name, std::vector vec) { std::cout << name << " "; + for (int64_t i = 0; i < vec.size(); i++) std::cout << vec[i] << " "; From 574e4fcf923655e90ce9dd4c90cb0753be05d376 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 10 Mar 2025 11:42:55 -0400 Subject: [PATCH 419/691] BUG: Remove unused 'Centripetal' input. We use 'cent_acc' instead --- include/inputs.h | 8 +------- share/run/UA/inputs/defaults.json | 1 - src/inputs.cpp | 8 ++------ 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index 3bd5a9ae..4abc9167 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -436,13 +436,7 @@ class Inputs { bool get_O_cooling(); /********************************************************************** - \brief returns settings[" - \param - **/ - bool get_use_centripetal(); - - /********************************************************************** - \brief returns settings[" + \brief returns settings[" \param **/ bool get_use_coriolis(); diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 1f9c296a..861e4f81 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -100,7 +100,6 @@ "Sources" : { "Grid" : { - "Centripetal" : true, "Coriolis" : true, "Cent_acc": true }, "Neutrals" : { diff --git a/src/inputs.cpp b/src/inputs.cpp index 50981d04..f8351ca9 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -762,8 +762,8 @@ bool Inputs::get_O_cooling() { // Return centripetal acceleration // ----------------------------------------------------------------------- -bool Inputs::get_use_centripetal() { - return get_setting_bool("Sources", "Grid", "Centripetal"); +bool Inputs::get_cent_acc() { + return get_setting_bool("Sources", "Grid", "Cent_acc"); } // ----------------------------------------------------------------------- @@ -774,10 +774,6 @@ bool Inputs::get_use_coriolis() { return get_setting_bool("Sources", "Grid", "Coriolis"); } -bool Inputs::get_cent_acc() { - return get_setting_bool("Sources", "Grid", "Cent_acc"); -} - // ----------------------------------------------------------------------- // Return restart OUT directory // ----------------------------------------------------------------------- From 0b69f4d7563f7fb88eaa0a22c22006ce8e19b749 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 10 Mar 2025 17:18:50 -0400 Subject: [PATCH 420/691] FEAT: Update binary search `search_altitudes` - Make it into a general function (not just altitude) - Handles ooblate planets now! - Optional argument to not search ghost cells --- include/grid.h | 3 --- src/solver_grid_interpolation.cpp | 27 +++++++++++++++------------ 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/grid.h b/include/grid.h index fed807e9..ce777925 100644 --- a/include/grid.h +++ b/include/grid.h @@ -531,9 +531,6 @@ class Grid bool in_grid; }; - // Return the index of the last element that has altitude smaller than or euqal to the input - uint64_t search_altitude(const precision_t alt_in) const; - // Calculate the range of a spherical grid void get_sphere_grid_range(struct sphere_range &sr) const; // Calculate the range of a cubesphere grid diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index 39bb2dc3..a98f9b50 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -72,22 +72,23 @@ int64_t get_cube_surface_number(const arma_vec &point_in) { // Helper variables / function ends. The following are all member functions of Grid class // -------------------------------------------------------------------------- -// Return the index of the last element that has altitude smaller than or euqal to the input +// Return the index of the last element that has a value smaller than or equal to the input +// - Optional argument (nGCs=0) since we cannot see grid info. // -------------------------------------------------------------------------- -uint64_t Grid::search_altitude(const precision_t alt_in) const { +uint64_t binary_search_array(precision_t val_in, arma_vec ref_arr, int64_t nGCs = 0) { // Copy from std::upper_bound. Can't directly use it // mainly because geoAlt_scgc(0, 0, *) can't be formed as an iterator uint64_t first, last, len; first = nGCs; - last = nAlts - nGCs; + last = ref_arr.size(); len = last - first; while (len > 0) { uint64_t half = len >> 1; uint64_t mid = first + half; - if (geoAlt_scgc(0, 0, mid) > alt_in) + if (ref_arr(mid) > val_in) len = half; else { @@ -227,10 +228,12 @@ void Grid::set_interp_coef_sphere(const sphere_range &sr, // The altitude may not be linearly spaced, so use binary search to find // the first element smaller than or equal to the altitude of the give point - // Implemented in search_altitude - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + // Implemented in binary_search_array + // - since Alt can be latitude-dependent, this needs to be done last. + coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), nGCs); + coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, + coef.iCol, coef.iAlt)); // Put the coefficient into the vector coef.in_grid = true; @@ -302,10 +305,10 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, coef.iCol = static_cast(col_frac_index); coef.rCol = col_frac_index - coef.iCol; coef.iCol += nGCs - 1; - // Use binary search to find the index for altitude - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + // Use binary search to find the index for altitude (handles oblate planets) + coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), nGCs); + coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); // Put the coefficient into the vector coef.in_grid = true; From 235e527ec61d5f0a4f8aa18f95313e66846d3fdf Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 10 Mar 2025 19:20:39 -0400 Subject: [PATCH 421/691] BUG: Complete the change from MagLat to MagInvLat. MagLat is not defined on the geo grid (yet) > But invLat is made for both the geo grid & mag grid. And included in 'ions'/'bfield' outputs --- include/grid.h | 3 +-- src/fill_grid.cpp | 4 ++-- src/output.cpp | 4 ++++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/include/grid.h b/include/grid.h index ce777925..f6a660ec 100644 --- a/include/grid.h +++ b/include/grid.h @@ -69,8 +69,7 @@ class Grid // These define the magnetic grid: // Armidillo Cube Versions: arma_cube magLon_scgc, magX_scgc; - // The magnetic latitude and altitude need to be defined better. This should be the angle between - // magnetic equator and the point, but sometimes it is invariant latitude. + // The magnetic latitude is the angle between the magnetic equator and the point. arma_cube magLat_scgc, magY_scgc; // This is often just the altitude.... arma_cube magAlt_scgc, magZ_scgc; diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 2e0b2418..183017cb 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -125,7 +125,7 @@ void Grid::calc_mlt() { // calculated and converted to an hour. for (int iZ = 0; iZ < nZ; iZ++) { - dlat_north = 1.0 - (cPI / 2.0 - magLat_scgc.slice(iZ)) / cPI; + dlat_north = 1.0 - (cPI / 2.0 - magInvLat_scgc.slice(iZ)) / cPI; x_blend = dlat_north * mag_pole_north_gse[0](0, 0, iZ) + (1.0 - dlat_north) * mag_pole_south_gse[0](0, 0, iZ); y_blend = dlat_north * mag_pole_north_gse[1](0, 0, iZ) + @@ -171,7 +171,7 @@ void Grid::fill_grid_bfield(Planets planet) { bfield_info = get_bfield(lon, lat, alt, DoDebug, planet); // This is Invariant Latitude - magLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; + // (regular magnetic latitude is not defined yet for the geo grid) magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; diff --git a/src/output.cpp b/src/output.cpp index 2a16a8c0..61115d97 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -260,6 +260,10 @@ bool output(const Neutrals &neutrals, "Magnetic Longitude", "degrees", grid.magLon_scgc * cRtoD); + AllOutputContainers[iOutput].store_variable("invLat", + "Magnetic Invariant Latitude", + "degrees", + grid.magInvLat_scgc * cRtoD); AllOutputContainers[iOutput].store_variable("mlt", "Magnetic Local Time", "hours", From c578a436ab2f0e573de3a4ab15463396b60b4583 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 10 Mar 2025 19:53:25 -0400 Subject: [PATCH 422/691] BUG: do not fill dipole grid's mag coords in fill_grid_bfield ideally this is refactored, but whatever. The way this was being done kept messing with the order of points. --- src/fill_grid.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 183017cb..5dd2f98e 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -172,8 +172,12 @@ void Grid::fill_grid_bfield(Planets planet) { planet); // This is Invariant Latitude // (regular magnetic latitude is not defined yet for the geo grid) + // - magLat is not used by the geo grid, so not defined magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; - magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; + + // init_mag grid already initialized magLon + if (iGridShape_ != iDipole_) + magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; bfield_mag_scgc(iLon, iLat, iAlt) = 0.0; From 464998fbbcbdccf7e49c78add316aa8df93b3cc8 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 10 Mar 2025 22:05:25 -0400 Subject: [PATCH 423/691] FEAT: Add methods to do dipole interpolation --- include/grid.h | 32 +++++++++++++ src/solver_grid_interpolation.cpp | 80 +++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/include/grid.h b/include/grid.h index f6a660ec..874dcb94 100644 --- a/include/grid.h +++ b/include/grid.h @@ -433,6 +433,20 @@ class Grid bool set_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, const std::vector &Alts); + + /** + * \brief Set the interpolation coefficients for the dipole grid + * \param Lons The longitude of points + * \param Lats The latitude of points + * \param Alts The altitude of points + * \pre Lons, Lats and Alts have the same size + * \return true if the function succeeds, false if the instance is not a + * mag grid or the size of Lons, Lats and Alts are not the same. + */ + bool set_dipole_interpolation_coefs(const std::vector &Lons, + const std::vector &Lats, + const std::vector &Alts); + /** * \brief Create a map of geographic locations to data and do the interpolation * \param data The value at the positions of geoLon, geoLat, and geoAlt @@ -511,6 +525,17 @@ class Grid bool col_min_exclusive; bool col_max_exclusive; }; + // The struct representing the range of a dipole grid (in magnetic coordinates) + struct dipole_range{ + precision_t lon_min; + precision_t lon_max; + precision_t dLon; + precision_t lat_min; + precision_t lat_max; + precision_t dLat; + precision_t alt_min; + precision_t alt_max; + }; // The index and coefficient used for interpolation // Each point is processed by the function set_interpolation_coefs and stored @@ -534,6 +559,8 @@ class Grid void get_sphere_grid_range(struct sphere_range &sr) const; // Calculate the range of a cubesphere grid void get_cubesphere_grid_range(struct cubesphere_range &cr) const; + // Calculate the range of a dipole grid + void get_dipole_grid_range(struct dipole_range &dr) const; // Helper function for set_interpolation_coefs void set_interp_coef_sphere(const sphere_range &sr, @@ -544,6 +571,11 @@ class Grid const precision_t lon_in, const precision_t lat_in, const precision_t alt_in); + // (note these are magnetic coordinates) + void set_interp_coef_dipole(const dipole_range &dr, + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in); // Processed interpolation coefficients std::vector interp_coefs; diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index a98f9b50..a974de13 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -180,6 +180,28 @@ void Grid::get_cubesphere_grid_range(struct cubesphere_range &cr) const { } } +// -------------------------------------------------------------------------- +// Get the range of a Dipole grid +// -------------------------------------------------------------------------- + +void Grid::get_dipole_grid_range(struct dipole_range &dr) const { + // Retrieve the range and delta of longitude, latitude and altitude + // ** Note these are magnetic coordinates. Not labeled for consistency ** + dr.lon_min = magLon_Corner(nGCs, nGCs, nGCs); + dr.lon_max = magLon_Corner(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + + dr.lat_min = magLat_Corner(nGCs, nGCs, nGCs); + dr.lat_max = magLat_Corner(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + + // magAlt and geoAlt are the same, doesn't matter which we use: + dr.alt_min = geoAlt_scgc(nGCs, nGCs, nGCs); + dr.alt_max = geoAlt_scgc(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + + // MagLon steps are uniform: + dr.dLon = magLon_Corner(1, 0, 0) - magLon_Corner(0, 0, 0); +} + + // -------------------------------------------------------------------------- // Set interpolation coefficients helper function for spherical grid // Almost the copy of interp_sphere_linear_helper @@ -315,6 +337,64 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, interp_coefs.push_back(coef); } +void Grid::set_interp_coef_dipole(const dipole_range &dr, + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in) { + + // The structure which will be put into the interp_coefs. Initialize in_grid to be false + struct interp_coef_t coef; + coef.in_grid = false; + + // Determine whether the point is inside this grid + // Treat north pole specially because latitude is inclusive for both -cPI/2 and cPI/2 + if (lon_in < dr.lon_min || lon_in >= dr.lon_max || lat_in < dr.lat_min + || lat_in > dr.lat_max || (lat_in == dr.lat_max && dr.lat_max != cPI / 2) + || alt_in < dr.alt_min || alt_in > dr.alt_max) { + interp_coefs.push_back(coef); + return; + } + + // ASSUMPTION: LONGITUDE IS LINEARLY SPACED, nGCs >= 1 + // For the cell containing it, directly calculate its x index + // Find y & z indices using binary search + + // The number of dLon between the innermost ghost cell and the given point + coef.rRow = (lon_in - dr.lon_min) / dr.dLon + 0.5; + // Take the integer part + coef.iRow = static_cast(coef.rRow); + // Calculate the fractional part, which is the ratio for Longitude + coef.rRow -= coef.iRow; + // The actual x-axis index of the bottom-left of the cube used for interpolation + coef.iRow += nGCs - 1; + + + // Different from the sphere, latitude & altitude are not evenly spaced. + // Use binary search for both. + + // Lat needs to be done a little different because it could be increasing or + // decreasing (depending on the hemisphere we're in). Take the absolute value! + coef.iCol = binary_search_array(abs(lat_in), + abs(magInvLat_scgc.tube(coef.iRow, coef.iCol)), nGCs); + + // need alt index to find lat coef + coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), + nGCs); + + // then we can do the ratios: + coef.rCol = (lat_in - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (magLat_scgc(coef.iRow, coef.iCol + 1, coef.iAlt) + - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)); + + coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) + - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); + + // Put the coefficient into the vector + coef.in_grid = true; + interp_coefs.push_back(coef); +} + // -------------------------------------------------------------------------- // Set the interpolation coefficients // -------------------------------------------------------------------------- From d491d433416999b7805a893489b49c3e335647bc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 12 Mar 2025 13:43:21 -0400 Subject: [PATCH 424/691] FEAT: start to ion->neu grid matchup --- include/calc_grid_derived.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/include/calc_grid_derived.h b/include/calc_grid_derived.h index f66f2fa2..28d5237f 100644 --- a/include/calc_grid_derived.h +++ b/include/calc_grid_derived.h @@ -16,4 +16,12 @@ arma_vec calc_bin_edges(arma_vec centers); std::vector calc_bin_widths(std::vector centers); arma_vec calc_bin_widths(arma_vec centers); +// ---------------------------------------------------------------------------- +// A helper function for mapping grids +// ---------------------------------------------------------------------------- +bool grid_match(Grid gGrid, + Grid mGrid, + Quadtree gQuadtree, + Quadtree mQuadtree); + #endif // INCLUDE_CALC_GRID_DERIVED_H_ From 33dd65ce388d5111897ac5f36b15ec8140cc165a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 12 Mar 2025 13:43:38 -0400 Subject: [PATCH 425/691] FEAT: start to ion->neu grid matchup --- src/grid_match.cpp | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/grid_match.cpp diff --git a/src/grid_match.cpp b/src/grid_match.cpp new file mode 100644 index 00000000..25da6188 --- /dev/null +++ b/src/grid_match.cpp @@ -0,0 +1,46 @@ +// Copyright 2025, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include "aether.h" + +bool grid_match(Grid gGrid, + Grid mGrid, + Quadtree gQuadtree, + Quadtree mQuadtree) { + + // Let's do magnetic to geographic first: + + int64_t iX, mnX = mGrid.get_nX(); + int64_t iY, mnY = mGrid.get_nY(); + int64_t iZ, mnZ = mGrid.get_nZ(); + int64_t mGCs = mGrid.get_nGCs(); + precision_t lon, lat; + precision_t normX, normY, normZ; + arma_vec norms(3); + int64_t iNode; + + for (iX = mGCs; iX < mnX - mGCs; iX++) { + for (iY = mGCs; iY < mnY - mGCs; iY++) { + for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { + lon = mGrid.geoLon_scgc(iX, iY, iZ); + lat = mGrid.geoLat_scgc(iX, iY, iZ); + if (gGrid.iGridShape_ == gGrid.iSphere_) { + norms(0) = lon / cPI; + norms(1) = lat / cPI; + norms(2) = 0.0; + iNode = gQuadtree.find_point(norms); + } else { + norms = sphere_to_cube(lon, lat); + iNode = gQuadtree.find_point(norms); + } + std::cout << "lon, lat, node: " << lon*cRtoD << " " + << lat*cRtoD << " " + << norms(0) << " " + << norms(1) << " " + << norms(2) << " " + << iNode << "\n"; + } + } + } + return true; +} From 9d68304d62baad69f54405bc6608c9163ea0de49 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 12 Mar 2025 13:44:38 -0400 Subject: [PATCH 426/691] FEAT: clean a bit and add grid matching --- src/main/main.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 57a9d1e7..b97686ef 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -37,32 +37,27 @@ int main() { // cubesphere (6 root) Quadtree quadtree(input.get_grid_shape("neuGrid")); Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); - if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); // Initialize MPI and parallel aspects of the code: didWork = init_parallel(quadtree, quadtree_ion); - if (!didWork) throw std::string("init_parallel failed!"); // Everything should be set for the inputs now, so write a restart file: didWork = input.write_restart(); - if (!didWork) throw std::string("input.write_restart failed!"); // Initialize the EUV system: Euv euv; - if (!euv.is_ok()) throw std::string("EUV initialization failed!"); // Initialize the planet: Planets planet; MPI_Barrier(aether_comm); - if (!planet.is_ok()) throw std::string("planet initialization failed!"); @@ -70,7 +65,6 @@ int main() { Indices indices; didWork = read_and_store_indices(indices); MPI_Barrier(aether_comm); - if (!didWork) throw std::string("read_and_store_indices failed!"); @@ -82,7 +76,6 @@ int main() { Grid gGrid("neuGrid"); didWork = gGrid.init_geo_grid(quadtree, planet); MPI_Barrier(aether_comm); - if (!didWork) throw std::string("init_geo_grid failed!"); @@ -101,13 +94,15 @@ int main() { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); if (!didWork) throw std::string("init_dipole_grid failed!"); - } - else { + } else { std::cout << "Making Spherical Magnetic Grid\n"; mGrid.set_IsDipole(false); didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); } + + didWork = grid_match(gGrid, mGrid, quadtree, quadtree_ion); + // Initialize Neutrals on geographic grid: Neutrals neutrals(gGrid, planet, time, indices); // Initialize Neutrals on magnetic grid: From e3859a2f72f1e1935e2f6af35629638ff8601627 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 12 Mar 2025 13:45:32 -0400 Subject: [PATCH 427/691] DOC: added comments --- src/quadtree.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 6810570f..9410f306 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -201,7 +201,9 @@ Quadtree::qtnode Quadtree::new_node(arma_vec lower_left_norm_in, } // -------------------------------------------------------------------------- -// +// This returns the lower left (LL) coordinate in normalized coordinates or +// the size of the node in the right (SR) or up (SU) directions. It can +// also return the midpoint of the node (MID) // -------------------------------------------------------------------------- arma_vec Quadtree::get_vect(Quadtree::qtnode node, std::string which) { @@ -483,7 +485,9 @@ arma_vec Quadtree::wrap_point_cubesphere(arma_vec point) { } // -------------------------------------------------------------------------- -// +// This is the starting point for determining which node a point +// on the sphere is located. The point needs to be in normalized +// coordinates. // -------------------------------------------------------------------------- int64_t Quadtree::find_point(arma_vec point) { @@ -509,7 +513,9 @@ int64_t Quadtree::find_point(arma_vec point) { } // -------------------------------------------------------------------------- -// +// This is the starting point for determining which root a point +// on the sphere is located. The point needs to be in normalized +// coordinates. // -------------------------------------------------------------------------- int64_t Quadtree::find_root(arma_vec point) { From a10c7945f9681e103e98237fdd089bf80b51f3f9 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 13 Mar 2025 06:55:10 -0400 Subject: [PATCH 428/691] FEAT: pass latitudes from one grid to the next --- src/grid_match.cpp | 168 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 159 insertions(+), 9 deletions(-) diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 25da6188..39639dab 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -3,6 +3,65 @@ #include "aether.h" +// ----------------------------------------------------------------------------- +// Send arrays of variables to other processors on the given grid. +// ----------------------------------------------------------------------------- + +bool exchange_information(int64_t *nPointsToPass, + std::vector varToSend, + int64_t *nPointsToReceive, + std::vector varToReceive) { + + int64_t jNode, iPt, iTag, iProcTo, iProcFrom; + std::vector requests(nGrids); + + // Here we send the message into the wind: + // - if it is the same processor, just copy the information + // - if it is a different processor, send the data + for (jNode = 0; jNode < nGrids ; jNode++) { + if (jNode == iGrid) { + for (iPt = 0; iPt < nPointsToPass[jNode]; iPt ++) { + varToReceive[jNode][iPt] = varToSend[jNode][iPt]; + } + } else { + iProcTo = iMember * nGrids + jNode; + // iTag is a unique id allowing all processors to + // communicate asynchronously + iTag = iProc * 10000 + iProcTo; + MPI_Isend(varToSend[jNode], + nPointsToPass[jNode] * sizeof(precision_t), + MPI_BYTE, + iProcTo, + iTag, + aether_comm, + &requests[jNode]); + } + } + + // Wait for everyone to get the information that was sent: + for (jNode = 0; jNode < nGrids ; jNode++) + if (jNode != iGrid) + MPI_Wait(&requests[jNode], MPI_STATUS_IGNORE); + + // Receive it into the receiving array: + for (jNode = 0; jNode < nGrids ; jNode++) + if (jNode != iGrid) { + iProcFrom = iMember * nGrids + jNode; + // Rebuid the unique id: + iTag = iProcFrom * 10000 + iProc; + MPI_Recv(varToReceive[jNode], + nPointsToReceive[jNode] * sizeof(precision_t), + MPI_BYTE, + jNode, + iTag, + aether_comm, + MPI_STATUS_IGNORE); + } + + MPI_Barrier(aether_comm); + return true; +} + bool grid_match(Grid gGrid, Grid mGrid, Quadtree gQuadtree, @@ -17,8 +76,16 @@ bool grid_match(Grid gGrid, precision_t lon, lat; precision_t normX, normY, normZ; arma_vec norms(3); - int64_t iNode; + int64_t jNode, kNode; + int64_t *nPointsToPass = static_cast(malloc(nGrids * sizeof(int64_t))); + int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof(int64_t))); + int64_t *nPointsDummy = static_cast(malloc(nGrids * sizeof(int64_t))); + + for (jNode = 0; jNode < nGrids ; jNode++) + nPointsToPass[jNode] = 0; + // This is not the most efficient way to do this, but the first pass, let's + // just count how many points we need to send to the other processors: for (iX = mGCs; iX < mnX - mGCs; iX++) { for (iY = mGCs; iY < mnY - mGCs; iY++) { for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { @@ -28,19 +95,102 @@ bool grid_match(Grid gGrid, norms(0) = lon / cPI; norms(1) = lat / cPI; norms(2) = 0.0; - iNode = gQuadtree.find_point(norms); + jNode = gQuadtree.find_point(norms); } else { norms = sphere_to_cube(lon, lat); - iNode = gQuadtree.find_point(norms); + jNode = gQuadtree.find_point(norms); + } + if (jNode < 0 || jNode >= nGrids) { + std::cout << "out of bounds!!! " << jNode << "\n"; } - std::cout << "lon, lat, node: " << lon*cRtoD << " " - << lat*cRtoD << " " - << norms(0) << " " - << norms(1) << " " - << norms(2) << " " - << iNode << "\n"; + nPointsToPass[jNode] = nPointsToPass[jNode]+1; + /* std::cout << "lon, lat, node: " << lon*cRtoD << " " + << lat*cRtoD << " " + << norms(0) << " " + << norms(1) << " " + << norms(2) << " " + << jNode << " " + << iProc << " " + << nPoints[jNode] << "\n"; */ } } } + std::cout << "made it here: " << iProc << "\n"; + MPI_Barrier(aether_comm); + + for (jNode = 0; jNode < nGrids ; jNode++) + std::cout << "nPtsToPass : " << iProc << " " << nPointsToPass[jNode] << "\n"; + + std::cout << "sending number of points :\n"; + + // This section sends the number of points that need to be transfered to each processor. + // Then the processor saves the number of points, so it can be remembered, and both the + // sender and receiver will have the information. + for (jNode = 0; jNode < nGrids ; jNode++) { + if (jNode == iGrid) { + for (kNode = 0; kNode < nGrids ; kNode++) + nPointsDummy[kNode] = nPointsToPass[kNode]; + } + MPI_Bcast(nPointsDummy, nGrids, MPI_INT64_T, jNode, aether_comm); + nPointsToReceive[jNode] = nPointsDummy[iGrid]; + } + + MPI_Barrier(aether_comm); + + for (jNode = 0; jNode < nGrids ; jNode++) { + std::cout << "nPtsToReceive : " << iProc << " " << jNode << " " << nPointsToReceive[jNode] << "\n"; + MPI_Barrier(aether_comm); + } + + // Now we need to create an array of send points and an array of receive points. + std::vector latsToPass(nGrids); + std::vector lonsToPass(nGrids); + std::vector altsToPass(nGrids); + for (jNode = 0; jNode < nGrids ; jNode++) { + latsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); + lonsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); + altsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); + } + + std::vector latsToInterTo(nGrids); + std::vector lonsToInterTo(nGrids); + std::vector altsToInterTo(nGrids); + for (jNode = 0; jNode < nGrids ; jNode++) { + latsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); + lonsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); + altsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); + } + + // now, the second pass, let's store the information so we can pass it: + for (jNode = 0; jNode < nGrids ; jNode++) + nPointsToPass[jNode] = 0; + for (iX = mGCs; iX < mnX - mGCs; iX++) { + for (iY = mGCs; iY < mnY - mGCs; iY++) { + for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { + lon = mGrid.geoLon_scgc(iX, iY, iZ); + lat = mGrid.geoLat_scgc(iX, iY, iZ); + if (gGrid.iGridShape_ == gGrid.iSphere_) { + norms(0) = lon / cPI; + norms(1) = lat / cPI; + norms(2) = 0.0; + jNode = gQuadtree.find_point(norms); + } else { + norms = sphere_to_cube(lon, lat); + jNode = gQuadtree.find_point(norms); + } + latsToPass[jNode][nPointsToPass[jNode]] = lat; + lonsToPass[jNode][nPointsToPass[jNode]] = lon; + altsToPass[jNode][nPointsToPass[jNode]] = mGrid.geoAlt_scgc(iX, iY, iZ); + nPointsToPass[jNode] = nPointsToPass[jNode]+1; + } + } + } + bool didWork; + didWork = exchange_information(nPointsToPass, + latsToPass, + nPointsToReceive, + latsToInterTo); + + return true; } From 65e3c3a98515395a15945665c70d673e7951a23f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 13 Mar 2025 10:59:08 -0400 Subject: [PATCH 429/691] STY: astlye, yo. --- src/calc_electron_temperature.cpp | 343 ++++++++++++++++-------------- 1 file changed, 179 insertions(+), 164 deletions(-) diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index 56763894..a5a00552 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -20,7 +20,7 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // electron-ion collisions return a vector of cubes, one for Qe, one for Qi, one for friction: std::vector Qeic; arma_cube Qeicm, Qeicp, Qeic_v; - + // (elastic) Electron-neutral collisions: std::vector Qenc; arma_cube Qencm, Qencp, Qenc_v; @@ -54,16 +54,15 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { Qexc = epsilon; Qvib_O2 = epsilon; Qvib_N2 = epsilon; - + report.print(4, "Calculating epsilon"); // ============= ADD SOURCES ================= - + // Needed for both ionization & photoelectron heating: - if (input.get_do_ionization_heating() || input.get_do_photoelectron_heating()) { + if (input.get_do_ionization_heating() || input.get_do_photoelectron_heating()) epsilon = calc_epsilon(neutrals); - } // Photoelectron heating @@ -82,10 +81,10 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { // electron-ion collisions if (input.get_do_electron_ion_collisional_heating()) { report.print(4, "Calculating electron-ion collisions"); - + Qeic = calc_electron_ion_collisions(); - Qeicp = Qeic[0]; - Qeicm = Qeic[1]; + Qeicp = Qeic[0]; + Qeicm = Qeic[1]; Qeic_v = Qeic[2]; // Friction } @@ -95,8 +94,8 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { report.print(4, "Calculating electron-neutral elastic collisions"); Qenc = calc_electron_neutral_elastic_collisions(neutrals); - Qencp = Qenc[0]; - Qencm = Qenc[1]; + Qencp = Qenc[0]; + Qencm = Qenc[1]; Qenc_v = Qenc[2]; // Friction } @@ -116,15 +115,15 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { if (input.get_do_thermoelectric_heating()) { report.print(4, "Calculating thermoelectric heating"); - report.error("Thermoelectric heating is not working yet."); + report.error("Thermoelectric heating is not working yet."); // Get JPar (Thermoelectric current) JParallel = calc_thermoelectric_current(grid); } report.print(4, "Calculating electron temperature"); - arma_cube sources = Qphe + Qencm + Qeicm + Qrotm + Qf + Qexc + Qvib_O2 + Qvib_N2 - + QIonization + Qenc_v + Qeic_v; + arma_cube sources = Qphe + Qencm + Qeicm + Qrotm + Qf + Qexc + Qvib_O2 + Qvib_N2 + + QIonization + Qenc_v + Qeic_v; arma_cube sources_temp_dependent = Qencp + Qeicp + Qrotp; @@ -144,36 +143,37 @@ void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { for (int64_t iLon = nGCs; iLon < nLons - nGCs; iLon++) { - for (int64_t iLat = nGCs; iLat < nLats - nGCs; iLat++) { - temp1d = electron_temperature_scgc.tube(iLon, iLat); - temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); - temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); - lambda1d = lambda.tube(iLon, iLat); - lambda1d(1) = lambda1d(2); - lambda1d(0) = lambda1d(2); - front1d = 3.0 / 2.0 * cKB * species[nSpecies].density_scgc.tube(iLon, iLat); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); - sources1d = sources.tube(iLon, iLat); - sources1d = sources1d / front1d; - - sources_tempdep_1d = sources_temp_dependent.tube(iLon, iLat); - sources_tempdep_1d = sources_tempdep_1d / front1d; - - conduction1d.zeros(); // reset temp variable to zero - conduction1d = solver_conduction(temp1d, - lambda1d, - front1d, - sources1d, - dalt1d, - dt / 10., - nGCs, - false, - sources_tempdep_1d); - - // The conduction solver gives Tnew-Told, so divide by dt - conduction1d.clamp(200, 6000); - electron_temperature_scgc.tube(iLon, iLat) = conduction1d; - }} + for (int64_t iLat = nGCs; iLat < nLats - nGCs; iLat++) { + temp1d = electron_temperature_scgc.tube(iLon, iLat); + temp1d(0) = neutrals.temperature_scgc(iLon, iLat, 0); + temp1d(1) = neutrals.temperature_scgc(iLon, iLat, 1); + lambda1d = lambda.tube(iLon, iLat); + lambda1d(1) = lambda1d(2); + lambda1d(0) = lambda1d(2); + front1d = 3.0 / 2.0 * cKB * species[nSpecies].density_scgc.tube(iLon, iLat); + dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + sources1d = sources.tube(iLon, iLat); + sources1d = sources1d / front1d; + + sources_tempdep_1d = sources_temp_dependent.tube(iLon, iLat); + sources_tempdep_1d = sources_tempdep_1d / front1d; + + conduction1d.zeros(); // reset temp variable to zero + conduction1d = solver_conduction(temp1d, + lambda1d, + front1d, + sources1d, + dalt1d, + dt / 10., + nGCs, + false, + sources_tempdep_1d); + + // The conduction solver gives Tnew-Told, so divide by dt + conduction1d.clamp(200, 6000); + electron_temperature_scgc.tube(iLon, iLat) = conduction1d; + } + } // electron_temperature_scgc = neutrals.temperature_scgc; @@ -195,24 +195,23 @@ arma_cube Ions::calc_epsilon(Neutrals &neutrals) { int64_t inN2 = neutrals.get_species_id("N2"); int64_t inO = neutrals.get_species_id("O"); - if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) report.error("Could not find O, N2, or O2 in neutrals species list"); - } - + arma_cube epsilon, x, logx; - - x = density_scgc / (neutrals.species[inO2].density_scgc - + neutrals.species[inN2].density_scgc - + neutrals.species[inO].density_scgc); + + x = density_scgc / (neutrals.species[inO2].density_scgc + + neutrals.species[inN2].density_scgc + + neutrals.species[inO].density_scgc); // should rarely need to be used: x.clamp(2e-8, 10.0); logx = log(x); - epsilon = exp(5.342 + 1.056*logx - pow(4.392e-2*logx, 2) - - pow(5.9e-2*logx,3) - 9.346e-3*pow(logx,4) - - 5.755e-4*pow(logx,5) - 1.249e-5*pow(logx,6) - )*1.6e-19; + epsilon = exp(5.342 + 1.056 * logx - pow(4.392e-2 * logx, 2) + - pow(5.9e-2 * logx, 3) - 9.346e-3 * pow(logx, 4) + - 5.755e-4 * pow(logx, 5) - 1.249e-5 * pow(logx, 6) + ) * 1.6e-19; report.exit(function); return epsilon; @@ -224,7 +223,7 @@ arma_cube Ions::calc_epsilon(Neutrals &neutrals) { // Calculate photoelectron heating // -------------------------------------------------------------------------- arma_cube Ions::calc_photoelectron_heating(arma_cube epsilon) { - + std::string function = "Ions::calc_photoelectron_heating"; static int iFunction = -1; report.enter(function, iFunction); @@ -238,9 +237,8 @@ arma_cube Ions::calc_photoelectron_heating(arma_cube epsilon) { IonsIonizationRate.set_size(epsilon.n_rows, epsilon.n_cols, epsilon.n_slices); IonsIonizationRate.zeros(); - for (int64_t iIon = 0; iIon < nIons; iIon++) { + for (int64_t iIon = 0; iIon < nIons; iIon++) IonsIonizationRate += species[iIon].ionization_scgc; - } Qphe = epsilon % IonsIonizationRate; @@ -252,7 +250,7 @@ arma_cube Ions::calc_photoelectron_heating(arma_cube epsilon) { // -------------------------------------------------------------------------- // Calculate ionization heating // -------------------------------------------------------------------------- -arma_cube Ions::calc_ionization_heating(arma_cube epsilon){ +arma_cube Ions::calc_ionization_heating(arma_cube epsilon) { std::string function = "Ions::calc_ionization_heating"; static int iFunction = -1; @@ -267,8 +265,8 @@ arma_cube Ions::calc_ionization_heating(arma_cube epsilon){ int64_t iO2P = get_species_id("O2+"); int64_t iN2P = get_species_id("N2+"); - arma_cube QIonization = auroheat * epsilon % (species[iO_3P].ionization_scgc - + species[iO2P].ionization_scgc + arma_cube QIonization = auroheat * epsilon % (species[iO_3P].ionization_scgc + + species[iO2P].ionization_scgc + species[iN2P].ionization_scgc); @@ -279,7 +277,7 @@ arma_cube Ions::calc_ionization_heating(arma_cube epsilon){ // -------------------------------------------------------------------------- // Calculate electron-ion collisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_ion_collisions(){ +std::vector Ions::calc_electron_ion_collisions() { std::string function = "Ions::calc_electron_ion_collisions"; static int iFunction = -1; @@ -294,30 +292,32 @@ std::vector Ions::calc_electron_ion_collisions(){ int64_t nSpecies = nSpecies; - if (input.get_do_calc_bulk_ion_temp()){ + if (input.get_do_calc_bulk_ion_temp()) { // This is used when we calculate bulk ion temperature! report.print(3, "Using bulk ion temperature for electron-ion collisions"); + // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - Qeicp += species[iSpecies].density_scgc - / (cME + species[iSpecies].mass); + Qeicp += species[iSpecies].density_scgc + / (cME + species[iSpecies].mass); } - Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB + Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB % (temperature_scgc - electron_temperature_scgc) * 5.45e-5 / pow(electron_temperature_scgc, 1.5); - } - else{ + } else { // Individual ion temperatures: - report.print(3, "Using individual ion temperatures for electron-ion collisions"); + report.print(3, + "Using individual ion temperatures for electron-ion collisions"); + // Use all species, not just major species (different from GITM) for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - Qeicp += species[iSpecies].density_scgc + Qeicp += species[iSpecies].density_scgc % (species[iSpecies].temperature_scgc - electron_temperature_scgc) / (cME + species[iSpecies].mass); } - Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB + Qeicp = Qeicp % density_scgc * cME * 3.0 * cKB * 5.45e-5 / pow(electron_temperature_scgc, 1.5); } @@ -326,25 +326,28 @@ std::vector Ions::calc_electron_ion_collisions(){ // delta velocity **2 btwn e- & ions: // This uses the bulk ion velocity, not the individual ion velocity. // (Different from GITM): Uses all species' densities (so just ne), not just o+, o2+, n2+, no+, n+ - for (int64_t iDir = 0; iDir < 3; iDir++) { + for (int64_t iDir = 0; iDir < 3; iDir++) dv2_ei += pow(velocity_vcgc[iDir] - exb_vcgc[iDir], 2); - } - Qeic_v = density_scgc * cME % dv2_ei * 5.45e-5 / pow(electron_temperature_scgc, 1.5) - % (density_scgc); - + + Qeic_v = density_scgc * cME % dv2_ei * 5.45e-5 / pow(electron_temperature_scgc, + 1.5) + % (density_scgc); + std::vector Qeic = {Qeicp, Qeicp % electron_temperature_scgc, - Qeic_v}; + Qeic_v + }; report.exit(function); - + return Qeic; } // -------------------------------------------------------------------------- // Calculate electron-neutral elastic collisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_neutral_elastic_collisions(Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_elastic_collisions( + Neutrals &neutrals) { std::string function = "Ions::calc_electron_neutral_elastic_collisions"; static int iFunction = -1; @@ -364,65 +367,70 @@ std::vector Ions::calc_electron_neutral_elastic_collisions(Neutrals & int64_t inN2 = neutrals.get_species_id("N2"); int64_t inO = neutrals.get_species_id("O"); - if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) report.error("Could not find O, N2, or O2 in neutrals species list"); - } - Qenc = density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - electron_temperature_scgc) - % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 - % (1 - 1.21e-4 * electron_temperature_scgc) - % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) - + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 - % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) - % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) - + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 - % (1 + 5.70e-4 * electron_temperature_scgc) - % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) + Qenc = density_scgc * cME * 3.0 * cKB % (neutrals.temperature_scgc - + electron_temperature_scgc) + % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 + % (1 - 1.21e-4 * electron_temperature_scgc) + % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + + (1.82e-10 * neutrals.species[inO2].density_scgc * 1.e-6 + % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5) / (cME + neutrals.species[inO2].mass)) + + (8.90e-11 * neutrals.species[inO].density_scgc * 1.e-6 + % (1 + 5.70e-4 * electron_temperature_scgc) + % pow(electron_temperature_scgc, 0.5) / (cME + neutrals.species[inO].mass)) + ); + report.print(6, "Qenc done"); + Qencp = density_scgc * cME * 3.0 * cKB + % ((2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 + % (1 - 1.21e-4 * electron_temperature_scgc) + % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) + + (1.82e-10 * neutrals.species[inO2].density_scgc * 1.e-6 + % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5) / (cME + neutrals.species[inO2].mass)) + + (8.90e-11 * neutrals.species[inO].density_scgc * 1.e-6 + % (1 + 5.70e-4 * electron_temperature_scgc) + % pow(electron_temperature_scgc, 0.5) / (cME + neutrals.species[inO].mass)) ); -report.print(6, "Qenc done"); - Qencp = density_scgc * cME * 3.0 * cKB - % ((2.33e-11*neutrals.species[inN2].density_scgc*1.e-6 - % (1 - 1.21e-4*electron_temperature_scgc) - % electron_temperature_scgc / (cME + neutrals.species[inN2].mass)) - + (1.82e-10*neutrals.species[inO2].density_scgc*1.e-6 - % (1 + 3.60e-2 * pow(electron_temperature_scgc, 0.5)) - % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO2].mass)) - + (8.90e-11*neutrals.species[inO].density_scgc*1.e-6 - % (1 + 5.70e-4*electron_temperature_scgc) - % pow(electron_temperature_scgc, 0.5)/(cME + neutrals.species[inO].mass)) - ); -report.print(6, "Qencp done"); + report.print(6, "Qencp done"); // delta velocity **2 btwn e- & neutrals: - for (int64_t iDir = 0; iDir < 3; iDir++) { - dv2_en += pow(neutrals.velocity_vcgc[iDir] - exb_vcgc[iDir], 2); - } - report.print(6, "dv2 done"); + for (int64_t iDir = 0; iDir < 3; iDir++) + dv2_en += pow(neutrals.velocity_vcgc[iDir] - exb_vcgc[iDir], 2); - Qenc_v = density_scgc * cME % dv2_en - %(2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 - % (1 - 1.21e-4 * electron_temperature_scgc) % electron_temperature_scgc * neutrals.species[inN2].mass - /(cME + neutrals.species[inN2].mass) - + 1.82e-10*neutrals.species[inO2].density_scgc*1.e-6%(1 + 3.60e-2*pow(electron_temperature_scgc, 0.5)) - % pow(electron_temperature_scgc, 0.5) *neutrals.species[inO2].mass - /(cME + neutrals.species[inO2].mass) - + 8.90e-11*neutrals.species[inO].density_scgc*1.e-6%(1 + 5.70e-4*electron_temperature_scgc) - %pow(electron_temperature_scgc,0.5)*neutrals.species[inO2].mass/(cME + neutrals.species[inO2].mass) - ); + report.print(6, "dv2 done"); -report.print(6, "Qencv done"); + Qenc_v = density_scgc * cME % dv2_en + % (2.33e-11 * neutrals.species[inN2].density_scgc * 1.e-6 + % (1 - 1.21e-4 * electron_temperature_scgc) % electron_temperature_scgc * + neutrals.species[inN2].mass + / (cME + neutrals.species[inN2].mass) + + 1.82e-10 * neutrals.species[inO2].density_scgc * 1.e-6 % (1 + 3.60e-2 * pow( + electron_temperature_scgc, 0.5)) + % pow(electron_temperature_scgc, 0.5) * neutrals.species[inO2].mass + / (cME + neutrals.species[inO2].mass) + + 8.90e-11 * neutrals.species[inO].density_scgc * 1.e-6 % + (1 + 5.70e-4 * electron_temperature_scgc) + % pow(electron_temperature_scgc, + 0.5) * neutrals.species[inO2].mass / (cME + neutrals.species[inO2].mass) + ); + + report.print(6, "Qencv done"); Qencm = Qencp % neutrals.temperature_scgc; report.exit(function); return std::vector {Qencp, Qencm, Qenc_v}; - } +} // -------------------------------------------------------------------------- // Calculate electron-neutral inelasticcollisions // -------------------------------------------------------------------------- -std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals &neutrals){ +std::vector Ions::calc_electron_neutral_inelastic_collisions( + Neutrals &neutrals) { std::string function = "Ions::calc_electron_neutral_inelastic_collisions"; static int iFunction = -1; @@ -446,9 +454,8 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals int64_t inN2 = neutrals.get_species_id("N2"); int64_t inO = neutrals.get_species_id("O"); - if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) { + if ((inO == -1) || (inN2 == -1) || (inO2 == -1)) report.error("Could not find O, N2, or O2 in neutrals species list"); - } // some aliases for common quantities arma_cube ne = density_scgc; @@ -466,33 +473,35 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals Te.elem(Te_mask) = Tn.elem(Te_mask) * 1.0001; // N2, O2 rotation (Shunk & Nagy pp. 277) - Qrot = 3.5e-14*ne*1.e-6%nn2*1.e-6%(Tn - Te)/(pow(Te,0.5)) - + 5.2e-15*ne*1.e-6%no2*1.e-6%(Tn - Te)/(pow(Te, 0.5)); - Qrot = Qrot*1.6e-13; // eV cm-3 s -> J m-3 + Qrot = 3.5e-14 * ne * 1.e-6 % nn2 * 1.e-6 % (Tn - Te) / (pow(Te, 0.5)) + + 5.2e-15 * ne * 1.e-6 % no2 * 1.e-6 % (Tn - Te) / (pow(Te, 0.5)); + Qrot = Qrot * 1.6e-13; // eV cm-3 s -> J m-3 - Qrotp = 3.5e-14*ne*1.e-6%nn2*1.e-6/(pow(Te,0.5)) // N2 - + 5.2e-15*ne*1.e-6%no2*1.e-6/(pow(Te, 0.5)); // O2 - Qrotp = Qrotp*1.6e-13; - Qrotm = Qrotp%Tn; + Qrotp = 3.5e-14 * ne * 1.e-6 % nn2 * 1.e-6 / (pow(Te, 0.5)) // N2 + + 5.2e-15 * ne * 1.e-6 % no2 * 1.e-6 / (pow(Te, 0.5)); // O2 + Qrotp = Qrotp * 1.6e-13; + Qrotm = Qrotp % Tn; // fine strcture heating rate by Shunk and Nagy Page 282 Qf = 0.0; - arma_cube Dfine = 5.0 + exp(-326.6/Tn) + 3.0 *exp(-227.7/Tn); - arma_cube s10 = 8.249e-16*pow(Te, 0.6) % exp(-227.7/Tn); - Qf = ne%no * 1.e-12/Dfine%(s10%(1.-exp(98.9*(1/Te - 1/Tn))) - + 1.191e-11*(1.-exp(326.6*(1/Te - 1/Tn))) - + 1.863e-11*(1.-exp(227.7*(1/Te - 1/Tn)))); - Qf = -Qf*1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 + arma_cube Dfine = 5.0 + exp(-326.6 / Tn) + 3.0 * exp(-227.7 / Tn); + arma_cube s10 = 8.249e-16 * pow(Te, 0.6) % exp(-227.7 / Tn); + Qf = ne % no * 1.e-12 / Dfine % (s10 % (1. - exp(98.9 * (1 / Te - 1 / Tn))) + + 1.191e-11 * (1. - exp(326.6 * (1 / Te - 1 / Tn))) + + 1.863e-11 * (1. - exp(227.7 * (1 / Te - 1 / Tn)))); + Qf = -Qf * 1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 Qfp = 0.0; Qfm = Qf; // O(1D) excitation arma_cube te_exc = Te.clamp(0.0, 18000.0); - arma_cube dexc = 2.4e4 + 0.3*(te_exc - 1500.) - 1.947e-5*(te_exc - 1500.)%(te_exc - 4000.); - Qexc = 1.57e-12*ne%no*1.e-12%exp(dexc%(te_exc - 3000.)/3000./te_exc) - %(exp(-22713*(te_exc - Tn)/te_exc/Tn) - 1); - Qexc = Qexc*1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 + arma_cube dexc = 2.4e4 + 0.3 * (te_exc - 1500.) - 1.947e-5 * + (te_exc - 1500.) % (te_exc - 4000.); + Qexc = 1.57e-12 * ne % no * 1.e-12 % exp(dexc % (te_exc - 3000.) / 3000. / + te_exc) + % (exp(-22713 * (te_exc - Tn) / te_exc / Tn) - 1); + Qexc = Qexc * 1.6e-13; // eV cm-3 s-1 -> J m-3 s-1 Qexcp = 0.0; Qexcm = Qexc; @@ -503,19 +512,20 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals // GITM clamped e- temp before calculating, but that makles things really hard here. // Instead we will use all Te's, and then limit the outputs after. - logQ = (5.0148e-31*pow(Te,9) - 1.5346e-26*pow(Te,8) - + 2.0127e-22*pow(Te,7) - 1.4791e-18*pow(Te,6) - + 6.6865e-15*pow(Te,5) - 1.9228e-11*pow(Te,4) - + 3.5187e-8*pow(Te,3) - 3.996e-5*pow(Te,2) - + 0.0267*Te - 19.9171); + logQ = (5.0148e-31 * pow(Te, 9) - 1.5346e-26 * pow(Te, 8) + + 2.0127e-22 * pow(Te, 7) - 1.4791e-18 * pow(Te, 6) + + 6.6865e-15 * pow(Te, 5) - 1.9228e-11 * pow(Te, 4) + + 3.5187e-8 * pow(Te, 3) - 3.996e-5 * pow(Te, 2) + + 0.0267 * Te - 19.9171); // GITM's Te_6000 was used when 300 Ions::calc_electron_neutral_inelastic_collisions(Neutrals logQv1 = -20.0; if (tte <= 1500 && tte > 300) { - logQv0(0) = Av0L + Bv0L * tte + Cv0L * pow(tte, 2) + Dv0L * pow(tte, 3) + Fv0L * pow(tte, 4) - 16.0; + logQv0(0) = Av0L + Bv0L * tte + Cv0L * pow(tte, 2) + Dv0L * pow(tte, + 3) + Fv0L * pow(tte, 4) - 16.0; Qvib_N2(iLon, iLat, iAlt) = (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(0)) * (1.0 - exp(3353.0 * (1.0 / tte - 1.0 / ttn))); } else if (tte > 1500) { - logQv0 = Av0 + Bv0 * tte + Cv0 * pow(tte, 2) + Dv0 * pow(tte, 3) + Fv0 * pow(tte, 4) - 16.0; - logQv1 = Av1 + Bv1 * tte + Cv1 * pow(tte, 2) + Dv1 * pow(tte, 3) + Fv1 * pow(tte, 4) - 16.0; - + logQv0 = Av0 + Bv0 * tte + Cv0 * pow(tte, 2) + Dv0 * pow(tte, + 3) + Fv0 * pow(tte, 4) - 16.0; + logQv1 = Av1 + Bv1 * tte + Cv1 * pow(tte, 2) + Dv1 * pow(tte, + 3) + Fv1 * pow(tte, 4) - 16.0; + for (int iLevel = 0; iLevel < 10; iLevel++) { Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp10(logQv0(iLevel)) - * (1.0 - exp((iLevel + 1) * 3353.0 * (1.0 / tte - 1.0 / ttn))); + * (1.0 - exp((iLevel + 1) * 3353.0 * (1.0 / tte - 1.0 / ttn))); } for (int iLevel = 0; iLevel < 8; iLevel++) { // GITM did this loop from 2-9, which is out of bounds, so we correct for iLevel here) - Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp(-3353.0 / ttn) - * exp10(logQv1(iLevel)) - * (1.0 - exp((iLevel + 2) * 3353.0 * (1.0 / tte - 1.0 / ttn))); + Qvib_N2(iLon, iLat, iAlt) += (1.0 - exp(-3353.0 / ttn)) * exp(-3353.0 / ttn) + * exp10(logQv1(iLevel)) + * (1.0 - exp((iLevel + 2) * 3353.0 * (1.0 / tte - 1.0 / ttn))); } } } @@ -586,10 +599,10 @@ std::vector Ions::calc_electron_neutral_inelastic_collisions(Neutrals report.exit(function); report.print(6, "Qenc done"); - return std::vector {Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2}; - } + return std::vector {Qrotm, Qrotp, Qf, Qexc, Qvib_O2, Qvib_N2}; +} -arma_mat Ions::calc_thermoelectric_current(Grid &grid){ +arma_mat Ions::calc_thermoelectric_current(Grid &grid) { std::string function = "Ions::calc_thermoelectric_current"; static int iFunction = -1; @@ -620,18 +633,20 @@ arma_mat Ions::calc_thermoelectric_current(Grid &grid){ arma_cube JuTotalDotB = dot_product(JTotal, grid.bfield_vcgc); arma_cube divJperp; - divJperp.set_size(density_scgc.n_rows, density_scgc.n_cols, density_scgc.n_slices); + divJperp.set_size(density_scgc.n_rows, density_scgc.n_cols, + density_scgc.n_slices); divJperp.zeros(); - for (int64_t iDir =0; iDir < 3; iDir ++){ + for (int64_t iDir = 0; iDir < 3; iDir ++) { divJperp += calc_gradient_vector(JTotal[iDir], grid)[iDir]; - divJperp -= calc_gradient_vector(JuTotalDotB, grid)[iDir] % grid.bfield_unit_vcgc[iDir]; + divJperp -= calc_gradient_vector(JuTotalDotB, + grid)[iDir] % grid.bfield_unit_vcgc[iDir]; divJperp -= calc_gradient_vector(JuTotalDotB, grid)[iDir] % JuTotalDotB; } - for (int64_t iAlt = 0; iAlt < density_scgc.n_slices; iAlt++){ - JParallel -= divJperp.slice(iAlt) % grid.dalt_center_scgc.slice(iAlt);} + for (int64_t iAlt = 0; iAlt < density_scgc.n_slices; iAlt++) + JParallel -= divJperp.slice(iAlt) % grid.dalt_center_scgc.slice(iAlt); report.exit(function); return JParallel; - } \ No newline at end of file +} \ No newline at end of file From 955bcf93ab5986b8de67e2bf90a3353c3a2676ba Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 14 Mar 2025 12:34:51 -0400 Subject: [PATCH 430/691] FEAT: Inputs for new dipole grid --- share/run/UA/inputs/defaults.json | 2 ++ share/run/aether.json | 8 +++----- src/init_mag_grid.cpp | 21 ++++++--------------- src/inputs.cpp | 27 +++++++++++++-------------- 4 files changed, 24 insertions(+), 34 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 861e4f81..e5ab817c 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -83,6 +83,8 @@ "Shape" : "dipole", "nLatsPerBlock" : 18, "LonRange" : [0.0, 360.0], + "LatRange" : [85.0, 360.0], + "AltRange" : [0.0, 360.0], "nLonsPerBlock" : 22, "nAlts" : 50, "MinAlt" : 80.0, diff --git a/share/run/aether.json b/share/run/aether.json index 76bef500..ea5387e2 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -26,15 +26,13 @@ "IsUniformAlt" : false}, "ionGrid": { - "dAltStretch": 0.6, - "LatStretch": 1, "Shape": "dipole", "nLonsPerBlock": 36, "nLatsPerBlock" : 18, "nAlts":36, - "LatMax":88, - "MinAlt":100.0, - "MinApex":150.0 + "LatRange":[10, 80], + "AltRange":[80.0, 1000], + "LonRange" : [0.0, 360.0] }, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index d9b56927..1cb64f1a 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -634,33 +634,24 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { int64_t nGCs = get_nGCs(); // Get inputs: + + precision_t max_lat = grid_input.lat_min; + precision_t max_lat = grid_input.lat_max; + precision_t min_alt = grid_input.alt_min * cKMtoM; - precision_t LatStretch = grid_input.LatStretch; - precision_t Gamma = grid_input.FieldLineStretch; - precision_t min_apex = grid_input.min_apex * cKMtoM; - precision_t max_lat = grid_input.max_blat; + precision_t max_alt = grid_input.alt_max * cKMtoM; // Normalize inputs to planet radius... (update when earth is oblate) precision_t planetRadius = planet.get_radius(0.0); // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; - precision_t min_apex_re = (min_apex + planetRadius) / planetRadius; - - if (LatStretch != 1) { - report.error("LatStretch values =/= 1 are not yet supported!"); - DidWork = false; - } + precision_t max_alt_re = (max_alt + planetRadius) / planetRadius; if (nAlts % 2 != 0) { report.error("nAlts must be even!"); DidWork = false; } - if (min_alt >= min_apex) { - report.error("min_apex must be more than min_alt"); - DidWork = false; - } - // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin arma_vec size_right_norm = quadtree_ion.get_vect("SR"); // lon_lims diff --git a/src/inputs.cpp b/src/inputs.cpp index f8351ca9..c35d8637 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -452,22 +452,22 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { grid_specs.lon_min = min_max[0] * cDtoR; grid_specs.lon_max = min_max[1] * cDtoR; - grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); + min_max = get_setting_intarr(gridtype, "LatRange"); + grid_specs.lat_min = min_max[0] * cDtoR; + grid_specs.lat_max = min_max[1] * cDtoR; + // The rest of the settings are different for mag/geo grids, // First take the magnetic options, then "else" should be (cube-)sphere - + // - This checks if "dipole" is in shape, to account for the # of root nodes. if (grid_specs.shape.find("dipole") != std::string::npos) { - // Latitude range (base of field line) is specified with max lat & min apex. - grid_specs.max_blat = check_settings_pt(gridtype, "LatMax") * cDtoR; - grid_specs.min_apex = check_settings_pt(gridtype, "MinApex"); - // stretch the baselatitudes (not yet implemented) - grid_specs.LatStretch = check_settings_pt(gridtype, "LatStretch"); - // controls the spacing of points along field line, <<1 for more pts at low alts - grid_specs.FieldLineStretch = check_settings_pt(gridtype, "dAltStretch"); + // Invariant latitude range (of real corners) is specified with max/min. + // max alt of open field lines, and min alt, is set in AltRange + min_max = get_setting_intarr(gridtype, "AltRange"); + grid_specs.alt_min = min_max[0]; + grid_specs.alt_max = min_max[1]; + } else { - min_max = get_setting_intarr(gridtype, "LatRange"); - grid_specs.lat_min = min_max[0] * cDtoR; - grid_specs.lat_max = min_max[1] * cDtoR; + grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); grid_specs.IsUniformAlt = get_setting_bool(gridtype, "IsUniformAlt"); @@ -551,9 +551,8 @@ precision_t Inputs::get_dt_output(int iOutput) { if (iOutput < nOutputs) value = settings.at("Outputs").at("dt").at(iOutput); - else{ + else report.error("Output Error; more output types than dt's provided."); - } return value; } From c5688465468ac75e1e5a9792ae4160a899c128cf Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 14 Mar 2025 14:10:12 -0400 Subject: [PATCH 431/691] FEAT: Quadtree for new dipole - 4 & 6 root nodes --- include/dipole.h | 126 +++++++++--------------------- include/quadtree.h | 2 + share/run/UA/inputs/defaults.json | 2 +- share/run/aether.json | 2 +- src/quadtree.cpp | 38 ++++----- 5 files changed, 58 insertions(+), 112 deletions(-) diff --git a/include/dipole.h b/include/dipole.h index c8aed455..9ad2f8a4 100644 --- a/include/dipole.h +++ b/include/dipole.h @@ -8,119 +8,71 @@ #include /************************************************* - * \brief A namespace with all (1-root) dipole grid logic. + * \brief A namespace with all (4-root) dipole grid logic. *************************************************/ -namespace Dipole { - - /// The normalized origins of each face of the cube (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0} - }; - - /// Normalized right steps in cube - static const arma_mat RIGHTS = { - {2.0, 0.0, 0.0} - }; - - /// Normalized up steps in cube - static const arma_mat UPS = { - {0.0, 1.0, 0.0} - }; +namespace Dipole4 { +/// The normalized origins of each node (i.e. corner) +static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 0.0, -0.25, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 0.25, 0.0} }; -/************************************************* - * \brief A namespace with all (2-root) dipole grid logic. - *************************************************/ -namespace Dipole2 { - - /// The normalized origins of each face of the cube (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - { 0.0, 0.0, 0.0} - }; - - /// Normalized right steps in cube - static const arma_mat RIGHTS = { - {2.0, 0.0, 0.0}, - {2.0, 0.0, 0.0} - }; - - /// Normalized up steps in cube - static const arma_mat UPS = { - {0.0, 0.5, 0.0}, - {0.0, 0.5, 0.0} - }; - +/// Normalized right steps in node +static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0} }; -/************************************************* - * \brief A namespace with all (4-root) dipole grid logic. - *************************************************/ -namespace Dipole4 { - - /// The normalized origins of each node (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - { 1.0, -0.5, 0.0}, - { 1.0, 0.0, 0.0}, - { 0.0, 0.0, 0.0} - }; - - /// Normalized right steps in node - static const arma_mat RIGHTS = { - {1.0, 0.0, 0.0}, - {1.0, 0.0, 0.0}, - {1.0, 0.0, 0.0}, - {1.0, 0.0, 0.0} - }; - - /// Normalized up steps in node - static const arma_mat UPS = { - {0.0, 0.5, 0.0}, - {0.0, 0.5, 0.0}, - {0.0, 0.5, 0.0}, - {0.0, 0.5, 0.0} - }; +/// Normalized up steps in node +static const arma_mat UPS = { + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0} +}; }; /************************************************* * \brief A namespace with all (6-root) dipole grid logic. - * This is the same as the Sphere6 *************************************************/ namespace Dipole6 { /// The normalized origins of each face of the cube (i.e. corner) static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - {2.0/3.0, -0.5, 0.0}, - {4.0/3.0, -0.5, 0.0}, - { 0.0, 0.0, 0.0}, - {2.0/3.0, 0.0, 0.0}, - {4.0/3.0, 0.0, 0.0} + { 0.0, -0.5, 0.0}, + { 0.0, -1.0 / 3.0, 0.0}, + { 0.0, -1.0 / 6.0, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0} }; /// Normalized right steps in cube static const arma_mat RIGHTS = { - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0} + { 2.0, 0.0, 0.0}, + { 2.0, 0.0, 0.0}, + { 2.0, 0.0, 0.0}, + { 2.0, 0.0, 0.0}, + { 2.0, 0.0, 0.0}, + { 2.0, 0.0, 0.0} }; /// Normalized right steps in cube static const arma_mat UPS = { - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0} + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0}, + { 0.0, 1.0 / 6.0, 0.0} }; } diff --git a/include/quadtree.h b/include/quadtree.h index e63ec1d5..18b584c7 100644 --- a/include/quadtree.h +++ b/include/quadtree.h @@ -181,6 +181,8 @@ class Quadtree { bool IsSphere = false; /// Defines whether the quadtree is a cubesphere or not: bool IsCubeSphere = false; + /// Defines whether the quadtree is a dipole or not: + bool IsDipole = false; }; diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index e5ab817c..09ade2c6 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -80,7 +80,7 @@ "AltFile" : ""}, "ionGrid" : { - "Shape" : "dipole", + "Shape" : "dipole4", "nLatsPerBlock" : 18, "LonRange" : [0.0, 360.0], "LatRange" : [85.0, 360.0], diff --git a/share/run/aether.json b/share/run/aether.json index ea5387e2..96f1f08e 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -26,7 +26,7 @@ "IsUniformAlt" : false}, "ionGrid": { - "Shape": "dipole", + "Shape": "dipole4", "nLonsPerBlock": 36, "nLatsPerBlock" : 18, "nAlts":36, diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 6e5f6cf6..0e2aae65 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -8,8 +8,8 @@ // - Cubesphere, this has 6 root nodes (2 polar, 4 equatorial) // - Sphere, this has 1 root node (whole grid) // - Sphere6, this is a spherical grid, but has 6 root nodes (2 lats, 3 lons) -// - Dipole, which may be the same as Sphere // - Dipole4, which has 4 root nodes (4 lats, 1 lon) +// - Dipole6, which has 4 root nodes (6 lats, 1 lon) #include "aether.h" @@ -22,11 +22,8 @@ Quadtree::Quadtree(std::string shape) { if (shape == "sphere") nRootNodes = 1; - if (shape == "dipole") - nRootNodes = 1; - - if (shape == "dipole2") - nRootNodes = 2; + if (shape == "dipole4") + nRootNodes = 4; if (shape == "dipole6") nRootNodes = 6; @@ -66,25 +63,19 @@ void Quadtree::build(std::string gridtype) { IsSphere = true; } - if (grid_input.shape == "dipole") { - origins = Dipole::ORIGINS; - rights = Dipole::RIGHTS; - ups = Dipole::UPS; - IsSphere = true; - } - - if (grid_input.shape == "dipole2") { - origins = Dipole2::ORIGINS; - rights = Dipole2::RIGHTS; - ups = Dipole2::UPS; - IsSphere = true; + if (grid_input.shape == "dipole4") { + origins = Dipole4::ORIGINS; + rights = Dipole4::RIGHTS; + ups = Dipole4::UPS; + IsDipole = true; } if (grid_input.shape == "dipole6") { origins = Dipole6::ORIGINS; rights = Dipole6::RIGHTS; ups = Dipole6::UPS; - IsSphere = true; + IsDipole = true; + } arma_vec o(3), r(3), u(3); @@ -112,10 +103,11 @@ void Quadtree::build(std::string gridtype) { // restrict the domain. This will only work for the spherical // grid so far: - if (grid_input.lon_min > 0.0 || - grid_input.lon_max < 2.0 * cPI || - grid_input.lat_min > -cPI / 2.0 || - grid_input.lat_max < cPI / 2.0) { + if ((grid_input.lon_min > 0.0 || + grid_input.lon_max < 2.0 * cPI || + grid_input.lat_min > -cPI / 2.0 || + grid_input.lat_max < cPI / 2.0) + && (IsSphere)) { // We are dealing with less than the whole Earth... origins(0) = grid_input.lon_min / cPI; origins(1) = grid_input.lat_min / cPI; From 3027485ee1d33948ea82fe581d6a1615945ef4fc Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 17 Mar 2025 16:07:17 -0400 Subject: [PATCH 432/691] FEAT/DOC: Update Python script to match new dipole grid - Does not have final pole ghost cells yet... --- edu/examples/Dipole/dipole.py | 479 +++++++++++++++++----------------- 1 file changed, 235 insertions(+), 244 deletions(-) diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index f8bae674..a50a3093 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -6,122 +6,153 @@ # Set to None or '' to not save, just show (pan/zoom capabilities). fig_save_path = None +# Number of lats/alts (without ghost cells) +nLatsPerBlock_in = 12 +nAltsPerBlock_in = 12 -nf = 100 # number of field lines -nz = 200 # number of grid cells on each field line -alt_min = 90 # in km, min altitude +# in degrees, where to begin & end grid between (90,0) +max_blat = 85 +min_blat = 12 -# in degrees, start/end latitudes of field lines. between (90,0) -max_blat = 89.9 -min_blat = 2.25 +# In km (above surface) +min_alt = 80 +max_alt = 800 -gams = 0.1 -# point distribution along field lines. -# higher puts more pts at high altitudes. +# Number of "blocks" to simulate - i.e. # of processors in Aether run (>4 & even) +nBlocks = 6 -baselat_spacing_factor = 6 # exponential factor for spacing baselats (uses cos() too) +nGCs = 2 # consts: -Re = 6371 # in km - - -# leave empty for "auto" (aaron b choose), or put in custom limits here. -# [left, right, bottom, top] -limits_left_plot = None # default is whole image -limits_right_plot = None # default is [-0.1, 2.0, -0.3, 1.75] - - -# ------------------------------------------------------------------------ -# Main code is here: -# ------------------------------------------------------------------------ - -#### Useful Functions: #### - - -def calc_baselats(blat_min, blat_max, n_f, factor): - """Lay down base latitudes - - Args: - blat_min (float): min latitude to start (positive), in degrees. - blat_max (float): max latitude in degrees, positiv & less than 90.0 - nf (int): Number of field lines. Must be even! - factor (float): Factor to use to space latitudes. - - Returns: - numpy array: starting latitudes - - Notes: follows very similar approach to doi:10.1029/2000JA000035 - - Not exactly exponential, but exponential and a cosine! - - Spaced according to B-field strength. - - """ - # Space out base latitudes: - - baselats = np.linspace( - np.cos(np.deg2rad(blat_min ** (1 / factor))), - np.cos(np.deg2rad(blat_max ** (1 / factor))), - num=n_f, - ) - - # baselats are in southern hemisphere - baselats = -1 * np.flip(np.rad2deg(np.arccos(baselats)) ** factor) - - return baselats - - -def calc_q(alt, theta, re=None, is_alt=False, isnt_re=False): - """Calculate q (distance along field line) for a point - - Args: - alt (float, array-like): altitude (kn or Re) - theta (float or array-like): magnetic latitude (in degrees). - 0 at mag equator (measured from North Pole). - re (float): radius of earth in km. only used if alt is altitude and/or in km - is_alt (bool): altitude is altitude? False means it's radius. Default is False - isnt_re (bool): altitude is in km? False means altitude has units [Re]. Default is False - - Returns: - (array or float): q-value for the given (alt, theta) point. - - Notes: - - make sure theta has units degrees and is measured from north pole - - See for more information. - - is_alt & isnt_re are from debugging & aren't used anymore. - - """ - - if is_alt: # convert altitude to radius - alt = alt + re - if isnt_re: # convert km to re - alt = alt / re - - return np.cos(np.deg2rad(90 - theta)) / (alt**2) - - -def calc_p(alt, theta, re=None, is_alt=False, isnt_re=False): - """Calculate p-value (l-shell) for a given altitude & latitude - - Args: - alt (float): altitude (in km or Re), (above surface or from origin) - theta (float): latitude, in degrees - re (float): earth radius in km. optional. - is_alt (bool): is alt altitude? if it's radius, set to False (default). - isnt_re (bool): altitude is in km? False (default) means altitude has units [Re]. - - Returns: - (array or float): p-value. Same as l-Shell, in Re. - - Notes: - - make sure theta has units degrees and is measured from north pole - - See for more information. - - is_alt & isnt_re are from debugging & aren't used anymore. - - """ - if is_alt: - alt = alt + re - if isnt_re: - alt = alt / re - return alt / (np.sin(np.deg2rad(90 - theta)) ** 2) +Re_KM = 6371 # in km +cPI = np.pi + + +######## ~~~~~~~~~~~~~~~~~~~~ ######## +# OUTLINE: +# - constants & inputs (above) +# - def main (the function to create the grid) +# - def the ploting function +# - def all conversions +# - call main: +# - make the grid as Aether would +# - call the plotting script + +def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, nAltsPerBlock): + + pcenters = np.zeros([len(origins), nLatsPerBlock, nAltsPerBlock]) + qcenters = np.zeros([len(origins), nLatsPerBlock, nAltsPerBlock]) + + # Loop through QT's origins + for n, origin in enumerate(origins): + close_this_block = False + isSouth = False + # If we're in south hemisphere, flip everything. WIll be undone later. + if origin < -0.01: + isSouth = True + origin = -1*origin - extent + + lat0 = (2*(lat_max - lat_min))*origin + dlat = extent * ((lat_max - lat_min)*2) / (nLatsPerBlock - nGCs) + + # Put latitudes down evenly (centers & corners) + # - This forms the invariant latitudes which field lines must pass thru + lat1d = [] + lat1d_co = [] + pcenters1d = np.empty(nLatsPerBlock) + qs = np.empty((nLatsPerBlock, nAltsPerBlock)) + pcenters2d = np.empty((nLatsPerBlock, nAltsPerBlock)) + + + for i in range(nLatsPerBlock): + lat1d.append(lat0 + (i - nGCs + 0.5) * dlat + lat_min) + pcenters1d[i] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[-1]))**2) + # Easier to save later if we get this: + pcenters2d[i, :] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[-1]))**2) + + for i in range(nLatsPerBlock+1): + lat1d_co.append(lat0 + (i - nGCs) * dlat + lat_min) + + pcorners = alt_minRE / np.sin(np.pi/2 - np.deg2rad(lat1d_co)) **2 + + ## Determine if field lines should close. There are two conditions: + # - If the lowest l-shell in this block < altMin + if np.min(pcorners) < alt_maxRE: + close_this_block = True + # - Or if we are touching the qeuator + if origin < 0.01: # NH equator + close_this_block + True + if np.abs(extent + origin) < 0.01: # SH equator + close_this_block = True + + ## Setting up the q-values... + + # The idea here is that we wither want the field line to close (wrap over equator) + # or to have its boundaries entirely within min/max alt. + # We do not want field lines ending before max_alt, and vice-versa + # Q_max is obtained from the minimum altitude point on the highest latitude field line + q_max_center = rp2q(alt_minRE, pcenters1d[-1]) + if close_this_block: + q_min_center = 0 # if the block is closed, q_min = 0. This is the equator! + else: + # If open, q_min is the highest altitude point on the lowest latitude field line + q_min_center = rp2q(alt_maxRE, pcenters1d[0]) + + + delQ = (q_max_center - q_min_center) / (nAltsPerBlock - nGCs*2) + for iAlt in range(nAltsPerBlock): + qs[:, iAlt] = ((q_min_center + (iAlt - nGCs + 0.5) * delQ)) + + # If we were in South hemisphere, multiply by -1 + # (and reverse so the points are in the same order as NH) + if isSouth: + qs = -1*np.flip(qs) + qcenters[n,:] = qs + pcenters[n,:] = pcenters2d + + return qcenters, pcenters + + +#### Useful Functions for conversions: #### + +def rt2q(r, t): + return np.cos(cPI/2 - t)/r**2 + +def rt2p(r, t): + return r/(np.sin(cPI/2 - t)**2) + +def rt2qp(r, t): + q = rt2q(r, t) + p = rt2p(r, t) + return q, p + +def rt2xy(r, t): + x = r*np.cos(t) + y = r*np.sin(t) + return x, y + + +def rq2t(r,q): + return np.arcsin(q * r**2) +def rp2t(r, p): + return np.arccos(np.sqrt(r/p)) + +def rp2q(r, p): + return np.sqrt((1-r/p)/r**4) + +def qp2xy(q, p): + r_ = qp_solve(q, p) + t_ = rq2t(r_, q) + return rt2xy(r_, t_) + +def tp2r(t, p): + return p * (np.cos(t)**2) + +def alt2r(alt, re): + return (alt + re)/re + +def r2alt(r, re): + return r*re - re def qp_solve(q, p): @@ -145,149 +176,109 @@ def qp_solve(q, p): return new_r -#### The main stuff: #### - - -def calc_exp_grid(nf0, nz0, altminre, baselats, pvals, gamma): - """Exponential Grid laydown, keeps grid parallel & perpendicular to B - - Args: - nf0 (int): number of field lines - nz0 (int): number of points along each field line. MUST BE EVEN! - altminre (float): min altitude (in Re from center of earth) to trace from - baselats (list/array): latitudes to start at (from calc_baselats) - pvals (flaot): p-values (dipole coords, so it's L-shells) for all field lines - gamma (float): factor used to space points along field line. - Lower values increase point density @ low altitudes - - Returns: - [np.array, np.array]: (nf, nz) dimensionsl arrays of: - - Latitudes (in deg) - - Radii (in re) of grid - - ** This can be vectorized & shortened A LOT. - Left in this state for readability and in case things need to be changed. - +def make_plot(qs, ps, alt_min_RE, Re_km=6371, + abs_bot = False # Take the absolute value of latitude on bottom plot? + ): + + rs = qp_solve(qs, ps) + ts = rq2t(rs, qs) + + fig = plt.figure(figsize=(8,11)) + + gs = plt.GridSpec(8,9) + + ax0 = fig.add_subplot(gs[:5,:3]) + for x,y in zip(*qp2xy(qs, ps)): + ax0.scatter(x,y, s=5) + + xlim, ylim = ax0.get_xlim(), ax0.get_ylim() + + circle1 = plt.Circle((0, 0), 1, color='k', alpha = .7) + ax0.add_patch(circle1) + + ax0.set_ylim(ylim) + ax0.set_xlim(xlim) + ax0.set_aspect(1) + ax0.set_title('in Re:') + + + ax1 = fig.add_subplot(gs[:2,4:]) + counts, _, _ = ax1.hist(rs.flatten(), bins=60) + ax1.vlines(alt_min_RE, 0, max(counts)*1.1, linestyle = '--', alpha=.7, color='k') + ax1.set_title(f"{np.sum(rs < alt_min_RE) / np.prod(rs.shape)*100:.2f}% of points below min_alt\n" + f"{np.sum(rs < 1) / np.prod(rs.shape)*100:.2f}% of points below 0 Re") + ax1.set_xlabel('Each cell altitude in Re') + ax1.set_ylabel('bin count') + + + ax1p2 = fig.add_subplot(gs[2,4:]) + alt_min_KM = r2alt(alt_min_RE, Re_km) + counts, bins, _ = ax1p2.hist(r2alt(rs, Re_km).flatten(), bins=200) + ax1p2.vlines(alt_min_KM, 0, max(counts)*1.1, linestyle = '--', alpha=.7, color='k') + ax1p2.set_xlim(-100, 1000) + ax1p2.set_xlabel('altitude in km') + + another_hist_ax = fig.add_subplot(gs[3:5, 4:]) + another_hist_ax.hist(np.rad2deg(ts.flatten()), bins=90) + another_hist_ax.set_xlabel('Magnetic Latitude (deg)') + # another_hist_ax.set_xlabel( + + + ax2 = fig.add_subplot(gs[5:,:]) + for x,y in zip(np.rad2deg(ts), r2alt(rs, Re_km)): + if abs_bot: + ax2.scatter(np.abs(x),y) + else: + ax2.scatter(x,y) + + ax2.hlines(100, 0 if abs_bot else -90, 90, color='k', alpha=.8) + ax2.set_ylim(0,1500) + ax2.set_xlabel('Magnetic Latitude (deg)') + ax2.set_ylabel('Altitude (km)') + + + + plt.tight_layout() + + return fig + + +def generate_sym_quadtree(nBlocks): """ + Makes the latitude portion of the quadtree + input: nBlocks + outputs: + origins (normed y-coordinate of lower-left) + extent (size_up_norm) + """ + origins = np.linspace(-0.5, 0.5, num=nBlocks, endpoint=False) + extent = 1/nBlocks - lats_2d = [] - rs_2d = [] - - nzh = int(nz0 / 2) - - for f_iter in range(nf0): - # q in sh & nh - q_S = calc_q(altminre, baselats[f_iter], is_alt=False, isnt_re=False) - q_N = calc_q(altminre, -baselats[f_iter], is_alt=False, isnt_re=False) - - # linear spacing - made it really readable, could be done "cleaner" - delqp = (q_N - q_S) / nz0 - qp0 = [] - for i in range(nz0): - qp0.append(q_S + i * delqp) - - # exp grid laydown, (same for all calls here, speed not an issue though) - delqp = altminre * delqp - f00s = [] - for i in range(nz0): - f00s.append(gamma + (1 - gamma) * np.exp(-(((i - nzh) / (nz0 / 10)) ** 2))) - - # spacing according to sinh function - ft = [] - for i in range(nz0): - fb0 = (1 - f00s[i]) / np.exp(-q_S / delqp - 1) - fa = f00s[i] - fb0 - ft.append(fa + fb0 * np.exp(-(qp0[i] - q_S) / delqp)) - - # q values, from south -> equator - qpnew = [] - for i in range(nzh): - delq = qp0[i] - q_S - qpnew.append(q_S + ft[i] * delq) - - # qpnew is from south-equator. extend it to north pole, - # so *-1 & reverse order so it is ascending - qpnew.extend(np.flip(np.array(qpnew)) * -1) - - ilats = [] - irs = [] - - for i in range(nz0): - # use qpsolve to get r from (q,p) - irs.append(qp_solve(qpnew[i], pvals[f_iter])) - # Use dipole equations to get lat from q and r - # q = cos(theta)/r**2 - ilats.append(np.rad2deg(np.arcsin(qpnew[i] * irs[-1] ** 2))) - - # Put into 2-D; lists easier & then return numpy - lats_2d.append(ilats) - rs_2d.append(irs) - - return np.array(lats_2d), np.array(rs_2d) - - -#### Actual computation: #### - - -AltMinRe = (alt_min + Re) / Re # alt min in Re - -# baselats -baselats = calc_baselats(min_blat, max_blat, nf, baselat_spacing_factor) - -# l-shells -pvals = calc_p(AltMinRe, baselats) - -# take those, make lats & radii -lats, rs = calc_exp_grid(nf, nz, AltMinRe, baselats, pvals, gams) - - -print("making plot") - -# change variables in case anyone wants to make different plots -xs = lats[:, :] -ys = rs[:, :] + return origins, extent -fig, ax = plt.subplots(1, 2, figsize=(7, 7)) -# scatter points, same color is same field line -for x, y in zip(xs, ys): - ax[0].scatter(y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x))) - ax[1].scatter(y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x))) +# ------------------------------------------------------------------------ +# Main code is here: +# ------------------------------------------------------------------------ +if __name__ == "__main__": -# change variables again, overwrite previous xs, ys -# Take every 4th field line so it's more clear to see things -xs = lats[:, :-8:4] -ys = rs[:, :-8:4] -# black dashed lines, same nz value at different nf's -for x, y in zip(xs.T, ys.T): - ax[0].plot( - y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x)), linestyle="--", color="k" - ) - ax[1].plot( - y * np.cos(np.deg2rad(x)), y * np.sin(np.deg2rad(x)), linestyle="--", color="k" - ) + alt_maxRE = alt2r(max_alt, Re_KM) + alt_minRE = alt2r(min_alt, Re_KM) + + nLatsPerBlock = nLatsPerBlock_in + nGCs*2 + nAltsPerBlock = nAltsPerBlock_in + nGCs*2 -# make square-ish -ax[0].set_aspect(1) -ax[1].set_aspect(1) + origins, extent = generate_sym_quadtree(nBlocks) -# custom limits? -if limits_left_plot: - ax[1].set_xlim(limits_left_plot[0], limits_left_plot[1]) - ax[1].set_ylim(limits_left_plot[2], limits_left_plot[3]) + qs, ps = main(alt_minRE, alt_maxRE, min_blat, max_blat, origins, extent, nLatsPerBlock, nAltsPerBlock) + # if we want r&theta now: + # rs = qp_solve(qs, ps) + # ts = rq2t(rs, qs) + # Otherwise the plotting function does it: -if limits_right_plot: - ax[1].set_xlim(limits_right_plot[0], limits_right_plot[1]) - ax[1].set_ylim(limits_right_plot[2], limits_right_plot[3]) -else: - ax[1].set_xlim(-0.1, 2) - ax[1].set_ylim(-0.3, 1.75) + fig = make_plot(qs, ps, alt_minRE, Re_KM, abs_bot=False) -# save or show: -if fig_save_path: - plt.savefig(fig_save_path) -else: plt.show() -plt.close("all") + From defd757f4d0ded903fa9fc0e0ea8b5ef50e1c2e2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 17 Mar 2025 16:53:05 -0400 Subject: [PATCH 433/691] FEAT: Put pole-most points into python script --- edu/examples/Dipole/dipole.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index a50a3093..fd6d8fee 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -3,8 +3,7 @@ #### Set inputs #### -# Set to None or '' to not save, just show (pan/zoom capabilities). -fig_save_path = None +# To save plot, change last line of the code to save it, otherwise it is just 'show'n # Number of lats/alts (without ghost cells) nLatsPerBlock_in = 12 @@ -32,11 +31,11 @@ # OUTLINE: # - constants & inputs (above) # - def main (the function to create the grid) -# - def the ploting function # - def all conversions -# - call main: +# - def the ploting function +# - Run script: # - make the grid as Aether would -# - call the plotting script +# - call the plotting function def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, nAltsPerBlock): @@ -62,17 +61,23 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, pcenters1d = np.empty(nLatsPerBlock) qs = np.empty((nLatsPerBlock, nAltsPerBlock)) pcenters2d = np.empty((nLatsPerBlock, nAltsPerBlock)) - for i in range(nLatsPerBlock): lat1d.append(lat0 + (i - nGCs + 0.5) * dlat + lat_min) - pcenters1d[i] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[-1]))**2) + + # IF touching pole, put last ghost cell at 89.9 degrees & the 2nd to last 1/2 way there. + if origin + extent > 0.49: + lat1d[-1] = 89.9 + lat1d[-2] = (lat1d[-1] + lat1d[-2]) /2 + + for i in range(nLatsPerBlock): + pcenters1d[i] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[i]))**2) # Easier to save later if we get this: - pcenters2d[i, :] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[-1]))**2) + pcenters2d[i, :] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[i]))**2) - for i in range(nLatsPerBlock+1): + # Corners (only used here to determins if we need to close >1 block per hemisphere) + for i in range(nLatsPerBlock+1): lat1d_co.append(lat0 + (i - nGCs) * dlat + lat_min) - pcorners = alt_minRE / np.sin(np.pi/2 - np.deg2rad(lat1d_co)) **2 ## Determine if field lines should close. There are two conditions: @@ -276,6 +281,7 @@ def generate_sym_quadtree(nBlocks): # if we want r&theta now: # rs = qp_solve(qs, ps) # ts = rq2t(rs, qs) + # Otherwise the plotting function does it: fig = make_plot(qs, ps, alt_minRE, Re_KM, abs_bot=False) From ff16298288922b641afafb223e2d8e157a146a64 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 18 Mar 2025 12:24:19 -0400 Subject: [PATCH 434/691] STY: more comments, formatting --- edu/examples/Dipole/dipole.py | 44 +++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index fd6d8fee..71bd85f8 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -3,13 +3,14 @@ #### Set inputs #### -# To save plot, change last line of the code to save it, otherwise it is just 'show'n +# To save plot, change last line of the code, otherwise it is just shown # Number of lats/alts (without ghost cells) nLatsPerBlock_in = 12 nAltsPerBlock_in = 12 # in degrees, where to begin & end grid between (90,0) +# Grid is mirrored across N/S hemisphere max_blat = 85 min_blat = 12 @@ -17,7 +18,7 @@ min_alt = 80 max_alt = 800 -# Number of "blocks" to simulate - i.e. # of processors in Aether run (>4 & even) +# Number of "blocks" to simulate - i.e. # of processors in Aether run (must be >4 & even) nBlocks = 6 nGCs = 2 @@ -71,20 +72,20 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, lat1d[-2] = (lat1d[-1] + lat1d[-2]) /2 for i in range(nLatsPerBlock): - pcenters1d[i] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[i]))**2) + pcenters1d[i] = alt_minRE / (np.sin(cPI/2 - np.deg2rad(lat1d[i]))**2) # Easier to save later if we get this: - pcenters2d[i, :] = alt_minRE / (np.sin(np.pi/2 - np.deg2rad(lat1d[i]))**2) + pcenters2d[i, :] = alt_minRE / (np.sin(cPI/2 - np.deg2rad(lat1d[i]))**2) - # Corners (only used here to determins if we need to close >1 block per hemisphere) + # Corners (only used here to determine if we need to close > 1 block per hemisphere) for i in range(nLatsPerBlock+1): lat1d_co.append(lat0 + (i - nGCs) * dlat + lat_min) - pcorners = alt_minRE / np.sin(np.pi/2 - np.deg2rad(lat1d_co)) **2 + pcorners = alt_minRE / np.sin(cPI/2 - np.deg2rad(lat1d_co)) **2 ## Determine if field lines should close. There are two conditions: # - If the lowest l-shell in this block < altMin if np.min(pcorners) < alt_maxRE: close_this_block = True - # - Or if we are touching the qeuator + # - Or if we are touching the equator if origin < 0.01: # NH equator close_this_block + True if np.abs(extent + origin) < 0.01: # SH equator @@ -92,10 +93,11 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, ## Setting up the q-values... - # The idea here is that we wither want the field line to close (wrap over equator) + # The idea here is that we either want the field line to close (wrap over equator) # or to have its boundaries entirely within min/max alt. - # We do not want field lines ending before max_alt, and vice-versa - # Q_max is obtained from the minimum altitude point on the highest latitude field line + # We do not want field lines ending before max_alt, and vice-versa. + # By definition, q=0 at the equator and +/- infinity at the N/S poles, so: + # - Q_max is obtained from the minimum altitude point on the highest latitude field line q_max_center = rp2q(alt_minRE, pcenters1d[-1]) if close_this_block: q_min_center = 0 # if the block is closed, q_min = 0. This is the equator! @@ -109,7 +111,7 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, qs[:, iAlt] = ((q_min_center + (iAlt - nGCs + 0.5) * delQ)) # If we were in South hemisphere, multiply by -1 - # (and reverse so the points are in the same order as NH) + # (and reverse so the points are ascending in q, same order as NH) if isSouth: qs = -1*np.flip(qs) qcenters[n,:] = qs @@ -119,6 +121,14 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, #### Useful Functions for conversions: #### +#### - Not all used... +#### - Format: in2out, in as few letters as necessary +#### example: cart to geo "xy2rt": (x,y) --> (r, theta) + +## NOTE: theta for the dipole coordinate system is defined as co-latitude, not latitude +## Thus, we do (cPI-theta) for rt2(q/p). +## Then things are kept as-is, until conversion back to spherical when +## colatitude is again considered def rt2q(r, t): return np.cos(cPI/2 - t)/r**2 @@ -205,8 +215,7 @@ def make_plot(qs, ps, alt_min_RE, Re_km=6371, ax0.set_xlim(xlim) ax0.set_aspect(1) ax0.set_title('in Re:') - - + ax1 = fig.add_subplot(gs[:2,4:]) counts, _, _ = ax1.hist(rs.flatten(), bins=60) ax1.vlines(alt_min_RE, 0, max(counts)*1.1, linestyle = '--', alpha=.7, color='k') @@ -214,8 +223,7 @@ def make_plot(qs, ps, alt_min_RE, Re_km=6371, f"{np.sum(rs < 1) / np.prod(rs.shape)*100:.2f}% of points below 0 Re") ax1.set_xlabel('Each cell altitude in Re') ax1.set_ylabel('bin count') - - + ax1p2 = fig.add_subplot(gs[2,4:]) alt_min_KM = r2alt(alt_min_RE, Re_km) counts, bins, _ = ax1p2.hist(r2alt(rs, Re_km).flatten(), bins=200) @@ -226,9 +234,7 @@ def make_plot(qs, ps, alt_min_RE, Re_km=6371, another_hist_ax = fig.add_subplot(gs[3:5, 4:]) another_hist_ax.hist(np.rad2deg(ts.flatten()), bins=90) another_hist_ax.set_xlabel('Magnetic Latitude (deg)') - # another_hist_ax.set_xlabel( - ax2 = fig.add_subplot(gs[5:,:]) for x,y in zip(np.rad2deg(ts), r2alt(rs, Re_km)): if abs_bot: @@ -240,9 +246,7 @@ def make_plot(qs, ps, alt_min_RE, Re_km=6371, ax2.set_ylim(0,1500) ax2.set_xlabel('Magnetic Latitude (deg)') ax2.set_ylabel('Altitude (km)') - - - + plt.tight_layout() return fig From 3f8465fdb6399a7f30a3abf9fe5a95f80aba3df8 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 18 Mar 2025 20:06:09 -0400 Subject: [PATCH 435/691] FEAT: New dipole grid is in place. Kinda. Here's what I know: - it doesn't run - nan's in density and velocity, i think - maybe in chapman integrals? - k-coord is not right (should be alt above equator, traced along dipole -maybe) - altitude is always negative??? But the rest is good! LOL --- src/init_mag_grid.cpp | 699 ++++++++++++------------------------------ 1 file changed, 192 insertions(+), 507 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 1cb64f1a..8a4df97a 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -10,6 +10,7 @@ // or with approach from (Swisdak, 2006), who solved it analytically: // https://arxiv.org/pdf/physics/0606044 // +// Overloaded for single conversions & arma_cubes // ---------------------------------------------------------------------- std::pair qp_to_r_theta(precision_t q, @@ -31,7 +32,7 @@ std::pair qp_to_r_theta(precision_t q, // now that r is determined we can solve for theta // theta = asin(sqrt(r/p)); theta = acos(q * pow(r, 2.0)); - // Then make sure its the correct sign & direction + // Then make sure its the correct sign & direction (not colatitude) theta = cPI / 2 - theta; return {r, theta}; @@ -57,367 +58,6 @@ std::pair qp_to_r_theta(arma_cube q, arma_cube p) { return {r, theta}; } -// ---------------------------------------------------------------------- -// The general idea here is to make the physical cells within the -// upper and lower limits. The cell EDGES will be these limits, so -// that the cell CENTERS (which this function calculates) will be -// 1/2 dlat away from these locations. -// The two limits coming in are the lowest northern latitude field line -// and the highest northern latitude field line (i.e., they are both -// positive values and are over half the domain.) -// If the block is touching the equator boundaries or the polar -// boundaries, then these ghost cells extend beyond these boundaries and -// the EDGES go to [-88, -1, 1, or 88] degrees latitude, depending on -// the boundary. This function deals with CENTERS, though, so the -// centers are selected so the the edges will be correct when calculated -// down stream. -// If we are running on 1 processor only, then this is all thrown out -// the window and code puts the centers are the +/- upper_lim. It first -// builds the southern hemisphere with nLats/2 points, then mirrors them. -// ---------------------------------------------------------------------- - -arma_vec Grid::baselat_spacing(precision_t extent, - precision_t origin, - precision_t upper_lim, - precision_t lower_lim, - precision_t spacing_factor) { - std::string function = "Grid::baselat_spacing"; - static int iFunction = -1; - report.enter(function, iFunction); - - if (report.test_verbose(3)) - std::cout << "inputs : " << iProc << " " << extent << " " << origin << " " - << lower_lim * cRtoD << " " << lower_lim * cRtoD << "\n"; - - // intermediate latitude values - precision_t lat_low, lat_high, lat_low0, lat_high0; - // intermediate calculation values - precision_t dlat, bb, aa, ang0, angq, nLats_here, extent_here; - precision_t dlat0, dlatLower, dLatUpper; - - // Now we can allocate the return array, - arma_vec Lats(nLats); - - // Noting the special case of 1 root node & 1 processor... - bool DO_FLIPBACK = false; - - int64_t iStart, iEnd; - - if (extent > 0.5) { - // This is when running on 1 processor: - DO_FLIPBACK = true; - nLats_here = nLats / 2; - extent_here = 0.5; - iStart = 0; - iEnd = nLats_here; - } else { - // Span only physical cells with extent: - nLats_here = nLats - 2 * nGCs; - extent_here = extent; - // Want to fill in only physical cells, then do ghostcells later: - iStart = nGCs; - iEnd = nLats - nGCs; - } - - // get the upper & lower latitude bounds for our division of the quadree - if (origin < 0) { - // negative origin == Southern hemisphere: lat_high <=> lat_low - lat_low, lat_high = -upper_lim, -lower_lim; - lat_low0 = lat_low; - lat_low = -lower_lim + (upper_lim - lower_lim) * (origin / 0.5); - lat_high = lat_low + (upper_lim - lower_lim) * (extent_here / 0.5); - } else { - // Northern hemisphere: - lat_low, lat_high = lower_lim, upper_lim; - lat_low0 = lower_lim; - lat_low = lower_lim + (upper_lim - lower_lim) * (origin / 0.5); - lat_high = lat_low + (upper_lim - lower_lim) * (extent_here / 0.5); - } - - if (report.test_verbose(3)) - std::cout << "lat_low, lat_high : " - << lat_low*cRtoD << " " << lat_high*cRtoD << " " << lower_lim << " " << - upper_lim << "\n"; - - // normalized spacing in latitude - // NOTE: spacing factor != 1 will not work yet. but framework is here... - bb = (lat_high - lat_low) / (pow(lat_high, spacing_factor) - pow(lat_low, - spacing_factor)); - aa = lat_high - bb * pow(lat_high, spacing_factor); - dlat = (lat_high - lat_low) / (nLats_here); - // Save dlat so that we can use it in ghostcells if they are interior: - dlat0 = dlat; - - if (!HasYdim) { - // edge case for 1-D (or no latitudinal extent, really) - // In 1-D, the base latitudes will be 1/2 way between LatMax & minApex, - // dlat is adjustable if it doesn't suit your needs. - DO_FLIPBACK = false; - dlat = 1.0 * cDtoR; - nLats_here = nLats + 1; - } - - // Fill in physical cell centers: - for (int64_t j = iStart; j < iEnd; j++) { - ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; - angq = aa + bb * pow(ang0, spacing_factor); - Lats[j] = angq; - } - - if (DO_FLIPBACK) { - // In the flipback case (single processor, global sim), we want baselats - // to be strictly increasing, same as geo grid! - // remember : nLats_here = nLats / 2 - for (int64_t j = 0; j < nLats_here; j++) - // mirror south to north: - Lats[j + nLats_here] = -1 * Lats[nLats_here - j - 1]; - } else { - // Here we are filling ghostcells, first the lower GCs, then the upper GCs. - // If they are interior GCs, use the default dlat. If they are exterior GCs - // (i.e., poleward of max lat or equatorward of min lat), then adjust the dlat - // to force the last cell edges to be at [-89.9, -1, 1, 89.9] depending on cells. - // Do the lower ghostcells: - // If the GCs are interior, leave dlat alone. - dlat = dlat0; - - // South polar region: - if (fabs( fabs(lat_low) - fabs(upper_lim)) < 0.001) { - if (report.test_verbose(2)) - std::cout << "Near south pole!\n"; - - dlat = (89.9 * cDtoR + lat_low) / nGCs; - } - - // North equatorial region: - if (fabs( fabs(lat_low) - fabs(lower_lim)) < 0.001) { - if (report.test_verbose(2)) - std::cout << "Near northern equator!\n"; - - dlat = (lat_low - 1.0 * cDtoR) / nGCs; - } - - // The user may not want to go all the way to the pole or the equator. - // if we are very close to the pole or equator, then the calculated dlat - // will be small so we don't hit either. If we are far enough away from - // either, we can just leave dlat alone. - if (dlat > dlat0) - dlat = dlat0; - - // Fill in GCs: - for (int64_t j = 0; j < iStart; j++) { - ang0 = lat_low + (float(j - iStart) + 0.5) * dlat; - angq = aa + bb * pow(ang0, spacing_factor); - Lats[j] = angq; - } - - // Do the upper ghostcells: - // If the GCs are interior, leave dlat alone. - dlat = dlat0; - - // North polar region: - if (lat_high == upper_lim) { - if (report.test_verbose(2)) - std::cout << "Near north pole!\n"; - - dlat = (89.9 * cDtoR - lat_high) / nGCs; - } - - // South equatorial region: - if (fabs( fabs(lat_high) - fabs(lower_lim)) < 0.001) { - if (report.test_verbose(2)) - std::cout << "Near southern equator!\n"; - - dlat = -(1.0 * cDtoR + lat_high) / nGCs; - } - - // The user may not want to go all the way to the pole or the equator. - // if we are very close to the pole or equator, then the calculated dlat - // will be small so we don't hit either. If we are far enough away from - // either, we can just leave dlat alone. - if (dlat > dlat0) - dlat = dlat0; - - // Fill in the GCs: - for (int64_t j = iEnd; j < nLats; j++) { - ang0 = lat_high + (float(j - iEnd) + 0.5) * dlat; - angq = aa + bb * pow(ang0, spacing_factor); - Lats[j] = angq; - } - } - - if (report.test_verbose(3)) - std::cout << "Lats from baselat_spacing :\n" << Lats * cRtoD << "\n"; - - report.exit(function); - return Lats; -} - -// // Gravity vectors in the dipole basis -// void calc_dipole_gravity(Planets planet){ - -// // rhat = -(2*cos/(del)) qhat + (sin/(del)) phat - - -// } - - -// === SPACING ALONG FIELD LINE === // -// Coordinates along the field line to begin modeling -// - Created in dipole (p,q) coordinates, stored as magnetic coords -// - North & south hemisphere base-latitudes, shouldn't be *too* hard to support offset -// dipole and/or oblate Earth. -// isCorner is a bool, if false then the p's and q's are stored for later (p,q cell centers). -// Field line filling only needs to be redone for the "down" edges, left is the same p,q -// and then for "lower", we just shift the p,q after - -void Grid::fill_field_lines(arma_vec baseLatsLoc, - precision_t min_altRe, precision_t Gamma, - Planets planet, - bool isCorner = false) { - - std::string function = "Grid::fill_field_lines"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t q_Start, delqp; - - // allocate & calculate some things outside of the main loop - // - mostly just factors to make the code easier to read - precision_t qp0, fb0, ft, delq, qp2, fa, fb, term0, term1, term2, term3; - // exp_q_dist is the fraction of total q-distance to step for each pt along field line - arma_vec exp_q_dist(nAlts); - - // corners/edges have one more lat dimension... - int64_t nLatLoc = baseLatsLoc.n_elem; - - // temp holding of results from q,p -> r,theta conversion: - std:: pair r_theta; - report.print(3, " calculating lshells!"); - - // Find L-Shell for each baseLat - // using L=R/sin2(theta), where theta is from north pole - arma_vec Lshells(nLatLoc); - - for (int64_t iLat = 0; iLat < nLatLoc; iLat++) - Lshells(iLat) = (min_altRe) / pow(sin(cPI / 2 - baseLatsLoc(iLat)), 2.0); - - report.print(3, "lshells calculated!"); - - if (!isCorner) { - for (int64_t iLon = 0; iLon < nLons; iLon ++) { - for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) { - magP_scgc(iLon, iLat, iAlt) = Lshells(iLat); - j_center_scgc(iLon, iLat, iAlt) = Lshells(iLat); - } - } - } - } else { - for (int64_t iLon = 0; iLon < nLons; iLon ++) { - for (int64_t iLat = 0; iLat < nLatLoc; iLat ++) { - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) { - magP_Down(iLon, iLat, iAlt) = Lshells(iLat); - j_edge_scgc(iLon, iLat, iAlt) = Lshells(iLat); - j_corner_scgc(iLon, iLat, iAlt) = Lshells(iLat); - } - } - } - } - - report.print(3, "dipole p-values stored for later."); - - for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) - exp_q_dist(iAlt) = Gamma + (1 - Gamma) * exp(-pow(((iAlt - nAlts) / - (nAlts / 5.0)), 2.0)); - - report.print(3, "expQ"); - - // This is wrong (same lat everywhere), but get_radius doesnt support oblate earth yet. - precision_t planetRadius = planet.get_radius(0.0); - - // mag alts and lats: - arma_mat bAlts(nLatLoc, nAlts), bLats(nLatLoc, nAlts); - - if (report.test_verbose(3)) - std::cout << "Setting min alt (actually r in Re) : " - << min_altRe << " " - << planetRadius << " " - << (min_altRe - 1.0) * planetRadius / 1000.0 << "\n"; - - for (int iLat = 0; iLat < nLatLoc; iLat++) { - q_Start = -cos(cPI / 2 + baseLatsLoc(iLat)) / pow(min_altRe, 2.0); - - // calculate const stride in dipole coords, same as sami2/3 (huba & joyce 2000) - // Note this is not the: - // == >> sinh(gamma*qi)/sinh(gamma*q_S) << == - // but a different formula where the spacing is more easily controlled. - // Doesn't have any lat/lon dependence so won't work for offset dipoles - delqp = (-q_Start) / (nAlts + 1); - delqp = min_altRe * delqp; - - for (int iAlt = 0; iAlt < nAlts; iAlt++) { - qp0 = q_Start + iAlt * (delqp); - fb0 = (1 - exp_q_dist(iAlt)) / exp(-q_Start / delqp - 1); - ft = exp_q_dist(iAlt) - fb0 + fb0 * exp(-(qp0 - q_Start) / delqp); - delq = qp0 - q_Start; - - // Q value at this point: - qp2 = q_Start + ft * delq; - - if (isCorner) { - // save the q for the "down" case: - for (int64_t iLon = 0; iLon < nLons; iLon ++) { - magQ_Down(iLon, iLat, iAlt) = qp2; - - if (iLat < nLats) - k_edge_scgc(iLon, iLat, iAlt) = qp2; - - k_corner_scgc(iLon, iLat, iAlt) = qp2; - } - } else { - for (int64_t iLon = 0; iLon < nLons; iLon ++) { - magQ_scgc(iLon, iLat, iAlt) = qp2; - k_center_scgc(iLon, iLat, iAlt) = qp2; - } - - r_theta = qp_to_r_theta(qp2, Lshells(iLat)); - bAlts(iLat, iAlt) = r_theta.first; - bLats(iLat, iAlt) = r_theta.second; - } - } - } - - report.print(3, "QP-rtheta done!"); - - if (isCorner) { // we don't need the rest, yet - report.exit(function); - return; - } - - arma_vec rNorm1d(nAlts), lat1dAlong(nAlts); - - // rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); - - for (int64_t iLat = 0; iLat < nLatLoc; iLat++) { - for (int64_t iLon = 0; iLon < nLons; iLon++) { - // Not currently used. Dipole isn't offset. Leaving just in case. - // Lon = magPhi_scgc(iLon, iLat, 1); - - for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { - lat1dAlong(iAlt) = bLats(iLat, iAlt); - rNorm1d(iAlt) = bAlts(iLat, iAlt); - } - - // Lay things down in the same order as the geo grid. - //centers only - magAlt_scgc.tube(iLon, iLat) = rNorm1d * planetRadius; - magLat_scgc.tube(iLon, iLat) = lat1dAlong; - } - } - - report.exit(function); - return; -} //////////////////////////////////////////// // convert cell coordinates to geographic // @@ -455,96 +95,6 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, return llr; } -// Use magP and magQ to make alt edges: -// This does the heavy lifting for the edges & corners of the dipole grid. -// These will be 1/2 way btwn each q point, which is pretty close to evenly spaced. -// They will not, however, line up from one field line to the next. -// It's not going to be *too* hard to get the corners to line up, but it messes with the -// orthogonality too much for me to figure out right now. -void Grid::dipole_alt_edges(Planets planet, precision_t min_altRe) { - - std::string function = "Grid::dipole_alt_edges"; - static int iFunction = -1; - report.enter(function, iFunction); - - // P-coordinates will be the same along alt coord, we saved p-vals when we made them - // in the fill field line function. - precision_t pTmp; - - for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { - pTmp = magP_Down(iLon, iLat, 0); - - for (int64_t iAlt = 0; iAlt < nAlts; iAlt ++) - magP_Corner(iLon, iLat, iAlt) = pTmp; - } - } - - // Here are some shortcuts that exploit the symmetry. - // This is done by each coord so cases like offset dipoles or oblate planets are easier later - - // first, use the fact that p is the same along each field line (alt) - for (int64_t iLon = 0; iLon < nLons + 1; iLon++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) - magP_Corner(iLon, iLat, nAlts) = magP_Corner(iLon, iLat, nAlts - 1); - } - - // And final step, use the longitude symmetry. - // It's fine, until the dipole is offset. then the entire fill_field_lines needs to be redone. - for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) - magP_Corner(nLons, iLat, iAlt) = magP_Corner(nLons - 1, iLat, iAlt); - } - - // For q-coord we'll avg q_down (from different baseLat) above and below the point... - // May need to change the dipole spacing func's to get this working exactly though. - // With how the field line pts are currently put in, this ends up being quite a hassle. - // Not to mention, there would be a corner at q=0 (so r=A_LOT). - // Top and bottom-most corners take the same q-step as the previous cell. - precision_t qTmp; - - for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) { - for (int64_t iAlt = 1; iAlt < nAlts; iAlt ++) - magQ_Corner(iLon, iLat, iAlt) = (magQ_Down(iLon, iLat, - iAlt - 1) + magQ_Down(iLon, iLat, iAlt)) / 2; - - magQ_Corner(iLon, iLat, 0) = (2 * magQ_Corner(iLon, iLat, 1) - magQ_Corner(iLon, - iLat, 2)); - } - } - - // for last (alt) corner, take the same step as the prev corner to the highest center. - // this will force the highest corner to be above the last center - for (int64_t iLon = 0; iLon < nLons; iLon++) { - for (int64_t iLat = 0; iLat < nLats; iLat++) { - qTmp = 2 * magQ_Corner(iLon, iLat, nAlts - 1) - magQ_Corner(iLon, iLat, - nAlts - 2); - magQ_Corner(iLon, iLat, nAlts) = qTmp; - } - } - - // last lon corner, copy previous. It's the same! - for (int64_t iAlt = 0; iAlt < nAlts + 1; iAlt ++) { - for (int64_t iLat = 0; iLat < nLats + 1; iLat++) - magQ_Corner(nLons, iLat, iAlt) = magQ_Corner(nLons - 1, iLat, iAlt); - } - - // Now we have (p,q) coords corners, convert to lon/lat/alt and we r off to the races - std::pair rtheta; - precision_t planetRadius; - rtheta = qp_to_r_theta(magQ_Corner, magP_Corner); - magLat_Corner = rtheta.second; - - // Change if the dipole is offset and/or planet is oblate: - planetRadius = planet.get_radius(magLat_scgc.at(1)); - magAlt_Corner = rtheta.first * planetRadius; - - report.exit(function); - return; -} - - // ----------------------------------------------------------------------- // Convert XyzDipole to XyzGeo // @@ -618,15 +168,16 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { IsGeoGrid = false; IsMagGrid = true; IsCubeSphereGrid = false; + IsDipole = true; - report.print(0, "Creating inter-node connections Grid"); + // report.print(0, "Creating inter-node connections Grid"); //if (!Is0D & !Is1Dz) // create_sphere_connection(quadtree_ion); report.print(0, "Creating Dipole Grid"); - report.print(3, "Getting mgrid_inputs inputs in dipole grid"); + report.print(3, "Getting grid inputs for dipole grid"); Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); @@ -635,7 +186,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Get inputs: - precision_t max_lat = grid_input.lat_min; + precision_t min_lat = grid_input.lat_min; precision_t max_lat = grid_input.lat_max; precision_t min_alt = grid_input.alt_min * cKMtoM; @@ -647,6 +198,14 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; precision_t max_alt_re = (max_alt + planetRadius) / planetRadius; + magLat_scgc.zeros(); + magInvLat_scgc.zeros(); + magLon_scgc.zeros(); + magAlt_scgc.zeros(); + magLon_Corner.zeros(); + magLat_Corner.zeros(); + magAlt_Corner.zeros(); + if (nAlts % 2 != 0) { report.error("nAlts must be even!"); DidWork = false; @@ -655,8 +214,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Get some coordinates and sizes in normalized coordinates: arma_vec lower_left_norm = quadtree_ion.get_vect("LL"); // origin arma_vec size_right_norm = quadtree_ion.get_vect("SR"); // lon_lims - arma_vec size_up_norm = quadtree_ion.get_vect("SU"); //[1] = lat_lims - report.print(3, "Initializing (dipole) longitudes"); + arma_vec size_up_norm = quadtree_ion.get_vect("SU"); // lat_extent + report.print(3, "Got all settings. Initializing longitudes."); precision_t dlon = size_right_norm(0) * cPI / (nLons - 2 * nGCs); precision_t lon0 = lower_left_norm(0) * cPI; @@ -672,7 +231,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Dimension iterators int64_t iLon, iLat, iAlt; - // Longitudes (symmetric, for now): + ///////////////// + // Longitudes: // + ///////////////// + // - Make a 1d vector // - copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) { @@ -680,7 +242,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { lon1dLeft(iLon) = lon0 + (iLon - nGCs) * dlon; // corners } - lon1dLeft(nLons) = lon0 + (nLons - nGCs) * dlon; for (iLat = 0; iLat < nLats; iLat++) { @@ -691,78 +252,201 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // left edges magLon_Left.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_edge_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; - } - } - for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { - for (iLat = 0; iLat < nLats + 1; iLat++) { - // Corners magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } } + if (magLon_scgc.has_nan()) + report.error("NAN IN MAGLON"); + + // for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { + // for (iLat = 0; iLat < nLats + 1; iLat++) { + // // Corners + // magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + // i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + // } + // } + report.print(3, "Done initializing longitudes, moving to latitude"); //////////////// // Latitudes: // //////////////// - // min_lat calculated from min_apex - precision_t min_lat = acos(sqrt(1 / min_apex_re)); + // Invariant latitude is evenly spaced across each block. + // Latitude limits are adjusted here, not in quadtree + + // - From the quadtree, we see the origin & extent of this block + // - That is normalized, without any influence from settings + // - Scale it with the latitude limits provided by the user + // - Put invariant latitudes down, linearly, between this range. + + // This has to be done differently in the north & south hemisphere. + // So note if we are in the southern hemisphere and invert it afterwards. + + bool isSouth = false; + precision_t lat_origin = lower_left_norm(1); - // latitude of field line base: - // todo: needs support for variable stretching. it's like, halfway there. + if (lat_origin < -0.01) { // handles some imprecision + isSouth = true; + lat_origin = -1.0 * lat_origin - size_up_norm(1); + } - if (report.test_verbose(2)) - std::cout << "computing baselats : " << max_lat* cRtoD << " " << min_lat* cRtoD - << "\n"; + precision_t lat0 = 2.0 * (max_lat - min_lat) * lat_origin; + precision_t dlat = 2.0 * size_up_norm(1) * (max_lat - min_lat) / + (nLats - nGCs); - arma_vec baseLats = baselat_spacing(size_up_norm(1), lower_left_norm(1), - max_lat, min_lat, 1.0); + arma_vec lat1d(nLats); + arma_vec lat1dDown(nLats + 1); - if (report.test_verbose(2)) - std::cout << "baselats : " << baseLats * cRtoD << "\n"; + for (iLat = 0; iLat < nLats; iLat++) { + lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat + min_lat; // centers + lat1dDown(iLat) = lat0 + (iLat - nGCs) * dlat + min_lat; // corners + } - // downward sides (latitude shifted by 1/2 step): - // TODO: This only works for linear latitude spacing, which is all that's supported right now. - // When the exponential spacing (or something else) is fixed, this needs updating. - precision_t dlat; - dlat = baseLats(1) - baseLats(0); + lat1dDown(nLats) = lat0 + (nLats - nGCs) * dlat; // last corner - // put one cell halfway btwn each base latitude, leave 1st and last cell for now... - for (int64_t iLat = 1; iLat < nLats; iLat ++) - baseLats_down(iLat) = (baseLats(iLat - 1) + baseLats(iLat)) / 2.0; + // At the pole: + // - put last ghost cell's corner at 89.9 degrees latitude + // - put 2nd to last corner 1/2 way between 89.9 and the last real corner + // - evenly space the ghost cells between these. - // Put in 1st and last cell. Done this way so it's easier to put in supercell or something else - baseLats_down(0) = baseLats(0) * 1.5 - baseLats(1) * 0.5; - baseLats_down(nLats) = baseLats(nLats - 1) * 1.5 - baseLats(nLats - 2) * 0.5; + if (lat_origin + size_up_norm(1) > 0.49) { // touching the pole + lat1dDown(nLats) = 89.9 * 180.0 / cPI; + lat1dDown(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 2)) / 2.0; + lat1d(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 1)) / 2.0; + lat1d(nLats - 2) = (lat1dDown(nLats - 1) + lat1dDown(nLats - 2)) / 2.0; + // lat1d(-1) = (lat1dDown(-1) + lat1dDown(-2)) / 2.0; + } - if (report.test_verbose(2)) - std::cout << "baselats_down : " << baseLats_down * cRtoD << "\n"; + // l-shells of centers (nLats) + arma_vec Pcenters = min_alt_re / pow(sin(cPI / 2 - lat1d), 2); - report.print(3, "baselats done!"); + // l-shells of corners + arma_vec Pcorners = min_alt_re / pow(sin(cPI / 2 - lat1dDown), 2); - // latitude & altitude of points on field lines (2D) - // Cell centers - fill_field_lines(baseLats, min_alt_re, Gamma, planet); - // Corners (final bool argument) tells function to place stuff in the corner. - // This is only down for the "down" edges, where the base latitudes are different. - fill_field_lines(baseLats_down, min_alt_re, Gamma, planet, true); - // The baseLats are the Invariant Latitudes of the grid, so we can just fill in all of the - // points with these values - for (iAlt = 0; iAlt < nAlts; iAlt++) - for (iLat = 0; iLat < nLats; iLat++) - for (iLon = 0; iLon < nLons; iLon++) - magInvLat_scgc(iLon, iLat, iAlt) = baseLats(iLat); + if (isSouth){ // so the values are increasing: + lat1d = -1*reverse(lat1d); + } - report.print(4, "Field-aligned Edges"); - dipole_alt_edges(planet, min_alt_re); - report.print(3, - "Done generating symmetric latitude & altitude spacing in dipole."); + for (iLon = 0; iLon < nLons; iLon++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) { + magInvLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; + magP_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = Pcenters; + magP_Down.subcube(iLon, 0, iAlt, iLon, nLats, iAlt) = Pcorners; + } + } + + report.print(3, "Done initializing invariant latitudes"); + + //////////////// + // Altitudes: // + //////////////// + + // - Trace each field line from q_min to q_max. Identical for all field lines within this block. + // - Obtain the minimum "altitude" (q) from the highest latitude + // field line on each block + // - Obtain the maximum "altitude" from the lowest latitude *open* field line. + // (closed field lines are treated differently) + // - In other words, since we are tracing from q_min to q_max, use the highest field + // line to get q_min and the lowest for q_max. This forces all field lines to + // start & end within the bounds. + // - Evenly space all points' "altitude" linear across these two values + // - Altitude here refers to the dipole q-coordinate - cos(magLat)/r^2 + // - Blocks touching a pole or the equator are treated differently + + // Field lines close if: + // - touching the (magnetic) equator + // - minimum Lshell in this block is < max_alt (the q-value would be undefined) + + precision_t q_min = 0; // q=0 at equator (for closed blocks) + bool close_this_block = false; + + if ((Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt + || (abs(lat_origin) < 0.01)) // equator, with some imprecision + close_this_block = true; + + std::cout << "closing block?: " << close_this_block << "\n"; + + if (!close_this_block) + // invLats are still all in North Hemisphere & increasing. + // Use minimum p & alt to solve for q + // q = sqrt((1-r/p)/r^4) + // TODO: use nGCs or 0 to index Pcorners?? + q_min = pow(((1 - min_alt_re / Pcorners(nGCs)) / pow(min_alt_re, 4.0)), 0.5); + + // Trace each field line up to q_max, obtained from the lowest field line in the block + precision_t q_max = pow(((1 - max_alt_re / Pcorners(nLats)) / pow(max_alt_re, + 4.0)), 0.5); + + precision_t delQ = (q_max - q_min) / (nAlts - nGCs * 2.0); + + arma_vec magQ1d(nAlts); + arma_vec magQ_corner_1d(nAlts + 1); + + for (iAlt = 0; iAlt < nAlts; iAlt ++) { + magQ1d(iAlt) = q_min + (iAlt - nGCs + 0.5) * delQ; + magQ_corner_1d(iAlt) = q_min + (iAlt - nGCs) * delQ; + } + + magQ_corner_1d(nAlts) = q_min - nGCs * delQ; + + if (isSouth) { + magQ1d = -1.0 * reverse(magQ1d); + magQ_corner_1d = -1.0 * reverse(magQ_corner_1d); + } + + report.print(3, "Made q's"); + //////////////////////////// + // That is the grid made. // + //////////////////////////// + + + std::pair rtheta, rtheta_corner; + precision_t altitude; + arma_vec tmp(nLons), tmp2(nLons+1); + + // We can solve for (r, theta) for each point on the (q,p) grid. Do that & store: + for (iLat = 0; iLat < nLats; iLat ++) { + for (iAlt = 0; iAlt < nAlts; iAlt++) { + + // this is for cell centers: + rtheta = qp_to_r_theta(magQ1d(iAlt), Pcenters(iLat)); + tmp.zeros(); + tmp += rtheta.first; + magAlt_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; + k_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; + tmp.zeros(); + tmp += rtheta.second; + magLat_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; + j_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; + + // this is for cell corners: + rtheta_corner = qp_to_r_theta(magQ_corner_1d(iAlt), Pcorners(iLat)); + tmp2.zeros(); + tmp2 += rtheta_corner.first; + magAlt_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = tmp2; + tmp2.zeros(); + tmp2 += rtheta_corner.second; + magLat_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = tmp2; + } + } + if (magLat_scgc.has_nan()) + report.error("NAN IN MAGLAT"); + + if (magLat_Corner.has_nan() || magLat_Corner.has_inf()) + report.error("NAN IN MAGLAT_C"); + + if (magAlt_Corner.has_nan()) + report.error("NAN IN MAGALT_CORNER"); + + report.print(4,"got my mlats"); + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); @@ -797,7 +481,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { arma_cube bm = sqrt(br % br + bt % bt); // Latitudinal direction of radial: arma_cube s = sign(magLat_scgc); - // s.elem(find(s == 0)).ones(); + s.elem(find(s == 0)).ones(); rad_unit_vcgc[1] = bt / bm % s; rad_unit_vcgc[2] = -br / bm; @@ -824,7 +508,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // put back into altitude. we've been carrying around radius: - magAlt_scgc = magAlt_scgc - planetRadius; + // magAlt_scgc = magAlt_scgc - planetRadius; + // this breaks things more??? report.exit(function); return DidWork; From d64be6bd6755dd44fe852ca4914d98d5efa49521 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 18 Mar 2025 22:17:31 -0400 Subject: [PATCH 436/691] BUG: Quadtree was dividing dipole into (nonexistent) fourths. Everything died --- include/sphere.h | 31 +++++++++++++++++++++++++++++++ src/quadtree.cpp | 10 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/include/sphere.h b/include/sphere.h index 4f3902a0..32de5fdf 100644 --- a/include/sphere.h +++ b/include/sphere.h @@ -29,6 +29,37 @@ namespace Sphere { }; +/************************************************* + * \brief A namespace with all (4-root) sphere grid logic. + *************************************************/ +namespace Sphere4 { + + /// The normalized origins of each node (i.e. corner) + static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 0.0, -0.25, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 0.25, 0.0} + }; + + /// Normalized right steps in node + static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0} + }; + + /// Normalized up steps in node + static const arma_mat UPS = { + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0} + }; + + }; + /************************************************* * \brief A namespace with all (6-root) sphere grid logic. *************************************************/ diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 0e2aae65..ff5d45a2 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -22,6 +22,9 @@ Quadtree::Quadtree(std::string shape) { if (shape == "sphere") nRootNodes = 1; + if (shape == "sphere4") + nRootNodes = 4; + if (shape == "dipole4") nRootNodes = 4; @@ -63,6 +66,13 @@ void Quadtree::build(std::string gridtype) { IsSphere = true; } + if (grid_input.shape == "sphere4") { + origins = Sphere4::ORIGINS; + rights = Sphere4::RIGHTS; + ups = Sphere4::UPS; + IsSphere = true; + } + if (grid_input.shape == "dipole4") { origins = Dipole4::ORIGINS; rights = Dipole4::RIGHTS; From 553e6e6a136ec92e878db09f3626471cbe62146a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 19 Mar 2025 12:43:14 -0400 Subject: [PATCH 437/691] FEAT: Orthogonal dipole grid is working - clean up comments, debugging, etc. - fix issue with quadtree values being abs() --- src/init_mag_grid.cpp | 51 ++++++++++--------------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8a4df97a..1652f089 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -198,14 +198,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; precision_t max_alt_re = (max_alt + planetRadius) / planetRadius; - magLat_scgc.zeros(); - magInvLat_scgc.zeros(); - magLon_scgc.zeros(); - magAlt_scgc.zeros(); - magLon_Corner.zeros(); - magLat_Corner.zeros(); - magAlt_Corner.zeros(); - if (nAlts % 2 != 0) { report.error("nAlts must be even!"); DidWork = false; @@ -261,14 +253,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { if (magLon_scgc.has_nan()) report.error("NAN IN MAGLON"); - // for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { - // for (iLat = 0; iLat < nLats + 1; iLat++) { - // // Corners - // magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; - // i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; - // } - // } - report.print(3, "Done initializing longitudes, moving to latitude"); //////////////// @@ -313,24 +297,24 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // - put 2nd to last corner 1/2 way between 89.9 and the last real corner // - evenly space the ghost cells between these. - if (lat_origin + size_up_norm(1) > 0.49) { // touching the pole - lat1dDown(nLats) = 89.9 * 180.0 / cPI; + // Check if we're touching the pole, need to look at original quadtree values + if ((abs(lower_left_norm(1) + size_up_norm(1)) > 0.49) // north pole + || (lower_left_norm(1) < -0.49)) { // south pole + lat1dDown(nLats) = 89.9 * cDtoR; lat1dDown(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 2)) / 2.0; lat1d(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 1)) / 2.0; lat1d(nLats - 2) = (lat1dDown(nLats - 1) + lat1dDown(nLats - 2)) / 2.0; - // lat1d(-1) = (lat1dDown(-1) + lat1dDown(-2)) / 2.0; } - // l-shells of centers (nLats) + // l-shells of centers arma_vec Pcenters = min_alt_re / pow(sin(cPI / 2 - lat1d), 2); // l-shells of corners arma_vec Pcorners = min_alt_re / pow(sin(cPI / 2 - lat1dDown), 2); - if (isSouth){ // so the values are increasing: - lat1d = -1*reverse(lat1d); - } + if (isSouth) // so the values are increasing: + lat1d = -1 * reverse(lat1d); for (iLon = 0; iLon < nLons; iLon++) { @@ -367,11 +351,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { bool close_this_block = false; if ((Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt - || (abs(lat_origin) < 0.01)) // equator, with some imprecision + || (abs(lat_origin - size_up_norm(1)) < 0.01)) // equator, with some imprecision close_this_block = true; - std::cout << "closing block?: " << close_this_block << "\n"; - if (!close_this_block) // invLats are still all in North Hemisphere & increasing. // Use minimum p & alt to solve for q @@ -400,7 +382,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { magQ_corner_1d = -1.0 * reverse(magQ_corner_1d); } - report.print(3, "Made q's"); //////////////////////////// // That is the grid made. // //////////////////////////// @@ -408,7 +389,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { std::pair rtheta, rtheta_corner; precision_t altitude; - arma_vec tmp(nLons), tmp2(nLons+1); + arma_vec tmp(nLons), tmp2(nLons + 1); // We can solve for (r, theta) for each point on the (q,p) grid. Do that & store: for (iLat = 0; iLat < nLats; iLat ++) { @@ -436,17 +417,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { } } - if (magLat_scgc.has_nan()) - report.error("NAN IN MAGLAT"); - - if (magLat_Corner.has_nan() || magLat_Corner.has_inf()) - report.error("NAN IN MAGLAT_C"); - - if (magAlt_Corner.has_nan()) - report.error("NAN IN MAGALT_CORNER"); - - report.print(4,"got my mlats"); - + // magAlt is in units of planet radius + magAlt_scgc *= planetRadius; + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); From 4f453673a79c42ffed721b11a027dbb2a59fc172 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 19 Mar 2025 12:43:51 -0400 Subject: [PATCH 438/691] FEAT: Show which cubes are not all_finite in stdout --- src/tools.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools.cpp b/src/tools.cpp index dc2f621f..d041bf49 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -654,7 +654,7 @@ bool all_finite(arma_cube cube, std::string name) { "," + std::to_string(loc[1]) + "," + std::to_string(loc[2]) + ")"; int size = locations.size(); - std::cout << "all_finite : " << cube(loc[0], loc[1], loc[2]) << "\n"; + std::cout << "all_finite ("< Date: Wed, 19 Mar 2025 17:31:27 -0400 Subject: [PATCH 439/691] DOC: Start updating dipole writeup. Committing to see if github likes latex in md --- doc/internals/grid.md | 50 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index ad91f315..8f1b1d38 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -114,12 +114,50 @@ bottom of the field-line. Each fieldline starts at the lowest modeled altitude and curves towards the equator. In the northern hemisphere, this means that the fieldlines curve south, while in the southern hemisphere they curve north. -The latitudinal spacing is determined by the `LatStretch` factor in the settings. -The base latitudes are then scaled in such a way that **higher** `LatStretch` leads to -more points near the equator, 1.0 is roughly linear, and then values less than 1.0 will -distribute more points near the poles. The exact spacing is calculated where the -difference between successive values is proportional to: -`cos(lat_max)^(1/LatStretch)`. Using an even number of latitudes is required. +The dipole grid requires >4 root nodes which ensures the coordinates are +mutually orthogonal. The available shapes are `dipole4` and `dipole6`, for +compatibility with the neutral grid being a sphere or cubesphere. In both cases, +each node the entire longitude range and given a portion of the latitude range. +So in the case of `dipole4`, the four nodes are each given 1/4 of the available +latitudes and all of the longitudes. + +The dipole grid is evenly spaced in **invariant latitude** (where the field line +passes the minumum altitude) and **q** (the dipole coordinate +specifying how far along the field line a point lies). Q is dimensionless and defined +to be -infinity at the south pole, +infinity at the north pole, and 0 at the +magnetic equator. The equations for p (L-shell) and q are taken as the following, +where r is the distance from the origin and $\theta$ is *colatitude*: + +$$ +p = \frac{r}{\sin^2\theta} + +\newline +\newline + +q = \frac{\cos{\theta}}{r^2} +$$ + + + +these are the steps taken: + +1. Receive latitude range of this block from the quadtree. This will look +something like `lower_left_norm=(0.0, -0.5, 0.0)` and `size_up_norm=(0, 0.25, 0)` +for the node nearest the south pole in dipole4. From this, determine if we are +in the southern hemisphere. If we are, everything will be done as if it was the north +hemisphere and then reversed & negated at the end. +2. Store the latitude (j) component of `lower_left_norm` as `lat_origin`. If this +node is in the southern hemisphere, store the top of the node's extent as lat_origin. +3. Scale this node's portion of the quadtree to be limited by the user-provided +`lat_range`. These for the invariant latitudes, which are evenly spaced between +the latitude range provided and dictate where each field line passes through the minimum +altitude provided. +4. Determine if this node will have closed or open field lines. There are two conditions: + - If the node is touching the equator + - If the lowest L-shell is below the maximum altitude. This is rare, but prevents unexpected behavior. +5. If the field line closes, + + Along the `k` dimension, field lines terminate after a specified number of points. When using the Dipole grid option, there is not an option to set the maximum altitude. From 07c42c27face840cc0df251cb2a48f33fdb3822e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 19 Mar 2025 17:33:44 -0400 Subject: [PATCH 440/691] doc: testing github markdown again --- doc/internals/grid.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index 8f1b1d38..aab1b5cd 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -128,14 +128,9 @@ to be -infinity at the south pole, +infinity at the north pole, and 0 at the magnetic equator. The equations for p (L-shell) and q are taken as the following, where r is the distance from the origin and $\theta$ is *colatitude*: -$$ -p = \frac{r}{\sin^2\theta} +$p = \frac{r}{\sin^2\theta}$ -\newline -\newline - -q = \frac{\cos{\theta}}{r^2} -$$ +$q = \frac{\cos{\theta}}{r^2}$ From 79ec550b59e6294195ef2e14e34d019f22744340 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 19 Mar 2025 18:53:30 -0400 Subject: [PATCH 441/691] BUGS: Fix mismatch max/min & clear up bool logic in init_mag_grid q-limits --- src/init_mag_grid.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 1652f089..8e8cb260 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -347,22 +347,25 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // - touching the (magnetic) equator // - minimum Lshell in this block is < max_alt (the q-value would be undefined) - precision_t q_min = 0; // q=0 at equator (for closed blocks) + precision_t q_min; bool close_this_block = false; - if ((Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt - || (abs(lat_origin - size_up_norm(1)) < 0.01)) // equator, with some imprecision + if (Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt + close_this_block = true; + + if(lat_origin < 0.01) // equator, with some imprecision close_this_block = true; - if (!close_this_block) + if (close_this_block) + q_min = 0; // q=0 at equator (for closed blocks) + else // invLats are still all in North Hemisphere & increasing. // Use minimum p & alt to solve for q // q = sqrt((1-r/p)/r^4) - // TODO: use nGCs or 0 to index Pcorners?? - q_min = pow(((1 - min_alt_re / Pcorners(nGCs)) / pow(min_alt_re, 4.0)), 0.5); + q_min = pow(((1 - max_alt_re / Pcorners(nGCs)) / pow(max_alt_re, 4.0)), 0.5); // Trace each field line up to q_max, obtained from the lowest field line in the block - precision_t q_max = pow(((1 - max_alt_re / Pcorners(nLats)) / pow(max_alt_re, + precision_t q_max = pow(((1 - min_alt_re / Pcorners(nLats)) / pow(min_alt_re, 4.0)), 0.5); precision_t delQ = (q_max - q_min) / (nAlts - nGCs * 2.0); From dd9d4e199ea8878d7f4ad92d5eeddfcf7f3f0f5f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 19 Mar 2025 18:58:51 -0400 Subject: [PATCH 442/691] DOC: explain how the dipole grid is made. --- doc/internals/grid.md | 79 ++++++++++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 28 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index aab1b5cd..00a8dca6 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -18,19 +18,21 @@ again, 16 processors are needed, etc. However, in the altitude/radial direction, the number of points that are specified in the aether.json is unchanged, as it does not rely on the number of processors used. -- [Grid Types Explained](#grid-types-explained) -- [Grid Shapes Explained](#grid-shapes-explained) - - [TL;DR](#tldr) - - [The Sphere Grid](#the-sphere-grid) - - [The Cubesphere Grid](#the-cubesphere-grid) - - [The Dipole Grid](#the-dipole-grid) - - [Root Nodes](#root-nodes) - - [Sphere](#sphere) - - [Cubesphere](#cubesphere) - - [Specifying Root Nodes](#specifying-root-nodes) -- [Specifying the Grid](#specifying-the-grid) - - [Horizontal Resolution](#horizontal-resolution) - - [Vertical Resolution](#vertical-resolution) +- [Grids in Aether](#grids-in-aether) + - [Grid Types Explained](#grid-types-explained) + - [Grid Shapes Explained](#grid-shapes-explained) + - [TL;DR](#tldr) + - [The Sphere Grid](#the-sphere-grid) + - [The Cubesphere Grid](#the-cubesphere-grid) + - [The Dipole Grid](#the-dipole-grid) + - [Inputs:](#inputs) + - [Root Nodes](#root-nodes) + - [Sphere](#sphere) + - [Cubesphere](#cubesphere) + - [Specifying Root Nodes](#specifying-root-nodes) + - [Specifying the Grid](#specifying-the-grid) + - [Horizontal Resolution](#horizontal-resolution) + - [Vertical Resolution](#vertical-resolution) ## Grid Types Explained @@ -110,7 +112,9 @@ scale-height. The dipole grid is aligned with the magnetic field. The `k` dimension is along the fieldline, `i` is magnetic longitude, and `j` is roughly latitude for the -bottom of the field-line. Each fieldline starts at the lowest modeled altitude +bottom of the field-line. + +Each fieldline starts at the lowest modeled altitude and curves towards the equator. In the northern hemisphere, this means that the fieldlines curve south, while in the southern hemisphere they curve north. @@ -133,8 +137,7 @@ $p = \frac{r}{\sin^2\theta}$ $q = \frac{\cos{\theta}}{r^2}$ - -these are the steps taken: +Here is how the dipole grid is generated: 1. Receive latitude range of this block from the quadtree. This will look something like `lower_left_norm=(0.0, -0.5, 0.0)` and `size_up_norm=(0, 0.25, 0)` @@ -147,24 +150,44 @@ node is in the southern hemisphere, store the top of the node's extent as lat_or `lat_range`. These for the invariant latitudes, which are evenly spaced between the latitude range provided and dictate where each field line passes through the minimum altitude provided. + - At the poles, put the last corner at $89.9^\circ$ magnetic latitude. Add +another corner 1/2 way between this point and the last "real" corner, and put +cell centers between these corners. 4. Determine if this node will have closed or open field lines. There are two conditions: - If the node is touching the equator - If the lowest L-shell is below the maximum altitude. This is rare, but prevents unexpected behavior. -5. If the field line closes, +5. Determine the limits & values of the q-coordinate for all points along all field +lines on this node. The q-values on each node are identical, and the p-value is +constant along each field line (by definition). To solve for q, use the p-values +from step 3 and the altitude, as described below. Use $q=\sqrt{(1-r/p)/r^4}$. + - If the field line closes, $q_{min}=0$. There will be a corner/edge at the +magnetic equator and two ghost cell centers across the equator for message passing. + - If the field line does not close, $q_{min}$ is calculated from the highest +altitude point on the lowest latitude field line. This is the point farthest +from the planet on the most equatorward field line (and since q=0 at the +equator, it has the lowest allowed q-value). + - The maximum q-value is solved for identically in open & closed blocks with +the lower altitude limit and the highest latitude field line. The point closest +to the planet on the highest latitude field line has the highest allowed q-value +(q=$\pm$infinity at the poles). +6. We now have p (step 3) and q (step 5) for all points on the grid. From this +we solve for `(r, \theta)`, and any other coordinates we need. + +See [the dipole script in edu/examples](../../edu/examples/Dipole/dipole.py) to +experiment with the available options. +#### Inputs: +- ***Shape***: either `dipole4` or `dipole6`. Cannot (yet) be run on a single core. +- ***nLonsPerBlock***: number of magnetic longitudes +- ***nLatsPerBlock***: number of field lines (invariant latitudes) +- ***nAlts***: Number of points along each field line. A number of these will +be discarded for being at too low of altitude. +- ***AltRange***: [`min_alt`, `max_alt`] - the altitude (in km) range to bound +cells by. +- ***LatRange***: [`min_lat`, `max_lat`] - the limits on invariant latitudes +(in degrees). Sets the limits on the latitudes where field lines cross `min_alt`. -Along the `k` dimension, field lines terminate after a specified number of points. -When using the Dipole grid option, there is not an option to set the maximum altitude. -Rather, points are laid down from the pole towards the equator, stopping when the field -line reaches the equator. Ghost cells are then used to pass information across the -equator. The spacing of points along each field line is the same as -[(Huba, Joyce & Fedder, 2000)](https://doi.org/10.1029/2000JA000035). -Using an even number of points along the `k` dimension (`nAlts`) means that no points -will lie on the magnetic equator and thus the field lines from the high latitude -regions will not reach beyond the plasmasphere. See -[the dipole script in edu/examples](../../edu/examples/Dipole/dipole.py) to -experiment with the available options. ### Root Nodes From c00e905335bf1731cb8685b85c217bf6df38af38 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 09:59:57 -0400 Subject: [PATCH 443/691] sty/doc: Change grid.md formatting to make it prettier? --- doc/internals/grid.md | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index 00a8dca6..9a530d58 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -128,14 +128,19 @@ latitudes and all of the longitudes. The dipole grid is evenly spaced in **invariant latitude** (where the field line passes the minumum altitude) and **q** (the dipole coordinate specifying how far along the field line a point lies). Q is dimensionless and defined -to be -infinity at the south pole, +infinity at the north pole, and 0 at the -magnetic equator. The equations for p (L-shell) and q are taken as the following, +to be $-\infty$ at the south pole, $+\infty$ at the north pole, and 0 at the +magnetic equator. The equations for p (L-shell) and q are the following, where r is the distance from the origin and $\theta$ is *colatitude*: -$p = \frac{r}{\sin^2\theta}$ +```math +p = \frac{r}{\sin^2\theta} -$q = \frac{\cos{\theta}}{r^2}$ +``` + +```math +q = \frac{\cos{\theta}}{r^2} +``` Here is how the dipole grid is generated: @@ -159,7 +164,7 @@ cell centers between these corners. 5. Determine the limits & values of the q-coordinate for all points along all field lines on this node. The q-values on each node are identical, and the p-value is constant along each field line (by definition). To solve for q, use the p-values -from step 3 and the altitude, as described below. Use $q=\sqrt{(1-r/p)/r^4}$. +from step 3 and the altitude, as described below. Use $q=\sqrt{(1-\frac{r}{p})/r^4}$. - If the field line closes, $q_{min}=0$. There will be a corner/edge at the magnetic equator and two ghost cell centers across the equator for message passing. - If the field line does not close, $q_{min}$ is calculated from the highest @@ -170,28 +175,28 @@ equator, it has the lowest allowed q-value). the lower altitude limit and the highest latitude field line. The point closest to the planet on the highest latitude field line has the highest allowed q-value (q=$\pm$infinity at the poles). -6. We now have p (step 3) and q (step 5) for all points on the grid. From this -we solve for `(r, \theta)`, and any other coordinates we need. +6. We now have `p` (step 3) and `q` (step 5) for all points on the grid. From this +we solve for $(r, \theta)$, and any other coordinates we need. See [the dipole script in edu/examples](../../edu/examples/Dipole/dipole.py) to experiment with the available options. #### Inputs: -- ***Shape***: either `dipole4` or `dipole6`. Cannot (yet) be run on a single core. +- ***Shape***: either `dipole4` or `dipole6`. Cannot be run on a single core. - ***nLonsPerBlock***: number of magnetic longitudes - ***nLatsPerBlock***: number of field lines (invariant latitudes) - ***nAlts***: Number of points along each field line. A number of these will be discarded for being at too low of altitude. -- ***AltRange***: [`min_alt`, `max_alt`] - the altitude (in km) range to bound +- ***AltRange***: (`min_alt`, `max_alt`) - the altitude (in km) range to bound cells by. -- ***LatRange***: [`min_lat`, `max_lat`] - the limits on invariant latitudes +- ***LatRange***: (`min_lat`, `max_lat`) - the limits on invariant latitudes (in degrees). Sets the limits on the latitudes where field lines cross `min_alt`. ### Root Nodes ->This document uses the words "block" and "node" somewhat +> This document uses the words "block" and "node" somewhat interchangably. Technically, a "block" is single (`i, j, k`) grid, while a "node" can be multiple "blocks" that make up a section of the globe. From bc0a2763d4960b9fdc7d477dd03ba8100612d9be Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 10:08:49 -0400 Subject: [PATCH 444/691] sty: Does github let me number equations? --- doc/internals/grid.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index 9a530d58..9fba4e49 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -134,12 +134,12 @@ where r is the distance from the origin and $\theta$ is *colatitude*: ```math p = \frac{r}{\sin^2\theta} - +\tag{1} ``` ```math q = \frac{\cos{\theta}}{r^2} - +\tag{2} ``` Here is how the dipole grid is generated: @@ -155,16 +155,17 @@ node is in the southern hemisphere, store the top of the node's extent as lat_or `lat_range`. These for the invariant latitudes, which are evenly spaced between the latitude range provided and dictate where each field line passes through the minimum altitude provided. - - At the poles, put the last corner at $89.9^\circ$ magnetic latitude. Add + - At the poles, put the last corner at $89.9^\circ$ magnetic latitude, or +$0.1^\circ$ and $179.9^\circ$ magnetic ***co***latitude. Add another corner 1/2 way between this point and the last "real" corner, and put cell centers between these corners. 4. Determine if this node will have closed or open field lines. There are two conditions: - If the node is touching the equator - If the lowest L-shell is below the maximum altitude. This is rare, but prevents unexpected behavior. -5. Determine the limits & values of the q-coordinate for all points along all field +5. Determine the limits, then values, of the q-coordinate for all points along each field lines on this node. The q-values on each node are identical, and the p-value is constant along each field line (by definition). To solve for q, use the p-values -from step 3 and the altitude, as described below. Use $q=\sqrt{(1-\frac{r}{p})/r^4}$. +from step 3 and the altitude, as described below and Equation 3. - If the field line closes, $q_{min}=0$. There will be a corner/edge at the magnetic equator and two ghost cell centers across the equator for message passing. - If the field line does not close, $q_{min}$ is calculated from the highest From 0d1d3518ee8f8794ccedb920541e68b2d9024ba0 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 10:15:36 -0400 Subject: [PATCH 445/691] STY: it does not. revert previous commit, fix eq format, change some wording. done w this file for now --- doc/internals/grid.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index 9fba4e49..92da6fdb 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -134,12 +134,10 @@ where r is the distance from the origin and $\theta$ is *colatitude*: ```math p = \frac{r}{\sin^2\theta} -\tag{1} ``` ```math q = \frac{\cos{\theta}}{r^2} -\tag{2} ``` Here is how the dipole grid is generated: @@ -165,7 +163,7 @@ cell centers between these corners. 5. Determine the limits, then values, of the q-coordinate for all points along each field lines on this node. The q-values on each node are identical, and the p-value is constant along each field line (by definition). To solve for q, use the p-values -from step 3 and the altitude, as described below and Equation 3. +from step 3 and the altitude, as described below and $q=\sqrt{(1-r/p)/r^4}$. - If the field line closes, $q_{min}=0$. There will be a corner/edge at the magnetic equator and two ghost cell centers across the equator for message passing. - If the field line does not close, $q_{min}$ is calculated from the highest @@ -179,8 +177,8 @@ to the planet on the highest latitude field line has the highest allowed q-value 6. We now have `p` (step 3) and `q` (step 5) for all points on the grid. From this we solve for $(r, \theta)$, and any other coordinates we need. -See [the dipole script in edu/examples](../../edu/examples/Dipole/dipole.py) to -experiment with the available options. +See [edu/examples/Dipole](../../edu/examples/Dipole) for more detailed information +and to experiment with the available options in a Python script. #### Inputs: From 5b405a8fdc4b81fdae25c972ca6910a6631029a1 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 11:15:27 -0400 Subject: [PATCH 446/691] DOC: Decide what the dipole (i,j,k) coords are! Need to finish implementing --- doc/internals/coordinates.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md index 418e0412..515857b2 100644 --- a/doc/internals/coordinates.md +++ b/doc/internals/coordinates.md @@ -20,15 +20,16 @@ ## Dipole Coordinates - Longitude (radians) - radians east of the meridian that contains the north magnetic pole and north rotation axis -- P (?) - Identifies the field line, related to L-shell -- Q (meters?) - The distance along the field line from some reference point, related to magnetic latitude. +- P (meters) - Identifies the field line. This is the same as L-shell and is constant along wach field line. +- Q (dimensionless) - parameterizes the distance along the field line, related to magnetic latitude & radius. This varies along the field line, but the values are idential for all field lines within each node. q=0 at the equator, and approaches positive (negative) infinity as theta points towards the north (south) pole. ## More Dipole Coordinates - L-shell (Planetary Radii) - The distance from the planet's center at which the magnetic field encounters the dipole's equatorial plane -- Magnetic Latitude (radians) - angle between the dipole's equatorial plane and the point. -- Invariant Latitude (degrees) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet. This is constant along the field-line and is related to the L-Shell. +- Magnetic Latitude (radians) - angle between the dipole's equatorial plane and a point. +- Invariant Latitude (radians) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet ([specified in the inputs](../internals/grid.md#inputs)). This is constant along the field-line and is related to the L-Shell. - Magnetic Local Time (hours) - Angle between the sun, the north magnetic pole, and the point. Explicitly, this is done in PSE XY coordinates, ignoring the Z coorinate. +> The dipole `(i,j,k)` coordinates are (magnetic longitude, magnetic latitude, radius). # Coordinates in Aether @@ -46,12 +47,15 @@ Because Aether considers gravity to be a function of radius and explicitly inclu ## i, j, k Coordinates -As described in the grid.md file, Aether uses a logical '(i, j, k)' 3D grid structure. Therefore, we refer to the 'primary' coordinates as the ijk coordinate system. What this means is that the i-coordinate is in the i-direction, the j-coordinate is in the j-direction, and the k-coordinate is in the k-direction. +As described in the grid.md file, Aether uses a logical `(i, j, k)` 3D grid structure. Therefore, we refer to the 'primary' coordinates as the ijk coordinate system. What this means is that the i-coordinate is in the i-direction, the j-coordinate is in the j-direction, and the k-coordinate is in the k-direction. For the (perfectly) spherical grid, the i-coordinate is longitude, the j-coordinate is latitude, and the k-coordinate is radius. For the Cubedsphere grid, the i-coordinate is RIGHT, the j-coodinate is UP, and the k-coordinate is radius. Each face of the cubedsphere has the same coordinate system, but only with reference to that face. This means that if each face is looked at independently, the lower left corner is at (about) i = -45, j = -45 deg, while the upper right corner is at i = +45, j = +45 deg. Radius is treated the same as in a spherical grid. +For the dipole coordinate system, the i-coordinate is magnetic longitude, the j-coordinate is magnetic latitude, and the k-coordinate is radius. The dipole is orthogonal to a dipolar magnetic field. + + Should the official coordinates be in the native coordinates (which could be different for each system), or should the coordinates be in meters, such that when gradients are taken, they are in /m? Maybe we could have: @@ -69,6 +73,6 @@ Locations: All locations should be described in the following coordinates: - i, j, k - lon, lat, radius (+alt) -- magnetic lon, invariant lat? +- magnetic lon, invariant lat (only the dipole magnetic grid then has magnetic latitude) From 42701eefc85893c79cef906b67d0ad8e0053f4d9 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 11:22:57 -0400 Subject: [PATCH 447/691] MAINT: Clean up unused/outdated bits. clear up comments around magnetic coordinates --- include/bfield.h | 4 ---- include/grid.h | 19 ++++--------------- include/init_mag_grid.h | 7 ------- src/dipole.cpp | 24 ------------------------ src/init_mag_grid.cpp | 21 --------------------- 5 files changed, 4 insertions(+), 71 deletions(-) diff --git a/include/bfield.h b/include/bfield.h index 91a09ff3..df64fac8 100644 --- a/include/bfield.h +++ b/include/bfield.h @@ -10,10 +10,6 @@ struct bfield_info_type { precision_t lat; }; -precision_t get_lshell(precision_t lat, precision_t rNorm); -arma_vec get_lat_from_r_and_lshell(arma_vec r, precision_t lshell); -precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell); - arma_vec get_magnetic_pole(int IsNorth, Planets planet); diff --git a/include/grid.h b/include/grid.h index 874dcb94..3e32b600 100644 --- a/include/grid.h +++ b/include/grid.h @@ -66,16 +66,16 @@ class Grid arma_cube g11_upper_Down, g12_upper_Down, g21_upper_Down, g22_upper_Down; arma_cube sqrt_g_Down; - // These define the magnetic grid: - // Armidillo Cube Versions: - arma_cube magLon_scgc, magX_scgc; + // These define the magnetic grid (only defined for a dipole grid): // The magnetic latitude is the angle between the magnetic equator and the point. arma_cube magLat_scgc, magY_scgc; - // This is often just the altitude.... + // This is the same as radius. arma_cube magAlt_scgc, magZ_scgc; + // These exist for all grid types: // Invariant latitude is the magnetic latitude that the field line hits at the lowest altitude. // This is basically the L-shell, but models want it expressed as latitude and not L-shell. arma_cube magInvLat_scgc; + arma_cube magLon_scgc, magX_scgc; // This is the angle from the sun, to the magnetic pole to the point. arma_cube magLocalTime_scgc; @@ -98,17 +98,6 @@ class Grid arma_cube magAlt_Down; arma_cube magAlt_Below; arma_cube magAlt_Corner; - - //For easier interpolation: - arma_vec baseLats_down; - - // these need to be stored in (p,q) coords for a bit, its messy: - arma_cube magP_Down; - arma_cube magP_Below; - arma_cube magQ_Down; - arma_cube magQ_Below; - arma_cube magP_Corner; - arma_cube magQ_Corner; // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h index a9493aaa..b1af1f4c 100644 --- a/include/init_mag_grid.h +++ b/include/init_mag_grid.h @@ -17,13 +17,6 @@ bool init_dipole_grid(Grid &mGrid, Planets planet); // return (r,theta) std::pair qp_to_r_theta(precision_t q, precision_t p); -// Take limits & specs of field line, fill it with points. -// std:: tuple Grid::fill_field_lines (arma_vec lShells, -// int64_t nAlts, -// int64_t nLats, -// precision_t Gamma); - - // convert mag to geographic std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, diff --git a/src/dipole.cpp b/src/dipole.cpp index d97c66f3..2887e547 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -6,30 +6,6 @@ #include "aether.h" -// ----------------------------------------------------------------------------- -// get the l-shell given latitude (in radians) and normalized radius -// ----------------------------------------------------------------------------- - -precision_t get_lshell(precision_t lat, precision_t rNorm) { - precision_t cosLat = cos(lat); - precision_t lshell = rNorm / (cosLat * cosLat); - return lshell; -} - -precision_t get_lat_from_r_and_lshell(precision_t r, precision_t lshell) { - precision_t cosLat = sqrt(r / lshell); - - if (cosLat < -1.0) - cosLat = -1.0; - - if (cosLat > 1.0) - cosLat = 1.0; - - precision_t lat = acos(cosLat); - return lat; -} - - // ----------------------------------------------------------------------------- // Calculate a tilted offset dipole field given the planetary diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8e8cb260..977b0b27 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -38,27 +38,6 @@ std::pair qp_to_r_theta(precision_t q, return {r, theta}; } -std::pair qp_to_r_theta(arma_cube q, arma_cube p) { - // return quanties - arma_cube r, theta; - // Intermediate quantities: - arma_cube term0, term1, term2, term3; - - term0 = 256.0 / 27.0 * (q % q) % (p % p % p % p); - term1 = pow((1.0 + sqrt(1.0 + term0)), 2.0 / 3.0); - term2 = pow(term0, 1.0 / 3.0); - term3 = 0.5 * pow(((term1 % term1 + term1 % term2 + term2 % term2) / term1), - 3.0 / 2.0); - - r = p % (4.0 * term3) / ((1.0 + term3) % (1.0 + sqrt(2.0 * term3 - 1.0))); - - // now that r is determined we can solve for theta - theta = asin(q % (r % r)); - - return {r, theta}; -} - - //////////////////////////////////////////// // convert cell coordinates to geographic // //////////////////////////////////////////// From 66e5763f5e3428648869d412539b42adf271f084 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 11:23:50 -0400 Subject: [PATCH 448/691] Do not re-define magnetic coords for dipole grid in fill_grid - The dipole bfield still needs work... --- src/fill_grid.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 5dd2f98e..330a6992 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -170,15 +170,14 @@ void Grid::fill_grid_bfield(Planets planet) { bfield_info = get_bfield(lon, lat, alt, DoDebug, planet); - // This is Invariant Latitude - // (regular magnetic latitude is not defined yet for the geo grid) - // - magLat is not used by the geo grid, so not defined - magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; - - // init_mag grid already initialized magLon - if (iGridShape_ != iDipole_) + // Magnetic coordinates: + // init_mag grid already initializes magLon & magInvLat + // #TODO: make sure the bfield is correct for the dipole + // - maybe Dot product the B_vec with (ijk)_vec? + if (iGridShape_ != iDipole_){ + magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; - + } bfield_mag_scgc(iLon, iLat, iAlt) = 0.0; for (iDim = 0; iDim < 3; iDim++) { From 9251259ad923c6f571e28c13e08c3b1bf2898fad Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 19:03:18 -0400 Subject: [PATCH 449/691] BUG: Rewrite init_mag_grid again. Fix order of points, add in (i,j,k), corners, edges, etc. - All appears OK except some of the corners. IDK why. Need to commit this and move on. Will revisit & document --- src/init_mag_grid.cpp | 181 +++++++++++++++++++++++++++++++----------- 1 file changed, 133 insertions(+), 48 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 977b0b27..6a6fb987 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -10,7 +10,6 @@ // or with approach from (Swisdak, 2006), who solved it analytically: // https://arxiv.org/pdf/physics/0606044 // -// Overloaded for single conversions & arma_cubes // ---------------------------------------------------------------------- std::pair qp_to_r_theta(precision_t q, @@ -223,7 +222,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // left edges magLon_Left.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_edge_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; - + // corners magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } @@ -266,7 +265,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iLat = 0; iLat < nLats; iLat++) { lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat + min_lat; // centers - lat1dDown(iLat) = lat0 + (iLat - nGCs) * dlat + min_lat; // corners + lat1dDown(iLat) = lat0 + (iLat - nGCs) * dlat + min_lat; // corners & edges } lat1dDown(nLats) = lat0 + (nLats - nGCs) * dlat; // last corner @@ -291,19 +290,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // l-shells of corners arma_vec Pcorners = min_alt_re / pow(sin(cPI / 2 - lat1dDown), 2); - - if (isSouth) // so the values are increasing: - lat1d = -1 * reverse(lat1d); - - - for (iLon = 0; iLon < nLons; iLon++) { - for (iAlt = 0; iAlt < nAlts; iAlt++) { - magInvLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; - magP_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = Pcenters; - magP_Down.subcube(iLon, 0, iAlt, iLon, nLats, iAlt) = Pcorners; - } - } - report.print(3, "Done initializing invariant latitudes"); //////////////// @@ -331,8 +317,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { if (Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt close_this_block = true; - - if(lat_origin < 0.01) // equator, with some imprecision + + if (lat_origin < 0.01) // equator, with some imprecision close_this_block = true; if (close_this_block) @@ -341,12 +327,14 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // invLats are still all in North Hemisphere & increasing. // Use minimum p & alt to solve for q // q = sqrt((1-r/p)/r^4) - q_min = pow(((1 - max_alt_re / Pcorners(nGCs)) / pow(max_alt_re, 4.0)), 0.5); + q_min = pow(((1 - max_alt_re / Pcenters(nGCs)) / pow(max_alt_re, 4.0)), 0.5); // Trace each field line up to q_max, obtained from the lowest field line in the block - precision_t q_max = pow(((1 - min_alt_re / Pcorners(nLats)) / pow(min_alt_re, + precision_t q_max = pow(((1 - min_alt_re / Pcenters(nLats-nGCs)) / pow(min_alt_re, 4.0)), 0.5); + // Counter-intuitive, but the maximum value of q is actually where we start + // (lowest altitude), since q=0 at equator. precision_t delQ = (q_max - q_min) / (nAlts - nGCs * 2.0); arma_vec magQ1d(nAlts); @@ -359,48 +347,145 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { magQ_corner_1d(nAlts) = q_min - nGCs * delQ; - if (isSouth) { - magQ1d = -1.0 * reverse(magQ1d); - magQ_corner_1d = -1.0 * reverse(magQ_corner_1d); - } + report.print(3, + "Done generating points for magnetic grid. Plugging everything in"); //////////////////////////// // That is the grid made. // //////////////////////////// + // Now to store everything.... + // It's all done at the end to make things more simple earlier, but that makes this part messier. - - std::pair rtheta, rtheta_corner; - precision_t altitude; - arma_vec tmp(nLons), tmp2(nLons + 1); + // temp holding names: + std::pair rtheta, rtheta_edge; + precision_t radius, radius_edge, theta, theta_edge, invLat, invLat_edge, + pcenter, pedge, qcenter, qedge; + // we need to turn single floats into vectors/cubes: // We can solve for (r, theta) for each point on the (q,p) grid. Do that & store: + // Currently the grid is symmetric in longitude. + // Interte through centers & edges first, then do corners afterwards for (iLat = 0; iLat < nLats; iLat ++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { + // We have to reverse & negate things; want latitudes from south->north + // and altitude low->high. Altitude is in the correct direction, so change how we + // access values in the latitude dimension. + + if (isSouth) { + qcenter = magQ1d(iAlt); + pcenter = Pcenters(nLats - iLat - 1); + + qedge = magQ_corner_1d(iAlt); + pedge = Pcorners(nLats - iLat - 1); + + invLat = lat1d(nLats - iLat - 1) * -1; + invLat_edge = lat1dDown(nLats - iLat - 1) * -1; + + rtheta = qp_to_r_theta(qcenter, pcenter); + rtheta_edge = qp_to_r_theta(qcenter, pcenter); - // this is for cell centers: - rtheta = qp_to_r_theta(magQ1d(iAlt), Pcenters(iLat)); - tmp.zeros(); - tmp += rtheta.first; - magAlt_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; - k_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; - tmp.zeros(); - tmp += rtheta.second; - magLat_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; - j_center_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = tmp; - - // this is for cell corners: - rtheta_corner = qp_to_r_theta(magQ_corner_1d(iAlt), Pcorners(iLat)); - tmp2.zeros(); - tmp2 += rtheta_corner.first; - magAlt_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = tmp2; - tmp2.zeros(); - tmp2 += rtheta_corner.second; - magLat_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = tmp2; + // Flip hemisphere of latitude & q (cannot be done before qp_to_rtheta) + radius = rtheta.first; + theta = rtheta.second * -1.0; + qcenter *= -1.0; + + radius_edge = rtheta_edge.first; + theta_edge = rtheta.second * -1.0; + qedge *= 1.0; + } else { + qcenter = magQ1d(iAlt); + pcenter = Pcenters(iLat); + + qedge = magQ_corner_1d(iAlt); + pedge = Pcorners(iLat); + + invLat = lat1d(iLat); + invLat_edge = lat1dDown(iLat); + + rtheta = qp_to_r_theta(qcenter, pcenter); + rtheta_edge = qp_to_r_theta(qedge, pedge); + + radius = rtheta.first; + theta = rtheta.second; + + radius_edge = rtheta_edge.first; + theta_edge = rtheta_edge.second; + } + + for (iLon = 0; iLon < nLons; iLon ++){ + magLat_scgc(iLon, iLat, iAlt) = theta; + j_center_scgc(iLon, iLat, iAlt) = theta; + + magLat_Down(iLon, iLat, iAlt) = theta_edge; + j_edge_scgc(iLon, iLat, iAlt) = theta_edge; + + magAlt_scgc(iLon, iLat, iAlt) = radius; + k_center_scgc(iLon, iLat, iAlt) = radius; + + magAlt_Below(iLon, iLat, iAlt) = radius_edge; + k_edge_scgc(iLon, iLat, iAlt) = radius_edge; + + // extra coordinates + magP_scgc(iLon, iLat, iAlt) = pcenter; + magQ_scgc(iLon, iLat, iAlt) = qcenter; + magInvLat_scgc(iLon, iLat, iAlt) = invLat; + } + } + } + + report.print(3, "Centers are in"); + + precision_t radius_corner, theta_corner, invLat_corner, + pcorner, qcorner; + + for (iLat = 0; iLat < nLats + 1; iLat ++) { + for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { + + // Same process as the centers & edges (above) + if (isSouth) { + qcorner = magQ_corner_1d(iAlt); + pcorner = Pcorners(nLats - iLat); + invLat_corner = lat1dDown(nLats - iLat) * -1; + rtheta = qp_to_r_theta(qcorner, pcorner); + + radius_corner = rtheta.first; + theta_corner = rtheta.second * -1; + qcorner *= -1; + } else { + qcorner = magQ_corner_1d(iAlt); + pcorner = Pcorners(iLat); + invLat_corner = lat1dDown(iLat); + rtheta = qp_to_r_theta(qcorner, pcorner); + radius_corner = rtheta.first; + theta_corner = rtheta.second; + } + for (iLon = 0; iLon < nLons + 1; iLon ++){ + magLat_Corner(iLon, iLat, iAlt) = theta_corner; + j_corner_scgc(iLon, iLat, iAlt) = theta_corner; + + magAlt_Corner(iLon, iLat, iAlt) = radius_corner; + k_corner_scgc(iLon, iLat, iAlt) = radius_corner; + + magP_Corner(iLon, iLat, iAlt) = pcorner; + magQ_Corner(iLon, iLat, iAlt) = qcorner; + magInvLat_Corner(iLon, iLat, iAlt) = invLat_corner; + } } } - // magAlt is in units of planet radius + report.print(3, "Corners done too"); + + // all distances, so far, are in units of planet radii, turn into meters. + // Except for Q, leave that dimensionless. magAlt_scgc *= planetRadius; + k_center_scgc *= planetRadius; + magAlt_Below *= planetRadius; + k_edge_scgc *= planetRadius; + magP_scgc *= planetRadius; + magAlt_Corner *= planetRadius; + k_corner_scgc *= planetRadius; + magP_Corner *= planetRadius; + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); From 112ce907ce42b5865ba54f0a560142a0d3c3f67d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 20 Mar 2025 19:10:33 -0400 Subject: [PATCH 450/691] STY: astyle, and make sure grids are addressed consistently snuck in a few variables from previous commit too --- include/grid.h | 4 ++++ src/fill_grid.cpp | 2 +- src/grid.cpp | 9 ++------- src/init_mag_grid.cpp | 12 +++++++----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/grid.h b/include/grid.h index 3e32b600..40129d70 100644 --- a/include/grid.h +++ b/include/grid.h @@ -99,6 +99,10 @@ class Grid arma_cube magAlt_Below; arma_cube magAlt_Corner; + arma_cube magP_Corner; + arma_cube magQ_Corner; + arma_cube magInvLat_Corner; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 330a6992..deb2b181 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -174,7 +174,7 @@ void Grid::fill_grid_bfield(Planets planet) { // init_mag grid already initializes magLon & magInvLat // #TODO: make sure the bfield is correct for the dipole // - maybe Dot product the B_vec with (ijk)_vec? - if (iGridShape_ != iDipole_){ + if (IsGeoGrid){ magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; } diff --git a/src/grid.cpp b/src/grid.cpp index 9ed462c3..4e5c9934 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -65,7 +65,7 @@ Grid::Grid(std::string gridtype) { if (grid_input.nZ == 1) HasZdim = false; - if (mklower(grid_input.shape) == "sphere") + if (mklower(grid_input.shape).find("sphere") != std::string::npos) iGridShape_ = iSphere_; if (mklower(grid_input.shape) == "cubesphere") @@ -179,14 +179,9 @@ Grid::Grid(std::string gridtype) { magLat_Corner.set_size(nX + 1, nY + 1, nZ + 1); magAlt_Corner.set_size(nX + 1, nY + 1, nZ + 1); - magP_Down.set_size(nX, nY + 1, nZ); - magP_Below.set_size(nX, nY, nZ + 1); - magQ_Down.set_size(nX, nY + 1, nZ); - magQ_Below.set_size(nX, nY, nZ + 1); magP_Corner.set_size(nX + 1, nY + 1, nZ + 1); magQ_Corner.set_size(nX + 1, nY + 1, nZ + 1); - - baseLats_down.set_size(nY + 1); + magInvLat_Corner.set_size(nX + 1, nY + 1, nZ + 1); radius_scgc.set_size(nX, nY, nZ); radius2_scgc.set_size(nX, nY, nZ); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 6a6fb987..569ad0f8 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -330,8 +330,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { q_min = pow(((1 - max_alt_re / Pcenters(nGCs)) / pow(max_alt_re, 4.0)), 0.5); // Trace each field line up to q_max, obtained from the lowest field line in the block - precision_t q_max = pow(((1 - min_alt_re / Pcenters(nLats-nGCs)) / pow(min_alt_re, - 4.0)), 0.5); + precision_t q_max = pow(((1 - min_alt_re / Pcenters(nLats - nGCs)) / pow( + min_alt_re, + 4.0)), 0.5); // Counter-intuitive, but the maximum value of q is actually where we start // (lowest altitude), since q=0 at equator. @@ -368,7 +369,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iLat = 0; iLat < nLats; iLat ++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { // We have to reverse & negate things; want latitudes from south->north - // and altitude low->high. Altitude is in the correct direction, so change how we + // and altitude low->high. Altitude is in the correct direction, so change how we // access values in the latitude dimension. if (isSouth) { @@ -412,7 +413,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { theta_edge = rtheta_edge.second; } - for (iLon = 0; iLon < nLons; iLon ++){ + for (iLon = 0; iLon < nLons; iLon ++) { magLat_scgc(iLon, iLat, iAlt) = theta; j_center_scgc(iLon, iLat, iAlt) = theta; @@ -459,7 +460,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { radius_corner = rtheta.first; theta_corner = rtheta.second; } - for (iLon = 0; iLon < nLons + 1; iLon ++){ + + for (iLon = 0; iLon < nLons + 1; iLon ++) { magLat_Corner(iLon, iLat, iAlt) = theta_corner; j_corner_scgc(iLon, iLat, iAlt) = theta_corner; From 1ae6be7e9bbc5f07b0b8143d2cd490c10ce4db20 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 21 Mar 2025 17:27:44 -0400 Subject: [PATCH 451/691] BUG/FEAT: Change & correct how dipole grid spacing is done --- src/grid_spacing.cpp | 229 ++++++++----------------------------------- 1 file changed, 41 insertions(+), 188 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index ea3e4d74..09a4926f 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -23,6 +23,24 @@ void Grid::calc_grid_spacing(Planets planet) { report.print(3, "ending calc_grid_spacing"); } +void Grid::calc_dipole_grid_spacing(Planets planet) { + + report.print(3, "starting calc_grid_spacing"); + + calc_i_grid_spacing(); + calc_j_grid_spacing(); + calc_k_grid_spacing(); + + report.print(3, "ending calc_grid_spacing"); +} + + +// This is the del value from (Swisdak, 2006) & others. Used in Dipole distance calc's. +// Note the cos->sin, since magLat is latitude, not colatitude. +inline arma_cube delTc(arma_cube theta) { + return (sqrt(3 * sin(theta) % sin(theta) + 1)); +} + // --------------------------------------- // Grid spacing for altitude: // --------------------------------------- @@ -130,6 +148,17 @@ void Grid::calc_k_grid_spacing() { dr_edge.slice(iZ) = radius_scgc.slice(iZ) - radius_scgc.slice(iZ - 1); + // For the sphere & cubesphere, k is in meters: + if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_){ + dk_center_m_scgc = dk_center_scgc; + dk_edge_m = dk_edge; + } + // This needs to be turned into a distance for the dipole: + if (iGridShape_ == iDipole_){ + dk_center_m_scgc = pow(radius_scgc, 3) % dk_center_scgc / delTc(magLat_scgc); + dk_edge_m = pow(radius_scgc, 3) % dk_edge / delTc(magLat_scgc); + } + // For a stretched grid, calculate some useful quantities: // lower is defined for the current cell, which // means that upper(iZ) is lower(iZ+1) @@ -145,10 +174,6 @@ void Grid::calc_k_grid_spacing() { dk_ratio_sq = dk_ratio % dk_ratio; dk_one_minus_r2 = 1.0 - dk_ratio_sq; - // k is in meters: - dk_edge_m = dk_edge; - dk_center_m_scgc = dk_center_scgc; - report.print(4, "ending calc_k_grid_spacing"); return; } @@ -220,17 +245,19 @@ void Grid::calc_i_grid_spacing() { di_center_m_scgc = di_center_scgc % radius_scgc; di_edge_m = di_edge % radius_scgc; - // If the shape is a sphere, then the first coordinate is longitude. The physical - // distance needs to be changed by the cos of the latitude, which is the j coordinate. + // If the shape is a sphere or dipole, then the first coordinate is longitude. + // The physical distance needs to be changed by the cos of the latitude, + // which is the j coordinate in the sphere (different for dipole). if (iGridShape_ == iSphere_) { di_center_m_scgc = di_center_m_scgc % abs(cos(j_center_scgc)); // edge is in-line with the j center di_edge_m = di_edge_m % abs(cos(j_center_scgc)); } - - // Need a similar thing for the dipole grid here! + // Dipole will use cos(geoLat): if (iGridShape_ == iDipole_) { - // do something here! + di_center_m_scgc = di_center_m_scgc % abs(cos(geoLat_scgc)); + // edge is in-line with the j center + di_edge_m = di_edge_m % abs(cos(geoLat_scgc)); } // For a stretched grid, calculate some useful quantities: @@ -316,7 +343,11 @@ void Grid::calc_j_grid_spacing() { dj_edge_m = dj_edge % radius_scgc; } - // Need to do something for the dipole grid? + // Dipole will have different scaling... + if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_) { + dj_center_m_scgc = dj_center_scgc % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); + dj_edge_m = dj_edge % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); + } // For a stretched grid, calculate some useful quantities: // egde is defined for the current cell, which @@ -335,181 +366,3 @@ void Grid::calc_j_grid_spacing() { report.print(4, "ending calc_j_grid_spacing"); } - -// ----------------------------------------------------------------------------- -// Calaculate Grid Spacing for Dipole Grid -// ----------------------------------------------------------------------------- - -void Grid::calc_dipole_grid_spacing(Planets planet) { - - int64_t iLon, iLat, iAlt; - - report.print(3, "starting calc_dipole_grid_spacing"); - - // This is close, but may need to be adjusted later. - // These quantities are obtained from integrating the scale factor (h) - // The along-field-line distance (alt) should be right, but the lat distance - // is the shortest distance from a point to the adjacent field line, not the adjacent cell. - - report.print(3, "starting alt"); - calc_alt_dipole_grid_spacing(); - report.print(3, "starting lat"); - calc_lat_dipole_grid_spacing(); - report.print(3, "starting long"); - calc_long_dipole_grid_spacing(); - - calc_i_grid_spacing(); - - std::vector lon_lat_radius; - lon_lat_radius.push_back(geoLon_scgc); - lon_lat_radius.push_back(geoLat_scgc); - lon_lat_radius.push_back(radius_scgc); - std::vector xyz; - - xyz = transform_llr_to_xyz_3d(lon_lat_radius); - geoX_scgc = xyz[0]; - geoY_scgc = xyz[0]; - geoZ_scgc = xyz[0]; - - report.print(3, "ending calc_dipole_grid_spacing"); -} - -// for sanity (only marginally helpful): -inline arma_mat delTm(arma_mat theta) { - return (sqrt(3 * cos(theta) % cos(theta) + 1)); -} -inline arma_cube delTc(arma_cube theta) { - return (sqrt(3 * cos(theta) % cos(theta) + 1)); -} - -// ----------------------------------------------------------------------------- -// Grid spacing for altitude: -// - Dipole grid needs to be handled differently! -// ----------------------------------------------------------------------------- - -void Grid::calc_alt_dipole_grid_spacing() { - - int64_t iAlt; - precision_t planetRadius; - - for (iAlt = 1; iAlt < nAlts - 1; iAlt++) { - - dalt_center_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt + 1) % sin(magLat_scgc.slice(iAlt + 1)) - % (1 / delTm(magLat_scgc.slice(iAlt + 1))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - dk_center_scgc.slice(iAlt) = dalt_center_scgc.slice(iAlt); - - dalt_lower_scgc.slice(iAlt) = - abs(magAlt_scgc.slice(iAlt) % sin(magLat_scgc.slice(iAlt)) - % (1 / delTm(magLat_scgc.slice(iAlt))) - - magAlt_scgc.slice(iAlt - 1) % sin(magLat_scgc.slice(iAlt - 1)) - % (1 / delTm(magLat_scgc.slice(iAlt - 1)))) * 2; - dk_edge.slice(iAlt) = dalt_lower_scgc.slice(iAlt); - - dr_edge.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - } - - dalt_center_scgc.slice(0) = dalt_center_scgc.slice(1); - dalt_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); - dk_center_scgc.slice(0) = dalt_center_scgc.slice(0); - dk_center_scgc.slice(nAlts - 1) = dalt_center_scgc.slice(nAlts - 2); - - dalt_lower_scgc.slice(0) = dalt_lower_scgc.slice(1); - dr_edge.slice(0) = dr_edge.slice(1); - dk_edge.slice(0) = dalt_lower_scgc.slice(1); - iAlt = nAlts - 1; - dalt_lower_scgc.slice(iAlt) = - magAlt_scgc.slice(iAlt) - magAlt_scgc.slice(iAlt - 1); - dk_edge.slice(iAlt) = dalt_lower_scgc.slice(iAlt); - dr_edge.slice(iAlt) = - radius_scgc.slice(iAlt) - radius_scgc.slice(iAlt - 1); - - // For a stretched grid, calculate some useful quantities: - // lower is defined for the current cell, which - // means that upper(iAlt) is lower(iAlt+1) - // ratio = upper / lower - for (iAlt = 0; iAlt < nAlts - 1; iAlt++) { - dalt_ratio_scgc.slice(iAlt) = - dalt_lower_scgc.slice(iAlt + 1) / dalt_lower_scgc.slice(iAlt); - dk_ratio.slice(iAlt) = - dk_edge.slice(iAlt + 1) / dk_edge.slice(iAlt); - } - - iAlt = nAlts - 1; - dalt_ratio_scgc.slice(iAlt) = dalt_ratio_scgc.slice(iAlt - 1); - dk_ratio.slice(iAlt) = dk_ratio.slice(iAlt - 1); - - // Need the square of the ratio: - dalt_ratio_sq_scgc = dalt_ratio_scgc % dalt_ratio_scgc; - dk_ratio_sq = dk_ratio % dk_ratio; - dk_one_minus_r2 = 1.0 - dk_ratio_sq; - - // k is in meters: - dk_edge_m = dk_edge; - dk_center_m_scgc = dk_center_scgc; -} - -// --------------------------------------- -// Grid spacing for latitude: -// Again, different for the dipole... -// - uhoh, might not be right. not actually perpendicular to q-p, but no way around that, i think. -// --------------------------------------- - -void Grid::calc_lat_dipole_grid_spacing() { - - int64_t iLat; - - for (iLat = 1; iLat < nLats - 1; iLat++) { - dlat_center_scgc.col(iLat) = - abs(magAlt_scgc.col(iLat + 1) % sin(magLat_scgc.col(iLat + 1)) - % (1 / delTc(magLat_scgc.col(iLat + 1))) - - magAlt_scgc.col(iLat - 1) % sin(magLat_scgc.col(iLat - 1)) - % (1 / delTc(magLat_scgc.col(iLat - 1)))) * 2; - } - - // Bottom (one sided): - iLat = 0; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat + 1) - geoLat_scgc.col(iLat); - // Top (one sided): - iLat = nLats - 1; - dlat_center_scgc.col(iLat) = - geoLat_scgc.col(iLat) - geoLat_scgc.col(iLat - 1); - - // Make this into a distance: - dlat_center_dist_scgc = dlat_center_scgc % radius_scgc; - dj_center_scgc = dlat_center_scgc; - dj_center_m_scgc = dlat_center_dist_scgc; -} - -// --------------------------------------- -// Grid spacing for longitude: -// --------------------------------------- - -void Grid::calc_long_dipole_grid_spacing() { - - int64_t iLon; - - for (iLon = 1; iLon < nLons - 1; iLon++) - dlon_center_scgc.row(iLon) = - (magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon - 1)) / 2.0; - - // this might be fine for the dipole, if it works for the geo grid... - - // Bottom (one sided): - iLon = 0; - dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon + 1) - magLon_scgc.row(iLon); - // Top (one sided): - iLon = nLons - 1; - dlon_center_scgc.row(iLon) = - magLon_scgc.row(iLon) - magLon_scgc.row(iLon - 1); - - // Make this into a distance: - dlon_center_dist_scgc = - // dlon_center_scgc % radius_scgc % abs(cos(geoLat_scgc)); - dlon_center_scgc % magAlt_scgc % cos(magLat_scgc); -} From c6ddab2532434b51fe4ee13cb5d7460b5bd7eef1 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sat, 22 Mar 2025 13:47:18 -0400 Subject: [PATCH 452/691] FEAT: Add generic k-direction gradient --- src/solver_gradients.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 6843eaa3..5434b7fb 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -321,6 +321,44 @@ arma_cube calc_gradient_lat(arma_cube value, Grid grid) { return calc_gradient2o_j(value, grid); } +// -------------------------------------------------------------------------- +// Calculate the 2nd order gradient in the native k direction +// - these formulas assume that the grid is uniform. +// -------------------------------------------------------------------------- + +arma_cube calc_gradient2o_k(arma_cube value, Grid grid) { + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t iZ; + + arma_cube gradient(nX, nY, nZ); + gradient.zeros(); + + if (grid.get_HasZdim()) { + // Interior: + for (iZ = 1; iZ < nZ - 1; iZ++) + gradient.slice(iZ) = + (value.slice(iZ + 1) - value.slice(iZ - 1)) / + (2 * grid.dk_center_m_scgc.slice(iZ)); + + // Lower (one sided): + iZ = 0; + gradient.slice(iZ) = + (value.slice(iZ + 1) - value.slice(iZ)) / + grid.dk_center_m_scgc.slice(iZ); + + // Upper (one sided): + iZ = nZ - 1; + gradient.slice(iZ) = + (value.slice(iZ) - value.slice(iZ - 1)) / + grid.dk_center_m_scgc.slice(iZ); + } + + return gradient; +} + // -------------------------------------------------------------------------- // Calculate the gradient in the altitudinal direction // -------------------------------------------------------------------------- From 59d32e822691ae7b2a80c04a09e31c7f4ffdffca Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sat, 22 Mar 2025 14:00:04 -0400 Subject: [PATCH 453/691] FEAT: Dipole gradient. Might be redundant... - The gradient in the dipole grid is, I think, the same as the spherical grid. Except the k-direction - We can do away with this separate method and just put an if statement around that in calc_gradient_vector? --- include/solvers.h | 1 + src/solver_gradients.cpp | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/solvers.h b/include/solvers.h index 02e805e7..ca59515c 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -87,6 +87,7 @@ arma_cube calc_gradient_lat(arma_cube value, Grid grid); arma_cube calc_gradient_alt(arma_cube value, Grid grid); std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid); std::vector calc_gradient_cubesphere(arma_cube value, Grid grid); +std::vector calc_gradient_dipole(arma_cube value, Grid grid); arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid); arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt); diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 5434b7fb..49867725 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -20,6 +20,8 @@ std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { if (grid.iGridShape_ == grid.iCubesphere_) gradient_vcgc = calc_gradient_cubesphere(value_scgc, grid); + else if (grid.iGridShape_ == grid.iDipole_) + gradient_vcgc = calc_gradient_dipole(value_scgc, grid); else { report.print(4, "Going into calc_gradient_lon"); @@ -453,6 +455,30 @@ arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { return valueOut; } +// -------------------------------------------------------------------------- +// Calculate the gradient on the dipole grid +// - This is identical to the spherical grid, except the k/alt direction. +// -------------------------------------------------------------------------- +std::vector calc_gradient_dipole(arma_cube value_scgc, Grid grid) { + + std::vector gradient_vcgc; + + report.print(3, "Calculating dipole griadient"); + + report.print(4, "Going into calc_gradient_lon"); + gradient_vcgc.push_back(calc_gradient2o_i(value_scgc, grid)); + + + report.print(4, "Going into calc_gradient_lat"); + gradient_vcgc.push_back(calc_gradient2o_j(value_scgc, grid)); + + + report.print(4, "Going into calc_gradient_alt"); + gradient_vcgc.push_back(calc_gradient2o_k(value_scgc, grid)); + + return gradient_vcgc; +} + // -------------------------------------------------------------------------- // Calculate the gradient in cubesphere spatial discretization // -------------------------------------------------------------------------- From f61f2a5c4ac0856812d6fa273d78955c667fcf68 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 23 Mar 2025 10:27:42 -0400 Subject: [PATCH 454/691] MAINT: Remove some unused func's and variables from mag grid things --- include/grid.h | 24 ------------------- src/grid.cpp | 1 - src/init_mag_grid.cpp | 54 ------------------------------------------- 3 files changed, 79 deletions(-) diff --git a/include/grid.h b/include/grid.h index 40129d70..e0cd3f77 100644 --- a/include/grid.h +++ b/include/grid.h @@ -83,7 +83,6 @@ class Grid // Phi => Longitude // P => L-shell // Q => Distance along field line - arma_cube magPhi_scgc; arma_cube magP_scgc; arma_cube magQ_scgc; @@ -317,32 +316,9 @@ class Grid void calc_cent_acc(Planets planet); // Make mag-field grid: - void convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], - precision_t XyzGeo[3]); - bool init_dipole_grid(Quadtree quadtree_ion, Planets planet); // Support functions: void calc_dipole_grid_spacing(Planets planet); - void calc_alt_dipole_grid_spacing(); - void calc_lat_dipole_grid_spacing(); - void calc_long_dipole_grid_spacing(); - void fill_field_lines(arma_vec baseLats, precision_t min_altRe, - precision_t Gamma, Planets planet, - bool isCorner); - void dipole_alt_edges(Planets planet, precision_t min_altRe); - // get the latitude spacing given the quadtree start & size, and the latitude limits - // extent: quadtree up - // origin: quadtree origin - // upper_lim: upper latitude limit (input) - // lower_lim: lower latitude limit (from min_apex) - // nLats: number of latitudes (nY) - // spacing_factor: (not supported yet), so always 1.0. Will adjust baselat spacing, eventually. - arma_vec baselat_spacing(precision_t extent, - precision_t origin, - precision_t upper_lim, - precision_t lower_lim, - // int16_t nLats, - precision_t spacing_factor); // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); diff --git a/src/grid.cpp b/src/grid.cpp index 4e5c9934..3e99f8cc 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -157,7 +157,6 @@ Grid::Grid(std::string gridtype) { magAlt_scgc.set_size(nX, nY, nZ); magInvLat_scgc.set_size(nX, nY, nZ); - magPhi_scgc.set_size(nX, nY, nZ); magP_scgc.set_size(nX, nY, nZ); magQ_scgc.set_size(nX, nY, nZ); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 569ad0f8..bfe4776b 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -73,60 +73,6 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, return llr; } -// ----------------------------------------------------------------------- -// Convert XyzDipole to XyzGeo -// -// ----------------------------------------------------------------------- - -void Grid::convert_dipole_geo_xyz(Planets planet, precision_t XyzDipole[3], - precision_t XyzGeo[3]) { - - std::string function = "Grid::convert_dipole_geo_xyz"; - static int iFunction = -1; - report.enter(function, iFunction); - - precision_t XyzRemoveShift[3]; - precision_t XyzRemoveTilt[3]; - precision_t XyzRemoveRot[3]; - - // get planetary parameters - precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); - precision_t radius = planet.get_radius(0.0); - - - // get the dipole shift, but normalize it to equatorial radius - precision_t dipole_center[3]; - std::vector temp_dipole_center = planet.get_dipole_center(); - - if ((temp_dipole_center[0] != 0) or (temp_dipole_center[1] != 0) or - (temp_dipole_center[2] != 0)) { - report.print(0, - "Dipole center != 0, but that is not supported yet. Setting to 0!"); - temp_dipole_center = {0, 0, 0}; - - } - - transform_float_vector_to_array(temp_dipole_center, dipole_center); - - dipole_center[0] = dipole_center[0] / radius; - dipole_center[1] = dipole_center[1] / radius; - dipole_center[2] = dipole_center[2] / radius; - - // Remove Tilt - transform_rot_y(XyzDipole, magnetic_pole_tilt, XyzRemoveTilt); - - // Remove Rot - transform_rot_z(XyzRemoveTilt, magnetic_pole_rotation, XyzRemoveRot); - - // Remove Shift - vector_add(XyzRemoveRot, dipole_center, XyzGeo); - - report.exit(function); - return; - -} - // ---------------------------------------------------------------------- // Initialize the dipole grid. // - inputs (min_apex, min_alt, LatStretch, FieldLineStretch, max_lat_dipole) From b06b008b1a7b3d413f7a4526a55539cd252b3d54 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 23 Mar 2025 10:28:51 -0400 Subject: [PATCH 455/691] FEAT: Add bones for converting offset dipole to geo (grid) --- src/init_mag_grid.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index bfe4776b..83720da4 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -55,16 +55,22 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + std::vector dipole_center = planet.get_dipole_center(); // Reverse our dipole rotations: xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); - // offset dipole (not yet implemented): - // std::vector dipole_center = planet.get_dipole_center(); - // xyz_geo[0] = xyzRot2[0] + dipole_center[0]; - // xyz_geo[1] = xyzRot2[1] + dipole_center[1]; - // xyz_geo[2] = xyzRot2[2] + dipole_center[2]; + // offset dipole (not fully suported yet, so will be zero. + if ((dipole_center[0] != 0) || (dipole_center[1] != 0) || + (dipole_center[2] != 0)) { + report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); + dipole_center = {0, 0, 0}; + } + + xyz_geo[0] = xyzRot2[0] + dipole_center[0]; + xyz_geo[1] = xyzRot2[1] + dipole_center[1]; + xyz_geo[2] = xyzRot2[2] + dipole_center[2]; // transform back to lon, lat, radius: llr = transform_xyz_to_llr_3d(xyzRot2); From 699ce3be4c4f493de693c2e0a4a9b3d875a30bcc Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 23 Mar 2025 11:11:17 -0400 Subject: [PATCH 456/691] FEAT/STY: Overload get_radius to accept floats & cubes Two calls were replaced. Do we want to switch everything to cubes from floats? --- include/planets.h | 3 ++- src/fill_grid.cpp | 8 +------- src/init_mag_grid.cpp | 2 +- src/planets.cpp | 13 +++++++++++++ 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/include/planets.h b/include/planets.h index a512daac..f6ba44e9 100644 --- a/include/planets.h +++ b/include/planets.h @@ -61,11 +61,12 @@ class Planets { /********************************************************************** \brief Returns radius of the planet, which can be a function of latitude - currently, this ignores the latitude, but should be implemented. + Overloaded for floats & cubes, much easier to call this on a cube. \param latitude the latitude to get the radius at. **/ precision_t get_radius(precision_t latitude); + arma_cube get_radius(arma_cube latitude); /********************************************************************** \brief Returns the longitude offset to convert from longitude to local time diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index deb2b181..0fb4c2bb 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -215,16 +215,10 @@ void Grid::fill_grid_radius(Planets planet) { static int iFunction = -1; report.enter(function, iFunction); - int64_t iLon, iLat, iAlt; - // This generalizes things so that radius could be a function of all // three dimensions. The Cubesphere has different latitudes in the first // and second dimensions. - for (iLon = 0; iLon < nLons; iLon++) - for (iLat = 0; iLat < nLats; iLat++) - for (iAlt = 0; iAlt < nAlts; iAlt++) - radius_scgc(iLon, iLat, iAlt) = - planet.get_radius(geoLat_scgc(iLon, iLat, iAlt)); + radius_scgc = planet.get_radius(geoLat_scgc); radius_scgc = radius_scgc + geoAlt_scgc; radius2_scgc = radius_scgc % radius_scgc; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 83720da4..b20118be 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -446,7 +446,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; - geoAlt_scgc = llr[2] - planetRadius; + geoAlt_scgc = llr[2] - planet.get_radius(geoLat_scgc); report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); diff --git a/src/planets.cpp b/src/planets.cpp index 0528cfd7..1216d787 100644 --- a/src/planets.cpp +++ b/src/planets.cpp @@ -66,6 +66,7 @@ precision_t Planets::get_cos_dec(Times time) { // ----------------------------------------------------------------------------- // Get the radius of the planet as a function of latitude (meters) +// - Overloaded to support passing cubes, avoids loops in the calling function. // ----------------------------------------------------------------------------- precision_t Planets::get_radius(precision_t latitude) { @@ -75,6 +76,18 @@ precision_t Planets::get_radius(precision_t latitude) { return planet.radius; } +arma_cube Planets::get_radius(arma_cube latitude) { + if (input.get_do_lat_dependent_radius()) + return planet.polar_radius + (planet.delta_radius * cos(latitude)); + else{ + arma_cube radius(latitude.n_rows, + latitude.n_cols, + latitude.n_slices); + radius = planet.radius; + return radius; + } +} + // ----------------------------------------------------------------------------- // Get the rotation of the dipole (in radians, rotation in longitude) // ----------------------------------------------------------------------------- From 77698d43f0a59fe51fc2961cbc6c14d3cde4b14c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 23 Mar 2025 11:27:26 -0400 Subject: [PATCH 457/691] BUG: Fix dipole grid's radius calculations --- src/init_mag_grid.cpp | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index b20118be..123fc177 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -123,6 +123,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t max_alt = grid_input.alt_max * cKMtoM; // Normalize inputs to planet radius... (update when earth is oblate) + // Here we are using the equatorial radius. precision_t planetRadius = planet.get_radius(0.0); // Altitude to begin modeling, normalized to planet radius precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; @@ -458,8 +459,13 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); - // Calculate the radius, of planet - fill_grid_radius(planet); + // Fill grid radius, radius2, radius2i + // fill_grid_radius uses radius of the planet & geo_alt + // That would be redundant here since we already know the radius (magAlt) + // This is NOT yet offset: to offset do magAlt + dipole_cnter_m + radius_scgc = magAlt_scgc; + radius2_scgc = radius_scgc % radius_scgc; + radius2i_scgc = 1.0 / radius2_scgc; // Figure out what direction is radial: rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -470,15 +476,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[iV].zeros(); } - arma_cube br = 2 * sin(abs(magLat_scgc)); - arma_cube bt = cos(magLat_scgc); - arma_cube bm = sqrt(br % br + bt % bt); - // Latitudinal direction of radial: - arma_cube s = sign(magLat_scgc); - s.elem(find(s == 0)).ones(); - - rad_unit_vcgc[1] = bt / bm % s; - rad_unit_vcgc[2] = -br / bm; + rad_unit_vcgc[1] = cos(magLat_scgc) / pow(1+ 3* sin(magLat_scgc), 0.5); + rad_unit_vcgc[2] = -2* sin(magLat_scgc) / pow(1+ 3* sin(magLat_scgc), 0.5); precision_t mu = planet.get_mu(); gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; From f0b231c7dfb9376baca29079fc76a942430ce2fa Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 25 Mar 2025 16:27:30 -0400 Subject: [PATCH 458/691] Revert "FEAT/STY: Overload get_radius to accept floats & cubes" This reverts commit 699ce3be4c4f493de693c2e0a4a9b3d875a30bcc. --- include/planets.h | 3 +-- src/fill_grid.cpp | 8 +++++++- src/init_mag_grid.cpp | 2 +- src/planets.cpp | 13 ------------- 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/include/planets.h b/include/planets.h index f6ba44e9..a512daac 100644 --- a/include/planets.h +++ b/include/planets.h @@ -61,12 +61,11 @@ class Planets { /********************************************************************** \brief Returns radius of the planet, which can be a function of latitude - Overloaded for floats & cubes, much easier to call this on a cube. + currently, this ignores the latitude, but should be implemented. \param latitude the latitude to get the radius at. **/ precision_t get_radius(precision_t latitude); - arma_cube get_radius(arma_cube latitude); /********************************************************************** \brief Returns the longitude offset to convert from longitude to local time diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 0fb4c2bb..deb2b181 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -215,10 +215,16 @@ void Grid::fill_grid_radius(Planets planet) { static int iFunction = -1; report.enter(function, iFunction); + int64_t iLon, iLat, iAlt; + // This generalizes things so that radius could be a function of all // three dimensions. The Cubesphere has different latitudes in the first // and second dimensions. - radius_scgc = planet.get_radius(geoLat_scgc); + for (iLon = 0; iLon < nLons; iLon++) + for (iLat = 0; iLat < nLats; iLat++) + for (iAlt = 0; iAlt < nAlts; iAlt++) + radius_scgc(iLon, iLat, iAlt) = + planet.get_radius(geoLat_scgc(iLon, iLat, iAlt)); radius_scgc = radius_scgc + geoAlt_scgc; radius2_scgc = radius_scgc % radius_scgc; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 123fc177..e10f3b80 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -447,7 +447,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { geoLon_scgc = llr[0]; geoLat_scgc = llr[1]; - geoAlt_scgc = llr[2] - planet.get_radius(geoLat_scgc); + geoAlt_scgc = llr[2] - planetRadius; report.print(4, "Done dipole -> geographic transformations for the dipole grid centers."); diff --git a/src/planets.cpp b/src/planets.cpp index 1216d787..0528cfd7 100644 --- a/src/planets.cpp +++ b/src/planets.cpp @@ -66,7 +66,6 @@ precision_t Planets::get_cos_dec(Times time) { // ----------------------------------------------------------------------------- // Get the radius of the planet as a function of latitude (meters) -// - Overloaded to support passing cubes, avoids loops in the calling function. // ----------------------------------------------------------------------------- precision_t Planets::get_radius(precision_t latitude) { @@ -76,18 +75,6 @@ precision_t Planets::get_radius(precision_t latitude) { return planet.radius; } -arma_cube Planets::get_radius(arma_cube latitude) { - if (input.get_do_lat_dependent_radius()) - return planet.polar_radius + (planet.delta_radius * cos(latitude)); - else{ - arma_cube radius(latitude.n_rows, - latitude.n_cols, - latitude.n_slices); - radius = planet.radius; - return radius; - } -} - // ----------------------------------------------------------------------------- // Get the rotation of the dipole (in radians, rotation in longitude) // ----------------------------------------------------------------------------- From 34f7eb1077209383feecd48c669eaae1c4aadb45 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 25 Mar 2025 16:40:28 -0400 Subject: [PATCH 459/691] BUGS: Fix type issues in mag_to_geo & clarify reporting in solver_gradients. The code is stable. --- src/init_mag_grid.cpp | 12 ++++++------ src/solver_gradients.cpp | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index e10f3b80..67be3a25 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -62,15 +62,15 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); // offset dipole (not fully suported yet, so will be zero. - if ((dipole_center[0] != 0) || (dipole_center[1] != 0) || - (dipole_center[2] != 0)) { + if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || + (dipole_center[2] != 0.0)) { report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); - dipole_center = {0, 0, 0}; + dipole_center = {0.0, 0.0, 0.0}; } - xyz_geo[0] = xyzRot2[0] + dipole_center[0]; - xyz_geo[1] = xyzRot2[1] + dipole_center[1]; - xyz_geo[2] = xyzRot2[2] + dipole_center[2]; + xyz_geo.push_back(xyzRot2[0] + dipole_center[0]); + xyz_geo.push_back(xyzRot2[1] + dipole_center[1]); + xyz_geo.push_back(xyzRot2[2] + dipole_center[2]); // transform back to lon, lat, radius: llr = transform_xyz_to_llr_3d(xyzRot2); diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 49867725..464239cd 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -465,15 +465,15 @@ std::vector calc_gradient_dipole(arma_cube value_scgc, Grid grid) { report.print(3, "Calculating dipole griadient"); - report.print(4, "Going into calc_gradient_lon"); + report.print(4, "Going into calc_gradient_i (dipole)"); gradient_vcgc.push_back(calc_gradient2o_i(value_scgc, grid)); - report.print(4, "Going into calc_gradient_lat"); + report.print(4, "Going into calc_gradient_j (dipole)"); gradient_vcgc.push_back(calc_gradient2o_j(value_scgc, grid)); - report.print(4, "Going into calc_gradient_alt"); + report.print(4, "Going into calc_gradient_K (DIPOLE)"); gradient_vcgc.push_back(calc_gradient2o_k(value_scgc, grid)); return gradient_vcgc; From dd595f5579b633d40f936fb13f94b2b7a2673952 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 31 Mar 2025 14:33:01 -0400 Subject: [PATCH 460/691] BUG: Fix order of pts in mag grid (k-direction) & start changing to dipole p,q for i,j from lon,lat --- src/init_mag_grid.cpp | 56 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 67be3a25..506c0310 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -314,6 +314,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { std::pair rtheta, rtheta_edge; precision_t radius, radius_edge, theta, theta_edge, invLat, invLat_edge, pcenter, pedge, qcenter, qedge; + int64_t iAlt2; // we need to turn single floats into vectors/cubes: // We can solve for (r, theta) for each point on the (q,p) grid. Do that & store: @@ -322,8 +323,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iLat = 0; iLat < nLats; iLat ++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { // We have to reverse & negate things; want latitudes from south->north - // and altitude low->high. Altitude is in the correct direction, so change how we - // access values in the latitude dimension. + // and altitude low->high. + // - Altitude is in the reverse direction in both hemispheres. + // - Latitude is reversed in southern hemisphere. + iAlt2 = nAlts - iAlt - 1; if (isSouth) { qcenter = magQ1d(iAlt); @@ -367,22 +370,22 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { } for (iLon = 0; iLon < nLons; iLon ++) { - magLat_scgc(iLon, iLat, iAlt) = theta; - j_center_scgc(iLon, iLat, iAlt) = theta; + magLat_scgc(iLon, iLat, iAlt2) = theta; + magLat_Down(iLon, iLat, iAlt2) = theta_edge; - magLat_Down(iLon, iLat, iAlt) = theta_edge; - j_edge_scgc(iLon, iLat, iAlt) = theta_edge; + magAlt_scgc(iLon, iLat, iAlt2) = radius; + magAlt_Below(iLon, iLat, iAlt2) = radius_edge; - magAlt_scgc(iLon, iLat, iAlt) = radius; - k_center_scgc(iLon, iLat, iAlt) = radius; + magInvLat_scgc(iLon, iLat, iAlt2) = invLat; - magAlt_Below(iLon, iLat, iAlt) = radius_edge; - k_edge_scgc(iLon, iLat, iAlt) = radius_edge; + magP_scgc(iLon, iLat, iAlt2) = pcenter; + j_center_scgc(iLon, iLat, iAlt2) = pcenter; + j_edge_scgc(iLon, iLat, iAlt2) = pedge; + + magQ_scgc(iLon, iLat, iAlt2) = qcenter; + k_center_scgc(iLon, iLat, iAlt2) = qcenter; + k_edge_scgc(iLon, iLat, iAlt2) = qedge; - // extra coordinates - magP_scgc(iLon, iLat, iAlt) = pcenter; - magQ_scgc(iLon, iLat, iAlt) = qcenter; - magInvLat_scgc(iLon, iLat, iAlt) = invLat; } } } @@ -394,6 +397,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iLat = 0; iLat < nLats + 1; iLat ++) { for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { + iAlt2 = nAlts - iAlt; // Same process as the centers & edges (above) if (isSouth) { @@ -415,15 +419,16 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { } for (iLon = 0; iLon < nLons + 1; iLon ++) { - magLat_Corner(iLon, iLat, iAlt) = theta_corner; - j_corner_scgc(iLon, iLat, iAlt) = theta_corner; + magLat_Corner(iLon, iLat, iAlt2) = theta_corner; + magAlt_Corner(iLon, iLat, iAlt2) = radius_corner; + + magInvLat_Corner(iLon, iLat, iAlt2) = invLat_corner; - magAlt_Corner(iLon, iLat, iAlt) = radius_corner; - k_corner_scgc(iLon, iLat, iAlt) = radius_corner; + magP_Corner(iLon, iLat, iAlt2) = pcorner; + j_corner_scgc(iLon, iLat, iAlt2) = pcorner; - magP_Corner(iLon, iLat, iAlt) = pcorner; - magQ_Corner(iLon, iLat, iAlt) = qcorner; - magInvLat_Corner(iLon, iLat, iAlt) = invLat_corner; + magQ_Corner(iLon, iLat, iAlt2) = qcorner; + k_corner_scgc(iLon, iLat, iAlt2) = qcorner; } } } @@ -433,15 +438,18 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // all distances, so far, are in units of planet radii, turn into meters. // Except for Q, leave that dimensionless. magAlt_scgc *= planetRadius; - k_center_scgc *= planetRadius; magAlt_Below *= planetRadius; - k_edge_scgc *= planetRadius; magP_scgc *= planetRadius; magAlt_Corner *= planetRadius; - k_corner_scgc *= planetRadius; magP_Corner *= planetRadius; + magQ_Corner *= planetRadius; + magQ_scgc *= planetRadius; + k_center_scgc *= planetRadius; + k_edge_scgc *= planetRadius; + k_corner_scgc *= planetRadius; + // Convert to geographic, rotating and (maybe) shifting the dipole grid. std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, planet); From dc4045afa41103bde3bc24fdc755cd2aa665aeb3 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 3 Apr 2025 14:29:43 -0400 Subject: [PATCH 461/691] sty: clean up error reporting around offset dipole --- src/init_mag_grid.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 506c0310..a390631d 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -61,11 +61,14 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); - // offset dipole (not fully suported yet, so will be zero. + // offset dipole (not fully suported yet, so will be zero) if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || (dipole_center[2] != 0.0)) { - report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); - dipole_center = {0.0, 0.0, 0.0}; + + if (iProc == 0) // only one error + report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); + + dipole_center = {0.0, 0.0, 0.0}; } xyz_geo.push_back(xyzRot2[0] + dipole_center[0]); From 2df83cb7ff8ce88b1e055ea92f4a812d70976ab6 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 3 Apr 2025 16:26:10 -0400 Subject: [PATCH 462/691] BUG/STY: Fix some missing points in dipole grid, formatting --- src/init_mag_grid.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a390631d..bc94f593 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -64,10 +64,10 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, // offset dipole (not fully suported yet, so will be zero) if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || (dipole_center[2] != 0.0)) { - + if (iProc == 0) // only one error report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); - + dipole_center = {0.0, 0.0, 0.0}; } @@ -178,15 +178,17 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // left edges magLon_Left.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_edge_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; + } + } + + for (iLat = 0; iLat < nLats + 1; iLat ++) { + for (iAlt = 0; iAlt < nAlts + 1; iAlt++) { // corners magLon_Corner.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; i_corner_scgc.subcube(0, iLat, iAlt, nLons, iLat, iAlt) = lon1dLeft; } } - if (magLon_scgc.has_nan()) - report.error("NAN IN MAGLON"); - report.print(3, "Done initializing longitudes, moving to latitude"); //////////////// @@ -224,7 +226,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { lat1dDown(iLat) = lat0 + (iLat - nGCs) * dlat + min_lat; // corners & edges } - lat1dDown(nLats) = lat0 + (nLats - nGCs) * dlat; // last corner + lat1dDown(nLats) = lat0 + (nLats - nGCs) * dlat + min_lat; // last corner // At the pole: // - put last ghost cell's corner at 89.9 degrees latitude @@ -302,7 +304,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { magQ_corner_1d(iAlt) = q_min + (iAlt - nGCs) * delQ; } - magQ_corner_1d(nAlts) = q_min - nGCs * delQ; + magQ_corner_1d(nAlts) = q_min + (nAlts - nGCs) * delQ; report.print(3, "Done generating points for magnetic grid. Plugging everything in"); @@ -318,7 +320,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t radius, radius_edge, theta, theta_edge, invLat, invLat_edge, pcenter, pedge, qcenter, qedge; int64_t iAlt2; - // we need to turn single floats into vectors/cubes: // We can solve for (r, theta) for each point on the (q,p) grid. Do that & store: // Currently the grid is symmetric in longitude. @@ -326,7 +327,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { for (iLat = 0; iLat < nLats; iLat ++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { // We have to reverse & negate things; want latitudes from south->north - // and altitude low->high. + // and altitude low->high. // - Altitude is in the reverse direction in both hemispheres. // - Latitude is reversed in southern hemisphere. iAlt2 = nAlts - iAlt - 1; @@ -406,12 +407,12 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { if (isSouth) { qcorner = magQ_corner_1d(iAlt); pcorner = Pcorners(nLats - iLat); - invLat_corner = lat1dDown(nLats - iLat) * -1; + invLat_corner = lat1dDown(nLats - iLat) * -1.0; rtheta = qp_to_r_theta(qcorner, pcorner); radius_corner = rtheta.first; - theta_corner = rtheta.second * -1; - qcorner *= -1; + theta_corner = rtheta.second * -1.0; + qcorner *= -1.0; } else { qcorner = magQ_corner_1d(iAlt); pcorner = Pcorners(iLat); @@ -487,8 +488,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[iV].zeros(); } - rad_unit_vcgc[1] = cos(magLat_scgc) / pow(1+ 3* sin(magLat_scgc), 0.5); - rad_unit_vcgc[2] = -2* sin(magLat_scgc) / pow(1+ 3* sin(magLat_scgc), 0.5); + rad_unit_vcgc[1] = cos(magLat_scgc) / pow(1 + 3 * sin(magLat_scgc), 0.5); + rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(1 + 3 * sin(magLat_scgc), 0.5); precision_t mu = planet.get_mu(); gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; From fd005d50fffcf191bd974cf42b288a5574f62e7e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 3 Apr 2025 17:42:41 -0400 Subject: [PATCH 463/691] FEAT: Check for non-physical cells on geo & mag grids --- include/grid.h | 4 ++++ src/init_geo_grid.cpp | 4 ++++ src/init_mag_grid.cpp | 5 +++++ 3 files changed, 13 insertions(+) diff --git a/include/grid.h b/include/grid.h index e0cd3f77..23de18ab 100644 --- a/include/grid.h +++ b/include/grid.h @@ -102,6 +102,10 @@ class Grid arma_cube magQ_Corner; arma_cube magInvLat_Corner; + // Dipole grid has cells below the surface of earth. These variables hold masks + // to either access those cells or ignore them (with .elem()). + arma::uvec isTooLowCell, isPhysicalCell; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 78b75acb..7d3d611b 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -150,6 +150,10 @@ void Grid::create_altitudes(Planets planet) { } } + // All cells on the geographic grid *should* be ok + isTooLowCell = find(geoAlt_scgc < 0.0); + isPhysicalCell = find(geoAlt_scgc > 0.0); + report.exit(function); return; } diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index bc94f593..a4596c37 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -505,6 +505,11 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { calc_dipole_grid_spacing(planet); + + // Generate mask for physicsl cells + isTooLowCell = find(magAlt_scgc < min_alt_re); + isPhysicalCell = find(magAlt_scgc > min_alt_re); + report.print(4, "Done altitude spacing for the dipole grid."); // Calculate magnetic field and magnetic coordinates: From 88fc85a99c94c94336e889a2c044f5f806283262 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 3 Apr 2025 19:29:27 -0400 Subject: [PATCH 464/691] BUG: Catch errors making any kind of mag grid --- src/main/main.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 9d0a0a3f..eba6d868 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -92,8 +92,6 @@ int main() { if (mGrid.iGridShape_ == mGrid.iDipole_) { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); - if (!didWork) - throw std::string("init_dipole_grid failed!"); } else { std::cout << "Making Spherical Magnetic Grid\n"; mGrid.set_IsDipole(false); @@ -101,6 +99,10 @@ int main() { mGrid.set_IsGeoGrid(false); } + if (!didWork) + throw std::string("Initializing magneitic grid failed!"); + + didWork = grid_match(gGrid, mGrid, quadtree, quadtree_ion); // Initialize Neutrals on geographic grid: From 471f5f582151237ce0301d1247ed0613007e8d67 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 4 Apr 2025 18:09:24 -0400 Subject: [PATCH 465/691] BUG: Fix radius vs alt units & geo/mag lat on dipole grid --- src/grid_spacing.cpp | 16 ++++++++-------- src/init_mag_grid.cpp | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 09a4926f..56142840 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -155,8 +155,8 @@ void Grid::calc_k_grid_spacing() { } // This needs to be turned into a distance for the dipole: if (iGridShape_ == iDipole_){ - dk_center_m_scgc = pow(radius_scgc, 3) % dk_center_scgc / delTc(magLat_scgc); - dk_edge_m = pow(radius_scgc, 3) % dk_edge / delTc(magLat_scgc); + dk_center_m_scgc = pow(magAlt_scgc, 3) % dk_center_scgc / delTc(magLat_scgc); + dk_edge_m = pow(magAlt_scgc, 3) % dk_edge / delTc(magLat_scgc); } // For a stretched grid, calculate some useful quantities: @@ -253,11 +253,11 @@ void Grid::calc_i_grid_spacing() { // edge is in-line with the j center di_edge_m = di_edge_m % abs(cos(j_center_scgc)); } - // Dipole will use cos(geoLat): + // Dipole will use cos(magLat) if (iGridShape_ == iDipole_) { - di_center_m_scgc = di_center_m_scgc % abs(cos(geoLat_scgc)); + di_center_m_scgc = di_center_m_scgc % abs(cos(magLat_scgc)); // edge is in-line with the j center - di_edge_m = di_edge_m % abs(cos(geoLat_scgc)); + di_edge_m = di_edge_m % abs(cos(magLat_scgc)); } // For a stretched grid, calculate some useful quantities: @@ -344,9 +344,9 @@ void Grid::calc_j_grid_spacing() { } // Dipole will have different scaling... - if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_) { - dj_center_m_scgc = dj_center_scgc % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); - dj_edge_m = dj_edge % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); + if (iGridShape_ == iDipole_) { + dj_center_m_scgc = magAlt_scgc % dj_center_scgc % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); + dj_edge_m = magAlt_scgc % dj_edge % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); } // For a stretched grid, calculate some useful quantities: diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index a4596c37..5b6d0579 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -441,10 +441,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // all distances, so far, are in units of planet radii, turn into meters. // Except for Q, leave that dimensionless. - magAlt_scgc *= planetRadius; - magAlt_Below *= planetRadius; + magAlt_scgc; + magAlt_Below; + magAlt_Corner; magP_scgc *= planetRadius; - magAlt_Corner *= planetRadius; magP_Corner *= planetRadius; magQ_Corner *= planetRadius; magQ_scgc *= planetRadius; @@ -454,7 +454,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { k_corner_scgc *= planetRadius; // Convert to geographic, rotating and (maybe) shifting the dipole grid. - std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc, + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc * planetRadius, planet); geoLon_scgc = llr[0]; @@ -464,7 +464,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { "Done dipole -> geographic transformations for the dipole grid centers."); std::vector llr_corner = mag_to_geo(magLon_Corner, magLat_Corner, - magAlt_Corner, planet); + magAlt_Corner * planetRadius, planet); geoLon_Corner = llr_corner[0]; geoLat_Corner = llr_corner[1]; geoAlt_Corner = llr_corner[2] - planetRadius; @@ -475,7 +475,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // fill_grid_radius uses radius of the planet & geo_alt // That would be redundant here since we already know the radius (magAlt) // This is NOT yet offset: to offset do magAlt + dipole_cnter_m - radius_scgc = magAlt_scgc; + radius_scgc = magAlt_scgc * planetRadius; radius2_scgc = radius_scgc % radius_scgc; radius2i_scgc = 1.0 / radius2_scgc; @@ -507,8 +507,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Generate mask for physicsl cells - isTooLowCell = find(magAlt_scgc < min_alt_re); - isPhysicalCell = find(magAlt_scgc > min_alt_re); + isTooLowCell = find(geoAlt_scgc < 0.0); + isPhysicalCell = find(geoAlt_scgc > 0.0); report.print(4, "Done altitude spacing for the dipole grid."); From 31040728cbda0da5462c50a3af7f5124ac086ec9 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 15:49:02 -0400 Subject: [PATCH 466/691] STY: Minor changes to dipole things --- include/grid.h | 2 +- src/init_mag_grid.cpp | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/include/grid.h b/include/grid.h index 23de18ab..122a8af1 100644 --- a/include/grid.h +++ b/include/grid.h @@ -331,6 +331,7 @@ class Grid bool IsLatLonGrid; bool IsCubeSphereGrid; + bool IsDipole; bool DoesTouchNorthPole; bool DoesTouchSouthPole; /// The processor to the East/Right/X+: @@ -435,7 +436,6 @@ class Grid bool HasBField; bool IsExperimental; bool IsMagGrid; - bool IsDipole = false; std::string gridType; int64_t nX, nLons; diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5b6d0579..3050565f 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -65,9 +65,6 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || (dipole_center[2] != 0.0)) { - if (iProc == 0) // only one error - report.error("Dipole center != 0, but that is not supported yet. Setting to 0!"); - dipole_center = {0.0, 0.0, 0.0}; } @@ -507,7 +504,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Generate mask for physicsl cells - isTooLowCell = find(geoAlt_scgc < 0.0); + isTooLowCell = find(geoAlt_scgc <= 0.0); isPhysicalCell = find(geoAlt_scgc > 0.0); report.print(4, "Done altitude spacing for the dipole grid."); From 70796dad7ae27d670491f4071f3c9c30772efaf4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 15:51:51 -0400 Subject: [PATCH 467/691] BUG: Fix dipole gradients! --- include/tools.h | 3 +++ src/dipole.cpp | 6 ++++++ src/grid_spacing.cpp | 15 ++++----------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/tools.h b/include/tools.h index 20b1948a..5c83ed34 100644 --- a/include/tools.h +++ b/include/tools.h @@ -293,5 +293,8 @@ std::vector indef_vector(arma_cube cube); // -------------------------------------------------------------------------- arma_vec sphere_to_cube(precision_t lon_in, precision_t lat_in); +// Used for dipole gradients & distances. +// Probably needs to be moved. +arma_cube delTheta(arma_cube magLat); #endif // INCLUDE_TOOLS_H_ diff --git a/src/dipole.cpp b/src/dipole.cpp index 2887e547..553da188 100644 --- a/src/dipole.cpp +++ b/src/dipole.cpp @@ -114,3 +114,9 @@ bfield_info_type get_dipole(precision_t lon, return bfield_info; } + +// This is the del value from (Swisdak, 2006) & others. Used in Dipole distance calc's. +// Note the cos->sin, since magLat is latitude, not colatitude. +arma_cube delTheta(arma_cube magLat) { + return (sqrt(3 * sin(magLat) % sin(magLat) + 1)); +} \ No newline at end of file diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 56142840..04ff6e12 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -34,13 +34,6 @@ void Grid::calc_dipole_grid_spacing(Planets planet) { report.print(3, "ending calc_grid_spacing"); } - -// This is the del value from (Swisdak, 2006) & others. Used in Dipole distance calc's. -// Note the cos->sin, since magLat is latitude, not colatitude. -inline arma_cube delTc(arma_cube theta) { - return (sqrt(3 * sin(theta) % sin(theta) + 1)); -} - // --------------------------------------- // Grid spacing for altitude: // --------------------------------------- @@ -155,8 +148,8 @@ void Grid::calc_k_grid_spacing() { } // This needs to be turned into a distance for the dipole: if (iGridShape_ == iDipole_){ - dk_center_m_scgc = pow(magAlt_scgc, 3) % dk_center_scgc / delTc(magLat_scgc); - dk_edge_m = pow(magAlt_scgc, 3) % dk_edge / delTc(magLat_scgc); + dk_center_m_scgc = pow(radius_scgc, 3) % dk_center_scgc / delTheta(magLat_scgc); + dk_edge_m = pow(radius_scgc, 3) % dk_edge / delTheta(magLat_scgc); } // For a stretched grid, calculate some useful quantities: @@ -345,8 +338,8 @@ void Grid::calc_j_grid_spacing() { // Dipole will have different scaling... if (iGridShape_ == iDipole_) { - dj_center_m_scgc = magAlt_scgc % dj_center_scgc % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); - dj_edge_m = magAlt_scgc % dj_edge % pow(sin(magLat_scgc), 3) / delTc(magLat_scgc); + dj_center_m_scgc = radius_scgc % dj_center_scgc % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc); + dj_edge_m = radius_scgc % dj_edge % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc); } // For a stretched grid, calculate some useful quantities: From 4abac089ba706055e5121754f4a32fc6139055e5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 16:57:45 -0400 Subject: [PATCH 468/691] STY: Use scale height func in chapman integrals --- src/calc_neutral_derived.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 541dbb77..1b1ea783 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -572,9 +572,7 @@ void Neutrals::calc_chapman(Grid grid) { for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].scale_height_scgc = - cKB * temperature_scgc / - (species[iSpecies].mass * grid.gravity_mag_scgc); + calc_scale_height(grid); xp3d = grid.radius_scgc / species[iSpecies].scale_height_scgc; y3d = sqrt(0.5 * xp3d) % abs(grid.cos_sza_scgc); From fd13016585c3885a79698e19d45611ecc06f15c2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 17:20:27 -0400 Subject: [PATCH 469/691] FEAT: Add cube with boolean "UseThisCell" for dipole grid. default=true --- include/grid.h | 1 + src/grid.cpp | 3 +++ src/init_mag_grid.cpp | 1 + 3 files changed, 5 insertions(+) diff --git a/include/grid.h b/include/grid.h index 122a8af1..f421acd5 100644 --- a/include/grid.h +++ b/include/grid.h @@ -105,6 +105,7 @@ class Grid // Dipole grid has cells below the surface of earth. These variables hold masks // to either access those cells or ignore them (with .elem()). arma::uvec isTooLowCell, isPhysicalCell; + arma_cube UseThisCell; // (bool values whether altitude is valid) // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent diff --git a/src/grid.cpp b/src/grid.cpp index 3e99f8cc..89a4315b 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -270,6 +270,9 @@ Grid::Grid(std::string gridtype) { HasBField = 0; IsExperimental = false; + UseThisCell.set_size(nX, nY, nZ); + UseThisCell.fill(true); + cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); for (int i = 0; i < 3; i++) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 3050565f..778a952e 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -506,6 +506,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // Generate mask for physicsl cells isTooLowCell = find(geoAlt_scgc <= 0.0); isPhysicalCell = find(geoAlt_scgc > 0.0); + UseThisCell.elem(isTooLowCell).fill(false); report.print(4, "Done altitude spacing for the dipole grid."); From 6b5ba696d9ce9ee18549a778f2de01a36521fa1c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 19:25:17 -0400 Subject: [PATCH 470/691] SPEED: speed up calc_efield a tiny bit --- src/calc_ion_drift.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index ab1c6acb..ef3160cf 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -10,10 +10,7 @@ void Ions::calc_efield(Grid grid) { // efield = - grad(potential) - efield_vcgc = calc_gradient_vector(potential_scgc, grid); - - for (int64_t iComp = 0; iComp < 3; iComp++) - efield_vcgc[iComp] = -efield_vcgc[iComp]; + efield_vcgc = calc_gradient_vector(-1.0 * potential_scgc, grid); // Remove component along b-field (should be zero, anyways!) arma_cube edotb = dot_product(efield_vcgc, grid.bfield_unit_vcgc); @@ -28,12 +25,16 @@ void Ions::calc_efield(Grid grid) { // -------------------------------------------------------------------------- void Ions::calc_exb_drift(Grid grid) { + std::string function = "Ions::calc_exb"; + static int iFunction = -1; + report.enter(function, iFunction); arma_cube bmag2 = (grid.bfield_mag_scgc) % (grid.bfield_mag_scgc); exb_vcgc = cross_product(efield_vcgc, grid.bfield_vcgc); for (int64_t iComp = 0; iComp < 3; iComp++) exb_vcgc[iComp] = exb_vcgc[iComp] / bmag2; + report.exit(function); } // -------------------------------------------------------------------------- @@ -42,6 +43,10 @@ void Ions::calc_exb_drift(Grid grid) { std::vector Ions::calc_ion_electron_pressure_gradient(int64_t iIon, Grid grid) { + + std::string function = "Ions::elec_ion_pressure_gradient"; + static int iFunction = -1; + report.enter(function, iFunction); std::vector pressure_gradient_vcgc; arma_cube total_pressure_scgc; @@ -57,6 +62,7 @@ std::vector Ions::calc_ion_electron_pressure_gradient(int64_t iIon, cKB; pressure_gradient_vcgc = calc_gradient_vector(total_pressure_scgc, grid); + report.exit(function); return pressure_gradient_vcgc; } From 218c7a56ffe96a981bfb8f036645e8ca22bf3636 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 19:28:53 -0400 Subject: [PATCH 471/691] STY: remove std namespace from init_mag_grid --- src/init_mag_grid.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 778a952e..4cfdfd08 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -87,10 +87,9 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, // ---------------------------------------------------------------------- bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { - using namespace std; bool DidWork = true; - string function = "Grid::init_dipole_grid"; + std::string function = "Grid::init_dipole_grid"; static int iFunction = -1; report.enter(function, iFunction); @@ -514,11 +513,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { fill_grid_bfield(planet); report.print(4, "Done filling dipole grid with b-field!"); - - // put back into altitude. we've been carrying around radius: - // magAlt_scgc = magAlt_scgc - planetRadius; - // this breaks things more??? - report.exit(function); return DidWork; } From a4724ffd31266920ca9a93751abaffb3fb0ae365 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 7 Apr 2025 19:35:40 -0400 Subject: [PATCH 472/691] STY/Bugs: Get chapman integrals working on dipole, clean up code a bit. --- src/calc_neutral_derived.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 1b1ea783..d6802d93 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -583,8 +583,8 @@ void Neutrals::calc_chapman(Grid grid) { species[iSpecies].density_scgc.slice(iAlt) % species[iSpecies].scale_height_scgc.slice(iAlt); - species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice( - iAlt) * species[iSpecies].mass; + species[iSpecies].rho_alt_int_scgc.slice(iAlt) = integral3d.slice(iAlt) + * species[iSpecies].mass; for (iAlt = nAlts - 2; iAlt >= 0; iAlt--) { // dr is used here instead of dalt, since we only want the radial integration, while @@ -619,14 +619,16 @@ void Neutrals::calc_chapman(Grid grid) { integral1d = integral3d.tube(iLon, iLat); log_int1d = log_int3d.tube(iLon, iLat); xp1d = xp3d.tube(iLon, iLat); - y1d = y3d.tube(iLon, iLat); + // y1d = y3d.tube(iLon, iLat); erfcy1d = erfcy3d.tube(iLon, iLat); radius1d = grid.radius_scgc.tube(iLon, iLat); - H1d = species[iSpecies].scale_height_scgc.tube(iLon, iLat); + // H1d = species[iSpecies].scale_height_scgc.tube(iLon, iLat); for (iAlt = nGCs; iAlt < nAlts; iAlt++) { + if (!grid.UseThisCell(iLon, iLat, iAlt)) + continue; // masks off cells below surface of earth, not the best implementation. // This is on the dayside: - if (sza1d(iAlt) < cPI / 2 || sza1d(iAlt) > 3 * cPI / 2) { + else if (sza1d(iAlt) < cPI / 2 || sza1d(iAlt) > 3 * cPI / 2) { species[iSpecies].chapman_scgc(iLon, iLat, iAlt) = integral1d(iAlt) * sqrt(0.5 * cPI * xp1d(iAlt)) * erfcy1d(iAlt); } else { From f97eb6f01a1e8785ea2f557c43bf521f8910f1db Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 13:09:58 -0400 Subject: [PATCH 473/691] DOC: add explainer on ninja builds, correct some info on installing & running --- doc/installation/dependencies.md | 17 +++++++----- doc/usage/running_aether.md | 46 ++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/doc/installation/dependencies.md b/doc/installation/dependencies.md index c02dcd5a..c0d41a6f 100644 --- a/doc/installation/dependencies.md +++ b/doc/installation/dependencies.md @@ -21,7 +21,7 @@ If a path is printed, `cmake` is installed. To check the version, run `cmake The layout of this page is as follows: - [Installing Dependencies](#installing-dependencies) - - [Install gcc](#install-gcc) + - [Install C++ Compiler](#install-gcc) - [Install cmake](#install-cmake) - [Install JSON libraries](#install-json-libraries) - [Install Armadillo (and boost)](#install-armadillo-and-boost) @@ -29,20 +29,23 @@ The layout of this page is as follows: ## Install gcc -This comes installed by default on Ubuntu. On MacOS this can be installed, for +On MacOS this can be installed, for example, using: ```bash sudo port install gcc11 ``` -> As development began, gcc11 was the latest version; there are newer versions -> of `gcc` available now (latest version is gcc14), which have not yet been -> validated. +On Ubuntu, `gcc` (the C-compiler) is pre-installed, but the C++ compiler is not. This +can be installed with (subsituting your machine's package manager command): + +``bash +sudo apt install g++ +``` ## Install cmake -Aether uses [CMake](https://cmake.org/) instead of `make`. If you don't have it +Aether uses [CMake](https://cmake.org/) instead of GNU make. If you don't have it installed, you need it. For MacOS, this can be installed with: @@ -57,7 +60,7 @@ For Ubuntu/Debian Linux: sudo apt install cmake ``` -This can be done on RedHat using yum also. +This can be done on RedHat using `yum` also. ## Install JSON libraries diff --git a/doc/usage/running_aether.md b/doc/usage/running_aether.md index af7a9260..2811afa6 100644 --- a/doc/usage/running_aether.md +++ b/doc/usage/running_aether.md @@ -18,17 +18,18 @@ cp -R share/run ./run.first_run This creates the directory where you will do your run. In that directory is a link to the aether executable and an input file called aether.json. -You can then run the executable from the directory you created. +You can then run the executable from the directory you created. This uses four cores, +which is the minimum for the dipole grid. ```bash cd run.first_run -./aether +mpirun -np 4 ./aether ``` You should see something like: ```bash -run.first_run% ./aether +run.first_run% mpirun -np 4 ./aether > Need to NOT adjust F10.7, but that isn't included yet!!! > Writing file : 3DALL_20110320_000000 > Writing file : 3DBFI_20110320_000000 @@ -59,6 +60,16 @@ The successful end of this will show a timing summary, similar to: timing_total (s) : 2.94398 ``` +### Running in 1D + +If you want to quickly run Aether to test if things are working, there are a few changes +that need to be made to run in one dimension. + +1. Change the input file's, `aether.json`, value for the neutral and ion grids **both** +to `"sphere"`. No number! +2. Run the code with `./aether`. This will not use MPI, however armadillo may use +multiple OpenMP processes for math, so be careful on cluster login nodes. + ## Output Files Aether outputs to a subdirectory called UA/output. At this time, all processors @@ -127,11 +138,36 @@ model. This file is in UA/inputs/defaults.json. This is a json file that sets all of the defaults within Aether. This file should never be modified! -### For Developers +## For Developers -Within Aether, the inputs.cpp file has a large handful of of get_ routines to +Within Aether, the inputs.cpp file has a large handful of of `get_` routines to get the values of the settings that the user has set. +To speedup builds, it can be faster to use Ninja instead of GNU make. Ninja +automatically parallelizes to fit your machine, can re-run cmake for small changes, and +has other small differences from GNU make. To use ninja for builds: + +1. Ensure it is installed. This can be done with conda or your system's package manager +(note on Ubuntu it is called "ninja-build) +2. Clear the GNU make build pecs from `build`. This is most easily done by removing the +`CMakeCache.txt` file, but you can remove the entire contents of the build directory. +3. Tell cmake to generate build scripts for Ninja. From `Aether/build/`, run: +`cmake -GNinja [any options] ../`. +4. Build with `ninja`. This will use as many cores asz your system has. + +The dfevelopment process can be further sped up since Ninja can change directories +before compiling. This is useful, for example, to not need to cd out of run when testing +changes. From `Aether/run/`, you can compile and run the code with the one-liner: + +```bash +ninja -C ../build && mpirun -np 4 ./aether +``` + +The `-C` flag specifies which directory to move to before building. Obviously, change it +if yours is different. When changing header files, Ninja often catches the change and +will re-run cmake automatically. If not, you will need to remove `CMakeCache.txt` and +re-run cmake (again using the `-GNinja` flag). + ## aether.json file The file aether.json is read in AFTER the defaults file and these settings From 90c576951bd9a52dbd3ebd603dafe4d960060a42 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 15:49:44 -0400 Subject: [PATCH 474/691] DOC: Improve dipole docs. add .ipynb with plots, etc. --- .gitignore | 1 + doc/internals/coordinates.md | 6 +- edu/examples/Dipole/MoreDipoleInfo.ipynb | 334 ++++++++++++++++++ edu/examples/Dipole/dipole.py | 8 +- .../Dipole/plots/ghost-cells-dipole.png | Bin 0 -> 101955 bytes .../Dipole/plots/order-of-cells-dipole.png | Bin 0 -> 109324 bytes .../Dipole/plots/q-p-dipole-global-plot.png | Bin 0 -> 71055 bytes 7 files changed, 343 insertions(+), 6 deletions(-) create mode 100644 edu/examples/Dipole/MoreDipoleInfo.ipynb create mode 100644 edu/examples/Dipole/plots/ghost-cells-dipole.png create mode 100644 edu/examples/Dipole/plots/order-of-cells-dipole.png create mode 100644 edu/examples/Dipole/plots/q-p-dipole-global-plot.png diff --git a/.gitignore b/.gitignore index 12bc3ad8..6c8fc705 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ doc/generated # Python extras __pycache__ +.ipynb_checkpoints # autogenerated files tags diff --git a/doc/internals/coordinates.md b/doc/internals/coordinates.md index 515857b2..d33d1984 100644 --- a/doc/internals/coordinates.md +++ b/doc/internals/coordinates.md @@ -21,7 +21,7 @@ ## Dipole Coordinates - Longitude (radians) - radians east of the meridian that contains the north magnetic pole and north rotation axis - P (meters) - Identifies the field line. This is the same as L-shell and is constant along wach field line. -- Q (dimensionless) - parameterizes the distance along the field line, related to magnetic latitude & radius. This varies along the field line, but the values are idential for all field lines within each node. q=0 at the equator, and approaches positive (negative) infinity as theta points towards the north (south) pole. +- Q (dimensionless) - parameterizes the distance along the field line, related to magnetic latitude & radius. This varies along the field line, but the values are idential for all field lines within each node. q=0 at the equator, and approaches positive (negative) infinity as theta points towards the north (south) pole. Thus, q values will be negative in the southern hemisphere and the change in q "upwards" will be negative in the northern hemisphere. See [../../edu/examples/Dipole](../../edu/examples/Dipole) for more information. ## More Dipole Coordinates - L-shell (Planetary Radii) - The distance from the planet's center at which the magnetic field encounters the dipole's equatorial plane @@ -29,7 +29,7 @@ - Invariant Latitude (radians) - angle between the dipole's equatorial plane and the point at which the field-line passes through a reference radius of the planet ([specified in the inputs](../internals/grid.md#inputs)). This is constant along the field-line and is related to the L-Shell. - Magnetic Local Time (hours) - Angle between the sun, the north magnetic pole, and the point. Explicitly, this is done in PSE XY coordinates, ignoring the Z coorinate. -> The dipole `(i,j,k)` coordinates are (magnetic longitude, magnetic latitude, radius). +> The dipole `(i,j,k)` coordinates are (magnetic longitude, p, q). # Coordinates in Aether @@ -53,7 +53,7 @@ For the (perfectly) spherical grid, the i-coordinate is longitude, the j-coordin For the Cubedsphere grid, the i-coordinate is RIGHT, the j-coodinate is UP, and the k-coordinate is radius. Each face of the cubedsphere has the same coordinate system, but only with reference to that face. This means that if each face is looked at independently, the lower left corner is at (about) i = -45, j = -45 deg, while the upper right corner is at i = +45, j = +45 deg. Radius is treated the same as in a spherical grid. -For the dipole coordinate system, the i-coordinate is magnetic longitude, the j-coordinate is magnetic latitude, and the k-coordinate is radius. The dipole is orthogonal to a dipolar magnetic field. +For the dipole coordinate system, the i-coordinate is magnetic longitude, the j-coordinate is L-shell, and the k-coordinate is Q: a dimensionless parameter, normalized to the planet radius, representing diatance along a magnetic field line. The dipole is orthogonal to a dipolar magnetic field. Should the official coordinates be in the native coordinates (which could be different for each system), or should the coordinates be in meters, such that when gradients are taken, they are in /m? diff --git a/edu/examples/Dipole/MoreDipoleInfo.ipynb b/edu/examples/Dipole/MoreDipoleInfo.ipynb new file mode 100644 index 00000000..7ff0ff7a --- /dev/null +++ b/edu/examples/Dipole/MoreDipoleInfo.ipynb @@ -0,0 +1,334 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "d3792d6f-1f9b-4364-a1a8-f5d37dabdf41", + "metadata": {}, + "outputs": [], + "source": [ + "import dipole # use the coordinate transforms from dipole.py\n", + "import numpy as np \n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.colors import LinearSegmentedColormap\n", + "\n", + "save_figs = True" + ] + }, + { + "cell_type": "markdown", + "id": "175f59e3-7801-4b34-ac69-1a91231b9786", + "metadata": {}, + "source": [ + "# Dipole Information continued\n", + "\n", + "This document has more information on the dipole coordinate system. Some things are impossible to convey in just words...\n", + "\n", + "\n", + "First, a primer on the dipole coordinates and some plots of how they look in 2D space:\n", + "\n", + "## Dipole (p,q) coordinates\n", + "\n", + "The magnetic coordinates in Aether are orthogonal to a dipolar magnetic field. The `p` coordinate is the same as L-shell, and `q` paramaterizes the displacement along the magnetic field line. In terms of radius and ***co***latitude, `p` and `q` are calculated as\n", + "\n", + "$$\n", + "p = \\frac{r}{\\sin^2{\\theta}}\n", + "\\tag{1}\n", + "$$\n", + "\n", + "$$\n", + "q = \\frac{\\cos{\\theta}}{r^2}\n", + "\\tag{2}\n", + "$$\n", + "\n", + "Here is a quick plot of `p` and `q` in 2D space:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "54ce013a-a7a3-4e5a-8fde-c15276486ee2", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAHqCAYAAADoACEeAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs/XucJEWZLo4/EZGZVdXdc78jw8AIw0VABVRQBF0RBFGEXdhFRLysq0e8ILuseDnePipn3eNlVxe8HH/4Wy8r56i4KoqgK4oLIo4iKAgqjDPCDAPDzHRPT3dXZUZ8/4hLRmZGZmX19PSt4vl8aqoyMzIyuqYr6+nnfd73JUIIAQ8PDw8PDw+PPgSd6QV4eHh4eHh4eMwUPBHy8PDw8PDw6Ft4IuTh4eHh4eHRt/BEyMPDw8PDw6Nv4YmQh4eHh4eHR9/CEyEPDw8PDw+PvoUnQh4eHh4eHh59C0+EPDw8PDw8PPoWQd2B4+PjaLfb+3MtHh4e8wxRFKHZbE7qXH/P8fDw6AWTvd/UIkLj4+NoLVgKxGM9X8DDw6N/sXr1ajz00EM935zGx8exonUI9mDbflqZh4fHfMNk7ze1iFC73QbiMYRHXwgSNkEoAyEMhFFQyuQ2ZSBURtr0a0IYwNLjVO+3zyEMhGX3U0pAKJFzEflaP1O9TYkaJ8dQCjOOEgLYY4gcB8DMLc+Rz0yNY9YjoEj3E5o5xtS5ANTY4rF0PMxrqo8TAqbWorcBgBK5jxICRiCfrW2zViCdh6rzMtv6vQMoCNTbYbahtyHHEsgYqXzv9Lh0W4MSa4w+lwBECEBwEMEBwQGzLdR2+iCCy8kqxhHBAW4ft+dNIDgHeALwBCJJ5HxcniN4Agj1zBO5L0nUcetcMw9P5+FqbTyBUGMFFxAJl68T/UgghLXNBXhibVvH5NLssfKBhMtzzDEhx3Ghlqf2JfL6XAggEWp58pg8ziGEHifSczhXz0JdSx0TAokQeirzmguBxNqWDwEu8vvktsiMzc6nzxkDx5e3PYx2u93zjandbmMPtuEyugUhWwjOAB5APlP1rB6CAZyJzD4gO4ZTocbZD5GbyxpD0znTuQQSBggKCCqPJQwQ1jyJvo56TpiA0HMROR5Iz+fqWVAhX9PsHJyqc6iQn0sqwChAmDCv5X1NgFAh74NEgBEBQvV4OVYfo3obAKFyLKXCfNYJBajZJ+R86jglAgRyv7yGMNejSMdTAjAi1H1DqPuFPE6hxiA9jxABZvZzeQ37OORcDDDb6TOXY4Vagz4m1DxCzk31cfUMAFQIQKg5hJpDCFDBzTiit7kAFZCv9TxCgHA5Vs9H1bYcL88japtBjeciHcutfVyAqXukPkc/9BiW6LHqupxDfYjVa30/FOkzACTqtf0s7G31MPPlnhNrG7DOcRx37nfsS+y57GMc2ZtO7pgeH6fHhrnA2m3bJnW/qR0ak7+FIQiLUhLDWJbUZIhQcUyWNLnHuIiQIS+VRKhiTBURyhGglAjZ20UixMqIULcHsYhOjgixLkQo3c4TIVLYlu+dmwiRPBEi1URIc6HeiVCWBIGXESEHWXISoRyZKRChRBEgFxFKiufm53ERIZvAqNc8KR7LECFeRoSS3Dw5IqRJFRUQlJsvR0E5OBcQ6ouFEw5B5DYn6hwIZP4lRG0JCEHAhZCEqYQImWcoQgT7dfGZO/Yjv28Kuhg2sBAhWQhOkD6o69GFCOWIknufezudS4AoIqRfQxEhQqG2JYkhmuAoIgQmACpJGyCJDxTBEZro6HnUMUL1vAKCpsf0Pv0a0PtT8kMtIkQdREgTmywREmouSVpYGREiKRGitYmQGtOFCNGuRChHdiqIEC0lQjxDhEhNIsR47lgJEWKlRIjL+WsSIUN2qogQt4hH5nWO9ABuIpR/LiM+leSFqP3WMxXqL3TrOeHyi4OI7DOA9GZh3zT0H8gABLGe1Wuivoj0c+bc3uDN0h4eHh4eHh59C0+EPDw8PDw8PPoWngh5eHh4eHh49C08EfLw8PDw8PDoW3gi5OHh4eHh4dG38ETIw8PDw8PDo2/hiZCHh4eHh4dH38ITIQ8PDw8PD4++hSdCHh4eHh4eHn0LT4Q8PDw8PDw8+haeCHl4eHh4eHj0LTwR8vDw8PDw8OhbeCLk4eHh4eHh0bfwRMjDw8PDw8OjbxH0NDrpQFAGCAZwBggqt81D8Sr9mjAIzkCofIAyEErNNqEMhDAQlt0PSkAoAQAQQiAoASFyn1DPhKr9VI+B3E/kGD0HNeeqpan9hKTHBCXguYegAKcECSVghIJRkj7UuQDA9JjcsXQ8zGuqjxMCptaitwGAErmPEgJGIJ+tbaK3gXQeqs7LbOv3DqAgUG+H2YbehhxLIBkxIcQal25rUGKN0ecSgAgBCA4iOCA4YLaF2k4fRHA5WcU4IjjA7eP2vAkE5wBPAJ5AJImcj8tzBE8AoZ55IvcliTpunWvm4ek8XK2NJxBqrOACIuHydaIfCYSwtrkAT6xt65hcmj1WPpBweY45JuQ4LtTy1L5EXp8LASRCLU8ek8c5hNDjRHoO5+pZAJyDc/maC4FECD2Vec2FQGJty4cAF/l9cltkxmbn0+e0wXu6vbgwgWFwgeyDA5ykD0EATuT7xgFzVW4/hIDIzyMEzK8Ah3qPzK8EOBPgTM3F5HYib3sQVB5LGCCYAKdyTEKFvD3qZybkvYQJuV41nz5fjxNUqId6bfbJ2y2ogCDpPrB0vJ4PapsTAUKEvOdRAaKOgQKE6Nfy/5BQARA1l/qsEwoItY+queRryG3I/YLIuQkR4ESAIh1P1f+JvG8IEAAJkccp1BgIMGubmf1cXsM+DjkXA8x2+szlWKHWoI8JNY+Qc1N9XD0DABUCEGoOoeYQAlRwM47obS7UW8fTeYQA4XKsno+qbTlenkfUNoMaz0U6llv7uABT90h9jn7oMSzRY9V1OYf6EKvXUL/EIn0GgES9tp+Fva0eZr7cc2JtA9Y5juPO/Y59iT2Xfcz+mRwPUXwM78N9phYRiqIIq1evxrbf/Mc+XMrDw6PfsHr1akRR1PN5+p7ziW1rJZPpTP3a5hoE5HdcMtML8fCYpRgaGoJQpLQXEFHzrPHxcbTb7Z4vMNswPDyMtWvXYsuWLVi4cOFML2fOw7+fU4v59n5GUYRmszmpc2fjPWe+/f9MB/x71jv8e9Y79Hu2e/funt+z2qGxZrM56RvabMTChQv9L9gUwr+fUwv/fs7ue47//+kd/j3rHf49mx54s7SHh4eHh4dH38ITIQ8PDw8PD4++Rd8RoUajgfe+971oNBozvZR5Af9+Ti38+zm74f9/eod/z3qHf896x768Z7XN0h4eHh4eHh4e8w19pwh5eHh4eHh4eGh4IuTh4eHh4eHRt/BEyMPDw8PDw6Nv4YmQh4eHh4eHR99i3hOhnTt34uKLL8aiRYuwaNEiXHzxxdi1a1flOa961atkfzLrceKJJ07Pgmchrr76ahxyyCFoNps4/vjjceutt1aO//GPf4zjjz8ezWYT69evx6c//elpWuncQC/v5y233FL4XSSE4He/+900rtjjqquuwjOe8QwsWLAAK1euxMte9jLcf//9M72sOYWrrroKhBBcdtllM72UWY2HH34Yr3jFK7Bs2TIMDAzgaU97GjZu3DjTy5q1iOMY7373u3HIIYeg1Wph/fr1+MAHPgCue6LVwLwnQi9/+ctx11134cYbb8SNN96Iu+66CxdffHHX8170ohdh69at5vHd7353GlY7+3Ddddfhsssuw7ve9S786le/wnOf+1yceeaZ2Lx5s3P8Qw89hLPOOgvPfe5z8atf/QrvfOc78Za3vAVf//rXp3nlsxO9vp8a999/f+b38bDDDpumFXsAktxfeuml+NnPfoabb74ZcRzj9NNPx+jo6EwvbU7gzjvvxGc/+1kce+yxM72UWY2dO3fiOc95DsIwxPe+9z3ce++9+OhHP4rFixfP9NJmLf7pn/4Jn/70p/GpT30K9913Hz7ykY/gn//5n/HJT36y/iRiHuPee+8VAMTPfvYzs+/2228XAMTvfve70vMuueQScc4550zDCmc/nvnMZ4o3vOENmX1HHHGEuPLKK53j//Ef/1EcccQRmX2vf/3rxYknnrjf1jiX0Ov7+aMf/UgAEDt37pyG1XnUxfbt2wUA8eMf/3imlzLrMTIyIg477DBx8803i1NPPVW89a1vneklzVq8/e1vFyeffPJML2NO4cUvfrF4zWtek9l33nnniVe84hW155jXitDtt9+ORYsW4VnPepbZd+KJJ2LRokW47bbbKs+95ZZbsHLlSmzYsAGve93rsH379v293FmHdruNjRs34vTTT8/sP/3000vfv9tvv70w/owzzsAvfvELdDr93UJ8Mu+nxtOf/nSsWbMGL3jBC/CjH/1ofy7TowZ2794NAFi6dOkMr2T249JLL8WLX/xinHbaaTO9lFmPb33rWzjhhBNw/vnnY+XKlXj605+Oz33uczO9rFmNk08+GT/84Q/xwAMPAAB+/etf46c//SnOOuus2nPUbro6F7Ft2zasXLmysH/lypXYtm1b6Xlnnnkmzj//fKxbtw4PPfQQ/uf//J/4i7/4C2zcuLGvKn0+/vjjSJIEq1atyuxftWpV6fu3bds25/g4jvH4449jzZo1+229sx2TeT/XrFmDz372szj++OMxMTGBL37xi3jBC16AW265Baeccsp0LNsjByEELr/8cpx88sk4+uijZ3o5sxpf/epX8ctf/hJ33nnnTC9lTuDBBx/ENddcg8svvxzvfOc78fOf/xxvectb0Gg08MpXvnKmlzcr8fa3vx27d+/GEUccAcYYkiTBhz70IVx44YW155iTROh973sf3v/+91eO0R88QkjhmBDCuV/jr//6r83ro48+GieccALWrVuHG264Aeedd94kVz13kX+vur1/rvGu/f2KXt7Pww8/HIcffrjZPumkk7Blyxb87//9vz0RmiG86U1vwt13342f/vSnM72UWY0tW7bgrW99K2666SY0m82ZXs6cAOccJ5xwAj784Q8DkErwb3/7W1xzzTWeCJXguuuuw5e+9CV85StfwVOe8hTcdddduOyyy3DAAQfgkksuqTXHnCRCb3rTm/A3f/M3lWMOPvhg3H333Xj00UcLxx577LHCX+VVWLNmDdatW4ff//73Pa91LmP58uVgjBXUiu3bt5e+f6tXr3aOD4IAy5Yt229rnQuYzPvpwoknnogvfelLU708jxp485vfjG9961v4yU9+ggMPPHCmlzOrsXHjRmzfvh3HH3+82ZckCX7yk5/gU5/6FCYmJsAYm8EVzj6sWbMGRx11VGbfkUce6ZNNKnDFFVfgyiuvNJzgmGOOwZ/+9CdcddVV85sILV++HMuXL+867qSTTsLu3bvx85//HM985jMBAHfccQd2796NZz/72bWvt2PHDmzZsqXvwjpRFOH444/HzTffjHPPPdfsv/nmm3HOOec4zznppJPw7W9/O7PvpptuwgknnIAwDPfremc7JvN+uvCrX/2q734XZxpCCLz5zW/G9ddfj1tuuQWHHHLITC9p1uMFL3gB7rnnnsy+V7/61TjiiCPw9re/3ZMgB57znOcUyjI88MADWLdu3QytaPZj7969oDRrd2aM9ZQ+P6+zxoQQ4kUvepE49thjxe233y5uv/12ccwxx4izzz47M+bwww8X3/jGN4QQMsPh7//+78Vtt90mHnroIfGjH/1InHTSSeJJT3qSGB4enokfYUbx1a9+VYRhKD7/+c+Le++9V1x22WVicHBQbNq0SQghxJVXXikuvvhiM/7BBx8UAwMD4m1ve5u49957xec//3kRhqH42te+NlM/wqxCr+/nxz/+cXH99deLBx54QPzmN78RV155pQAgvv71r8/Uj9CX+B//43+IRYsWiVtuuUVs3brVPPbu3TvTS5tT8Flj1fj5z38ugiAQH/rQh8Tvf/978eUvf1kMDAyIL33pSzO9tFmLSy65RDzpSU8S3/nOd8RDDz0kvvGNb4jly5eLf/zHf6w9x7wnQjt27BAXXXSRWLBggViwYIG46KKLCqnIAMS1114rhBBi79694vTTTxcrVqwQYRiKgw46SFxyySVi8+bN07/4WYJ/+7d/E+vWrRNRFInjjjsukzJ8ySWXiFNPPTUz/pZbbhFPf/rTRRRF4uCDDxbXXHPNNK94dqOX9/Of/umfxJOf/GTRbDbFkiVLxMknnyxuuOGGGVh1fwOA86HvGx714IlQd3z7298WRx99tGg0GuKII44Qn/3sZ2d6SbMaw8PD4q1vfas46KCDRLPZFOvXrxfvete7xMTERO05iBDKyerh4eHh4eHh0WeY13WEPDw8PDw8PDyq4ImQh4eHh4eHR9/CEyEPDw8PDw+PvoUnQh4eHh4eHh59C0+EPDw8PDw8PPoWngh5eHh4eHh49C08EfLw8PDw8PDoW3gi5OHh4eHh4dG38ERoGrFp0yYQQnDXXXfN9FJwyimn4Ctf+UrlGEIIvvnNbwKYXWuvwhe+8AUsXrx4Sue85ZZbQAjBrl27pnReF/7hH/4Bb3nLW/b7dTz6G7Pp81znXmTjfe97H572tKftvwXNYjzvec/DZZddZrYPPvhgfOITnzDb9j17+/btWLFiBR5++OHpXeQcRN8RoS1btuC1r30tDjjgAERRhHXr1uGtb30rduzYMdNLmzZ85zvfwbZt20y33jpYu3Yttm7diqOPPno/rmzf8dd//dd44IEHZnoZk8Y//uM/4tprr8VDDz0000vxmCa86lWvAiEEhBCEYYj169fjH/7hHzA6OjrTS9vvcN2LDj74YPN+DAwM4Oijj8ZnPvOZGVylRJ6EVI3T64+iCE9+8pPxjne8AxMTE1O+pjvvvBN/93d/Z7a3bt2KM888EwCwcuVKXHzxxXjve9875dedb+grIvTggw/ihBNOwAMPPID/+I//wB/+8Ad8+tOfxg9/+EOcdNJJeOKJJ2Z6idOCf/3Xf8WrX/3qQsfeKjDGsHr1agRBsB9Xtu9otVpYuXLlTC9j0li5ciVOP/10fPrTn57ppXhMI170ohdh69atePDBB/HBD34QV199Nf7hH/5hppe131F2L/rABz6ArVu34u6778bLXvYyvOENb8B11103Q6vsHa973euwdetW/OEPf8BHPvIR/Nu//Rve9773Tfl1VqxYgYGBAbO9evVqNBoNs/3qV78aX/7yl7Fz584pv/Z8Ql8RoUsvvRRRFOGmm27CqaeeioMOOghnnnkmfvCDH+Dhhx/Gu971rtJzL7zwwoKC0ul0sHz5clx77bUAgBtvvBEnn3wyFi9ejGXLluHss8/GH//4x9I5XWGcb37zmyCEZPZ9+9vfxvHHH49ms4n169fj/e9/P+I4Nsff97734aCDDkKj0cABBxxQGVp5/PHH8YMf/AAvfelLM/t///vf45RTTkGz2cRRRx2Fm2++OXM8L6XrcNH3v/99PP3pT0er1cJf/MVfYPv27fje976HI488EgsXLsSFF16IvXv3mnmEEPjIRz6C9evXo9Vq4alPfSq+9rWvmeN63h/+8Ic44YQTMDAwgGc/+9m4//77zZhf//rXeP7zn48FCxZg4cKFOP744/GLX/yi9D295ppr8OQnPxlRFOHwww/HF7/4xcxxQgj+z//5Pzj33HMxMDCAww47DN/61rdK30MAuO2223DKKaeg1Wph7dq1eMtb3pL5C/7qq6/GYYcdhmaziVWrVuGv/uqvzLGvfe1rOOaYY9BqtbBs2TKcdtppmXNf+tKX4j/+4z8qr+8xv9BoNLB69WqsXbsWL3/5y3HRRReZEEce8/1eBAALFizA6tWrceihh+KDH/wgDjvssNL3484778QLX/hCLF++HIsWLcKpp56KX/7yl5kxdT7j9957L8466ywMDQ1h1apVuPjii/H4448DkKrdj3/8Y/zLv/yLUXs2bdpU+rMNDAxg9erVOOigg/CXf/mXeOELX4ibbrrJHN+xYwcuvPBCHHjggRgYGMAxxxxT+MyPjo7ila98JYaGhrBmzRp89KMfLVynKjQGAMcccwxWr16N66+/vnStHn1EhJ544gl8//vfxxvf+Ea0Wq3MsdWrV+Oiiy7Cddddh7IetBdddBG+9a1vYc+ePWbf97//fYyOjuIv//IvAchf3Msvvxx33nknfvjDH4JSinPPPRec80mv+/vf/z5e8YpX4C1veQvuvfdefOYzn8EXvvAFfOhDHwIgv1Q//vGP4zOf+Qx+//vf45vf/CaOOeaY0vl++tOfYmBgAEceeaTZxznHeeedB8YYfvazn+HTn/403v72t9da3/ve9z586lOfwm233YYtW7bgggsuwCc+8Ql85StfwQ033ICbb74Zn/zkJ834d7/73bj22mtxzTXX4Le//S3e9ra34RWveAV+/OMfZ+Z917vehY9+9KP4xS9+gSAI8JrXvMYcu+iii3DggQfizjvvxMaNG3HllVciDEPn+q6//nq89a1vxd///d/jN7/5DV7/+tfj1a9+NX70ox9lxr3//e/HBRdcgLvvvhtnnXUWLrroolKF8J577sEZZ5yB8847D3fffTeuu+46/PSnP8Wb3vQmAMAvfvELvOUtb8EHPvAB3H///bjxxhtxyimnAJDS9YUXXojXvOY1uO+++3DLLbfgvPPOy/zePfOZz8SWLVvwpz/9qdb/gcf8Q6vVQqfTcR6bz/eiMjSbzdL3Y2RkBJdccgluvfVW/OxnP8Nhhx2Gs846CyMjI5lxVZ/xrVu34tRTT8XTnvY0/OIXv8CNN96IRx99FBdccAEA4F/+5V9w0kknGaVn69atWLt2ba337de//jX++7//O3OPGh8fx/HHH4/vfOc7+M1vfoO/+7u/w8UXX4w77rjDjLniiivwox/9CNdffz1uuukm3HLLLdi4cWOta9p45jOfiVtvvbXn8/oKk2t8P/fws5/9TAAQ119/vfP4xz72MQFAPProo87j7XZbLF++XPz7v/+72XfhhReK888/v/Sa27dvFwDEPffcI4QQ4qGHHhIAxK9+9SshhBDXXnutWLRoUeac66+/Xtj/Lc997nPFhz/84cyYL37xi2LNmjVCCCE++tGPig0bNoh2u126Dhsf//jHxfr16zP7vv/97wvGmNiyZYvZ973vfS/zfuXX/qMf/UgAED/4wQ/MOVdddZUAIP74xz+afa9//evFGWecIYQQYs+ePaLZbIrbbrstc/3Xvva14sILLyyd94YbbhAAxNjYmBBCiAULFogvfOELzp8v/54++9nPFq973esyY84//3xx1llnmW0A4t3vfrfZ3rNnjyCEiO9973uZNe3cuVMIIcTFF18s/u7v/i4z56233ioopWJsbEx8/etfFwsXLhTDw8OF9W3cuFEAEJs2bXKuXwghdu/eLQCIW265pXSMx/zBJZdcIs455xyzfccdd4hly5aJCy64wDl+Pt+LhBBi3bp14uMf/7gQQohOpyOuvfZaAUBcffXVQggh3vve94qnPvWppfPGcSwWLFggvv3tb5t93T7j//N//k9x+umnZ+bZsmWLACDuv/9+IYQQp556qnjrW9/a9ec69dRTRRiGYnBwUERRJAAISqn42te+VnneWWedJf7+7/9eCCHEyMiIiKJIfPWrXzXHd+zYIVqtVmYN9nulf878d9zb3vY28bznPa/ruvsZfaMIdYNQf5FHUYTNmzdjaGjIPD784Q8jDEOcf/75+PKXvwxA/sX1n//5n7jooovMHH/84x/x8pe/HOvXr8fChQtxyCGHAAA2b9486XVt3LgRH/jABzLr0X+V7N27F+effz7Gxsawfv16vO51r8P111+fkarzGBsbQ7PZzOy77777cNBBB+HAAw80+0466aRa6zv22GPN61WrVmFgYADr16/P7Nu+fTsAKT2Pj4/jhS98Yebn+fd///eCbG/Pu2bNGgAw81x++eX427/9W5x22mn4X//rf1VK/vfddx+e85znZPY95znPwX333Vd6vcHBQSxYsMBcL4+NGzfiC1/4QuZnOOOMM8A5x0MPPYQXvvCFWLduHdavX4+LL74YX/7yl0148KlPfSpe8IIX4JhjjsH555+Pz33uc4X4vVYs7ZCix/zGd77zHQwNDaHZbOKkk07CKaecgk9+8pN9dy/SePvb346hoSG0Wi1ceumluOKKK/D617/eOXb79u14wxvegA0bNmDRokVYtGgR9uzZU/hZqz7jGzduxI9+9KPMz3bEEUcAQOX9pQwXXXQR7rrrLtx+++244IIL8JrXvMaodQCQJAk+9KEP4dhjj8WyZcswNDSEm266yaz5j3/8I9rtduY+vHTpUhx++OE9r6XVavl7SRfMbufrFOLQQw8FIQT33nsvXvaylxWO/+53v8OKFSuwePFiDA0NZdJKly5dCkD+cp966qnYvn07br75ZjSbTePQB4CXvOQlWLt2LT73uc/hgAMOAOccRx99NNrttnNNlNJCKC4v/3LO8f73vx/nnXde4fxms4m1a9fi/vvvx80334wf/OAHeOMb34h//ud/xo9//GNnuGj58uWFL978GgAUvAFlsK+hs17y82g5Xj/fcMMNeNKTnpQZZxv8XPPa57/vfe/Dy1/+ctxwww343ve+h/e+97346le/inPPPde5xvzPIoQo7Ktadx6cc7z+9a93+h8OOuggRFGEX/7yl7jllltw00034T3veQ/e97734c4778TixYtx880347bbbsNNN92ET37yk3jXu96FO+64w3xZabl+xYoVzut7zD88//nPxzXXXIMwDHHAAQeY38c4jvvqXqRxxRVX4FWvehUGBgawZs2ayvvRq171Kjz22GP4xCc+gXXr1qHRaOCkk04q/Kzd7k0veclL8E//9E+F+fUfYr1g0aJFOPTQQwEAX/rSl/CUpzwFn//85/Ha174WAPDRj34UH//4x/GJT3wCxxxzDAYHB3HZZZeZNbvuyZPFE0884e8lXdA3RGjZsmV44QtfiKuvvhpve9vbMj6hbdu24ctf/jIuvfRSAEAQBOaX2Mazn/1srF27Ftdddx2+973v4fzzz0cURQCk+e2+++7DZz7zGTz3uc8FIGPgVVixYgVGRkYwOjqKwcFBACjU9TjuuONw//33O9ej0Wq18NKXvhQvfelLcemll+KII47APffcg+OOO64w9ulPfzq2bduGnTt3YsmSJQCAo446Cps3b8YjjzyCAw44AABw++23V659MjjqqKPQaDSwefNmnHrqqfs014YNG7Bhwwa87W1vw4UXXohrr73WSYSOPPJI/PSnP8UrX/lKs++2226r5Usow3HHHYff/va3lf8nQRDgtNNOw2mnnYb3vve9WLx4Mf7rv/4L5513HggheM5znoPnPOc5eM973oN169bh+uuvx+WXXw4A+M1vfoMwDPGUpzxl0mv0mFsYHBx0/j71271IY/ny5ZXXsXHrrbfi6quvxllnnQVAlkjRJue6OO644/D1r38dBx98cGlmbBRFSJKkp3kBScDe+c534h3veAcuvPBCDAwM4NZbb8U555yDV7ziFQAkEfv9739v7kuHHnoowjDEz372Mxx00EEAgJ07d+KBBx7o+d75m9/8Bs973vN6Xnc/oW+IEAB86lOfwrOf/WycccYZ+OAHP4hDDjkEv/3tb3HFFVdgw4YNeM973lN5PiEEL3/5y/HpT38aDzzwQMZwu2TJEixbtgyf/exnsWbNGmzevBlXXnll5XzPetazMDAwgHe+851485vfjJ///Of4whe+kBnznve8B2effTbWrl2L888/H5RS3H333bjnnnvwwQ9+EF/4wheQJImZ64tf/CJarRbWrVvnvObTn/50rFixAv/93/+Ns88+GwBw2mmn4fDDD8crX/lKfPSjH8Xw8HBlBt1ksWDBAvzDP/wD3va2t4FzjpNPPhnDw8O47bbb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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# make r, theta\n", + "rs = np.linspace(.95, 2.5, num=100)\n", + "thetas = np.deg2rad(np.linspace(-88, 88, num=100))\n", + "# turn that into x,y for plotting\n", + "xs, ys = dipole.rt2xy(*np.meshgrid(rs, thetas.copy()))\n", + "qs, ps = dipole.rt2qp(*np.meshgrid(rs, thetas))\n", + "\n", + "# then the plotting:\n", + "fig, axs = plt.subplots(2,2,figsize=(6,5), sharey='row', height_ratios=[.05, 1])\n", + "\n", + "qc = axs[1,0].pcolor(xs, ys, qs, vmin = -0.8, vmax=0.8, cmap='RdBu_r')\n", + "fig.colorbar(qc, cax=axs[0,0], orientation='horizontal', label ='Q-values (dimensionless)')\n", + "\n", + "pc = axs[1,1].pcolor(xs, ys, ps, vmin = 1, vmax=8, cmap='rainbow')\n", + "fig.colorbar(pc, cax=axs[0,1], orientation='horizontal', label ='P-values (Planet Radii)')\n", + "\n", + "circle0 = plt.Circle((0, 0), 1, color='k', alpha = .7, zorder=-2)\n", + "axs[1, 0].add_patch(circle0)\n", + "axs[1, 0].set_xlim(-0.1, 2.6)\n", + "axs[1, 0].set_ylim(-2.6, 2.6)\n", + "axs[1, 0].set_aspect(1);\n", + "\n", + "circle1 = plt.Circle((0, 0), 1, color='k', alpha = .7, zorder=-2)\n", + "axs[1, 1].add_patch(circle1)\n", + "axs[1, 1].set_xlim(-0.1, 2.6)\n", + "axs[1, 1].set_ylim(-2.6, 2.6)\n", + "axs[1, 1].set_aspect(1);\n", + "\n", + "\n", + "plt.tight_layout()\n", + "\n", + "if save_figs:\n", + " fig.savefig('plots/q-p-dipole-global-plot.png')\n", + "\n", + "plt.show();" + ] + }, + { + "cell_type": "markdown", + "id": "29767ef6-0901-48fc-962c-ea57c44c2506", + "metadata": {}, + "source": [ + "In Aether, both p and q are stored as native coordinate for the dipole grid, normalized to the planet radius in meters.\n" + ] + }, + { + "cell_type": "markdown", + "id": "cc6301bc-92ed-432c-86f0-857ddaacecce", + "metadata": {}, + "source": [ + "## Aether's p,q Values\n", + "\n", + "First, let's get some dipole coordinates:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1a190f87-6708-43af-94c7-8cdbf6a2cacf", + "metadata": {}, + "outputs": [], + "source": [ + "# Use four blocks:\n", + "origins, extent = dipole.generate_sym_quadtree(4)\n", + "\n", + "# call dipole.main, which returns q & p\n", + "# These values are a bit unreasonable, but it makes the plots more clear.\n", + "qs, ps = dipole.main(alt_minRE=1.01, alt_maxRE=1.3,\n", + " lat_min=15, lat_max=80,\n", + " origins=origins, extent=extent, \n", + " nLatsPerBlock=14, nAltsPerBlock=18)\n", + "\n", + "# get cartesian & spherical coords:\n", + "rs = dipole.qp_solve(qs, ps) #radius\n", + "ts = np.rad2deg(dipole.rq2t(rs, qs)) #theta (magLat)\n", + "\n", + "xs, ys = dipole.qp2xy(qs, ps)\n", + "\n", + "# also want the altitude:\n", + "alts = dipole.r2alt(rs, 6371) #(in km)\n", + "\n", + "n_y = 14\n", + "n_z = 18" + ] + }, + { + "cell_type": "markdown", + "id": "7a8b44e8-896d-488b-baab-a37abbf00da2", + "metadata": {}, + "source": [ + "### Ghost Cells\n", + "\n", + "The dipole grid has 2 ghost cells in each block (or on each node), similar to the spherical grid.\n", + "\n", + "In the longitudinal direction, these behave as expected.\n", + "\n", + "The latitudinal ghost cells take one of two forms:\n", + "- If the node is touching the pole, the final field line is traced from 89$^\\circ$ magnetic latitude. This ghost cell will form a supercell.\n", + "- Othwerwise, nothing special happens and the final two field lines take the same step in invariant latitude as the rest. This means that boundaries between nodes will overlap. So the invariant latitudes of interior field lines will be identical, but the cell locations will not (since the q-values are different).\n", + "\n", + "The altitudinal ghost cells also take two forms:\n", + "- If the node is touching the equator, the last physical cell lies in the same hemisphere as the rest of the cells on that node. The two ghost cells in the altitudinal direction continue to take the same step in q as the previous, thus wrap over the magnetic equator. These ghost cells will line up with the ghost cells from the equator-most node on the opposite hemisphere.\n", + "- Othwerwise, the same step in q is taken and there is nothing special.\n", + "\n", + "\n", + "An image for clarity:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "7ae05677-85d0-48a6-b878-daabb15be856", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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OsaWxJrZ81ubpXqC+/XrZ9DD2L9/f1y+fBkajQapqakQiUTo27ev/nl/f3907NgRqampJveXkpKCt956C15eXvrH008/jdzcXFRUGJ87xcXFyM/PR58+ffTLhEIhevXqZbRut27dDL4PCQnBjRs3AACpqakIDw9HeHi4/vnOnTvD19dX39b58+fjqaeewrBhw/Dee+/hypVa578Zzpw5g6FDh5p87tSpU2CMoUOHDgbv/+DBg2a9llwux6xZszBy5EiMHz8eH330EXJzcxvdRkdCAZgQQsykUlUgYcdYxP0wFgWKNLO2KVCkIe6HsUjYMZYCmhnoGNteWlqaxcKvzsqVK5GWZt7PrynqCteMsTo/ltdqtVi2bBnOnDmjf/z999+4fPkyJLrqDybU3p+p1xaLxUbbaG/PIFdXm2ouX7p0KS5cuICxY8fi999/R+fOnbFjx44622SKVCqt8zmtVguhUIiUlBSD95+amoqPPvrIrP2vXbsWR44cQWxsLL777jt06NABR48ebVQbHQkFYAfWAqrKENKilJbnIrs0F3kVhYjfMaHBgFagSEP8jgnIqyhEdmkuSsudu8fEFugY217Hjh2xYMECi+5zwYIF6NixY7P2UTtcHT16FNHR0RAKhejcuTPUajWOHTumf/7WrVv4559/EBMTY3J/PXv2RFpaGtq3b2/0EJio9ODj44OgoCAcP35cv0yj0eD06dONeh+dO3dGZmYmsrKy9MsuXryI4uJig7Z26NAB8+bNw759+zBx4kSsXbsWAODm5gaNRtPg63Tr1g0HDhww+VyPHj2g0Whw48YNo/ceHBxs9nvp0aMH4uPjkZycjC5dumDTpk0Nb+SgYYYCsINKTgYmT+a/EkIcg9y3HZY/9BOCPfwaDGg1g1mwhx+WP/QT5L7tbNxi50PH2PY4jsP7779vsRC8YMECi5REy8rKwvz585GWlobNmzfj448/xssvvwwAiI6OxoQJE/D000/jr7/+wtmzZzF9+nS0bt0aEyZMMLm/N998E+vXr9f3tqampuK7777D66+/XmcbXnzxRSxfvhw//fQT0tLS8PLLL6OwsLBR723YsGHo1q0bpk2bhlOnTuH48eOYOXMmBg8ejN69e6OyshIvvPACkpKSkJGRgcOHD+PEiRP6cBwZGYmysjIcOHAABQUFJodrAMCSJUuwefNmLFmy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KyuzP7979263n91jjz1GRo4c6XGOFAolMpGET3pTKBRKYGi1WowfPx7//e9/QQjB+PHjodVqXcadOXMGixcvxs8//wydTmev/BYVFSEvLw+FhYXo2bMnFAqF/TUDBgxwe8yePXva/52amgqA7QiQmZmJQ4cO4eDBg/ZKIsB+/W8wGNDY2IioqCif76miogKlpaW44YYbuJ0EDhw5cgTPPvssfv31V1RVVTm9/27dugl2HHfo9XqUlZVh8ODB9m0SiQT9+/e32yCOHz8Og8GAUaNGOb3WaDS62FkcaWpqcvrMAODEiROYPHmy07bBgwdj165d9se+PqfCwkJkZGQgJSXF/ryn60GpVKKxsdHjHCkUSmRCBTCFQrmiueeee+z+2FdeecXtmAkTJiAjIwOvv/460tLSYLVakZeXB6PRCID1n9o8rTZIG4+qDalUav+37TU2QWm1WvHcc8/h1ltvdXldW6HmCaVSyWkcVxoaGjB69GiMHj0ab731FhITE1FUVIQxY8bY338giEQil3NlMpl47cN2/j777DOkp6c7PSeXyz2+TqvVuixA8/S5tT2et8/J3fXgiaqqKiQmJnIaS6FQIgcqgCkUyhXN2LFj7UJuzJgxLs9XVlbixIkT2LBhA4YPHw4A+OGHH5zG5OTk4O2330Zzc7NdcP3yyy+859K3b18UFhZ69etKpVJYLBaPz8fGxqJ9+/b4+uuv7YvTAuHkyZPQ6XRYuXIlMjIyALi+N5lMBgBe52Ub13ZMYmIiysvLnUSjbeEgAMTHxyM1NRU///wzrr32WgCA2WzGoUOH0LdvXwBAt27dIJfLUVRUhBEjRnB+b3369MHx48edtnXr1g0///yz07a2j319Tjk5OSgqKsKlS5eQnJwMAB792seOHcPIkSM5z5lCoUQGVABTKJQrGrFYjBMnTtj/3ZaEhARoNBps3LgRqampKCoqwpNPPuk0Zvr06Vi0aBHuv/9+PPnkkygqKsKaNWsAgHMlEACeeeYZ3HzzzcjIyMDUqVMhEonw+++/4+jRo/aFWDZxO3ToUMjlciQkJLjs59lnn8WcOXOQlJSEcePGoa6uDj/++CMeeughj8duampyEp4A214tMzMTMpkML7/8MubMmYNjx4459fYFgKysLDAMg//973+46aaboFQqERMT43KM9u3b47vvvsPtt98OuVwOrVaLkSNH4vLly1i9ejWmTJmCXbt24YsvvkBcXJz9dY888ghWrlyJLl26IDc3Fy+++KJTz+HY2FgsWLAAjz32GKxWK4YNG4ba2lrs27cPMTExmDlzptv3PGbMGNx7772wWCz2z/7hhx/GkCFDsHr1akyaNAlfffWVk/2By+c0atQodOrUCTNnzsTq1atRV1dnXwTneD00Njbi0KFDeOGFFzx+LhQKJUIJn/2YQqFQ/MO2CM4TbRfB7d69m+Tm5hK5XE569uxJ9u7d67Kg6ccffyQ9e/YkMpmM9OvXj7zzzjsEADl58iQhxP1CsSNHjhAA5Ny5c/Ztu3btIkOGDCFKpZLExcWRAQMGkI0bN9qf37lzJ+ncuTORSCT2hWLuFpK99tprJDs7m0ilUpKamkoeeughj+93yZIlBIDLnxEjRhBCCHnnnXdI+/btiVwuJ4MHDyY7d+50WuBHCCFLly4lKSkphGEY+7lruwjup59+Ij179iRyuZw4/vp49dVXSUZGBomOjiZ33XUXWb58udMiOJPJRB555BESFxdHVCoVmT9/PrnrrrucPkOr1Ur++c9/2t9zYmIiGTNmDPn22289vm+z2UzS09PJrl27nLZv2rSJtGvXjiiVSjJhwgSyZs0ap0VwhPj+nE6cOEGGDh1KZDIZycnJIZ9++ikB4HSsd955h2RnZ3ucH4VCiVwYQjgYpigUCuUq4+2338bdd98NvV4vuC+XIhzr16/HJ598gi+//DKox/nxxx8xbNgwnD59Gp06dQLALox79NFHMX369KAem0KhCA+1QFAoFAqArVu3omPHjkhPT8dvv/2GhQsX4rbbbqPiN8K5//77UV1djbq6OkFT63bs2IGYmBh06dIFp0+fxiOPPIKhQ4faxW9FRQWmTJmCO+64Q7BjUiiU0EErwBQKhQJg9erVWL9+PcrLy5GamopJkyZh+fLlnFqXUf58bN26FcuWLUNxcTG0Wi1uvPFGrF27NiIjqykUCn+oAKZQKBQKhUKhXFXQKGQKhUKhUCgUylUFFcAUCoVCoVAolKsKKoApFAqFQqFQKFcVVABTKBQKhUKhUK4qqACmUCgUCoVCoVxVUAFMoVAoFAqFQrmqoAKYQqFQKBQKhXJVQQUwhUKhUCgUCuWqggpgCoVCoVAoFMpVxf8DmS+rNg++ihQAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1, 1, figsize=(8,6))\n", + "\n", + "for n in range(4):\n", + " axs.scatter(ts[n], alts[n], s=12)\n", + "\n", + "# Doing this manually (not looping) since each node is different:\n", + "# (interior) latitude ghost cells:\n", + "axs.scatter(0,-1000, marker='x', color='k', s=105, label='latitude ghost cells') # only to get label\n", + "axs.scatter(ts[0, -2:, :], alts[0, -2:, :], marker='x', alpha = 0.7, s=105, color='blue')\n", + "axs.scatter(ts[1, :2, :], alts[1, :2, :], marker='x', alpha = 0.7, s=105, color='orange')\n", + "axs.scatter(ts[2, -2:, :], alts[2, -2:, :], marker='x', alpha = 0.7, s=105, color='green')\n", + "axs.scatter(ts[3, :2, :], alts[3, :2, :], marker='x', alpha = 0.7, s=105, color='red')\n", + "\n", + "axs.scatter(0,-1000, marker='+', color='k', s=105, label='altitude ghost cells')\n", + "axs.scatter(ts[1, :, -2:], alts[1, :, -2:], marker='+', alpha = 0.7, s=125, color='orange')\n", + "axs.scatter(ts[2, :, -2:], alts[2, :, -2:], marker='+', alpha = 0.7, s=125, color='green')\n", + "\n", + "axs.scatter(0,-1000, marker='D', color='k', s=105, label='pole ghost cells')\n", + "axs.scatter(ts[0, :2, :], alts[0, :2, :], marker='D', alpha = 0.7, s=100, color='blue')\n", + "axs.scatter(ts[3, -2:, :], alts[3, -2:, :], marker='D', alpha = 0.7, s=100, color='red')\n", + "\n", + "axs.legend()\n", + "\n", + "axs.set_ylim(-100, 6000)\n", + "\n", + "fig.suptitle(\"Latitude & Altitude Ghost Cells\")\n", + "axs.set_xlabel(\"Magnetic Latitude (deg)\")\n", + "axs.set_ylabel(\"Altitude (km)\")\n", + "\n", + "if save_figs:\n", + " fig.savefig(\"plots/ghost-cells-dipole.png\")\n", + "\n", + "plt.show();" + ] + }, + { + "cell_type": "markdown", + "id": "34b944a0-ac97-4063-b89a-41d4e78da2da", + "metadata": {}, + "source": [ + "(The equator-most ghost cells are not shown)\n", + "\n", + "\n", + "### Order of points\n", + "\n", + "The order of points in the dipole grid is the same as the spherical grid. Most simply, the field lines are arranged in the order of increasing invariant latitude & from lowest to highest altitude.\n", + "\n", + "Where this gets complicated is that the actual values are not necessarily increasing. For example, the altitude of the ghost cells at the ends of field lines touching the equator is not increasing anymore, since the field lines begin curving back towards the center of the planet. Further, since q=0 at the equator the k-coordinate of all points in the southern hemisphere (grid cells with negative values of magnetic latitude) will have negative k-coordinates. \n", + "\n", + "To help illustrate this, here is a plot where the color of each point is its index along the j or k axis:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "42aa573f-d79a-400c-950d-b6259b4683d7", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzMAAAIVCAYAAADlKaEpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XecJEXd+PFPdffkzXu7lwMccBwHHFmS4hFEEAzAo4BKEFEU8CH4QzGACD4YUMEAIlEkiIqSMxw5HuGOi1zOYfPu5O6u+v0xs7M7O7OXl7vlvu/ndc/zbE13dfXsMjXfrqpvKWOMQQghhBBCCCEGGWtbN0AIIYQQQgghNocEM0IIIYQQQohBSYIZIYQQQgghxKAkwYwQQgghhBBiUJJgRgghhBBCCDEoSTAjhBBCCCGEGJQkmBFCCCGEEEIMShLMCCGEEEIIIQYlCWaEEEIIIYQQg5IEM0KI7cqdd96JUopp06ZttTqXLFmCUoo777yzUPazn/0MpdRWu8a28Nxzz3HAAQcQi8VQSvHggw9u0vkvvPACSileeOGFQtlZZ53FuHHjtmo7+yr3+9gebMrfxLhx4zjrrLMGtkF9lPvdbIt2CCHE9kSCGSHEDumb3/wmr7/++rZuxmYzxvDlL3+ZQCDAww8/zOuvv84RRxyxxfX+9Kc/5b///e9WaOHgM9j/JoQQYkfkbOsGCCHEtjBq1ChGjRq1rZux2VatWkVraytf+tKXOOqoo7ZavePHj99qdQ0WyWSSaDQ66P8mhBBiRyQjM0KI7d5ZZ51FRUUFCxYs4Pjjj6eiooLRo0dz6aWXkslkio5dtWoVX/7yl6msrKS6upqvfOUrrFmzpqTO/qYU3XvvvRxyyCFUVFRQUVHBPvvsw2233VZ0zLPPPstRRx1FVVUV0WiUww47jOeee67omKamJr71rW8xevRoQqEQDQ0NHHbYYTz77LMbvN9XXnmFo446isrKSqLRKIceeiiPPfZYUdu7v3T/4Ac/QCm1walhc+fO5bOf/SzRaJQhQ4Zw3nnn0dXVVXJcualMSikuuOACbr75ZnbbbTdCoRB77LEH//jHP0rOnzlzJl/4wheora0lHA6zzz778Le//W2D9wwwf/58Tj/9dBobGwmFQkycOJE///nPG3Vue3s755xzDnV1dVRUVPC5z32ORYsWoZTiZz/7WeG47t/7u+++yymnnEJtbW0hgCv3N+G6LpdddhnDhg0jGo1y+OGH89Zbb21UmwAymQw///nPmThxIuFwmPr6eqZMmcJrr71WOMYYw4033sg+++xDJBKhtraWU045hUWLFm30dbpprbnmmmuYMGECkUiEmpoa9t57b2644YZNrksIIQYDGZkRQgwKruvy+c9/nnPOOYdLL72Ul156iauvvprq6mquuOIKAFKpFEcffTSrVq3i2muvZbfdduOxxx7jK1/5ykZd44orruDqq6/mpJNO4tJLL6W6upqZM2eydOnSwjF33303Z5xxBl/4whf429/+RiAQ4Oabb+bYY4/lqaeeKoySfP3rX+fdd9/lF7/4Bbvtthvt7e28++67tLS0rLcNL774Iscccwx77703t912G6FQiBtvvJETTzyR++67j6985St885vfZPLkyZx00klceOGFnH766YRCoX7rXLt2LUcccQSBQIAbb7yRoUOHcs8993DBBRds1PsC8PDDDzN16lR+/vOfE4vFuPHGGznttNNwHIdTTjkFgHnz5nHooYfS2NjIH/7wB+rr67n77rs566yzWLt2LZdddlm/9c+ePZtDDz2UMWPG8Nvf/pZhw4bx1FNP8b3vfY/m5mauvPLKfs/VWnPiiScybdo0fvazn7Hffvvx+uuv89nPfrbfc0466SROPfVUzjvvPBKJRL/HnXvuudx11118//vf55hjjmHmzJmcdNJJZQPBvjzP47jjjuPll1/moosu4sgjj8TzPN544w2WLVvGoYceCsC3v/1t7rzzTr73ve/xq1/9itbWVn7+859z6KGHMn36dIYOHbrBa3X79a9/zc9+9jN+8pOf8KlPfQrXdZk7dy7t7e0bXYcQQgwqRgghtiN33HGHAczbb79dKDvzzDMNYP75z38WHXv88cebCRMmFH6+6aabDGAeeuihouPOPfdcA5g77rijUHbllVea3h+BixYtMrZtm69+9av9ti2RSJi6ujpz4oknFpX7vm8mT55sDjrooEJZRUWFueiiizbupns5+OCDTWNjo+nq6iqUeZ5n9txzTzNq1CijtTbGGLN48WIDmN/85jcbrPMHP/iBUUqZ999/v6j8mGOOMYCZOnVqoezMM880Y8eOLToOMJFIxKxZs6aoTbvvvrvZZZddCmWnnnqqCYVCZtmyZUXnH3fccSYajZr29vaitvf+fRx77LFm1KhRpqOjo+jcCy64wITDYdPa2trv/T322GMGMDfddFNR+bXXXmsAc+WVVxbKun/vV1xxRUk9ff8m5syZYwBz8cUXFx13zz33GMCceeaZ/bbJGGPuuusuA5hbbrml32Nef/11A5jf/va3ReXLly83kUjEXHbZZYWycr+bsWPHFrXjhBNOMPvss8962yWEEB8nMs1MCDEoKKU48cQTi8r23nvvolGTqVOnUllZyec///mi404//fQN1v/MM8/g+z7nn39+v8e89tprtLa2cuaZZ+J5XuGf1prPfvazvP3224Wn/AcddBB33nkn11xzDW+88Qau626wDYlEgjfffJNTTjmFioqKQrlt23z9619nxYoVzJs3b4P19DV16lQmTZrE5MmTi8o35n3pdtRRRxWNENi2zVe+8hUWLFjAihUrAHj++ec56qijGD16dNG5Z511Fslkst/F9el0mueee44vfelLRKPRovf2+OOPJ51O88Ybb/TbthdffBGAL3/5y0Xlp512Wr/nnHzyyeu/YXLvG8BXv/rVovIvf/nLOM6GJzY88cQThMNhvvGNb/R7zKOPPopSiq997WtF9z1s2DAmT55clGluYxx00EFMnz6d7373uzz11FN0dnZu0vlCCDHYSDAjhBgUotEo4XC4qCwUCpFOpws/t7S0lJ2SM2zYsA3W39TUBLDeBeBr164F4JRTTiEQCBT9+9WvfoUxhtbWVgDuv/9+zjzzTG699VYOOeQQ6urqOOOMM8qu3+nW1taGMYbhw4eXvDZixIjCPW6qlpaWsu/Bxrwv6zu2u6y7TS0tLZvV9paWFjzP449//GPJ+3r88ccD0Nzc3G/bWlpacByHurq6ovL1Tc8q185y9ULpvTuOQ319/QbPb2pqYsSIEVhW/13t2rVrMcYwdOjQknt/44031nvf5Vx++eVcd911vPHGGxx33HHU19dz1FFHbdVU50IIsT2RNTNCiI+N+vr6souz1xdAdGtoaABgxYoVJSML3YYMGQLAH//4Rw4++OCyx3R/gR4yZAjXX389119/PcuWLePhhx/mhz/8IevWrePJJ58se25tbS2WZbF69eqS11atWlXUhk1RX19f9j3YmPdlfcd2l3V/sa+vr9+sttfW1hZGn/obGdtpp536bVt9fT2e59Ha2loU0Kzv/jZmP5nu+1qzZg0jR44slHuet1FBZUNDA6+88gpa634DmiFDhqCU4uWXXy677ml9a6HKcRyHSy65hEsuuYT29naeffZZfvSjH3HssceyfPlyotHoJtUnhBDbOxmZEUJ8bEyZMoWuri4efvjhovJ77713g+d+5jOfwbZtbrrppn6POeyww6ipqWH27NkccMABZf8Fg8GS88aMGcMFF1zAMcccw7vvvttv/bFYjE984hP85z//IZVKFcq11tx9992MGjWK3XbbbYP30teUKVOYNWsW06dPLyrfmPel23PPPVcYmQLwfZ/777+f8ePHF0azjjrqKJ5//vlC8NLtrrvuIhqN9hsARqNRpkyZwnvvvcfee+9d9n1d30hI9/46999/f1F5uWxrm+LTn/40APfcc09R+T//+U88z9vg+ccddxzpdHq9m4OecMIJGGNYuXJl2fvea6+9Nrv9NTU1nHLKKZx//vm0trayZMmSza5LCCG2VzIyI4T42DjjjDP4/e9/zxlnnMEvfvELdt11Vx5//HGeeuqpDZ47btw4fvSjH3H11VeTSqU47bTTqK6uZvbs2TQ3N3PVVVdRUVHBH//4R84880xaW1s55ZRTaGxspKmpienTp9PU1MRNN91ER0cHU6ZM4fTTT2f33XensrKSt99+myeffJKTTjppve249tprOeaYY5gyZQrf//73CQaD3HjjjcycOZP77rtvo3eo7+2iiy7i9ttv53Of+xzXXHNNIZvZ3LlzN7qOIUOGcOSRR/LTn/60kM1s7ty5RQHDlVdeyaOPPsqUKVO44oorqKur45577uGxxx7j17/+NdXV1f3Wf8MNN3D44YfzyU9+ku985zuMGzeOrq4uFixYwCOPPMLzzz/f77mf/exnOeyww7j00kvp7Oxk//335/XXX+euu+4CWO80r/WZOHEiX/va17j++usJBAIcffTRzJw5k+uuu46qqqoNnn/aaadxxx13cN555zFv3jymTJmC1po333yTiRMncuqpp3LYYYfxrW99i7PPPptp06bxqU99ilgsxurVq3nllVfYa6+9+M53vrPRbT7xxBPZc889OeCAA2hoaGDp0qVcf/31jB07ll133XWz3gchhNiubdv8A0IIUay/bGaxWKzk2L7Zp4wxZsWKFebkk082FRUVprKy0px88snmtdde22A2s2533XWXOfDAA004HDYVFRVm3333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vn072rVrByD/Gte4uDgsWbKkXGOWNt7OnTsjPT0dBw4cQKdOnQAA+/fvR3p6Orp06VLq9d24cQOXLl2ySXoV5ePjgw4dOmD79u0YMmSIZf727dsxePBgp8t07twZ//3vf23mff/994iOjoa3t7fLYnNVvM4kJCS4dD+6iif3ratU5r4VEUydOhUbNmxAbGwsIiMjS1ymOuxjqjzMS8VzR14CmJuqmurwucncVEVV9hMHqpILFy5IQkKCvPHGG1KjRg1JSEiQhIQEyczMtPRp3ry5rF+/3jK9ePFiCQ4OlvXr10tSUpKMHDlSQkNDJSMjw+3xPv7449KmTRvZu3ev7N27Vx588EF58sknbfpYx5uZmSl//OMfZc+ePZKcnCwxMTHSuXNnadCggcvj/eqrr8Tb21s++eQTOX78uMyYMUMCAgLk/PnzIiIyd+5cGTNmjKX/uXPnxN/fX2bOnCnHjx+XTz75RLy9veXrr792aVyuive9996TDRs2yOnTp+Wnn36SuXPnCgBZt26d22PNzMy0HJsA5N1335WEhAS5cOGC01g9vW/LGq8n962IyB/+8AcJDg6W2NhYSUlJsfzcuXPH0qeq7WOqvpiXXIu5yX2Ym9yLuan07utiZty4cQLA4ScmJsbSB4CsXr3aMm0ymWT+/PliMBhEr9dLjx49JCkpqVLivXHjhowePVoCAwMlMDBQRo8e7fDIQOt479y5I/369ZO6deuKt7e3NG7cWMaNGycXL150S3wfffSRhIeHi4+Pj7Rv397m8YHjxo2Tnj172vSPjY2Vdu3aiY+Pj0RERMiKFSvcEpcr4l2yZIk88MAD4uvrK7Vq1ZJu3brJli1bKiVO8+Mh7X/GjRvnNFYRz+7bssbryX0rIk5jtX/fV7V9TNUX85LrMTe5B3OTezE3lZ4iUnBnEBERERERkYbw0cxERERERKRJLGaIiIiIiEiTWMwQEREREZEmsZghIiIiIiJNYjFDRERERESaxGKGiIiIiIg0icUMERERERFpEosZIiIiIiLSJBYzRERERESkSSxmiIiIiIhIk1jMEBERERGRJrGYISIiIiIiTWIxQ0REREREmsRihoiIiIiINInFDBERERERaRKLGSIiIiIi0iQWM0REREREpEksZoiIiIiISJNYzBARERERkSaxmCEiIiIiIk1iMUNERERERJrEYoaI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WqZTUlJk4MCBotfrpXHjxvKPf/zD4YbUjIwMmTp1qoSFhYm3t7c0atRIRo8eLRcvXpSYmBjx8vKSXbt2WfpfuHBBgoODZfny5UXGevToUXn00UfF19dXateuLRMmTLDcAClSugcAiIicPn1ahgwZIjVr1hQ/Pz+JioqSGTNmWG7kLOm4EhE5f/68/Pa3v5WgoCDx9/eX6Oho2b9/v9N9KlK6G0FjY2OlS5cuotfrpWbNmtK/f3/LzbMlHTd8AABR1WOfW7788kuJiIgQvV4vnTt3lk2bNlXbHOXsAQATJ06UF198sdh95uwBAPYPURg8eLBl34jkP5imW7du4uPjI82aNZOtW7c6fGanpKTI2LFjJSQkRPR6vTRp0kQmTJgg6enpsmbNGgkICJDTp09b+h86dEh8fHxky5YtRcYaGxsrHTt2FB8fHzEYDDJnzhzJzc21tJfmc18k/4b+vn37So0aNSQgIEDatGkjb775pqW9NMfNkSNHpF+/fuLv7y+BgYHSvXt3OXv2rNN9KuKY151Zt26dPPTQQ+Lj4yMhISEydOhQS1tOTo78+c9/loiICPH29haDwSBDhgyRo0ePiggfAFBVKSJOLswkqiTLly/HN998g23btpWq/71799C0aVP861//QteuXd0cHRER3c/sc9S2bdswYMAAZGdnw8fHB9euXUNUVBQOHTqEyMhID0dLdH/iPTPkURMnTsStW7eQmZlZqr8EfeHCBcybN4+FDBERuZ11jrpz5w6++eYbNG3a1HIfUHJyMpYvX85ChsiDeGaGiIiIqAQdOnRAZmYmli9f7tJ7NomoYljMEBERERGRJvFpZkREREREpEksZoiIiIiISJNYzBARERERkSaxmCEiIiIiIk1iMUNERERERJrEYoaIiIiIiDSJxQwREREREWkSixkiIiIiItKk/w9dHBjownNqWwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axs = plt.subplots(1,2, figsize=(10,6))\n", + "\n", + "# The weird indexing and adding/subtracting just makes the plot look better\n", + "# Ignore some ghost cells, make colorbar clip extrema, etc.\n", + "\n", + "for i in range(4):\n", + " for j in range(n_y):\n", + " ax0 = axs[0].scatter(xs[i, j, :-2], ys[i, j, :-2], s=12, \n", + " c=range(n_z-2), vmin=0, vmax=n_z-3,\n", + " cmap='plasma') # distinct colormap\n", + "\n", + " for j in range(2, n_z-2):\n", + " ax1 = axs[1].scatter(xs[i, :, j], ys[i, :, j], s=12, \n", + " c=range(n_y), vmin=1, vmax=n_y-2, \n", + " zorder=4-i) # reverse order points are drawn in\n", + "\n", + "circle0 = plt.Circle((0, 0), 1, color='k', alpha = .7, zorder=0)\n", + "circle1 = plt.Circle((0, 0), 1, color='k', alpha = .7, zorder=0)\n", + "axs[0].add_patch(circle0)\n", + "axs[1].add_patch(circle1)\n", + "axs[0].set_aspect(1);\n", + "axs[1].set_aspect(1);\n", + "fig.colorbar(ax0, ax=axs[0], orientation='horizontal', label='altitude (k) index of each cell')\n", + "fig.colorbar(ax1, ax=axs[1], orientation='horizontal', label='latitude (j) index of each cell')\n", + "\n", + "fig.suptitle(\"Indices of dipole grid cells\")\n", + "\n", + "if save_figs:\n", + " fig.savefig(\"plots/order-of-cells-dipole.png\")\n", + " \n", + "plt.show();" + ] + }, + { + "cell_type": "markdown", + "id": "025f5263-732e-41f2-9a5d-fae07190afe3", + "metadata": {}, + "source": [ + "Since altitude is negative in the southern hemisphere and the k-coordinate is decreasing in the northern hemisphere, the sign of the d_k distances may not be intuitive. \n", + "\n", + "If there are any other questions, contact Aaron B and this file can be updated with more plots :)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2ca9881-8114-4b63-86ca-68b1575ea59d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:mypy]", + "language": "python", + "name": "conda-env-mypy-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index 71bd85f8..676a0b3e 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -111,10 +111,12 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, qs[:, iAlt] = ((q_min_center + (iAlt - nGCs + 0.5) * delQ)) # If we were in South hemisphere, multiply by -1 - # (and reverse so the points are ascending in q, same order as NH) + # And put data in the same order as we get back from Aether if isSouth: - qs = -1*np.flip(qs) - qcenters[n,:] = qs + qs = -1.0*qs + pcenters2d = np.flip(pcenters2d, axis=0) + + qcenters[n,:] = np.flip(qs, axis=1) pcenters[n,:] = pcenters2d return qcenters, pcenters diff --git a/edu/examples/Dipole/plots/ghost-cells-dipole.png b/edu/examples/Dipole/plots/ghost-cells-dipole.png new file mode 100644 index 0000000000000000000000000000000000000000..c77bd3e36baf1e2f3a77c954be150b2f0534e1cc GIT binary patch literal 101955 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

{+bVf$ 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 A>;M1& literal 0 HcmV?d00001 diff --git a/edu/examples/Dipole/plots/q-p-dipole-global-plot.png b/edu/examples/Dipole/plots/q-p-dipole-global-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..78fb175a49ea4bde2a9b0eaf8d71a3b3f4b90498 GIT binary patch literal 71055 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 Date: Tue, 8 Apr 2025 16:17:29 -0400 Subject: [PATCH 475/691] BUG: Fix units in dipole dk_*_meters --- src/grid_spacing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 04ff6e12..f1a46625 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -148,8 +148,8 @@ void Grid::calc_k_grid_spacing() { } // This needs to be turned into a distance for the dipole: if (iGridShape_ == iDipole_){ - dk_center_m_scgc = pow(radius_scgc, 3) % dk_center_scgc / delTheta(magLat_scgc); - dk_edge_m = pow(radius_scgc, 3) % dk_edge / delTheta(magLat_scgc); + dk_center_m_scgc = pow(magAlt_scgc, 3) % dk_center_scgc / delTheta(magLat_scgc); + dk_edge_m = pow(magAlt_scgc, 3) % dk_edge / delTheta(magLat_scgc); } // For a stretched grid, calculate some useful quantities: From 1f475791e8c99aad46a8f04154bafd310cb109ac Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 18:59:23 -0400 Subject: [PATCH 476/691] STY: Limits outputs from grid_match to high verbosity --- src/grid_match.cpp | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 25da6188..3a3d5775 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -3,8 +3,8 @@ #include "aether.h" -bool grid_match(Grid gGrid, - Grid mGrid, +bool grid_match(Grid gGrid, + Grid mGrid, Quadtree gQuadtree, Quadtree mQuadtree) { @@ -33,14 +33,16 @@ bool grid_match(Grid gGrid, norms = sphere_to_cube(lon, lat); iNode = gQuadtree.find_point(norms); } - std::cout << "lon, lat, node: " << lon*cRtoD << " " - << lat*cRtoD << " " - << norms(0) << " " - << norms(1) << " " - << norms(2) << " " - << iNode << "\n"; + if (report.test_verbose(6)) + std::cout << "lon, lat, node: " << lon*cRtoD << " " + << lat*cRtoD << " " + << norms(0) << " " + << norms(1) << " " + << norms(2) << " " + << iNode << "\n"; } } } + return true; } From f3e7f81f542767cd7be6a2da83dad0d09f0a462a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 21:16:28 -0400 Subject: [PATCH 477/691] BUG: Fix init_mag_grid gravity unit vector --- src/init_mag_grid.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 4cfdfd08..2612db20 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -437,9 +437,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // all distances, so far, are in units of planet radii, turn into meters. // Except for Q, leave that dimensionless. - magAlt_scgc; - magAlt_Below; - magAlt_Corner; magP_scgc *= planetRadius; magP_Corner *= planetRadius; magQ_Corner *= planetRadius; @@ -484,8 +481,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[iV].zeros(); } - rad_unit_vcgc[1] = cos(magLat_scgc) / pow(1 + 3 * sin(magLat_scgc), 0.5); - rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(1 + 3 * sin(magLat_scgc), 0.5); + rad_unit_vcgc[1] = cos(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), 0.5); + rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), 0.5); precision_t mu = planet.get_mu(); gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; @@ -506,7 +503,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { isTooLowCell = find(geoAlt_scgc <= 0.0); isPhysicalCell = find(geoAlt_scgc > 0.0); UseThisCell.elem(isTooLowCell).fill(false); - + report.print(4, "Done altitude spacing for the dipole grid."); // Calculate magnetic field and magnetic coordinates: From aae064fb9300259554a399044da53e3e6fd506f5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 21:18:26 -0400 Subject: [PATCH 478/691] BUG: Ensure dk is negative for the dipole grid. Dipole grid's dk's may not be decreasing --- src/grid_spacing.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index f1a46625..1a2fe168 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -148,6 +148,11 @@ void Grid::calc_k_grid_spacing() { } // This needs to be turned into a distance for the dipole: if (iGridShape_ == iDipole_){ + // the dk's may not be negative (like the sphere). make sure they are + // this gets rid of SO many errors... + dk_center_scgc = -1.0 * abs(dk_center_scgc); + dk_edge = -1.0 * abs(dk_edge); + dr_edge = -1.0 * abs(dr_edge); dk_center_m_scgc = pow(magAlt_scgc, 3) % dk_center_scgc / delTheta(magLat_scgc); dk_edge_m = pow(magAlt_scgc, 3) % dk_edge / delTheta(magLat_scgc); } From 2274a46abd7c48c8d4e8047185b51d060f034c94 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 8 Apr 2025 21:24:29 -0400 Subject: [PATCH 479/691] BUG: Remove need to do altitude gradient. use k only. change all d_alt_lower - dk_edge_m and d_alt_denter - dk_center_m --- src/calc_dt.cpp | 2 +- src/calc_ion_temperature.cpp | 4 ++-- src/grid_spacing.cpp | 2 +- src/ions_bcs.cpp | 2 +- src/neutrals_bcs.cpp | 4 ++-- src/neutrals_energy.cpp | 2 +- src/neutrals_momentum_viscosity.cpp | 2 +- src/solver_gradients.cpp | 5 ++--- src/solver_vertical_rusanov.cpp | 24 ++++++++++++------------ 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index dc51d5b4..f949532f 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -141,7 +141,7 @@ precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { precision_t dt; if (grid.get_nZ(false) > 1) { - arma_cube dtz = grid.dalt_center_scgc / cMax_vcgc[2]; + arma_cube dtz = grid.dk_center_m_scgc / cMax_vcgc[2]; dt = dtz.min(); } else dt = 1e32; diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 8db03280..0989c136 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -84,7 +84,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, lambda1d(1) = lambda1d(2); lambda1d(0) = lambda1d(2); front1d = 3.0 / 2.0 * cKB * density_scgc.tube(iLon, iLat); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + dalt1d = grid.dk_edge_m.tube(iLon, iLat); sources1d = (heating_neutral_friction_scgc.tube(iLon, iLat) + heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); sources1d = sources1d / front1d; @@ -122,7 +122,7 @@ void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, lambda1d(1) = lambda1d(2); lambda1d(0) = lambda1d(2); front1d = 3.0 / 2.0 * cKB * species[iIon].density_scgc.tube(iLon, iLat); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + dalt1d = grid.dk_edge_m.tube(iLon, iLat); sources1d = (species[iIon].heating_neutral_friction_scgc.tube(iLon, iLat) + species[iIon].heating_neutral_heat_transfer_scgc.tube(iLon, iLat)); sources1d = sources1d / front1d; diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 1a2fe168..943fd3cd 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -12,7 +12,7 @@ void Grid::calc_grid_spacing(Planets planet) { report.print(3, "starting calc_grid_spacing"); - calc_alt_grid_spacing(); + // calc_alt_grid_spacing(); calc_lat_grid_spacing(); calc_long_grid_spacing(); diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index 29d4cc89..c17757a7 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -91,7 +91,7 @@ bool Ions::set_upper_bcs(Grid grid) { species[iSpecies].temperature_scgc.slice(iAlt) / species[iSpecies].temperature_scgc.slice(iAlt - 1) % species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dalt_lower_scgc.slice(iAlt) / h); + exp(-grid.dk_edge_m.slice(iAlt) / h); species[iSpecies].velocity_vcgc[2].slice(iAlt).zeros(); } } diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index e9308e23..c4cab8fb 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -93,7 +93,7 @@ bool Neutrals::set_upper_bcs(Grid grid) { h = species[iSpecies].scale_height_scgc.slice(iAlt); species[iSpecies].density_scgc.slice(iAlt) = species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dalt_lower_scgc.slice(iAlt) / h); + exp(-grid.dk_edge_m.slice(iAlt) / h); } } @@ -216,7 +216,7 @@ bool Neutrals::set_lower_bcs(Grid grid, temperature_scgc.slice(iAlt + 1) / temperature_scgc.slice(iAlt) % species[iSpecies].density_scgc.slice(iAlt + 1) % - exp(grid.dalt_lower_scgc.slice(iAlt) / sh_ave); + exp(grid.dk_edge_m.slice(iAlt) / sh_ave); } for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index 893ab86e..7e812dd6 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -60,7 +60,7 @@ void Neutrals::update_temperature(Grid grid, Times time) { //temp1d = temp1d + dt * sources1d; //sources1d.zeros(); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + dalt1d = grid.dk_edge_m.tube(iLon, iLat); conduction1d.zeros(); conduction1d = solver_conduction(temp1d, diff --git a/src/neutrals_momentum_viscosity.cpp b/src/neutrals_momentum_viscosity.cpp index 4efaaaee..2baa68f3 100644 --- a/src/neutrals_momentum_viscosity.cpp +++ b/src/neutrals_momentum_viscosity.cpp @@ -64,7 +64,7 @@ void Neutrals::update_horizontal_velocity(Grid grid, Times time) { lambda1d = lambda3d.tube(iLon, iLat); rhor21d = rhor23d.tube(iLon, iLat); sources1d.zeros(); - dalt1d = grid.dalt_lower_scgc.tube(iLon, iLat); + dalt1d = grid.dk_edge_m.tube(iLon, iLat); visc1d.zeros(); visc1d = solver_conduction(vel1d, diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 464239cd..6773f30e 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -448,10 +448,9 @@ arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { grid.MeshCoef1s3rdp5.slice(iAlt) % value.slice(iAlt + 5); */ gradient = (value.slice(iAlt + 2) - value.slice(iAlt + 1)) / - grid.dalt_lower_scgc.slice(iAlt + 2); + grid.dk_edge_m.slice(iAlt + 2); - valueOut = value.slice(iAlt + 1) - gradient % grid.dalt_lower_scgc.slice( - iAlt + 1); + valueOut = value.slice(iAlt + 1) - gradient % grid.dk_edge_m.slice(iAlt + 1); return valueOut; } diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 8027cd94..50e376d8 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -36,12 +36,12 @@ void calc_facevalues_alts_rusanov(Grid &grid, // Only do calculation on physical cells for (iZ = nGCs; iZ < nZs - nGCs; iZ++) { - ida = 2.0 / grid.dalt_lower_scgc.slice(iZ + 1); + ida = 2.0 / grid.dk_edge_m.slice(iZ + 1); dVarUp = ida % (factor1 * (inVar.slice(iZ + 1) - inVar.slice(iZ)) - factor2 * (inVar.slice(iZ + 2) - inVar.slice(iZ - 1))); - ida = 2.0 / grid.dalt_lower_scgc.slice(iZ); + ida = 2.0 / grid.dk_edge_m.slice(iZ); dVarDown = ida % (factor1 * (inVar.slice(iZ) - inVar.slice(iZ - 1)) - factor2 * (inVar.slice(iZ + 1) - inVar.slice(iZ - 2))); @@ -55,9 +55,9 @@ void calc_facevalues_alts_rusanov(Grid &grid, // Ghostcell closest to the bottom physical cell: iZ = nGCs - 1; - ida = 1.0 / grid.dalt_lower_scgc.slice(iZ + 1); + ida = 1.0 / grid.dk_edge_m.slice(iZ + 1); dVarUp = ida % (inVar.slice(iZ + 1) - inVar.slice(iZ)); - ida = 1.0 / grid.dalt_lower_scgc.slice(iZ); + ida = 1.0 / grid.dk_edge_m.slice(iZ); dVarDown = ida % (inVar.slice(iZ) - inVar.slice(iZ - 1)); for (iX = nGCs; iX < nXs - nGCs; iX++) @@ -67,9 +67,9 @@ void calc_facevalues_alts_rusanov(Grid &grid, // Ghostcell closest to the top physical cell: iZ = nZs - nGCs; - ida = 1.0 / grid.dalt_lower_scgc.slice(iZ + 1); + ida = 1.0 / grid.dk_edge_m.slice(iZ + 1); dVarUp = ida % (inVar.slice(iZ + 1) - inVar.slice(iZ)); - ida = 1.0 / grid.dalt_lower_scgc.slice(iZ); + ida = 1.0 / grid.dk_edge_m.slice(iZ); dVarDown = ida % (inVar.slice(iZ) - inVar.slice(iZ - 1)); for (iX = nGCs; iX < nXs - nGCs; iX++) @@ -80,10 +80,10 @@ void calc_facevalues_alts_rusanov(Grid &grid, for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { outLeft.slice(iZ) = inVar.slice(iZ - 1) + - 0.5 * dVarLimited.slice(iZ - 1) % grid.dalt_lower_scgc.slice(iZ); + 0.5 * dVarLimited.slice(iZ - 1) % grid.dk_edge_m.slice(iZ); outRight.slice(iZ) = inVar.slice(iZ) - - 0.5 * dVarLimited.slice(iZ) % grid.dalt_lower_scgc.slice(iZ); + 0.5 * dVarLimited.slice(iZ) % grid.dk_edge_m.slice(iZ); } /* @@ -94,7 +94,7 @@ void calc_facevalues_alts_rusanov(Grid &grid, << inVar(7,19,19) << " " << inVar(7,19,20) << " " << dVarLimited(7,19,18) << " " - << grid.dalt_lower_scgc(7,19,17) << " " + << grid.dk_edge_m(7,19,17) << " " << outRight(7, 19, 17) << " " << outRight(7, 19, 18) << " " << outLeft(7, 19, 17) << " " @@ -142,7 +142,7 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, outGrad.slice(iZ) = 0.5 * (varLeft.slice(iZ + 1) + varRight.slice(iZ + 1) - varLeft.slice(iZ) - varRight.slice(iZ)) / - grid.dalt_center_scgc.slice(iZ); + grid.dk_center_m_scgc.slice(iZ); /* if (iProc == 11) @@ -151,7 +151,7 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, << varLeft(7, 19, 18) << " " << varRight(7, 19, 17) << " " << varRight(7, 19, 18) << " " - << grid.dalt_center_scgc(7, 19, 17) << " " + << grid.dk_edge_m(7, 19, 17) << " " << outGrad(7, 19, 17) << "\n"; */ for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { @@ -177,7 +177,7 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, for (iZ = nGCs; iZ < nZs - nGCs; iZ++) outDiff.slice(iZ) = (diffFlux.slice(iZ + 1) - diffFlux.slice(iZ)) / - grid.dalt_center_scgc.slice(iZ); + grid.dk_center_m_scgc.slice(iZ); report.exit(function); return; From 224a5d44e2da3ef5882641b32ff716a2ce7a1d30 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 9 Apr 2025 14:47:31 -0400 Subject: [PATCH 480/691] BUG: um, dk needs to be POSITIVE for dipole. nan_checks pass now --- src/grid_spacing.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 943fd3cd..1e88cc1c 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -148,11 +148,11 @@ void Grid::calc_k_grid_spacing() { } // This needs to be turned into a distance for the dipole: if (iGridShape_ == iDipole_){ - // the dk's may not be negative (like the sphere). make sure they are + // the dk's may be negative (not allowed). make sure they are positive // this gets rid of SO many errors... - dk_center_scgc = -1.0 * abs(dk_center_scgc); - dk_edge = -1.0 * abs(dk_edge); - dr_edge = -1.0 * abs(dr_edge); + dk_center_scgc = abs(dk_center_scgc); + dk_edge = abs(dk_edge); + dr_edge = abs(dr_edge); dk_center_m_scgc = pow(magAlt_scgc, 3) % dk_center_scgc / delTheta(magLat_scgc); dk_edge_m = pow(magAlt_scgc, 3) % dk_edge / delTheta(magLat_scgc); } From 7bb99ed767ff76a887b1d4f0db1dd164f27c2edf Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 9 Apr 2025 14:50:23 -0400 Subject: [PATCH 481/691] DOC: Update dipole ipynb w prev commit change --- edu/examples/Dipole/MoreDipoleInfo.ipynb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/edu/examples/Dipole/MoreDipoleInfo.ipynb b/edu/examples/Dipole/MoreDipoleInfo.ipynb index 7ff0ff7a..1e8b9ca1 100644 --- a/edu/examples/Dipole/MoreDipoleInfo.ipynb +++ b/edu/examples/Dipole/MoreDipoleInfo.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "d3792d6f-1f9b-4364-a1a8-f5d37dabdf41", "metadata": {}, "outputs": [], @@ -12,7 +12,7 @@ "import matplotlib.pyplot as plt\n", "from matplotlib.colors import LinearSegmentedColormap\n", "\n", - "save_figs = True" + "save_figs = False" ] }, { @@ -237,6 +237,8 @@ "\n", "Where this gets complicated is that the actual values are not necessarily increasing. For example, the altitude of the ghost cells at the ends of field lines touching the equator is not increasing anymore, since the field lines begin curving back towards the center of the planet. Further, since q=0 at the equator the k-coordinate of all points in the southern hemisphere (grid cells with negative values of magnetic latitude) will have negative k-coordinates. \n", "\n", + "The vertical solver does not like negative dk values, so all dk are made positive.\n", + "\n", "To help illustrate this, here is a plot where the color of each point is its index along the j or k axis:" ] }, @@ -296,7 +298,7 @@ "id": "025f5263-732e-41f2-9a5d-fae07190afe3", "metadata": {}, "source": [ - "Since altitude is negative in the southern hemisphere and the k-coordinate is decreasing in the northern hemisphere, the sign of the d_k distances may not be intuitive. \n", + "Since altitude is negative in the southern hemisphere and the k-coordinate is decreasing in the northern hemisphere, the actual sign of the d_k distances may not be intuitive. Internally, we take the absolute value of dk.\n", "\n", "If there are any other questions, contact Aaron B and this file can be updated with more plots :)" ] From d88cd134f8e06df84e19ccf4043b06dbde7df4ca Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 9 Apr 2025 14:52:59 -0400 Subject: [PATCH 482/691] FEAT: Remove need to do lat/lon gradients, instead we can use j&i --- src/calc_dt.cpp | 4 ++-- src/grid_spacing.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index f949532f..beb0de18 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -41,11 +41,11 @@ precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { arma_cube dtCube; // Longitudinal Direction: - dtCube = grid.dlon_center_dist_scgc / cMax_vcgc[0]; + dtCube = grid.di_center_m_scgc / cMax_vcgc[0]; dta(0) = dtCube.min(); // Latitudinal Direction: - dtCube = grid.dlat_center_dist_scgc / cMax_vcgc[1]; + dtCube = grid.dj_center_m_scgc / cMax_vcgc[1]; dta(1) = dtCube.min(); // Vertical Direction: diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index 1e88cc1c..d7fd245f 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -13,8 +13,8 @@ void Grid::calc_grid_spacing(Planets planet) { report.print(3, "starting calc_grid_spacing"); // calc_alt_grid_spacing(); - calc_lat_grid_spacing(); - calc_long_grid_spacing(); + // calc_lat_grid_spacing(); + // calc_long_grid_spacing(); calc_i_grid_spacing(); calc_j_grid_spacing(); From 0a3e91faba2b004c1b631805614cc27f9b70e564 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 9 Apr 2025 16:57:52 -0400 Subject: [PATCH 483/691] STY: Alter some verbosity when running --- src/exchange_messages.cpp | 14 +++++++------- src/main/main.cpp | 3 ++- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index bd5964ab..befbdb7f 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -966,7 +966,7 @@ bool exchange_one_var(Grid &grid, precision_t oneSign = 1.0; for (int iDir = 0; iDir < 4; iDir++) { - if (report.test_verbose(2)) + if (report.test_verbose(4)) std::cout << "packing one var : " << iDir << " " << iProc << " " << grid.interchangesOneVar[iDir].iProc_to << " " << grid.interchangesOneVar[iDir].iTag << "\n"; @@ -980,20 +980,20 @@ bool exchange_one_var(Grid &grid, // Current PE is the sender, so check if receiver exists: if (grid.interchangesOneVar[iDir].iProc_to > -1) { iP = 0; - report.print(2, "Packing Border"); + report.print(4, "Packing Border"); DidWork = pack_border(var_scgc, grid.interchangesOneVar[iDir].buffer, &iP, nG, iDir); - report.print(2, "Done Packing Border"); + report.print(4, "Done Packing Border"); } } // Send all faces asynchronously: for (int iDir = 0; iDir < 4; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { - report.print(2, "Sending one face"); + report.print(4, "Sending one face"); DidWork = grid.send_one_var_one_face(iDir); } } @@ -1001,7 +1001,7 @@ bool exchange_one_var(Grid &grid, // Receive all faces asynchronously: for (int iDir = 0; iDir < 4; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { - report.print(2, "Receiving one face"); + report.print(4, "Receiving one face"); DidWork = grid.receive_one_var_one_face(iDir); } } @@ -1016,7 +1016,7 @@ bool exchange_one_var(Grid &grid, for (int iDir = 0; iDir < 4; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { iP = 0; - report.print(2, "Unpacking Border"); + report.print(4, "Unpacking Border"); DidWork = unpack_border(var_to_pass, grid.interchangesOneVar[iDir].rbuffer, &iP, @@ -1025,7 +1025,7 @@ bool exchange_one_var(Grid &grid, grid.interchangesOneVar[iDir].DoReverseX, grid.interchangesOneVar[iDir].DoReverseY, grid.interchangesOneVar[iDir].XbecomesY); - report.print(2, "Done Unpacking Border"); + report.print(4, "Done Unpacking Border"); } } diff --git a/src/main/main.cpp b/src/main/main.cpp index eba6d868..64d25548 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -256,6 +256,8 @@ int main() { } // End of outer time loop - done with run! + report.report_errors(); + report.exit(function); report.times(); @@ -268,7 +270,6 @@ int main() { } } - // End parallel tasks: iErr = MPI_Finalize(); return iErr; From 03e521ea340b5ca55283dcb1f1cebd71d7ec432d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 9 Apr 2025 17:59:06 -0400 Subject: [PATCH 484/691] BUG: Gravity & b-field on dipole, fixed --- src/fill_grid.cpp | 30 +++++++++++++++++++++--------- src/init_mag_grid.cpp | 18 ++++++++++++------ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index deb2b181..11018b76 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -170,21 +170,18 @@ void Grid::fill_grid_bfield(Planets planet) { bfield_info = get_bfield(lon, lat, alt, DoDebug, planet); + // Magnetic coordinates: // init_mag grid already initializes magLon & magInvLat - // #TODO: make sure the bfield is correct for the dipole - // - maybe Dot product the B_vec with (ijk)_vec? - if (IsGeoGrid){ + if (IsGeoGrid) { magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; } - bfield_mag_scgc(iLon, iLat, iAlt) = 0.0; for (iDim = 0; iDim < 3; iDim++) { bfield_vcgc[iDim](iLon, iLat, iAlt) = bfield_info.b[iDim] * cNTtoT; - bfield_mag_scgc(iLon, iLat, iAlt) = - bfield_mag_scgc(iLon, iLat, iAlt) + - bfield_vcgc[iDim](iLon, iLat, iAlt) * bfield_vcgc[iDim](iLon, iLat, iAlt); + bfield_mag_scgc(iLon, iLat, iAlt) += pow(bfield_vcgc[iDim](iLon, iLat, iAlt), + 2); } bfield_mag_scgc(iLon, iLat, iAlt) = @@ -193,8 +190,23 @@ void Grid::fill_grid_bfield(Planets planet) { } } - for (iDim = 0; iDim < 3; iDim++) - bfield_unit_vcgc[iDim] = bfield_vcgc[iDim] / (bfield_mag_scgc + 1e-32); + // Now we modify the dipole's magnetic field to account for any imprecision. + // Take the bfield_mag and put it into the third component (b-hat = k-hat) + if (IsDipole) { + bfield_vcgc[2] = bfield_mag_scgc; + bfield_vcgc[1].zeros(); + bfield_vcgc[0].zeros(); + + bfield_unit_vcgc[0].zeros(); + bfield_unit_vcgc[1].zeros(); + bfield_unit_vcgc[2].ones(); + + bfield_unit_vcgc[2] % sign(magInvLat_scgc * -1.0); + + // slight complication - + } else + for (iDim = 0; iDim < 3; iDim++) + bfield_unit_vcgc[iDim] = bfield_vcgc[iDim] / (bfield_mag_scgc + 1e-32); int IsNorth = 1, IsSouth = 0; mag_pole_north_ll = get_magnetic_pole(IsNorth, planet); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 2612db20..c910dbd6 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -447,7 +447,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { k_corner_scgc *= planetRadius; // Convert to geographic, rotating and (maybe) shifting the dipole grid. - std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, magAlt_scgc * planetRadius, + std::vector llr = mag_to_geo(magLon_scgc, magLat_scgc, + magAlt_scgc * planetRadius, planet); geoLon_scgc = llr[0]; @@ -473,6 +474,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { radius2i_scgc = 1.0 / radius2_scgc; // Figure out what direction is radial: + // This is all in the dipole's i,j,k coordinate system... rad_unit_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); @@ -482,11 +484,12 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { } rad_unit_vcgc[1] = cos(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), 0.5); - rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), 0.5); + rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), + 0.5); precision_t mu = planet.get_mu(); - gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; - gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; + gravity_vcgc[1] = - mu * rad_unit_vcgc[1] % radius2i_scgc; + gravity_vcgc[2] = - mu * rad_unit_vcgc[2] % radius2i_scgc; gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); gravity_mag_scgc = sqrt( @@ -499,11 +502,14 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { calc_dipole_grid_spacing(planet); - // Generate mask for physicsl cells + ////////////////////////////////////// + // Generate mask for physicsl cells // + ////////////////////////////////////// + isTooLowCell = find(geoAlt_scgc <= 0.0); isPhysicalCell = find(geoAlt_scgc > 0.0); UseThisCell.elem(isTooLowCell).fill(false); - + report.print(4, "Done altitude spacing for the dipole grid."); // Calculate magnetic field and magnetic coordinates: From 18c674012df1472dc90a7efac9eedaae4c85d387 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 10 Apr 2025 11:58:14 -0400 Subject: [PATCH 485/691] FEAT: Create function to read armadillo cubes into Python. Contains instructions :) is debugged too, btw. LMK if you find issues though. --- srcPython/read_armadillo.py | 127 ++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 srcPython/read_armadillo.py diff --git a/srcPython/read_armadillo.py b/srcPython/read_armadillo.py new file mode 100644 index 00000000..03d45e81 --- /dev/null +++ b/srcPython/read_armadillo.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +Routines to read Armadillo objects +================================== + + +This is just a couple of functions which will read Armadillo exports into Python. +Directly exporting Armadillo cubes can be very useful during development and/or +debugging, but is not suitable for production runs. + +To export an Armadillo cube from Aether: +(substitute the cube name & file name. This does support multiple processors) + +grid.geoLon_scgc.save("geoLon_" + tostr(iProc, 3) + ".txt", arma_ascii)); + +Notes: +- tostr() is defined in src/tools.cpp of Aether & zero-pads an int to return a str. +- This will rewrite the existing file each time it is called. +- Output is to the same directory the executable is called from. +- This uses the arma_ascii format, which is way less efficient than HDF5 or binary. + I have found this format is the easiest to work with, but your mileage may vary. +- The several python armadillo implementations look abandoned and/or did not work for me. +- See the armadillo documentation for more information on saving cubes or other data types: + https://arma.sourceforge.net/docs.html#save_load_mat + +""" + +import numpy as np +from glob import glob +import os, errno + +def check_file_inputs(files): + """ Make sorted list of files (that exist) from a str or list + + Inputs + ------ + files (str or list) Can be list of files, single file, directory, or a pattern to glob + + Returns + ------- + list: sorted list of files that so indeed exist + + """ + print(type(files)) + if isinstance(files, str): # Probably need to glob + print(type(files)) + if "*" in files: # Definitely need to glob + files2read = np.sort(glob(files)) + elif os.path.isfile(files): + files2read = [files] # Single file needs to be made into list + elif os.path.isdir(files): + # We were given a directory. Read all .txt files without log in name + files_ = np.sort(glob(os.path.join(files, "*.txt"))) + files2read = [f for f in files_ if "log" not in f] + else: # pretty error message from stack overflow + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), *files) + + if len(files2read) == 0: + raise ValueError( + f"Could not find any armadillo cubes from '{files}'." + " Check path or provide files.\n") + + return files2read + + # Sort list & check if all files exist. error if not. + try: # attempt to handle anything listlike (np arrays, dict keys, etc.) + files2read = [f for f in np.sort(files) if os.path.isfile(f)] + if len(files2read) != len(files): + bad_files = [f for f in files if f not in files2read] + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), *bad_files) + + except: # Not expected types + raise TypeError("Need list or str. Could not handle type: " + type(files)) + + return files2read + + +def cube2np(files2read): + """ Read armadillo cubes from .txt files, automatically globs and/or input. + return np array of shape (nFiles, n_x, n_y, n_x) + + Inputs + ------ + files (str or list-like): either path to files or list of files. If it's a str, + the pattern is globbed & sorted, or the directory's .txt files are sorted. + If it's list-like, the list is sorted. + + Outputs + ------- + np.array of shape (nFiles, n_x, n_y, n_z) & dtype float. If we are only reading + one file, return shape is just (n_x, n_y, n_z) + + Usage + ----- + + lons = cube2np("../run/geolon_*.txt") + lons = cube2np(np.sort(glob.glob("../run/geolon_*.txt"))) + + """ + + # Sanitize input + files2read = check_file_inputs(files2read) + + out = [] # output holder + for thisf in files2read: + with open(thisf, 'r') as f: + _ = f.readline() # first line is a header, not needed + shape = f.readline().strip() # next line holds the shape of the cube + shape = shape.split(' ') + if len(shape) != 3: + raise ValueError( + f"File ({thisf}) does not appear to be an armadillo cube.\n" + f"Found shape: {shape}") + shape = np.array(shape, dtype=int) # convert shape to np array of int's + ls = np.zeros(shape) # holder for this file's outputs, dtype is float + for i in range(int(shape[0])): # n_x + for j in range(int(shape[2])): # n_z + # each line is n_y long. Convert it to a python list & retain it + l = f.readline().strip().replace(' ',',').split(',') + ls[i,:, j] = l # n_y + out.append(ls) # speed not a huge issue, work with lists + + # remove 0th dimension if we only are reading one file + if len(files2read) == 1: + out = out[0] + + return np.array(out) \ No newline at end of file From 58e2f21625eaade63549712c714b312a2b5c61a4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 14 Apr 2025 12:35:52 -0400 Subject: [PATCH 486/691] FEAT: Better handling of alt gc's. And add mat of first ghost cell. --- include/grid.h | 10 +++++++--- src/grid.cpp | 3 +++ src/init_geo_grid.cpp | 16 ++++++++++++++-- src/init_mag_grid.cpp | 15 +++++++++++++-- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/include/grid.h b/include/grid.h index f421acd5..f4ef10bb 100644 --- a/include/grid.h +++ b/include/grid.h @@ -102,10 +102,14 @@ class Grid arma_cube magQ_Corner; arma_cube magInvLat_Corner; - // Dipole grid has cells below the surface of earth. These variables hold masks - // to either access those cells or ignore them (with .elem()). + // Masks to either access the non-physical (ghost) cells, or ignore them - use with + // .elem()). Together they *should* hold the indices of all cells. arma::uvec isTooLowCell, isPhysicalCell; - arma_cube UseThisCell; // (bool values whether altitude is valid) + // (bool values whether altitude is valid) + arma_cube UseThisCell; + // Matrices whose elements denote the altitude index of the interiormost ghost cell + // in the k-up and k-down direction (altitude for geo grids, q for dipole). + arma_mat first_lower_gc, first_upper_gc; // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent diff --git a/src/grid.cpp b/src/grid.cpp index 89a4315b..e435fba7 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -12,6 +12,7 @@ Grid::Grid(std::string gridtype) { // At this point, we only need 2 ghostcells. Hardcode this: + // This is also (kinda?) set in sizes.h for the geo & mag grid independently nGCs = 2; Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); @@ -272,6 +273,8 @@ Grid::Grid(std::string gridtype) { UseThisCell.set_size(nX, nY, nZ); UseThisCell.fill(true); + first_lower_gc.set_size(nX, nY); + first_upper_gc.set_size(nX, nY); cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 7d3d611b..95138d5b 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -151,8 +151,20 @@ void Grid::create_altitudes(Planets planet) { } // All cells on the geographic grid *should* be ok - isTooLowCell = find(geoAlt_scgc < 0.0); - isPhysicalCell = find(geoAlt_scgc > 0.0); + isTooLowCell = find(geoAlt_scgc < grid_input.alt_min * cKMtoM); + isPhysicalCell = find(geoAlt_scgc >= grid_input.alt_min * cKMtoM); + // get the ghost cell indices on each lat/lon point. + // may be redundant can fill lower with nGCs-1, but this is here for now + arma::uvec theGCs; + for (iLon=0; iLon 0.0); + isTooLowCell = find(geoAlt_scgc < grid_input.alt_min * cKMtoM); + isPhysicalCell = find(geoAlt_scgc >= grid_input.alt_min * cKMtoM); UseThisCell.elem(isTooLowCell).fill(false); + arma::uvec theGCs; + for (iLon=0; iLon Date: Mon, 14 Apr 2025 18:22:05 -0400 Subject: [PATCH 487/691] FEAT: Add func to read armadillo mats --- srcPython/read_armadillo.py | 64 +++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/srcPython/read_armadillo.py b/srcPython/read_armadillo.py index 03d45e81..4c75c0b8 100644 --- a/srcPython/read_armadillo.py +++ b/srcPython/read_armadillo.py @@ -41,9 +41,8 @@ def check_file_inputs(files): list: sorted list of files that so indeed exist """ - print(type(files)) + if isinstance(files, str): # Probably need to glob - print(type(files)) if "*" in files: # Definitely need to glob files2read = np.sort(glob(files)) elif os.path.isfile(files): @@ -76,8 +75,8 @@ def check_file_inputs(files): def cube2np(files2read): - """ Read armadillo cubes from .txt files, automatically globs and/or input. - return np array of shape (nFiles, n_x, n_y, n_x) + """ Read armadillo cubes from .txt files, automatically globs input. + return np array of shape (nFiles, n_x, n_y, n_z) Inputs ------ @@ -118,10 +117,63 @@ def cube2np(files2read): # each line is n_y long. Convert it to a python list & retain it l = f.readline().strip().replace(' ',',').split(',') ls[i,:, j] = l # n_y - out.append(ls) # speed not a huge issue, work with lists + out.append(ls.T) # speed not a huge issue, work with lists + + # remove 0th dimension if we only are reading one file + if len(files2read) == 1: + out = out[0] + + return np.array(out) + + + + +def mat2np(files2read): + """ Read armadillo matrices from .txt files, automatically globs input. + return np array of shape (nFiles, n_x, n_y) + + Inputs + ------ + files (str or list-like): either path to files or list of files. If it's a str, + the pattern is globbed & sorted, or the directory's .txt files are sorted. + If it's list-like, the list is sorted. + + Outputs + ------- + np.array of shape (nFiles, n_x, n_y) & dtype float. If we are only reading + one file, return shape is just (n_x, n_y) + + Usage + ----- + + lons = mat2np("../run/geolon_*.txt") + lons = mat2np(np.sort(glob.glob("../run/geolon_*.txt"))) + + """ + + # Sanitize input + files2read = check_file_inputs(files2read) + + out = [] # output holder + for thisf in files2read: + with open(thisf, 'r') as f: + _ = f.readline() # first line is a header, not needed + shape = f.readline().strip() # next line holds the shape of the cube + shape = shape.split(' ') + if len(shape) != 2: + raise ValueError( + f"File ({thisf}) does not appear to be an armadillo matrix.\n" + f"Found shape: {shape}") + shape = np.array(shape, dtype=int) # convert shape to np array of int's + ls = np.zeros(shape) # holder for this file's outputs, dtype is float + for i in range(int(shape[0])): # n_x + # each line is n_y long. Convert it to a python list & retain it + l = f.readline().strip().replace(' ',',').split(',') + ls[i,:] = l # n_y + out.append(ls.T) # speed not a huge issue, work with lists # remove 0th dimension if we only are reading one file if len(files2read) == 1: out = out[0] - return np.array(out) \ No newline at end of file + return np.array(out) From 6bb4d6d60ada41ea57c08d740afcee410d2bb2f6 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 15 Apr 2025 13:38:26 -0400 Subject: [PATCH 488/691] bug??: Make sure the altitude limits & ghost cells on the dipole grid are correct --- src/init_mag_grid.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 5bb3d267..dcf1a288 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -121,7 +121,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t min_alt = grid_input.alt_min * cKMtoM; precision_t max_alt = grid_input.alt_max * cKMtoM; - // Normalize inputs to planet radius... (update when earth is oblate) + // Normalize inputs to planet radius... (update one day to support oblate Planet) // Here we are using the equatorial radius. precision_t planetRadius = planet.get_radius(0.0); // Altitude to begin modeling, normalized to planet radius @@ -281,10 +281,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // invLats are still all in North Hemisphere & increasing. // Use minimum p & alt to solve for q // q = sqrt((1-r/p)/r^4) - q_min = pow(((1 - max_alt_re / Pcenters(nGCs)) / pow(max_alt_re, 4.0)), 0.5); + q_min = pow(((1 - max_alt_re / Pcorners(0)) / pow(max_alt_re, 4.0)), 0.5); // Trace each field line up to q_max, obtained from the lowest field line in the block - precision_t q_max = pow(((1 - min_alt_re / Pcenters(nLats - nGCs)) / pow( + precision_t q_max = pow(((1 - min_alt_re / Pcorners(nLats -1)) / pow( min_alt_re, 4.0)), 0.5); @@ -302,8 +302,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { magQ_corner_1d(nAlts) = q_min + (nAlts - nGCs) * delQ; - report.print(3, - "Done generating points for magnetic grid. Plugging everything in"); + report.print(3, "Done generating points for magnetic grid. Plugging everything in"); //////////////////////////// // That is the grid made. // @@ -510,15 +509,20 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { isPhysicalCell = find(geoAlt_scgc >= grid_input.alt_min * cKMtoM); UseThisCell.elem(isTooLowCell).fill(false); - arma::uvec theGCs; for (iLon=0; iLon nAlts-nGCs-1){ + report.error("Invalid magnetic grid!! Either:"); + report.error(" - Lowest latitude field line is entirely below min_alt"); + report.error(" - Highest altitude field line is above min_alt"); + report.error("This should not happen. Something is terribly wrong. Goodbye."); + return false; + } first_upper_gc.fill(nAlts - nGCs * 2 - 1); report.print(4, "Done altitude spacing for the dipole grid."); From 94fcdea310342a830fd30ac5937d7a8b43d443dc Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 15 Apr 2025 18:20:17 -0400 Subject: [PATCH 489/691] FEAT: Get vertical neutral (lower) bc's working with new dipole grid --- src/advance.cpp | 4 +- src/neutrals_bcs.cpp | 157 +++++++++++++++++++++++-------------------- src/neutrals_ics.cpp | 22 +++--- 3 files changed, 98 insertions(+), 85 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index 023a73d5..c474636e 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -106,8 +106,8 @@ bool advance(Planets &planet, if (didWork) didWork = ions.set_bcs(gGrid, time, indices); - //if (didWork) - // didWork = neutralsMag.set_bcs(mGrid, time, indices); + if (didWork) + didWork = neutralsMag.set_bcs(mGrid, time, indices); didWork = neutralsMag.check_for_nonfinites("Ion Grid: set bcs"); diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index c4cab8fb..8f91fb7c 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -92,8 +92,8 @@ bool Neutrals::set_upper_bcs(Grid grid) { h = species[iSpecies].scale_height_scgc.slice(iAlt); species[iSpecies].density_scgc.slice(iAlt) = - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dk_edge_m.slice(iAlt) / h); + species[iSpecies].density_scgc.slice(iAlt - 1) % + exp(-grid.dk_edge_m.slice(iAlt) / h); } } @@ -118,6 +118,8 @@ bool Neutrals::set_lower_bcs(Grid grid, json bcs = input.get_boundary_condition_types(); int64_t nGCs = grid.get_nGCs(); int64_t iSpecies, iAlt, iDir; + int64_t nLats = grid.get_nLats(); + int64_t nLons = grid.get_nLons(); std::string bcsType = mklower(bcs["type"]); @@ -125,7 +127,10 @@ bool Neutrals::set_lower_bcs(Grid grid, // MSIS BCs - only works if FORTRAN is enabled! //----------------------------------------------- - if (bcsType == "msis") { + // ALB changes to lower BCs only really work now for dipole grid. Don't use msis + // if we are handed a dipole grid. + + if (bcsType == "msis" && !grid.IsDipole) { report.print(2, "Using MSIS for Boundary Conditions"); @@ -168,78 +173,84 @@ bool Neutrals::set_lower_bcs(Grid grid, std::cout << " Found in MSIS!\n"; species[iSpecies].density_scgc.slice(0) = - msis.get_mat(species[iSpecies].cName); + msis.get_mat(species[iSpecies].cName); } else { if (report.test_verbose(3)) std::cout << " NOT Found in MSIS - setting constant\n"; species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); } } } // type == Msis + precision_t sh_ave; + //----------------------------------------------- - // Planet BCs - set to fixed constant values. + // Fill the lower+ ghost cells //----------------------------------------------- + // - Planet BCs are in here too, can be refactored out + // - Dipole grid must use planet BCs, for now. + // - This kind-of assumes nGCs=2, so may need to be updated. + // - If the first_lower_gc is at iAlt = 1, this may cause issues. + // - The equator-most (j-hat) grid cell will be entirely below min_alt! + for (int iLon = nGCs; iLon < nLons - nGCs; iLon++) { + for (int iLat = nGCs; iLat < nLats - nGCs; iLat++) { + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - if (bcsType == "planet") { - - report.print(2, "setting lower bcs to planet"); - - // Set the lower boundary condition in the last ghost cell: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].density_scgc.slice(nGCs - 1). - fill(species[iSpecies].lower_bc_density); - } - - temperature_scgc.slice(nGCs - 1).fill(initial_temperatures[0]); - didWork = true; - } - - // fill the second+ grid cells with the bottom temperature: - for (iAlt = nGCs - 2; iAlt >= 0; iAlt--) - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); - - arma_mat sh_ave; - - // fill the lower ghost cells with a hydrostatic solution: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - for (iAlt = nGCs - 2; iAlt >= 0; iAlt--) { - sh_ave = - (species[iSpecies].scale_height_scgc.slice(iAlt) + - species[iSpecies].scale_height_scgc.slice(iAlt + 1)) / 2; - - species[iSpecies].density_scgc.slice(iAlt) = - temperature_scgc.slice(iAlt + 1) / - temperature_scgc.slice(iAlt) % - species[iSpecies].density_scgc.slice(iAlt + 1) % - exp(grid.dk_edge_m.slice(iAlt) / sh_ave); - } - - for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { - //std::cout << "before project : " << iAlt << " " << iSpecies << " " - // << species[iSpecies].velocity_vcgc[2](10,10,2) << "\n"; - species[iSpecies].velocity_vcgc[2].slice(iAlt) = - species[iSpecies].velocity_vcgc[2].slice(iAlt + 1); - //project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); + // k-index of 1st lower ghost cell is not constant on the dipole grid. + // On the latlon grid with nGCS=2, this will be 1 + iAlt = grid.first_lower_gc(iLon, iLat); + + //----------------------------------------------- + // Planet BCs - set to fixed constant values. + //----------------------------------------------- + if (bcsType == "planet" || grid.IsDipole) { + + // Fill all lower ghost cells density with lower boundary condition: + species[iSpecies].density_scgc.subcube(iLon, iLat, 0, + iLon, iLat, iAlt - 1).fill( + species[iSpecies].lower_bc_density); + // only fill 1st GC with lower temperature + temperature_scgc(iLon, iLat, iAlt) = initial_temperatures[0]; + } // planet bc type + + // Set all lower ghost cells to bottom temperature: + temperature_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( + temperature_scgc(iLon, iLat, iAlt)); + + + // 1st ghost cell density is filled with a hydrostatic solution. + sh_ave = (species[iSpecies].scale_height_scgc(iLon, iLat, iAlt) + + species[iSpecies].scale_height_scgc(iLon, iLat, iAlt + 1)) / 2; + + species[iSpecies].density_scgc(iLon, iLat, iAlt) = + temperature_scgc(iLon, iLat, iAlt + 1) + / temperature_scgc(iLon, iLat, iAlt) + * species[iSpecies].density_scgc(iLon, iLat, iAlt + 1) + * exp(-grid.dk_edge_m(iLon, iLat, iAlt) / sh_ave); + + // Vertical velocities: (In GITM this projected down with mesh coeffs) + // Take lowest physical cell's vertical velocity and project it down nGCs cells. + // All "GCs" lower than that have 0 vertical velocity since they're nonphysical. + species[iSpecies].velocity_vcgc[2].subcube( + iLon, iLat, iAlt - 1, size(1, 1, nGCs)).fill( + species[iSpecies].velocity_vcgc[2](iLon, iLat, iAlt + 1)); + //project_onesided_alt_3rd(species[iSpecies].velocity_vcgc[2], grid, iAlt); + + if (iAlt > nGCs - 1) { // Fill all lower GCs w/ zero vertical velocity + species[iSpecies].velocity_vcgc[2].subcube(iLon, iLat, 0, + size(1, 1, iAlt - 1)).zeros(); + + } + } } } - // Force vertical velocities to be zero in the ghost cells: - for (iDir = 0; iDir < 2; iDir++) { - for (iAlt = 0; iAlt < nGCs; iAlt++) { - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - // species velocity: - species[iSpecies].velocity_vcgc[iDir].slice(iAlt).zeros(); - } + didWork = true; - // bulk velocity: - //velocity_vcgc[iDir].slice(iAlt).zeros(); - } - } calc_bulk_velocity(); @@ -281,8 +292,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = 0; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX - 1, iY) - - temperature_scgc.tube(iX - 2, iY); + 2 * temperature_scgc.tube(iX - 1, iY) - + temperature_scgc.tube(iX - 2, iY); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -291,8 +302,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX - 1, iY) - - species[iSpecies].density_scgc.tube(iX - 2, iY); + 2 * species[iSpecies].density_scgc.tube(iX - 1, iY) - + species[iSpecies].density_scgc.tube(iX - 2, iY); } } } @@ -303,8 +314,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = 0; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX + 1, iY) - - temperature_scgc.tube(iX + 2, iY); + 2 * temperature_scgc.tube(iX + 1, iY) - + temperature_scgc.tube(iX + 2, iY); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -313,8 +324,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX + 1, iY) - - species[iSpecies].density_scgc.tube(iX + 2, iY); + 2 * species[iSpecies].density_scgc.tube(iX + 1, iY) - + species[iSpecies].density_scgc.tube(iX + 2, iY); } } } @@ -325,8 +336,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = nX - nGCs; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX, iY - 1) - - temperature_scgc.tube(iX, iY - 2); + 2 * temperature_scgc.tube(iX, iY - 1) - + temperature_scgc.tube(iX, iY - 2); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -335,8 +346,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX, iY - 1) - - species[iSpecies].density_scgc.tube(iX, iY - 2); + 2 * species[iSpecies].density_scgc.tube(iX, iY - 1) - + species[iSpecies].density_scgc.tube(iX, iY - 2); } } } @@ -347,8 +358,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = nGCs - 1; iY >= 0; iY--) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX, iY + 1) - - temperature_scgc.tube(iX, iY + 2); + 2 * temperature_scgc.tube(iX, iY + 1) - + temperature_scgc.tube(iX, iY + 2); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -357,8 +368,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX, iY + 1) - - species[iSpecies].density_scgc.tube(iX, iY + 2); + 2 * species[iSpecies].density_scgc.tube(iX, iY + 1) - + species[iSpecies].density_scgc.tube(iX, iY + 2); } } } diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 225eeb19..88bc01da 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -99,7 +99,7 @@ bool Neutrals::initial_conditions(Grid grid, std::cout << " NOT Found in MSIS - setting constant\n"; species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); fill_with_hydrostatic(iSpecies, 1, nAlts, grid); } @@ -129,8 +129,6 @@ bool Neutrals::initial_conditions(Grid grid, arma_vec alt1d(nAlts); arma_vec temp1d(nAlts); - arma_mat H2d(nLons, nLats); - if (nInitial_temps > 0) { for (iLon = 0; iLon < nLons; iLon++) { for (iLat = 0; iLat < nLats; iLat++) { @@ -155,7 +153,7 @@ bool Neutrals::initial_conditions(Grid grid, iA++; iA--; - // alt will be between iA and iA+1: + // alt will be between iA and iA+1 r = (alt - initial_altitudes[iA]) / (initial_altitudes[iA + 1] - initial_altitudes[iA]); temp1d[iAlt] = @@ -169,14 +167,18 @@ bool Neutrals::initial_conditions(Grid grid, } } } else - temp1d = 200.0; + temperature_scgc.fill(200.0); // Make the initial condition in the lower ghost cells to be consistent - // with the actual lowwer BC: - - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + // with the actual lower BC: + for (iLon = 0; iLon < nLons; iLon ++) { + for (iLat = 0; iLat < nLats; iLat++) { + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].density_scgc.subcube( + iLon, iLat, 0, iLon, iLat, grid.first_lower_gc(iLon, iLat)).fill( + species[iSpecies].lower_bc_density); + } + } } report.print(2, "Calculating scale height"); From 392dc09afaa3b61a01daa8250c7c0c5d6ad7a024 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 15 Apr 2025 19:26:33 -0400 Subject: [PATCH 490/691] BUG: ammend prev commit: IC's and BCs were missing some important cells. --- src/neutrals_bcs.cpp | 4 ++-- src/neutrals_ics.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 8f91fb7c..985594c6 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -196,8 +196,8 @@ bool Neutrals::set_lower_bcs(Grid grid, // - This kind-of assumes nGCs=2, so may need to be updated. // - If the first_lower_gc is at iAlt = 1, this may cause issues. // - The equator-most (j-hat) grid cell will be entirely below min_alt! - for (int iLon = nGCs; iLon < nLons - nGCs; iLon++) { - for (int iLat = nGCs; iLat < nLats - nGCs; iLat++) { + for (int iLon = 0; iLon < nLons; iLon++) { + for (int iLat = 0; iLat < nLats; iLat++) { for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { // k-index of 1st lower ghost cell is not constant on the dipole grid. diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 88bc01da..a1430d96 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -175,7 +175,7 @@ bool Neutrals::initial_conditions(Grid grid, for (iLat = 0; iLat < nLats; iLat++) { for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { species[iSpecies].density_scgc.subcube( - iLon, iLat, 0, iLon, iLat, grid.first_lower_gc(iLon, iLat)).fill( + iLon, iLat, 0, iLon, iLat, grid.first_lower_gc(iLon, iLat)+1).fill( species[iSpecies].lower_bc_density); } } From 89d766c8571d5f352488ecc762bc1654e36fd6ad Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 17 Apr 2025 10:27:03 -0400 Subject: [PATCH 491/691] DOC: Some plots of the dipole corners & their connections --- edu/examples/Dipole/MoreDipoleInfo.ipynb | 79 +++++++++++++++--- .../plots/highlatitude_corner_connections.png | Bin 0 -> 625233 bytes .../plots/midlatitude_corner_connections.png | Bin 0 -> 353691 bytes 3 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 edu/examples/Dipole/plots/highlatitude_corner_connections.png create mode 100644 edu/examples/Dipole/plots/midlatitude_corner_connections.png diff --git a/edu/examples/Dipole/MoreDipoleInfo.ipynb b/edu/examples/Dipole/MoreDipoleInfo.ipynb index 1e8b9ca1..6d93769d 100644 --- a/edu/examples/Dipole/MoreDipoleInfo.ipynb +++ b/edu/examples/Dipole/MoreDipoleInfo.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "d3792d6f-1f9b-4364-a1a8-f5d37dabdf41", "metadata": {}, "outputs": [], @@ -112,7 +112,7 @@ "id": "cc6301bc-92ed-432c-86f0-857ddaacecce", "metadata": {}, "source": [ - "## Aether's p,q Values\n", + "# Aether's p,q Values on the Dipole Grid\n", "\n", "First, let's get some dipole coordinates:" ] @@ -152,7 +152,7 @@ "id": "7a8b44e8-896d-488b-baab-a37abbf00da2", "metadata": {}, "source": [ - "### Ghost Cells\n", + "## Ghost Cells\n", "\n", "The dipole grid has 2 ghost cells in each block (or on each node), similar to the spherical grid.\n", "\n", @@ -223,15 +223,76 @@ "plt.show();" ] }, + { + "cell_type": "markdown", + "id": "97273c1d-6c47-4509-b639-f8f53a5c2de0", + "metadata": {}, + "source": [ + "## Corners and cell centers\n", + "\n", + "The corners and centers look a little confusing. They are not automatically generated by the python script, so these plots were made using actual model outputs. \n", + "\n", + "The parameters used in this run are:\n", + "\n", + "```json\n", + "\n", + " \"ionGrid\": {\n", + " \"Shape\": \"dipole4\",\n", + " \"nLonsPerBlock\": 14,\n", + " \"nLatsPerBlock\" : 20,\n", + " \"nAlts\":30,\n", + " \"AltRange\":[80,1500],\n", + " \"LatRange\":[7, 87]\n", + " },\n", + "\n", + "```\n", + "\n", + "Some notes:\n", + "- Cell centers are the larger dots, and the corners are the smaller dots.\n", + "- In each panel, dashed lines are drawn between the $\\hat{j}$ and/or $\\hat{k}$ corners for clarity.\n", + "- Horizontal, solid, black lines are drawn at 0 and 80 km (min_alt)\n", + "- This will be mirrored in the southern hemisphere\n", + "\n", + "First, a look at the midlatitudes:\n", + "\n" + ] + }, + { + "attachments": { + "94817fae-2328-4a62-986d-bf5f4c049ff5.png": { + "image/png": "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\n8CfCuqROGkJ7rMGr2XbmzBnS6bT6AjsdIfm4m3OT2XnuQCdYLKiui3w+H36/n4aGBk0dEYlEgqWl\nJWw2m6Z1XyCbVnv+/HmSySTd3d00NDRoOv6NzM7OMj09TVtbW97t3fUiGAxy5coVJEmitbWV9vZ2\nXe0pJ61g9GNdXFwkHA7T0dGhW8HqQlhaWmJ0dBSr1UpfX19RaYVKEI/HmZ+fp62tTXNbFhcXGRsb\no6qqit7eXs3GHRkZwefz0dbWpqzzfhVymuharS85t05NTZRKpTh79iwABw4ceEWNOC10kZlCqCQb\noSaUiYkOqNWW2WiUy3GamKhFOdf9UopkMkk6nV5Ry0I1bC5Cr/kGAFUV15xXGugin8/H0tKS5ivE\nFRUVtLW1ae68gmz0VzKZXNHGXk9aW1vZvXs3Ho+xC9hLksTk5CSSJNHY2Ki78wrKSysY/VgbGxvp\n7OwsCecVkKs7lclkchGFejI6Osrc3FwuNVdLamtraW5uVqb+XoHjQnZOVpucJnKS8+qorYnsdnuu\ne7FcT1NrzBRCpVleE+rf7i29mlAmJjqhdFtmo1Iux2liohbL637de+resqn7pRThcBjI1odSu+V2\ndrxs/RH3G0/AxB+rroskSSIYDAIYLipOTRYWFoDsA7dRHraLSmPUCEEQ2L59O7Ozs2zZskVvc3KU\nk1YolWOVJImpqSkaGhp0qe2UL5s3b+bSpUssLCzQ0tKi63XY1NTExMQECwsLmjuzbTYbHR0dmo4J\n1+870WiUdDqteuSZHppIPv8zmTW6wqqMmUJoYmJiYmJiYrIOjKw91rItnU7nnFh1dXWq2/Hyyy8T\nj8fp6enRZLxIJMLg4CBWq1XTlubz8/PYbDZqa2s1cQwuJ5lMcu7cOQD6+vpyq+N6sLCwgMvl0q29\nuomJWszMzDA9PY3NZmPXrl26Xmc3Y3h4GL/fT11dHT09PTf/gEpkMhnOnj2LKIrs2LGD6upq3WzR\nkosXLxKNRjVL5xZFkZmZGSKRCNu3b1f9vidJ0ppjmCmEJiYmJiYmJiYmimGz2airq9PEmZROp4nH\n4wCqF7OVkdM2ampqNHNeSZLE1atXGRkZ0SWlIpVKUVVVRU1Nja4P1YlEgomJCS5cuEAsFtPNjpsh\niiKXL1/G7/frbYpJCdHS0kJVVRXpdJrLly+TTqf1NmlN2tvbEQQBv99PKKR9Fz4Zq9WaK34/Pz+v\n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\n0ygbQ6stds+pIo49PT3o6+sjKXOidGBZLBZF38MozE4z0Al8/g2fBwCUKvrnP7UDa25uDmfPnkUi\nkTBsK51O49FHH1UOBUZx+fJlPPLIIyRjE0URjz/+ONnY0uk0rly5gpWVFRJ7qVQK8/PzSjaMUbCS\nCj1p+5vxpMi2a5BppBbNOAzb63fCgcWyr9xu94Z1bLt4TCwWA1DNTjKynrDDmZrxxeNxyLLcsFOU\nFltqUMuLjHJUNjaj3GNhYQEcKvA6ANuz1rN5DPCi2mdHzYsikQguXbqEUqkEm82GiYkJTc6/YDCI\nvr4+0kYy9a5xN/AiCthsNvT19WkqFTOZTJiYmIDL5UKlUsHk5CSWl5dJORFQLcFyuVyGA5eiJAJt\nwP980/8ErMDK8oqhe0gl+SCKIsrlMs6fP4/HH3+chOcuLi7ikUceUXT3amEymRSZBDUaguVyGQ8/\n/DAeffRRQ2NjTqTp6WmcPXsWy8vLum3VYnl5GZOTk1v0rliWrVYdrNXVVSwuLiKfz6v+HbbO1Ns/\n4vE4IpEIisWipnHUw07wIsMZWP/5n/+54f//5V/+BYFAAA899BBe+MIXQpZlfOpTn8Jf/uVf4tix\nYwCA//N//g+CwSC+/OUv4+1vfzuSySS++MUv4q677sJv/dZvAQC+9KUvoa+vD/fddx9e8YpXqB/Q\nb/y7oewVoEquSqUSSqUSiR6W2WwmFQpk4xNF0fD4tov4UWU5aYlctgJlBhYVUQMA9B0Df91jQKkE\n6WXvBwwKplM61ziOA2QZ8uoPgN7fN9Qh0Wq1wuVybbu432xiHgKeiArWQgAwk5jb8BkTK2X/bcTW\nZrtG4XA4SOY+UJ33Dyw80LwN+1XAjQduhPyRKtl4+3PebshWbaSRgpRSdg2ktAVAKTuhmGflchml\nUonsoFEoFJBKpcgEoLPZLNbW1iDLMkkTiHQ6jYWFBV2dfzbDSGR8x2CQEzmdzoa6lv39/Zp1R/Q6\nsBix3vzMqLVG2XobjUbR2dlpeM6ZTCaUSiVVPIsd1Bp1iqXkMcyeKIpIJpNYWVlBe3t7S02aRqDg\nHrFYDNlsFqY9L0XgppdDcjiAV57UbQ/Y6KBgWbCG7AGQw/djzmpFYX1O+nw+DA4OarbtdDohiiJJ\nc4pm6+1u4UVGIQgCXC6X5mwcs9mMsbExLCwsYG1tDSsrK0gkEiiXy/jl6i9xzTXX7JrM6GMTxyD/\n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\nwhdWu0srws9+9jPceuut+PznP49XXnkF73znO3HuuediYmJitbu2KmzdujXnPjh06NBqd2nFiMVi\n2LFjB+69917F17/5zW/i29/+Nu6991689NJLaG1txfvf/35EIpEV7unKUG48AOBDH/pQzv3y5JNP\nrmAPV5bf//73uOmmm/DnP/8ZzzzzDNLpND7wgQ8gFovJ76mWe4TookKILsqF6KLyEF1EdBFAdBHR\nRacguugUq66JxDOQb37zm2JfX5/8/ZNPPinSNC1OT0/L137yk5+IVqtVDIVCq9HFFeGBBx4Qa2tr\nFV8DIP7iF79Y0f6sNsXGY63eHxI9PT3id77zndXuxqrwd3/3d+KNN96Yc23Tpk3iHXfcsUo9Wj3u\nuusucceOHavdjaogf34UBEFsbW0Vv/GNb8jXksmkWFtbK953332r0MOVRWm9uPrqq8ULL7xwVfpT\nDczPz4sAxN///veiKFb/PUJ0UQaii3IhukgZoouILhJFoouyIbooF6KLcllpTXTae2ApEQqF0NDQ\nIH//pz/9CYODg2hvb5evffCDH0QqlcLLL7+8Gl2sCm6++WY0NTXhzW9+M+677z4IgrDaXVoVyP0B\n3H333WhsbMTOnTvx1a9+dU2ECbAsi5dffhkf+MAHcq5/4AMfwIsvvrhKvVpdTpw4gfb2dvT19eHy\nyy/HyMjIanepKhgdHcXc3FzOvWK1WvGud71rzd4rAPC73/0OLS0tGBgYwPXXX4/5+fnV7tKKEQqF\nAEDWGtV+jxBdpA6iizKQ+4PoomyILiK6KJ9qX/NWi7Wqi1ZaE5l0t1BlDA8P49/+7d/wL//yL/K1\nubk5eDyenPfV19fDYrFgbm5upbtYFXzlK1/B3//938Nut+O3v/0tPvvZz2JxcXHNuEhns9bvj09/\n+tPYvXs36uvr8de//hV33nknRkdH8cMf/nC1u7asLC4uguf5gs/e4/Gsic89n7e85S148MEHMTAw\nAK/Xi3/+53/G2972Nhw5cgSNjY2r3b1VRboflO6V8fHx1ejSqnPuuefi0ksvRU9PD0ZHR7F//368\n973vxcsvvwyr1bra3VtWRFHEbbfdhne84x0YHBwEUN33CNFF6iC66BRr/f4guojoIoDoolJU85q3\nWqxVXbQamqhqPbCUEufl/zt48GDOz8zMzOBDH/oQLr30Ulx33XU5r1EUVfA7RFFUvF6NVDIepfjC\n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\nTkSuQmCC\n" + } + }, + "cell_type": "markdown", + "id": "945adde8-905b-4009-aee0-db0963977a75", + "metadata": {}, + "source": [ + "![midlatitude_corner_connections.png](attachment:94817fae-2328-4a62-986d-bf5f4c049ff5.png)" + ] + }, + { + "attachments": { + "f2d75913-95bf-43e3-8611-47a2a8eb4c28.png": { + "image/png": "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\n" + } + }, + "cell_type": "markdown", + "id": "c93cd416-bf6e-4998-8cb4-a63d5b5fdaf2", + "metadata": {}, + "source": [ + "And then a look at the high latitude region. Note the limits on the axis are slightly different. \n", + "\n", + "![highlatitude_corner_connections.png](attachment:f2d75913-95bf-43e3-8611-47a2a8eb4c28.png)" + ] + }, { "cell_type": "markdown", "id": "34b944a0-ac97-4063-b89a-41d4e78da2da", "metadata": {}, "source": [ - "(The equator-most ghost cells are not shown)\n", "\n", "\n", - "### Order of points\n", + "## Order of points\n", "\n", "The order of points in the dipole grid is the same as the spherical grid. Most simply, the field lines are arranged in the order of increasing invariant latitude & from lowest to highest altitude.\n", "\n", @@ -302,14 +363,6 @@ "\n", "If there are any other questions, contact Aaron B and this file can be updated with more plots :)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "f2ca9881-8114-4b63-86ca-68b1575ea59d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/edu/examples/Dipole/plots/highlatitude_corner_connections.png b/edu/examples/Dipole/plots/highlatitude_corner_connections.png new file mode 100644 index 0000000000000000000000000000000000000000..ecee51f0407d1bf9496b4e3b7d25a7474cbd2693 GIT binary patch literal 625233 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

-N z6=$aDw_nE%-=3ac&&)mv{}6@*&LJi9NvqcTuPmN7?xGhTMt`Gv9KEKl7KCQ99uUJb zjgaOQwLjbEv-8_>|JrOxDAar;E^z5Vb=7bfium=t0|??rzbD2&-S`|Z0f#B%<+P8t zWaJSA!h8xvx&SXf1 znyaXen?0qF|5TT5}Ymf+96z`o=_VUoZne&B{mZwIx4~fW;F0+bdjb5zeP2&6? z4(kxY%FJO^&EY?52MvH1H)&|vJU8;``&2elN2Xb`6P>(c>VX_YdAQi zr=?j8Yy=!-HP6Y&9k|z*6TU^$zbP`z`OV+rj0&bWdW~MyziZ`swRGR zP*4zBj|nuxCCnP1SGY?8Kcy}7f5EhV&$p|&6)!e&Dg|jN$yb0d!5UTD=R#ysQ zGOHKWL1d?rDSd+LsjNd0BOzJndrFEre3L$sy3y2tn2cZmhp%9)8H))>5sn%sq6Jr_ z-p4jMCHAdDP!asO(V$$t6){Z6Du z0r1MBGWLRD0ESKF=_{wErbgz5cr+S~c@IusRG9UDoM!54`TV7+@nQq~dXJuPb=GLw z1-{j3qUpI`>)f(^edU?xxnW}WK~_*S39*)Qk(v~ExA7n8bVean!r=^`m+?0%?%C@~ zT1y@Y()V9N@F>kIf4vx{<>HcG6O_8Uuh+81Af9|HSD_;$x0fe|MXdaWj>TFD(YA!(OCrR|{CrWRuF9LF z&=6s!=&C6@txHQpJoQRJT%6CK{Eh#AiFH^fOIYNDX!d6FR)5$F@+RC|D)umfJI!|M zw_Fe&KYS_?E#a*)uFI<mjiEd>?uKt$h~o&lP3 zqcjIqm$PB(#%~$RJI6ajQws)cXhXiqFPf{l+d&SNPHHYZVeB4Y=R>Wx?bcn?07t+XgS;nLTc zBXlfK=*SY?!yA0+W~96xrf`qZk%O4|P(VI!jBY4OZr~Lr#peLnRsiUFHF8Z@rCW8g z=JjBo=lHj+)My;F_~I9$$>wovJ0D+Q+AFrMEE2vE$xJ&Ne;D717WRNw>!FbTY!|D`I!onJRGDk>6Ip2T0SQEVyMM`S&>G$Q?-$y<1zU7 z^TFY7oAoTo%fD>*_X1PRjlns|fx`UoL1Uk3GP^vfld!$^4vObvoPP9lC{nBEa`i1o zXKcE-{>wGu=2j`x1VBSVojbcp-NvrKe*vh-o)NTxubaWTP-lo%wNR2*`B)L_o_p!l zezahe$gq^r!(R28%iY?yqOt1B(znI;E17*Q?%kAQBYOaSbg*926Wu#Pe~$mxdgCK9 zhp02nnH_`*p@Ux7lzzJp!&7{n6vY^oLQLhDpjT*D7@VE|m zsNRl25c;263vVE?_WjJF+PZXgsR4i{jVy0rW4VHZD(N+Gm5c;j+hB$!lI3&v+q{tz z{^4oEj^tSMRJ34F@*xy|a3hB2@_khUP4hk3&R5yaJT-1q`WZLS!4gI1)cnJ5_?Kp? zCk34^#90PQQW{?G%=W*aV_nCKI7Xc6O#&+0et$$u457aVFEk6Bwn|9od}0R!{r*+{ z8QHaNhk`~Qpx6TbO)fDoy#q4%r=i>|BDtNU1qsDIA0U%sz&1d6!V0KmOv zU17%G|2Q#z!*gsOg36{u$yJmY`xtG^SaGCMG7z+&HYBl7F!knnPo>P~P{EkpW{hBc1; zdWneZRjPCaJndwzLT$dXh}<*_B({-G6P+8hkVM=Jn;WmxLVhGEG3PYv0f~H-jZ+65 zzjA{YvfRNeLoClv)b_!0*k-(w@|}-HKgFfpQB z#R;hZRss>o+Xys$>*upT!@DkB=R;72c;f%d<_Eu93=h_*gVtO0Vlc6l5`u~zi5l%~ zzCFK`pdJtx@W^M!Y@S@6_|#`XAZ!B}fIXvWIv<#O=e(gwNikaaz77#On1}%3JYa!4 ziN?6_h|9#9f8uCId^17`ovV>2vcm(yo_%(ccHb8j-pD@xyHU2j&K&|xnYw~Id}O=> zE%D}c(k&4krv0cCwwM%~HcGwpN9bJo$+#k#T?SS^y!!Pd0u8Em5VVei#|pRBMO|*-Q4Xi`XsFwZc^;w`TG! zpM^l)!elNB$RFF%jQmg!b3AJ#5HeGQ|0Bnh|MJW()O~{t~g4h!fQZ613xynZbY;@ z#_d-$aY;*%sQP#@>Pj;oHSIe+Y{UPdbv}{W0q=S9r>XkfEu>rr*ppv9+Xq5cRoL&? zvDr%dwTN&$-gqb$*dHP)9yy#eV2Pr3$IoHJyyx;!weMF6t`OQTq^(80}o*Tr` z=_fyu>1InWOjIibsnbrbMmn-+^sQAPw+ox$?MdcuQxm5lVVg2Qok7p=<{``}TC;to z!gAA|lz-0S!Wm~HGv)h`Uvej_RH}AvIM5NGKK+kZ@`>6(I&})Ng&=P4te_$e*jQ7= zsS;QJwji9-`WDLKKT4MV@c)vI6kVKyhMWlBsXK6 z5;D39S|$}-nx~mRe_D(UiN9PZ^l%t+1!lCd_ z&tInJ@pi)I(V`$sJw-HMMZ14E3N2}Qc(_7sTu&^#(@2c8XOv#ePhdR5#=$yZX$Zr0 zhC#ze5DbYG9`TQTQ&?MsC=F%i*N7YF#ip?v0oY&G>i9_lm0F_B+-K~B%qm6y{9tED zb^E<{n@ajt5Q2^TKw|Ps?Q%G)oGgLcq`vZ>8Q^!79Z-2?Ss4%!$cf;qgWfz8@@_4L zZ^&5Cd@5k|tV*bIxdhKb<TjTb=b(C32I?1nuAckFXrSUL@V@aux%5|E5d!N@grJFVY*?c1n`mO$_4 zw)%f3h~+S zDP%VPPd#3+>=v>Yu9+u5_2@KcsY)n!!lH81h5pU8T112+<@G5*Cjn3f@p^;e`_w0` zI=2;T*xqEJnGB$?4m6^|pk;miY{WOYxDcju(C33n0#tWhdm>zrz^tJez&A1pamYhqJISMaD@>ZVB9Z z<1H9*eLcE(YU%R~BEsl-6o%92lQ~TA!CUxp>am-;8x%ZI>YPIC?AK;SV?KYcJ|C|Z zUTUga<1~Ux3-R+qqR`oihJ~$l_?^!p3O)?oFTKw;$x55)_D(Y}M;PAh_3-WG-$mKT z-u*ssYre*#T!|^MAJ`skx)e{;7W!eng9-m4a6hFFum--+9e?*(pW8a}%Ky5Sq~dJh zxZ&%S*C#*XDw3~(fie=;J~u40pJ8OjNOFs14{544FwmE@sJ77NKstGIMd<|uB6wO1jrf949g$-AA$HyUM%57z{em|<4LwF{ofMBF z&uG|kopRj7>`$UA_LBGaok3X8vUPOp#?xZv*Kol>rdmu-zneXcWLdifGv*w~dL+9bfHnl=cMK`sePey=lP-bMP-ypDl)noRu}J$_z@>m|xFkZv~o- zD#h!zBt?i0&qNMA_6rQIP!+8o(?kumZLlg?}FJt~2&!`&_zv>=5&`ufWF5!R=K zJ!Ar2gE$3usEyjZ-(KKHibA*yt(pF0BTEO0#OH|!*niqzR(trse>E*9KUpTs{JMl1 zN^sqSh>aaO6uCN)DE-QS4Jl0CyDtM8qC0Gd_sS~bxH&mraG8=8C#1+F79^q zCUH*iT3i&=dto5f7vcwl6&|R*c#%8%SN7cZ?@8FuMmrGH#+zMfLf_z0n%dc^9iM>t zO6Php3a#m{(?M)AMK6+Kw;)49ot1UGjgfP)1L?r{neA} z5R~2jp3iyV5v0SSED4g%>Y8i-r|I7ly#)}A=g<>Y3t2n-IUp;P{wPYA(4niIb&A~Z z8$j1uflj-(*2!AF6ZewCbIxz!RX=`z$5EGh=KiIh6r7lwFQJTra%$V?L9mdRmP!pp zUn7%Q)VsNgXm=5swC*q$2g+w_5?)-}ZOjkY3v?)cjA;a0ry9ep4XPUGN-%vgAUf#e zqd-*u_<9qB9B=g~+O0;ee<`kdT)xaH8Hn5}MVsJ{Ol*<-H!V{7jR&J8X2?Hl`v(mF zAO;1#`S9%QSxsvAw|StQC0A%gj{F`KScNy7`(lC>2o1xh+=a*l{>;6XI;wyFn*7~?F;2C-``yLJq06p~Pc&iGp08o8 zK)lR{kzZ99#o*H_%=9?os}qUN#e4*c;92SKTSslUcS*4rYzr4MAdL&(_YpuefaG^@ zdXX4!4~9c%62f+&HO11rXiTpK1MzvhA;9!JLm73beF0NTju_ZJz=>91QOTuOh6spP zm-`w|j5X`BLh<8Y*Ia-L;-9iOcI|-V8#K72BXtKLPji^Y0d4WTLnt`rf$=9~$3d_( z@^cB&VQ4_L$E2+6z74z;3wo<^HA6s`Xg=CKR~s7TPZi{! zc|xM=)QbNwFzl8RBCxEFPWoX`Sj2|_wj8dravzRJJDFJe$fY2a#29XGzJ&g!p}&8d z+_{^jIBGxEe{*3G}!kEW*NCq+* zxZSTb4%r_w&7bP4Z*3(f*AUas<0-KU-U3I@pNR)L7ojj`kL-Z4v8`1ue>#$ja8~+@ zGdyCVo*?tQGOv-|Ay&lX?E{lIkaH>@Nc^mIZkyg z%tr(`JAXGV|Mc;Aw6j#N92JD0!=^OY=(?AZT_;{~k8);t^K-`{I* z*(^|Hpy>NZ=p{Do)J3a*a(PBQ0*}g&NAXCG1Cw|n>W1EWK$W_1T0XGO^pY{!?;Uto zX}1hmEInQ94UYZcI=FvJ$ViPPA%vQm3>m8fqDUBMjMY2n#L*pAF-l4d^)+V_KgdgA z&+l(abMR!t2NE4{<3cLuKh7;{;Z!8=N#N%A8cccB@U>b*KzRcNn3{%$DUhU{>g=%O zK^k_5$>_d&mLnaBCYq@+6BF7Q7;@$c>>%C6yVBW6OJVft-bLxgeq^9=%cCvrb!nhb z!8SK`G#AxjYNB5w-I4|oovmMC0m7BLs;bJ$;bV9T@z9|Q`%_WC%>eQOBUM*H1R7xv zKsxijT0R^Ow*E(+PDdhIb(vLt_MPv4UVgHymfoRs8K@Q+etTU{Tt>Yr1-&G0%-g0A z@_F(NVgG;iaXggQf|8U<#Zvzb5MD#c} zny(uZtDCG7(9(sd?h-~q01dgodd`zV=aX!;)q0>eBUYv*28)*qe3utm5~ zZU92@F{`a4(R=l~!=JvZiN?aD5~6hACr|vw7!H|pbYF?!j54-;NcK{6cubQ&DNMi_`853)69wyYFNyLl0HH$VuyQ6ThaPsX2Y)59`u@_TeT$sQLTpu(BGTQx}*Q%AyM-sgS>G`TgGTz=AKe z3}7Pq-KbTnOLSh?dbK>S_U1KW^XZ9(kGUBz^NhaK{$YCo{Y^L{=eBvgSJ|*pCySTq zBSsx_qy8qYRs&7141O+CLJyT?3~kXL&W8Z|r8`TQEf-mA$KqteE7G7KgOLvMJ`9ONs3MZL;UrI;-lDoUF7Pqmv+PHfg$*>Ry535;V+u$sLfej8F^z)vH~v%kgN1 zT|3H5h^ zBX0w+-82d+*F>M3@xa0LZouMo#T|8maaT{mpC{u|TaD=41WaM54x&FPGAe&(RGex$ zv&!EJb7wD)U{i1wqC3S8Bd#Oi>Pt4OgwhfIh_0%Jg8(<)E(utwV91A{QEisl$w?N= zFjaFystmVLL>^bfD~J#CIce9K;R_5vGrlloPD`i7elrT20IVP+3abH(MRK_h5hN+p z(1e6C+s+q)$=eCU@n-BOV4VN&doE4^tTV`B;Oa947F3v9TXl zR8$0I&%>urIV~aOF0`jdIqZWTk%TI|f7H~$^A1yZ3LA%>KBs+L_4Q{23y~!{kC_q= zvp|CZssm`&^p8NP1!&-h@%U+wSuP^NmQwi}nNkR(BZ;AQm&2(VT?|=BHGL0H!Rsw${0Bn6_i4vtXUAP(JDh1iY=Vn8vHkhQZJ9Nx zi`)MzMheZ#aEtIIpiV#-3#3~MG#8BY*T63p#KX@P1KbQ4kk7F(&S-!j`W*8gK)68v zYkdR5Y!tez#`y!M1j-#xZJekhU@|!x`MVX4idA+`G6EVh~6?I=_!j2 zSFCk@z@oP!%|CYzxH1!ZN?(y4?1rXd}DF48-C$V!CpB6}wqL&JEwFdm+RIUI<{PDgYVR zA_VqBNMaKJ zts`9@g;O!BB4u32tW?MqX))s?_xLpo78;=I0E&?%GS>h;D7;>8rnUslWRUV;(2)R* zPp3nb8RojsUN#TZ$Eln#+%u5KLhRk*X&8=%U>#tWI@hSJw_fKVOdxm^-a+_|1@-^R zxgs_F&&Hs-0Qul_ldt&AkoT`<(3qNlt;h>HLtsOKt@05HXZnCC^ePT^`FMFzqF3Qi z$UXZ*c&;$bX_CpU1Whj1&fZi`xS(6>Hpg~=OfE%t8s3i=|eKm+`^LJz-_^62iw~X_{mrI zZKqIaSTlc!Zm2Ex{hRN^a_{<#jIjh!Tg$T3uVlk=E>-oBrfb*Z7jbX0Bv&fx_qxMl zmd3p`nHOqZE}KXshTt#=FxMY&b7ai)vQS;)Yt4k0 zDFH9>RQk;*vl^69Q}P>c;O-|N{15hBp^tVYRv34+>ld+Uey|Gz-K-2=NA-0{NK|YF z$m?}G$lC!52o<@TDjo<<%%#vJN91Q3yOk0Hl9L_CLQP3+_)>d!KA5A|8EQDF+nUKh z%t>8h~@=rLXV+~rAT zV(dMS>WozL`b~r`*t0xPA(0jrg0M(=nmk@r(0&x-jz)ApA7kMZvM;*(`B1%%mH@?i zfi>MKrb{Q;IQ^DI8jcVxc2EGU`952Db8}|+zy!+SyXWLUECAJ(QW>6x#{Kca)bC#!XIqcmSlcaQ6hcgq>$OF!#ml?_Hp#8iqM1gJ!*5T zGSi#OLf^w^?hQUgum=O3v+qGh+zTLNgEkN9hTf8KK~W+mf-30U0l5{~V|hv2vvF9l zho(f`4}oHO5UJ*n)8Wq$hYjKgJE3&L$A!#3&KCzM^VsudH^_C@J-5~(5mr^1~A zAM|@jmgncs36&vM)3uJb5!S&flXqrMpjY`$jRhP_ZFWL^s}uD%;?*E>@XmF#*E8J6 zhl3~8wk7w{Q4-i=j4xHLr(vx_q@PO)uOKuyXViS)@{2(=Z$SUTYC|2J9R{ky^9jjn z(w*QQm@k*UbNyWZ@n8|7)~a-&E(Id=aPWoGqA$U-tFZ~@Ovr_nhA1ewg0oCL+A>f= zA<=zeH?;q8ZrmK1^!_eYh*gEH2UA2{?gWYO}>6x+d-SgA9DAn8#bb$aVJ~iVk zeypf(sJA=IoS^LH?vD2E01p=(mAP4X=nzma)Ce*G7LVrV{~{hOV%v1$fq%l~$=KfP}oPiJKF)V_+;q>dKt zXi(G95M=O^f$&=&m@acc<0{6$yTM9`iN{s8baL87{rmrjdJCv3)9!uv&^R`hHz`Kq$`w6TEcc(pU}x3f%jD`_Sz&^(&s7yBeUNv|)V}BdcQb<2dC1H~#mQ3O zZ$&c$y*P|NsRr0zK$0q^$q$$6rBKM8>~L$Mt9>!UB3Bzl4>*BlcK>qO7hOZQIJ^(I z$|_qIWF+VXt37fUB%k_^Ez$DU@6x7RawJkSF&Zf;qO2hy{OW@TJzvm{!`qMyUtYww z_Ajl?0Bz&pcy~n7|DmZwbQ89W;s}3%DZQO~!8avdo&?9qQ`xXeuhk?ON%RY&`j>?fOEX+C=v)d1O{1g}S9x^Zzv(;6f9@&NQj#U|am zxcZPzQ+C+|tYwG-HWpOVj((q+(q|58nYe)gxNq(dN|zH24k-5(1$-?JTG8j|q8Fh3 z;2T3yZvI&pLN4~Z7pX&qzNe7Ax&ck|7yj42au#bTY3~@q89*ig)l->8Gmu`(*H``4 z>Nkc1$CVTHWiHUdg3yBPU4nIx4)|@(IJTnlcy2YR-24Pf4yg7J;2@aaWlG>(_U_Al ze8v<>s=#C?FffJB^*#@enp$}gt31hwp6Z?kkk`?**=~J>xLt^BW{R0y_Rs!jkAJVJ zZSkiW&Bo>k(Bvh)^{%tv2038+?0d)lX30s!pd|4Gah_LJSeI#BMJ_#V19GFNuwW>7 zSqPPd4SE5s=D(|Nl<_gZWSUYEqvc|*izod_8nSoeGjsXP?x$N0xl8WLJq6D6)81g2 zj=C|{5BsL#q0a_7tSngWuL<9Tt{l>_gOquwa72E8k_CafxxVi^N#c+oQYoPRgW~=C z+z0M6B&h6mbrbSEF|M^Jb!EX&7h38FiI_{hAK4r4Gl_~kf*Daj%lzp%HQ+UM9)D_z z%@S=+tL4{kZfCV2oufsgu`M8(vDDcAU{ZHS-+|3e(J}Ym<<nI=e5dfJlbrWL>>74g z4^w_gfJf-98s1WbM%VEG_o4EsB8) zMH4U}lsY=0Px?4f3EU5RmVwcaRg1U!pKkR&3>ov_@}=SZUbHcq#<^ z9iMTJ%nbAgq1jA-@bq2vCSLZeDc_creh?qHb8@k2k`s4GOYx4>KBzs%_qt@zQMRj< zz5Mao-P#Rzk)!B8PPnI2!?J{y-^LN2wp?;tgz#Q)cJP2i{;8NmZu{QO&Q6fV-qe!h zXcPYBGF@AfcL4n!1sz?_>8TI^EU@xeS#Sk8;VO-9@}7#1G0CMrS_y6^o0F;eqaWEH zSxf&sg3ac8gJ4ybS~Zan_hGe$5it+aT3<`N;tZ|O%FLi5`tjMrAS>>+@%VoE2z zqY>gBVT~hK10L*+H`_ub9NI$H1ry&@p;z5CVXvx2-$5iD&3gaN+5x`BJjG?#X#=Zl-j!oXNd_KSta~op;G@l<>vm-O z*T5j~&y1bZ>96EUu~N$t-%oX-`S5DM1aU^OY8k`+%LNVPR%KJDhmfE2t(7i-mquQ? zLA&)_i;=rw<9k|UkLi8DGrZ^1{ycSQCX|)k@4VU8$BI{XGEW~ZWU8Fi12_J!$e?Q? zGnzz*z5+@y&#ZtbBjMQh?*VXGfhqp`V#UnX*uzw1;KyigHLXTUWCU^<{|sVTf11t| zy$nOSiC{XU`rrwc+$_4mfzxn#Hn9J@!Rm9svjAWzxQTF4&ya3l?KgDHz4Jfu%^?qn za!{)fB};Ye)i3@w%S9GH1}*f8Kq^J|525c|J+tVo9Ylpc*gYq>uzyMP<2y2J#m0M< zjO)i1m3s`wdIy)*S4Z8iclh(=3q~X2O`G0u#_K90p@{xKmtPt7_D_cNqQ2ZZq^g<% z@COH)&N?M$wdjm{!-vf1$@*&1$?7tfkpJ?7x7Hddue67vPpKaKOPUP5gakU7q4PUa zA6Fh|1ySS^5fOF#a>@Z89MHN|8XGzb3f+*6GqZgw3-jl4)PK7DDt0Sh#!2(!J!*TF zuRcC{(D+3cf3#n6^6s4#@0K=`?8{al zpRLc$in`kanIg4Hwkpq%d(pF%x+B#pzFvl(lXsKmC4f^?_Ot<53l~Prey5LL!4h;c z*To*ZKV)QH`{J*P>TuI(P)isfH&#;u?aKS^WYcw$$SL1S>?jdnJacUG&kx97e}Ou|C#m(y+_vUZ~+Oik!=JJX)*-_s(YS@?wzy6#CFj4BI%!LzYEa-YH#DMbqQz<#6qK zdb$+@;bMapoNUyV*PA z0w);?H{K6yeWg>qVr=o9Ny#Uta1Zuj?9qrGp)QoI8=Ka~5$|)Omhnx1)?bfw__hLE()m#XsB$@n+jq~aqb;gC@oJ^ zq+D_K=r%#F9|WuXP~>A-`Y^f8Ro@fkF$W3*?i9Q3xMIKyeYZ4`9y`^~H#PbY{yt`l)oryU&bR#gL8SwJH}+;z7l(5Wpn7Kl8nQB%)|_M! z8T)?2**o_;1LY+HSxiROOj5>QhfPXE{%{cavq&AlRcPZ%?*eJR94W2M*rdhvTm*- zK9UgTv6|e**{hD68V`CUy~jb8Iwlm$yRGn~Elol8_6t#VnsF-Q%V!brr$0C8V`~FL zjU@plt(0uM0|VO|y0W5W@W#|g7eHVOloXSG6>2+lCfd}E(SeJfx0e_af$DWPJegF$QY~hpe-{#J76npB$R@WqsEl zF0`+v7)Qe(MHAo_Sl)W&GwV7m2G00GOK%vRCZBmehwaP31t^=!8@4z^4|*A40v0;o z$aOxM^CZuUrwW`P*mV<8hjyu+1cdJ{GY0zMf3Hi==uT<;2I<5=<_IACrkjQgH?N+6 z7j>KJ$AwOGMiYf?(hfb0w6!cjT08?XTZctdiXiwx4DKeAA4uMI>LK54v+!?L9?!TP zD_90S|OW{@D29v28zSbvOO_(?ZA1UQ>{Fk~eqXt}eAmi6i~-h3`RrT>9V#bA%&`^^?e zxKd7wd?UGP{uKOYV1Y{Uw-D&%UjY{Y**E@~9m%gKc)1{E0=1+=50q5!2+<$BddrIb z;sq04H=bleR-ojWX}23$KiCWbKXB_`**YJ6_y>orCUyB|{!GEglJt97Z+w&Rq=@%t z7Cg*W`#J3e?eq%%=>KT|rsO|Y_xb>IVYD&}~KLRBJ;gR45i?O?!eLq8QiZE1kytBm|5!A!#UOK#Mo4 zI}qT(|3o&?+*Hhf1@rT#?%oWC5^aR=6M(m1?biP9QS^(?x{4F0ME<882sNi`SELSu z26(ywg9QR_iw@qqiA2Hcm_5vT{Srn;_%m+>0(na^elvsa96XQn`lXXsfrHDJex5Zeh#c!0R`&am_)XPPW}7 zH)0xPskpcYP3hG`dNFdQ^nYe_7w>+xxqxx|9ThzJ;e%qW68tEv0#cz!ln2K6xIo=* zOY`Yon9S3sr*4oj6R5*QI5zfF#E3|?Um)AN`|V8?YcvzAMeiP8^@Z(sT4>wHlg2$_ zC$qt~@BXJW2EKmTOA`i;U5+4rKv8NQ%sOF23$IbQxw-Ww4Bgf-4CFGXT^y04LjgoB zXM>KWgJ}X@hl3BS%A^B6mderz>4yuFuY%0_gTguN&|tL$o(BrIKlMgkB*_@JXNq|i zTfO{DX0L10v|g87UpW4vtJ_TQ>z@yfqfb~8c8-Oe``!}!GtgX&s*e630+8~(h%;k) zKRJ$ZC#AnIMvRVlw0qK4Xb}Rx#{WU8GAgHaM+lyy#XvG8)fb;*Tlj1~cT$Y|FV|kr zhR)NSe04lr_BlCDJ3*;#V555{F0Zy$TLZMJ(D1NMR`N%;zx?761T?tAl{)Bevfvdr>&zeiKI)sHy-`I(~q z)K^$(39wj#kh#vV+$KT{)ivH!9~`0$)9R~!A`*d>kvql%O#BWtVKpxvut$G?rVO(eEWU+H;3f^W&_fwPC7PnOHCSx# z9g0cZi@@-1HUcIIIPToGUxYVYbxCsN0=(IvDFB0nsmWo}&l}jm6I=#iLnRM^g5xxv zQt@GEzyFXy&4=$Cu1|ZxXN2&s@5!DL7#>awSR2gA3PkDr7XoWwu;OtSzr)Pe1ymL+ zDLG(nEj|1Q{{m#^O3)j$RdULjGU|G=b`2lzCw#B^jPrIu-fniTyiuUl72NnB<{3s( z{#_m5P=Y(+*~^K^A7Vxdl3)k7|$UW*6#{XGNGM|t|DP8V(KF{!8BM!g}@cvneC4#i(DB(y_+;s6SYYQH?<*JM6Ki2;b zoAtB%-My}R=a%-jbL?4iJXBRuFx)*o0b2P0Y=YS2_n=pA+}Y|*(plR(%${*RTXiim zi>Rog#qqiF#^%uUn*xdfN)ivZN`}h16yej?7rQ;BPV}MA6)Vr?W8T#?GR4V5mXS(F z^T~V!wL_hh-?LjXvwjzU>i$mKefIdHk7(QVJ9!9nyvwVT)*dW!Lx}hczu0Z11LJdg z@ss*tGz6{B#vQolenGkJCeNFA9Ga6PsK|1+3`Yn=He?Zf66N}-(`x3p0e^`cJ2}T! zUEYIJ7)!#9bg`|tp&k`qe2@8Pb6$l^go2Vmvc<^6gltrrgHbDGO}XBd@fD$zpo9c2 zSI3y=O(u-3!0X%#$CcNjSsT8Os$6dd&ioNfBmmgaeDm|W zzJCCvX_HY!MtM0-{!a`3#)#Ov@sx$ECNjC|PDq@_x$=j}d07b#yj3^yQ-al7Ie{k& z{JaKrjo`{Zh%kYNYKGB z+_H3ws?vS7EhT`phm~;xNP2(&O?P+uE7l)T{jVE!g8jdvkDE)E)RW zmSIm;n7A(we&bz6Mk3=rtg;W*(z*?3&-xiZ9sZ3Mc+74BNpmO`1RPU%5Ii_8^@ea1 z00OgkPymE0my;?NU=jmhYgM;muqMe6K(&m7wAbf5hUaU_1l%bl_7$?LX=fL6t&=Mf zM7useiLcQjlMXSu>q+U~n#z`lpsf1qG+hAa)tel8Gsz-VpY>j`Jp!{1SoBcUk~#H0 zoYM*rsp;#{_c%k+W|(;?lB~olakuaH(8UbD+Hu7~ z*9Kcsu#4G08}>Ky8?>zYrI~$xtJYyI9FMyW;n;GGxD&&T!y&XI|0c!br_VMtv^KasCC}0t{ z~>Iuc<}yaTaH@y1~ySgi_!|E_PN$ZpqCOQmJQmA8vTLr&R0t}?>FsZe;-}y8rQ-2 zGHa^*jovi?Jn%2-fu{^hN$9(ZgW_nJDj!{~eHC7>a~cv}_4b6gWhS5wv{%~qo!?LR zod-LbGox|RcUD_s%u!-L#mQr;q#y z+zkM4!ECc&2vykt*+qrU9t%N{pnRM)1H32LiGd*bk)I!MzBvQFdqohFfAYWf1A@eD zw>Qk_zM!t*NQ$rGu!RcZW-#^USYd_%bP;WbqCkjuCjih84lPPLpKE*h_L}0@Ui{n!*?3a1 zswvKEBmE^UjwJLRXBV4X*oa+>eSM0^T3`Jp>yiy@d$p6hKn((Y2`FV;zR$tsSYECo ze&QxV&^X7Pu8kKI06);#G_j*V&ZhxK!SpU@`H_TjQWn9J+g*ScE3TyiUlZJUCF$uG z{DE%bn*S08b;oFZAAqUaDsPc z>km9p7C*bYa&QH;JMsw%vb^N6!(w12OhoWtw*?YVubFgUi{OyTkicgB!28xPBalyB z*3x>G+hJJ-Q~`KJ<5XV4*VvhJezQaYW2yq#GH{#_y{Uu zfv(@h9E6hO0SXAE_ncT-sB$S!47`dFYes$jkV;XRK9N3WBp3|fiFhP5lfrXf?R^R9wE(96^p&$*xllR9MGMR!*SE>Sv4z(XnfOrG?E>uM5 zmN}SF5#wW{_C{OM;A#VU3IrITvzrj${ zm_^H~w?D0Nx-SpI*wFm))~XDp6FV4Znkn4y!=8SscvoXAe_vd7b&m3S&nxVbvp1KBb_exO+F=L0VaXB>_IW z$y?bGJs3Z>S*&j<9$4N&_VlgG;=WhE|G31x8kN8NVdSH7Y(G|1qVkt-QHi=>*c-q8 z0=i1D3svbWq-;X3S{7S%K~ohIATs{9MZt8BC~-AE2j1Y>fGjrjdo8%W=Rfp7(baoG zk(#pbVt*@>za*Q`@@ruAX-M48vmZB>AQ=XSQu;H2Zt4o=66rb;PkpAkSANUHrd#%4I=L;`PiWO5R^ zifEJwA)1*vGT>+i79pAgOc5yJQhR$lX<%X~6rRC_5(-!&g3BNTExf(+Fc>z)iB8!1 zdWH~#d9gWB_W~z{Xs|P(Xyhvjgji=sB z44S|Y^UZ*e*SNU2c)N61R)YH!G__i2C8tJ=7j008Hp=nfn7|)_on$e3@~8)RV4(J# zFyjBGD=i9@9|i=dEE|8^ZC!G9b~uCD>ERjvZ|h0;4ZovT&j}2$4m|N+KRReC_f<*g zWBU5*lfy)++sidHX?pg>{>ky-U`(3vH80+n*b8y+P@{^1{qd$tP8i+L^67Fea}UAm zN6>%3H&FRWX6+6$(5WuZ6kw2V9=nv($9R8+(~&nS#M(^gC?di#NE;fH`Ig z$Z7Bac}q-w|88RKka{E1`qr*HA^)N?+D;JjSp`=V8 zKL}t;%?`#IKh?A;D2G;%C~MtaL1@4GJKth-&oU5fpojYZNE`lmK-$Q_k~@oue{jqX z>{s}#b4yB;T#*P=0Rj)6N(BK3=QV|2{cQBC*g1g=L{uaSE$zfVUlYYPzRIHeE^`Y6 zP~kh~y=31{ypluh5V)Yyk4Hb!e-~{T0|GXO}=cA2+8J3@$x185A z8_|veW51-nGxljVf{50q?muKO#RRM^SV5WGXHmniuAVx_j7u7LGo+|@t-V{+gdSa2%HiZWbU3R|e?fhjpma{{%57>V^(|Flx&j#!r|x;jT)IdG_F`3rtS` zHSDkh#ZRd`Nn1_=3b`xbU!fvo=$d5zNfY11luE&g`%I~?5j^+ zO|&V3=~Z=`1!4%6fMAPeALJX4GBoxg^Rt6h-fYdRFkmlz%mkt}J?;Tt`B4i;3#|{* z+GX_TacuMp47Jzk4)NW#&h(>Bf#z&OET{pGPtc+I7ma-4 zW;|&g?^`}EbTAd*S5J4Rv`bx304`y`AhZq&JZ9mnfQ8;xG*%vI@|Oia1EY7xPK#}5 zFb7evxQ$ppb$IfUEu=E@p=bXymm@V;(nX3#MdReLok!C=RAkWNcS5rI%L=1w-}lCd z7n%%@wA?M(%-Iv&4Gb)x5@NPR%gr5^&UcV$;v^<_z>N3?`t`30Z$GlE(q zMY?T@g+Jh%jc+Em>0wzPaz=vU3YmxURX3;HT%e(_i(UhzBt}HEjKTn7M1l=9et~1S4!HIy8VF-$Q7EZ79>&KaLyTgTmBnd zR@%LLD;fw|5I&-t%+)tPN}8Go0Vlnd!U)RC4Y~86sDq!?c3&$?MP-F2-sI@`&H_=P zKF=Wah5=*|I_F4SsXuI^d@H@O;5SHx?bw7?YFsfKC_k|S@<+smD}5nfpe|=Yz44vP z^$!ti2;I;D?(_(vSG~bci}kCjuhpdfc>1+EH4u3$E^-}Rv?5tw#``yWE_tmmciJ2t`*vY4EVOJmA! zQ%P6e^O6df>m^SUp0(uec9?FP&bczIJ4m;UGRQ05f3&SD`?|=bXY+=_@Xkvz9Wnpg zzOKGM)oKE_R!Qih2IimZ^Kd98@zrLO2USOl_?Qjc*L$FG02&b#ahxae&axIH55U`n z(4f?SK+p_fSANDfaMpk_MFcyE|67?rf^Kud(Fr#`jV$xw z2LpBwukYg}w!pN_hkCuLB1Js;Gp4Dee12yGJlw6w)9mY_PSDs$5C$-%?Tb2oj7$bw z;y1&7WE;CDxkYc=>(^EO83-4R!1Wg=j|oG_n6P69HhX5~sRXgL%vx_jUPFUE--RQ~ zyypKL{p6xCw`(FMf;}1?%=Rw&x|3#uj}coVV@LBFp@%B(#)q*#LS&ME)S=O(zu_&|G_cUS*w6s8LQzA@6$^Kq@87z(QU~mHpn+b*Ggx9Dt`YRYo zQLKGHP*H$By5s-PA$Cz?%T!7Erm6om5#~Uk$Fd}__oZoIq~ZZ2ZCR^dkDfd&0@&rs zu1xvs2_F!$8BzNZcsexRjF70M*iI?aS(O0GBm0?J6nci=VT~Qwd&cqbkqc5sBT1^8 z{ROr)I$2psj{Zaf84kzL&(ZC#rAXB)jIsK6l@ANq!lC;D7))BC+OcT7#-8vs!O zK;Ic+yx>lKHve=$kP)p5HV(IRZNKvtL+E1hsV*lkiF2~WRQ&OiC$SJ01t7B8t5CgU zV7Or|C()!Q4M%Hh-`+oDSWZI6FI!?wA7n@w2(-|vn{$Ac8pRO_w6zUr+)-RiX{|QB zx>TI|jpU_^7mma9ekE?)H*3O#5#g2f>ih@()wvEGIvUBszn!txA40LypKrbmnKciE z6lmnem?mYXsbhu&T>NSZ$|s z54M72+=lY2Wus;pp)0L2E$hCeMuP#hr7b@)(HHI^t-H~aVdJy!>0ECJX-)CQt)Rc# zOUS;&JX{~{xjZ}ENBtV^SL2K6NrXJnM*VtLgrnbKdZpf+md>-+s{<(m&u$FJv>8vo zSWf!mxokCa9S~a2&8c_(aO>nwXoT$jWQq=q89GVFJo2*JWvHeRW>+9VK3wL%oa%4W zIP4o0nK1Vu-Of^T4D;Rjv2Hq$#+7#5ZA(H@=G-4yv1F%blc}gPE;3<{r|Uzh>*ARc z-1pi_+?8d>_e#0`q1xw^9&?p`YhDf$N*kO~nb5Il8)+oFRVl5vW{?*yqFZDuaV9V} zFWaC@8&D+pBrd2`L3l)g-%riK75kgH@JG=@!Sq3Z)OhgCKJr6U$DH<-B3mOK<*@`` zs)AXzI_Lz8%|CVJ532)`6=9( zoBj6_Mu(=l-}9IF%f;fvV#TXJtaV&~$iz@kVZ-YA^5yXEUPR`wS)aeH^WU^atp%Xs zLAN+ST0cJV=kH&S`k55c7vTyy87?x@@8p?K(e{8bT8k_3XPFD8-@y&aKzk(a$RGf| zz2p)v?`J)`;9Pq;6!$MJ{JAuEnSAYcww)aPmP&9#x2uQa0Y*eq*c+D>pONxco^{lJ zB%!y7yoL2noJ>YG1)&SxF zc!V&MC7!lh@>0SC0ZHlobBBq@H-E+YTnm1)>0VNoyfxFm%C|*@5Oy_5-+kC;S#{et z^uXswL)EmsV5wm}>86{0ZT2145ZKCIXvRjq)XVTLpti~?8VrP*xMx$4M8q*{pcHZ^ z)eE>_Wc)X(g@|u3vG))W5PzVx@FRKWvaCtCd6`V#)z%w+QJQ+h4Jo|z~Q@Xd* z2iGQz*KP0((h|#3mwM|vpZk(F|I6dGLlkRCcUEy%Y?DKW9>+A@emo_vKQ$7A zt$xcQuH%hdLVPUL$=MxmS+#QG31wJ4jb|&oxRXL=O4ep7|0kU0Ko>mvjkpam92E4} zZh<8mN@jE-SwDyVw(qVQN678m+22gb76bywcPbv_^mD;^Zmj@5mktSqp~FCi146f- zW!=~T9sf?!op$Q0G^d3P-o2Fg&-7~%fLiNzT@yQpv) zN^b=zwyaklU}s)gDAKagZ*S*mq_tpW354weExq=y{kXlR>avEpIP2UJF75OgaT10z zSmykd2#d;|7ve&TC{5{N4$;@!JuE$Jt1PuVONqnhWI(d_uuGj1lH9HK(myXDSn>Mz^) zWvwC&&gQB+(ZGx&riXFHmM!MVx+E=PFt&CoQZyMmpCS=JX2`UVJ(A`9^ycRp&~|rz z1c?7{CuX!e_P@eHsW}{>6oJuYnt%AE%Tx-U&9P5xKoBjCexvq3pV;UI&Vl|pn!=mJ zTslG@qKL4AVT%^be>)o3T?waGCw8#|Hie%OR-&e+l{TIQZ#vPZ56a#SB)VEN8hR0#%SY3XAy1jC8H>hlwR#QFyP;1O*Q8-35Z)95nmbI$kA*ld~3 zH#{0g#>VoB)IgSl{6y3C`r7l3;O2^FYd?5W(=r4c?=mhQ$9kc9;wUI$OwdQzYHM_LTq?+lJzY+rnN;HsdyOP*`U_ZLPvVDJuZ{IhRgMbGla zj%6{ldCo#9Xl4c;VqoFJ@UKW)NmXM!Q)RvS9|G6=E?H*(aY7m_vkYdb>*a7$o42_) zRR#7rpkI=CQ?M+?jEfGq7=1XyrQdb6@{!feIC<&6(cmXmw-W!FSZ1cWsm_|m#gVez zK7G7(c@N#F^|n$nXFK5I-zO$Qy~|3NYpp_=_>U0sMXosjsKY*U@R;@1e|ISGP1$() zLFSB$4ot^YUVSbV4e0Q|r)bM?{n+O-S1p0W^k2qH*1vRH&erJ3K(xXl;_ZRnwZ)n) z6GLiA(%etukZ<$=!Mq(`sqD!6cwKT`+@1SFJsTk7hExUEX#x56j^+4N#m_tsXjgp{ zgMo&(+fw||l6Vs-zxhWmLs*)+WZh0?S<*J&1$d&}$p_~{mN(v$py9z?anzk)Ms8(7 za?6#~g{JQWnCvjife+l+=arv|3GR#^p2ED!odQ@1mFcQ;e*g{$?T;ltu1!Lys#^h6$kAG4ujb-%Djs#T*^GU z9GrmkZjOcUQ{iYt3w(7?dZ`5k;n}l>iYJ9XDy4iiH4`p1*?0CHbdP%@n`r zGO?6u))H}(wo!_~acz{7>+IhM8%W;3okgHAP_$I_w_gy|`vGQ`y5-e}PRAoUn*M5x zBXWSE*9WEy{3JB}w|3lS*=u2s$vFUyD;p|J;5h-l_tvVlKW6Sc^e)wHdc^net7TPR z_!ly;+=Hgjuj=H%QRKaq{o(Ht&YM9>0x_!|jgaF|z6k14=qLo<0$c0Tlsy*vj&0Gu zsU{{|L;s`W)2sPiI}e=Eo1M6p4>j@FDmXtO(Mpi&#j}ycn~=5&JcTFD@7|e14Sx1M zPox|%1eH0Q{K&11k7<(&n%8xEMjtPQ4H z3EeH8{ap^AG60ak>jH~*7Ip3RbpCohi@?WN3@FJkmU3bs&{6tz!3vu&XC&kryRTQsd5Aq)msEd?@oKkj zH)(bqOtN5JM=gUg3u{E&`Y+e%)g@L>3Kwr(urpuc#7+dGEC6c4pHl#&11qSNLvQ%_ zb+>qv9r9i2>0)k2FcHGy%Z;bx)2H8~>xbWyr<9t9VFNwa}6=gjQ3M z9s$zftaS^i5I|90ExOd357Tj}JZ_jxgFLZ_5uq2reHT9;iTV1=2?S5^2(A4K*gc!n z=vxqih#0I(K;@()6x;DjQd3hiFh}81X?&*{;y^$OJuvwkL>+($79+cWCkd*`1A!RX zTol;`HetXGR_q?meE1~?S@|>a*<1Kwfn884ErhZa0OMWI^97Qxfb+u&XR9f21i%&q zB?<;6_kkyWyv5f_6~tZV-DdnD3FB-GnwOwZj!7z`j_|ApJ?Z}-zNzvv%T~JDzzL-1e7_N4yS(=1p z`W;65%Eio@b57rDx`mW~bhs2epQcOe7MIDbx#3-&QUg;odA=3D;SuuA ziYz8AeCEIdxy#Sa*Jb(8zz!Jd^_04pKD!{n0|CMg94=r)Lg({-7nIBRat!jqIRmS_ z(wK>B`LeHU!y7j!UcrOBZ~vh}v{kEwg_uwW(z(#rGZ8Y!#t3DFBMb&&h2`$%1Q4eI26?a<-*_3}$2CaE_cfUZaGjMJ zd4eu2JP@k`^F{LV^UR-O2DHGQWhny#11S@^i0cg3F=3(AJx$aSE9?*9mh&rdI-rO! z;85BeB0wKyX9uBjDKdiklBlT%J&zQ!GqL>1G0_~pG)m5DnwFa`u?BKXi#XQkuO7#u zgaBjS6EKGu27G(1j|?gm=r{WjVh);`2m}acxv80u z5V!b?Kfccv(h4&?vq->Op-E*ED?px)_bYqSFsPVq?aWrcQ8Uy5V{N>?bhgIuR-ha$ zWoNP0>LFd55YB&L9l+FqQHR+zkm?BkPt>CqzN)G*vo9L*^DQQts!LFAcLa<`a9wx@Wy-ZN=5Zd-b27!`z$x zZpDmwr-m(x(Q}=$8czCrCkdBJMxo=BI&X^Z64Q>K|&# zr#y5rwg{N@lb9jKgZlpO635HwfbNmatxHorGF^;5*Ejh%sSwA7|TB zRxi&^0&^YuSy?rQzB@e3KAT)_T|kC`eVPe{EXya^#x&v%=Uj$DDzMY9nK2Uf(_p$# zte^~22hN$E{ZF3gbO&_qhF;w<7ZIqjw1v$zxR3e?N(T^ z*^u(Lt%WDn&N)AyPog2pg=Ydm<_~ty&%wz1~CGbC79(D&u~u_g(+ zgP)nRQFK?!Vb%uYp_)VwwcL?Y@5nu=F_^9nzp)Q5h8Sldq|tEOlJN%CCCr~NSf~a# z6H5CMMxCD_G#R2mb33WWh?Jj_8DQ(LSz_C95T?Gw39x-2GA)$LJnYxHpq4Xc&TA76 z0iIw<16GMuN(_PEuHWQ+h=2VT-YGaDq2(APdj-pAidDvH*dLBWC6kz6Fi|`uT<63A z$5x-;(6|1yudNJ9U-6-;aYxXn{7M=Kghj1J(bGVJpb>WtSh<35)nO!;RPBy_H@{A{W_1oesH!{Yf82qCP{3sIbMcu}kGMv9A|s%b+2FcslGlO^ z1I%q2YKe1OG)_!1H1)2j_S698jgVe=XFO%l<@A~qPRW>p; z#qRiRj0X%rpdInnEW&ni&1(8>uB(ejaclk!J_Y&Z0D4z{aUFkkk=n@(s} zmz(%JlYAS5o+*);Q1ImB!t9w!L)};i%mdTKU)@A}EO5dLqIW#7`JWIfw{ok+vYqPa z*+^KrgeTvS@hfqMtJ%Sg)=E0MiZdaobpkTt@jk^`+nnJakjJxdsU7R5$?&Ndxm9v2 zs3mU>ve5p#LWtEE_b#{75NXVxU14_cges*&Y}KzDE%4I=P9NGE08CP_sQjPZOpjoy zGTcxJ%^E<|aO(r_E;xmuxSt>}4Uj?s&8!>Hw1UE0V4avb5!B9-mDEvG88=;*Hsimz zkTV{LTO1|jm6b^8H9P=QO$b99i2F4asxHAkTH7+a6KlJ%lid4jvycdl__Iv{xp+4D zT>g)LrJ#^{KOy;1nX>*S=G))6U!Sg&8xmoG{gl5^;@iY=+b%%oh*G_utGGm#evWA3E@*$IRd}a zX(F_{do?|+va6ENX`nc0?&5=Z-T`Ps1|GDrSfj%3LsI>hW92aetMOI%D5}t#dMcc) z#t%etPigNw2!}`00i;{Si5i$xt@#z3qX7|z5e3>Em{q2c@;u9lU4j4PFw5 zbh*B<=2;2bJv@{fq<~HV^aGdBDk}IL*g65g!bz6!D&}aSXs)pbNQ|$a zHF`YniKa>O%ZL9KI_3kTCwO2~1@tvB9P&qEgq_YE;N+8B<_14al9C()3GfH(c2v>6 z2J#A>%uXUA7q?2bp}pi6Ca$lDI<1AQ+#H}6WPL$XnAM)K1Lg$q6d{{VKIK|j`4f1S z+_&#gGoY5VvSKWqC_)4PKMaC&i!NvxU2pC4GoCo#pT|SK5$##Ubg>L4GQ>_M!_V)= zLq}~k7-NJUoe0(J=-YXP~%e&(b9|DyTScL~`(0wOXKc1g!q=xYTkBl>iyA$9(R8&0N%;J~-x64C-&Noc6 zVs(zLm3mohnP>RECb_EmtX0wiOk>1Q#tw$9vGF7Yq-9sVBG4OcyvI79_jZ0a3o2Fs5gXnwM$Wg zYRgw&nJMKt2e!hk&wP!Ha)`8mJoh(gZ&%j-&tb1E40E5+*j=f5F)uOw~X_IYhp3avL&%ny}^ z0l)$l$#_+JBucwg&cAz69=OW@-#?sSxE#ULF%0Nj48SZk+raXrWZh_K9nzG0_Qg?r z&GH3dC;F$yKK!Ey`z@q=#nd2d#z(xpS;4v^^iaZITzkm4NW=k%POx4=xxBmz#eKv2 z42A=sqQcG9ly%FMK6?36^W!Bd{jXiXm;{rswV_NU0zsI-;9w2ROH|vP9coGR=$=sc z;`xr%-v{*w>{mewuavBudU*5tF6k#qB(f9UB&Y=+Yw=;Z40VY16lnUSEL=u{Tn-w_aa&g7m zP~Yg+FPn&e8T^JZ&t8wnykmZL*8a^yNF2iv9X10oR|6$fGE@R4T(8W7CI71=fP4Xc ziQ>TEd|l%D20~~vFJa~2@w6k{3n0ESjBa&RcNM;EOAyB5!oE|62k; z8W<73PA-aS(N|t^rznv<1wVn2>3-{S&6*nZqrZf`soVNVIAB5Jz>|yr^hQts7+nK3 zug^4xExdA3miGiqDqCLNhc*%zVqlXY&36-(QUPg=*ynjRmiTQX^F7Eb&Ewjhr^B5){;cp+cQx|;vjNpFzSDbPSrf;Wo@E^ed)p^XmbU)Ma=h+(tDDQRIb#G+12yf!wf6;cR{o1*TU|ggRtg^Mg(<~PA4nj=X5*}DV^ys7_Bxtj z@$9H~(rquZBOh{H{o^m1{I3jG>~@}|JA=H8UJITCzBr#97sP+hHGWwJL%#*;%8RlQh`RRk6@v{Uag6z+!EA}_ zhW)!?tdzf~d{$S$d>0Z?fmj20WC{k&xLcyH@&Pr~za}`hz%wy5F_FA7Y(BOJ$`TM| zpy9PX5U@!W)UFzbi}Nd(J_tNU#MX7eA`_~JQ1oL6!(^L!n&qgYql2ajk-ji|1=zvc z^?SaV8W;f_!cZx(wmkq-^7#GpPKxyH;BSXeQ-F^P1tzU2G?I>nM(dA#A?BGFh+Xf{ zzW=TN5eE>Chuou*=u=&n@qd+3hmp{0+u713(q8bctC&8q_L+A`wl!9NVkXw(_b8V> zd{0iMB-((6*XU)r*=etX;-X*YacZ(Ngn#(hsPgK#g!Ag^giTs~?07cM{V@=x01Jw( zDob296a}$dcuZMW;8+83ar-agy{hau`_CMRQf?expWnf``=d&zdkuNnk|$T~1&4*7l2HVnrfPq0|1SrZV^f9#0sc*i8M?GZgLbE4$S?{F4Im zU+=WH2G?h`M?K8KM%Z5tJLV<+ZEsD9eBtQW16Tgajd1CW9g!<;!{g5-YTLzJ^j@~T zc;57chF^Y*(3cqf#i3wytYS8yq{N`O*-*e}g0?kTStn3Ub)^58Jm$yDJC2^sqzAOE zi(YdCUn((T$gDG6#)c~DG-D?2Mux)_1zs z7Kjl#{U_cPiWJt00^Vw38Z7ke7g}h*M`wa&z&XP~q=|GjnJ8Yq+NfU;T;~p0er4{p zYA`wmd>(COmg( zTmS)HP<0yG!+DSg1=YyKV8p3J!bQr1Q>n`d&0gibcchAhd6=nqef5;TBmq4@_5>~q z+3V)F`%~~mzmU)#!kqjM$tFyEW?wUyK&7KWUD1`47<7wgm077#B9TE&2$|eiHzL_h zL`Vqfi*gCBv7e#b!6ow$y3QiAJ}>AM;0=ayw*8+RP#~aez)%Np)s%g51G@!2YBuFSaxLyeM;( zjWnh_)ub)~Tfc*gM7rd`3wrIUXNMfBN`>X%uynIa{8@m6M zD<-n=UJljm)Vxt%vH+~fXF6yw?(@22U+u?u8@disT%DRP-jFeXWgFl6rJr`8o!E+Uyyfc!CKW!#& zQGLjCENHwjc%&oVx4hssJG=~85)gp+n7W=l;U$ZY*J%PeMi3F3$0vaEwV|a}4XS{o<{}*9>gq!&RFjW4 zbDTBF*3$L;oQ5zO8xi5GbExmL3gl<|q=ARla(uLyZ0#FNV-!;EHSpuI2qVG#v%?a7 zs*m>_g5bNi4LFyc^!?e!oSu=Tt1;nT+V9r~vs-t$pU7f0{}(}q z$~okokVH01c-Lumv!L7vQxmNKD=OG5WLt9$9Mp2J95VSiTuFt8mIgbwbEvBf971?# zS*XizyFyO*4~W16#k<9n7O$veWg~Y|So7e<9$C|G0suO$&Zh`~(VVx9a={O{%6wr% zD~=eOEa5YXvh7?c18_h+^`yqXg|B&a@aGxLJFz8MHkyE5v#c9B;ANQVeDV2PTjI1U z@AD!9lwyGgAHs6?2pul~X_S#qW=x-@2I5QRH#y-9J!GIF4Ng*IY)BO)3titAf=n}T z-GK`Fe@%WU{h_NLk4@LNd9qPl{sKUfU;@tJJ7pnDs!sP<(HS+@-0`^K56nff28Ep2 z&%nO;{@IeMKtQ1n+RyNsGf+SK+M{i|Di{$kw1yOYGCvq6wUI*$TU7Uc;a^^>?6n{3 zyR35$1K+N`;{&B_g;m+Yt0WVscdpXnC=4K?>rT2mYs8M{OZ3xb{JHa4CZ3)t z5`QnsEI#)~<-4>uSJ`hKUQr4TBNzEx(WX=&Y<=8W43xD+C?eR}|0fJ^Z@c={;M8%@ zy!s-S$&qD9m&1$tquVQCI{9*f<`4#jgaYrp{X2uzRMF7*{B_AycDlw}U{lo9n7hdn znJZl%7KRdrD+MWMG*8# z98_8uOgk2C2+)7w#6wFke_o>p^`d;^^#+cP@X+nJPD=+eb^l`@wCmuZ6j7BGG28C{ zd@Kw0zR$^ve5H+;80>a5F||Pkv!t-hPfs!Do-1;HCd^)})FbsmAE4+!ulvZESLV^g~c7i-=s-DOcTD&k+rsu!cS8rw6H$+#Vb z=RA5^=W4Te@01j+65tK$c|mpj%68IFAyItlM!>YaLMnsZaBQHD-VR|U@(^N+dr zgUI3@A5;_>vI@(!H2GYl*m(H>6~O^;J$Z1nbCMV)$R z96*CF8cLO4_9GG$QyD{GBo1n9CnqKgBdT)j{w|aBDLvC{+*&@e`3-=(yfvC`uGFAy z@|R=rp&3#(4QuNP=#Q!|_212=%4ZS~ncAb`YpKT3dZ=|WT~v<3%9Y-VrHhKu}Vm>+{@JkT-r)Iwwnh(%twI=zgVfXXUIN3C}djyPaP3O-@Rh7L$tqo zT%009DWMdO@O8~m{2Y`N*P*1W40DjhD2gPk0I&K(ZQ{9;pxZHR+NV>tjL}U{9fQFQ zR<%&}cPH65clZ z5|Z`a52e?p{`2SPv*z{Jt?^w+?`h1?3Id~PsiC2YOwJOf=Fmqj$F6VwXkGlB$oTa9 zIa--zi{zVBJ^KjHXO&mX{oLc}m)rLI(>^~5oS*u%{r%Z*|I>$EV@2$%0Z{*X?~cZ0 zI#8-VYCrJwyN;*EI&1rM-I*q|)0Gv;{sq<%P0BN(b3}|%9*A6wo?PAk^*%L}7Q4vc zsbKn=o9;3TwQT0iif>-Iw{++LipB$GLiT*R3_GbP^>o0Hf^*dzNlVv_8b#~%ToO>e zN}~uGxmh8HB@HSu3cP-cDmXovkatJRNo|h&*V~+jAv;` zq|(g4*zMu3P6-zKfw-<4ECj}vtUvACou_se4^;2e6q{#q<7Mk}G47>~cU+SbiK>-F zvY3MCH@I_!2U93BuF)c_3^ zhn0Bxf60Mx(4!~E16vQ$qZo?@s?D>xwckM#uRsl2wYYA669#_@n~Tu{_^;J;V21Ii zc9#`S;079p0&fhUR{`wnbv-rqFl-fQCcz0T8CMqqh@g|lOXDoEKZ(pG2*<);pfptF zis{ApgR6t`3_OF3kwRE z`#Jh8k8S}_7FdJepaf+nKCTb|k_U5=3G%9ZF;GJhUG_UIMyWonaV@4icfLBL{%zr{ z+V9}BZHe#XZ+(vO!GACZj~!Y;&<+Hn8(8vE-Vi?^`9Mn@8L*~{7yzG+;)4U6kKRY> z04_q8@SWS?H=s7aGk;*M7B{VfrcqjQerC~Tx`aicH)IT)4h!w^>1^*1zuJBj#52LP zKkMsAhb6RzgrD8;r}fz7<>68ENLRJpKxR7uHe-ASJ|9AZ0+L@uu^FaQIKM7~eY}6ZNia#1PCA7l929G~O9U3Bt>oypo)LkQxIPofe zO2qLlkKi!Jw4W$B0ej4M8VMpz=>Pz5Jtx<-QM;kTqnt~X0eKv_PzBxGMVoFZx>;eF zb`S@dod=#BI(JmmuJ|Cb+c8sR(u)Mzhjs)lA0mA&mKu9%^-3#;SWdmc+H%+wvk88K z=Uhq7$7IVMF@G&uD&-dk`YQj%smkj1=q5;Wk_SR!Cw?Cbcg0_qro4C1m#j1)4VM8U zAWst}8Lm~%NbIzTiRNGW9y47s;i1hCK7SL;3UtV|5wmUh%2vJr%3-!`X71sM%B}F! z;C_r>Z|Belg(6YrQB1gOs+Buo76@&A_t{$_o*2Sx&ojmeE_1ofyf*NGI# z{xM%)bU>@znQ0k>22f`dwXXs9`@|~J^s;l)yzP-5Q#X*T1UF;?U}-cr&)r^4zsMUW zVR|M`AIm7`QyDT9%6V7pVT<|)M|mm~(jZEKU(aQpl(Q7W?DmLgr%n-1>V8zsj>+RzCMS9k%3S`Tw|7 zEPE`OUMh>mnX=yyg*J?UeFNf$MLf95LB=5X&Pb(VWFsdVY4bAU!bx9K(2KV=Oz}ED zqOd(x0tMfjcLonrok?)jN)QMbz22v)sV49LM)z>aFDZWgsS_V!eE#Y@$tqL=y|Yt& zO(J7RwuPPhDaG-rCjd9Qg7ERm8s*&y`UgCd2|~~~WOg3jp>{QK(bv7Md&2QPpI7Fl zG|(SW5Za}B?_jnD+S_mDQf7E4uSH0a$h~Y6@}Oxxn;fP{sX>W`ZVL|Xh*3E_)?$kQ)7$CS0~wEktI!HS{z)gCh=i94OF$E>iy!~5u` zKwzS8MrrH0DZ?iGf^M)xNaNr~@IzrdI55M&5yQyp6_6l4a=#>i2h}`U#(Dq`9Tg6h z80Oy9y#0`T1pz=ht)2~kCGx-eiJt$o0GpK*Ju!eYiYMenY9V#&%RAhabEU{N4x?sr zH~<117bb_=#qq2rAkxQr^XAR|0pR12NpiqiA+h5G11<1#3I{W~d=yWcIrOTr!LqVV zJXwYzP)6ZD{658&%g?-~Dkf5FHXKgGH{aVq69I-vMF;qM zKa`VGN6JneYva`X<;|6|<4TghaOr31Czam2cFMF`L}N0sg3(*=;jlaBVs9ps2}m*q zB6MUTvIA#jjF4uJGW){BeAkkP0?WZRH9wSCCtAQS5NW&1^=?9XOI{YxX^^U{n zJ?^y|T}g?ScVzOsG*|89N$yKX1h52b#-0F}IBeyGIah8;bX&#VfaGyM4$qE|J%`JZ z7%BP>rTTtVLoS;khJ9?c;JtF}M$=%RTe%?tFl+Vx!#u|Eam69-;LKlPRB*MR2B&my zwWLjJi4aYe5H-fHaI`3MaS|1!PUI2o4-L>KeLk{L0^*z-nd1b*r|9`5~l6psC$dGd4D! zx673RK7=r}O2=i^YSo6lKtc2cJVj&|Ex>Ui!ygyFP{=w@+$N= z`_m_sYl^c-&y4$l=(cW$2_#phpvlwF2ml}k9LqofHqZdkPmtEo5Rh?{Z0_H)B=XJg z-_%}<2SxK<&@Gzl`Z&!@FPkc=z#1L4MymK-h&3rV5gc6<@9KGq|GzmfjNzhAUkGXw z_N|(nQN5R-<$N;>&o2h5#iKAD98lYKy%fD?GDJ;C#&LAF+IcuAfmtR-00|(m&$>+6 zELVdT8@RsDn2H={#{jbod~P0SB6!OV(W>P<=Ml`Cx(L zgV(14vn1ea^n~o9ap(0H=}1GV-+y3rLy#1XoNw9i3AyZ)b=+>v%ve3|H%7f}fB@}m zHLaDj=GCzew+T7HltJeg3#S)LGOs)GY7>A@B2V>3vyYR7UetKSnIv`4L$0V*ZA_N| z#=?zFO=?V9|*FEaU#EHN3 z9Lp%U|6>qd?cK|9vbyBIi%z`o{=GRmvd6d`LSSSA+ViB#P)K9Z9Pq{r4rBA!tFsk6HvOL&hl)$E9GYi^6N z-=0^;?^oqmbny~)BN#z}9xHIW#zL1&IUjeXPH1>`d&IEH$PGi_)XbFX&&-_iivx@K zqZva>OB3fvL;cM!aC0C{vHOStxEAM3*`6{)=(;fXr9djFp?Q}ZD}!V+s4@q_zI;tR zwjl2QQ{J6c!m0*g)i(Zcu0^<_1ASWf$=-3i;q4bN(7!s2L&>z-bM9Pa7e^@*?&#$39M9Iq~)XxaZnwM)mzd2e2DxX-f`48?soI}TNT#K|SZZ1Dq%n5iw_}ate8gx^rp!({;g3LhN#nxjUA4u(Z{0H>M8NT;?S5#8 ze1(a_p>bJ)Uh6YN;?<=(Ev`-~nLSxV@@J4u|My&fuO?etOLtoM&TZHj$d&@`FmcCa z!?sow-@6u7?o#i}{dPQqU8@BgIxselOJYiR_|cd$zR&OV80x&OsPmt6TRS+dTWM{^fu}<2%TNi#arXtg9|lS)TV` z6!>T0^+H7P=?7<3(IHb%z*Yfz9?+zu)W~4S=;^j4M$6~!e!FJ{1te*t*mhLL&|6$R zDocnCLiol%cvcj0>`$8ssTtyhDj#UE$;rt%c{0cs#6TNplK{*+@OZ@$16%&@OdTQN zwrkX&&xtU#+Y)i==Y2fria#T(2=S`;*O!WPw$HCfK$Bu=F`Gl?VQ#1d7%ZWe1sLHU zQUg#NUtL2806+im4OU2%03Ypu_>IpfFoI|_OzTg=s+l}Fmb7=MHR0(Ow;~$i3|l=E z^uF3V>1-97uNF%U>M5P3!uIX*(fLO4y1AfL{}%21-_D_KyQ>}k7+(g|o`I=V@wxMv z;~Y#Ei+RfHv!JeE;Zcu?6T%b=^G{JF2R!T`1KK@q3$0(kgbB{f6T>P;!OXGpV&kUJRv+0EY@5257>^ zvx3PnSRIcE)HlahJ_*rhe>$Q3$?`@aaNbA8C_8E{42E_Scv`O zY+w@wfj2JpL@AD|%3>GQxPsz&d;1qXd(8v2lY!c~Z_#tCFK@;F-J|C)f2B)!g@thO zMUxHJ7Ol8MVIySgx!ramtrQs~w1Yk<=Cg6RIYlG<_6A)n-dGmab=>=KZ7B@eme?8$ zngop2!_v`%`ZenL%KkrJZuI5=m@bH)cUi=xsikE6t>mnw5w;%fPy0T>UQ3w>5PWTH zz!wXEuf4E)j(s=1P0olV7rk;Csvk?eMRAZDnot%L9k4w*nuP2b?}IS>YI4`$GF zO&`+5azW6t=&)gSuv;cHUs`XqwddrP)WeZ}tK^hyofIY*Ro4fTUF<=yzv)X6C`QGS4IR4=|;Mb~Ex^ z_kQmYjCp&XYGW~a5p?`;4l(yrN)bRjL9pqx871>q3#fXW2R7Rc_qWRDs)H0S-YXg5j!;?O z%waUSRURr8mzA^v`9^|ETKkCD?VZU&zaYVGgHlj|>ohvE#QVJKd=8B|_`pi( zQqBAR9rF@s*YZjP)gJu8au5`$9XlAASgz)9qy>Q~U)yGlV3l|b_)Ar0Ou*UGnnVlA z-eDR@f~FG$z4^Lh>Mk5EL4OBK_;@%vS=hqY&AvxRXpRQ~rw41r7L$|%)EGD3VBe$q zV-nl@7XLo;lcHPS-fXWwAD;C_j2;+-Rt=&KKHf}Q5Z^Iq>pVt4^@ki-H+1Xb>b)2a z#WL#ZUV|KAFBOd*W}IIM5f3dJS};g*4cU|R|51zJRsT=rnw8SO)O%M& zU0;$E9!uTSQAt2G!0OkmIzj||tg*2G6V3ubc2GxyB*T%%5Em3*J&-%}X2(r}r~=~2 zE{^QlzS_-Qm0I*Yc11jr`|U#b<%^y?HWi&2P1zM^yTS@KVz)HX3s*b#7LZ!L=(TgP zl|b-X`CM4lvo!p@bNWHuHw0Zfq4g^t^$U7xlS^FZiwSQwd;e-)GO?K8XJYIQOl&gl z{!B;{I^e z%HEdw7~^LF|J+c0MWUu9pRPHs=aPJ27PhlOp`uJly4Gq~VSyw8D&Q#r%ZHgX4SJ9 z5@?rzJ?0ZE0e~?Ow;MEl}JGO5#{Ju#e!u3&ZRvUj4BaAhm@AVuRXn2|!0J$W9 z4u^i8jrVJAc8@DAo7t+QGhJW4>(ixKvA%G|Z#tDI_rLHh+{d5A?7ZmtkMfyo!u^Ti zJIfTgd!r!SYHE zdn^o}LD!N{g)t%iJ+Thtig$%v{_Hn^U?l(g0K!erYfe8!B^F5B5VzQvvlM=ZfotDh zlTlAbbU*Slbm6TXGhg4f>rA}uMX_!@20QL5$1k=P``yuG^277du8+f{+a0FY-guNW zv+slFTz??2_9fN7{<(7S{gmv0)b*gR-ugsP=Z9QI>Tzz`fWC4|9-%d0m@z|6yK{9LD4mQZ!>E3#0zhKcAl3x`nbfH^=UrzAOuHOp&)HRcIiR9 zw|6vSX9{>b0sDCb@)npdiq}UFs&l44biW*4Y?E(i-M*iRS^DoBMphp;DLl`&?9gi3 z*Y%aLKt;c8Z?&noFSyj}AQ*G+|M3T(dF7jK&gk>@-WSXmdzP+j*!4Y(qK8AkySuAI z$943Msit#Q^wdkCjE9>#?nyE-k5O5BqT=j$KT5G=Syz+J3yDNH&pnD!mY;sG`P#*) zf$FOMAX4D`bJgC|Y@2#{coOf@!NUwJlBm&1I*MjdxBb|nz`t<1=#l+P(?MzMjYgSZ z=X>HsEGBry^asS^{65nsCF*J5 zIg?m4I!mHLNUBb$I{L_q=&NcyKc;k|=QZ+ehu0U8JhNt5p@zr5V*T$&NuyLiUL=cp zAwx+;2~K&7MNp5EeLka_gdFbv5W zgg4YtH=X3Zf;@gT8%xl02;B|=?Uc2J9L25mIM5d*;xriLL^?bCs>Z25Hd-G_Ae;aB zl6Q_VyGj3XVywy_3VBDKQhTuIxUXxoaKM$L6c4N)WlcF^gyyRgrjdIBM?bK)o9u2v zZ41;myN=bzfSe-71K9gbXFa6$)z1eh``%#&w>h)GagU$ zC?#^?rI0tKK+a!MUIM8T73RBH`x%FA#*sdD=XJksBBHX^zy;&zf+jeK6RMnv^^`pH z`4yU_9VU#KfD!{#;hex`D`6HW6(DL52{Mup5AXJ?{X2syPErB$BVbJ8jQczJ)A}w6 zxGfd-_{jB$(U;)^DeYZ^->$FCj5w*cT<_gegDcDle6TI4BWzS$MSE&X)ngT* z5wRvf0Ag%*hp8_a$JZ467b}>;ElXBP-j)^vCyJdfbAD)JRxXHzqg`GpwDp8q8+FN_ z%RAfs?FLo!XK;V8{zspK69NczUDKzQ#Z^i?Pz_?x9NWJ>V8?W1{@4>Yk52Hm&4J(c z>U^NRT|M=B{Io#mNeWt;y(D&wJ&*ft^5|5FR;QMsE zEx}7pygpg>P?)dB0nVNXS`3YGuFP*glJ;p#LeSFOH;NHPoq0-vB}O8Irl$YCrkSy@ z9RK4X(1czgputKqKYyggVx7`gz}2tK0h~J>%&dr@>=^lNSRaI(*FxUhZ*z(uWc0AP zxjD*Of`BTeFPYrpp-_*XXaz%{X@{Zfe8#hE{?W+E5DOcD4T~o`#RUbbTU=<&)7U92 zFrUp%yddnwNlW^K@eQ>rr zAAvOj8^o`^1|(rexC9G~t1RovH|??PCwk0~l|480HL~LLl6QW; z&987|P<^)6#XF^VH@{qkB+lJErz9Dl^8OPS69)E%`?x^UDfcnd)3I9bG&LRVUd>DS z^`jbxoMMDS?0m>4*}j)Ssi2JPvvhb*q@7{WqH4MQE9n(laxet zB?`_%KbMhg&y& z=9+3y>_w6G%(^p~aOkoCG!|K}-Tw3wb_|^>RNjNGCy1Hh;EwBx+sQc|BeU4x2ErH^ zrh_3f;bObGJq7Gj%ppY3!u*G8E;+7VtwAk@p&#*+{$(V|(3ckl7<=E`Z8h8J@BRW; z4Ri(+%yCbs-F5X^K)Sn{g`>0lX7pQ-r^}w}{_%_JN4c~Zit&P|8%XuVuMBrovff4} zRBBbw$4~6DP&r%^tNU~ND*60GA0Jadb&HmLSA&YM|Jqa5zO__m?MQpyFKr>M0<58n zB;jblB>zd28kX-sTi%PSk%%Mqcwe?)Z+!miJ)^F~^mCH^qc1Nb%sSUjs46^ID%N6s zTW-kJz~s8)Ig7m8R*m+>Nl#2#M`>MAxo&Cc)9UJqg5s*BAWC#MwBpu?Ci@Ak2g5Tn zz>`O>u9df@el7BMI{`Hiq%ml9v#c-70!Nm`VL$3G`A z2pc|y6|PqlI`^#=N=u9s1k@7bS_y?$p7Y9G5*o zpd-Fx%)_Mw1O!wDo4$U%|R`6KH7^&on z9f*?l%bN&JMj~eg3I6%rtf;kVA=or(MR8MO{j+fXcA+tCXyMfw%SYq4%@*ioV6%e& zXszGz`VYn2zl^_Bo5n?s13}7s)%Lr5`!}szblIm9qC?M+?4W9C8P9@E$6xCT4M^aF5=!OnGKB;DN}acAFe$f?c1fHGCsbYRgRS~5xKb8 zU*44_rh{*S@V)!zjQ&zeinL@vfA4HlVfdl#JKB=i3=Up(Vmu%^WOw~YmeL&0Of{|k z*5`+YgCwbsFLzHoQ&3AyG*TC1>_K@u_wW)+u6u_mgH3u{K-q)%P1A4ll#269?}5ot zp5Z>Mc-1DCm^C7VT#oe^BMsl{O2y(?QDEm#M;5#2q4n|KrUApo;YU?Tl^h7&B7mET z_!BM5kY`O)9(Yp=O<4dXO1<;9x%7m^6RDKfF#SLe5b+hBo1u-r{<-&wQ1FH~|BEnd zbn7W)!%e5zd)`y8sQyg99$Mh?#3)|Pkn^Hp@yd0;fh4S#gI<_Szuf#aQEp<@8ffzPI>9Y9ot!# zs>j!U6v&pfO@hdufb3REmemK#LyIA(cgk4?AwaGxXe`m8Ad#Wc&D<@$}@CusJOcBEeh%osAbXOu$cjY_#yw{DC~t95NKfr+-3HtY#~sNfKmy{x^pjdapV0c1 zRP&|F9YRs;?`fM|Dn6|9lln@U1aU)X*Jp|U?xp**zCRe6I_f{`V#-^6d=DZtY-!h& zgaal}9rSWN`u4>_zh)(uO0S9IA=WRS8ESnfE*m|fQnz@^0u2tcX#bM8@{i;q(b8P* z1en;fQaXXR%uifgL++UoA!PZCaq}jaNukArOYEKHTr^Q%yDbxA_E2Ser^PWZi+dxC z3<+|CBY!T7S7}KK0Ag8HE(vqTH%@RHV5XWnWQA)Cd0o>r?dc-otQejLDdI`C^kdyv z%I$YDeg(YYnDb3#9?{&dUzM6?vJ(rL5&QgQ*r7l^I|}PX`;h20w?WMz>no4vlJ2Y8 zgA+U^0d-ROhsF<9poHF=ki=(e(y-uAHmwp}&y+BdmSKwemvlb9kWGY{b z+bbd-=`G;Q#aI!DNhl>7X<2cqYv0+mrjB&ALYelDjj>rzo3jC`j-<_Jog4DHp+3iB z*Y=NX&wstH-zR+5hdTKtqnSX=>oA{T$^uH9-H*c9bY^nZv}-128Y;r<2=bywOlr0% z1KPWydxyO3TRjSdA`cL#xED(nAAK%Z?;o&Z`o`E`GneF%A@~S)V%ip0wx1hRE#2W% z#@tMhFSQGK3d#_2s<^L?nppxw83vht3uews=59vbC-Dizw zC9bIMq6bL_t_}#`0zOC>q6{tA-z@QBn6e_{s`%z1hdG%VA_!9YZ_lXx#5QH+72$yM z3KJ3}Sut4556A%|Hp_&K3PDQb`7YNi7;KJ8VP+;c{Z@#F@S=Njd{MIN-w*gYQC*=D0uf4tO8%Imi;&yS^eyY?pVxw^PK{W? zJ^s8Oh%m_JPASn?2GRqn4~6QtE8WCRptN|g`|wn(dBpBZ_VqC{+1=0Bn+atahE*>f zvBZLU2Z%PC>HL{SM)@v(HCZ1fip<#X!BiigQn84tVE*EkkCFTOxVz?eKbNgh_5%$e zJBDkH!8=<1j8rHjOl44f--@WFRr3|jxv3*g@~m2rXzNE;zZ{D;vo!xbs`uDB&^dsH zskAV4KA(Vw5TOWxl(z>M6e4@F@0e*l@W|QAn4K+zHY}tLKwnug4+Ej$Vi8SzUE#6) zVKGjld%>}xU_j6Ut*_yueWu5DVb@ff=xuePat!@i9SN(CugRt4ID&_UK+Z{6(sSh` zvQMw-X&r(P5UO~6!ZI-6tfdv7=iltIr`PN@opR!Qm>=E37YalCSLs7R@sye^l(dpZ zWm(bEqd|rb==&wH^RN|23xkLXe7X& zS4>Adu|;Q39DXkmSDJGr@suZ0vuJo@aeW$eDf~2GF~-YqDSIr2K-85t+(p>y{C=(( z8RRI%B3T5vt0DdP;Z!LXK5UFNpNH1S-_zsz@jtn#yX=IweKqK4^Xucg``c7ElSL1o zw8x>5Q=1T8S@oeXm3>XPnp;S2GeY~gZp6_ZXO#;|?`4Hr=zW6Eh>}a4QIs55a9QaI zVqaoaP}@$vQX_;Qi&$f;R^tXZkh0r=?cfyp6ZMgvt(6tarWYK}yGX6%&t=n`C$JMP!p z$}RgtzH%NszzB>!$cM-EybG=^;HCJBn-Kfn_{DJ;=QmX@^xiip{3d+l;{x!g{L#M_4 zO-J5`=j4JPi6VQ#<9YVolCGoh3r9^-#rwO`Nrv={9vqw# z*X!4Wzz~nW_VnIfLs7(t{wI&!o1A}PvobA1S`qgPS_hkY51BEz?)}{8YJ*q?7(^%$ zbm0oqqOO&S5}MqXh;{LbNO_xTuqfNdRUep^FHP?AWdC_%6ZY_2kOq*fZGp?R%nHuLPGQ~y3-rnPjURlB)hFR=Vl zSplyPF#RnabDv841e}4CbH1OvUlo_>P6%5p(zgBxS#Y=?tNlB|^vrVSL3ECHKCOO78UXpP;H0 zDefHroFO%b&^FoxR{4(19YbdPDafXV+y^dAtr`^j`Nqwhsh0t0Fg7Lx8#{BqzggZ% zySWK|cd&_nrQMI4-w9~H1o80C!r%(}D6yQk>fW=1p$$X{0Ol(wE!7HlPExY?<@tS} zz;RS8*j)EXUy0FrDsxCdSsDDjKQ!C529k}Dj5IBsq#51EW-HH5P^mo1{)x1Pi9kQgXiwIZ} z`2C&L)e_izO^&xV(@>w7OMBFTNjZCRMv2ruuwVaO*>5X! z;~^TgfniTP`m1o>>4g9@6BIlnFRd;n(dS>XBlUQ*sI8z3!t}*`JGa&T^)}k-+3)!> z8;sfv0;yHhTO#d!SkFHPMrQ2sGMG(QZ-82+(Fc|wjZQ5TsFwl}GNbJf1HRDvVxkT9?Hq=U$?>3=)dM3I| zzPIWR26@<9;*us8g#-n0B#7qi1)Ogiv|v96j2lzYy)1TB z@AYgF_$8pisie4c)|h(9nx%x5#SDopH*KT<%K@mPHRGn=SLtl0DN2@(wE10rmTeCJ zra(!Fbc@-NVS~0Y=lmJiMqz>g@6M~dA-mQK$`d7T$n>bJB!OWik{2UoTeIx}?s_N! zKoDY7ej5}L*f%839$RwJtv}5wEma~T80WhU&A!TV^+(^PR~#FL$HxP!^as0@?B;R? z{cOlm&kLQ@^mRjFC;_8;NT#f~da6ql!=I>!N%qKz=_ggSBGG<&U4Y%vTKP2YupqD$Sp=aE2Zw@k>C;HqElHUYH zV5t2K|NC`hGP_2QNKwGMckg60hGU^e_DYA$exi(Ufd!Ol0R9+Wehyz0@IPOCrX|9* zyb|p*#X?1a`QGmume^jPtbl)Wdn&0{tp z5Je>8jjEn1w>MVo03vg&jG7Js_GLzCCDv921NFmI5fOMp^6mRMzA-1FX{IKivwNAi;e@yz;IB)`cD-X6{$in z?Wm4yINDDD_v(B`1yK+Pw*U;AZ2l1dE|{5fTGWU;lqnS+Z|^|_z+*V7+M1g)z^e#r z8T+;1xeabnF`3gob;~a5RWI7QAo2O0Em0QDaTO<^T zUvhQNwF2(Q?{l!>d}?X=J$wmP_+SI}{0Am2!{?}cS8wj6YAL@SbB~tIu2W0@RV}V) z+bg)ap!&hEJXDnD3^dj*+xEw$1zds@{a3GuW5IqvS`0<>;NCK8-I=4`eY(5(NfW^>)wP0C(O;#XPG-eR(LCG4P-T8 zq?#{$dFOa6xgxL_uM-9@O>Yll8eR=L^8KL$vxK*R9`xk?)Eq6I8BS$;y=k&tO0N}s z4HrGJlDa&L#L!>9j#J&IF|T{nVmdWBx#2R!K>Zpn`TTgO6Q5sd&qPq)) z%}q4`G3wX1xJk@zPM<@N0BbJWGqV|A`0To8Q{n z!dSC5v&$2f6(Mlm@5Lh!y}=FiOsD~RPEK4UdZxr_#kW+~9UC;!NOzbx7j2HrJ#RzG z>iofJMcetD&e6QA`85_Qrtdqn#~iL`;fKKs4O8B#mX0^tzaaR(3sTCmKgI&nw{~~} zNT2Fv-Ek2G<{nV}3Ay}5AgH`g7K+vs;?xnE#-tKN%bMoNI{yPrp#y9Y7Nf(^>~@_O zcn|C93S`hr86TXL|CKGZb~#UsWa!ou`qrW$w;E$Vr_)HGU=aK9Gwq%cqNZ4x7-Z}d zad8*hyn}b1P(si`r~&)S_nznh5}@+h*n6V4*WW4(1%KbERa_b!tS&c0R>|%gp+dLe!M7iFw%N98Qi&lSX zLH5k3!A84_q&J5b&4e&Vs{~)%{HM&Jsp%Q!9y+K{0HXo`TVN)QY&lz^>!tC&tU^-( zt1FDUd|4JUYin!SDlcq(?a3Tz1}FER{HHfrVIZi^zP8f3Iv8f+`!wh-{N2K-gQ`#p z4%shXGC_YAd2T==@W^1wcX7IZ3=|TWI|H3Dnwu;H=(6xg0A)&H6$R)DAZkK>(ct#? z7W*B`1>voflDV`GA^!rjN}vdVr5S_?ofooOEizE$VgNVw?Ch-2q>uoM-Uw#MxGGpQ zW&~1OC5rwDH@;(H(d%mY)Bds0Tsd%qR|DJMgjuK#U?otk0AOxH#0AJ*8Q0BN#-|}T zF%(Xy>iIlk@6a3&MqgO+6&HKNu5=`ZpKV=LAGlm>oEkqLyO&~r`jVrEgVD#2NreSK z3Ab3jBJ)O|%7fA!KPfLUbZe##Dp6##r)}K~0;>=82ZmK*J&A8G5!M}`8v#=a`Q&_v zMen;@fR;($DqhuBKXjywHf7Ilchi_~AuCkIVY5`(z-?ub;w~<;?f4ij%cUJlV`E8h z*fm1Kn#>o~c6x3u5{|5((E9x*6Fv~s;ZCdH0VCeRh;{ZymT6>W1{Wg9K>%P)oyfDV z#+c1K0$mtYW^{299W*}#T*GWMI)y(Z7Uhgtfhpn+f%jk>n%6vfNpJ5{o2~l0OfCPi zNgQ1^n{gewz8uUStQFEHTHUrkf9c~trraWT*g=MlV%K)bhiLST?_a3^IR__Rz(nyg zm2)8&VgTgkc6nq=1a4%L>Y;@qxEvvXY*i-4`8(~yoQy5c+Ugu)i;JDL>)Xbu*U|&u z2w6BrrcaQGtir)EkK?UY^+;VofBWIjEr<=9AVFoQb+%zyr*5$5Xd3TvCX?7KiY1kI z3dztpMpwS>Trc`*ztdw)9J;rAIvSO}e;-cB{3Vm4H{A=-i?QGg^ZaXw%#%P<8yh@m zL&FgyFX1y(n{cbZ(rOAhTa7QifeZqKx_Jz<@@{fl8pK)$1IhB8m3{D;6{; zHFp%aRFF90%D)i%4oWR}BEaN;$<|-APxHdaTl2RX?1sDUEsjUgW9xA{Ea_{I!UOr< zygu9{Uzu7(UeT`ZgYoJyVGM~x)z6Zd9NC@LYg$KI-Ye7R4_z&{p6DD)74oN0W6}Q} z4|_kiTt}B1>kgeN#~%KcxsW9RSj0H-vRTZe>D@H7R}o=PxGaqk?b&^P2m&$%CTce` z^x|iApTKtUHv13 zJnGV(0KznB7(_)41_aK80a;qo=3m5oBnBHrGU?<5KLXRah~i$l$tk!)s^#CwCG9cklhAzYa~A z@8KAXO+@<~|D0Y3n{0wLEr>zF!(?){Zy|yVz|18 z_<>$Hw#bI4;yqP?1OR|P+3=;5sY1-GyGL&K%ll0bIRD~!`*-DV$y$wcCoEZTYC(dl z=V2~M|B*uX9`amm`#b3E>~n{&w-ln}8CDocd~?u1EDQkN)y(%_WRN=(U_!p93XWCW z>NOJ_W)hMTl%VqY=9BF)DKES~dB-{8jcHIDadDeFmZStGfY&1J&P0FzF+{&=J!eVn zH2PG#EA$L{yoi^4<8R9c5z0y7jRcB(x*N4fI+THzCWW&(Kb?Fv{gwnt}2WJFVGaMNsEe=}&tNobsu_wT!nkmQD{I22tj& zO2ifP;8FQBI~=3|10C+mtAr1LtxNj1A+iIY7V}6M^{rmM@DLpMRvHZ0hXTomZMB-c zz5a;{CSoB%4>uVW^Cr&fisa)IcI6G(ps+>sa%XGqu_pEd#!dX@SK*P8xQMs8=^A&s zo9NEy%*!X3MKh?->4KVekO>kL2=#QO!V=;G9uW#b_wtD2|4fc6>9fUKJ7a$m|+id z18)=vJ|MfAo{Av5q@-lI1dlgrtGV$&>(`VIO=|pLj3AL4aahmN$yD3bJ2=+$`DkuH`-a?{V`pu~g-Do;fao+fhN!(F?898=gP;l$vf2UgdO>0#Jvp*zw0?3>-l-;#^n z4}?p<=29Oh4Xw0yA5;sfGRAhm(*$7Y3fH|C6Fbj

=;ZS^Mq{K%aIvPyvkISz$YS zq~KGce%qY?T1Fj^iU{d2)Hf;|vi~iD2=M!lick2#RO;ctM1gH7iMvK2NFS_AgF-tH zfk>aGTAq|0*g{zf~c3nhD&4PEIJLz|jTSv+wJC?_a>u4QK3)CM@DE zMMhE(Kf;y)f55`P;UgH-&p{Iu*TM1P(p@GN?eegk4uRC?|2z*30%HLz60m%_iPBLO z*n9V`IFeIQ1^$N)0$d?DexS#L*9nr#tdbJE%_(cQHq_0jo{AS=A(xsIzQ8>36lAym z{+pgLl8PK-9IPvaCtM*DtKx9Y5FsO)5qXAJZ_vKu%@0$jT98WnPyiD5an8PFuGR@H5e3djJqZ_5gJgfZ<{>XkLsM zY>0xg|D)-=!?AAPKYrU=R(AF#B!uieLT-DH$SPYRWM}UYLiS2VMr0+K$tKxbgp5MO z@4TPy@q3Pr=Z}sGpZoe;*Lj`i`~7;qOrX;WWZr*wvT$}AGKas1O6jHOk_RngwzXTR zEgWO=-8@wOewX({4EHGMp6p=GP2_#ZU=n^Ln`95?yvbs*@-O@$ZeV1D;5xO3rQG9} zoekR`{%{rR+Hw52pYNZ>W<|Wt&YMCJ<$W{s?<@;=@3cBMV(xr;B)WQD8jvRu|MJle z9w9uOBvr+xSQlGcMUEg7bOR`vAzB%dDoTQ=|K~sk(U0WJIa^yHTLwl*XO+rAw5iVm zPl~>X?ikQMo4vFJ$SA?sucVt024#>qxwiJ3msLgR{+a4f#N@KKHTDn0`+#)`#iKp`F)kwY;CRUcZCGX)7Ah^t zffJ7+hYkg*qIBG@>~8UXa@Hf^~e?7&HPT=1HgSTwVs$J+;5IB?kUzq362J`&j%b1lTb(dO zJ=fUbQ$0sU%oN?I=f*U~43dGxT6uu~d286AUh3N&ek&%{$F*y*F4a0@6S^ z1E1YWAM2_IWeKGW-%q|i_-Ul{`+{S=nAvhtFoJ{V6)BW-;Oqa1_gMgCI3wIYV69es ztD364PXxnzJKO5p)&5#`CuCY~N}b9;mgI{3Pgs^|{yB z!|=U;aIC4i7nfcMga z5Bj~o5Ip9`LYV1xqf=8Q&7CwT^Boz;=Yk>PhP7XP&HJwvR~||dq?eE%mohZQ-X3z4 zTbKQ#(&wGdh zuBw*<@iyVM>`AIj^yw@Q{W6iTnZbJ!(MpuMrg^RV*W8v31o1+=n{@&v*)87B_y0w* z)_rTGd3kp_bmuL`+xPO8g!nIdYaGdI9%cG%-k|;8K!7@eyL^@zwx4kH>d|-~P_k3t z2XCHn|Hvxi$kn2R&OI2y#Qr*vi@l|Mc=T~6RYgJ$ZOp`O;&~~>yNmv=AF*;QE^BLl z(ezdm73NN_zUw3_Aj0c}U)&sOCZN>oM7@3P;CFjZ;GJlhToZnh|w@}sr5mc=G zk4Oi90`n2$%r&x3&t@~FoyW`H+^OQ5^F3Xrx)k$%rT=Og8C%Y!V zo9pH#&4P2;y_*z$!G9dAe&LnXl-3i)1$rt)dOYknd5-)3PQ~uR#EQb$Dg8y~#O2dZ zLxb#Ipn0LI%JGz!W8RM&4sh`(An$btiNl)bAGNOMY*>=J8jGK_&n*m3I_uCDFS^3@ z3O)&f5x9W#utcQ=a1ji5&u+bH-n(bqiQEYhCABHRX3f;My-WD1%teDEeXXbtE3fj= zpaVd;Q^Pcd$gOu5r&dmSFBsl^GiHym7N)*l)A#4tf;i4aAf?|*cc0_c=+g)&bmimIzt>O z@S0EGQ{!jH7~J_y`}Sx9^6BmfXRX^Fn{mO05CKp^OKn!05zpaux8IYnFADVUI|{9b z0s)Z2B0Nc>@WwtcIbkz=BsyCp^#U6k+ifk0xS4!JFX|qfX?|nlpVxL&Q7pgaJn<%` z_m!2DeAUbsCSq---{$x|cp~f9`1kLhrM(ZqJJn5cLR?R79D585OSB6;yPkVvpfDIq} zQNLkk(O0Y*l>(Da7_>|}O|By+-)_6t#=Y)ouLPlPg4p925{ zB42|)F~}AdkJSVL=WcCZfL@!t1hQ1)rW1$zP3+;Cy-x#SbMdRc7A{XlgjGJg^T?^x zl5R3FMy{Qv&RH0@7>LDVR{vJyfH?5grkO{OA_GwS;UkE*@OcCGQ3eKVrl?-w{3Kbp zK`yk?Ko#jRL;9GHXsyC5M~ z22Lh^AqxF2)gO#%zL)(vGX3XGWH`Kk#gca6)0KSw_h_{tGge|*FK|)sp;cUwimf)L z97QJ{J*JLq`tZt}Om0llTIBL$n(HO?J?`|JmW);V>%JD!22!Mst6$^Z|1GXOu<4C4 zYI6{Q6mi1CeP(Pzz5=X4s1M4y*m30oi%-SC-r_Jxg&Q}?O9 zMnO+Y{FT4QU5jU$skg;qnW$4EO+|T?O2xJQs*o(o^lD+n{$u&!gk_%0_I^BFzD8gK+_hl^H{ zs_U{DQqO5tn%}<-D*hs0ipMH!T>-b9H;-)@CRceuusi>6f2FZwJ_27GE9a_)^3{k( z$g8+Qb}Q6J@~k+h7@OUYWm?gduitN+ytq&Nz6t+GPx9lGRo2ZU4t2ox8y7JfGn&k9 z_%eX`{|_aw)KYe_Q<=~tf!qS}OP&BdQ41t_7A_78nj|Yar5yKzv|(}5&Kra+Vxlr-JSGChJA9xZM|L-V|{B+?YW`*+DUjg@=h%2VdJAI zp-1huxBaCVU8D~lPTo@1xKh;VHkER<-uRMPv1lCKSIjP9=P}mR@~6_-eKvQtOgUe< zo12x!sE7|8!LWEKHc!snyZpILV5KEur)(BIHjRX=1Fy|p{jkJ4r(Z0kUs3AH!?$GO z6m!!>lIkhm)2*-{ay6V z2vkEc`&JH4!@Aq$4-If{rWhb1Kd(I9ZD4D^urnBc@D*1zJ#~6V|N4DST^rat%dy|4 zgs&Adp>H8Nt%qpuPQA&re(!0+{qT%j3Ec3;#+etAB6ser)(ujdJ;^*i57pN?%R{j1 zlpZjaR*`=2shs5{0gOIsE}E>}DM$#jbi2@pQq*|uH^w~(MRRLN4PvfiWLzur;BRZ5 z1ZECUU&ntFxBm(kxZk01lVBdo_}oZH;2Dw3?YBdayUlD0dJM;VUr%& zR|Q$AyvMldQ?ELnf%X1)I0GH==FN5STZR+*BPmB#UxZ6|t+;pTU~m5-F!7qh%F#|Q zsTLvJ8&klAN>vyp=bWf>Pqm>E3}kSe7J*A8`)Zi(NH;%A9al%j%lG3w$s*>U@^^mS zRmb-8T#i2mHL$9^*xmGnuI)SvJY>Q68BwdoCJD{1PmEI1U@eZAIRtro|>g) z@D6KOE7RU`!C@M14ljtKgz<+h32}n;(L*#|Lnr%fI?_F?2>mOrs2$sN8g?Y^@Q`tIq87;=z;a5S$N__AR0C_;tw~VIEUiW;xUwKHS z)AazBbs5JHfu0$Vi(nw8iH5A49sC5$knPIg z^Zjc8>5US22F{4D*t*$QoF+CI5N?9^EQPeU$UPLXk~pUD5M7Yw@*Mf)Py+>I+TNCj zHU}7U-(|?S=<2geYgJd5howI+MYig%%D{II!B$xo>Km~%fR%uR9i=&iX3;HoCRXDu zumVBL6^ItlU9T86)72%XrKR1o$>&|dS2;|W^l9$E};4V=B~0unY~%Xz3i?{4wMc_Eb{{> zIN-rfKI>U_>)byXWbZZUN;1)<^{A$Zht721Ml7yTa#HhzvHRCo;t?oOL`ZHfLuy6_ zRa~k2Yo7&D_m!x_CO|ta{ht2ed}-K`m1o^k$JZcf%8LE{6x)MaIEGS@cMZb^XOTC!To-m##)z+u7R7=jNz)CBkW(W<@zdqBe$y5R# zbvGr8d8lckq-hW8b*2U@^I7MD)1R3Ju_1WdQW7AaPeUW7#O*=T?5zhqghK();)LP1 z#~&gh5M#k~D9a{t{D&e68>!*XL=pr-l%!m_6GbauVSUjb(E@<6*`rVi9Tie2M5m-t z+0)2+@i|LjYUz*6Jb&9Wo`Kuu28Qk`#gDjLvxT_|6Z`~X$VqEragngTrAw82sFLqU zC2kc$?{7jp$?MzrIdR5du`$OR%>G27m49rw@)k`DQmQ##Y##^9WGP}k+otF>?7USD z`)^Xmh~~DE|Kj1wN{l9ifh6HZn|%1Ow^#1FY)_31Go~z#R$*1rCVB+7_hmFM4@^k} zUwP|ALU#c-1OZKGueWJG){9>yK;IQ&nmz)nuRU(|Vze(%JVo=Eo*Ls$eCE3!&~OEc@ke z6?WoHUWilf#%n@rvLo={^n2@ZqNh#`qBvvUwct?>u6IGx8Z@{1bb?$O8Tich{61(k zXsA+)|Jja^zV2@rOaN4_RU|TUU|@_fd#Gg4^x>D6!SE9};YoZFd@1_agh3n0%Y1zP z52geY-buLJAbxRaGM%Lw?=GyZ(D{>u1dg@`2N_e2=?Zi4Ph`dC;7H44QnZ+hc-taq zTJl_>5+4J7#`fJVhlg?AAQY`uGwDXnrp&sZN8SwmY$FF}Ge`A(zo6vg09sdMG!nLX zc(xuYU0vtz1yL8r5Nqnmv#Laar1Q`xu2k`P(g6}6I1u?DhMIyXK?V@eNl+vbJ7aw` zjm)Zbkmv5-pWT;dbt)Z?+SqtFd4fAOgFL&t(yMQ_ty@>*i4bLE=M-I-_;3;&@wEwERXI=nE7H~`Y{dN z!XIY*aa@7vJ3RKRBT+07OI8X&$KP5*NM)hADGTODaOIbN9UORD06!1N5Yj%oND_6xTf~#ZbW9 zK!hAbdkRbO?fISXcM{A649p`Y{>i4!LLx~E)P!$}U)E{=HnM9>PdaQuV!d$?hV)z_ zZ!Nv#J9e3!wmQ)>AK(^VRh4F$e*BuvwfGe|f;}@+rBH|7JuIloRNTxf3D0MNo0Os| zS*Y$gW56-#pMAr9|0jaXnhFmQo``!mOM3nmv@lMD2`S?DPhM8`Cr%J|g!S6oNz(X= z8+zhEL5e3w!>n=1IWEwR&In1D$r|HZG^90%K6H>(R!B>lB>HO6AOwWz z1`{8Vt!Jri=*F+Y&B!)MHii>)oA>ghZ@^@Q$BK0PS@EdAnT1`61{72frdvLf2__jh zeP4<=Qvxsp=2XqsowdwEK^Rr>v1XjR4fm^lk;9jlw+hQ9{T@HQna*!s(USAOq-+3` z;=tJq*s5{9S&JGgw0N-@8QLdValx6*O6cb1+=tayH%`z}Jr~@)d zXw*5;@}y+Af-DCL4EWbWX>pNnJS6x*c7Q5+3P zBHb0as_kWyyGa{o0}**1e?*BC1%(eSRKtj+;(6S25J6{&wD~pB!!aN0_+U7`{lOSu zYJ8L!(DW7zi-n|@3=FA*u;R!~AOsN-686oqK-;jcv|u4iQn-5!Z{G>z(LhoREovL? zZ1HA5#99*g|l+ z;&7m_%>T^tl8D=El;OM?i{+V#OZtk*m)rc8ulMcvR$=>+B~L5}?<>*FE;$Ry8eC_> zmCr@9WroJs|73Q0;p{eV+ApHk5AB6@N0Iqi8@rb$lSXFRv0uRlsg!%4&cH=B z&3QXE>9^1#!jV}pSqI{|*PKt5X0IWo_!JGg%{dptcZl1Fr*9PRt`~D=kphnjWgi*& z2Hzl0K93@tC*WCOE34s)sjCzEM2bx|DdKecmd(}g+``gQAS22#i7|H*q%A~AM6|wz z!L4)DO3c2z>#pixy6D54b5Jt|;$*LTR>Y|=^ylHS1s}3zS#1P_#$QR+_&1X)wq`lt zWZdUs^SPy$?aYa^QE72ZCPSm;*pc}xNC=l__bxn)_m_XMU*0P|S93fo4| z8}SFd&uWMkQTDMtVBD(d>RcTgPnx*8`Z*3T@m+ej9L)}TrJff(<31q6X=&MWnta?R zcN?LqP%&i{BThoP)zHnvvH^*y&>L4|Nn*iRgNcZR}Yl%5g7PE$A>LeA48Hin&p}06EG&9It7s}#?`CmLigbC^R(*y z@TbP#cb{Br>@JS%-wjqk$BUFn3-p;>Hq>cygdSDeHb(Mkp&d>EirD5=DTWIlb%Y*| zU77G4xV$!xXuiJZpm9^)t2W~|oRC$jq%Uu1&~Ho!75Cw7Bcu4zFALKccuU+j&FXEvwJV#gSAIyXQ7zk2xh-V6gG5>dJQBaZcpcMKQB>!33KPY zE>UoQLY@QEE8DgV3B4#fIw6lpBG+Wg`i|T35mkk9)&E5IU<=l#hWFCLc4KnSP=CBN zPwWiOzioL3+Wix|a3_NHdx`?B>I=S`)}T6T9lOMj&++A>j`(;`)mwP}eUC-Etem2n zm;;U^YI2EBDS}y)$rWwwoUgWwB?_(a7nh=t(#gVGh~Uc0!soU`Zej z5XjsppAJ<0S+k&r18g87`HvuN!U$S{Ov*aZK!u@<6igXhjFdzQ?ThvelvZ$la-aHqjprCd-?x5JpT&D}B zIJ09`@_Un5(B(qy|3Y$0?4^YzBaQvf5JTYxf@hm6)K~ zDU4p{uO!&fGJiqv+&AAVO1HBoCR#iZ6fln~Mn^}36f(Y+O%h}y0 z@Vx@{9g0F!w)RyTxE-K}EDuqu^!^Yl4xYv(U+DzbQK1n~g@8u`1!0mEf&?1cxD71- zejiE`E?6TV4Ur?c4{x`yA?a5|9uJ_=z)D^|Ix8z+TGssGWg?wh!qK6nW=!1Hh5<`B zRb!=IP*M_l_h7g{gRpm~8m6al;#Wt;#*%&J;3f}RR5+?K&OfhmBMO1oL-)3=Q9cEL z3IYWB;c_C-5V94@^hv-9m4i_j9EidqGs44wex*J?;asx^`%C|PKEateoKIr(5Rk-gCs&kY|KYTx*}m$ z(t>-Ub^er%w0m z{(zszIiNefzt|c?Q`PB{*A7dN{)-FlNb}_Xk9`)O%#MILC49svSrtEh(On$lSO@4m zpPEiDx{Vd2z{~5ANxx0+UD1xEp8EY@Z#)vY{Sgc?UTv1COr*wDke?Y)&!8@1%h?mJ z%yK|}(7_@QY_dKP4p>Xz7{FIsgnqmpx%LGyZYsN7zb$@sM{ZC43!xT)%J3y$3(BEm zTK$m`5F{3BC>0?^Q1gG%CZuLd6hiTXK=6+WAiabjAa9MgoZB+`>Zx;F^|3Z_ zveCGvHU4LOs`FfYc~0@6tR`m57mZ z@Qdc#(-mdDm(4)~#n3eXEd!Vnn8!lCfuQ5bxJ;G4uOLa-Y!%GsizBM;0V(W5hOo(@?=0-Gu%@{ zlA#yEK;9TQFI*_kUIFY_>e(MF6&oDdfH<#f0!b=W4U{nXm*YqQ1+$d5Ci9Jbgw@Ve z6K&5y{O*8u4`g9bc4r_f^*%p zA#~2d_qvvJ*~mTu6!D=aJ;+TU?T*i^Z*|^>9OqQybMQWLQ>K6mt~W50gC)HoHHezn zT^Uq2I_4(W4Hn>HD?sUqlI9vDE$$0QL_oa=jR3Hmm6YHQi8R+H^}?e7-o>aiXNual z-9N3*xIvRh=OLf@Png(NSar(-O?jktyx~CyU+_IR~9%P@E zZ~3$ZP`y1py8eD=_X9~R4iO${aqKOYFq$9ur@iKX*Rhlv3spGkd%VN$c3vcYEFRXl z5&rh+4}ASRB3TJhxaaiS3U|Qu5%P+WcaKTn2z4@~WJhJ12nx!I++#o8&F=U-@WNoF z|E9K+pV7+)5B)#>#cF1Yj{up+#g65bd}**=Fe(^x`mMQdPpuO)lu#QomFUexGD&%p z6`dDZXMR3w>E^p!pYhdg_B7rG-4`*06e4?9@a;;2W_SJ~|hcsuLJ z);(IX0$Hr2m$vm3F6&6KzoFtLgfFK8IO_W+!z_pPZegI&XpNQXx4m*D!hn()@IUY&^XU;g{d<(WEqcI`pWbMY&J zyFPmp>y9ATJzWaDwpQnAH zILNz;aJr*>8er1U@1=aZ?nH?X4zjE2si>Mn497Tjt}n9Cob?&1F1J279MqZf&WP-| zGMB+A#c z8v3@h2uio#9{y1U0gY&(? znF^K7*&-caA~y0|51aBwwEPFhe#NDC=QVIwdox#42R+vQH0_m<2n7);Th>fnC=o%U zi3*L7z86@Q6&-k$fAXN#^&l0`NLOj$?@B;cRo1ypKm;aV8y~Hm#-@Bt~isE)~eO|9WH%0uAqTG~xPW;P$DW9C7D^0+{*lYja&#gS>rTf)V zh9QX@ZL9Z_Nu=DF!S4WqX~;yH762+Bgd-CWzhD)xDFuVh+RyipS+TvR!bQ;q&QGU- zHd+w2fyNemqh44=|7mO4vTryClL)bP;WJAr3l*i#m?#(Ucb`gR57EYtLBnp%qZtp+ zD14ONM8aEAi?ZVuqI1$PV|lw$W9L%EBC(z@r~#!fIe*Gkty?~ij)%u)?o)47-yL7i z4Z`(^z165wZ6ab~7KVhKbSK6~P_%&qQQYJw1jyNhYsQbHZ+|Y1DF6BLw!VdBo^YaU z{1m~pWq!MOp^A(#^2)r0od_5itNSJVVQ1T#-m7o2f-wGOnaRn~ud~}SBjn_=&3BDF1xlzAz<4CbGHb~*@H?Mn!5DU_G~OH$Cy-MSFWY1HwEpx_1>UI08U$&J`ef><`Bn=+>dVw&opY#wt?l?B;f#{|9St z-q1r(O+}+;z~X`<%B|V#P_$oM?<*Ztw*2q-C{opY6hLG07M0_HI)nYyG*glINWTYY zYF3^SITc;_+&KDR$AnrNW(k>_qm5M;baj?6?1AArL*?h-HwFwyf~QN#8vgIs$Q~0H zQ4~Y@`57q^|C-{d1CyP7uq*<~7Kpz+%=`M)9~I#RMEg&+LXP;3wlctMcHKW+OmYjO4z$*|fD6LD&#qD*J;zGL@?`CsdmN=Wha8&9RF?g!R&IKZvAF zA2yb@W<-O*ph;6+m)`N9<$HQM?S)9c5(}TZj4%3>dW28uwj38i^ehBt2>Ikl4hyQo z6NikS`!bnlFpvU3hsBMtl*fY&PH6YCza(+W1Hg0@+Xqq zu1jq6@FU!45K2XbdZ7bQ!p)p3SJuDmRE^4k!HcP>soKno;!|ztjEjG&gr{lP$MsBO?HC4JJxIg^X}+OphlC@so{mm1{PUnPj=Zx> z{wd0u2dCvSZRen?f~q9!16*f7cL`uCTBCfs{M&?~aBjQNb7pjlU~Ls&N(#6$fl$vr zvpi1cod57qqKNWi!r(8#E>fMriVx^jH9C>2qH9=EOb&Y)2x66s?lPwu*Bzj6;>Xm-2}^Ml_Z{m-9pqnNIkt zyF!hLp`-szTopVO$R)#BV6)ulxE~1|cGyL#{f))bzXq#ryt|RS zSSX5v#OGzh$eG%bcg+)zPnn*F+Z~YG6Ds4B%Ch(=QTt?3SX)jS=pUH7J60J>^yAZ<4p1z#kj2k27IEWiPqHE&dnq1sW-+gr0R%o zHJ+glr_-oT+9QiSCy5M$SB`xf-ij4R>MDnoj#IsgzboCU!0`%`klKhTjmjZ_>Sln& z?uYui60u;6FpP~ijPuIBXSnn`$5_k;^t`Hex!*NYN8~@@^*dbStlc)Ov^|I>xt}qa z=Ckik|H7iy(B~@19a(TvP^R2hV)KU9cbv|-zL1H=wcaeg$ZF?I7dM3I4mZRpL|jx) z6a=PxR>XXhfKeRj7Noe4>l^WryHpRO4^0r2UH*GIPARI-+w;Rb`Jt;i8ySc>VQ8j` z;Qjns2*kV$37ZXZxr6}CSiipX@-^vJA%B$X`X>ofF+6wg#3y~J2o)=sv^pePd zSvXwZz-K3Be;|IkuX$B95Dds<5R83<&}1(!y#~cl4y`2bM8#gT8@bGG2m-VEW0nh! zV>$(TRn6A>bg0lzMV$$vC16nj*Xk;}Cpa+RqT0P*Kp+W7zLF1Evj($b_UPGC($SWf-%8xQ~dz9PzQT?^-86{ccY_8o(piDel>MItB*)KIp=dW3SL>Gsn$56P5%Hk^Nv zTt!Xh{hNKk3WHp$N=K6qGIW^_36Ya)ig3xx&Q^Rf8%zeU<4OzA+>$Ow-=_wec z0>QlB*y^_ZSHAMwRXP`?9PFmk!Lc--O#C^Q7WZ~^74&~c5_=O3|Jz5Q1`U6Hf6dGhT zV(}@TIohb~$G8)LV#G%|WZy(_RcR|!zSFD%O@wu%Y~k$Q_V&Qh+K2)lIqC#5?w#Mj(58;abUS0}ZwHPJZ8>x4W?eKgg9iq!Mg{6iwdUy5dre*f-wznj;}EK%=M zX}9;C^EG;{}l+dLTS3nX0)C`V%Fod?WCsLs!<4du}4ibNnjj2YYQt?{y zT(+JJSM2=kF{eXQos0NV8Gac%AfCiw#jUaD+~!5>bu#M1x`f-esB}>}(VmbVtYon^ z*~8^-vlI1nea_JB>G<+DpGj$RVi;7E1*);lqH|H!^!^S4n8Fp{@cyG+^LCK@?J*xTx_lyEgZlhEstaH%JIH2L9rv z4!=BXO%(bl&!{FsdK;z9a#kOO#H!5$Ldb8nx|k26PO8jz(ur;*h(vdNu^{U_I{#Nuyg6_HU}p**DOF9O ztv^3!LczrYJCL~N##&nwbYVfWF`)dX_|XTFlx11nb&QhZ92k&0qU{9ZFm$3q5*uH> zp!dK9>Kpsn2}mZVOkF?MJB|ZL=og5xiQt4Ao>d0fhQ6UW`}qX)OIp`r)ZIo)aM)P~ z|G859`wEG>54Ntqq^N zNFY&A?avCNf87M31=@p^3B7a@+Uv=E?^Q+R+xSbRy?N3NZhl6!8;+Gqb&0OfRtxm3 zk97!?Z#M*m=2h7#b^^1-W4n!XG%oQDgaKubrh-Lu>~90+8yHK0fSY!^VjAeTU>DRS za!ngyadiUi5tyb%DaO;lm;##2&o3AQ9o~CsQYb;yxs!EKY5f_W8{O+8*4S_o=|3*g zk8qc+br>zcOS^UmG3(?a!{~+BX;2%xynMZRUh*QIILKP@)$>4spnpaUJh%}_(s}Ao zi1wd+kEOZoHRutixTlT^XXqdVcQJ}G1UhPz4oD-AGeldX_f-Nx#+&o&FJovfjy~BR z4NQZQCv!2OEmQ#ct{yhqipolnπZ0s?`KK7`4&qEIHZW%9VdxUZhXQ5Z?*FKrRf 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%0D{ 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ν#;yG0(Z*5s+Wo4o4oLzKz^=%)q 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μAhUyZ8el$L6dQw+eL2B8l`X>e3!MK_-= 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

5<19u*`uGA{-Mll7?YoF!#OB&5fGW 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 literal 0 HcmV?d00001 From 0dc3e6c12b3111961b6fe807830d5c8a0c33ac93 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 17 Apr 2025 10:27:43 -0400 Subject: [PATCH 492/691] BUG/STY: Astyle! And fixing init_mag_grid to work better for hi-res --- src/init_mag_grid.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index dcf1a288..6983f761 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -281,10 +281,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // invLats are still all in North Hemisphere & increasing. // Use minimum p & alt to solve for q // q = sqrt((1-r/p)/r^4) - q_min = pow(((1 - max_alt_re / Pcorners(0)) / pow(max_alt_re, 4.0)), 0.5); + q_min = pow(((1 - max_alt_re / Pcenters(0)) / pow(max_alt_re, 4.0)), 0.5); // Trace each field line up to q_max, obtained from the lowest field line in the block - precision_t q_max = pow(((1 - min_alt_re / Pcorners(nLats -1)) / pow( + precision_t q_max = pow(((1 - min_alt_re / Pcenters(nLats - 1)) / pow( min_alt_re, 4.0)), 0.5); @@ -302,7 +302,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { magQ_corner_1d(nAlts) = q_min + (nAlts - nGCs) * delQ; - report.print(3, "Done generating points for magnetic grid. Plugging everything in"); + report.print(3, + "Done generating points for magnetic grid. Plugging everything in"); //////////////////////////// // That is the grid made. // @@ -509,20 +510,22 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { isPhysicalCell = find(geoAlt_scgc >= grid_input.alt_min * cKMtoM); UseThisCell.elem(isTooLowCell).fill(false); - for (iLon=0; iLon nAlts-nGCs-1){ + + if (first_lower_gc.min() < nGCs - 1 || + first_lower_gc.max() > nAlts - nGCs - 1) { report.error("Invalid magnetic grid!! Either:"); report.error(" - Lowest latitude field line is entirely below min_alt"); report.error(" - Highest altitude field line is above min_alt"); report.error("This should not happen. Something is terribly wrong. Goodbye."); return false; } + first_upper_gc.fill(nAlts - nGCs * 2 - 1); report.print(4, "Done altitude spacing for the dipole grid."); From 862b40a7ad363eaed937ea7794679ec46d38b2c9 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 17 Apr 2025 12:57:39 -0400 Subject: [PATCH 493/691] BUG: Use radial distance for BC's, not k-distance --- src/neutrals_bcs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 985594c6..7d93ef56 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -230,7 +230,7 @@ bool Neutrals::set_lower_bcs(Grid grid, temperature_scgc(iLon, iLat, iAlt + 1) / temperature_scgc(iLon, iLat, iAlt) * species[iSpecies].density_scgc(iLon, iLat, iAlt + 1) - * exp(-grid.dk_edge_m(iLon, iLat, iAlt) / sh_ave); + * exp(-grid.dr_edge(iLon, iLat, iAlt) / sh_ave); // Vertical velocities: (In GITM this projected down with mesh coeffs) // Take lowest physical cell's vertical velocity and project it down nGCs cells. From bf53dfe5389e03c86a8187205722ddb414c9f517 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 07:38:50 -0400 Subject: [PATCH 494/691] BUG: something is wrong with gravity! --- src/init_mag_grid.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 6983f761..3816f867 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -492,10 +492,13 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[2] = - mu * rad_unit_vcgc[2] % radius2i_scgc; gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); - gravity_mag_scgc = sqrt( - gravity_vcgc[0] % gravity_vcgc[0] + - gravity_vcgc[1] % gravity_vcgc[1] + - gravity_vcgc[2] % gravity_vcgc[2]); + + gravity_mag_scgc = mu / pow(radius_scgc, 2); + + //gravity_mag_scgc = sqrt( + // gravity_vcgc[0] % gravity_vcgc[0] + + // gravity_vcgc[1] % gravity_vcgc[1] + + // gravity_vcgc[2] % gravity_vcgc[2]); report.print(4, "Done gravity calculations for the dipole grid."); From 6d25699b43e25c32ae6e1b30d3a34da701ffcb33 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 07:39:08 -0400 Subject: [PATCH 495/691] BUG: need to start at the first physical cell --- src/neutrals.cpp | 58 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 471cbb67..823b9828 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -255,17 +255,27 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, int64_t iNeutral, iSpecies; + int64_t iX, iY, iZ; + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t iFirst; + for (iNeutral = 0; iNeutral < nSpeciesAdvect; iNeutral++) { iSpecies = species_to_advect[iNeutral]; - - // Integrate with hydrostatic equilibrium up: - for (int iAlt = iStart; iAlt < iEnd; iAlt++) { - species[iSpecies].density_scgc.slice(iAlt) = - temperature_scgc.slice(iAlt - 1) / - temperature_scgc.slice(iAlt) % - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dr_edge.slice(iAlt) / - species[iSpecies].scale_height_scgc.slice(iAlt)); + for (iX = nGCs; iX < nX - nGCs; iX++) { + for (iY = nGCs; iY < nY - nGCs; iY++) { + iFirst = grid.first_lower_gc(iX, iY) + iStart; + // Integrate with hydrostatic equilibrium up: + for (int iAlt = iFirst; iAlt < iEnd; iAlt++) { + species[iSpecies].density_scgc(iX, iY, iAlt) = + temperature_scgc(iX, iY, iAlt - 1) / + temperature_scgc(iX, iY, iAlt) * + species[iSpecies].density_scgc(iX, iY, iAlt - 1) * + exp(-grid.dr_edge(iX, iY, iAlt) / + species[iSpecies].scale_height_scgc(iX, iY, iAlt)); + } + } } } @@ -283,14 +293,25 @@ void Neutrals::fill_with_hydrostatic(int64_t iSpecies, int64_t iEnd, Grid grid) { - // Integrate with hydrostatic equilibrium up: - for (int iAlt = iStart; iAlt < iEnd; iAlt++) { - species[iSpecies].density_scgc.slice(iAlt) = - temperature_scgc.slice(iAlt - 1) / - temperature_scgc.slice(iAlt) % - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dr_edge.slice(iAlt) / - species[iSpecies].scale_height_scgc.slice(iAlt)); + int64_t iX, iY, iZ; + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t iFirst; + + for (iX = nGCs; iX < nX - nGCs; iX++) { + for (iY = nGCs; iY < nY - nGCs; iY++) { + iFirst = grid.first_lower_gc(iX, iY) + iStart; + // Integrate with hydrostatic equilibrium up:I + for (int iAlt = iFirst; iAlt < iEnd; iAlt++) { + species[iSpecies].density_scgc(iX, iY, iAlt) = + temperature_scgc(iX, iY, iAlt - 1) / + temperature_scgc(iX, iY, iAlt) * + species[iSpecies].density_scgc(iX, iY, iAlt - 1) * + exp(-grid.dr_edge(iX, iY, iAlt) / + species[iSpecies].scale_height_scgc(iX, iY, iAlt)); + } + } } calc_mass_density(); @@ -466,8 +487,7 @@ bool Neutrals::restart_file(std::string dir, std::string cGridtype, else RestartContainer.store_variable(cName, velocity_unit, - species[iSpecies]. - velocity_vcgc[iDir]); + species[iSpecies].velocity_vcgc[iDir]); } } From f80320ee736f536e21e217d791b8e5ba1f73f0f5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 07:39:19 -0400 Subject: [PATCH 496/691] BUG: first GC + nGCs - 1 = 2, I think --- src/neutrals_ics.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index a1430d96..8da58901 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -99,7 +99,7 @@ bool Neutrals::initial_conditions(Grid grid, std::cout << " NOT Found in MSIS - setting constant\n"; species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); fill_with_hydrostatic(iSpecies, 1, nAlts, grid); } @@ -174,9 +174,11 @@ bool Neutrals::initial_conditions(Grid grid, for (iLon = 0; iLon < nLons; iLon ++) { for (iLat = 0; iLat < nLats; iLat++) { for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].density_scgc.subcube( - iLon, iLat, 0, iLon, iLat, grid.first_lower_gc(iLon, iLat)+1).fill( + iLon, iLat, 0, iLon, iLat, grid.first_lower_gc(iLon, iLat) + 1).fill( species[iSpecies].lower_bc_density); + } } } @@ -188,7 +190,7 @@ bool Neutrals::initial_conditions(Grid grid, report.print(2, "Filling with hydrostatic"); for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) - fill_with_hydrostatic(iSpecies, nGCs, nAlts, grid); + fill_with_hydrostatic(iSpecies, nGCs - 1, nAlts, grid); } // type = planet } From f4c319f008ca60d2e3fc3d81eab3506130061a93 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 07:39:30 -0400 Subject: [PATCH 497/691] FEAT: output magnitude of gravity --- src/output.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/output.cpp b/src/output.cpp index 61115d97..c9fa6dca 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -89,7 +89,8 @@ bool output(const Neutrals &neutrals, // make sure the output dt is set correctly. Otherwise these errors aren't caught correctly. precision_t dt_output = input.get_dt_output(iOutput); - if (dt_output == 0.0){ + + if (dt_output == 0.0) { report.exit(function); return false; } @@ -243,6 +244,9 @@ bool output(const Neutrals &neutrals, AllOutputContainers[iOutput].store_variable("Gvertical", "m/s^2", grid.gravity_vcgc[2]); + AllOutputContainers[iOutput].store_variable("Gmag", + "m/s^2", + grid.gravity_mag_scgc); AllOutputContainers[iOutput].store_variable("Gpotential", "m^2/s^2", grid.gravity_potential_scgc); @@ -261,9 +265,9 @@ bool output(const Neutrals &neutrals, "degrees", grid.magLon_scgc * cRtoD); AllOutputContainers[iOutput].store_variable("invLat", - "Magnetic Invariant Latitude", - "degrees", - grid.magInvLat_scgc * cRtoD); + "Magnetic Invariant Latitude", + "degrees", + grid.magInvLat_scgc * cRtoD); AllOutputContainers[iOutput].store_variable("mlt", "Magnetic Local Time", "hours", From 9ea7544d89f0259d80b1ebeeba864f4f83076f2b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 08:06:36 -0400 Subject: [PATCH 498/691] BUG: need sphere4 to go along with dipole4 --- share/run/aether.json | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/share/run/aether.json b/share/run/aether.json index 96f1f08e..56439570 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -8,17 +8,12 @@ "iFunctionVerbose" : { "Grid::create_altitudes": 0}, "dt" : 10.0, - "check_for_nans" : false - }, + "check_for_nans" : false}, "EndTime" : [2011, 3, 20, 0, 10, 0], - "GeoBlockSize" : { - "nLons" : 18, - "nLats" : 18, - "nAlts" : 50}, - "neuGrid" : { + "Shape": "sphere4", "nLonsPerBlock" : 24, "nLatsPerBlock" : 22, "nAlts" : 40, @@ -28,12 +23,11 @@ "ionGrid": { "Shape": "dipole4", "nLonsPerBlock": 36, - "nLatsPerBlock" : 18, - "nAlts":36, - "LatRange":[10, 80], - "AltRange":[80.0, 1000], - "LonRange" : [0.0, 360.0] - }, + "nLatsPerBlock": 18, + "nAlts": 50, + "LatRange": [10, 80], + "AltRange": [80.0, 1000], + "LonRange": [0.0, 360.0] }, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], From ae3ce01c9e1aba839afc495d04436ca3bc75325f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 23 Apr 2025 08:42:51 -0400 Subject: [PATCH 499/691] BUG: to capture e-region, need 100 points --- share/run/aether.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/run/aether.json b/share/run/aether.json index 56439570..d10243a7 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -24,7 +24,7 @@ "Shape": "dipole4", "nLonsPerBlock": 36, "nLatsPerBlock": 18, - "nAlts": 50, + "nAlts": 100, "LatRange": [10, 80], "AltRange": [80.0, 1000], "LonRange": [0.0, 360.0] }, From 3bcd3fa5ad93634e08928416d248f1f5c71669dd Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 18 Apr 2025 15:40:04 -0400 Subject: [PATCH 500/691] STY: Astyle, yo --- src/init_mag_grid.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 3816f867..7deebd46 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -145,7 +145,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { arma_vec lon1dLeft(nLons + 1); - // if we are not doing anything in the lon direction, then set dlon to + // If we are not doing anything in the lon direction, then set dlon to // something reasonable: if (!HasXdim) dlon = 1.0 * cDtoR; @@ -158,7 +158,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { ///////////////// // - Make a 1d vector - // - copy it into the 3d cube + // - Copy it into the 3d cube for (iLon = 0; iLon < nLons; iLon++) { lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; lon1dLeft(iLon) = lon0 + (iLon - nGCs) * dlon; // corners @@ -504,9 +504,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { calc_dipole_grid_spacing(planet); - ////////////////////////////////////// - // Generate mask for physicsl cells // + // Generate mask for physical cells // ////////////////////////////////////// isTooLowCell = find(geoAlt_scgc < grid_input.alt_min * cKMtoM); From e12e25e9486f46dfc23d26418ca76d9b738116b5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 18 Apr 2025 15:41:01 -0400 Subject: [PATCH 501/691] FEAT: Make ortho dipole4 the default ionGrid in settings files --- share/run/UA/inputs/defaults.json | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 09ade2c6..f3c5b6e0 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -79,19 +79,14 @@ "IsUniformAlt" : true, "AltFile" : ""}, - "ionGrid" : { - "Shape" : "dipole4", - "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], - "LatRange" : [85.0, 360.0], - "AltRange" : [0.0, 360.0], - "nLonsPerBlock" : 22, - "nAlts" : 50, - "MinAlt" : 80.0, - "MinApex" : 120.0, - "LatMax":88.0, - "LatStretch":1.0, - "dAltStretch" : 0.6}, + "ionGrid": { + "Shape": "dipole4", + "nLonsPerBlock": 14, + "nLatsPerBlock" : 20, + "nAlts":30, + "AltRange":[80,1500], + "LatRange":[7, 87] + }, "Oblate" : { "isOblate" : false, From 7b8f0de78f78b02ef8387a3d243e5eb5549ff9cb Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 18 Apr 2025 15:44:50 -0400 Subject: [PATCH 502/691] STY: Formatting of share/run/UA/inputs/defaults.json --- share/run/UA/inputs/defaults.json | 126 +++++++++++++++--------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index f3c5b6e0..4573571a 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -1,38 +1,40 @@ { "Debug" : { - "iVerbose" : 0, - "doInheritVerbose" : false, - "dt" : 60.0, - "TimingPercent" : 1.0, - "iTimingDepth" : 5, - "iProc" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "check_for_nans" : false, - "nan_test" : { + "iVerbose" : 0, + "doInheritVerbose" : false, + "dt" : 60.0, + "TimingPercent" : 1.0, + "iTimingDepth" : 5, + "iProc" : 0, + "iFunctionVerbose" : { + "Grid::create_altitudes": 0}, + "check_for_nans" : false, + "nan_test" : { "insert" : false, - "variable" : "temperature_scgc"} }, + "variable" : "temperature_scgc"} + }, "InitialConditions" : { - "type" : "Planet"}, + "type" : "Planet"}, "BoundaryConditions" : { - "type" : "Planet"}, + "type" : "Planet"}, "Advection" : { - "Neutrals" : { - "Vertical" : "rusanov", - "Horizontal" : "default", - "useBulkWinds" : true, - "useImplicitFriction" : true}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} }, + "Neutrals" : { + "Vertical" : "rusanov", + "Horizontal" : "default", + "useBulkWinds" : true, + "useImplicitFriction" : true}, + "Ions" : { + "Along" : "rusanov", + "Across" : "default"} + }, "Student" : { - "name" : "", - "is" : false }, + "name" : "", + "is" : false }, "Planet" : { "name" : "earth", @@ -41,42 +43,42 @@ "BField" : "dipole", "Electrodynamics" : { - "Potential" : "weimer", - "DiffuseAurora" : "fta", - "Dir" : "UA/inputs/ext/ie/", - "File" : ""}, + "Potential" : "weimer", + "DiffuseAurora" : "fta", + "Dir" : "UA/inputs/ext/ie/", + "File" : ""}, "Euv" : { - "doUse" : true, - "Model" : "euvac", - "File" : "UA/inputs/euv.csv", - "IncludePhotoElectrons" : true, - "HeatingEfficiency" : 0.05, - "dt" : 60.0}, + "doUse" : true, + "Model" : "euvac", + "File" : "UA/inputs/euv.csv", + "IncludePhotoElectrons" : true, + "HeatingEfficiency" : 0.05, + "dt" : 60.0}, "DoCalcBulkIonTemp" : false, "Eddy" : { - "Coefficient" : 50.0, - "BottomPressure" : 0.01, - "TopPressure" : 0.005, - "UseInEnergy": true, - "UseInMomentum": true}, + "Coefficient" : 50.0, + "BottomPressure" : 0.01, + "TopPressure" : 0.005, + "UseInEnergy": true, + "UseInMomentum": true}, "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 10, 0], "neuGrid" : { "Shape" : "sphere", - "LatRange" : [-90.0, 90.0], + "LatRange" : [-90.0, 90.0], "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], + "LonRange" : [0.0, 360.0], "nLonsPerBlock" : 20, "nAlts" : 40, - "MinAlt" : 100.0, - "dAltkm" : 5.0, + "MinAlt" : 100.0, + "dAltkm" : 5.0, "dAltScale" : 0.25, - "IsUniformAlt" : true, + "IsUniformAlt" : true, "AltFile" : ""}, "ionGrid": { @@ -85,23 +87,23 @@ "nLatsPerBlock" : 20, "nAlts":30, "AltRange":[80,1500], - "LatRange":[7, 87] - }, + "LatRange":[7, 87]}, "Oblate" : { - "isOblate" : false, + "isOblate" : false, "isJ2" : false}, "Ensembles" : { "nMembers" : 1}, "Sources" : { - "Grid" : { - "Coriolis" : true, - "Cent_acc": true }, - "Neutrals" : { - "NO_cool" : false, - "O_cool": false } }, + "Grid" : { + "Coriolis" : true, + "Cent_acc": true }, + "Neutrals" : { + "NO_cool" : false, + "O_cool": false } + }, "Seed" : 0, @@ -115,18 +117,18 @@ "OmniwebFile" : ["UA/inputs/omni_20110319.txt"], "Logfile" : { - "name" : ["UA/output/log_geo.txt", "UA/output/log_mag.txt"], - "append" : false, - "dt" : 10.0, - "species" : ["O2", "O2+"]}, + "name" : ["UA/output/log_geo.txt", "UA/output/log_mag.txt"], + "append" : false, + "dt" : 10.0, + "species" : ["O2", "O2+"]}, "Outputs" : { - "type" : ["states", "grid"], - "dt" : [900, -1]}, + "type" : ["states", "grid"], + "dt" : [900, -1]}, "Restart" : { - "do" : false, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0} + "do" : false, + "OutDir" : "UA/restartOut", + "InDir" : "UA/restartIn", + "dt" : 3600.0} } From 6d5a5cc4588d36da5c8e04ae501b2e186e284589 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 18 Apr 2025 15:46:33 -0400 Subject: [PATCH 503/691] FEAT: Make sphere4 the default neutral shape. This will require mpi! --- share/run/UA/inputs/defaults.json | 2 +- share/run/aether.json | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 4573571a..557a06bf 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -69,7 +69,7 @@ "EndTime" : [2011, 3, 20, 0, 10, 0], "neuGrid" : { - "Shape" : "sphere", + "Shape" : "sphere4", "LatRange" : [-90.0, 90.0], "nLatsPerBlock" : 18, "LonRange" : [0.0, 360.0], diff --git a/share/run/aether.json b/share/run/aether.json index d10243a7..65ac4f7e 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -14,9 +14,9 @@ "neuGrid" : { "Shape": "sphere4", - "nLonsPerBlock" : 24, - "nLatsPerBlock" : 22, - "nAlts" : 40, + "nLonsPerBlock" : 24, + "nLatsPerBlock" : 22, + "nAlts" : 40, "dAltScale" : 0.25, "IsUniformAlt" : false}, @@ -35,6 +35,7 @@ "Potential" : "Weimer05", "DiffuseAurora" : "fta", "File": "UA/inputs/b20110320n_omni.bin"}, + "Outputs" : { "type" : ["states", "grid"], "dt" : [900, -1] }, From 99cb393d6c1dedf131d22c883f0d36dbfc282b1a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 21 Apr 2025 13:26:40 -0400 Subject: [PATCH 504/691] FEAT: Framework for adding tests in at runtime --- CMakeLists.txt | 3 ++- include/aether.h | 3 +++ include/inputs.h | 6 ++++++ share/run/UA/inputs/defaults.json | 5 ++++- src/inputs.cpp | 8 ++++++++ src/main/main.cpp | 3 +++ 6 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a479a1fe..b37b2c65 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,7 @@ endif() # Directory variables file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp) +file(GLOB TEST_FILES ${PROJECT_SOURCE_DIR}/srcTest/*.cpp) set(MAIN_DIR ${PROJECT_SOURCE_DIR}/src/main) set(TESTS_DIR ${PROJECT_SOURCE_DIR}/tests) set(OUT_DIR ${PROJECT_SOURCE_DIR}/src/output) @@ -34,7 +35,7 @@ elseif(TEST_EXCHANGE) elseif(TEST_GRADIENT) add_executable(aether ${SRC_FILES} ${MSIS_FILES} ${MAIN_DIR}/main_test_gradient.cpp) else() - add_executable(aether ${SRC_FILES} ${MSIS_FILES} ${IE_FILES} ${MAIN_DIR}/main.cpp) + add_executable(aether ${SRC_FILES} ${TEST_FILES} ${MSIS_FILES} ${IE_FILES} ${MAIN_DIR}/main.cpp) endif() if(USE_DOUBLE_PRECISION) diff --git a/include/aether.h b/include/aether.h index 28c6a4b5..ec51bdc2 100644 --- a/include/aether.h +++ b/include/aether.h @@ -143,4 +143,7 @@ using json = nlohmann::json; // not commented #include "external_msis.h" +// To hold all the test functions +#include "test.h" + #endif // INCLUDE_AETHER_H_ diff --git a/include/inputs.h b/include/inputs.h index 4abc9167..db266aac 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -562,6 +562,12 @@ class Inputs { \param **/ std::vector get_satellite_dts(); + + /********************************************************************** + \brief returns settings[" + \param + **/ + json get_tests(); // General get_setting functions with error checks: diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 557a06bf..f86b7c47 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -130,5 +130,8 @@ "do" : false, "OutDir" : "UA/restartOut", "InDir" : "UA/restartIn", - "dt" : 3600.0} + "dt" : 3600.0}, + + "DoTests": { + "exit_on_fail": true} } diff --git a/src/inputs.cpp b/src/inputs.cpp index c35d8637..921afd41 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -1163,6 +1163,14 @@ bool Inputs::get_advection_neutrals_implicitfriction() { return get_setting_bool("Advection", "Neutrals", "useImplicitFriction"); } +// ----------------------------------------------------------------------- +// See what tests are requested +// ----------------------------------------------------------------------- + +json Inputs::get_tests() { + return get_setting_json("DoTests"); +} + // -------------------------------------------------------------------------- // check to see if class is ok // -------------------------------------------------------------------------- diff --git a/src/main/main.cpp b/src/main/main.cpp index 64d25548..d620f28c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -31,6 +31,9 @@ int main() { report.print(-1, "Hello " + input.get_student_name() + " - welcome to Aether!"); + // Find out what tests we are running: + json tests = input.get_tests(); + // For now, the number of processors and blocks are set by the // neutral grid shape, since this could be sphere (1 root) or // cubesphere (6 root) From 79a4c851aa8942d1d1205d3ae5bb6dc1b0aa209e Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 21 Apr 2025 13:27:51 -0400 Subject: [PATCH 505/691] FEAT: Create (semi-functional) gradient test --- include/test.h | 17 ++ share/run/UA/inputs/defaults.json | 2 +- src/main/main.cpp | 4 + srcTest/test_gradient.cpp | 260 ++++++++++++++++++++++++++++++ 4 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 include/test.h create mode 100644 srcTest/test_gradient.cpp diff --git a/include/test.h b/include/test.h new file mode 100644 index 00000000..ea74ab86 --- /dev/null +++ b/include/test.h @@ -0,0 +1,17 @@ +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#ifndef INCLUDE_TEST_H_ +#define INCLUDE_TEST_H_ + +#include "aether.h" + + +// Gradient tests +// Cubesphere is not done nor tested +bool test_gradient(Planets planet, Quadtree quadtree, json test_config, Grid gGrid, Grid mGrid); +bool test_gradient_cubesphere(Planets planet, Quadtree quadtree, Grid grid); +bool test_gradient_ijk(Planets planet, Grid grid); + + +#endif \ No newline at end of file diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index f86b7c47..1b4138ab 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -132,6 +132,6 @@ "InDir" : "UA/restartIn", "dt" : 3600.0}, - "DoTests": { + "DoTests": {"test_gradient": false, "exit_on_fail": true} } diff --git a/src/main/main.cpp b/src/main/main.cpp index d620f28c..0ec17726 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -116,6 +116,10 @@ int main() { Ions ions(gGrid, planet); Ions ionsMag(mGrid, planet); + if (tests["test_gradient"]) { + test_gradient(planet, quadtree, tests, gGrid, mGrid); + } + // ----------------------------------------------------------------- // This is a unit test for checking for nans and infinities. // Is simply adds nans and infinities in a few places, then diff --git a/srcTest/test_gradient.cpp b/srcTest/test_gradient.cpp new file mode 100644 index 00000000..6270e35a --- /dev/null +++ b/srcTest/test_gradient.cpp @@ -0,0 +1,260 @@ + +// Copyright 2020, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +#include + +#include "aether.h" + +bool test_gradient(Planets planet, Quadtree quadtree, json test_config, + Grid gGrid, Grid mGrid) { + std::string function = "test_gradient"; + static int iFunction = -1; + report.enter(function, iFunction); + + bool didWork; + + report.print(2, "Testing neutral grid"); + + if (gGrid.IsCubeSphereGrid) + didWork = test_gradient_cubesphere(planet, quadtree, gGrid); + + if (gGrid.IsDipole || gGrid.IsLatLonGrid) + didWork = test_gradient_ijk(planet, gGrid); + + MPI_Barrier(aether_comm); + + if (!didWork && test_config["exit_on_fail"]) + throw std::string("Gradient test failed - neutral grid"); + + report.print(2, "Testing ion grid"); + + if (mGrid.IsCubeSphereGrid) // it's technically possible... + didWork = test_gradient_cubesphere(planet, quadtree, mGrid); + + if (mGrid.IsDipole || mGrid.IsLatLonGrid) + didWork = test_gradient_ijk(planet, mGrid); + + if (!didWork && test_config["exit_on_fail"]) + throw std::string("Gradient test failed - ion grid"); + + + + report.exit(function); + + return didWork; +} + +bool test_gradient_ijk(Planets planet, Grid grid) { + + std::string function = "test_gradient_dipole"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t nIs = grid.get_nX(); + int64_t nJs = grid.get_nY(); + int64_t nKs = grid.get_nZ(); + int64_t nGCs = grid.get_nGCs(); + + int64_t nX, nY, nZ; + precision_t tol = 1e-3; + bool didWork = true; + + arma_cube predicted_gradient, true_gradient; + arma::uvec err_points; + + arma_cube gradient_error; + gradient_error.set_size(nIs, nJs, nKs); + gradient_error.zeros(); + + int64_t nCellsTot = nX * nY * nZ; + int64_t nCellsNGCs = (nX - 2 * nGCs) * (nY - 2 * nGCs) * (nZ - 2 * nGCs); + + report.print(2, "Beginning i-gradient"); + + ///////////////////////////////////////////////////////////// + // Test the gradient in i-direction, d/dx(sin x) = cos(x) // + ///////////////////////////////////////////////////////////// + + predicted_gradient = calc_gradient2o_i(sin(grid.i_center_scgc), grid); + true_gradient = cos(grid.i_center_scgc) / (grid.di_center_m_scgc); + + gradient_error = abs(predicted_gradient - true_gradient) / abs(true_gradient); + err_points = find(abs(gradient_error.subcube(nGCs, nGCs, + nGCs, // don't look at ghost cells + size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) + > tol); + + didWork = all_finite(predicted_gradient, "Gradient_4o_i"); + + std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() + << ") => Points in i-gradient, above tol: " << + 100.0 * err_points.n_elem / predicted_gradient.n_elem + << "% (" << err_points.n_elem << ", " << + predicted_gradient.n_elem << ")\n"; + + if (err_points.n_elem > true_gradient.n_elem * tol) + didWork = false; + + report.print(2, "Beginning j-gradient"); + + ///////////////////////////////////////////////////////////// + // Test the gradient in j-direction, d/dx(cos x) = -sin(x) // + ///////////////////////////////////////////////////////////// + + predicted_gradient = calc_gradient2o_j(cos(grid.j_center_scgc), grid); + true_gradient = -1.0 * sin(grid.j_center_scgc) / grid.dj_center_m_scgc; + + gradient_error = predicted_gradient - true_gradient; + err_points = find(abs(gradient_error.subcube(nGCs, nGCs, nGCs, + size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) + > tol); + + didWork = didWork && all_finite(predicted_gradient, "Gradient_2o_j"); + + std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() + << ") => Points in j-gradient, above tol: " << + 100.0 * err_points.n_elem / predicted_gradient.n_elem + << "% (" << err_points.n_elem << ", " << + predicted_gradient.n_elem << ")\n"; + + if (err_points.n_elem > true_gradient.n_elem * tol) + didWork = false; + + + report.print(2, "Beginning k-gradient"); + + ////////////////////////////////////////////////////// + // Test the gradient in k-direction, d/dx(x^2) = 2x // + ////////////////////////////////////////////////////// + + predicted_gradient = calc_gradient2o_k(grid.radius2_scgc, grid); + true_gradient = 2.0 * grid.radius_scgc / grid.dk_center_m_scgc; + + gradient_error = (predicted_gradient - true_gradient); + err_points = find(abs(gradient_error.subcube(nGCs, nGCs, nGCs, + size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) + > tol); + + didWork = didWork && all_finite(predicted_gradient, "Gradient_2o_k"); + + std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() + << ") => Points in k-gradient, above tol: " << + 100.0 * err_points.n_elem / predicted_gradient.n_elem + << "% (" << err_points.n_elem << ", " << + predicted_gradient.n_elem << ")\n"; + + if (err_points.n_elem > true_gradient.n_elem * tol) + didWork = false; + + report.exit(function); + + return didWork; +} + + +// This is non-functional. +// Taken from src/main/main_test_gradient.cpp with enough edits to compile. +bool test_gradient_cubesphere(Planets planet, Quadtree quadtree, Grid grid) { + + + std::string function = "test_gradient_cubesphere"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Set tolerance limit + precision_t tol = 1e-5; + + // Print current side number + std::string side_num = std::to_string(quadtree.iSide + 1); + std::cout << "Initiating Test 1 for Side Number (1-based index): " << side_num + << std::endl; + + /** + * Extract some test data generated by Aether Model + */ + + // Cell center coordinates + arma_mat aether_lon_cc = grid.geoLon_scgc.slice(0); + arma_mat aether_lat_cc = grid.geoLat_scgc.slice(0); + + int64_t nXs = grid.get_nY(); + int64_t nYs = grid.get_nX(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + + // Test scalar field and gradients + arma_cube scgc(nXs, nYs, nAlts); + arma_cube grad_lon_analytical(nXs, nYs, nAlts); + arma_cube grad_lat_analytical(nXs, nYs, nAlts); + + // Radius Information + precision_t planet_R = planet.get_radius(0); + // radius of planet + altitude + // just pick alt at (0,0) loction + arma_vec R_Alts = grid.geoAlt_scgc.tube(0, 0) + planet_R; + + for (int iAlt = 0; iAlt < nAlts; iAlt++) { + arma_mat curr_scalar(nXs, nYs, arma::fill::zeros); // setup zero mat + arma_mat curr_grad_lon(nXs, nYs); + arma_mat curr_grad_lat(nXs, nYs); + precision_t A = 1; + precision_t B = 1; + + for (int j = 0; j < nYs; j++) { + for (int i = 0; i < nXs; i++) { + precision_t curr_lat = aether_lat_cc(i, j); + precision_t curr_lon = aether_lon_cc(i, j); + + curr_scalar(i, j) = std::sin(curr_lat); + curr_grad_lon(i, j) = 0.; + curr_grad_lat(i, j) = std::cos( + curr_lat); // Assume R=1, we will scale the numerical result + } + } + + scgc.slice(iAlt) = curr_scalar; + grad_lon_analytical.slice(iAlt) = curr_grad_lon; + grad_lat_analytical.slice(iAlt) = curr_grad_lat; + } + + std::vector test_res = calc_gradient_cubesphere(scgc, grid); + + // Perform Tests + for (int iAlt = 0; iAlt < nAlts; iAlt++) { + arma_mat curr_grad_lon = grad_lon_analytical.slice(iAlt); + arma_mat curr_grad_lat = grad_lat_analytical.slice(iAlt); + arma_mat curr_numgrad_lon = test_res[0].slice(iAlt); + arma_mat curr_numgrad_lat = test_res[1].slice(iAlt); + + + // Evaluate actual cells only + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + if (std::abs(curr_grad_lat(i, j) - curr_numgrad_lat(i, + j) * R_Alts(iAlt)) > 1e-4) { // For float precision + std::cout << "Found Incorrect latitudinal gradient for face " + side_num + + ", test f = sin(lat)" << std::endl; + std::cout << std::abs(curr_grad_lat(i, j) - curr_numgrad_lat(i, + j)* R_Alts(iAlt)) << std::endl; + std::cout << iAlt << std::endl; + goto endloop1; + } + + if (std::abs(curr_grad_lon(i, j) - curr_numgrad_lon(i, + j) * R_Alts(iAlt)) > 1e-4) { // For float precision + std::cout << "Found Incorrect longitudinal gradient for face " + side_num + + ", test f = sin(lat)" << std::endl; + goto endloop1; + } + } + } + } + +endloop1: + + report.exit(function); + report.times(); + + return false; +} \ No newline at end of file From 042302ff7fa4cc237258e88faa2827c592d0d283 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Mon, 21 Apr 2025 14:20:04 -0400 Subject: [PATCH 506/691] DOC: Fix MacOS install instructions to use g++ over clang --- doc/installation/dependencies.md | 20 ++++++++++++-------- doc/installation/installation.md | 6 +++--- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/doc/installation/dependencies.md b/doc/installation/dependencies.md index c0d41a6f..eabdf3a1 100644 --- a/doc/installation/dependencies.md +++ b/doc/installation/dependencies.md @@ -21,25 +21,29 @@ If a path is printed, `cmake` is installed. To check the version, run `cmake The layout of this page is as follows: - [Installing Dependencies](#installing-dependencies) - - [Install C++ Compiler](#install-gcc) + - [Install Compiler](#install-compiler) - [Install cmake](#install-cmake) - [Install JSON libraries](#install-json-libraries) - [Install Armadillo (and boost)](#install-armadillo-and-boost) - [Install NetCDF (optional)](#install-netcdf-optional) -## Install gcc +## Install Compiler -On MacOS this can be installed, for -example, using: +On MacOS this can be installed, for example, using: ```bash -sudo port install gcc11 +sudo port install g++ ``` +> NOTE: On Macos, cmake will default to using clang instead of gcc. +You need to set an environmental variable to tell cmake to use g++ instead. +Do this with `export CXX=/opt/local/bin/g++`, +and replace the path if it is placed somewhere different. + On Ubuntu, `gcc` (the C-compiler) is pre-installed, but the C++ compiler is not. This can be installed with (subsituting your machine's package manager command): -``bash +```bash sudo apt install g++ ``` @@ -103,7 +107,7 @@ sudo port install lapack sudo port install OpenBLAS sudo port install boost sudo port install armadillo -sudo port install openmpi-bin libopenmpi-dev +sudo port install openmpi ``` ## Install NetCDF (optional) @@ -122,7 +126,7 @@ sudo port install netcdf-cxx4 If you want the gcc version of netcdf, then: ```bash -sudo port install netcdf-cxx4 +gcc10 +sudo port install netcdf-cxx4 ``` On Ubuntu, gcc is the default compiler, it seems like you can probably just do: diff --git a/doc/installation/installation.md b/doc/installation/installation.md index bec10985..850d79fb 100644 --- a/doc/installation/installation.md +++ b/doc/installation/installation.md @@ -97,10 +97,10 @@ Here `FLAG` is a flag name and `VALUE` is the desired value (note the `-D`). A more complete discussion of the available compilation flags can be found on the [Compilation Options](build_opts.md) page. -If your default compiler isn't a GCC compiler, you will likely need to specify -the desired GCC compiler at this step using: +> If your default compiler isn't a GCC compiler, you will likely need to specify +the desired GCC compiler at this step using the environmental variable `$CXX`, or: -```bash +> ```bash cmake -DCMAKE_CXX_COMPILER= ``` From 3f3fa44a752da0227101afdb2586f2de8ee85e29 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 23 Apr 2025 10:12:58 -0400 Subject: [PATCH 507/691] FEAT: Add a globbed run* to .gitignore - supports any name of rundir's --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6c8fc705..7269e4bc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ # Run and build directories run/ -run.test/ +run*/ build/ # Doxygen generated files From 5ef672ecaf998afe551e4a0b6f2507bfec05d980 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 23 Apr 2025 11:30:25 -0400 Subject: [PATCH 508/691] FEAT: Post processor improvements! Including: - NetCDF/hdf5 python packages are optional. matplotlib is still mandatory though - Look in pwd & pwd/UA/output (lets you postproc from run/) - Add arg to set path to output files --- srcPython/postAether.py | 43 +++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index fcdea2e1..2a08fffb 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -8,8 +8,6 @@ import matplotlib.pyplot as plt import numpy as np import matplotlib.cm as cm -from netCDF4 import Dataset -from h5py import File import argparse import os import json @@ -36,6 +34,9 @@ def parse_args(): parser.add_argument('-oned', \ help='strip 1d files of ghostcells and store in one file', \ action="store_true") + parser.add_argument('-dir', default=None, type=str, + help="Directory to find Aether files in. Will look in current" + " directory & $PWD/UA/output/") args = parser.parse_args() @@ -544,6 +545,13 @@ def get_base_files(): IsFound, item = if_unique(ensembleFiles, fileInfo['ensembleFile']) if (IsFound): filesInfo[i]['ensembleMembers'] = ensembleCounter[item] + + if len(filesInfo) == 0: + try: + os.chdir("UA/output") + get_base_files() + except: + print("No input files found!!") return filesInfo @@ -948,18 +956,33 @@ def write_and_plot_data(dataToWrite, # main code #---------------------------------------------------------------------------- -if __name__ == '__main__': # main code block +def main(args): - args = parse_args() isVerbose = args.v + + if args.dir: + if isVerbose: + print("changing directory to: ", args.dir) + os.chdir(args.dir) filesInfo = get_base_files() + + if len(filesInfo) == 0: + return iVar = 3 iAlt = args.alt output_netcdf = False if args.hdf5 else True - + + if filesInfo[0]['isNetCDF']: + try: + from netCDF4 import Dataset + from h5py import File + except InputError: + raise InputError( + "Attempting to postprocess NetCDF files, but NetCDF is not installed for Python") + for iFile, fileInfo in enumerate(filesInfo): coreFile = fileInfo['coreFile'] isNetCDF = fileInfo['isNetCDF'] @@ -1004,4 +1027,12 @@ def write_and_plot_data(dataToWrite, if (isVerbose): print(' ', command) os.system(command) - + +# call main: +if __name__ == '__main__': + + args = parse_args() + + # This allows code to cleanly exit on error + main(args) + \ No newline at end of file From 30fa3dd3423967b51fd3387acf17256548fcfff8 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 23 Apr 2025 11:59:18 -0400 Subject: [PATCH 509/691] BUG: Whoops prev commit on postprocessor was missing two pieces --- srcPython/postAether.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index 2a08fffb..f4e0455c 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -12,6 +12,11 @@ import os import json from struct import unpack +try: + from netCDF4 import Dataset + from h5py import File +except InputError: + print("NetCDF and/or h5py not found") # ---------------------------------------------------------------------- # Function to parse input arguments @@ -549,7 +554,7 @@ def get_base_files(): if len(filesInfo) == 0: try: os.chdir("UA/output") - get_base_files() + filesInfo = get_base_files() except: print("No input files found!!") @@ -974,15 +979,7 @@ def main(args): iAlt = args.alt output_netcdf = False if args.hdf5 else True - - if filesInfo[0]['isNetCDF']: - try: - from netCDF4 import Dataset - from h5py import File - except InputError: - raise InputError( - "Attempting to postprocess NetCDF files, but NetCDF is not installed for Python") - + for iFile, fileInfo in enumerate(filesInfo): coreFile = fileInfo['coreFile'] isNetCDF = fileInfo['isNetCDF'] From febb59b4b7d28341205ca729486eb1804805321f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 23 Apr 2025 12:36:40 -0400 Subject: [PATCH 510/691] BUG: Fix radial unit vector typos in init_mag_grid - Sign was wrong - should have been sin^2, not just sin in denominator --- src/init_mag_grid.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 7deebd46..4b324266 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -483,9 +483,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[iV].zeros(); } - rad_unit_vcgc[1] = cos(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), 0.5); - rad_unit_vcgc[2] = -2 * sin(magLat_scgc) / pow(abs(1 + 3 * sin(magLat_scgc)), - 0.5); + rad_unit_vcgc[1] = cos(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) + % sin(magLat_scgc)), 0.5); + rad_unit_vcgc[2] = 2.0 * sin(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) + % sin(magLat_scgc)), 0.5); precision_t mu = planet.get_mu(); gravity_vcgc[1] = - mu * rad_unit_vcgc[1] % radius2i_scgc; @@ -494,11 +495,6 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_potential_scgc.zeros(); gravity_mag_scgc = mu / pow(radius_scgc, 2); - - //gravity_mag_scgc = sqrt( - // gravity_vcgc[0] % gravity_vcgc[0] + - // gravity_vcgc[1] % gravity_vcgc[1] + - // gravity_vcgc[2] % gravity_vcgc[2]); report.print(4, "Done gravity calculations for the dipole grid."); From fa4c0bb71125a86b93950645e655f2b57f850546 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 07:49:54 -0400 Subject: [PATCH 511/691] DOC: added a couple of comments --- src/calc_ion_drift.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index ef3160cf..6f1c0cad 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -34,6 +34,7 @@ void Ions::calc_exb_drift(Grid grid) { for (int64_t iComp = 0; iComp < 3; iComp++) exb_vcgc[iComp] = exb_vcgc[iComp] / bmag2; + report.exit(function); } @@ -44,9 +45,9 @@ void Ions::calc_exb_drift(Grid grid) { std::vector Ions::calc_ion_electron_pressure_gradient(int64_t iIon, Grid grid) { - std::string function = "Ions::elec_ion_pressure_gradient"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "Ions::elec_ion_pressure_gradient"; + static int iFunction = -1; + report.enter(function, iFunction); std::vector pressure_gradient_vcgc; arma_cube total_pressure_scgc; @@ -201,6 +202,9 @@ void Ions::calc_ion_drift(Neutrals neutrals, species[iIon].par_velocity_vcgc[iComp] = (species[iIon].par_velocity_vcgc[iComp] + a_par[iComp] * dt) / (1 + nuin_sum * dt); + + // These need to change, since they are dependent on the + // grid. Closed, dipole fieldlines should NOT do this!!! species[iIon].par_velocity_vcgc[iComp].slice(nZ - 1).zeros(); species[iIon].par_velocity_vcgc[iComp].slice(nZ - 2).zeros(); species[iIon].par_velocity_vcgc[iComp].slice(nZ - 3) = @@ -238,6 +242,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, } // for iIon + // This is the mass weighted total bulk velocity: for (int64_t iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp] = velocity_vcgc[iComp] / sum_rho; From b699a5ea65561e34c265b0e366173bdac793ebf5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 07:54:04 -0400 Subject: [PATCH 512/691] BUG: change sign of b-field in north --- src/fill_grid.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index 11018b76..faaff08c 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -193,15 +193,13 @@ void Grid::fill_grid_bfield(Planets planet) { // Now we modify the dipole's magnetic field to account for any imprecision. // Take the bfield_mag and put it into the third component (b-hat = k-hat) if (IsDipole) { - bfield_vcgc[2] = bfield_mag_scgc; + bfield_vcgc[2] = bfield_mag_scgc % sign(magInvLat_scgc * -1.0); bfield_vcgc[1].zeros(); bfield_vcgc[0].zeros(); bfield_unit_vcgc[0].zeros(); bfield_unit_vcgc[1].zeros(); - bfield_unit_vcgc[2].ones(); - - bfield_unit_vcgc[2] % sign(magInvLat_scgc * -1.0); + bfield_unit_vcgc[2] = 1.0 * sign(magInvLat_scgc * -1.0); // slight complication - } else From 5a5204e4724a4c9be4c8aeb3cefd3ad5afb5a016 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 07:54:49 -0400 Subject: [PATCH 513/691] BUG: still issues with gravity direction --- src/init_mag_grid.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 4b324266..478b418c 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -483,14 +483,16 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { gravity_vcgc[iV].zeros(); } - rad_unit_vcgc[1] = cos(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) + // Gravity should be negative in the k direction, since the grid switches directions. + // j direction should switch signs when crossing the equator (+ in south, - in north) + rad_unit_vcgc[1] = sign(magLat_scgc) % cos(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) % sin(magLat_scgc)), 0.5); - rad_unit_vcgc[2] = 2.0 * sin(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) + rad_unit_vcgc[2] = - 2.0 * abs(sin(magLat_scgc)) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) % sin(magLat_scgc)), 0.5); precision_t mu = planet.get_mu(); - gravity_vcgc[1] = - mu * rad_unit_vcgc[1] % radius2i_scgc; - gravity_vcgc[2] = - mu * rad_unit_vcgc[2] % radius2i_scgc; + gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; + gravity_vcgc[2] = mu * rad_unit_vcgc[2] % radius2i_scgc; gravity_potential_scgc.set_size(nX, nY, nAlts); gravity_potential_scgc.zeros(); From 7f3274369bf443cffd5e861d149d5a52faf9830c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 20:48:16 -0400 Subject: [PATCH 514/691] FEAT: output grid spacing --- src/output.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/output.cpp b/src/output.cpp index c9fa6dca..fc1e7767 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -28,6 +28,9 @@ std::string get_filename_from_type(std::string type_output) { if (type_output == "bfield") filename = "3DBF"; + + if (type_output == "delta") + filename = "3DDE"; if (type_output == "moment") filename = "3DMO"; @@ -255,6 +258,22 @@ bool output(const Neutrals &neutrals, grid.radius_scgc); } + if (type_output == "delta") { + AllOutputContainers[iOutput].store_variable("dim", + "di Center m", + "m", + grid.di_center_m_scgc); + AllOutputContainers[iOutput].store_variable("djm", + "dj Center m", + "m", + grid.dj_center_m_scgc); + AllOutputContainers[iOutput].store_variable("dkm", + "dk Center m", + "m", + grid.dk_center_m_scgc); + + } + if (type_output == "bfield" || type_output == "ions") { AllOutputContainers[iOutput].store_variable("mlat", "Magnetic Latitude", From cdc8bacbcb937e36895834510c593d5b5c2774b3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 20:49:17 -0400 Subject: [PATCH 515/691] BUG: spacing should have times -1 in south --- src/grid_spacing.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index d7fd245f..ad6d5b45 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -343,8 +343,8 @@ void Grid::calc_j_grid_spacing() { // Dipole will have different scaling... if (iGridShape_ == iDipole_) { - dj_center_m_scgc = radius_scgc % dj_center_scgc % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc); - dj_edge_m = radius_scgc % dj_edge % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc); + dj_center_m_scgc = radius_scgc % dj_center_scgc % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc) % sign(magLat_scgc); + dj_edge_m = radius_scgc % dj_edge % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc) % sign(magLat_scgc); } // For a stretched grid, calculate some useful quantities: From 0bb93cdd85dae976a6ef09e468e11df6c5995661 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 20:49:52 -0400 Subject: [PATCH 516/691] STY: removed a random comment --- src/fill_grid.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index faaff08c..e98e0603 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -200,8 +200,6 @@ void Grid::fill_grid_bfield(Planets planet) { bfield_unit_vcgc[0].zeros(); bfield_unit_vcgc[1].zeros(); bfield_unit_vcgc[2] = 1.0 * sign(magInvLat_scgc * -1.0); - - // slight complication - } else for (iDim = 0; iDim < 3; iDim++) bfield_unit_vcgc[iDim] = bfield_vcgc[iDim] / (bfield_mag_scgc + 1e-32); From 551525371442699c355832e66954725db449e8ce Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 24 Apr 2025 20:50:50 -0400 Subject: [PATCH 517/691] STY: iDim -> iComp + remove int64_t everywhere --- src/calc_ion_drift.cpp | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 6f1c0cad..ec64aec6 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -101,7 +101,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, std::vector total_acc = make_cube_vector(nX, nY, nZ, 3); std::vector efield_acc = make_cube_vector(nX, nY, nZ, 3); - int64_t iIon, iNeutral, iDim; + int64_t iIon, iNeutral, iComp; std::vector grad_Pi_plus_Pe; arma_cube rho, nuin, nuin_sum, Nie, sum_rho; @@ -115,7 +115,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, fill_electrons(); - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp].zeros(); std::vector a_par = make_cube_vector(nX, nY, nZ, 3); @@ -124,7 +124,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, for (iIon = 0; iIon < nSpecies; iIon++) { - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) species[iIon].perp_velocity_vcgc[iComp].zeros(); if (species[iIon].DoAdvect) { @@ -139,16 +139,16 @@ void Ions::calc_ion_drift(Neutrals neutrals, // This is assuming that the 3rd dim is radial. // Want actual gravity for 3rd dim - for (iDim = 0; iDim < 3; iDim ++) { - gravity_vcgc[iDim] = grid.gravity_vcgc[iDim]; - grad_Pi_plus_Pe[iDim] = grad_Pi_plus_Pe[iDim] / rho; - efield_acc[iDim] = Nie % efield_vcgc[iDim] / rho; + for (iComp = 0; iComp < 3; iComp ++) { + gravity_vcgc[iComp] = grid.gravity_vcgc[iComp]; + grad_Pi_plus_Pe[iComp] = grad_Pi_plus_Pe[iComp] / rho; + efield_acc[iComp] = Nie % efield_vcgc[iComp] / rho; } // Neutral Wind Forcing: report.print(5, "neutral winds"); - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) wind_acc[iComp].zeros(); nuin_sum.zeros(); @@ -157,14 +157,14 @@ void Ions::calc_ion_drift(Neutrals neutrals, nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; nuin_sum = nuin_sum + species[iIon].nu_ion_neutral_vcgc[iNeutral]; - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { wind_acc[iComp] = wind_acc[iComp] + nuin % neutrals.velocity_vcgc[iComp]; } } // Total Forcing (sum everything - this is A_s): - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { total_acc[iComp] = - grad_Pi_plus_Pe[iComp] + gravity_vcgc[iComp] @@ -176,7 +176,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, // With a Planetary Magnetic field arma_cube a_dot_b = dot_product(total_acc, grid.bfield_unit_vcgc); - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { a_par[iComp] = a_dot_b % grid.bfield_unit_vcgc[iComp]; a_perp[iComp] = total_acc[iComp] - a_par[iComp]; } @@ -190,7 +190,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, Nie % Nie % grid.bfield_mag_scgc % grid.bfield_mag_scgc; bottom.clamp(1e-32, 1e32); - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { // I redefined A to be an acceleration instead of a force, which // then changes the definition of top top = rho % nuin % a_perp[iComp] + Nie % a_x_b[iComp]; @@ -214,7 +214,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, } } else { // No Planetary Magnetic field - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { a_par[iComp] = total_acc[iComp]; // Steady state: //species[iIon].par_velocity_vcgc[iComp] = @@ -230,9 +230,9 @@ void Ions::calc_ion_drift(Neutrals neutrals, // Calculate the mass-weighted average total velocity sum_rho = sum_rho + rho; - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { species[iIon].velocity_vcgc[iComp] = - //species[iIon].perp_velocity_vcgc[iComp] + + species[iIon].perp_velocity_vcgc[iComp] + species[iIon].par_velocity_vcgc[iComp]; velocity_vcgc[iComp] = velocity_vcgc[iComp] + rho % (species[iIon].velocity_vcgc[iComp]); @@ -243,7 +243,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, } // for iIon // This is the mass weighted total bulk velocity: - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp] = velocity_vcgc[iComp] / sum_rho; report.exit(function); From 3866b608549ca0624b765cc2b828cefe09887d1c Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Fri, 25 Apr 2025 12:54:49 -0400 Subject: [PATCH 518/691] FEAT: Add isClosed to all grids & doesTouch(S/N) pole to dipole --- include/grid.h | 3 +++ src/grid.cpp | 5 +++++ src/init_mag_grid.cpp | 12 ++++++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/include/grid.h b/include/grid.h index f4ef10bb..c11eb4e6 100644 --- a/include/grid.h +++ b/include/grid.h @@ -111,6 +111,9 @@ class Grid // in the k-up and k-down direction (altitude for geo grids, q for dipole). arma_mat first_lower_gc, first_upper_gc; + // Whether to close field lines on dipole grid (Always false for geo grids) + bool IsClosed; + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; diff --git a/src/grid.cpp b/src/grid.cpp index e435fba7..168a0999 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -271,6 +271,11 @@ Grid::Grid(std::string gridtype) { HasBField = 0; IsExperimental = false; + // Spatial info defaults + IsClosed = false; + DoesTouchNorthPole = false; + DoesTouchSouthPole = false; + UseThisCell.set_size(nX, nY, nZ); UseThisCell.fill(true); first_lower_gc.set_size(nX, nY); diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 478b418c..c47ecb2f 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -236,6 +236,11 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { lat1dDown(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 2)) / 2.0; lat1d(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 1)) / 2.0; lat1d(nLats - 2) = (lat1dDown(nLats - 1) + lat1dDown(nLats - 2)) / 2.0; + + if (sign(lower_left_norm(1)) > 0) + DoesTouchNorthPole = true; + else + DoesTouchSouthPole = true; } // l-shells of centers @@ -267,15 +272,14 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // - minimum Lshell in this block is < max_alt (the q-value would be undefined) precision_t q_min; - bool close_this_block = false; if (Pcorners.min() < max_alt_re) // invalid q's - Lshell < max_alt - close_this_block = true; + IsClosed = true; if (lat_origin < 0.01) // equator, with some imprecision - close_this_block = true; + IsClosed = true; - if (close_this_block) + if (IsClosed) q_min = 0; // q=0 at equator (for closed blocks) else // invLats are still all in North Hemisphere & increasing. From db2d8fbbcfb66216f7ad6c312226ccf57223253a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 27 Apr 2025 14:48:00 -0400 Subject: [PATCH 519/691] DOC: Update docs & default input files to be consistent & correct --- README.md | 25 +++++---- doc/README.md | 1 + doc/internals/grid.md | 85 +++++++++++++++---------------- share/run/UA/inputs/defaults.json | 15 +++--- share/run/aether.json | 2 +- 5 files changed, 67 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index d6fd6ebe..ab60df80 100644 --- a/README.md +++ b/README.md @@ -19,14 +19,14 @@ developed. ## Contents -- [Aether](#aether) - - [Contents](#contents) - - [Quick Start](#quick-start) - - [Dependencies](#dependencies) - - [Getting the Code](#getting-the-code) - - [Compiling \& Running](#compiling--running) - - [Code Manual](#code-manual) - - [Further Documentation](#further-documentation) +- [Contents](#contents) +- [Quick Start](#quick-start) + - [Dependencies](#dependencies) + - [Getting the Code](#getting-the-code) + - [Compiling \& Running](#compiling--running) + - [Inputs](#inputs) +- [Code Manual](#code-manual) +- [Further Documentation](#further-documentation) ## Quick Start @@ -141,9 +141,16 @@ structure like this: cd .. cp -R share/run ./run.test cd run.test -./aether +mpirun -np 4 ./aether ``` +This will run the default configuration of Aether, which requires four MPI processors. +The default grids are `sphere4` and `dipole4` for the neutrals and ions (respectively), +which both require four "root nodes", or MPI workers. To read more about root nodes and +the available grids, please see [this page in the documentation](doc/internals/grid.md). + +### Inputs + There are essentially two input files that specify the settings in the code. When you are in a run directory, they are: diff --git a/doc/README.md b/doc/README.md index d1601e3d..e51ddd53 100644 --- a/doc/README.md +++ b/doc/README.md @@ -32,6 +32,7 @@ Contents within `doc`: - [Ensembles](internals/ensembles.md) - [Indices](internals/indices.md) - [The Grid](internals/grid.md) + - [Coordinate Systems](internals/coordinates.md) - [Doxyfile](Doxyfile) - [README (this page)](README.md) - [Citations](citations.md) diff --git a/doc/internals/grid.md b/doc/internals/grid.md index 92da6fdb..4be0269f 100644 --- a/doc/internals/grid.md +++ b/doc/internals/grid.md @@ -18,21 +18,21 @@ again, 16 processors are needed, etc. However, in the altitude/radial direction, the number of points that are specified in the aether.json is unchanged, as it does not rely on the number of processors used. -- [Grids in Aether](#grids-in-aether) - - [Grid Types Explained](#grid-types-explained) - - [Grid Shapes Explained](#grid-shapes-explained) - - [TL;DR](#tldr) - - [The Sphere Grid](#the-sphere-grid) - - [The Cubesphere Grid](#the-cubesphere-grid) - - [The Dipole Grid](#the-dipole-grid) - - [Inputs:](#inputs) - - [Root Nodes](#root-nodes) - - [Sphere](#sphere) - - [Cubesphere](#cubesphere) - - [Specifying Root Nodes](#specifying-root-nodes) - - [Specifying the Grid](#specifying-the-grid) - - [Horizontal Resolution](#horizontal-resolution) - - [Vertical Resolution](#vertical-resolution) +- [Grid Types Explained](#grid-types-explained) +- [Grid Shapes Explained](#grid-shapes-explained) + - [TL;DR](#tldr) + - [The Sphere Grid](#the-sphere-grid) + - [The Cubesphere Grid](#the-cubesphere-grid) + - [The Dipole Grid](#the-dipole-grid) + - [Inputs:](#inputs) + - [Root Nodes](#root-nodes) + - [Sphere](#sphere) + - [Cubesphere](#cubesphere) + - [Dipole](#dipole) + - [Specifying Root Nodes](#specifying-root-nodes) +- [Specifying the Grid](#specifying-the-grid) + - [Horizontal Resolution](#horizontal-resolution) + - [Vertical Resolution](#vertical-resolution) ## Grid Types Explained @@ -77,8 +77,8 @@ system can simulate a sub-region of the Earth if desired. The user needs to specify the shape of the grid, which specifies the grid shape and the number of root nodes. Shapes include: `sphere` (1 root node), `sphere6` -(6 root nodes), `cubesphere` (6 root nodes), `dipole` (1 root node), `dipole4` -(4 root nodes), and `dipole6` (6 root nodes). +(6 root nodes), `cubesphere` (6 root nodes),`dipole4` (4 root nodes), and +`dipole6` (6 root nodes). ### The Sphere Grid @@ -118,13 +118,6 @@ Each fieldline starts at the lowest modeled altitude and curves towards the equator. In the northern hemisphere, this means that the fieldlines curve south, while in the southern hemisphere they curve north. -The dipole grid requires >4 root nodes which ensures the coordinates are -mutually orthogonal. The available shapes are `dipole4` and `dipole6`, for -compatibility with the neutral grid being a sphere or cubesphere. In both cases, -each node the entire longitude range and given a portion of the latitude range. -So in the case of `dipole4`, the four nodes are each given 1/4 of the available -latitudes and all of the longitudes. - The dipole grid is evenly spaced in **invariant latitude** (where the field line passes the minumum altitude) and **q** (the dipole coordinate specifying how far along the field line a point lies). Q is dimensionless and defined @@ -236,6 +229,20 @@ left-right direction and the up-down direction. For a cubesphere grid, the number of processors that can be used to specify the grid are then: 6, 24 (6 \* 4), 96 (6 \* 4^2), 384 (6 \* 4^3), etc. +#### Dipole + +The dipole grid requires >4 root nodes to ensure the coordinates are +mutually orthogonal. The available shapes are `dipole4` and `dipole6`, for +compatibility with the neutral grid being a sphere or cubesphere. In both cases, +each root node covers the entire longitude range and given a portion of the latitude +range. So in the case of `dipole4`, the four nodes each cover 1/4 of the available +latitudes and all of the longitudes. The available latitudes are scaled to the latitude +limits specified in the input file, so the divisions will not be at $\pm45^\circ$ and +$0^\circ$ latitude, rather will be offset to evenly divide the entire range across the +blocks. Dividing the root nodes works identically to the spherical grid, for example +`dipole4` can be used with 16 MPI tasks and each root node is divided into four blocks, +forming a 2x2 grid. + #### Specifying Root Nodes The root nodes indicate the span of the grid that they cover. This is done in a @@ -365,27 +372,17 @@ this is the number of points along the dipole flux tube. ``` ```json - "ionGrid" : { - "Shape" : "dipole", - "LatRange" : [-90.0, 90.0], - "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 36, - "nAlts" : 200, - "MinAlt" : 80.0, - "MinApex" : 120.0, - "MaxAlt" : 5000.0}, + "ionGrid": { + "Shape": "dipole4", + "nLonsPerBlock": 36, + "nLatsPerBlock": 18, + "nAlts": 100, + "LatRange": [10, 80], + "AltRange": [80.0, 1000], + "LonRange": [0.0, 360.0]}, ``` The dipole grid has both open field-lines and closed field-lines. The closed field-lines are near the equator, while the open field-lines are near the poles. -The variable `MaxAlt` sets where this differentiation occurs - if the apex -height of the field-line is above this altitude, then it is open. All -field-lines in Aether start at the `MinAlt` and rise along a dipolar shape until -they either encounter the equatorial plane or `MaxAlt`. In the south, these -field-lines tilt towards the north (from `MinAlt` to `MaxAlt`) and in the north, -the field-lines tilt towards the south (from `MinAlt` to `MaxAlt`). - -- The spacing is uniform in longitude. -- The spacing along the field-line has non-uniform spacing. -- The spacing in latitude is non-uniform. +The variable `MaxAlt` sets where the differentiation occurs - if the apex +height of all field-lines on this block are above this altitude, then it is open. \ No newline at end of file diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 1b4138ab..91afec57 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -81,13 +81,14 @@ "IsUniformAlt" : true, "AltFile" : ""}, - "ionGrid": { - "Shape": "dipole4", - "nLonsPerBlock": 14, - "nLatsPerBlock" : 20, - "nAlts":30, - "AltRange":[80,1500], - "LatRange":[7, 87]}, + "ionGrid": { + "Shape": "dipole4", + "nLonsPerBlock": 36, + "nLatsPerBlock": 18, + "nAlts": 100, + "LatRange": [10, 80], + "AltRange": [80.0, 1000], + "LonRange": [0.0, 360.0]}, "Oblate" : { "isOblate" : false, diff --git a/share/run/aether.json b/share/run/aether.json index 65ac4f7e..65780a75 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -27,7 +27,7 @@ "nAlts": 100, "LatRange": [10, 80], "AltRange": [80.0, 1000], - "LonRange": [0.0, 360.0] }, + "LonRange": [0.0, 360.0]}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], From beba721299f1d758433f6d9b80d8a590de48401a Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 27 Apr 2025 16:46:08 -0400 Subject: [PATCH 520/691] DOC: Add section on OpenMP & toc to running_aether.md I did some digging. Parallelization is weird. --- doc/usage/running_aether.md | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/doc/usage/running_aether.md b/doc/usage/running_aether.md index 2811afa6..7702d8e9 100644 --- a/doc/usage/running_aether.md +++ b/doc/usage/running_aether.md @@ -4,6 +4,22 @@ This document assumes you have already downloaded and built the Aether model. If not, you should return to [one](../../README.md) of [these](../installation/installation.md) pages before continuing. +- [The first run](#the-first-run) + - [Running in 1D](#running-in-1d) + - [Using OpenMP](#using-openmp) +- [Output Files](#output-files) + - [Blocks](#blocks) + - [Ensembles](#ensembles) + - [Post processing](#post-processing) +- [Input Files](#input-files) +- [defaults.json file](#defaultsjson-file) +- [For Developers](#for-developers) +- [aether.json file](#aetherjson-file) +- [planet.in file](#planetin-file) +- [orbits.csv file](#orbitscsv-file) +- [chemistry file](#chemistry-file) + + ## The first run Once you have compiled you can run Aether. To remember which runs you're doing, @@ -70,6 +86,33 @@ to `"sphere"`. No number! 2. Run the code with `./aether`. This will not use MPI, however armadillo may use multiple OpenMP processes for math, so be careful on cluster login nodes. +### Using OpenMP + +> This section is mostly a placeholder. Everything is correct, but has little +> effect on Aether's speed. This is only really a concern on laptops with low core counts +> or shared systems. + +Armadillo contains several optimizations which utilize OpenMP for parallelization beyond +the block decomposition on the entire sphere. Thus, runs on 4 MPI processors can benefit +from devoting additional processors to OpenMP parallelization. + +The number of OpenMP tasks Armadillo is able to utilize can be set before compiling or +at runtime. To change this *before* compiling, change the value of`ARMA_OPENMP_THREADS` +in the [Armadillo config.hpp file](../../share/include/armadillo_bits/config.hpp#173) +from 8. This will require re-compiling & possibly re-running `cmake`. The more flexible +option is to use a variable at runtime: + +The easier way to set the number of OpenMP threads is to use the variable +`OMP_NUM_THREADS`. This can be set before running the executable with +`export OMP_NUM_THREADS=2`, or at runtime with: + +```bash +OMP_NUM_THREADS=2 mpirun -np 4 ./aether +``` +At this stage in development, there is not much speedup available from OpenMP. For +example, the change in runtime from the default value of 8 (from Armadillo) and 1 +(disabling OpenMP) in a 10-minute run is about one minute, or about 10%. + ## Output Files Aether outputs to a subdirectory called UA/output. At this time, all processors From b6eccccae5b2ddef8a7f89fb8221723199cf8dc9 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Sun, 27 Apr 2025 16:46:44 -0400 Subject: [PATCH 521/691] BUG: Make check_for_nans TRUE be default. there are some gremlins --- share/run/aether.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/run/aether.json b/share/run/aether.json index 65780a75..cc3e330d 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -8,7 +8,7 @@ "iFunctionVerbose" : { "Grid::create_altitudes": 0}, "dt" : 10.0, - "check_for_nans" : false}, + "check_for_nans" : true}, "EndTime" : [2011, 3, 20, 0, 10, 0], From fc39fa0dc3636adfa02630f1310acf30ac94032f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:04:36 -0400 Subject: [PATCH 522/691] FEAT: added ability to message pass --- include/grid.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/include/grid.h b/include/grid.h index c11eb4e6..ebee7cc9 100644 --- a/include/grid.h +++ b/include/grid.h @@ -267,6 +267,7 @@ class Grid void set_IsDipole(bool value); bool get_IsDipole(); + bool get_IsClosed(); int64_t get_nPointsInGrid(); @@ -327,6 +328,8 @@ class Grid void report_grid_boundaries(); void calc_cent_acc(Planets planet); + void create_dipole_connection(Quadtree quadtree); + // Make mag-field grid: bool init_dipole_grid(Quadtree quadtree_ion, Planets planet); // Support functions: @@ -350,17 +353,26 @@ class Grid int iProcYp; /// The processor to the South/Down/Y-: int iProcYm; + // This is special, since message passing in the z direction will only be + // between closed magnetic field lines, so we don't need a +/- (p/m): + int iProcZ; + bool isExchangeInitialized = false; + arma_vec edge_Xp; arma_vec edge_Yp; arma_vec edge_Xm; arma_vec edge_Ym; + // again, z will only be in one + arma_vec edge_Z; int64_t iRoot; int64_t iRootXp; int64_t iRootXm; int64_t iRootYp; int64_t iRootYm; + // again, z will only be in one + int64_t iRootZ; struct messages_struct { From 989984c83121127defce1704bb9c0039f89d6ec1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:05:50 -0400 Subject: [PATCH 523/691] FEAT: message passing on multiple grids + iDir = 4 --- src/exchange_messages.cpp | 127 +++++++++++++++++++++++++++++++------- 1 file changed, 103 insertions(+), 24 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index befbdb7f..8e0a41be 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -105,6 +105,7 @@ bool Ions::exchange_old(Grid &grid) { // 1 - top // 2 - left // 3 - bottom +// 4 - vertical (k direction) for closed field lines // // cells (assume gc = 2): // 0 1 | 2 3 4 ... n-gc*2 n-gc-1 | n-gc n-1 @@ -124,6 +125,7 @@ bool pack_border(const arma_cube &value, int64_t iXstart, iXend; int64_t iYstart, iYend; + int64_t iZstart, iZend; // ---------------------------- // left / right message passing @@ -159,8 +161,22 @@ bool pack_border(const arma_cube &value, } } + // ---------------------------- + // k-dir (only top) + if (iDir == 4) { + iXstart = nG; + iXend = nX - nG; + iYstart = nG; + iYend = nY - nG; + iZstart = nZ - nG; + iZend = nZ; + } else { + iZstart = nG; + iZend = nZ - nG; + } + try { - for (int64_t iZ = nG; iZ < nZ - nG; iZ++) { + for (int64_t iZ = iZstart; iZ < iZend; iZ++) { for (int64_t iY = iYstart; iY < iYend; iY++) { for (int64_t iX = iXstart; iX < iXend; iX++) { packed[*iCounter] = value(iX, iY, iZ); @@ -186,6 +202,7 @@ bool pack_border(const arma_cube &value, // 1 - top // 2 - left // 3 - bottom +// 4 - k-dir top // DoReverseX and DoReverseY are because packing always happens from // lower left to upper right, while face we are unpacking too may // have a different (left - right and up - down) geometry @@ -210,7 +227,8 @@ bool unpack_border(arma_cube &value, int64_t iXstart, iXend; int64_t iYstart, iYend; - int64_t xInc = 1, yInc = 1; + int64_t iZstart, iZend; + int64_t xInc = 1, yInc = 1, zInc = 1; int64_t iXOff = 0; int64_t nCx = nX - 2 * nG; @@ -261,10 +279,26 @@ bool unpack_border(arma_cube &value, } } + if (iDir == 4) { + iXstart = nG; + iXend = nX - nG; + iYstart = nG; + iYend = nY - nG; + // need to reverse direction, since packing is from the bottom up, + // which means unpacking should be from the top down + iZend = nZ - nG; + iZstart = nZ; + zInc = -1; + } else { + iZstart = nG; + iZend = nZ - nG; + } + try { int64_t iXp, iYp; - for (int64_t iZ = nG; iZ < nZ - nG; iZ++) { + for (int64_t iZ = iZstart; iZ < iZend; iZ += zInc) { + if (XbecomesY) { for (int64_t iX = iXstart; iX < iXend; iX += xInc) { iXp = iX; @@ -311,7 +345,6 @@ bool unpack_border(arma_cube &value, } catch (...) { DidWork = false; } - return DidWork; } @@ -440,6 +473,12 @@ bool Grid::send_one_var_one_face(int64_t iFace) { bool DidWork = true; + if (report.test_verbose(4)) + std::cout << "in send_one_var_one_face : " << iFace << " from: " << + iProc << " to: " << + interchangesOneVar[iFace].iProc_to << " tag: " << + interchangesOneVar[iFace].iTag << "\n"; + MPI_Isend(interchangesOneVar[iFace].buffer, interchangesOneVar[iFace].iSizeTotal, MPI_BYTE, @@ -480,6 +519,13 @@ bool Grid::receive_one_var_one_face(int64_t iFace) { bool DidWork = true; + if (report.test_verbose(4)) + std::cout << "in receive_one_var_one_face : " << iFace << " from: " << + iProc << " to: " << + interchangesOneVar[iFace].iProc_to << " tag: " << + interchangesOneVar[iFace].iTag << "\n"; + + MPI_Recv(interchangesOneVar[iFace].rbuffer, interchangesOneVar[iFace].iSizeTotal, MPI_BYTE, @@ -508,6 +554,7 @@ Grid::messages_struct Grid::make_new_interconnection(int64_t iDir, int64_t nPtsX = nGCs * (nY - nGCs * 2) * (nZ - nGCs * 2); int64_t nPtsY = nGCs * (nX - nGCs * 2) * (nZ - nGCs * 2); + int64_t nPtsZ = nGCs * (nX - nGCs * 2) * (nY - nGCs * 2); new_inter.iFace = iDir; new_inter.DoReverseX = DoReverseX; @@ -515,16 +562,24 @@ Grid::messages_struct Grid::make_new_interconnection(int64_t iDir, new_inter.IsPole = IsPole; new_inter.XbecomesY = XbecomesY; + // Along i axis (left or right): if (iDir == 0 || iDir == 2) { new_inter.iSizeTotal = nVars * nPtsX * sizeof(precision_t); new_inter.index.set_size(nGCs, nY); new_inter.ratio.set_size(nGCs, nY); - } else { + } + + // Along j axis (up or down): + if (iDir == 1 || iDir == 3) { new_inter.iSizeTotal = nVars * nPtsY * sizeof(precision_t); new_inter.index.set_size(nGCs, nX); new_inter.ratio.set_size(nGCs, nX); } + // Along K axis (up only for now): + if (iDir == 4) + new_inter.iSizeTotal = nVars * nPtsZ * sizeof(precision_t); + new_inter.buffer = static_cast(malloc(new_inter.iSizeTotal)); new_inter.rbuffer = static_cast(malloc(new_inter.iSizeTotal)); @@ -538,7 +593,6 @@ Grid::messages_struct Grid::make_new_interconnection(int64_t iDir, return new_inter; } - /* // ----------------------------------------------------------------------------- // Exchange messages for the NEUTRALS: @@ -772,6 +826,15 @@ bool Neutrals::exchange_really_old(Grid &grid) { // ----------------------------------------------------------------------------- // Initialize interfaces between horizontal sides on a grid +// Directions: +// 0 = + i (right) +// 1 = + j (up) +// 2 = - i (left) +// 3 = - j (down) +// 4 = + k (vertical) - only along closed dipole field lines +// For the cubesphere grid: +// iRoot = 4 is the south polar region +// iRoot = 5 is the north polar region // ----------------------------------------------------------------------------- bool exchange_sides_init(Grid &grid, int64_t nVarsToPass) { @@ -911,6 +974,24 @@ bool exchange_sides_init(Grid &grid, int64_t nVarsToPass) { ReverseY, XbecomesY)); + if (grid.get_IsDipole() && grid.get_IsClosed()) { + // This operates in the N/S (j or Y) direction: + ReverseX = false; + ReverseY = false; + IsPole = false; + XbecomesY = false; + grid.interchangesOneVar.push_back( + grid.make_new_interconnection(4, + nVarsToPass, + grid.iProcZ, + grid.edge_Z, + IsPole, + ReverseX, + ReverseY, + XbecomesY)); + + } + report.exit(function); return DidWork; } @@ -942,30 +1023,31 @@ bool exchange_one_var(Grid &grid, bool DidWork = true; - int iTag, iDir; + int iTag, iDir, nDir; int iSpecies; - static int64_t iX, nX = grid.get_nX(); - static int64_t iY, nY = grid.get_nY(); - static int64_t iZ, nZ = grid.get_nZ(); + static int64_t nX = grid.get_nX(); + static int64_t nY = grid.get_nY(); + static int64_t nZ = grid.get_nZ(); static int64_t nG = grid.get_nGCs(); - static int64_t nPtsX = nG * (nY - nG * 2) * (nZ - nG * 2); - static int64_t nPtsY = nG * (nX - nG * 2) * (nZ - nG * 2); - static bool IsFirstTime = true; static arma_cube var_scgc; static int64_t nVarsToPass = 1; - if (IsFirstTime) { + if (!grid.isExchangeInitialized) { DidWork = exchange_sides_init(grid, nVarsToPass); - var_scgc.set_size(nX, nY, nX); - IsFirstTime = false; + grid.isExchangeInitialized = true; } + var_scgc.set_size(nX, nY, nZ); int64_t iP; precision_t oneSign = 1.0; - for (int iDir = 0; iDir < 4; iDir++) { + nDir = 4; + if (grid.get_IsDipole() && grid.get_IsClosed()) + nDir++; + + for (int iDir = 0; iDir < nDir; iDir++) { if (report.test_verbose(4)) std::cout << "packing one var : " << iDir << " " << iProc << " " << grid.interchangesOneVar[iDir].iProc_to @@ -991,7 +1073,7 @@ bool exchange_one_var(Grid &grid, } // Send all faces asynchronously: - for (int iDir = 0; iDir < 4; iDir++) { + for (int iDir = 0; iDir < nDir; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { report.print(4, "Sending one face"); DidWork = grid.send_one_var_one_face(iDir); @@ -999,7 +1081,7 @@ bool exchange_one_var(Grid &grid, } // Receive all faces asynchronously: - for (int iDir = 0; iDir < 4; iDir++) { + for (int iDir = 0; iDir < nDir; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { report.print(4, "Receiving one face"); DidWork = grid.receive_one_var_one_face(iDir); @@ -1007,13 +1089,13 @@ bool exchange_one_var(Grid &grid, } // Wait for messages to get there: - for (int iDir = 0; iDir < 4; iDir++) { + for (int iDir = 0; iDir < nDir; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) MPI_Wait(&grid.interchangesOneVar[iDir].requests, MPI_STATUS_IGNORE); } // Unpack all faces: - for (int iDir = 0; iDir < 4; iDir++) { + for (int iDir = 0; iDir < nDir; iDir++) { if (grid.interchangesOneVar[iDir].iProc_to >= 0) { iP = 0; report.print(4, "Unpacking Border"); @@ -1029,9 +1111,6 @@ bool exchange_one_var(Grid &grid, } } - // Wait for all processors to be done. - MPI_Barrier(aether_comm); - // If this is a cubesphere grid, interpolate ghostcells to their proper location //if (grid.IsCubeSphereGrid & grid.gcInterpolationSet) { // report.print(3, "Interpolating Ghostcells to Proper Location"); From 1c2ef28a463b1e3336f2a16d61b1dd82bdcbaa64 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:06:30 -0400 Subject: [PATCH 524/691] FEAT: gotta know if dipole and closed! --- src/grid.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index 168a0999..93270b37 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -520,6 +520,23 @@ void Grid::set_IsDipole(bool value) { IsDipole = value; } +// -------------------------------------------------------------------------- +// Get whether the grid is a dipole grid +// -------------------------------------------------------------------------- + +bool Grid::get_IsDipole() { + return IsDipole; +} + +// -------------------------------------------------------------------------- +// Get whether the dipole grid is closed (true) or open (false) +// -------------------------------------------------------------------------- + +bool Grid::get_IsClosed() { + return IsClosed; +} + + // -------------------------------------------------------------------------- // Get total number of grid points // -------------------------------------------------------------------------- From 9c9ac140e84313cd38e2af3c7c8570e9a204e0fe Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:07:08 -0400 Subject: [PATCH 525/691] FEAT: dipole quadtree is like sphere quadtree --- src/quadtree.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index ff5d45a2..35ebb2e5 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -514,19 +514,18 @@ int64_t Quadtree::find_point(arma_vec point) { if (IsSphere) wrap_point = wrap_point_sphere(point); - if (IsCubeSphere) wrap_point = wrap_point_cubesphere(point); + if (IsDipole) + wrap_point = wrap_point_sphere(point); int64_t iNode = -1; for (int64_t iRoot = 0; iRoot < nRootNodes; iRoot++) { iNode = find_point(wrap_point, root_nodes[iRoot]); - if (iNode > -1) break; } - return iNode; } @@ -542,9 +541,10 @@ int64_t Quadtree::find_root(arma_vec point) { if (IsSphere) wrap_point = wrap_point_sphere(point); - if (IsCubeSphere) wrap_point = wrap_point_cubesphere(point); + if (IsDipole) + wrap_point = wrap_point_cubesphere(point); int64_t iNode = -1, iRoot; From 1f0622b3ad0782fdf2f47f1329cd5b22ce1d7de1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:07:58 -0400 Subject: [PATCH 526/691] FEAT: connectivity for dipole grid --- src/init_mag_grid.cpp | 128 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 124 insertions(+), 4 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index c47ecb2f..6add43e5 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -5,6 +5,127 @@ #include "aether.h" +// ---------------------------------------------------------------------- +// Create connectivity between the nodes for message passing for dipole +// (this looks a lot like sphere, since they are very related) +// ---------------------------------------------------------------------- + +void Grid::create_dipole_connection(Quadtree quadtree) { + + std::string function = "Grid::create_dipole_connection"; + static int iFunction = -1; + report.enter(function, iFunction); + + IsLatLonGrid = true; + + // Get some coordinates and sizes in normalized coordinates: + arma_vec lower_left_norm = quadtree.get_vect("LL"); + arma_vec middle_norm = quadtree.get_vect("MID"); + arma_vec size_right_norm = quadtree.get_vect("SR"); + arma_vec size_up_norm = quadtree.get_vect("SU"); + + // Move to the next block in 4 directions: + arma_vec down_norm = middle_norm - 0.51 * size_up_norm; + arma_vec up_norm = middle_norm + 0.51 * size_up_norm; + arma_vec left_norm = middle_norm - 0.51 * size_right_norm; + arma_vec right_norm = middle_norm + 0.51 * size_right_norm; + + // The first component could wrap around: + right_norm(0) = fmod(right_norm(0), quadtree.limit_high(0)); + left_norm(0) = fmod((left_norm(0) + quadtree.limit_high(0)), + quadtree.limit_high(0)); + + // These should be the exact edge of the face. + // The from and to processors should get these in the same place, + // so they can be used to match which processor to send / receive info + edge_Xp = middle_norm + size_right_norm / 2.0; + // wrap in longitude: + edge_Xp(0) = fmod(edge_Xp(0), quadtree.limit_high(0)); + edge_Xm = middle_norm - size_right_norm / 2.0; + edge_Yp = middle_norm + size_up_norm / 2.0; + edge_Ym = middle_norm - size_up_norm / 2.0; + // by default, edge_Z isn't even an edge, since most processors should + // not exchange messages in the Z direction. + edge_Z = middle_norm; + + iProcYm = quadtree.find_point(down_norm) + iMember * nGrids; + iProcYp = quadtree.find_point(up_norm) + iMember * nGrids; + iProcXm = quadtree.find_point(left_norm) + iMember * nGrids; + iProcXp = quadtree.find_point(right_norm) + iMember * nGrids; + iProcZ = iProc; + + iRoot = quadtree.find_root(middle_norm); + iRootYm = quadtree.find_root(down_norm); + iRootYp = quadtree.find_root(up_norm); + iRootXm = quadtree.find_root(left_norm); + iRootXp = quadtree.find_root(right_norm); + iRootZ = iRoot; + + // If we are a closed field-line, then we want to exchange messages + // along the Z direction, which turns out to be the same processor + // as the Y direction, so just take that one: + IsClosed = false; + if ((middle_norm(1) < 0) && (up_norm(1) > 0)) { + // We are in the south and need to pass to the north: + iRootZ = iRootYp; + iProcZ = iProcYp; + edge_Z = edge_Yp; + // To make the point unique, we need to alter the edge location + // otherwise the message passing will get confused. Since the + // points are "higher" than the other edges, let's just add some + // to the 3rd dimension: + edge_Z(2) = 5.0; + IsClosed = true; + } + if ((middle_norm(1) > 0) && (down_norm(1) < 0)) { + // We are in the north and need to pass to the south: + iRootZ = iRootYm; + iProcZ = iProcYm; + edge_Z = edge_Ym; + // See note above... + edge_Z(2) = 5.0; + IsClosed = true; + } + + // Check if touching South Pole: + if (lower_left_norm(1) == quadtree.limit_low(1)) { + DoesTouchSouthPole = true; + + // edges need to be adjusted to deal with longitudes, since the + // pole will 180deg different for the from and to processors + if (edge_Ym(0) < 1.0) + edge_Ym(0) += 0.5; + else + edge_Ym(0) -= 0.5; + } + + // Check if touching North Pole: + if (lower_left_norm(1) + size_up_norm(1) == quadtree.limit_high(1)) { + DoesTouchNorthPole = true; + + // edge need to be adjusted to deal with longitudes, since the + // pole will 180deg different for the from and to processors + if (edge_Yp(0) < 1.0) + edge_Yp(0) += 0.5; + else + edge_Yp(0) -= 0.5; + } + + if (report.test_verbose(2)) + std::cout << "connectivity : " + << " iProc : " << iProc << "\n" + << " isnorth : " << DoesTouchNorthPole << "\n" + << " issouth : " << DoesTouchSouthPole << "\n" + << " iProcYm : " << iProcYm << "\n" + << " iProcYp : " << iProcYp << "\n" + << " iProcXm : " << iProcXm << "\n" + << " iProcXp : " << iProcXp << "\n"; + + report.exit(function); + return; +} + + // ---------------------------------------------------------------------- // Routine to convert p and q to r and theta. Can be solved iteratively, // or with approach from (Swisdak, 2006), who solved it analytically: @@ -99,10 +220,9 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { IsCubeSphereGrid = false; IsDipole = true; - // report.print(0, "Creating inter-node connections Grid"); - - //if (!Is0D & !Is1Dz) - // create_sphere_connection(quadtree_ion); + report.print(0, "Creating inter-node dipole connections"); + if (!Is0D & !Is1Dz) + create_dipole_connection(quadtree_ion); report.print(0, "Creating Dipole Grid"); From 12ba82c8f08778739bb1d96965737b06c0bc0f2d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 30 Apr 2025 10:08:31 -0400 Subject: [PATCH 527/691] FEAT: exchange messages for ion grid --- src/advance.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/advance.cpp b/src/advance.cpp index c474636e..b85395ae 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -127,6 +127,7 @@ bool advance(Planets &planet, if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { neutrals.exchange_old(gGrid); ions.exchange_old(gGrid); + ionsMag.exchange_old(mGrid); advect(gGrid, time, neutrals); } From 0bb1649e7e157fce367a70b45c29d829a7a2ae8f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 30 Apr 2025 11:16:30 -0400 Subject: [PATCH 528/691] BUG: row/col switched in solver_gradients 4o_j --- src/solver_gradients.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 6773f30e..ef1c06c7 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -264,7 +264,7 @@ arma_cube calc_gradient4o_j(arma_cube value, Grid grid) { iY = 0; gradient.col(iY) = (value.col(iY + 1) - value.col(iY)) / - grid.dj_center_m_scgc.row(iY); + grid.dj_center_m_scgc.col(iY); // Upper (one sided): iY = nY - 1; From 4961430013ba9fd7bfb5b1d44e95c5f9908eb8b2 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 8 May 2025 09:42:05 -0400 Subject: [PATCH 529/691] BUG: init_mag_grid wasn't correctly identifying if its touching the pole --- src/init_mag_grid.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 6add43e5..8de44039 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -350,7 +350,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { // - evenly space the ghost cells between these. // Check if we're touching the pole, need to look at original quadtree values - if ((abs(lower_left_norm(1) + size_up_norm(1)) > 0.49) // north pole + if ((lower_left_norm(1) + size_up_norm(1) > 0.49) // north pole || (lower_left_norm(1) < -0.49)) { // south pole lat1dDown(nLats) = 89.9 * cDtoR; lat1dDown(nLats - 1) = (lat1dDown(nLats) + lat1dDown(nLats - 2)) / 2.0; From c740361928b267312c102ca99e302bf9c3cc8c2f Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 8 May 2025 09:43:05 -0400 Subject: [PATCH 530/691] STY: astyle, yo --- src/init_mag_grid.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8de44039..f5c3f584 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -44,7 +44,7 @@ void Grid::create_dipole_connection(Quadtree quadtree) { edge_Xm = middle_norm - size_right_norm / 2.0; edge_Yp = middle_norm + size_up_norm / 2.0; edge_Ym = middle_norm - size_up_norm / 2.0; - // by default, edge_Z isn't even an edge, since most processors should + // by default, edge_Z isn't even an edge, since most processors should // not exchange messages in the Z direction. edge_Z = middle_norm; @@ -65,6 +65,7 @@ void Grid::create_dipole_connection(Quadtree quadtree) { // along the Z direction, which turns out to be the same processor // as the Y direction, so just take that one: IsClosed = false; + if ((middle_norm(1) < 0) && (up_norm(1) > 0)) { // We are in the south and need to pass to the north: iRootZ = iRootYp; @@ -77,6 +78,7 @@ void Grid::create_dipole_connection(Quadtree quadtree) { edge_Z(2) = 5.0; IsClosed = true; } + if ((middle_norm(1) > 0) && (down_norm(1) < 0)) { // We are in the north and need to pass to the south: iRootZ = iRootYm; @@ -221,6 +223,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { IsDipole = true; report.print(0, "Creating inter-node dipole connections"); + if (!Is0D & !Is1Dz) create_dipole_connection(quadtree_ion); @@ -608,11 +611,11 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { } // Gravity should be negative in the k direction, since the grid switches directions. - // j direction should switch signs when crossing the equator (+ in south, - in north) - rad_unit_vcgc[1] = sign(magLat_scgc) % cos(magLat_scgc) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) - % sin(magLat_scgc)), 0.5); - rad_unit_vcgc[2] = - 2.0 * abs(sin(magLat_scgc)) / pow(abs(1.0 + 3.0 * sin(magLat_scgc) - % sin(magLat_scgc)), 0.5); + // j direction should switch signs when crossing the equator (+ in south, - in north) + rad_unit_vcgc[1] = sign(magLat_scgc) % cos(magLat_scgc) + / pow(abs(1.0 + 3.0 * sin(magLat_scgc) % sin(magLat_scgc)), 0.5); + rad_unit_vcgc[2] = - 2.0 * abs(sin(magLat_scgc)) + / pow(abs(1.0 + 3.0 * sin( magLat_scgc) % sin(magLat_scgc)), 0.5); precision_t mu = planet.get_mu(); gravity_vcgc[1] = mu * rad_unit_vcgc[1] % radius2i_scgc; From eb9e29b5cbce1de3e49a96623d6b3e80cf5a082d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 8 May 2025 13:49:22 -0400 Subject: [PATCH 531/691] BUG: Dipole missing factor of 2 in number of GCs --- edu/examples/Dipole/MoreDipoleInfo.ipynb | 12 ++++++------ edu/examples/Dipole/dipole.py | 2 +- src/init_mag_grid.cpp | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/edu/examples/Dipole/MoreDipoleInfo.ipynb b/edu/examples/Dipole/MoreDipoleInfo.ipynb index 6d93769d..547388a1 100644 --- a/edu/examples/Dipole/MoreDipoleInfo.ipynb +++ b/edu/examples/Dipole/MoreDipoleInfo.ipynb @@ -130,7 +130,7 @@ "# call dipole.main, which returns q & p\n", "# These values are a bit unreasonable, but it makes the plots more clear.\n", "qs, ps = dipole.main(alt_minRE=1.01, alt_maxRE=1.3,\n", - " lat_min=15, lat_max=80,\n", + " lat_min=15, lat_max=84,\n", " origins=origins, extent=extent, \n", " nLatsPerBlock=14, nAltsPerBlock=18)\n", "\n", @@ -178,7 +178,7 @@ "outputs": [ { "data": { - "image/png": "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OsaWxJrZ81ubpXqC+/XrZ9DD2L9/f1y+fBkajQapqakQiUTo27ev/nl/f3907NgRqampJveXkpKCt956C15eXvrH008/jdzcXFRUGJ87xcXFyM/PR58+ffTLhEIhevXqZbRut27dDL4PCQnBjRs3AACpqakIDw9HeHi4/vnOnTvD19dX39b58+fjqaeewrBhw/Dee+/hypVa578Zzpw5g6FDh5p87tSpU2CMoUOHDgbv/+DBg2a9llwux6xZszBy5EiMHz8eH330EXJzcxvdRkdCAZgQQsykUlUgYcdYxP0wFgWKNLO2KVCkIe6HsUjYMZYCmhnoGNteWlqaxcKvzsqVK5GWZt7PrynqCteMsTo/ltdqtVi2bBnOnDmjf/z999+4fPkyJLrqDybU3p+p1xaLxUbbaG/PIFdXm2ouX7p0KS5cuICxY8fi999/R+fOnbFjx44622SKVCqt8zmtVguhUIiUlBSD95+amoqPPvrIrP2vXbsWR44cQWxsLL777jt06NABR48ebVQbHQkFYAfWAqrKENKilJbnIrs0F3kVhYjfMaHBgFagSEP8jgnIqyhEdmkuSsudu8fEFugY217Hjh2xYMECi+5zwYIF6NixY7P2UTtcHT16FNHR0RAKhejcuTPUajWOHTumf/7WrVv4559/EBMTY3J/PXv2RFpaGtq3b2/0EJio9ODj44OgoCAcP35cv0yj0eD06dONeh+dO3dGZmYmsrKy9MsuXryI4uJig7Z26NAB8+bNw759+zBx4kSsXbsWAODm5gaNRtPg63Tr1g0HDhww+VyPHj2g0Whw48YNo/ceHBxs9nvp0aMH4uPjkZycjC5dumDTpk0Nb+SgYYYCsINKTgYmT+a/EkIcg9y3HZY/9BOCPfwaDGg1g1mwhx+WP/QT5L7tbNxi50PH2PY4jsP7779vsRC8YMECi5REy8rKwvz585GWlobNmzfj448/xssvvwwAiI6OxoQJE/D000/jr7/+wtmzZzF9+nS0bt0aEyZMMLm/N998E+vXr9f3tqampuK7777D66+/XmcbXnzxRSxfvhw//fQT0tLS8PLLL6OwsLBR723YsGHo1q0bpk2bhlOnTuH48eOYOXMmBg8ejN69e6OyshIvvPACkpKSkJGRgcOHD+PEiRP6cBwZGYmysjIcOHAABQUFJodrAMCSJUuwefNmLFmyBKmpqfj777+xYsUKAHy4njZtGmbOnInt27fj2rVrOHHiBBITE7Fnz54G38O1a9cQHx+PI0eOICMjA/v27av3jw29sjLg6lX+q4OhAOyAkpOBuDjg+HH+K4VgQhxHgLyjiYD2j8E6poJZgLx5vWGuhI6x7VkqBFsq/ALAzJkzUVlZiT59+uD555/Hiy++iGeeeUb//Nq1a9GrVy+MGzcO/fv3B2MMe/bsMRqOoDNy5Ejs3r0b+/fvxz333IN+/frhgw8+QERE3ZMjxcXF4dFHH8XMmTPRv39/eHl5YeTIkfUOmaiN4zj8+OOP8PPzw6BBgzBs2DBERUXhu+++A8CPK7516xZmzpyJDh06YPLkyRg9ejSWLVsGAIiNjcX//d//YcqUKQgMDNSH2tqGDBmCbdu2YefOnejevTvuv/9+gx7ytWvXYubMmfre+QceeADHjh0zGJtcFw8PD1y6dAkPP/wwOnTogGeeeQYvvPACnn322bo3KisDsrOB8nL+q4OFYI41d5S6iygpKYGPjw+Ki4vh7e1ttdfRhV+FAoiMBNLTAbkcSEwEYmOt9rLkNqVKQxNnELPUDGBydy+cKa9ElUaDl6LuRcqtc7ihLKFg1kw1j3GoxAuLZZWo1mpwSHovDhfQMTaHUqnEtWvX0LZtW7NCW3NuiLNk+B0yZAi6d++ODz/8sNn7YlqtxSa30Gq1iImJweTJk/H22283u20tli78qtWAuztQVQWIREBYGODl1ezd13dem5vXaCY4B1Iz/LZty8/E2LYtcO0av5xCsHUpVRo8/FkyLuaWQMhx0DCGHadz8MNzsRSCCQAYVHjw8o7AkvFb8dqPD+FyUTquVzNA5I6t13ZBrdGgnW8klozfCi/vCP12EpH5vUYuq0aFhwCfCCx/gD/GmcXpuC7kj/FP6btQruaP8bsPbEWAT8Sd7YR0jJtD1xMMoFEh2JLh15KYVovqq1ehVSr5iypj0BQVwS0qyqwQrPu4f/DgwaiqqsInn3yCa9eu4bHHHrNB651U7fAL3AnB2dkWC8HNRQHYQZgKvwCFYFvacDQDF3NLwBigvv3ByMXcEmw4moGnBkbZuXXEEUzaNsloWWZ5Ja5XM2gYA1RKnFMBQo5DaXklnjvwmsG6ux7dZaumOq9Dhsc4AMBiWSWuC+8c41e8+WMc6lGJgAuGxxhD6Bg3V2NDsKOGXwDQKBR8+AX0N2NplUpoFAqIAgIa3F4gEGDdunVYuHAhGGPo0qULfvvtt4bHvroqU+FXx8FCMAVgB1BX+NWxZQhmzPj1XUWWogJCjtOHX4C/yGYpqKwSqVuVRgOI3AFVjdq0Ind+ObGIaq3pY1ytpWNsLeaGYGuF38ZM0VsfVl2t7/nV4zh+uRnCw8Nx+PBhi7TFIVjzIl9f+NVxoBBMAdjOGgq/OrYIwcnJwKpVwLx5rtnLHC734HuYatAwhnC5h51aRBzNtknbjJZ9vXMatl7bhXO3Z19t7y6Ap1CDSW3vxZMPbLRxC1uAgcbH+NDOafgpfRdeuT2cb1mhACIBf4yjB9IxtpaGQrAj9/zqcG5uxmW4GOOXu5qyMiA/HwgKsnzwNCf86jhICKYqEHZUV/jVahkyFeVIyytBpqIcWi3/y6sLwQqF5atDUOUJYHq/CHQO8QbHASIBB44DOod4Y3q/uu8QJq5FIpIYPMpKMpBy6xzUGg2EHAehWAJPoRAaLUPKrXMoK8kwWJ+YQSgxeBQUZ+BwwTmUq+8cY5FAiHINw+GCcygozjDchlhUXdUhnCH8AoBQLodAd5PU7bYKJBII5XI7tsoOrFmRoY7wywBoq6uhraqCtroaBn+GuLvz69uxOoRdA/DSpUvBcZzBo2ZBZsYYli5ditDQUEilUgwZMgQXLlww2EdVVRVefPFFBAQEwNPTEw888ACys7MN1iksLMSMGTPg4+MDHx8fzJgxA0VFRbZ4i3WqL/yezFDgcn4ZcooqcTm/DCczFFYNwTXb0qWLdQK2M5CIhfjhuVi8NiYG0/q2wWtjYugGOFInXYWCG8oStPONRKhnMPxF3pjUdjyifSNxQ1li1kQOpG5Gx9gjGAF0jJukOQWfaodgZwm/AMAJBHCLioI4OBgiPz+Ig4PNvgGuxagZUKVSywbP+sJvRQVYVRVYdTVYVRX/fc1tmxGCLVHAzO5nwF133YXc3Fz94++//9Y/t2LFCnzwwQf45JNPcOLECQQHB2P48OEoLS3VrzN37lzs2LEDW7ZswV9//YWysjKMGzfOYNaUxx57DGfOnMHevXuxd+9enDlzBjNmzLDp+6ypvmEP2UUVKFWqAdz51KZUqUZ20Z1xqJYMwbXbIhBYr5fZGUjEQjw1MArLJnTBUwOjKPwSk2rXoH33wR1oE9wL0a374MkHNiLx4d1mTeRA6mbqGEcE90J0KB3jxtDVxK1r8gRz6UJwamqq04RfHU4ggCggAOLQUIgCAlw3/NasyGCJEFzPsAdWXQ3Uvg9CozEee93EtujO57pqPpvDrnWAly5dih9//BFnzpwxeo4xhtDQUMydOxdxcXEA+N7eoKAgJCYm4tlnn0VxcTECAwPx7bffYsqUKQCA69evIzw8HHv27MHIkSORmpqKzp074+jRo+jbty8AfjrF/v3749KlS2ZP1WipOsCM8TO8HT/O97bW/j1MyytBTlFl7fH6aO0rRcdgw9fVaoHz54E+fYCtWxs/rr2+IM4YP96YahATh6ZVAapSwL0RH2dWKQCxDBA07T9OUxMweHlH6CtEbJu0DRKRhCZqaAaTx84n4k6FiIHb+OERFjzGKo0KpdWlkEvNP5cUlQrI3GQQC5t+EbaF3NxcFBUVoVWrVvDw8HCq8EqaobycH/OrVgOmxjxXV/O1eYOCAE/Pxu2bMSArC6isNDnmV1tdDaZSGS3nxGIITLWlqorvnQ4PrzfMMMZQUVGBGzduwNfXFyEhIUbrOE0d4MuXLyM0NBTu7u7o27cvEhISEBUVhWvXriEvLw8jRozQr+vu7o7BgwcjOTkZzz77LFJSUqBSqQzWCQ0NRZcuXZCcnIyRI0fiyJEj8PHx0YdfAOjXrx98fHyQnJxcZwCuqqpCVVWV/vuSkhKLvF+O428yi4vjJ7moHTylbkJT4/UhdRMaLUtPB9q04fdnyfCrayeVXyMOTasCLiQAFdnA3csBScMljaAsAM7GAx5hwF2LGx2CFUVXTAaumvWBdXSzmenWj98xAYkP/0xT9TagrmNcsz6wjqWOsUqjQsKhBGSXZGP5sOUI8Gj4XCqoKED8b/EI8w7D4oGLHToE64YW3rhxw84tITZTVQUUFvI9ZaJ6op5azYdkP7+Gb15rxGswjabOAMwJa32yqlbzvYF+fnywMYOvr6/BkNmmsGsA7tu3L9avX48OHTogPz8f77zzDmJjY3HhwgXk5eUBAIKCggy2CQoKQkZGBgAgLy8Pbm5u8PPzM1pHt31eXh5atWpl9NqtWrXSr2PK8uXL9dMQWlpsLB8o4+L4gFkzgIb5eiCvWIlSpVpfuUUmESHM904lgub2zjpS5QlCmkxVyoffyjw+1DYUgnXhtzLvzvaN6TkGIPMMQZiM73Ewp7exZkALk4VA5mncW0EM2eMYl1aXIrskG3nleYj/Lb7BEKwLv3nlefrtG9NzbGscxyEkJAStWrWCykQoIS3M6dPAf/4DFBfzVRbq6yFjjB9+4OMDLFwI9OhhkddiWi0qL14EK68AOAAM4Dw9IO3c+c4QlNqv3amTWS8pFoshrB2im8ChpkIuLy9Hu3btsGjRIvTr1w8DBgzA9evXDbq4n376aWRlZWHv3r3YtGkTnnjiCYOeWgAYPnw42rVrh//9739ISEjAN998g7Q0w/Fh0dHRmD17Nl599VWTbTHVAxweHm7RqZDruxEuu6gCldUaSN2ECPP1gEBw+6SyUvi15msSYjU1Q600uO4QbO56ZlCpKlBantuoXkZF0RXIPEMgFlNJPXPY4xjXDLXBnsF1hmBz1yPELuq4yDOtFqqcHGgrlRBIJRC3bm0YRK0QLKz6mvUwdwiEQ40E9/T0RNeuXXH58mV913btXtobN27oe4WDg4NRXV2NwsLCetfJz883eq2bN28a9S7X5O7uDm9vb4OHpel6guVy/jzQ/SkiEHBoI/dEx2BvtJF72iT82rryBCEWIQngw6w0+E5PsLLAcB0Lhl8AEIs9Gv0Ru9y3HYXfRrDHMQ7wCMDyYcsR7Bms7wkuqDA8lyj8EodWTxCtOHUKVf9eger6dVT9ewUVp06BabX8ds29yNcRZjiBAG7h4ZB0iIZbeLhNwm9jOFQArqqqQmpqKkJCQtC2bVsEBwdj//79+uerq6tx8OBBxN4+WL169YJYLDZYJzc3F+fPn9ev079/fxQXF+P48eP6dY4dO4bi4mL9OvZUVwiuzZrDHmxdeYIQi6odgk+/AvyVCOy5/fX0KxYLv6Rlqx2CF+1fhE9PfYqEYwn49NSnWLR/EYVf4pjqucircnKgLS0DwACmBcCgLS2DKifnzvZWCsFGHCT8AnYeArFw4UKMHz8ebdq0wY0bN/DOO+/g4MGD+PvvvxEREYHExEQsX74ca9euRXR0NBISEpCUlIS0tDTIZDIAwHPPPYfdu3dj3bp1kMvlWLhwIW7duoWUlBT9GJHRo0fj+vXr+PzzzwEAzzzzDCIiIrBrl/lzxluqCkRdrFmRwZEqTxBiNcoCPuz+8xNQUQ4USQHfSsDDE+gwAejxPoVfYpaCigIs2r8Ie6/uhVKrRJBvEPKL8iERSDAqahRWDF9B4Zc4jgYu8sp/LkN1/frt8HsbJ4A4NBSSDtGG+2oB5aWcYghEdnY2Hn30UXTs2BETJ06Em5sbjh49iogIfuatRYsWYe7cuZgzZw569+6NnJwc7Nu3Tx9+AWDVqlV48MEHMXnyZAwYMAAeHh7YtWuXwQDpjRs3omvXrhgxYgRGjBiBbt264dtvv7X5+61PXX88WeJ80VWeaNOGv8Gy9p88tqo8QYhVSQIATSc+/Aq1gP/trxXl/HIKv8RMAR4B6BXeC0qtEmqNGjm3cqDWqKHUKtErvBeFX+JYGrjIC6QSk9NBC6QSo2XNvshbM8xYmEPdBOfIrN0DrFPzj6fISP5ctNT50tAY4NqVJ3pHyOlGuHooVRpsOJqBLEUFwuUemN4vgibOsLc9rwBnv+TDr84tT+Dup4Ex79uvXcTpJBxLwLfnv0XOrTsfE7f2b40ZXWZgcd/FdmwZAQCtUonCLVugysqGODwMflOn3pny2FU1MAZYW1oG3UVeIPOCR8+e1huXa80w0wCnqQNMDNUskXb+PP+HmKXOl7rKrwkEHHpHyKkKRCMoVRo8/FkyLuaWQMhx0DCGHadzaOpke/MO4Ic91ORbyS8npBF8xD7ILzK8gTq/KB8+Yh87tYjoaJVKpD/2GKpSLwFCIaDRoHjnTkRu2uTaIbiOizwnEMCjZ0/bVmSwZpixEIe6CY7wdOdNnz6WP19sXXmipdpwNAMXc0vAGKDWMjAGXMwtwYajGfZumutSFgDCS/yYX42A7/nVCABPL3557eoQhNShoKIAKVkpkAgkEAlFaO3fGiKhCBKBBClZKUbVIYhtFW7ZwodfxvhJFBhDVeolFG7ZYu+m2Z8jVWSwZpixAOoBdlCxsUD//tYZZ1vfRBw1UfitW5aiAkKOg7rGCCIhxyFLUVHPVsRqdKXOqgr4G940nYCSAr7nV3iJX27OZBnE5elKnd2suIlRUaPQK7wXilXF8BH7ICUrBTcrbpo1WQaxHlVWNt/zq1bfWSgU8suJY13krRlmmokCsAOz5vnS0O8Hhd/6hcs9oKk1fF7DGMLlVOvV5hqq81vz+RYYgpVqJSZtmwQA2DZpGyQiK38ErFECh/jXw8BtgLDlfOTcUJ3fgk53nqcQbD/i8DBAozFcqNHwywnPkS7yDhh+ARoC4dKc6GZNhzO9XwQ6h3iD4wCRgAPHAZ1DvDG9X4S9m+ZazJnkwpzJMojLM2eSC3MmyyDW5zd1KtxjOvHBSiQCOA7uMTHwmzrV3k1zLHSRrxdVgTCTrapA2IMdb9Z0alQFws6qFMCZOPMnuagdlrsnAu5y27XXSqgHuPkUlQrE7Y8ze5KL2mE5cXgi5FLnP5ecCVWBaAQXu8hTFQhiNie4WdMhScRCPDUwyt7NcF1iGeBx+yNPc4Y16HqCz8bz24ll9a9PXIbMTYYwb/5cMmdYg64nOP63eIR5h0HmRueSrQkkEvjPmmXvZjgHusibRD3AZmrJPcA6ycnAqlV8/WsX/70gzkKrAlSljevJrVLw4Vcgtl67bIh6gC1DpVGhtLq0UT25ikoFZG4yiIUt41wiLZyLXOTNzWsUgM3kCgEY4IcGOeh4dUKICUWlubhvTT9UqpVY2Gkspg9dCYnUz2qvpyzLxc09/aBUK3HMZyweud+6r0cIsSAXuMg7xVTIxPG08N8LQpyWUq00ehSV5uKJrcNxpVqBXG0FVt04gmmbB6GoNNdo3UbTKI0eyrJcPLttOK5WK3BdW4HVN49g9pZBUJblGq9PCHE8dJHXox5gM7lKDzAhxDGN3zzeaFl2/jlcqVYAqHlRY2jnJkdYUDeDdXc9uqtxL5hk/HpZN87harUCrMbrcWCIcpMjvJXh62FII1+PEEIsgHqACSGkhatUK1G7P4e7vdwa6upJblIPMyGE2BFVgSCEECewbdI2o2Ub9s7BqhtHkFWQAwAICwyDAMDcwH6YPmp1815woPHrHds7B6tvHkGCiH+9eE0YVIx/veiBzXw9QgixIeoBJoQQJyARSYwe04euRCeIADBwYBAA6Aw3/ka4Wus2mlBi9Hjk/pVoy0Tgbr+eigFRzA2P3L/SeH1CCHFgFIAJIcRJSaR+WDNpH9q5yREi8MDcwH5YP/UPq1Vl0L1elJscoTZ4PUIIsRYaAkEIIU5MIvXT3/A2fdRqq9cBlkj99De8RQ9cTb29hBCnRD3AhBBCCCHEpVAAJoQQQgghLoWGQBBiA0qVBhuOZiBLUYFwuQem94uARCy0d7MIIcRhaJVKFG7ZAlVWNsThYfCbOhUCCQ2xIdZBE2GYiSbCIE2lVGnw8GfJuJhbAiHHQcMYOod444fnYikEE0II+PCb/thjqEq9BAiFgEYD95hOiNy0iUIwaRSaCIMQB7HhaAYu5paAMUCtZWAMuJhbgg1HM+zdNEIIcQiFW7bw4ZcxQK0GGENV6iUUbtli76aRFoqGQBCn4MxDCLIUFRByHNQ1PmwRchyyFBV2bBUhhDgOVVY23/OrVt9ZKBTyy50EDeFwLhSAicMzNYRgx+kcpxlCEC73gKbWSCMNYwiXe9ipRYQQ4ljE4WGARmO4UKPhlzsBU0M4infupCEcDoyGQBCH5+xDCKb3i0DnEG9wHCAScOA4oHOIN6b3i7B30wghxCH4TZ0K95hO4P+jFAEcB/eYGPhNnWrvppmFhnA4H+oBJg7P2YcQSMRC/PBcrNMO4SCEEGsTSCSI3LTJaYcQtIQhHK6GAjBxeC1hCIFELMRTA6Ps3QxCCHFYAokE/rNm2bsZTeLsQzhcEQ2BIA6PhhAQQghxZM4+hMMVUR1gM1EdYPty5ioQhBBCWj6qAuEYzM1rFIDNRAGYEEIIIcSx0UQYhBBCCCGEmEABmBBCCCGEuBQKwIQQQgghxKVQGTTS4tANc4QQQiyBbmxruSgAkxbF2adNJoQQ4hhoeuOWjYZAkBbF2adNJoQQ4hhoeuOWjQIwaVF00ybX5EzTJhNCCHEM+umNa6LpjVsMCsCkRWkJ0yYTQgixP5reuGWjAExaFJo2mTgSpVqJ8ZvHY/zm8VCqlfZujnPQKIGk8fxDQ8eM2A9Nb9yy0U1wDowx/veOmE8iFuKH52KdtgoEVbCwAq0KUJUC7nLzt6lSAGIZIBBbr13EplQaFUqrSyGXmn8eKCoVkLnJIBbSedBUzlxFQSCRIHLTJqdtv0NxwEBDAdhBJScDq1YB8+YBsbH2bo1zkYiFeGpglL2b0WhUwcIKtCrgQgJQkQ3cvRyQBDS8jbIAOBsPeIQBdy2mENwCqDQqJBxKQHZJNpYPW44Aj4bPg4KKAsT/Fo8w7zAsHriYQnATtIQqCgKJBP6zZtm7Gc7NQQMNDYFwQMnJQFwccPw4/zU52d4tIrZAFSysQFXKh9/KPD7UKgvqX18Xfivz+O1UpbZpJ7Gq0upSZJdkI688D/G/xaOgov7zQBd+88rzkF2SjdJqOg+agqooEEcONBSAHYzuXFEogC5d+K8Ods4QK6EKFlbgLud7fqXBDYfgmuFXGsxv15hhE8RhyaVyLB+2HMGewQ2G4JrhN9gzGMuHLW/UsAlyB1VRcHEOHmgoADuQmudK27aAQMB/dbBzhlgJVbCwEklAwyHYVPg1Z7hEA5SVhcjOP4fLOcexYe8cKCsLm73Plk5ZWYisG+dw+bplj1mAR0CDIdhU+DVnuAQxjaoouDAnCDQcY7WuuMSkkpIS+Pj4oLi4GN7e3hbff+1zpWZHIGPAtWuAXA4kJlpvCI0DjlF3KabGAHcO8aYxwJZSM+S6BwCaTkBJAeAdAAgvAVUFTQ6/pio8KCsL8cTW4ThwKwMcgLCAMHSCCGsm7YNE6mewrkTkHOMhLcpEhQdlZSGe3TYcT4r5YT/x6jC0ZaaPGYRNO2Y1Q26gRyB6hfdCsaoYPmIfpGSl4GbFTQq/FmJqDLB7TAwiN210mjHALZK1L/Z2DjTm5jUKwGayZgCu71zRsfY546Bj1F0OVYGwMmUBcPoV4J+fgIpyoEgK+FYCHp5AhwlAj/eb1PM7fvN4o2XZ+edwpVoBoOYvNEM7NznCgroZrLvr0V2Nfk2nl2R8zLJunMPVagVYjWPGgSHKTY7wVobHDEOafswKKgqwaP8i7L26F0qtEkG+QcgvyodEIMGoqFFYMXwFhV8LceYqEC2StS/2DhBozM1rVAXCzsw5VwB+edu2/DkTF2fZc0bXhsxMy+/b0Tla4HTWChZOQ3K757diEyDUAv7l/PKKcn65BYY96FSqleAA1Oxh4G4vJ6bVVSvZ0jWUAzwC0Cu8F37890eoNWrk3MrhXwdK9ArvReHXghyxioLLhnJrX+wdIdA0AgVgO6rrXNFqGbKLKlBZrYHUTYgwXw8Ibk/qYOlzpvYY9fR01wnBVHbMRZUU8D2/uvAL8N+XNFAhoh7bJm0zWrZh7xysunEEWQV8uAoLDIMAwNzAfpg+anWTX6vFGGh8zI7tnYPVN48gQcQfs3hNGFSMP2bRAy17zIpVxQjyDdKHXwAI8g1CsarYoq9DHEtLKM3WJNa+2NcRaJhWC1VODrSVSgikEohbtwYnEDhECKab4OykvvB7MkOBy/llyCmqxOX8MpzMUECr5fuRdOeMJcaRO8EYdauismMuyjuAH/ZQk28lv7yJJCKJ0WP60JXoBBEABg4MAgCd4YbpQ1careuShBKjxyP3r0RbJgJ3+5ipGBDF3PDI/SuN128mH7EP8ovyDZblF+XDR+zT7H0Tx+WSpdmsfbGvJ/xWnDqFqn+vQHX9Oqr+vYKKU6fAtFp+O0sGmiagAGwH9X1KkF1UgVKlGgD/+wkApUo1sovulMKyxDlTVxvsfD7aFJUdc0HKAv6GNw9PQCMAbt3+6unFL2+oTnAjSKR+WDNpH9q5yREi8MDcwH5YP/UP45u5iJ7umEW5yRFqxWNWUFGAlKwUSAQSiIQitPZvDZFQBIlAgpSslAbrBBPn5XKl2ax9sa8n0KhycqAtLQPAAKYFwKAtLYMq586nLvYMHTQEwsYY48efZ2byn0LUHiJTWa0Bx90JvwC/TmW1YSkZjgMiI4Hz5/n99e9v/k2dDQ3TcYBPJmyCyo65GF0ViKoC/oY3U1UgzsZbrAQawAc63Q1v00etdt3e3kaQSP30N7xFD1xtkd7emnRVIG5W3MSoqFEmq0DE/xZPVSBaKJcqzWbti30DgUZbqYSpQKOtrDWmvzmBphmoB9jGOI6/+bJNG34ITu0aHFI3odEyxvjltZelp/P7mTfPcuG3Zjtbek/w9H4R6BziDY4DRLfHWHcO8cb0fhH2bhqxtNp1fnu8D9wbB4y5/bXH++ZNlkGcWu06vyuGr8DzPZ/H4r6L8XzP57Fi+AqzJssgzstv6lS4x3TiL3IiEcBxcI+Jgd/UqfZummXZ4mLfQKARSCXGIYcxfnmtZU0KNM1EAdgOYmP5P7Tkcv4Pr5rnR5ivB2QSvmNedw7IJCKE+d7plWxqBZH6xh1nKsqRlleCTEW5VcYbOyKJWIgfnovFa2NiMK1vG7w2JoZugGuJzJnkwpzJMohTM2eSC3MmyyDOTSCRIHLTJrSKWwS/KVPQKm5Ry6tLXM+Y3OqsLCj/uYzqrCzLjMWtJ9CIW7eGQOYFgAM4AQAOApkXxK1b39neVhMdmEB1gM1kjTrAja0CAVgn/J7MUKBUqdZ/UiGTiNA7Qt7s1yTE7qoUwJk482d4qx2Wuyc2azpkpVqJSdsmAeArRdAQCDNolMAh/phh4DaLDIFQVCoQtz/O7BneaoflxOGJNB0ycQ4N3JCmLS3TD0sQyLzg0bMnX5UBaN7FvrFVIJr7evUwN69RD7Ad1fWHk0DAoY3cEx2DvdFG7mm18AvY7qY7QuxCLAM8wsyf4a1mT7BHGL99M0hEEux6dBd2PbqLwq+5hBJ+koshuyw2/lfmJkOYd5jZM7zV7AkO8w6DzK155wEhNmHPG9LqCDScQAC38HBIOkTDLTzc6uG3MagH2EzOOhMcY8DkycDx4/wYdUGtP3nS8kqQU1RpdNNda18pOgYbvk+tlh+j3qcPsHUrTZtMnIRWBahKG9eTW6Xgw69AbL12EZtSaVQorS5tVE+uolIBmZsMYiGdB8TBNXCxV/5zGarr12+H39s4AcShoZB0iDbcV3Mu9k40Exz1ADuA+sYEA807V+x90x0hdicQN34Yg7ucwm8LIxaKGz2MQS6VU/glzsFRbkizZqCxMArADqKuc8YS54q9brojhBBCiI04yg1p1gw0FkRDIMxkzSEQNdX89CAykv9DzFLnii1vuiOEEEKIHTjKDWnWDDT1MDevUQA2k60CMHDnnMnM5D+FsOS5Ym5pQIDCL7ERGqNLnByNLyYOx1Eu9tYMNHWgAGxhtgzAAH/OrFrFD8Gx9LniAGPUnY5SpcGGoxnIUlQgXO6B6f0i7F4v2BHb1GhaFXAhAajINn8GNl2pMo8w4K7FFIKJXak0KiQcSkB2SbbZs8fpyqyFeYdh8cDFThmCtUolCrdsgSorG+LwMPhNnWrXWrqO1h6H4CgXe2sGGhMoAFuYrQMwwJ+X1rrZrL7fCwq/hpQqDR7+LBkXc0sg5DhoGEPnEG+7TprhiG1qEjvX6SWkuVyxxrBWqUT6Y4+hKvUSIBQCGg3cYzohctMmu4ROR2uPQ3GUi701A00tVAWiBbDmueIkY9QdwoajGbiYWwLGALWWgTHgYm4JNhzNoDY1l7vc/BnYTM3oRuGX2JlcKjd79jhTs9E5W/gFgMItW/iwyRigVgOMoSr1Egq3bKH2OBpHudg7YOkoCsAurPbvhVZL4deULEUFhLV+eYUchyxFRR1bWJ8jtqnJzJmG2JzpjAmxE3OmUDZnKmZnocrK5ntaaxIK+eXUHsdDF3uTRPZuALEv3e9FXBxf99pGY9SdSrjcA5paI4U0jCFc7lHHFtbniG1qFl0I1oXc068Amk5ASQHgHQAILwFVBRR+icPShWBdyF20fxF6hfdCsaoYPmIfpGSl4GbFTacPvwAgDg8DNBrDhRoNv5za45joYm+ExgCbyR5jgG3JxmPUnYojjrd1xDZZhLKAD7///ARUlANFUsC3EvDwBDpMAHq8T+GXOLSCigIs2r8Ie6/uhVKrRJBvEPKL8iERSDAqahRWDF/h1OEXqGvMbQwiN210oDHA9muPQ3OBi73TjQFevnw5OI7D3Llz9csYY1i6dClCQ0MhlUoxZMgQXLhwwWC7qqoqvPjiiwgICICnpyceeOABZGcbfuxRWFiIGTNmwMfHBz4+PpgxYwaKiops8K6cR2wsP+NhC/19aBaJWIgfnovFa2NiMK1vG7w2JsbuQdMR22QRkgC+57eiHBBqAf/bXyvK+eUUfuukVCsxfvN4jN88Hkq10vIvoFECSeP5h8YK+28hAjwC0Cu8F5RaJdQaNXJu5UCtUUOpVaJXeC+nD78AIJBIELlpE1rFLYLflCloFbfIrmHT0drj0Ohir+cQQyBOnDiBL774At26dTNYvmLFCnzwwQdYt24dOnTogHfeeQfDhw9HWloaZDIZAGDu3LnYtWsXtmzZAn9/fyxYsADjxo1DSkoKhLfHBD322GPIzs7G3r17AQDPPPMMZsyYgV27dtn2jTo4Bxyj7jAkYiGeGhhl72YYcMQ2WURJAd/z619+Z1mRlF9OiBMoVhUjyDcIObdy9MuCfINQrCq2Y6ssSyCRwH/WLHs3Q8/R2uPQ6GIPwAF6gMvKyjBt2jR8+eWX8PPz0y9njOHDDz/Ea6+9hokTJ6JLly745ptvUFFRgU2bNgEAiouLsWbNGqxcuRLDhg1Djx49sGHDBvz999/47bffAACpqanYu3cvvvrqK/Tv3x/9+/fHl19+id27dyMtLc0u75kQUg/vAH7YQ02+lfxyQpyAj9gH+UX5Bsvyi/LhI/axU4sIIbXZPQA///zzGDt2LIYNG2aw/Nq1a8jLy8OIESP0y9zd3TF48GAkJycDAFJSUqBSqQzWCQ0NRZcuXfTrHDlyBD4+Pujbt69+nX79+sHHx0e/jilVVVUoKSkxeBBCrExZwN/w5uEJaATArdtfPb345XWVSCPEQRRUFCAlKwUSgQQioQit/VtDJBRBIpAgJSulzhJphBDbsusQiC1btuDUqVM4ceKE0XN5eXkAgKCgIIPlQUFByMjI0K/j5uZm0HOsW0e3fV5eHlq1amW0/1atWunXMWX58uVYtmxZ494QIaTpdKXOqgr4G95MVYE4G09VIIjD0pU6u1lxE6OiRpmsAhH/W7zTV4EgpCWwWwDOysrCyy+/jH379kFSz0B1rtZYFcaY0bLaaq9jav2G9hMfH4/58+frvy8pKUF4eHi9r0sIaaKG6vzWfJ5CsEnKykJk559DpVqJDXvnYPrQlZBI/RresBH7v3njHJRqJY7tnYNH7rfs/p1dQ3V+CzrdeZ5CMCH2Z7chECkpKbhx4wZ69eoFkUgEkUiEgwcP4r///S9EIpG+57d2L+2NGzf0zwUHB6O6uhqFhYX1rpOfbzgWCwBu3rxp1Ltck7u7O7y9vQ0ehBArMGeSC3Mmy3ARSrXS6FFUmosntg7HlWoFcrUVWHXjCKZtHoSi0lyjdRukURo9lGW5eHbbcFytVuC6tgKrbx7B7C2DoCzLNV7fBZkzyYU5k2UQQmzHbnWAS0tL9UMZdJ544gl06tQJcXFxuOuuuxAaGop58+Zh0aJFAIDq6mq0atUKiYmJePbZZ1FcXIzAwEBs2LABkydPBgDk5uYiLCwMe/bswciRI5GamorOnTvj2LFj6NOnDwDg2LFj6NevHy5duoSOHTua1d6WXgeYELuoUgBn4syf4a12WO6e6HLTIY/fPN5oWXb+OVypVgCo+akWQzs3OcKCDKvr7Hq0geo3Scb7z7pxDlerFWA19s+BIcpNjvBWhvvHENeqrqOoVCBuf5zZM7zVDsuJwxOdcjpkQhyVuXnNbkMgZDIZunTpYrDM09MT/v7++uVz585FQkICoqOjER0djYSEBHh4eOCxxx4DAPj4+GD27NlYsGAB/P39IZfLsXDhQnTt2lV/U11MTAxGjRqFp59+Gp9//jkAvgzauHHjzA6/hBArEcsAj9uzNZkzrKHmjHEeYfz2BJVqJTgANXszuNvLLaGunmOr1Bt2MjI3GcK8+XPYnGENNWeMC/MOg8yNzmFC7MEh6gDXZdGiRaisrMScOXNQWFiIvn37Yt++ffoawACwatUqiEQiTJ48GZWVlRg6dCjWrVunrwEMABs3bsRLL72krxbxwAMP4JNPPrH5+yGNp1RpsOFoBrIUFQiXe2B6vwiHn+zBGdtsNwIxcNdiQFVqfk+uJIDv+RXL+O1dzLZJ24yWbdg7B6tuHEFWAV93NiwwDAIAcwP7Yfqo1Y17gYHG+z+2dw5W3zyCBBG//3hNGFSM33/0wEbuv4URC8VYPHAxSqtLze7JDfAIQOLwRMjcZBALXe8cbgytUonCLVugysqGODwMflOnOvwEF87YZldEUyGbiYZA2J4zTvfrjG0mzk9ZWYhpmwdhf0E6OADhgeHoDDesn/qHRW5UU1YWYvaWQXhGnA4AWKAORxSz3P4JMcX0FMedELlpk8MGSmdsc0vjdFMhE1LbhqMZuJhbAsYAtZaBMeBibgk2HM1oeGM7ccY2E+cnkfphzaR9aOcmR4jAA3MD+1k0nOr2H+UmR6gV9k+IKYVbtvBBkjFArQYYQ1XqJRRu2WLvptXJGdvsqhx6CARxbVmKCgg5DuoaH1IIOQ5Zigo7tqp+zthm0jJIpH76G96mj1oNiciyvU0SqZ/+hrfogasBIfVmEetSZWXzvahq9Z2FQiG/3EE5Y5tdFfUAE4cVLveAptYIHQ1jCJd72KlFDXPGNhNCiCMSh4cBGo3hQo2GX+6gnLHNrooCMHFY0/tFoHOINzgOEAk4cBzQOcQb0/tF2LtpdXLGNhNCiCPymzoV7jGdwP+HKgI4Du4xMfCbOtXeTauTM7bZVdEQCOKwJGIhfngu1qkqKjhjmwkhxBEJJBJEbtrkVBUVnLHNroqqQJiJqkAQZ0Vl2Qgh5qISXsTZOfxEGIQQ6zNVlm3H6Rwqy0YIMWKqhFfxzp1Uwou0SDQGmJAWjMqyEULMRSW8iCuhHmDSItDH/KZRWTZCiLmohFfdaGhIy0MB2IExxt9ISupHH/PXjcqyEULMRSW8TKOhIRbggIGGhkA4qORkYPJk/iupH33MXzcqy0YIMReV8DKNhoY0k4MGGuoBdkDJyUBcHJCZyX9NTARiY+3dKsdFH/PXjcqyEULMRSW8TKOhIc3gwIGGArCD0Z0rCgXQpQuQnu5w54zDoY/56ycRC/HUwCh7N8N5qCqBk18DhemAXyTQ+0lALLV3q0gTKdVKbE3biuyybIR5hWFyx8kWnya6JRFIJPCfNcvezXAoNDSkiRw80FAdYDPZog5wzXOlbVv+UyjGgGvXALncYc4Zh2NqDHDnEG8aA0waT1UJrBkB5J8HOCHANEBQF2D2PouFYKVaiUnbJgEAtk3aRmFMowQO8ccDA7cBQssdD6VaiZm/zMQlxSUIBUJotBp0knfC+tHr6bgTs5kaA+weE4PITRtdvne8TnYMNObmNRoD7CBMnSsA/7VtW355XJz1htA4859Buo/5XxsTg2l92+C1MTEUfknTnPyaD79MC2hV/Nf88/xy4nS2pm3FJcUlMDCotWowMFxSXMLWtK32bhpxIrqhIa3iFsFvyhS0ilvk/OHXmhd9ewcaM9EQCAdQ17mioztnrl2zzqcHycnAqlXAvHnO28PsjB/zU+k2B1SYfrvnV3tnGSfklxOnk12WDaFACLX2zthNoUCI7DIau2lPzlhSrEUNDbHmRd/egaYRqAfYzho6V3Ss9YeT7vWPH3eIP8hchm7Yxrt7UrHxWCbe3ZOKhz9LhlKlaXhjYj1+kfywh5qYhl9OnE6YVxg0WsOfp0arQZgXjd20F91wghuJK1D43Xe4kbgC6Y89Bq1Sae+muQZrXvTtHWgaiQKwHdV1rmi1DJmKcqTllSBTUQ6tlv+owtLnTO3x6Q7yqYRLoNJtDqr3k/yYX04ACMT81+Cu/HLidCZ3nIxO8k7gwEEkEIEDh07yTpjccbK9m+ayqKSYHVnzol9HoGFaLaqzsqD85zKqs7LAtLc/XXOAEEwB2E7qC78nMxS4nF+GnKJKXM4vw8kMhcVDcO3XFwjsfi66FF3ptpqodFs9tCqgStG4baoU/HaNIZbyN7yNeAfo/QT/9clfLVoFQllZiOz8c7iccxwb9s6BsrLQYvt2RsrKQmTdOIfL1y1/PCQiCdaPXo+FvRdiUodJWNh7YZNugFNpVFBUNu78U1QqoNI08vxzAfqSYjVRSTHrs+ZFv57wW3HqFKr+vQLV9euo+vcKKk6dcpgQTAHYDur7lCC7qAKlSn68mm6MeqlSjeyiO8GoueeMk4xPtxqlSoOvDl3Fkp/O46tDV+0y7IBKtzWCVgVcSADOxAHKAvO2URbw619IaFoI7v88MOZ9/msTw69SrTR6FJXm4omtw3GlWoFcbQVW3TiCaZsHoag012jdFkejNHooy3Lx7LbhuFqtwHVtBVbfPILZWwZBWZZrvH4TSUQSzLxrJhb3XYyZd81sUvhNOJSAuP1xKKgw7/wrqChA3P44JBxKoBBci6OVFNMqlbi1bh3y3n4Ht9ata5lDMax50a8n0KhycqAtLQPAbt9XwaAtLYMqJ+fO9nYMHlQGzUyWKoPGGD8hyvHj/CcQglp/gqTllSCnqNLgBk2OA1r7StEx2PB1tVrg/HmgTx9g61bzZhk0Z4hOSy695igl0xylHU6hSsGH2co8QBoM3L0ckATUvb6yADgbf2f97omAu9x27b1t/ObxRsuy88/hSrUCQM1fPIZ2bnKEBXUzWHfXo7us20BbSzI+Hlk3zuFqtQKsxvHgwBDlJkd4K8PjgSH2OR6KSgXi9schrzwPwZ7BWD5sOQI86j7/CioKEP9bvH79xOGJkEttf/45KkcqKWa6LZ1a1hTH1rzoNxBolP9chur69Vo3FQsgDg2FpEO04b6aEmjqQGXQHBTH8TdetmnD14Su/eeH1E1otIwxfnntZenp/H7mzbNc+NW1saX2BDvK2Fsq3dYI7nI+9EqD+VB7Nr7unuDa4ffu5XYJv3WpVCtR+9eOu73cFdXV0+1IPeByqRzLhy1HsGcw8srzEP9bfJ09wbXD7/Jhyyn81uJIJcVa/Hhka1/0Gwg0AqnEOOQwxi+vtazRgcYCqAfYTJaeCKOhMcClSrW+brRMIkLvCDkEgtvjaprwx1p9r5ddVIHKag2kbkKE+Xo063Uc3ZKfzmPjsUyotXdOe5GAw7S+bbBsQhc7tow0yFS4rdkT3NDztm6uiRC3Ye8crLpxBFkF/EeAYYFhEACYG9gP00etNli3xU3UYGIYw4a9c7D65hEkiPjjEa8Jg4qZPh6WnCCjKUyF25o9wQ09TxxP3tvvoPC77wynOBaJ4DdlCoLfeN1+DbOEesblqnJyoK1UQiCVQNy6NThdz21TL/oNjAHWlpbpJ8IQyLzg0bNn81+zHubmNQrAZrLGTHC2CqW2DtuO7KtDV/HunlSjISavjYlxujrCLqlmyHUPADSdgJICwDsAEF4CqgocIvzWRVlZiGmbB2F/QTo4AOGB4egMN6yf+gckUj97N8/mlJWFmL1lEJ4RpwMAFqjDEcUc93jUDLmBHoHoFd4Lxapi+Ih9kJKVgpsVNyn8OpFb69bhRuIK1L4gtIpb5Nw1f+0RSG0ZuBtAAdjCrDUVsrmfUACWDb8AkKkox+X8MqNtooO80Ebu2azXdVQ09rYFUBYAp18B/vkJqCgHiqSAbyXg4Ql0mAD0eN8hw69OUWku7lvTD5VqJRZ2GovpQ1c6ZNizFWVZLm7u6QelWoljPmPxyP2OfTwKKgqwaP8i7L26F0qtEkG+QcgvyodEIMGoqFFYMXwFhV8n4UjjkS2mnot+dVYWqv69AqBm7OPg3r4d3MLD7yyycAg2yYrBwty8RjPB2VlsLP+zj4vjzwVLjlFnjJ/sJTOTH59ee7+V1Rp9z68Ox/HLa+I4IDKSH5++ahXQv7/NhuhYnG7sLc3A5sQkt3t+KzYBQi3gX84vryjnlztw+AUAidRPf8Pb9FGrW95Qh0aSSP30N7xFD1xt96EODQnwCECv8F748d8fodaokXOLH76hhBK9wntR+HUiuvHIzjYrXZ0auOhrK5UwddHXVtYantTUi741A40V0E1wDkB3zsjl/Dlh6ia4ppwr9rzhzpHppk1eNqELnhoYReHXGZUU8D2/NRVJ+eWEWFmxqhhBvkEGy4J8g1CsKrZTi0hT6aY4Dn7jdfjPmuW84RdwjJvSrBVorIACsIOo65xp7rlS37kY5usBmYT/EEB3fsskIoT53qlF60DnKiF3eAfwwx5q8q3klxNiZT5iH+QX5Rssyy/Kh4/Yx04tIuS2ei764tatIZB5AeD4WS7BQSDzgrh16zvbW+Kib61AY2EUgB1I7XNGq7XMuVLXuSgQcOgdIUd0kBda+0oRHeTVom+AIy2EsoC/4c3DE9AIgFu3v3p68cvNnSyDkCYoqChASlYKJAIJREIRWvu3hkgogkQgQUpWitmTZRBiNXVc9DmBAB49e8K9fTuIQ0Ph3r6d9SoyWCvQWFCzboKrqqqCu7u7JdvjsKx1E5wpunHkmZn8JxCWOlccZHw6cUBKlcY5xkU7eRUI4tycuQqEVqlsOWNdiXkc4aJvrUBTD6tUgfj111+xefNmHDp0CJmZmdBqtfDw8EDPnj0xYsQIPPHEEwgNDbXIG3A0tgzAAH/OrFrFD7+x5Lni6jPBEWNOUxnDyeoAk5bFmesAu8SMZ8Q0R7joWyvQ1MGiAfjHH39EXFwciouLMWbMGPTp0wetW7eGVCqFQqHA+fPncejQIRw5cgSzZs3C22+/jcDAQIu+IXuzdQAG+HPSGjec1ff7QOH3DqfpFW0mp6iNbG64pRBMrMDccOuoIbjF1rutB/V41+AIF31rBRoTLBqA+/TpgzfeeANjx46FQFD3sOGcnBx89NFHCAoKwoIFC5rWcgdljwBsTaZ+Hyj83uE0vaIW4PCz41UpgDNx5ofa2iG4e6JDTYdMnIuiUoG4/XFmh9raIThxeKLdp0Nu0TOemUA93ia40EXf3Lxm1k1wx48fx/jx4+sNvwDQunVrrFixosWF35bICcan29WGoxm4mFvCTxGvZWAMuJhbgg1HM2zeFqVKg68OXcWSn87jq0NXoVRpGt6oEcLlHtDU+jtYwxjC5R51bGFjYhngEWZ+j64kgF9PGsxvJ5bZpp2kRZK5yRDmHWZ2j26ARwCWD1uOYM9ghHmHQeZm//NPHB4GaGr9v6HR8MstSKtU4ta6dch7+x3cWrcOWqXx9Ne2ULhlCx9+GeNDP2OoSr2Ewi1b7NIeh0AXfSM0EYYLq1mz+vx5m41PdwpZigoIOQ7qGsFQyHHIUlTYtB2meqJ3nM6xaE/09H4R2HE6x6i3e3q/CIvsv9kEYuCuxYCq1PyeXEkA3/MrlvHbE9JEYqEYiwcuRml1qdk9uQEeAUgcngiZmwxiof3PP7+pU1G8c6fRjGd+U6da7DVM9boW79xpl15XVVY234aaPd5CIb/cldFF30CjAzBjDN9//z3++OMP3LhxA1qt1uD57du3W6xxxPp0vw82HJ/uFBylV9SgJ/p2e3Q90ZYan+sUs+MJxI0fxkDDHoiFiIXiRg9jsPewh5psMeOZUa8roO91tfU4Y1v1eDsluujrNToAv/zyy/jiiy9w3333ISgoCJyzTwtGEBvr3NMbW4Oj9IraqidaNzuexWhVjeuxBfixvtRjS1o4lUbVqN5kgB+H3NzeZN2MZ9biSL2utujxdmp00QfQhAC8YcMGbN++HWPGjLFGe4iduPjvgRFH6RV1lJ7oRtGqgAsJQEW2+VUYdDeueYTxwx0oBJMWSKVRIeFQArJLss2uEKG7qS7MOwyLBy52iCEVpjhSr6sterydHl30Gx+AfXx8EBXlIKWRCLEii/eKNoGj9EQ3iqqUD7+VeXyobUzVBt32NHyBtECl1aXILslGXnke4n+Lb1RFCd32jjS0oiZH63W1do83cX6Nngnum2++wd69e/H1119DKpVaq10Op6WVQSPOwynrEVPdXkJMcvaawvWh2rvEEVhlJjgAqKiowMSJE3H48GFERkZCLDb8OObUqVNNa7GDowBMSCPRzG2EmOTMs8oR4uisFoAnT56MP/74A4888ojJm+CWLFnStBY7OArAhDRBzZDrHgBoOgElBYB3ACC8BFQVUPi1IKVaiUnbJgEAtk3aBonIAr1vGiVwiN8nBm4DhNSjZwk1Q26gRyB6hfdCsaoYPmIfpGSl4GbFTQq/hDSBuXmt0WOAf/75Z/z666+49957m9VAQurjlB/7E2O6SSlOvwL88xNQsQkokgK+lYCHJ9BhAoVf4pJ0E2Ys2r8Ie6/uxY///ogg3yDkF+VDIpBgVNQoCr9OjoaEOLZGB+Dw8HDqASVWZYvJH4gNSW73/FZsAoRawL+cX15Rzi+n8EtcVIBHAHqF98KP//4ItUaNnFs5AAAllOgV3ovCrxNzpIlBiGlmTYVc08qVK7Fo0SKkp6dboTmEONY0xOaw9lTFLUJJAd/zW1ORlF9OiAsrVhUjyDfIYFmQbxCKVcV2apHjcpSpls1B0zE7vkb3AE+fPh0VFRVo164dPDw8jG6CUygUFmsccU2OMg2xOai32kzeAfywh5p8K/nlhLgwH7EP8ovyDZblF+XDR+xjpxY5JmfrUXWkiUGIaY0OwKtWraLZ34hVOdPkD7aYqtjpKQv4G948PPlhD7oxwJ5e/HJlAQ2DsBBlZSGy88+hUq3Ehr1zMH3oSkikfs3e580b56BUK3Fs7xw8cn/z90l4BRUFSMlKgUQggRJKgzHAKVkpKOhUQMMgbnOkqZbN4UgTgxDTGh2AZ9VzolVWVtb5HCHmcqbJH5ypt9oudFUgqgr4G95MVYEwZ7IMYkCpNv7oV1lZiCe2DseVagU4AKtuHMEvmwdhzaR9RoHVZHUIjel9PrttOJ4U85/srb55BL9sMb1Pqg7ROLoqEDcrbmJU1CiTVSDMmSzDVThbj6qjTQxCjDU6AD///PP49NNPjZaXl5dj7NixSEpKskS7iAtzlGmIzeFMvdU215g6wBSCG0VX6qym7PxzuFKtAMCBAcgqyEEWGO5b0w9hQd0M1t316C7jnR4y3ufNG+fwpFgBBv5TvwRRDjgw3NzTD+GtDPeJISb2SUxqsA5wpzvPUwjmOVuPKk3H7PgafRPcvn378PrrrxssKy8vx6hRo6CpfXKSZmlcheaWRTcN8bIJXfDUwCiHDL8A31vdOcQbHAeIBBw4Dg7bW21T5kxyoSuRJg2+E4KVdFNcU1Wqlag9OI27vbypTPU017ecNMycSS50JdKCPYP1IbigwrV/N/ymToV7TCfw/9mKAI5z+B5V3XTMwW+8Dv9Zs1w7/DpgoGn0RBjXrl3Dvffei4ULF2LevHkoLS3FyJEjIRKJ8Msvv8DT09NabbUrW0+EkZwMrFoFzJsHxMZa/eVIM1DN4lqqFMCZOPNneKsdlrsnAu5y27XXCZkKoBv2zsGqG0eQVcCX0goLDIMAwNzAfpg+arXBuuYOgdiwdw5W3zyCBBG/z3hNGFTM9D5pCETDFJUKxO2PM3uGt9phOXF4IuRS1/3doLq6TsrGgcZqE2G0bdsWv/76K4YMGQKBQIAtW7bA3d0dP//8c4sNv7aWnAzExQGZmfzXxEQKwXVxhPCp660mt4llgMftjyXNGdag6wk+G89vJ5ZZv41OzlSAnT50JX7ZPAhZtwcsCAB0hht/I5w5M8KZCLCP3L8Sv2wZdHtQBaBiQBRzwyP3r6TA2wQyNxnCvPnfDXOGNeh6guN/i0eYdxhkbq79u6HrUbU3CuKN4MCBptE9wDpHjx7FsGHD0LdvX+zevRtSqbThjZyYrXqAdeeKQgFERgLp6YBc7lDnjMMwVYKsc4i3y5Ygc4Q/BvS0KkBV2rie3CoFH34F4obXJSYVlebivjX9UKlWYmGnsZapAlGWi5t7+vFVIHzGUhWIZlJpVCitLm1UT66iUgGZmwxiof1+Nyj08UyVY3OP6eSw5djsyk6Bxty8ZlYA7tGjh8nSZxkZGWjVqpVB+D116lQTm+zYbBGAa54rbdvyQ50YA65ds/45wxj/es7kq0NX8e6eVIOhRRwHvDYmxuV6ZG31x4BDhWxbU1UCJ78GCtMBv0ig95OA2LH+8Feqlfob5LZN2mZez29DNMo7N8gN3OaQPb9KtRJb07YiuywbYV5hmNxxsmXeu5Owdjil0HfHrXXrcCNxBWpfeFrFLXKI3ulGseaF346BxqJDIB588EFLtYvUwdS5AvBf27blzxlrfXrgrOONqQTZHbaoR+zSk36oKoE1I4D88wAnBJgGOLsFmL3P4UKwq1GqlZj5y0xcUlyCUCCERqvB7qu7sX70epcIwbaYIMLZavBak7OVY6uTNS/89gw0jWBWAF6yZIm12+HS6jpXdKx5zjjw8JwGUQmyO2zxx4BLT/px8ms+/DIt/wD4709+DfR/3r5tc3Fb07bikuISGBjUWj6UXFJcwta0rZh510w7t876bBFOW0zoswBnK8dmkjUv/PYMNI3U6DJo5mjisGKX1NC5oqM7ZxQKfv3kZMu+dpcult23LVAJsjts8ceALmTX5DI97oXpfM9vTZyQX07sKrssG0KB4c9GKBAiu8w1wpk+nNZk4XDaIkKfhThjOTYD1rzw2zPQNIFZATgmJgabNm1CdXV1vetdvnwZzz33HBITEy3SuJaurnNFq2XIVJQjLa8EmYpyaLV8sLHkOVP7tQUChzgfG0U3YcZrY2IwrW8bvDYmxjU+jjfBFn8MOFWPu6oSOPIpsOcV/quqmbNU+kXywx5qYhp+uQORiCTY9egu7Hp0l+U+/hdK+EkuhuxyyPG/YV5h0GgNfzYarQZhXs0LZ0q1EusvrEfCsQSsv7DeYWsf2yKcOn3osyDdBBet4hbBb8oUtIpbhMhNG51jLLQ1L/x1BBqm1aI6KwvKfy6jOisLTHv7EzQHCMFm3QT3+++/Iy4uDv/++y9GjBiB3r17IzQ0FBKJBIWFhbh48SL++usvXLx4ES+88AIWL15sk1q5tmTpm+DqC78nMxQoVar1Y8ZlEhF6R8ghENw+oZo5jry+P9JsddMdsTxr36DmNFU3TI3XDerSvPG6pvYZ3BV48lcaA2xnpsYAd5J3atYYYGvs01pM36AWY/FQRlUgnJw1L/z1hN+KU6egLS3T3wQnkHnBo2dPcAKBZV7bBItWgdBJTk7Gd999hz///BPp6emorKxEQEAAevTogZEjR2L69Onw9fVtduMdkSUDcH3nYaaiHJfzy4y2iQ7yQhv5nTrLTT1nzPmEgkKwdbSECgpO8R6OfArse/3OWF0A4ATAiHeaN17XSlUgrFK5wZFZoaqEpatArL+wHv85+R8w3Lk8cuCwsPdChxxX3BLCaUt4Dw7Lmhf+evZdnZWFqn+vAKgZMzm4t28Ht/Dw5r92HawyEUZsbCxiKQ01C2P8jZeZmfzwm9rnYWW1Rt/zq8Nx/PKaOI4vq3f+PL+//v0brmbS2OE5DjBG3WLsHdxaSgUFp5j0Qzde1yAAW2C8rlhKN7w5KIlIYtFgqhtXrLupDnDsccWOMkFEU9mikoW57WhxIdyaF/4GAo22UglTgUZbWWs4UVMCjQVY5SY4UjeO46uOtGnD14Su3f8udRMaLWOMX157WXo6v59585oefm0x3tjedOHz3T2p2HgsE+/uScXDnyVDqdI0vLGFGFRQ0DIwdqeCArEwJxmvSxyXtcYVE9OMKlkwpq9kYSu6EH4jcQUKv/sONxJXIP2xx6BVOubYb7NYe1xuA4FGIJUYhxzG+OW1ljUq0FgIBWA7iI3l/7iSy/k/tmqeH2G+HpBJ+I553Tkgk4gQ5nvnRqPGflrQ0Hjjy/llyCmqxOX8MpzMULS4EOwI4dOlKyjYWu8n+TG/nICfVY4T8ON1ez9p75YRJzG542R0kncCBw4igQgcOHSSd8LkjpPt3bQWyRaVLBriCCHcohoYl1v17xWorl9H1b9XUHHqVNNDcD2BRty6NQQyLwAc//8wOAhkXhC3bn1nezuOuaQAbCd1nTMCAYfeEXJEB3mhta8U0UFezboBrr5PP7KLKlCqVOv3CwClSjWyi+6EspYQgh0hfDpVBQVnJ5byN7yNeAfo/QT/lW5WI40gEUmwfvR6LOy9EJM6TMLC3gsd8ga4lsIRyqw5Qgi3mHou/KqcHP6mNLDbw8QYtKVlUOXk3NneQiGYEwjg0bMn3Nu3gzg0FO7t21n9BrjGoABsR/WF4DZyT3QM9kYbuWeTw2/N4TmRkXWPN66pvvHGmZn8/pytzLMjhE+qWWxjuvG6Y97nvzpw+FVWFiI7/xwu5xzHhr1zoKwstHeTrEpZWYisG+dw+bpjv1/duOLFfRdj5l0zKfxakSOUWXOEEG4RDVz49eNya6pvXK65F/56QrBbeDgkHaLhFh7uMOEXsHMA/uyzz9CtWzd4e3vD29sb/fv3xy+//KJ/njGGpUuXIjQ0FFKpFEOGDMGFCxcM9lFVVYUXX3wRAQEB8PT0xAMPPIDsbMO/2AoLCzFjxgz4+PjAx8cHM2bMQFFRkS3eYoPqGw5RU1POFXuNN3Y0jhA+qWaxCVoVUKVo3DZVCn47J6RUK40eRaW5eGLrcFypViBXW4FVN45g2uZBKCrNNVrX6WiURg9lWS6e3TYcV6sVuK6twOqbRzB7yyAoy3KN13dSKo0KisrGndeKSgVUGuc8ry3BEWrrOkIItwh7jsu1ZqCxgkaVQdO5cuUK1q5diytXruCjjz5Cq1atsHfvXoSHh+Ouu+4yez+7du2CUChE+/btAQDffPMN3n//fZw+fRp33XUXEhMT8e6772LdunXo0KED3nnnHfz5559IS0uDTCYDADz33HPYtWsX1q1bB39/fyxYsAAKhQIpKSkQ3v44Y/To0cjOzsYXX3wBAHjmmWcQGRmJXbt2md1WS9cBrs0OJfpsUnPYUdi7CgSpRasCLiQAFdnA3csBSUDD2ygLgLPxgEcYcNdifnyvExm/ebzRsuz8c7hSrQBQ8+LC0M5NjrCgbgbr7nrU/P+vHEKS8fvNunEOV6sVYDXeLweGKDc5wlsZvl8McbL3Cz78JhxKQHZJNpYPW44Aj4bP64KKAsT/Fo8w7zAsHrgYYqFzndctSYuqAmHP2rx2nmzAKnWAAeDgwYMYPXo0BgwYgD///BOpqamIiorCihUrcPz4cXz//ffNarhcLsf777+PJ598EqGhoZg7dy7i4uIA8L29QUFBSExMxLPPPovi4mIEBgbi22+/xZQpUwAA169fR3h4OPbs2YORI0ciNTUVnTt3xtGjR9G3b18AwNGjR9G/f39cunQJHTt2NKtd1g7AgOlzxlLnSn0hOLuoApXVGkjdhAjz9Whx4Zc4oCoFcCYOqMwDpMENh2Bd+NWt3z0RcJfbrr0WYCoAX845jlxthVEgDBF4ILp1H4N1W0IAvnz9OK6beL+hAg9Ehxq+X2cMwIpKBeL2xyGvPA/BnsENhmBd+NWtnzg8EXKpc53XxIHVE4JVOTnQViohkEogbt3a8kMTrBloGmC1ANy/f39MmjQJ8+fPh0wmw9mzZxEVFYUTJ07gwQcfRE7NgdSNoNFosG3bNjz++OM4ffo0JBIJ2rVrh1OnTqFHjx769SZMmABfX1988803+P333zF06FAoFAr4+fnp17n77rvx4IMPYtmyZfj6668xf/58oyEPvr6+WLVqFZ544gmT7amqqkJVVZX++5KSEoSHh1s1AAOG50xkJP8JhKXOFXPLAQIUfokN1A61dYVgc9dzcKaGMWzYOwerbhxBVgH//2ZYYBgEAOYG9sP0UasN1nW6MagmhjFs2DsHq28eQYKIf7/xmjComOn364jTLpujdqitKwSbux4hzWLPC781A009zA3AjR4D/Pfff+Ohhx4yWh4YGIhbt241dnf4+++/4eXlBXd3d/zf//0fduzYgc6dOyMvLw8AEBQUZLB+UFCQ/rm8vDy4ubkZhF9T67Rq1crodVu1aqVfx5Tly5frxwz7+PggvOasJVZUcwjN+fOWPVecbHgOaekkAXyYlQbz4fZsPB92a2oh4RfgA2ztx/ShK9EJIgAMHBgEADrDDdOHrjRa1+kIJUaPR+5fibZMBO72+1UxIIq54ZH7Vxqv76QCPAKwfNhyBHsGI688D/G/xaOgwvC8pvBLbMaeF35rBhoLaHQA9vX1RW5urtHy06dPo3XN2m5m6tixI86cOYOjR4/iueeew+OPP46LFy/qn+dq/bXCGDNaVlvtdUyt39B+4uPjUVxcrH9kZWWZ+5aaTXfO9Olj+XOlod8FCr/EpmqH4NOvAH8lAntufz39SosIv3WRSP2wZtI+tHOTI0TggbmB/bB+6h+QSP0a3tgJ6d5vlJscoS34/dYOwYv2L8Knpz5FwrEEfHrqUyzav4jCL7Ede174rRlomqlRUyEDwGOPPYa4uDhs27YNHMdBq9Xi8OHDWLhwIWbObPxUlG5ubvqb4Hr37o0TJ07go48+0o/7zcvLQ0hIiH79Gzdu6HuFg4ODUV1djcLCQoNe4Bs3buinbA4ODkZ+fr7R6968edOod7kmd3d3uLu7N/r9WEpsrPVmA9Sdj3Fx/Dlv4+E5Do1ulrMDXQg+/Qrwz09AxSagSAr4VgIenkCHCS0y/OpIpH76G96mj1rtnL29jSCR+ulveIseuNqpe3vrowvBi/Yvwt6re/Hjvz8iyDcI+UX5kAgkGBU1isKvjbSom9uayp4XfmsGmmZodA/wu+++izZt2qB169YoKytD586dMWjQIMTGxuL1119vdoMYY6iqqkLbtm0RHByM/fv365+rrq7GwYMH9eG2V69eEIvFBuvk5ubi/Pnz+nX69++P4uJiHD9+XL/OsWPHUFxcrF/HUVnzXKn9B6FWS+HXEaZMtjalSoOvDl3Fkp/O46tDV5v13lQqfmhXYygU/HZGJAGAphNQUQ4ItYD/7a8V5fzyFhp+ScsW4BGAXuG9oNQqodaokXMrB2qNGkqtEr3CexmHX4v+UplHq1Ti1rp1yHv7Hdxat865p/41oUVOcdxU9rzwO1j4BZrQAywWi7Fx40a89dZbOH36NLRaLXr06IHo6OhGv/jixYsxevRohIeHo7S0FFu2bEFSUhL27t0LjuMwd+5cJCQkIDo6GtHR0UhISICHhwcee+wxAICPjw9mz56NBQsWwN/fH3K5HAsXLkTXrl0xbNgwAEBMTAxGjRqFp59+Gp9//jkAvgzauHHjzK4A0VLV/IPw/Hm+3J+rhl+g1pTJtz8i0k2Z/NTAKDu3rvl0Af9ibgmEHAcNY9hxOqdJ9YhVKiAhAcjOBpYvBwLMyKcFBUB8PBAWBixeDIhrV3sqKeB7fv3L7ywrkvLLCXFSxapiBPkGIefWnRvEg3yDUKwqNlzRKr9U9dOFw6rUS/wsaBoNinfuROSmTS2mh9RoimNAP8Wx/6xZ9m2cPdCFX6/RAVinXbt2aNeuXbNePD8/HzNmzEBubi58fHzQrVs37N27F8OHDwcALFq0CJWVlZgzZw4KCwvRt29f7Nu3T18DGABWrVoFkUiEyZMno7KyEkOHDsW6dev0NYABYOPGjXjppZcwYsQIAMADDzyATz75pFltbyl0vwurVvG1rl3wd0BPN2Wyusb4KFtPmWxNlgz4paX8dTovj7/+NnS91l2ndfedlpbynQ4GvAP4YQ81+VbyywlxUj5iH+QXGQ7Dyy/Kh4/Yx3BFq/xS1c8VwqF+iuPb7w+A805xbCl04QdgZgCeP3++2Tv84IMPzF53zZo19T7PcRyWLl2KpUuX1rmORCLBxx9/jI8//rjOdeRyOTZs2GB2u1yNgw7PsTlHmDIZsN44ZEsGfLmcvz7rrr/1Xa9rXqeDg/n1jK7TygJAeIkf81tRfmcMsKcXv1xZ0GKHQUhEEuer8dscQolT1vhtioKKAqRkpUAikEAJpcEY4JSsFBR0KrgzDMLiv1QNs0U4tPf42xYzxbGl0YXfvAB8+vRpg+9TUlKg0Wj0Qwj++ecfCIVC9OrVy/ItJDbhwr8DetP7RWDH6RyDIQK2njLZksMUarN0wA8IaPh6beo6bXQ915U6qyrgb3jTdOKHPXgH8OG36vbzLfhGONLy6Eqd3ay4iVFRo9ArvBeKVcXwEfsgJSsFNytuIv63eMMb4Sz2S2Uea4dDRxhi4Td1Kop37jRog1NOcWwNLn7hb/REGB988AGSkpLwzTff6CsvFBYW4oknnsDAgQOxYMECqzTU3mwxExyxP3tXgfjq0FW8uyfVoEoNxwGvjYlp9jhkU+G6c4h3s8N1zetxYCstuj6YiSJtGXwFXvj7xza4eUPQcPitq9RZC6oDTFxHQ3V+G6wDXOOXigUGorBHD1QXFcPN1wd+p0+Du3mz2eEXMB1Q3WNiELlpo0UC6q1163AjcQVq/4fWKm6RTYdY2LsXmtiW1WaCa926Nfbt24e77rrLYPn58+cxYsQIXL9+vWktdnAUgIktLPnpPDYey4Rae+fXUiTgMK1vGyyb8P/svXt8k/Xd//9M2rRp2tI2TWmAAAVFyknlcHNwN25T4UYZk01Bp8xN3OZXd7ufbFAMiE4QalHHve2W3dutjjHPTEVxwnQn524RJuIBVAQ5taVpm6YpbZOrTZr8/riaNKfmeF1J2ub5ePRRevU6hs/VvPK+Xp/Xe2rC+5dL4JvNULXWxR8PtGLL7qRk9ilaD45D48xn8ZwSttYoYxe/sa6XIUMaIFknOLMZd1UVtr176bYLWMp0aJvN5OSp0Vx9NYqtWxMSvx7kFIemTQ/S+vzz/haL7GxKbrgB/YbEU6MyZAhFtHot5klw58+fp7GxMUgANzU10d7eHvuZZsjgQ6orsKlGbh+yWpUlS6KFTgfTlp5l1yElPR25mP9aCYCtoJNpS9vR6Sr8N+iyRC9qPTnBnvU/NMKlNZAbu+cxQwY5sdgtUXd48+QEe9Y3/tlIzYIatHm941qno3X6dBQvvUy208Hw3gZU3Xbomj4drQTiF0CpVstWjc34b0UyFej0JOYc4G984xvceuut/OEPf6Curo66ujr+8Ic/cNttt/HNb35TjnPMMEQYCjm8kVgxdyyTRwxDoRArvwoFSfchx4vV1UHJ7FN+y0pmn8Lq6gheWVUIGkP0FV3fjnEag7h9hgxpRmFOIYZhhqg7vPl2jDMMM1CY4z+uu61tWMr892Ep09FtDYhQS1NKbryR3EmVoo8rOxsUiiHnv83kEKcvMVeA/+d//ofVq1ezYsUKHL3h29nZ2dx22208/PDDkp9ghqHDYM/hjQa1KosX77gs/avgLgc42v2qsMXKAloP+j9uaj04juIlLvGHLosoXJUq8WvKuqB9hEWtEyu/nn1kyJBmqLJUrJu/jvbu9r5KbgR0Gh01C2oozClElSWOa0ePg/budnKKi8ht9s/B1jabcRcXBe3HYrf47SMdUKrVVDzzzJCufg6FqLmBSswCWKPRsH37dh5++GG++OIL3G43F154Ifn5+XKcX4YhxGDP4Y0WuWwKkuFywNEtYKvzVm/NZvh49xg0zlZsBf4e4I93l9Ay00xprVGs3k5Z1yeCY7UxZGwPGdIcVZYqavHrwXd9R4+DLW9vwVp3gi3/6sGVp6bbjr8H+PBh0Xjfa4Pw+IkNwwysm78u7UTwUBZ6mRzi9CXuRhj5+flcfPHFUp5LhgDc7qGVUpIuObzRMKS9yo52Ufz2+nFbRldjvF9Hc5OSxXNKmLa0HaurlOIlLj7eXUKX1cLRZ4zMvdhEjmf7jJDNkCEk7d3tWOtOsOjJt/i8Ay5a8FXc/zaPfGsb7uIiNJ4UiN6INLMGr4/Ys32sAnygMhC8tRkfdC9pKGhiToH46le/iiLMRfz1r39N+KTSkWSnQLzzztBr0iJXTJfUDJTzlJXeZIbuNhPvfqTn1/ur0Wh1QalMLefMHH3GiNptQlDomXJTNaUjMwkOGTL0i9mMsGYVx46+hakA9q38Muu/ua3PT+wTkSboijFeCSeyrFH7jgcLoSPcKtOujbPcUXMDgiQLGtli0FatWuX3s8Ph4IMPPuDIkSN85zvf4ec//3l8Z5zmJFMAv/OO2Kb77Nmh16Z7IFRW5czqHUhEFLdRiuQMGTL0Eq24jSSShwDpkjEcDQOhUi0bKRA0ssWgbdu2LeTyn/70p3R0hJjtnSEmPGPFYoGpU+H0afHnoSKC097/SsarDOL4vOd+HTZLNbfP67U3nFkDJ4O7uOUUieJYc0znbW5VUxNX59YMUSI4BZbtWgbArmW7UGfH+WbbI8Db4n6Yv0tsY5xBHiwWvw5v6upq1vvYG6rerPLrJnfsih4WnwF9B1T/BdTXKCH93GKyMZC8tUPWB53mgiZuD3AgK1asYPbs2TzyyCNS7XLI4TtWxo0Tq4rjxsGpU/KOmTS05kQklZXigeRVlovCQjAYoA4dU26qFsXv56+A7Rmw5kGxHTT5YmvjS6opVeu8HV4NBnH7DBky+OC5qcDb4U0HVF9VTdWbVew7uY/dJ3ZTXlxOo7URtVINt36FrX/NQl1x4ZC7qdLBWzsoKrtyCYBUCZoYkEwA79+/H/VA+49PI0KNFZB/zAxEr3EoD+7Lh+uT5sFdMXcsLx+uD/IAD4SsXqlQqWDdOmhvB61WJ1Z+bc9AlgtKO8WVbJ3QU+nN+NXpxPFbWChunyFDBh/8byrvYp1Gx8zRM9l9YjfOHif1LfUACAhMnPIl1Iu/NSRvqpIbb6Tt1VeDvLXJyhgO5e1te/XVtPMgh0UuAZAqQRMjMQvgwGYXbrebhoYG3nvvPTZs2CDZiQ0l+hsrHuQaM77WnDQYi1GT6rzgAZPVKzMqlc/79HmzWPn1iF8Qfz4fkGGasT1kyNA/fjdVH22ONsqLy73iF6C8uJw2R9uQvalSnTE84PN95RIAqRI0cRCzAB42bJhfCoRSqWTixIls3LiRhQsXSnpyQ4FIY8WD1GMmza05YUkHD+5A8ConlWE60fbgS7FdXJ5uOOzw3pPQehpKKmDWSlDlpfqsMqQAwSnwwrEXqOuow1BgYPnE5fH7pWWkSFVEo7XRb1mjtZEiVXBDjKFEKr21A8mDHIRcAiBVgiZOYhbAO3bskOE0hib9jRWXy02d1Ya9u4e8nCwMxRqUvW1xpRgzA8CaE5aMBzfN0jIEszjhTZMv2h48HuD8AnG5YI7c6jhZOOzwxEJoPAKKLHD3wIfPwW1vxC+C01BQC/ZW6ho/wu4UeGrfnay48lHUeSVx7ae56SMEp8CBfXdy/RXx7UdKpBKtglPglr238JnlM7KUWfS4enjt5GvsvHpnWolgs83ModpDqJVqBAQ/D/Ch2kOYK80pS38YFB7YOEkHD3JcyCUA+hE0bpcLR309LruAMk+NatQoFEplWgiPmGPQxo8fz7/+9S9KS0v9llutVmbMmMHJkyclPcF0QeoYtHDi970zFtoFJwqF+HSlUJ3NrLFalMreAeUWx4xWG/uYCfcBLZH9JpOhnsMr9/XHJK57o86wmyBXJ3p+A1IgyNN7O8alnP2PwRv3gtvVt0yhhIUPwrwfxr6/UIK6fGpigjoGBKcQvMzeyq0vLOAvLWdQAAadgUqyeWLZG0Hi1Sv0ekLv5/ZdC1ipOgOA0WlgnDv0fpKVDhFKtFZqK+MSrTuP7uSR9x7BTd9boAIFq2et5pYpt0h96nHh6fBm6jRRpinzS4E4VHuIZltz2PxfOQXqQMnhlYsBme8rlwAII35t77+Pq70Dj6BRFhagmTFDFMGJHrcfZMsBViqVmEwmhg8f7re8sbGRMWPG0NXVFd8ZpzlSCuBwY/CspZPjjcFxchPKCxij7Ws3Hc+YiebpxEASwWlTAU0ycuYQxySufcVvKJEb6fep4PU18N5vxXbOHpQqmHUrXPNw7PuTWlDHyJJnlwQtq2v8iC+6LYDvDe7mghwthnL/7p17vrVH/Mffg/dT2/QRJ7stuH32o8DN+Bwto4cHdAH9yp54LyEmpBStWw5sYdfnu3C6+h5hZyuzWXbRMtbNWSfZOceLr/gNJXIj/V5ugTqQcnjlYkBVwOUSAGH2211bS9eJLwBfmakg98ILyBk9OrHjhkHyHOBXX33V++8//elPFBX1eY96enr4y1/+QkVFRXxnO4Rwu8VJl2fPitabwDFo7+7xVn49KBTicl8UCqiogCNHxP3Nmxc+yWSAWXMiMpQ9uHJ6oKOeYBiNuFXrxOWe9T40pl4El1SIVVpf3D3i8nhoPd1b+fUVwFni8hRhdwooCHzLEZfHQqjqcrjlyaCuo44sZZafaM1SZlHXEbvv0lBgoMflPxZ6XD0YClL/CDuSuAUxHaL6qmrvesY/G/3Wk3uS1oD2wErEgMn3lUsARBA0LrtAKEHjsgf8DYlV0EhE1AJ46dKlACgUCr7zne/4/U6lUlFRUcGjjz4q6ckNRhQKMXFk7VrRdx44FvNysgisybvd4vLAZadPi41VVq2KT/zK7TXOIA9yeqCjEtddlugru6FE8KU1kJuimeuzVoqeX1/Lgn6auDwepBbUMbJr2a6gZU/tu5NtTfupNYuJAYYyA0rg7rK5rFi0PfSO5gfv58C+O9nevJ8t2eJ+jD0GHG5xPxPm97MfmZFStC6fuJzXTr4WZKdYPnG5VKcbFxa7JaL49RBKBNcsqEGbp5VdoA5YD+xQQ05vbgRBo8xTE0rQKPPUQcuiFjQSoox2RZfLhcvlYsyYMTQ1NXl/drlcdHV1cezYMb72ta/Jea6Dhssu6+uEdeqU//gwFGsoVIufSzxjoFCdjaG4T9zE8rQgktf4eGMH9VY7xxs7eO+MBZfL7T32uHHidmvXivsZiAiOHh5/+yT3v3KEx98+ieDoibxRmh97xdyxTB4xDIUCsns/sEiVQxyVuFYVgsYQla3B4QCLrVcE5+nF7VThA/stFnE7WVDlif7chQ+KtoeFD8LKP8Xv1521UvT8KpSilUKhTExQx4g6Wx30teLKR6kkG3CjwI0SmEyOOBEuYF0vWeqgr+uveJRx7mwUvftxuGG8O4frr3g0eP0ksXziciq1lShQkK3MRoEibtGqzlaz8+qdrJ61mmUXLWP1rNXyT4BzOMQBHobCnEIMwwx94ldQhr0hPCJYn6/HMMxAYY54f8ktUEtuvJHcSZXim0V2NigUkuXwugSBlh07MG16kJYdO3AJyX3qkOrjS0YEb27XiS9wnDtH14kvsL3/Pm5X75OsWARAGEGjGjUKZWEBoBD/NqJAWViAatSovu1T6LuM2QM8VJF6EhzEXpkFacQvyOs1ThdSOVkurSaqyXHeLgc42sNWch0O2LIF6up6G1sVWkTxq+w/sN9s7usWt27dAMn2T8MUCGt7A199Yi52p8DqysXxp0B0NND8+lwxBaJo8aBKgUg6QTdEmA+OPQ7au9vRdrqiviEsdguFOYWossR1kjFJSw4PbKon16X6+JKRbG9urJXmWPcfA5JOgvvFL37BD37wA9RqNb/4xS/CrvujH/0o9rMdAMghgCF6aw7ENlbcbli+HA4eFK05yoBa/zHTeeqt9iCv8ajiPCbq/a/P5RKtObNnwwsvDJy2yXJOFkvnYyeKVOLaUzwwmUCvj/ie7xW/nvU9RQUvaSg00xXBKbBs1zJAtEnELRB7BHhb3A/zdyW12juQiEqUS35DRGZATdLqJdWT61J9fEmIIACEz4/jOHcuaPKuauRI1BdN8N9XLAJALkETI5JOgtu2bRs333wzarWabdu29bueQqEYtAJYLjxPD9auFceCVJMzU+E1TjdS2TAjHZp1xItUEwy1WvE93vMebjT2/54f+F5fXR1C/Eqd35uGSCZc04lBLqKjzhOW9IaIjgEzScuHVE+uS/XxJSFV3ly5BI1MROUBPnXqlDf399SpU/1+DdYMYLkJ5wmG+MdKMr3G6UgqG2ZkmnWI6HTie7de3/eeb/bvjhzyvT5IE7z3pCh+3S7RfuF2iT+/92TSriVDhlC8cOwFPrN8hhs3TpcTN24+s3zGC8deCF5Zshti8JLqyXWpPr5kpMqbK5egkYGoJ8F52LhxIzZbcBXLbrezceNGSU5qKNLfmEl0rPS3X6VSwayxWiaUFzCqOI8J5QWSNdtIF+ScLJbOx043At/zq9a62LbnNPe/coRte05TtdYV+b3eEzfmS4rjxjJkgL5oNl/CRrMF3BDuqiosv/wlpk0PYvnlL3FXVQ1Z8QvyTq4bCMeXlH4EgEKpRDNjBrkXXoBq5EhyL7xA2uYUcgkaiYl5ElxWVhYNDQ1BjTBaWloYPnw4PYGfnAYJcnmAA/G10FRUiE8fpBgraWLNSTqpbJgxlJt1hMJsFsXvHw+0YsvupGT2KVoPjkPjzGfxnBK21ij7f69PccOJZJGxQAw84m7OYTbjrqrCtncv3XYBS5kObbOZnDw1mquvRrF165ATvx5S7V1O9fElJ1UCQC5BEwHJG2F4cLvdKEK8eB9++CHaODxKGfzxtdAcOSJab6QYKwPMmiMZqWyYMZSbdYRCp4NpS8+y65CSno5czH+tBMBW0Mm0pe3odBX9byx1fm+GDBIRd56wTkfr9OkoXnqZbKeD4Q0NAHTboWv6dLRDVPxC6r3LqT6+5KRKAMglaCQiagtESUkJWq0WhULBRRddhFar9X4VFRWxYMECli9PbYD4YMEzZmbPlnasDCBrToZBitXVQcnsU37LSmafwuoKjuTzQ+r83jRFsLdS1/gRx+sP8tS+OxHsrak+pYQR7K3UNn3E8XOD55p8SSRPuNvahqXMX+haynR0W9vkOt0MQ5VUCQC5BI0ERG2B+N3vfofb7WblypX813/9l18r5JycHCoqKpg3b55sJ5pqkmWB8MXtlid1IdTTkKEsfjNWBRnoJyd4257T3LdBrAB7yCroYuMmF6sWDouYEzxYCNVOWLC3cusLC/hLyxkUgEFnoJJsnlj2RlD2blpaI3pCX9PtuxawUnUGAKPTwDh36GsabNaIcHhyfnn8aRQb7iPb2dfowpmtwr1pI9q77vLbJjDnN0PsDDprQzykSgDIJWhCIGkOsC9vvfUWl112GaoBkVAvHakQwHKSImtO2pHKZhmDFpcDjm4BW51fp7hwHuAb/r2Hrd9aj1prgCnrBr0IXvLskqBldY0f8UW3BfB9k3BzQY4WQ/nFfuvu+dYeeU8wHv4efE21TR9xstuC2+eaFLgZn6Nl9HD/a+IraXhNMuDocbDl7S1Y606w5Y0eXG/+LaIH2GwzY/yzEcMwA+vmr8uI4DgYNA0upGCQCwBJPcDnz5/3/nv69OnY7XbsdnvIdQeDOBwKpLk1J2k89e4ZPmk4j9uNN7P3k4bzPPXumYx/N14c7aL4tZvgQyNcUo25Q4fRCM1NShbPKWHa0nasrlKKl7g49cceFo9cz7EPTUy8BNQROswNVuxOAQWBvZnE5QOVUJXucMuHAu3d7VjrTrDoybf4vAMuWvBV3P82j3xrG+7iIjSHD6NobvbmBJs1YPyzEVOnybu9Nm/o3R+J0vrcc6L4dbu9Gb9dn35G63PPDS6/bzRkBAAQpQAuLi4OOfHNF8/kuMGaAjEY8dwD27aJGddDbOwDA7thRSSksnY4HNDeHkMOf66W1rHVFJ0yorSbEA4Y2fx8NSaTrjfZSdk34U0wIwwzcuxDEyarnh3PV7N+ihZdbtgjDHh2LdsVtOypfXeyrWk/teZ6AAxlBpTA3WVzWbFoe5LPMA7mB1/TgX13sr15P1uyxWsy9hhwuMVrmjB/AFyTDGg7XVT/BY51gKkAdizMYv03v4Ve0+sF9skBFtasYvOVYMqyMip3OJtnVMUmfi0WKCyMq6f4YLMLDIoGF1KSEQDRCeC//e1vcp9HhhRx2WUwb97A6vAmJYO1YUUoa8fLh+tjtnY4HLBlC9TVRR9JajaDcYOOCWOq+c9/N3L8IxOL9Eb2Uc36jbq+fQhm+NCI2m1i4iWi+D1RqwvbIGuwEMrDu+LKR9n77OXU9hoGlMBkclhx5aPp6fkNJISH9/orHmXvc5ej6K1rO9ww3p3D9Vc8OqQ8v156xa3abGXilC+z40o4kWXF+Gcj1VdVo9PovDnBwppVHDv6FovOwBu3zGfjUR35e7fGeCMawWCAdetiEsGh7AJtr746oO0Cg6bBhZQMcQEQswc4HB988AGXXnqpVLtLKwabBziDSDp4gOWYhPf42yfZ/Pqnge3sWX/NpJisHRaL+JQs2lx+3yZWxcVQmGPm2rFG9MUmJk7ToVZVwnkzDNNB1mfQZYY8vZ9NwnMsz4TloYS1vYGvPjEXu1NgdeViUfwGThYbYAgdDTS/PhfBKXCgaDHXXzHwrykuQtxMvvaGMk0ZM0fPpM3RRpGqiGNH/4/Fv/0n+g6YeOFc8UNQa2vsN2IcN1PLjh001Wwl8A/I8LVVCdsFUlVZDu0BnkTFM08PWFGfITSy5QAH0tbWxtNPP83jjz/Ohx9+mLFAZIiLVCUxqFVZvHjHZSltliFFpTYQqawdWq34Xut5Lw1XnQ18z924EX7zGx37TNVUz1+D+uwrYHsGrHlQbAdNPlx0rXeinE7ddyyDQXxyO9RQ55V4J7ytWLR9YFR+I6DOK/FOeJswf/vQrPyCOKANvdXG3ptIB1RfVU3Vm1XsO7mP3Sd2U15cTqO1EbVSDbd+ha1/zUJdcSH84Adw332x34jV1TF/kpTLLpDKyrJSrabimWdSZusYbJaSwUDcAvivf/0rTz75JC+99BJjx47luuuu44knnpDy3DIMEeQSgdGSyoYVck3Ck9La4encGk4Eh3rP1enEJ6/t7TrUn1SK4jfLBaWd4ka2Tuip9KZEeI5VUxO3bTFDhvRFpfLcEH6CVKfRMXP0THaf2I2zx0l9i+iXFhCYOOVLqBd/q++GiPdGjPVUZbILpHoiWqoaXAxGS8lgICYBXFdXx44dO3jyySfp7Oxk+fLlOBwOXnzxRSZPnizXOQ5Zkhibl1KGchKDXJPwVswdy8uH64OsHSvmjo1rf4EiuGqti2lLz2J1dVCsLODj3WNoblIGveeqVL3v9efNYuXXI35B/Pm8OehYQ832kGEI4b0h/GlztFFeXO4VvwDlxeW0Odr81w+4Ed1VVbROn063tY2c4iJKPAkSCYhfgJIbb6Tt1VeD7AIlN94Y1/48DNWJaKkW/mlBGgqaqAXwNddcwz//+U++9rWv8ctf/pJFixaRlZXF//zP/8h5fkOWd94ZOpMzB3MSQyTkmoQnh7XD897ryfLddUhJyewWWg8OQ+NsZfGckt6EhxAbD9OJtgdfiu3i8gwZhjhFqiIarY1+yxqtjRSpioJX7r0R3VVV2PbuRfHSy3SW6chtNmPzZAgnOItULrvAUJ2INlSFv5c0FTRRC+A33niDH/3oR9xxxx1MmDBBznMa8ngyqs+eFb8P9ni+wZrEEA1SV2p9kcPaodPBtKVn2XVI7OZm/mslALaCTqYtbe+LN/NFMIsT3jT5ou3B4wHOLxCXC2Y/G8RQRp2tTs8mF4mQpR4yTS7iwWwzc6j2EGqlGgHBzwN8qPYQ5kqzmA7hi05H6/TpKF56mWyng+ENDQB026Fr+nS0EkSoyGEXkKuynO4MVeEPpLWgiVoAv/322zz55JPMmjWLyspKvv3tb3PDDTfIeW5DEt8GLVOnig1a5Bwz6fBUQk4RKCVyTNRL9SS8eLC6OiiZ3eIVvwAls09hdZUGr9wbdUaXWZzw1hMiBaK3WUZGBGcYang6vDXbmlk0fpFfCsSh2kM025r9I9J86La20Vmm84pfAEuZjnxrW7IvI2rknIiWzpPM0lr4yykCki1oYiTmGDSbzcZzzz3Hk08+ycGDB+np6eFnP/sZK1eupHAQT9tORgxaslt0p9NTiVSlQERLOsSlpQvb9pzmvg1iBdhDVkEXGze5WLWkom9Fj/i1m7xRZ34iN9LvM2QYxHjEr6nThD5fHyRyI/3e8stfothwH9lOh3eZM1uFe9NGtHfdldRrSTUDoc1xWgp0OUVAsgWND9HqtYRygI8dO8YTTzzB73//e6xWKwsWLODVV1+Nd3dpjdwCONRY8SDHmPF9KjGQuiCmSihLlas70DGb+zzAtuxOSmafovXgODTOfBbPKWFrTa8HOFpxmxHBGYYgkcRtxPXMZq8HuNsuYCnToW02k+PxAG/dOrg7yQQgZ25xJNJS2EaDnCIg2YImgKQIYA89PT3s2bOHJ598MiOA4yDcWPEg5ZjxPV5FhfhUQuYPZJKQyirs/a8c4ekDZ3G6+m6XbKWCm+eM4YFrp8p67JThcoCjHXLFWei+CUtlw0OnQIw3WLjvXgeldfdGL2oDRfClNd5jZsgw2LDYLax9c21E8eshUARvvngVwx54CLW5FXdZWVQpEBa7hcKcQlRZgzNb0LTpQVqff95/kll2NiU33IB+w72yHXcgVJ5DIqcISLagCUG0ek0pxcGysrJYunTpoBW/chLNWAFx+bhxfc2E3nlHmuMpldLsNxn4xaW53LjdfXFpcjPkJuq5HHB0C3ywFgRzULzo1holq5ZU8MC1U1m1pIKtNUouHG3mmhFreWfHY3S6R0Rf0VXrxPXy9KAxgGrwWqkyZCjMKcQwzBCV+AUxJ7j6qmr0+Xou6Cni7A9XcOzo3xF0xSi2bkV7113oN9yL9q67xMqvXt+XE2w2Y7aZWfvmWra8vQVHjyPssQYqqZpkFhRv5nZ7483SFjlFQLIFTYJIIoAzxEd/Y8XlcnPW0skx03nOWjpx9VYdEx0z/R0vTcZiRDxxab4kKy5txdyxTB4xDIVCrPwqFKTlRD3JcLSDrQ7sJoQDRjbfZw6bra8rMFN9g9jyOKengXt3/pCWMTXR2xnUOrHyO2UdKFNUpXLYYf9j8Poa8bvDHnmbDAMCwSmw8+hOthzYws6jOxGcQsrORZWlYt38ddQsqIkofj3oNDq2Tq/iR6+YUDWbMRWA8UowB37+9mQV9opgYc0qNr+0ClOnibrzdbR3t0t/QWlAyY03kjupUnwzy84GhSIpk8y88Wa+pHO8mZwioJ99u10uumtrET4/TndtLW6XS7pjJogkFoihgNQWiHDi970zFtoFp9czXqjOZtZYLUpl74CK4+lBGjyVSJhU+3DTfaKe5AhmhINGjn1gwmTVs89UzfqNumBroY+FQVDoMT5fzYlaHXq9OI4GRGMLhx2eWAiNR0CRBe4eKJ8Kt70BqrxUn12GBBCcArfsvYXPLJ+Rpcyix9VDpbaSnVfvHDitpj0iwWRC0BVjvBJOZFn7ryKbzQhrVnHs6FuYCuD1277Mhm9si1pwD0RS4cVNpfc4ZuQUAWHEr+3993G1d3gnwSkLC9DMmIFCqUzsmGFIqgUiQ2yEG4d1Vhvtguhj8txT7YKTOmtflTPWD04D7KlEv6S6CuvJ1X3g2ql8b/74wS1+AdQ6smZU06PSoy82UX2DEV1BQOe2AP+ueo4okvV6MBjEDq4DgveeFMWv2yXaP9wu8ef3nkz1mWVIkBeOvcBnls9w48bpcuLGzWeWz3jh2AupPrXoKSwUbyi9HvXD21j/zW3o8/WYOk0Y/2zEbPO/L80asUJsKoAufRkbvrZ1UItf6Mst1m+4l9LvfjcpHtxUVZ5jRk4REGbfjvp6UfziFv+m4sbV3oGjvq/jYSqFR6YCHCVSVYDdbli+HA4eFGPxlAEfQY6ZzlNvtQdVOUcV5zFR739clwuOHIHZs+GFF0KP6XCV5jqrDXt3D3k5WRiKNQlVmJPFkKvC9pLK63Z0mOl534jaZYJcXegs3wC/r8UivmerBsqcm9fXwHu/FcWvB6UKZt0K1zycuvNKAMEpsGzXMgB2LdsVe7WzR4C3xe2Zv0tsaDEA2XJgC7s+34XT1TdBKluZzbKLlrFuzroUnlmMOBzQ3u59pOI7Oa5MUxYyQ3i8q1gUv0UjknKKAzYRIQHS/prDVGcd9fW47ALKPDWqUaNir8pGEDTC58dxnDvXK357UShRjRyJ+qKAhmrRCJooiVavRd0II4M0KBRi5N7ateLEy8APY3k5WQR+JHG7xeWBy06fFtNLVq2KXfwG2ixMbYLXZuH5QHbqVFplVgPydDdLd0KlX7x8uD5pGcSqAh2q2dVweA18/grYnunr5qbJFxtcBEx2S7rtwWEXq7Wtp6GkAmatjM26UFIh2h58cfeIy5N9Lhm8CE6BF469QF1HHYYCA8snLo9ZyBsKDPS4/P9ve1w9GApimyAlxbkkhErld2N5JsdVvVnFvpP72H1it18XuUXjF7FhQfIqv6ESEdpefTX9ExESRI6OeZIRgzXB0djYZ02IVgREEDTKPDWhBI0yTx20LKKgkYGMAE4Bl10mjqe1a8Xx5TtmDMUaTG1CkAfYUNw32yGaD2fx2izGaPOB6Md/ujKYKsV+6Re9/2Ge9ItEPwxE/Tqpeyu/tmcgywWlneJyW6e4PJXZvaH8ux8+F5t/d9ZKcRvffeinicuTfS4ZgNDe3ddOvhazd3f5xOW8dvK1IA/w8onLk34uUqPT6Jg5eia7T+zG2eOkvkV8tCwgMHP0zH7FrxxVy6BEBPAmIqStQIxA2ld3wxG1NUF8T/FYE3JGjxZXilYEhBE0qlGjcDQ2BnmAVaNG9W2fwkfOGQGcIvobM0qlglljtQnZE9xusbnL2bPiU4nAD1P27h6vuPagUIjLfVEoxIjAI0fE/c2bl/q2ydGQyoqpHMLbk37h9PkPkyL9IubX6bxZrPx6xC+IP583B6+bTHz9u55HbR7/7rwfRrcPVZ4oUhOt3EpxLhmAYO8u4PXu3jLllqj3o85Ws/PqnQlVb6U6Fzloc7RRXlzuFb8A5cXltDnaQq4vV6XWm4jgm8UrQSJCqkTogK5oRxABLrtAKBHgsgeko0QrAvoRNAqlEs2MGYlbLWQiI4BTSDgR7KnE+hLtWEmmzSIdkbNiGg65hLdcGcQxv07DdKLtwZdiu7g8lbSe7q22+vrMssTlsaDKS1ykSnUuGajrqCNLmeXn3c1SZlHXEbugUmerExKqUp6L1BSpimi0Nvota7Q2UqQqCrm+XJVaObJ4UylCB3RFOxXWhDAi2FtVDtx3iicbZVIgUoxnzGi14ljob0pirGMl3H4NxRoK1eJnH894jsdmka6kKi9YrkYdcqVfxPQ6CWZxwpsmH3qU0NL7Pb8Al+IzWk2xVYEtFnFOjyRI6d8dROci2Fupa/yI4/UHeWrfnQj21pi3r236iOPn4ts+UaTy7g6Yc3E4xBsjBlrqjvPBqX+hVqrJzspmVOkosrOyUSvVHKo9FJQOAfJl18qRiJDKRhMDLuM3kDAiQDVqFMrCAkABCiWgkMaaIJegkYmMAE4DIo2ZeMdKf/v12CwmlBcwqjiPCeUFCecMpxOp6toml/BWq7J48Y7LWH/NJG6eM4b110ySxM4R9evkiTrrMosT3qZthEu+D9M24rrg6xw/aubjp4y0nItOBJvNYpFgyxaJRPCslWJmr0IpJjcolPH5d6UgBeciOIWgL2t7A7e+sIAvui00uGxsa9rPzc9ejrW9IWhdeoK/hI4Gbt+1gJPdFs65bGxv3s9tz12O0NEQvL5MLJ+4nEptJQoUZCuzUaCI2bs7YM7F4RBviLVrxRskClrOHuPoyiV85dn9LB6zkE1f3cS3p36bTV/dxKLxi2i2NYeMSJOra5pSrabimWcYvraKkhtuYPjaKiqeeVoaW4UvSRKhqeouJyn9iACPNSH3wgtQjRxJ7oUXSJfNK5egkYFMDFqUSN0IIxShPOtSjJVoIwAhrcZm3ISyIkweMUx2D3CqG3XESlSvU0DOb2DaQ6tJFL9qt9gEY8pN1ZSO7N8SEdhSWbJGGemUvJDkc1ny7JKgZXWNH/FFtwXwvdndXJCjxVB+sd+6e0IkZNU2fcTJbgtun+0VuBmfo2X0cP/t+cqeBM4+PClPXkjWufg0uui33aIPLWePcfR716I2tyLoSpjy5B5KDX2xUr4RaYHNMkLZCnInTUpYrMpBKhtNDKTXKSKpEAFyCZooiFavZQRwlCRDAIP/mKmoEO03UoyVwdAJLhZSkQKRKuGdCGFfpwji10PLOTNHn4ksggPFb4T3+AxREkoAH68/SIPLFiRgRyg1TBg122/dUAL4+LmDnAux/Uilhgkj/beXUwAPKaK8QYLE7+OvUDpmYvDuIojggZBukGoROlBep6hIhQiQS9BEICOAJSZZAhj6xszZs6L3XKqxEm78Dybxm0oGTfxalwU+WBtR/HoIEsE311A6oq+0G/G9PZ0quAMMwRlsQ3hq351sa9pPrVlMBjCUGVACd5fNZcWi7X7rqkO8Dz617062N+9nS7a4vbHHgMMdevuB2iAj2URVQY5wo7TWHufj25ZEFL/e3QWI4JoFNWjzBkJv8j4GlQhNNakQAXIJmjBkBLDEJFMAgzhmtm0TJ15KOVZS+FQiw0DC5YCjW8BWF1H8evCI4NoWA39vvofJ1zZgdXVQrCzg491jaG5S9i9+A7Nzy6cO+ezcRDq5CfZWbn72ct40n0YBjC4bzWRy2Hnj31DnlUS1/W3PXc4PVKcB+IlzNOPd0W8PDJpOclIQKke4UlsZOkfYRwS7y8ponT6dbmsbOcVFFL1/iBPH9tNYoIgofr276xXBhmEG1s1fhyproLRnzCALqRABcgmafsgIYIlJtgAGcUzKET2WoqcSacegqdbKhcsBjnbIjb5i1NJg4Z4N+bz6bge27E5KZp+i9eA4NM58Fs8pYWuNMvip7v7H4I17g9plsvDBIZ2dm2grY2t7A199Yi52p8DqysWsuPLR6MUrIHQ00Pz6XASnwIGixVx/RWzbZwRwHzuP7uSR9x7BTd/brQIFq2etDh3PZjbjrqrCtncv3XYBS5kObbOZnDw16kX/wfmN6ykZPSF4u36w2C0U5hRmxG8vQ76qnAoRIJegCUGmFfIgQK6x4hvXd+RI0p5KpBWpbi88IFCqYhK/AKUjtEy+9jTPvaekpyMX818rAbAVdDJtaTs6XUXwRpnsXFlQ55V4J7ytWLQ9ZgGtzivxTnibMH/7kBawiRJzjrBOR+v06Sheeplsp4PhDQ0AdNuha8ZMtDGIX2DA2R7kZEA3uJCKVIiANGwkkIlBG6J4xv/s2UNP/IJ8mb0ZwOrqoGT2Kb9lJbNPYXV1hN4gjbJzM2SQg3hyhLutbVjK/B+XWMp0dFtDd3jLEB2pzBZOK4a6CCAjgIc0l10GL7wwJMd9ypplDAWKlQW0Hhznt6z14DiKlQWhN0inHN8MGWQgnhzhnOIitM3+Gb7aZjM5xaE7vGWIjgHf4EJKhrIIIGOBSGuSYZlJh6cSqfDipqpZhpwk+jo6HNDeHmUub68/2NKppbAQVL3WQrMZPt49Bo2zFVuBvwf45GtuzHMc6IYH+BBVeeKEt0wKhB+eTm52p8BT++6M2cObagR7K81NH4ke4n13xu4hHkSos9XsvHpnVDnCjh4HHedOU3L4MLY8Nd12/DzAmsOHxRvNY6Z3OGhtOkuBfkz0Hl+LBb8bNwoGi2821Q0u0u51TJYISKIHOFpSOgmuurqal156ic8++4y8vDwuu+wyampqmDixb2ar2+3mgQce4De/+Q2tra3MmTOHxx57jClTpnjX6erqYvXq1Tz77LPY7XauvPJKtm/fjsHQN6BbW1v50Y9+xKuvvgrA17/+dX75y19SXFwc1bkOlhSIdCNV2bmpzOyVQ/Anej2eRlR1dVHk8/YmRAiWOozPV1NcrmPdOmhr60twKhvuYtrSs94UiFN/1LB45Hq6sgxc9v11wSJ4CBMqxkywt3LrCwv4S8sZFIBBZ6CSbJ5Y9kaQiExVYwgvIbrBCfZWbt+1gJUq0VJkdBoY5w59/hlvcR+OHgfbXlvP3MdeZW72WFT6UX4pECWHD6Nobu6LSCsqovOBezl08BXe/eHXWfW1zZFFsCdlwmCAdeuiEsGh83grE/bNpkIMpjJbWK7XMe3JpEAEs2jRIm688Ub+7d/+DafTyfr16/n444/55JNPyM/PB6CmpobNmzezY8cOLrroIh588EH+8Y9/cOzYMQoLCwG444472LNnDzt27KC0tJSf/OQnWCwWDh06RFbvo46rr76auro6fvOb3wDwgx/8gIqKCvbsiS7EfTDkAKcjqeyeNpiaZST6OsbUiKrLgvDuWo59aMJk1bPPVM2dq3Rs3drP9oIZ4YDRu/7rDTVs2KTNNMHoJeFObt9KcSOKvweff7p0khtoRMz5DcgJttz1PY6s/o53/WlP7AmfDhFnK0Y5OrKlUgymqgqbys52KSONc4BT6gHet28f3/3ud5kyZQqXXHIJv/3tbzl79iyHDh0CxOrvf/3Xf7F+/Xq++c1vMnXqVH73u99hs9l45plnAGhra+OJJ57g0Ucf5aqrrmL69Ok89dRTfPzxx/z5z38G4NNPP2Xfvn08/vjjzJs3j3nz5vG///u/vPbaaxw7dixl1x8K33SSqVP7hMk778hzvFSH4KXSi6tWZfG9+eN54NqpfG/++KSkP8g1+S7R11GrFUWrXi++NxqN4ntlKMztWozPV2Oy6tEXm7h/qZHt28z9il8+FBtkTLxEFMsn67Rh958B7E6BwIeFit7lA4FQVe1wyzMAZjMlG7cyN3ssgq6EX183lns+eASzzedG0em8N2p3/VmOrP4OT//HCARdCXOzx1KycWuYGzdEk40o+5DL4ZtN5WQ0pVpN6Xe/i37DvZR+97tJq76mrf9YLiGQbEETI2k1Ca6tTZzdqu29KU+dOoXJZGLhwoXedXJzc/nyl7/MO70v4KFDh3A4HH7rjBw5kqlTp3rX2b9/P0VFRcyZM8e7zty5cykqKvKukw4E5lMrleJ3ucbMO+/A8uWpHYuD0YsbDrkEvxSvo897a78i2PMeeqJWxz5TNRWVes58ZmKR3siFo80hxa+nm5x6TjXrN+r89m+xJHTZg4Jdy3YFfa2uXIxB12fhMpQZGF02mtWVi4PWTTnzdwV9HShajNHZd/7GHgM/cY7mQNHi4PUziDdCrzjNGTWGKY+/gmbEGEydJox/NgaJ4JYNq3nXeQa1uZWb/9TA1Ed+R86oMZFv3Dj7kMvhm01bMSgjqfYfh0QuIZBsQRMHaTMJzu128+Mf/5h///d/Z+rUqQCYTCYAysvL/dYtLy/nzJkz3nVycnIoKSkJWsezvclkYvjw4UHHHD58uHedQLq6uujq6vL+fP78+TivLDr661CoUIg/nzol/l7qtshnz0q731hZMXcsLx+uD7IErJg7NvknkwTkEvxSvY4eEex5r6xa6+/l9e3otn6jDo26mp4vjOiLTVTPX4P6s0o4b4ZhOsj6DLrMfq2Udeq+/RsM4jycoU4oD++KKx9l77OXU9trIlACk8kRJ8Kl2vMbSAgP7/VXPMre5y5H0dv4weGG8e4crr/i0YznNxSFheINAVBdTalOR7Wu2tvGuOrNKmaOnkmbo40iVRGHag/Rdd1Ybn8RZs6+lvxJM/xuXHdVVXjvcIz+o5Ibb6Tt1VeDfLMlN94Y9yWnpRiUGTlex4SQSwgkW9DESdp0gvvhD3/IH//4R/75z396J6+98847fOlLX+LcuXOMGDHCu+73v/99amtr2bdvH8888wy33nqrn1gFWLBgARdccAH/8z//w5YtW/jd734XZHeYMGECt912G/fcc0/Q+fz0pz/lgQceCFouhwc4XHtuD1J2Kky3TnDp3JFN6nOTc/KdlOdqNovi948HWiN2dHN0mOl5bw3qM6+ArROseVBsB00+XHQtTH84qJVyHJPQhxyJdnJLNQl3khtqhIhhMdvMVL1Zxb6T+xBcAuXF5TRaG1Er1Swav4iHZxopLa/wi2Hpr4Oc5uqrUWzdGrP49SC1b1auyWhpl7IQQNqcn1xCINmCJgQDqhPcXXfdxauvvso//vEPv+QGvV4PiBVcXwHc1NTkrQrr9Xq6u7tpbW31qwI3NTVxWe+LqtfraWxsDDpuc3NzUHXZg9Fo5Mc//rH35/PnzzN69OgErjI00YwVkO6DU6jjpfoDmceLG450mbCWaLc4tSqLF++4TJZrieZ1jBadDqYtPcuuQ5E7uqkKdKiyK8H2DGS5oLRT/IWtE3oqg8QvRG09HNIk2skt1WQ6ycWIShV0Y+g0OmaOnsnuE7tx9jipb6kHQEBg5uiZlBoCJryF6yA3fTraBGaeenyzUqFUq6l45hnZRXWyurxFK2ylfh3jQi4hkGxBkyAp9QC73W7+8z//k5deeom//vWvjBvnH54/btw49Ho9b775pndZd3c3b731llfczpw5E5VK5bdOQ0MDR44c8a4zb9482traOHjwoHedAwcO0NbW5l0nkNzcXIYNG+b3JTX9jRWXy81ZSyfHTOc5a+nE5RKL9J4xE6+FJtJTiTSy5vjhEaKbX/+Upw+cZfPrn3Ldr95BcPRE3jgB5JqwlorJd/EQU0e382ax8uu3gzxxeYYMGeKmzdFGeXGADbC4nDZH6I5wA6mDnNST0VI1sc4jvJtqttL6/PM01Wzl9E034RLScNKnXEKgn/26XS66a2sRPj9Od20tbpdLmuNJQEoF8A9/+EOeeuopnnnmGQoLCzGZTJhMJux2OwAKhYK7776bLVu28PLLL3PkyBG++93votFouOmmmwAoKiritttu4yc/+Ql/+ctfOHz4MCtWrGDatGlcddVVAEyaNIlFixbx/e9/n3fffZd3332X73//+3zta1/zyxxOJuHE73tnLBxv7KDeaud4YwfvnbEkLIIjfTBLg7HYL6lqWzzUu8XF1NFtmE60PfjtwC4uz5AhQ9wUqYpotPo/wWy0NlKkCt0Rbih3kEvVxLoB015ZLiEQRvza3n+frhNf4Dh3jq4TX2B7//20EcEpFcC/+tWvaGtr4ytf+QojRozwfj3//PPedaqqqrj77ru58847mTVrFvX19bzxxhveDGCAbdu2sXTpUpYvX86XvvQlNBoNe/bs8WYAAzz99NNMmzaNhQsXsnDhQi6++GJ+//vfJ/V6PYQbg3VWG+2CE+hLJmkXnNRZ+0RXrGMm1qcS6SaCUyVEh1pChS99Hd3yySroQnfFZ2QVdKFx5vPx7jH+k8wFszjhTZMPPUpo6f2eXyAuFzJV4AwZ4sFsM3Oo9hBqpZrsrGxGlY4iOysbtVLNodpD/ukQIEapHT5MTp4aZ7aKphEjcGaryMlTU+LpIDeISdXEugGRaCGXEAizX0d9Pa72DsANbhfgxtXegaO+Pv7jSUjaTIJLd6RqhOF2i4kjBw+KsXjKgI8gx0znqbfagxoajCrOY6Le/7guFxw5ArNni+28Q43ncJXmOqsNe3cPeTlZGIo1KJUK7znK6E+PmVQ1y0hlt7hU4puYFNjRzTcForoadAU+UWe5OtHzGyYFIuk47Im3WJZiHxmShuAUomo5LNf2UmG2mb0pEGWasqAUiGZbM/p8PdVXVaPT6PxuXHdZmaQpEAOFVHV5S/sGF2EqtI76elx2AWWeGtWoUSg8oiQaIRBB0AifH8dx7lyv+O1FoUQ1ciTqiwL869EImigZEJ3gBhJSdoIL90HsrKWT443BHssJ5QWM0eZ7f45mbEayWbQLThQKcV+F6mxmjdWmpQgebG2L0w6XAxztkKuNGBfq+X2HxcJIfRebl9+H2m0KLXIDcoCTLoIddnhiITQeAUUWuHugfCrc9kb0AlaKfWRIGoJT4Ja9t/CZ5TOylFn0uHqo1Fay8+qdUYnYRLeXCl/x6ydy+/n9Q5eupmTjVpzn6skZNbr/GzfgxrbYLRTmFEZunzyAGGrtlSMSwZ7gau/AIwSUhQVoZsyITQSHETTdtbV0nfgC8JWZCnIvvIAc31ABiQVHRgBLjNStkOUWp8kS2cliSAjRVOBywNEtYKujZXQ199yvi5iV33LOzLHnVjE85xNsLj0XXTIS9Zx+xG0qRfD+x+CNe4OqDyx8EOb9MHn7yJA0dh7dySPvPYLb5w1XgYLVs1Zzy5RbZN9eCiKJ38D1bA1nuf3F0+jO92Aelh3cPtm7gb8Ibtmwmns+eATDMAPr5q8bVCI4FaRNvJkvyRKncovsGBlQMWhDkcsuE/+v164V/+89Y0apVDBrrDYhe4LbDdu2idnWU6cGP0mwd/d4xbUHhUJc7otCIcYDHjki7m/evISeSiREtBFfg0UoJ+06HO1gq6P7vImjzxixWarR63X9PyUVzJSeXsWcsW9hbYOzDVP47fPVbJimQxvqb71aJ4pejwj+0AiX1kBuEnLQWk/3Vm19xWuWuDyZ+8iQNOo66shSZuF0Ob3LspRZ1HVE58VMdPtEsdgtUYlfECPSHppRxdGVS8hptnAkz8EfvjGDog8eoVoXYjufLjfd9Wc5+r1r6Vg2ljqgvbsdbZ6092RaCsI4ieZa0iLezJcIQsBlFwglBFz2gOSKaIRAP4JGoVSimTEjMZuFjGQEcAoJJ4J9K7Eeoh0rCgWsWiXu9/Tp4ApwXk5WUOtvt1tcHrjs9GkYM0bcX6rEb7TIkdubCpJ6HblauKSa7MNGyoeZuH2ekSk3iZ2ogk+st5rbZSFLU0a+djJ73vsZxeW68B3dfEWwxgCqJLV/K6kQLQu+uHvE5cncR4akYSgw0OPy///qcfVgKIhuElSi2ydKYU4hhmHiscKJXw+l5RXMnH0thw6+wic/uIpCld3bPjnk9r1tlI9+71pqh7kpKjXw4FXVsojfVOXxSs2AvZYIQkCZpyaUEFDmqYOWRSUEwojgnFA9FNLgEXPGAhElUlsgfJGrccpg8QBHSyony0lZrZXrOsKep2DGddiIs8NEzrAo/LzTNkJWLpZObfQd3bosovhVJulRayj/rn4arPxTYh7gePaRmUQXNYlMQhsMHmBHjyO2iqzDQWvTWQr0Y2jraovKO9zReFYUv4tqvL+XsmIr16SwVFSV036CWySSbU8YQJ3gMgI4SuQUwBB+zCQyVgZDCkS03P/KEZ4+cBanq29IZysV3DxnDA9cO1WWY8oxQU+O64jqPIU0TXRIRECmOgUihZPoBKfAsl3LANi1bFdsAq5HgLfFbZm/K2ld3KQQoKlMgUiHBImY0yPobxJXZdxVTtOmB2l9/nkxE9dDdjYlN9yAfsO9cV2X1OcYLXJcS9KRKwUixuMlvN8oyXiABxj92SESHSty2SzSkVTk9vo16eg9tqdJR7zVWjmuI6rz9FgVDq+Bz18RWxtb88SGFpp8XBdeS9vYakpiEL8WC9FXiEMRSkB++Fz0AlKVl/hktUT28d6T4rm7XX0+4sYj4vLMJLogXjj2Ap9ZPsON2+vD/czyGS8ceyHqSWjqbHVCE9bi3T6UeH/t5GuJV48dDmhvj7p/uMcbfM+Bzfzx5D52n9hNeXE5jdZG1Eo1i8YvCqoMBzVyAG8jh3iqnHLk8Up9jtGSqmxhSUm2PUEuQSMxKW2EkcEfz5jRasUx4nJJM1YC99tfzT/NxmbMrJg7lskjhqFQiBVThQImjxjGirljZTumHE065LiOqM9T3Vv5tXVClgtKxe+uThuPPPUtqjboos7SN5vFv39btojv4XHhKyBdDvG7R0AOBDyT6HzJTKLrF88kNF+SOQktEQLFuxu3V7zHjcMh3kBr10bfxMJspvSBrXz/zWacDjvOHif1LfU4e5wILoGZo2cGeYOlbuRQcuON5E6qFEVPdjYoFOROmkTJjTfGtT85zjFa5LiWlJBsISCXoJGQTAU4zfD94HTkiOg7l2Ks9PeBzMNAF78gJkW8eMdlSU2BkKNaK8d1xHSe581i5be0s29R43COnyrCpBKTlCJl6fsmLkFMBSx/BnoKQ2YSXUykehJaIsiSINHeDnV14o0U442nUjYxflIZn3SZvL8uLy6nzdEWtJnUVU6lWk3FM89I6tdNVSVWjmtJGckWAnIJGonIVIDTEM+YmT1b2rHS3wfAwSB+PXji0h64dirfmz9e9vQHuarOUl9HTOc5TCfaHnwo1jfy0F370ev73ov7K0iFytyPS/zCwBeQs1aKnl+FUpz8p1CKk+hmrUz1maUlyycup1JbiQIF2cpsFCio1FayfOLyVJ9aRGQR71qteAPFceO9/6Pr+dzpv26jtZEiVVHQpnJUOT2xYPoN91L63e8mLBhTWYmV+lpSSrKFgFyCRgIyk+CiRO5JcKFwu+WJHvP1p1dUiAkng0H8RovUqQ0DJXs4qvMUzD4e4M4+D3B+AUz4Oi1jHw7bLCNSJ7mYkSKFIdWkKAXC2t7AV5+Yi90psLpyMSuufBR1XklU2wodDTS/PhfBKXCgaDHXXxH9tomSDhPJ4kHWBIloWzT6NLlYc7iGfSf3IbiEIA/w1gVbg2wQAyG3V+pzHAjXLBvJFgJyCZoQZFIgJGYwCWDoG/tnz6bdUwlZSWVb5bQnyhQI345xZcNdTFt6Fqurg2JlAR/vHkNzk1Ia8eshEyMWFsEpBC+zt3LrCwv4S8sZFIBBZ6CSbJ5Y9oa/kO0RgsSZYG/l9l0LWKk6A4DRaWCcO8S2kLR0iIGCrOLdR+S6y8ponT6dbmsbOcVFlBw+jKK52a/DWywpEEORVKVKpBXJFAIZATxwSbYAfucdsenKqlXyjcdkHCPdSFVWcNoTqWVxwO9bRlezZoOWPx5oxZbdScnsU7QeHIfGmc/iOSVsrVFKI34zRGTJs0uCltU1fsQX3RbA9w3HzQU5WgzlF/ctMh9kz7TZftvWNn3EyW4Lbp9tFbgZn6Nl9PCL/dblK3skuIIMUWM2466qwrZ3L912AUuZDm2zmZw8NZqrr8by07Ve8RsuBziaTnODnQGf7ysVg1BsRKvXMh7gNMTzoezgQfH7O+/Ic5zLLoMXXkit+BUcPTz+9knuf+UIj799EsHRE3mjBJAjtWHAE0n8Ql9EWp4e7CZKa43829c/wJbdSU9HLua/VtLTkYstu5NpS8+GFr8OO+x/DF5fI3532EOslCEQwSmw5NklLHl2SchqbyjsToHAWouid3k0x4tluR89Avx9ifjVE925ZhARnAI7j+5ky4Et7Dy6M/TrrdOJlV+7QLbTwfCGBrKdDrrtAl9cPCGs+AUxIq36qmr0+XpvxzizLcp0iUFGqlIlQKw+t+zYgWnTg7Ts2IFLSOG9IrcQSJagiYNMCkSa4WvLmTpVtOWsXSvPk4kkPpEISSpaF6ciKzit6bJEFr8efFsa203M7tpCxWXf4Ys3+iqIJbNPYXWVBm+baJ5vhn7ZtWxX0LKn9t3Jtqb91JrrATCUGVACd5fNZcWi7X0r9ggQ8Ij+wL472d68ny3Z4rbGHgMOt7jthPnbySA9sWQId1vb6CzTMbyhwbvszIgSHm57kfOdIyJWdj0i2FMJNv7ZSM2CGsnbIac7qUqVGLCtleMhmYImDjIV4DQisHmKUil+t1ik/+D0zjuwfHlqP4z5NWdwuXG7+5ozyEUqsoJBnkp3Ivt0OMRxhaoQNIaoOrxZLODI6qsEdytHU/fuZL91Wg+Oo1hZELzxQM/zTWPU2eqgrxVXPkol2YAbBW6UwGRyxIlwvuvmFos+Xp+v6694lHHubBS92zrcMN6dw/VXPBq0bgZpiCVDOKe4CG2zf9V2tMnCRVllfeJXVdR7g4fGtxJsGGagMKew9waPPrBb6ipmsquiqUqVCGro4XZ7G3qkBLnEQDIFTZxkKsBpQn+dAxUK8edTp6T74OTre0/lhzGPHcHpU5GV246QiqxgOSrdiezTk61fVwfV1Sp0U9aBox1y+68AeebfGAywbp2O82NqePJ/88np7sBZ4O8B/nh3CeZ5ARPgBnqe7wBDnVfCE8ve8KZA3F02N+oUCM+2nhSIu8vmJjUFYigSdYaw2UzJ4cPY8tR02/F6gNVqNfd+Uc7571RRoiryvcH7nYmq0+ioWVBDYU4hqtY23xs8YutGqauYqaiKpirf12u98G2tnCTrRRByiYFkCpoEyFSA04BwbbOhb8xI8cEp8IlEKj+MpcqOkOysYDkq3YnsMzBb32xR9S9+XQ5aGizehKW6OvEp1j33aTE15rJ4TgkbN7m4dXEpGze5WDynBLvVyr3rHP5xpQM9z3cAos4rwVB+MRNGzWbFou0xCVh1Xgmjh1/MhJGxb5shdqLJEHY0NiCs+TGK5mY0V1+Ne9NG8m/5Du5NG9FcfTVZ5hZKNm4Vb9DeG1xY82McjQ30hzZP2yd+PTd4e3vE85W6ipmqqmgq8n3TprWyXGIgmYImQTICOMVEGisepBgz6fZEIlV2hGQjx8S7RPYZdba+y0Hnv7Zw9Om12Cxm9HpYvRq2bu2LI91ao2TVkgoeuHYqq5ZU8PAmC3fMW8v80i3+IjjTECJuBHsrdY0fcbz+IE/tuxPB3prqU+oXwd5KbdNHHD+X/ueaTkRqAOJobODj277GsaN/R9AVo9i6Fe1dd6HfcC/au+5CsXVr3w29dSusXo2gK+bY0b/z8W1f618Ex9m1RuoJZKmckJZs0qK1slxiIJmCRgIyAjiF9DdWXC43Zy2dHDOd56ylE5dLrJImMmYiPZFIxTj02BHWXzOJm+eMYf01k0I+wk92UoTUx5Sj0p3oPnW6yCK4pbGdQ2/XoXabuH2ekbV3m3nkkTBNLgQzpbVG5l5sYnRpHW0t7X37VeWJE94WPgizbhW/D6RmFklAcApBX9b2Bm59YQFfdFtocNnY1rSfm5+9HGt7Q9C6SaVHCPoSOhq4fdcCTnZbOOeysb15P7c9dzlCR0Pw+hn8UGer2Xn1TlbPWs2yi5axetbqvglwZjM996wlq6kZUwEYrwRz4G0ecEMLDz3Ig7MFTAWQ1dRMzz1rg2/wBLrWSF3FlKMqmoqkhWiO6bFeDF9bRckNNzB8bRUVzzydvAlwcomBfvbrdrnorq1F+Pw43bW1uF0uaY4nAZkc4CiROgc4nPh974yFdsGJQiE+ESpUZzNrrBalsndAxdixMJoPZenaDjkVjSukPqYc1yDVPn3fA0M1teiyWrh9npEZk0y8/6meX++vRqPVhRS/gTnBvh3jPJ03M/RPQnm+wJ5v+WfyCk6BZbuWAWJSREwNGXoEeFvclvm7gie8/T34XDP5wTLgEQcmE4KuGOOVcCLL2n/Sg9mMsGYVx46+hakA3lo+h/sOqFGbrWGbZ8TatSZ0E4lJcQu55OxP3iYXA6KxhlxiIIz4tb3/Pq72DjyCRllYgGbGDBRKZfzHi0CmEYbESCmAw43Bs5ZOjjd2BG0zobyAMdp878/Rjplon0jEss9kkorGFXIcU452yVLt02yGqrWufptaPLzJQskZI8c/NtF4Xs+Um6opHdl/kwxPmoT/xLmI82qGPKEE8PH6gzS4bEGicoRSw4RR/g0sAgWwrIQQwMfPHeRciHMdqdQwYaT/uWYEcJT4z1jFrCFsIwuzzczml1ax6Mm36NKXcdmvXkPnUIVtnqHYujWulo3p3JY4FU0u0r6xhlxiIMx+u2tr6TrxBeArMxXkXngBOaNHx3e8KIhWr2VSIJKM2y02RDl7VvSdB45Be3ePt/LrQaEQl/uiUIjtu48cEfc3b17wvsJVmeusNuzdPeTlZGEo1qDs9eCm0QRNIDVJEXIc0zPxTkqk2qdOB9OWnmXXIaW3qQWAraCTaUvbKR1ZAdpqJmBkXIeJnDNr4GToNsm+UWo6nTiGCgsz4jcaEsrzTTbzg881kx8sAyqV+OmxvR20WnTgl+Fb9WZVcKvjLCuv3/ZlNnxtK7qiEQC0Tp+O4qWXvc0zALrt0DV9Oto4WzZ6JpBJhZT7S0XSQlqlOwQSpkLrqK/HZRdQ5qlRjRolVmajFQMRBI3LLhBK0LjsAdaQaASNDGQ8wElGoRC7AY4ZI07WDay/5+VkBS1zu8XlgctOnxb3s2pVbOL3vTMWjjd2UG+1c7yxg/fOWCTxGctBKpIihmKzDKurg5LZp/yWiU0tep9GqHUop1eTU6CDz1+Bj++DD/9X/P75K5CrC5kjrNWmqfhNw650CeX5xmJvkILAPOABmh8cVfe1VKNS+fmHPBm+ZZoy9p3cx4a/beD3R37Phr9tYN/JfZRpytjwjW1e8Qti8wxLmf+9aSnT0W1tS9plJJNUJC2kTbpDIBHsCV0nvsBx7hxdJ77A9v77sXl0IwgaZZ46WOS43eLygGVhBY1MZARwCrjssj5P5KlT/uPDUKyhUC0W5j1joFCdjaG4T3xFeloQ7klHndVGu+D07gegXXBSZ+2rbqaTCE5FUsRQSafwpVhZQOvBcX7LgppaqHXQUwm2TshyQWnvd1unuDxME420wtOV7o174b3fit+fWJgWIjgQTybvBTlaRig13F02l503/i0tY8k85zo+R8vIND9X6Ou+9sh7j7Dr81088t4j3LL3lvQUwQHoNDpmjp6J4BJw9jipb6nH2eNEcAnMHD0zyBscqnmGttlMTnFRMk87aaQiaSEt0h0CCSMGHPX1ojcXd28+uxtXeweO+vq+7aMRA2EEjWrUKJSFBYBCTP5BgbKwANWoUX3bp9B7mbFApAjPmFm7Vvy/94xNpVLBrLHakBYFiDxWkmmxSAbRNq6Q0mObimYZqcRsho93j0HjbMUWqanFeTNY80Tx68GaJy4fKPh2pfM05vB0pZv3w8jbO+ziuq2nxRzjWStlTbPw5PkCYiZvsqu9MeDJDwZE24PM1V7BKfDCsReo66jDUGBg+cTlUb8+gd3XAG/3tVum3CLnaUtCm6ON8uJy6lv6BEt5cTltjoCqbj/NM3Ly1GgOHxb/AMRpg0hX5GhyEcmjnKrGGv2STHtCP4JGoVSimTEjtM3Cc44pnHiUEcApJJwI9p3w5iGaseJ5IrF2rfhEIbACLJXFIplE8rrK0WlNDs9uOuKZqNbcpGTxnBKmLW3H6iqleImLj3eX0NykxGj0mSQ+TAfFAZXSYru4PBXEI0YT6UrnqR43HundRw98+JwY8ZaJdEsqngruZ5bPyFJm0ePq4bWTr/XFh0Ug6u5r/Rw7XuEtFUWqIhqtjX7LGq2NFKl8qrq9N7ineUbX9OnkW9twFxeh8aRA+N3ggwcpPcXRdqqT2hedEBHEgOT2hDAi2G/Cm+9+UzzrPmOBSDHh7BC+xDJW5LZYpBtydFpLBcnOOw6MAQ1sarG1RumXE9xyzixOeNPkQ48SWnq/5xeIy4UkV4HjtTIk0pXOt3rscojfPdXjDEklsILrxu2t4EZDNN3XQpEO1gmzzcyh2kOolWqys7IZVTqK7Kxs1Eo1h2oPYbaZg27wsM0z+u2GIx2pyOWVilR1qkuYZNsT5BA0MpKpAKcB/VWCPcQzVuSyWKQjqUiKAGltF3JUsUPicoCjHXO7NmIGvidbf9MGC5bmLo4+cx9zLzaTc9G1ouc3MAXiQ2PIiXCyEa+VYdZKsWrrW8WNtitdItXjDJKSSAUXxO5rr518za+C7Nt9rT9SbZ0w28wY/2yk2dbMovGLglMgbM1sfmkV1X+BnGYL3WWlqMPd4J4/BL2VYEu+ksKcQlRZ0s1ejbaCGsv+kmk1SOuEh0gk254gh6CRiYwAThP6GzOJjBU5LBbpSCpSG6QWrH5V7N5r8VSxJcsenj0S9ec1CK11bH6uGpNJFzEDX1dgpmbZKhqPf0LTeT3vfjSSaSuqKdH3kwOcTBEcrxj1dKWLx8ebSPU4TtTZ6uRm/CZCljppGb/xVnA9eLqvxWplSFR4J4JH/PabA1xpZtPLYg7wZ+3QXVbCs1dqWa+BkHdkgAgW1qzigatAO+pC7vm3H9Ox60VJRGZQBRW8FdRYLQNSi+loSNuEh2hJtj1BDkEjAxkLRBoR+PTA5Up8rAywJxJxkYrUBqltF54qti+JVLE9An3z65/y9IGzbH79U77zm7/g7Kglp8fEt6cZuXC0Obz1TzDD+6tQn38LQ1kzDmUp79qrKSgN2EDdG4GWp+8TwcmwQyQiRlV5YpX4mofF79H6d2ethPKp4iNDpUr8Hm31OIOkLJ+4nEptJQoUZCuzUaCIqoLrizpbzS1TbmHdnHXcMuWWqHy8iQrveIkkfkFMh9jwta106ctoKHDxo8s7+YQmjH82iraIUPSKYEFXzBtdn3DGZaG29QxHv/stmmq20vr88zTVbOX0TTfFbVvwVlB9ibOCmgo7QlomPMRKssWAHIJGYjICOM3wHTNHjkgzViKN+4EsfqEvtWH9NZO4ec4Y1l8zSdZWySC9YJW6ih1KoB88B892/T+UGj2XVpqovtGIriD0m6Kjw4zw7ipoeguALP2XmXTzz1h1jy50rq9aR+vYaly5PiK4yxLXuUdNKsSop3q88EGYdav4feWfohfQaZg/nGrizeL1VHBXz1rNsouWsXrW6qgnwCWCFMI7Vix2i7/4/fJGdELot29d0Qgu+9Vr7PveVykyXMAZ6xlqz9ey6eVVmNsaQm5j1sDaq+DJq/WUFY2kyjKdvCMnJROZUlZQpRTT0eJJeBi+toqSG25g+NqquNs0p5RkiwE5BI2EZCwQaYhnzGzbJk66lGKsDJAnEnGT7NQGqQXrirljeflwvZ+lIpEqdn++6BNtaphbjfJDI+p+LAuODjMf/95IlsPC5HFlqEonw4xtlISxNZjNYNygY8KYalZfZUSpMYCqMPoTjifNIRErQyJ4qsexkoIECcEpsGzXMkDsNBe1OOwR4G1xO+bvki3OLNEkB08FN5nEa52A+NMjCnMKMQwTxWL1lzei+6/feNsjh3qEoysawYZvbMP4ZyOXlF9Cl6mea558i3f++DWxPbJPkwxvZVlpRV84kuqrqnE++j+0Suh5LbnxRtpefdXPthBvBTVVdoS0SnhIhGSLATkEjURkBHAa098TingJHPcVFWK6yUAXv9Ei5aQ1qQWr1NnDYQW6x7Lg8e0eXuM3qa3H+RlZDjMm60h27nucdffmUqrW9nMk/8nmoKNtXA0lwwvFqmw0JCIM4xWjqSDR/OFBSKonlMVLPMI7EbGvylKxbv462rvb0doRxa/PxLWQIlijo2ZBDYXnu+h5popjHWAyNfPAntVUTr4saOKcr62iRWKRKWVGrpRi2kOyJ9WlnFSIAakFjQQo3O40PKs05Pz58xQVFdHW1sawYcNkPZanecvZs2L0ntTjUe79pyOhJq1NHjEsIauElIJaaqK6XsEsit/PXxG7uVnzxExfTT7CmGsx7nqYE7XhJ8oFRqnFFSe6/zExwsxvMptStBcMJmH4+hoxrs3l6FumVIlWimseluWQ6V4B3nJgC7s+3+U3oSxbmc2yi5axbs46WY6ZKnYe3ckj7z2Cm763XAUKVs9aHbvYj/bG81lP0BVTdUUPfzD/HcElUF5cTqO1EbVSzaLxi9i6YKvXUxxqolnupElp89hfSsEa+lorZZ1UlzYkQwykQHBEq9cyHuA0w7dz4dSp8rQj9nz4mz07teI3mbm3cmQFe2wXD1w7le/NH5824hei9EWHaW2sVlWyfqMubEyoJOIX+tIcfBmM0WIpSJBId1I1oSwVeNIjfIk7PcKT3hDDDap+eBsTp3wpqvbJ6e559dgR9BvupfS7303ovFKV8ZsWuci+YuChh+QTv3IKmgTIWCDSiFBtu8eNE59QrF0rvVhNZe0/abm3vaQqKziVROWLDtPaODAmtGqti2lLz2J1dVCsLODj3WNoblImJn5h6AjDRPKHBynxZvEORCQX+wE3qLuqitbp0+m2tpFTXESJp9Obzw3a9kWU7ZMZRJ7XCKQi4zcVUW79ctllohj4r/8SRYdUIiPZgiYOMhXgNCHUWIG+MSPlByfPsf71r9R9GEt297ZUZAUPCCK0Nva8x5YNd/HHA63ct0HJb//Ywn0blPzxQCtlw12Jd1EdKtFiiSZIxIFgb6Wu8SOO1x/kqX13Ithbo96utukjjp+LbbtYSVWSQyqQJT2i9wZ1l5Vh27sXxYb76Nz5OxQb7sO2dy/usjK/T6dRtU8eYqRiUl1adZZ75x245x44eFB6kZEMQZMAGQGcBvQ3VjxIOWbS5YmE1DFikUhFVjAkv71xfzgc4v+1/8mFb23cajLjcIjvndOWnsWW3UlPRy7mv1bS05GLLbuTaUvPJiZ+ISXCMGXEmz+M6Odd8uwSljy7JCgqTHAKQV/W9gZufWEBX3RbaHDZ2Na0n5ufvRxre0Pfel1WhC6r6Pnt/RI6Grh91wJOdls457KxvXk/tz13OUJHg9969AQ8su0R4O9LxK/A34UhnizegYhsYl+nEyu/doFsp4PhDQ1kOx102wVap08Xb2CHg5a645HbJ/tisYh/OFJAMu0Bqcj4TUWUW0jkEATJFDQJkrFApJhIY8WDFE8P0umJRLIrslKnLESD1DaPeCfdORywZUtAapKne1uXGUK0Nu5uN/PxU0betVez6h4dVlcHJbNbMP+10rvfktmnsLpKQxwwzkizwTThLcl4Jrr5Utf4EV90WwAFbqDWXE8tbr76xFwM5ReLK5kPArBn2mzvds1NH7FSZcGN+MdoS3Y9Ctw0vz6X0cMv9j9Ikrq+DRbiTY+IFJ3WbW2js0zH8Ia+nF9LmY58axs4HHQ+cC9HD75C13Vj+22fbPyzsa+5hsc/bDDAunWEDv/uQ+5JaXLaA6RMqIiWtOgsJ4cgSKagkYCMAE4h/Y0Vl8tNndWGvbuHvJwsDMUalL1Vy3jHTKQnEskeh9HGiEmZtJDsrGAp2xsnIqbb2/1Tkx56wExpbW8EWp4+KAe45ZyZo88YUbtNzM0z0tFSTbGygNaD/rNpWw+Oo3iJy/9gKci6zRAau1NAAfh+zFT0Lg9Hf40oom1QkUE6oo1OyykuIrfZv4KrbTbjLi6ipfE0Rw++gtrcyu0vwpTHf0HpmIne9cyVfR3mjH828tClqynd9Ign11D8A6LtPwZRasEqZdvkaJHa7xzpA4EcUW4xIYcg6GefbpcLR309LruAMk+NatQoFEplWojgjABOEeHE73tnLLQLTm82talNYNZYbdwiONonEskch9FUZJM9Uc5zTKkEt5QT7xIR01pt31wZm0UUt3MvNpFTFCx+zWYw3q/DZqnm9nnieq5jRk79cTMaZxa2gk5KZp+i9eA4NM58Pt5dgnmejwc4k3WbEnYt2xW07Kl9d7KtaT+1ZnHCk6HMgBK4u2wuKxZtF1fyWBV8xNSBfXeyvXk/W7LF7Yw9BhxucbsJ87fLeh0Z/IkqJ9lspuTwYWx5arrtYuVX22wmJ0+N8l/7WVdykKbrxnL7izA3eyw5mx7x8wXrNDqqr6rG+GcjtoazHP3va8X1Ro0R1wsjfkF6wSr1pLRkZ/xG84EgFVVnL3IIgjDi1/b++7jaO7zNNhyNjWhmzEgLEZzxAKeAcOOvzmqjXRBvfI9uahec1Fn7RFMsFppYn0gk05YTKUYs2RPlPIJ78+uf8vSBs2x+/VOu+9U7cft2pbR5JOqZ1ungoY0Wbp8nVnbf/UhPy+gQ4rc38UGj1THlJrG18bEPTSweuZ7lX3KzcZOLWxeXsnGTi8VzSmhuUvonMA2VSLM0Q52tDvpaceWjVJINuFHgRglMJocVVz7at15uMercYjHnt/fr+iseZZw7G0Xvdg43jHfncP0Vj/qtJ1c2cIY+Ikan9d60iuZmNFdfjXvTRvJv+Q7uTRvJWnAFn3/2TxY9+RbD84cz5fFXRFEbIjZNp9Hx0KWruf3FM6jNrbzrPEPrfVVRzW6V2s8qpT3AI0abarbS+vzzNNVs5fRNN8nqKY52gpuUUW5RI4cgCLNPR329KH5x9xZE3LjaO3DU96WQpNITnBHAScbtFjsCnj0rNl8JHH/27p6QH8js3T1ByyoqxP1s2xY60ixclfmspZNjpvOctXTicrm9+0wTbzqQ/IlyUgtuKSfeSSGmS8sLmTnfgKDQ8+v91azZoGXbntPc/8oRtu05jfGeLjosFm9qkjtHh/H5akxWPV1ZBu7fVMSqJRU8cO1UVi2pYGuNkvEGC82Njr7306ESaZYCYk10UOeV8MSyN7ggR8sIpYa7y+ay88a/oc4riWq78TlaRsawXbKSI4YSYaPTzGZc96ylu74W9HoUW7eivesu9BvuRXvXXWQ9/Ag9w8vQd0D1X6BUUwrV1Qi6ElwN53BXVWH55S8xbXoQyy9/ifanNczNHougK+HdH36dgpEVUZ2j1H5WKSelpSJtIW0muAUSpkrbXVuL8Plxumtrcbt6n9xFIwgiCBqXXQhZYXbZhaBlEQWNDGQsEElGoRDbYa9dK3YeDPwQlpeTFfR/73aLywOXnT4tNlZZtSp4jCXTYiEXyZ4oJ3VWsJQT7yRpvaxUkf9v65gypp3cT4v544FWdh1SUjK7hfb38jDOvo85c1uYevNDuNH1VoN1vO6uYcMDheiG+0+E0RWYqbnRyBv/NPDkgXUYjSqqN65EV57Juk2EUF5bwd7qTXRQANua9rP32ct5YtkbQcLU1xuqzivxTnhbsWh71IkD6rwS74S3CfO3+1d7QyQ8CPZWbt+1gJUqMWpke/N+9j4X+vwylePo6TcnufQKXPes5fgn/6SxQMGUDT+nNKBaqyofwbQnXqPnnrWoza1gNNKyYTUPXulmxTPnmLj3EIqXXqazTEdusxlbnhrN1Vcz7YH/Zt7IClRZ0bUyl9rPKqU9IBUZv2kxwS0QuSwKEQSNMk8dLGbdbnF5wLKwgkYmMgI4BQS24fYdM4ZiDaY2wU+gFqqzMRT3iT63W9yuv7bd8VosxmjzgZTbcrxIIvpiQA7BLdXEO8nEtFJF6Qgt05aeZtchpTfWrCSvleFFZxk9pon8E0aMz1VjMomd4DZs0gY/Ce1NkVC7TSz8d/hLXTsn67QY78uj5sE30J6MMQUig5e4Ex162fMtmZMZ3g4+v0xyhDx4otP8UiDKrkK9/n66z9XTWKDg19eNRfPBI1Trqv26uYEoglUP/wyMRrrrz3L0e9diWjaWx+fm8dMDdjTOHm9yRLcduqZPRzt6QkznKIefVapJaakQoymf4BZI1BYF8b3PY1HIGT1aXCmSIAgjaFSjRuFobPQT2MrCAlSjRvVtH0nQyEhGAKeI/saMUqlg1lhtyBQIiDxWfJ9ITJ3av8XCV+eFs1gcOSLub968pH0o8xKt6JNq4lqyBXesSJliERhr1movYVvHjUxT/J6KHhPfnmbk91SzfqOuX/HrSZFQX1LNhilab2pSoTYPygfghLd44tuSRLyJDsliICRHRBMnlo4ERac5HGAwkANM2fBzNB884k1w8MaY+aLT0bJhNUe/dy21w9wUlRr4z4bhdGib0YSKTYuDdO0aJ4cYjTSpLqUT3AKJIAi8FoUAQdCvRaE/QdCPoFEolWhmzAidAuE5vxSJXwCF253KhrgDh/Pnz1NUVERbWxvDhg2LvEGUROtJh+jHSrh9nrV0cryxI2ibCeUF3gpwLMdKNaGSIiaPGJb0rN2BxrY9p7lvg1gB9pBV0MXWB8zcof8VLpuJ7iw96tn+E+UCxa9vioTFAoWFESND5SceIRsqvq18akri20KJxqgSHXrxFXWCU/BWlHct2xW94OsR+iq983dFtEA8FSY5IvD8UmGBCBUnVqmtjNiIIm1Fs8PhjScz2/pizPT5+iAR7Pl9R+NZikoNPLioBuUTz6LYcB/Zzr5GF85sFe5NG9HedVcqrkg25M4ozp1UmZoWxtESRhB019bSdeILAj9a5154QV8FGKQRH4HIKDKi1WsZARwlcglgiG7MxDpWYvEAF6qzvR7geI6VSh5/+ySbX/80qKK9/ppJSc38HUiYzVC1VmxtbMv2jzVbPKeEhzdZ+nKCc3VBTTLoMofMD04L4hWy+x+DN+7ti24DsSXzwgcjx7cloXIs2Fu5+dnLedN8GgUwumw0k8mJanJaMhDsrdz23OX8QHUagJ84RzPeLc/5xSNKdx7dySPvPYLb541egYLVs1b325giXtGcCnxFcJmmLGSjC684toG7qgrb3r102wW/2DTN1Vej2Lo1wd7mg5eWHTtoqtkaVDEdvrYqLSvgXmLwACsLC/o8wCCd+PBFZpERrV7LWCDSgHCeYIhvrMhlsUg3pJ64lmySXXH2RJ01NylZPKeEaUvbsbpKKV7i4uPdYqzZPffreOiBakrPrIHPXwHbM2DNg2K72Db5omvTU/xC/DnEnvg2PwEcRXxbkhp/eJIZvvrEXOxOQaysXvloWohf6Du/5tfnIvSe3/VXSH9+0TaGCMQTJ+bJ0oWAOLEQRJXBmyZ4snyr3qxi38l97D6xm/LichqtjaiVahaNX+QVv76xaV3Tp5NvbcNdXITm8GEUzc3iHwifnGCpSXYur5SkYlKdJCTToiCHoJGJjABOE/obM4mMlXAi2Nfu4CGNxmXUJDspAqQTrclu9OGb8ytGnSnR6Sr6fj+v7/f33K/joaWXUGp7BrJcUNoprmTrFCvC6Sh+IX4hG298WxIbf8Sb6JAswiZHSES8ojRsnFg/xCOaU4lOo2Pm6JnsPrEbZ4+T+hbRjiIgMHP0TK/49fwBUFRXo/UVub5/IGQSwXK0OU6moE7LhIdoCSOC/ewOHuQQH2kmMjI5wGmEZ8xoteIYcbkSHyuB++zP8JJm4zJqpMzajQYpm2Uks9FHsPgNfm/T6cTlen2vCP7lPFobRvivZM0T7RDJwmEX7QmvrxG/O+zh149XyM5aKVolFEpQqsTv0cS3ZRp/JJWIjSH6YfnE5VRqK1GgIFuZjQKFGCc2cXm/28Qjmj0IToGdR3ey5cAWdh7dmbTJgG2ONsqLy/2WlReX0918LvY/AAHNMqRA6lzeZDe6kDKjOCUkUxDIIWgkJlMBTjM8Y+aOO+Dvf4cLL0x8rAygJxIxI2XWbjQk0pI4EKntG0GV6dkjUWPD0qmN+N7nQVdooXpzIcb1Kmynsvm4eyxze5rIyeqdLFNsF73AySAee8GsleI6seYQq/LE/cbq5c00/kgq8YrSkHFiEbzD/WbwhhHNEL9NQwqKVEU0Whv9lnWda2Dha38HpxZX+XDa7quipN8/ALq+vum9Irj1p/egKR5Ox64X0y6XV+o2zJFIq4SHeEmmIJBD0EhIRgCnMVJOTxwgTyTiIpp4MKlsC1KKVintG4F2CoXbgfqzB7lxqpLCaQ9hMIhveKHEr3dCuUZMeNBpDDx0/w84+ux2yrGS7XZBS74ofvMLIOszWk1mCkp18iY+xGMviFfIeraN1bYQr+DOEBfxilIIEScWxfqximZIkXfY4aCl8TSHag+hVqoRELweYGdeLsfVNsblVvDfS0o5fngr1aXV6ARl6NgWHxHcWa7lnnc2kffXA6x8C1TK7IRsC1JbCKQW1NHYKdI18i0mUiEI0jBvISOA0wzPBEqnE77yFThzRrpmFL5j/pNPwG6HvDwYNWrgit9okNJrK6VolTJ3OLAyXZRlJ7urnnMNTsYojaz7STXt3Tq0Wv/tHA7YsgWsjWaqbxAbW9AjUNq+lrmXtpKtmYHSfZNfCkR3u5mPnzLyrr2aVffIKILj9fPGI2TjJRHBHSPqbLX8TS4SIUste5OLeEVpIseLVbQm3TvscND5wL0cPfgKXdeNZdH4RUEpEDvKG9nnctDpasAqWNn80iqq/wLqigth3bqQIrjl/irWH3yI0yc+YFinic7sMoq7xV/HW2WVOpdXSkEthz85rUmGIJBT0EhARgCnEaHSQ6TuyHbZZbBiBaxZAzYbaDTivpM9FpOZfiClbUFK0SqlfSOwMt3WU8ijjd9lwvAXGWM3oTpqRHtJNeBf/m1vF8XvIr2RYx+amDi1GDVAdys5w4KjzlrOmTn6jCiU5+YZ6WippkQvkyVioNgL4hXcSWq8EXMWcLgMYInPKx4hG48oTSaJeIfjoaXxNEcPvoLa3MrtL8KUx39B6ZiJ3t+bK8WItPpOE8XuXAzdahb97i2OdcBEQN2bJ+yL2WbG+P5WTF1N6OzZ/PCI3it+gbirrFJbCKQU1Mm2U0AaJGLIKQiSIWgSJCOA04T+ovOkHjPvvANPPQWlpZCfD2q1+PO0ackbi8lOP5DStiC151iq7m6hKtNm5zA+GX4PM/N+LWb6fmgMErRajVj5PfahiZbzxRz+AGZOtZJTFCx+zWYw3q/DZqnm9nlG5l5sIueMEYqjjESLVfANZntBkuLT0pVU+mTlJh6bRrwfBjxC1XbdWG5/EeZmjyVn0yN+XidPRJrxz0ZsDWdZ/oeTFLe7MBUq2XElrFe7/D4WBzbWWGNYSI/9V/g1S0jAtiClhUBKQZ3siLO0qDjLJQiSJWgSJCOA04BIudFSjRnf40yZ0rc82WNRyopsNEgdlSZlS2Kp6K8yvexL06Gnuq972+E1QY0t1G4zE6cVc/gwZPVYefcjPVNuqqY0UPx6J9LpmHJTNTmeZhkfGuHSGsjV9n+C8Qi+JNoLkk4S49PSkYGUsRsrsdo04v0wYLFb+oTqiDFMefwXovgNEWOm0+h46NLVHP3va1G3nMdaOoxXVkynNstK1ZtVYRtnaJUFnP7j3yRtJywlUgnqZEecpaLi7IdcgiBZgkYCMgI4xUTbOTDRMRPuOMkei8luXiGlbSFdCVuZVunEau7h/htbqC/ZwsWa33Do7Tp+vb+a3E+1TFt6Gqurg2JlAR/vHkNzk9KbIlGq04G2V1hrDKAqDH+C8Qq+ZPp5k0m8/uZBwkDL2I2VWGwa8X4YKMwpxDBMFGfVV1VTqvFPcHBXVdE6fTrd1jZyiovQHj7M3OyxvKuDf/3w62y4YhXr/7o+fOOM3pbKAz75IAqk9idHIqVNNeQSBMkSNBKREcApJFy74lCd2uIdM+n2gSzZzSuSHZWW7O5uHnwr055kB7WnKKvubWncX2MLzQi6LljHRSPayf20mD8eaGXXISUls1toPTgMjbOVxXNKeptn+Ozz0hpR/CojzIQb4oIviIHib5aJZPtk05l4PwyoslSsm7+O9u52tHm9N3pvgoOn1bHipZfpLNOR22zG1tvqeNoD/828slGobEL4xhmavidASrWa0q9/PXRqhIwk0yOb7IizlDXVkEsQhGm3HLLTXBqI4IwAThHhxO97Zyy0C05vKompTWDWWG1cIjgdP5BFW5GVUkgmy7Ygtb85ntfAk+xQVxcQe3beLFZ+PeIXvI0tRIuDCoNBy+Qlp9l1SElPRy7mv1YCYCvoZNrSdr/OcUB424MvQ1zwBRGnvznmCW2AYG+lrvEj7E6Bp/bdGbGFsmBvpbnpIwSnwIF9d0ZuaRzHpLlE4swGG4l8GFBlqfrErwedjtbp01G89DLZTgfDGxoA6LZD1/TpaPUV3j8Q3dcPp7y43Ct+QWyc0eZo89+nxwNlMIROjfBBKtGaCo+slP7kSK9DsivOgHyCIIz4tb3/Pq72Dm/MmqOxEc2MGWkhgjMCOAWEG4N1VhvtglgJ8BRJ2wUndVabt31xtGMmWRXmWImmIpvsiXJSiW0p/c3xvgbt7aL4DbICDtOJtgdfiu20uEd5/b0AJRfYKZnd5BW/ACWzT2F1lcZ0/n4M5glt8SCDvzlUtzHB3sqtLyzgi24LCmBb0372Pns5Tyx7A3WO/7HU2WoEeyu371rASpUFgO3N+9n7XO/6gSI4gXSIZMeZpTNyfBjotrbRWabzil8AS5mOfGub3x+Ihf/zCY9NbwCfl73R2kiRqqhvge8EAOgNDQ/9wVdK0Sq1RzaZ1eRoXoekN9WQq0IbRtA46utF8YvbK2hc7R046uv72i+nUARnBHCScbth2zY4examTg3+AGbv7vFWfj0oFOJyXxQKqKiAI0fE/c2b57+vZFWY4yVSRTaZE+WkFNtS+pvjfQ202qBmTjz0gJnSrM9Ez6+t0+sB7s4t5ugnH2OzmNHrdVRXw+/359F6cJzfPlsPjqN4iaufI0bBYJ7QFi8S+5s9lWFf6ho/4otuC6DADdSa66nFzVefmIshy18w75k2m+amj1ipsuBG/IOxJbseBW6aX1CQYiMAAIIRSURBVJ/L6OEX++88wczfdI8zSxZyfBjIKS4it9m/jbG22Yy7uMj7B0JYswrHkQ95oKGb+6/JQTVqhNcDfKj2EOZKMzobwS2U+xG/IK1oldIjm+xqcrSvQ9KaashVoY0gaFx2gVCCxmUP+LAeSdDIhFL2I2TwQ6GAVatgzBg4fTq4OUpeTlbQMrdbXB647PRpcT+rVkUnfiF8hdn3HMeNE7dfu1bcX7LxCElf5Joo5yc0XW7c7j6hGStS+psTeQ08zZz0erBZxOze7nYzXHQtTNsIl3yfljE1vNvyNdQ0cfs8Iw89IL5hfrx7DBpnPlkFXeiu+Iysgi40znw+3j0Gs+97qsMO+x+D19eI3x320CfjwSP4rnlY/D6UxW+SsDsFAt9GFL3LQxGqihxueQZp8HwYWDdnHbdMuSWi+BWcAjuP7mTLgS3sPLrT///HbKbk8GFy8tQ4s1U0jRiBM1tFTp6aksOHwWzGrAHjldBYCFN6dLxyeAo/MHyTTV/dxKLxi2i2NbP5pVUIa1ZF10O9F69o9SVO0SqlRzZIkLrdXkEqB1K+DgkTdYXWBbi9FVov4QRBBEGjzFMHixy3W1wesKxfQSMjmQpwCgjXittQrMHUJvhVaAvV2RiK+wRUuG6Fyaowy00yJ8pJWbWVMnEi0ddApxMrv57GFfs/LOeTi+7ERI432aHLavFm+rqOGzE+X01zk47Fc0qYtrQdq6uU4iUuPt5dQnOTss9SUTS0c2zTkV3LdgUte2rfnWxr2k+tWXxDM5QZUAJ3l81lxYKf+a+crebAvjvZ3ryfLdni+sYeAw63uP6E+dvlvoQMURA2Ns3aAUYjiuZmNFdfTdf06eRb23AXF6E5fBhFczPCmlVsvhJOZFnZt/LLYkc4s5XJzzfQOl3PV1rL+W8+Y9HfPuRYJ0yc8mXUUYhfkFa0SumRTXbiQsomuAWSjAptGEGjGjUKR2OjX4VZWViAatQo/3OUq/1yBFJaAf7HP/7BkiVLGDlyJAqFgt27d/v93u1289Of/pSRI0eSl5fHV77yFY4ePeq3TldXF3fddRc6nY78/Hy+/vWvU1fnP6hbW1v59re/TVFREUVFRXz729/GarXKfHXh8YwZrVb8v/eMP6VSwayxWiaUFzCqOI8J5QVeewJEHivJqDAngxVzxzJ5xDAUCsjutWYECknB0cPjb5/k/leO8PjbJxEcPWH22D9Sim2Pv3n9NZO4ec4Y1l8zKW7fcjSvQVgEM6W1ori1U87/e6GKqvt1/PaPLdy3Qcmf/tWEVgdTbqrGlavn2IcmFumNXDjazNYaJauWVPDAtVNZtaSCrTViBFqHxcK96xyY//xMX6yZyyF+98SaZZANz4S24/UHeWrfnQj2Vu/v1NnqoK8VVz5KJdmAGwVulMBkcsSJcLnFfl9kqbn+ikcZ585G0bu+ww3j3Tlcf8WjoufX98vnnGqbPuL4ueBzyiA9gbFpbtx8ZvmMV959AoxGXA3nEHQlKLZuRXvXXeg33Iv2rrtQbN2KoCvm2NG3WPTkW1zYU8z6b25D/fA2hJJhdO59HcWG+1D//g/89OdH0Z02Y8oXK8XmKP8Ultx4I7mTKsU3jOxsUCjiFq0ej+zwtVWU3HADw9dWUfHM03FZFqQWpC5BoGXHDkybHqRlxw5cgr9glPJ1SIhkVWj7ETQKpRLNjBnkXngBqpEjyb3wgj57hWe/KRK/AAq3O/Dqk8fevXv5v//7P2bMmMF1113Hyy+/zNKlS72/r6mpYfPmzezYsYOLLrqIBx98kH/84x8cO3aMwkIxd/SOO+5gz5497Nixg9LSUn7yk59gsVg4dOgQWb2PIK6++mrq6ur4zW9+A8APfvADKioq2LMneg/b+fPnKSoqoq2tjWHDhkn2GkQ7KRNiGyuxeIAL1dkxiexkEW5iWijf7uQRw+ISm1LuS2rinpzXZYEP1oqNKvL0/Mp0B1X36+jpyAUgW+lg7VU/4+tfPcfIL/03Dz4Ii/RG9MUmJl6iRz03uLGFpw1ybYuBtz+4igcvvhVdXmPfCkoVzLpVtDikG/G0HU5Sq+JQhJvQ9peWMygAg85AJdkhJ6j5PkK3tjfw1SfmYncKrK5cHDkFoqOB5tfniikQRYv7UiB6Qp+TOGlOtAsZnQbGuUOfk1wtlUMRT2e1eLuxJZstB7aw6/NdfrFpuk742Z/UXNIznA8w8fsbJ7P+m9v8oswsdgubXvz/WPTkW+g7eiu7D2/DrIENj3ydFb99n2nN2V7LjC03i5/+f1Oom1CKPl9PzYKa4MSJEKS8vW8/5xToAc6dNCkuQR16X5VBfuK0eh1i8AArCwviF6lyCZoYiVavpVQA+6JQKPwEsNvtZuTIkdx9992sXbsWEKu95eXl1NTUcPvtt9PW1kZZWRm///3vueGGGwA4d+4co0eP5vXXX+c//uM/+PTTT5k8eTLvvvsuc+bMAeDdd99l3rx5fPbZZ0ycODHk+QQilwCG6MZMPGMl1hSIeI+TCh5/+ySbX/80yMqx/ppJcU2SS1V2r2y4HHB0C9jq4JJq7v+Tid/+scWb7FCS18oj31nNJSM6MTdcyK/3VzO8HKpvMKLWGmDKOv9sX8EMHxrpbjPx7kd6frX3TgqsH1Fz1f1o83orfgolLHww/RpXhOpCVz41vF0jnm0kZMmzS4KW+U5o68PNBTlaDOX+E9T2fKvvw33M0Wn9xZr9Pficaps+4mR336Q5EKfbjc/RSj5pLlpCWQQqtZVhO6vFs02q2Hl0J4+89wju3tbEwzqc/PiFRmYrxlI2bhrGK92cyLJ6O7l5RLCjx8GWt7dgrTvhtT0IumLWXgWfnvgXk99v4L6/9aDqnevaNGIEwrev578uNWMYZmDd/HWospKXASw1UgnSlh07aKrZGmQbGL62KjkT2uIl1hQIkFZ4+CKz0IhWr6XtJLhTp05hMplYuHChd1lubi5f/vKXeafXhH3o0CEcDoffOiNHjmTq1Knedfbv309RUZFX/ALMnTuXoqIi7zqh6Orq4vz5835fctGfHcJDvGMlnM1ijDafifphjNHmDzjxC9JPkvOkUjxw7VS+N3/8wBa/IIrXKevERhVqHcXKAr9kh1Z7CcYXH8SZXU75MBO3zzNy772Ild9+xC92EzlFYpvkgoppGEY4KcztFNdVKNM31sy3C120do14tpGZWCe0JYN0nDTXn0XghWMvSLpNqlg+cTmV2koUKMhWZmNXZ9MzagQjLpiO+uGfsf6b29Dn6zF1mjD+2YjZJs5c9TTO2HDdz0Xbg66YN7o+4YzLwgUKLcZ/4hW/IKZGjCgZSc2CmgEvfqEvcUG/4V5Kv/vduKuxaTXBLRbC2BRyRo9GfdEEckaPTtyeIJegkYG0nQRn6s0cLC8v91teXl7OmTNnvOvk5ORQUlIStI5ne5PJxPDhw4P2P3z4cO86oaiuruaBBx5I6BpiIdBHXlzc5ye3WuMfK+Em3PmSRmMyKpLdTQ6krRInpeKsVEGuFrPZk+zQiq2gk5LZp2g9OA57+2ge/9sveOiG9YxzmsipNYrtjfsRv+Tp4ZJqStU6ah6GQvVNqD4UUhNrFos9IZ4udPF2rpPINhHzhLZFSZigNj/4nJIxaS5Wa0I8ndXi7caWCttEqNi0r9/0DbLtDtBq0SG2Rjb+2egVwZ5KsKdxhtltZtNVcMalZ5xCy5YTRbhyTtHdI2Ap06FtNpOTpxYnznV+C/LkEb9S2gSSZTlImwlu8ZAsQSCXoJGYtBXAHhQB/zlutztoWSCB64RaP9J+jEYjP/7xj70/nz9/ntGe4GaZ8IyZO+6Aw4fB5RLHyoQJiY2VSGN+oIlfkDZtIRqkzApOZpMPT4Z9c5MyZLLDqXol63dVU31Dr8g9vEZsjXzeLDbOyPoMusxe8YtafJwqRoFKm2MbNaHsCeESKOLpQhfPNrGeVxhCiagVVz7K3mcvp7bXcOA3oS0Zj+lDeHivv+JR9j53eW/KMMGT5hIkbOJBP9ccT2e1eLaJ59ykImSGss8Q02l0fiK46s0qZo6eSZujjSJVEYdqD9GstHKhWyvaIVrbcfeTGuHfTUc6pMzmTWbOb0o6uElJsgSBXIJGQtLWAqHX6wGCqrRNTU3eqrBer6e7u5vW1taw6zQ2NhJIc3NzUHXZl9zcXIYNG+b3lWykTF7wfSrxySfw3nvQ2jowxS9Im7YQDVJmBUu5r3D4NnDS6+k32eFErQ7j89UIbh18/gp8fB98+L/i989fgVydn/hNObHaE2atFP27CmX0do14tpHZNqHOK+GJZW9wQY6WEUoNd5fNZeeNfwvfphhRLO351h72fGtPdMIsSy36db+yJ6KI9ZzT+BwtI2M4p2iJx5oQaBFQoIjYWS2ebdLdNuERwWWaMvad3MeGv23g90d+z4a/bWDfyX2McxZ6vcDo9SFTI9Dr+7rp+IWAJ46U2bzJzPmVMp0iZQTaFCwWOHRI/C6XIEh2lFQUpG0FeNy4cej1et58802mT58OQHd3N2+99RY1NTUAzJw5E5VKxZtvvsny5eIfqoaGBo4cOcLWrVsBmDdvHm1tbRw8eJDZs2cDcODAAdra2rgszdSexzvudMKll4qpIxUV0NYmTVe2yy6DFStgzRqw20EQoKQERo0aWOLXQ6RuciCd1UDKrGAp99Xf9QWKX98CjsMhdjP1NMswGntF8GO3Uf3lF1HnuqC0U1zZ1gk9lVhsOgqzQJUONsBY7QnxdKGLZ5t4bRMxoM4r8U54W7Foe1pM0FLnlXgnvE2Yv13StId4rAnxdFaLZ5t4bRNJofcm12l1zBw9k90nduPscVLfIlpVNJ02bv/HGdRObd8fCKVS3M5zk/v+gfDpq+4qKJDEaiBlNq/UXeMiXV/SOrjJidwVWrkFjQSkVAB3dHRw4sQJ78+nTp3igw8+QKvVMmbMGO6++262bNnChAkTmDBhAlu2bEGj0XDTTTcBUFRUxG233cZPfvITSktL0Wq1rF69mmnTpnHVVVcBMGnSJBYtWsT3v/99fv3rXwNiDNrXvva1qBMgkkGoiZNabd93KVoTv/MOPPUUlJaKY7C9XbQyrV2b3HGYrMQFKa0GUnqOpdpXqOt79fAZfv3Nqdz3QFm/4nfLFqir61v+0EYL6+8v5MSHWja/uo4N39xITpZD3MCah7nWhvF3YDDAunUyieBYvLPx2BPiaTsc6zbxnFeGsMRjTYD42izHuk28tgnZPcMBN3mbo43y4nKv+C2xuan+K+S4WnBVVtJ2XxUlIL4RBN7kASLYXVXFxy11KI7XolJmJ2Q1kNJLK9W+kt0y2XPMtIhLk7JCmwxBIwEptUC89957TJ8+3Vvh/fGPf8z06dO57777AKiqquLuu+/mzjvvZNasWdTX1/PGG294M4ABtm3bxtKlS1m+fDlf+tKX0Gg07Nmzx5sBDPD0008zbdo0Fi5cyMKFC7n44ov5/e9/n9yLDUN/qSG+3xNtTex7jClTYNIk8W9baakoipPV7tgj2ja//ilPHzjL5tc/5bpfvRN3E4twSGk1SLgphQz7Cry+LLeTr/Y8jvVf/8mEMeaQ3Uvb28X3RU9Bp+WcmdKza3n0ti1cNKaRb8x7kWxlXxVFKHCx+cUFmEzidu3tMV9uZDze2Tfuhfd+K35/YmH/rZXjsSckg3Q9rwFMPNaEdD03j2f4kfceYdfnu3jkvUe4Ze8t0idmBNzk5R1ZNFr7bIDtufBFXhddOi2PLCll41sb+1oeh7rJffqqt7SYqC48yG8mm3H0OBKyGkjZLEKqfSW7ZbJHcDfVbKX1+edpqtnK6ZtuCmqsIQuBFdqSEvG70xm/0PDdr5yCRiLSJgc43RlojTCiOYbnfz6ZHmCp83vDcf8rR3j6wFmcrr6DZSsV3DxnDA9cOzXm/aVbCkTg9RVltbNuxA4uLROYMGYCbeOqKdEH+3Y99gibxextg5xTUEyX0IPq7J9Q2jvAmodQ4OJYeyUm58XsMz3E+o06qefBiOx/TBS9ftaBCJnCKWxSERaZG27EnOkbzzb95QBLsP5ga1ARy7kF5vcCKFCwetbqmKvVEem9ybvrz7LfeZofzm/jnKab8uJyGq2NFLhzWaT7ElkKBUt/d8CvMUZ/N3lL3XFW/eZGahuPo7Mp+fGHwynuzoLsbEpuuAH9hntjPs10S4EwbXqQ1uef97dSJHB9kUhZpnAoUeB2932PVxQMsEYYaesBHgrE2qjC88EplqcH4caj59+x7jMRpPS/RkLqqLRoPMfJ3Ffg9bX1FFJjuoVnRr+CsstEyRkjFAdPXtPp4KEHxK5uareJ944UM2M6qJXtMPHr0FOJudbG5hcXsOjiHeiLG6n+shF1QTUggwKOxzsbj6UhGcR6XjEmR3gmtKUVnklzEYg3NSEeO0OyiOXckuoZ1ulo2bCao9+7ljyzlcfeLubE2pU0FvR4UyA6TfV87w8nKW53YSpUsuNKWK8JfYebbWaM72+lsaAH3eksVn2oE8UvJBQBJqWXVop9JTviTErvctREW6GNVRTE2mgj3uNISNqmQAx2IrUqPt7YQb3VzvHGDt47Y8HVW+WL5elBtB/GkvlEIlpRKjh6ePztk9z/yhEef/tkXBYJKW0L0SDFOcdCqOsbMXw0FVf+Qowts5vEDF8hYPa2YKa0Vqz8OrOK6bLDZx+18nFzPjWNK9nWegNVf76fE13/zj7TQ2JrZHc/+5KCoeydTcOGG3KR7qkJchOvnzkezDYz93zwCL++biyCroR52RWsfPoY/+9gIdf9sZV1pyZw+x9Ok99yHmtxHru/M4cTWVa/xhm++/LEqY2eMIO19ssocagSti3EgksQaNmxA9OmB2nZsUM2i4CUtgyIfN5JzxSWSxREaLXcdeILHOfO0XXiC2zvv4/b5YrvOBKTsUBEiZQWiHBj8Kylk+ONHUHbTCgvYIw23/tzpKcH6doGOdTErckjhvlNTItmnViOl6oJd/Gec6zH9VzfiGEavj55LCPLs/wbWOTqQmf75hRz/jycPNbKkboS7v3nT3BNa6P14Dg0znwWzylha40SXUFwM4yIkWixWAFCVUH102Dln9LD1iAnr68Rfc8uR98ypQpm3QrXPCzJIWS3QETJlgNb2PX5Lr8KaLYym2UXLWPdnHWSHCOdibdFc6z2D1/Bqs/X89Clq9H+tAbb3r102/saXSg0OXw0pZjHvzEGTX4JncNysQpWyjRlwZnBtmZva2WtsgDr44/TbW5BVTFW9klboSam5U6qlG1imlS2jGjOO/Q6k+SJVZOrFXIYQdNdW0vXiS8AX5mpIPfCC8jx7asgsfjIWCDSFLcbtm2Ds2dh6tTgD2D27h6vDceDQiEu90WhEBNFjhwR9zdvXt++IlWX2wWn9ximNoFZY7VxWyxixZPfG06U+k3u6n0hPJPXYrUNJCsqTcpzjuWcPNfnmfh9/zOeiW+92b2H14hZvrZnwJoHxXbQ5MMFixC64NTnVhrsWu59+8c0mUfAX0cAYCvoZNrSdnS6CqB3Xx4R/KFRbLGcqw198rE2hIgncmywEGf1Ox4vsCzEIJaTWQFNR2KNWovHMmKxW/zEb/VV1ZRqdFimT0fx0stkOx0Mb2gAwGmDkYu+zfX/fJlc0zF23zIHV+Ew9p3cx+4Tu71+YbVSzaLxi7zd5DCb0X74oZgYcfPNYWNhpBCTQRPTwDsxLR7LQ6RzksqWEc15ezKFZU+BiFChdbV3eP2/jsZGNDNmRGdTiCBoXHaBUILGZQ+o4IcTNDKSEcBJRqGAVavEsXT6dHAFOC8nK2Tr7LycrKBlp0/DmDHi/iKJX4A6q412wendHqBdcFJntXmry8kSweFEYTJ9wlJFpUmd7RvrOQWmO3hFcE+lKH6z/LN9W6wz+b8PO8jtqePhf1XhmNgMPk8+S2afwuoq7Vug9hHBGgOoCukX38f6Hl+v57F+f/7YdPX0ys2sleKHg8Dqt4TJEYK9lbrGj7A7BZ7ad6fYOS5MowrB3kpz00cIToED++7k+ivCrx8tyycu57WTrwVVQNMh0SFZxOIZDrSMAF7LSH/7KMwpxDBM/EDhFaxAt7WNzjKdV/wCWMp0FJptLMydzLGOt/j+H07yr7u/yV7XXr/MYAGBmaNnesWvNxcYxD882tAfhKWKFJM64zdZMWfRnrfsmcJhRIGjvl4Uv7i9osDV3oGjvr6vQhtOFEQQNMo8NaEEjTJPHbQspKCRmYwHOAUENmHxHR+GYg2FavFziWcMFKqzMRT3eWT7e1rg+2GsoqL/6rIv4arLZ8+K+0u2SUbqyWvhkCoqTcpzjuectFpvUpF/46bzZrHy60Nrwwju+e9/58kD63i9oYav3pjL+Q/9q3CtB8dRrCzwP4haJ1Z+p6wTH9P3h2dSmy8SN4QYNHiq3wsfFG0PCx+M2/ohOIWgL2t7A7e+sIAvui00uGxsa9rPzc9ejrW9AaHL6vdFj4DQ0cDtuxZwstvCOZeN7c37ue25yxE6GsRqr+9XjHgqoKtnrWbZRctYPWt1UtoGD1Q8k+Z8iTRpTpWlYt38ddQsqPGKX4Cc4iK0zf7eXm2zGdXIEagf3sbEKV/hUvTM/uVuJmaV+q1XXlxOm6MtuLVkdXW/4hekixST0iebzJizpPt7QxFBFHgrtL6Eq9CGEgVhBI1q1CiUhQWAQkz2QYGysADVqFH+55iidrSZCnCK6K8dt1KpYNZYbVw+Xbmry8lixdyxvHy4PshPK8fkNakqt1Kec7znFKpx00NLR1Fa3Jen292j4uPusdic2ZSNVnHn3VpqthajcbZiK+ikZPYprwf4490lmOcFpCL1Z3vwZShPaosHiarfHkuEL3WNH/FFtwVQ4AZqzfXU4uarT8zFkOX/Jrdn2myamz5ipcqCG/Gm35JdjwI3za/P9XZ78xJF8kMg6ZzokG7EaxlRZanQ5vncp2YzJYcPY8tT023H6wHOyVOjOXwYvvUt1A//DIxGio+d5Y7nznLff6iw5Iv1sUZrI+UdWf23luwHqSq3JTfeSNurrwb5ZOOZmJbM1AUpzztuklWh7UfQKJRKNDNmJOYxlpGMAE4h4USw74Q3D9GMlf72CWJ12dQm+HmAo60uJ5NofMJSTW6TqnIbzTkn45x8RbDNYubI0Y+ZWTKMfGcbLedG8ImjArXGye3/sZ2R19RQ84iO5iYli+eUMG1pO1ZXKcVLXHy8u4TmJqWPnSKGC0jCY/0M0WF3CigInIIiLifE0OyvKYPkzRoyREQSy0hv1VbR3Izm6qvpmj6dfGsb7uIiNIcPo2hu9nqmWjas5uz3vs6IFgWb9jk4fMko3iloJUsBF+57nG7VeHJGjYn6D4JUFVApfbJSVmWj8RInxd8biTCiQDVqFI7GRj8PcNwV2jAi2G/CW6z7lZFMCkSUyNUIA6JLJol1rKRrCoQUSJ0SkYr0BrnPqeWcmSNP30OXrZYGWwnHOiv4v/+7CpRqNt7wW2ZOaeL9T/X8en81Gq0u6D0t1NNOXVGMyQ7pPqkt1nNMo2uytjfw1SfmYncKrK5czIorHw15Lk/tu5NtTfupNYt+TkOZASVwd9lcViz4md+66mw1T+27k+3N+9mSLa5v7DHgcPeuv2i7/86z1AgdDTS/Plf0CxctlswvHA+xJiakc4MND7GcY9C6pVeg3vBA/1Vbn5tc0BVjvBKaOpv4wR9OMvmjFrK7XJwcUUyrs4H8HgWOC8Yy5YlXKR0zMapzT2rCQZRIdU7JTqaQBLlSIKI8jh8yi41o9VpGAEeJnAIYgseM1QonT8L48VBcLG0HuFAMFPEL0neTS1ZUWtLOqTcC7eTpk/zj/eFs2LuBFpvo68sq6OL+NRZmNzyG2m1CUOiZclM1pSP77xhnMoF+uJPqSUvRdf5fX1W3fGr/yQ6pINHotXDXE+v6EhGq8irYW7n1hQX8peUMCsCgM1BJNk8seyNYfDrs3Pzs5bxpPo0CGF02msnksPPGv4UUqoK9ldueu5wfqE4D8BPnaMa7c9i5bG/Q+oK9ldt3LWClSvSmG50Gxrn7OQ+JotT6I9aIsWRFkiWLwOspbOvi/j0CX1FNImvEyP6rtmYzwppVHDv6FqYC2Lfyy/zQPJnSn24l2ylG8zmUbt4vd/LrmyZQPHOe3+S6SEjZ6U0qpDinlHVwS5RkiQI5BE0MZASwxMgtgKFvzNTXQ2srCAKo1WKL7lGj4hsrafBhTHKkbnEciXQUyP3ik/97qCmXlW99m+N/mgtAttLB6Pkfk1s7h0mFrr42yEX9Z/u2NFhYf38h9Z/Uobf/g5qr7keb1yr+MlK74mQSq0CNtf1yPO2aJWDJs0uClvn6evtwc0GOFkO5v093z7f2hKwWh02BCFXVPRDs261t+oiT3X1+YRCdxuNztJL4hWMh1jbDsa4fj2BOJr7XM6zDyaoXGilrczLywhlUPPYs7cNy/X3BvZhtZja/tIpFT77lbYfcph9Nw+7nGF/b5P2fPTFmOI/coOX8RSO88WrRiuBkkizBneyWyZKSLFEgh6CJkmj1WiYFIo247DJYsUKsvNntUFgofjebxeXxjJVQEzRbW+HQIfH7QBO/kNyUCI8dYfPrn/L0gbNsfv1TrvvVO3F1eZO9U1yXxa9hxcHcdZz8v+mAKH6rLv85q3U7uXCEBY1Wx5SbqkXx68n27bIEnLCZ0rNrefS2LYwqPIdhmInCnPa+36dTskOsHdViTaqIJ9nCYReF8+trxO8Oe//rxoDH1+t3Kr3LQ6HOK8FQfjETRs1mxaLtES0K6rwSRg+/mAkjw68vt19YcArsPLqTLQe2sPPozrD7jTUxIdb1072Lne/12NRZNGpVtBSreOW2uWz59DesfXNtUIc3T2bwiSwr+1Z+mYlTvoy64kLadRrMznrOFHZ7Px5UnGvlgaLr0OfrMXWaMP7ZiMUe8PciAaTo9OaxJTTVbKX1+edpqtnK6ZtukqVrXFokPMRLf6kNHmFgsUgjCuQQNBKTmQSXRrzzDjz1FJSWQlsbdHSARgNFReLyadMSE8Fr18Inn/R9GDt6NCkfxiQnmSkRUjW4kCpvOCyqQjGjF2gZXc2/fqP1pjuMvexDDIV1jNRY+OGUhzB87SHR9qDtJ9vXp5KcnwfVP3qPgv2PoFL6VDzkTnaIxdLgEah+FdowAjXWpIpY14+1GUg/7Fq2K2hZWF9voE9XKuYHn8eBMH7hCfMTO49Ym0DEmpgQ6/oegenbxS6cYE62XcL3epzZCh7/Whn5goub9GM4VnvYK1p9K7e+mcHrr6pGfY2SFus5zt1+Hfk9ChoLoKd4OGMbWsnJU3PBR8d56JtrueeDRzAMM1CYEyYLPAakyuaVumFGONIi4SERAiesFRfDp5+CzSbaFSZMSFwUyCVoJCQjgNME36cSU6aIItUzkbKkJPHGFJ4PY2vWQHc3DBsG58+LH2LXrk3eOJTCThBt4oIUx5IqJk3KTnH9XpdSBVPW0dLYzj33aWluwifdYRx21pD7+XbyaKT+dSPFxb3e30trRPHryfb1baPc2/q4JCsfzvwheckOsQrIWAVqrEkVsa4fTzOQEIQSTSuufJS9z15Oba/5QAlMJke0NsglskJ4eK+/4lH2Pnd5b8AaONww3p3D9Vc8mrDnN9YmELEmJsS6fiyCOZ4ObokSdD3ZPYwcM5mV01bSMbHD2x3OVwR7MoPbu9vR5mlpMR/j6P+7HnWLFeGCsVQs/i4F7T1+iRGlmx5h631VFIysQJWlSqtOb1JHnIW7NqkTHlLilfaI4DvugMOHQakUu/oFVrbjQW5BIxEZAZwGhLLkaLXiOPHYcxLtzpYOH8akrIJG6iYn1bGksltIJaQjXZfZosJ4n9Zn4rcSna4Ch0Ns2uT+t4c4+owRtdvE0WeMwRPgfMSvoNSTNaUalccbnMx2xbEKyFgFaqztl2NdP9aKdAyo80p4YtkbXl/v3WVzI/p65cBzHh6/8N1lcyVLgYi14hprm+FY149FMMfTwS1Rwl2POltN9Zc3sum1Kk6GEMHaPC0tZ49x9HvXoja3IuhKmPL4K5QWlImPrVUqvxmxJRu3QnU1roKCtOr0JnXEWaRrk6qDWzK704U/EZfo0Z02TRQJiYgNuQWNRGQEcIoJ50cP/He8YyZdPoxJWQVN1rGksltIJaTDXdfSSeNDZtU7HLBli9gqubpa9P56RfDTa5kyeRqlinoYpoOsz6DLjKDQY3yumuK/6Vi3TnwPTGq74lgFZKwC1bNNLNcTy/oyNwPx+HoB0acrVWWxR4C3extqzN8VsZLr8QsDou1BorSHeJpAxNpkI5b1YxHMsYp3qej3ehwOdP/1G2pOg/HKYk50mqh6s4qZo2fS5mijvCOLC2ueJM9s7RO/mlLxTcFggHXrQnbZsV58sSSVW6mEq5S2hGTaKZJ5LD88wsDphEsv7WuUodX2+YMTERtyCRoJyQjgFBJrVm88YyadPoxJVQVN5rGkanAhlZAOvK5snBRlC3x+pgvjztCRn+3tovj1dofbqGTKjRs5+uy9qO2fcfTtE1yce4pifSNo8hHGXIvxhWpO1OrQ91aOw3Q8jY1ofb3xCMhkCvRIxNMMJI1yhuUgFl+sJE0gJCZawRyreJfdL9z7B0BttlL9l2KqrijkDyf3sfvEbi7K1nHns2foblfAyDEY/vt3ovj1CF3P9lptkAhWHz5MR7aTXKcSlbv3zSSFnd6ktCUks2NcMo/lpT9h4BEFUokNwuQMp4EIzgjgFBFO/L53xuLXrc3UJjBrrDZmEZxuH8airYJK4d2VMikikt0i2n1IIaR9rysbJz8c/gIjcswIIzZzpvf9NTDyU6v17w539GkjM+cbmDJpMkf/eYLyokaGaU2gcCOcd2J87DZOdOm8QlpS8Rutr3egd5OLtSIt0aS5dCVWX2ysFoV0IhbxnhS/sM8fALXJxO0vWXh9uo0OtYvPuxuoKwS3282+68eiP/jfVP8F1GYrIf8A+Ihgm7KHRwtPoBNU/OBoqSiCU9zpTSpbQjI7xiU9UaI/YRAYhyaB2HC7XNjef9+v05yjsRHNjBlpIYIzOcBRImUOcDhhetbSyfHGjqBtJpQX+LVHjhRflo6d4KLpcCZVZ7ZkdnhLZk6w73VpsztYU/4k4wo6mDlxEu5pD9HeretXsLacM3utD4JCz5SRJWQde45hI00oFW66e1Rseuk+Pjj/dfQXT469BXIkYs3SHeQVUT9ifG0Ep8CyXaJVYdeyXRE7nkW7bqwWiGjXjzV3d6ATbVU3qa9Lr4/3+Kdv84HSxJqvOrHkK8nucXNB3nCKKGTNqxZvHrD64W39/gFoqTvOuv2bObH/T2jNAj/+WE+xoJC901uyJosls2NcUjvmydENLoyg6a6tpevEFwQ2Y8+98AL/9sgSi49o9VqmApxk3G7Ytg3OnoWpU4M/dNm7e7yVXw8KhbjcF4UCKirgyBFxf/Pm9e0rGdXleIimCiqVdzeaY0khXJMSb+ZD4HUJBZuZmvU/ZHc1wlEj2kuqgRBvWoKZ0lqx8cU7h/X8+kA1wxWf8dBXfuUVv5+aL+LfL3mLjtP/znqpxS/E5+tNF0uD3MT42qiz1exatotlu5axbNeyyMJWDmIQy6nyxaaKaO0SSX1dequ33d+/lsJjJ3lgr5v/viwXm0qBpsvMoydL4LybljwXxithvSbkXxLMNjPG97dicrYwbv7V3HP2IgrGd6GqGCtreoGUk8UiCWmpqtLR+HulTpToFzmqtBEEjcsuEErQuOwB2czhBI2MZARwklEoYNUqcRx5POe+/895OVkE1uTdbnF54LLTp2HMGHF/kcQvQJ3VRrvg9G4P0C44qbPavNXlZIjgcEJWSp9wuGNJJVyTEm/Wz3V5Jrfd2/gQ1TcYUXsaWgR2dfNJdnDl6nn+WDWmRjeLL/s1R60TuSD/DI++/hPmX/oWem0L1YufQF1QSei3vwSQeWLYgEbG10awt1LX+BF2p8BT++4Mmxgh2FtpbvpI7AK3707JUh3imdQ2FEj262LWwK+/OZY5jx1mYoODPzyj4NF5sPCYDadwlMmF4/ig0EFTZ1NQbjD0it/eSDV9vp6HLl1N6euPiJPlbr65d7ZsMOkUlxatkJbCThGtv1cq60a/hBEGjvp6Ufzi9goDV3sHjvr6viptf8IggqBR5qkJJWiUeeqgZSEFjcxkOsGlgP4asQAYijUUqsXPJZ4xUKjOxlDc513t72mB74exior+q8u+hKsunz0r7i+ZJplkdXnzE64uN253n3CNBY9g9yWReLNYOs55JredqNVhfL4aQdHb1e3wGvhnjdiB7J814s920fZgfL6a821w94I1aAtMfNw6kat/9yKvnbmKre/8J1kXVqBW9Apmwdzvsf2ItuPZrJVie2KFUswcVigHlq9XTiR4bQSnEPRlbW/g1hcW8EW3hQaXjW1N+7n52cuxWk8hdFn9vzoauH3XAk52WzjnsrG9eT+3PXc5QkeDWO31/YqR5ROXU6mtRIGCbGU2ChQpn9SWDsT6usTSHS8Qj3g9ld3O21dfQkWHBq3NzU//5kLfAWaVg0M5LUzLMXD7i2ewNZyl6s0qHnv/MbYc2MJj7z9G1ZtV/uJ30yPiZLm6OvEPUgik6tDmFZO+xDFZLEhIu91eIS01adExLoIw8FZpfQlXpQ0UBmEEjWrUKJSFBYBC/JuGAmVhAapRo/zPL0XtaDMV4BQR2IjF88FJqVQwa6w2Lp+u3NXlZBBNWkI6NbhIRrxZf5Vk38ltHhFcvWwN6s9fAdszYM2DYrtfskNTI9w+z4huxBk+bMjnvhfX02IrBUA3tZM/5tzF1Lydfe2RA6vJgcQyeSueqLKhggSvjcfn60td40d80W2B3nYVteZ6anFz/ROTycvx98ZtL1ezUmXpba8BW7LrUeCm+fW53qgzL1/ZE9PlDeRJbXISy+uSyIS5wMrtXYqpdGrN5Dc0oHIpGH8+h6dmZlM3sZAffdDADMUIfvDiaX44/0N2n9hNeXE5jdZG1Eo1i8Yv8he/EWbLSlW5lUpMSpm6EKmynRYd45JRpe1H0CiUSjQzZvT6i+0o8/Ji8xfLTEYAp5BwIrhQkU9zPQwfLzZogejGSn/7BLG6bGoT/DzA0VaXk0Uk7266NbiQK94MohPkvslEJ2p1GB+7jeovv4g61wWlnQDeZIcmtyh+515s4lhbOcYX7/GKX4DWg+PIWeISRa+nE1wkERxrw4qh5OuNFRleG7tTQEHgFBRw+XqNe+mvmhhLlTEcseb0DhWifV3ibbARKH6rr6pGeeZZFM19T3hULgXGf8JPZw7n19cVcvuLZxhlU1L1x1bu+w8V9T1iu2sBgS8VTAwWv2EmDEglOKUSk1IJ6WibZSTF3xuJMMJANWoUjsZGPw9wXFXaMCI4p6AAmpqgrCw2QSMzGQGcYkKNGasVPvkE7Hbx++TJYqvuaMeKHNXlZBLOu5tuDS7kiDfzEK0g9xPBH2nZ/Oo6NnxzIzlZDrp7VGx+dR2mLiV3fF0Uv65cPf/7l83Y27PIKuikZPYpWg+OQ+PM5+PdJZjnKdEFiuBLayA3RIVHxo5nSSeW1Ik0SKgI9Pb+/mu/CfLrPrXvTrY17afWLAoYQ5kBJbBCN4ubFv7Cb90//PnHbG/ez5ZscV1jjwGHG+4umys2uQhxfDn8wrEQS4au7Hm7MhPPhDmL3RIkfnU2cB8+jC1PTbcdLGU6tM1mCnLU/OxEBevGZ/Hr62DZ0+9jsGfzwN4u72S5/2grZubfXwBGRiV+QTrBKZWYlEpIR1vZlt3fGy3JqNLKIWhkJCOA0wDfMfPJJ2KnNqcThg0Dmw2OHhUbV4waFf1YkaO6nA6kW4MLz74SzQlOVJB7RPCm2y38+7i3+NR8EeNLTnOytaI32WEuM+cbcAlgfL6aU/U6Fs9xMW1pO1ZXKcVLXHy8u4TmJiVGo9gxziuCNQZQFYY+cDpPbItV0EZr5UhyZm+oCqxgb/V6exXAtqb97N21kCeWveEnQq//8mb27lpIba+xQQlMJoebrvo56txiv31ef8Wj7H3u8l6zBDjcMN6dw/Vf3hx8/F6/8EqVBYDtzfvZ+9zlQccHJOsOF3QOMVgCYrUPpKNYjmfCXGFOIYZh4u894hejEUVzM5qrr6Zr+nTyrW24i4vQHD6MormZ6r8UY7xyOM/dfAmLn3yb8U1u7t/XxQvTVFzzQR2jzltxL74ERZQ5iVLaAKQQk1IJ6ZQ0sEiUZFRp5RA0MpHJAY4SKXOA++PXv4Y1a6C7WxwrHpvC+fOQkwMPPwy33x7bPgMnf/p+GMvLS6sPY1Hx+Nsn2fz6p0ExceuvmSR5O+Vk5vtKcjzBzJFX70Q4dpIWaxkv7/8G35j3MqXFzagnjmfEZT9n4+ZcTtZpQxZvemNC/Z9sFlpE8asMPbs7pBjUT4OVf0qttzfUeZVP7V+kxpLDm+Q84yXPLgla5uvt7cPNBTlab4tkD7//2m/46hNzsTsFVlcuDp8C0dFA8+tzxapu0WKxqnsg+PF6bdNHnOzu8wuD6DIen6NNyC8ci/CMJUM3lnVDieVKbaW0zSniIN7zcvQ4aO9uR9vpCnGDh/4D0Facx/oFSg5/+AYPvNrBtOZsagscdGe5seVkUfHDn3Lh3caozz1Z+b3JPF7Ljh001WwNivgavrYqPSq+4UiGMJBD0ERJJgd4gPHOO/DUU1BaCm1tfePQbgeNBoqKxN9PmxbbOBxAH8aiQirrQiSkzPeNNd4svhMWkxtU7iaO5g1n2x/uwSnkcPKfI7lt2XamOZo5+tx9mJuq+31yqdPBQxstrL+/kPoGFca1Tqqvfxmd+7P+hVuyJ7ZFKyZj9SbHYuWIZV2ZqsX9eXvtIarF6rwSryhesWh7WLGkzivxCtgJ87f3W72Vwy8ca5U2FktALOvG6rVNVrU41omEvud1gaOI6357CGVjI91lpaj7+wNQXY2wZhWnj77FknpwzDKgyrOS57Qw/nwOJ4d18+vp2TjbXuTntu/7RaSFI9rKrRTCVcq84HCkxQS3eJFbGMglaCQmI4DTAN8PY1OmiGPx00+howPUapg0SRyL8WbzXnYZrFjh/2EMxPF4/rxoz1q7Vv5xKEVFNVrrQqLHksprnJRGGT45v91KPWtfvAeLXUfV5T9n1LAGql9ZywNX/pYR+SZun2dkyk3VlIZ6dCmYKT1r5NHbDPzkf6uoP/g+xg+yqVnwMtq8lvDpDsmY2BaLmIzVmxyLlSOWdWMV4iHYtWxX0LL+vL13l81lxaJgv67L5eK9hvf45vPf5KUbXupfoPUI0HKw799ZarHJRQAH9t0Zk184GmIVnrFYAmJZNxaxnJRWxj5EO2HO97xKbG5+9Fw9H9hzoUzP01dq+29yoYHNV8KiM6DvgE3/UPJph4kzhTC2PYfx53P49mEnv54khMwJTgSphKtUqROec+pPkEs5wS3ZFXJAPmEgt6CRkEwOcIoJlU+t1YpjpLhY/K7V9uVQWyzi+u+8E9sxPB/GNBrxQ5jb3fdhrLRU/H0s+4yVeHJu+8NTKX3g2ql8b/74kOI30WNJle8rVd5wv/iIX0Gh53//8gvs7aMp1lq4oPJT9MUmfjL3cZ58ey2dLj1zLzZRWhsi49dnP/nUsfkbv0GvOoGhsJ5CVev/396ZxzdR5n/8M7nTM03Sm7bcbaHcyI3gwSUi4IIoi4KiLoInsmJFREHkWBB3XVFQFhbvA1BcFQV/4oUCAioUqNwtPSjpkZ5pruf3xzRp0lwzyeRAnvfrxQsyeTLzZDK0n/nm83w/rHizCbdw4SgmrSbvc+LrTebTh5fPWJsQd4TnIkGFROHyZ8YNa5EDCQACBsTu7Z1xw1qXsQEjVrj8mXL9WnQgEjAtx7f7ha9f6zqeIzbh6XRoL4u8+PTQ5TOWj1huK9oJiF20hxPHedXKCMrVUpxTGLDspiicFtcgf08+dI3OPwNs3SJOi2uw654RaJ/VB42XiyEnDC7FMDibkQRGJEP/BhUe2mdCY1mR2/34i1D9eYXqF8ylf7Gtsp2y+GloZs3yW/wK0SeZN8EQBqEQNAJCBXAY8RZZXI8GRKfVoh4NsFrZCqQ/10zbm7HcXDasp76e/Ts3l90e7Osw6EJQ4GMJ1SZNKCENsML+je/PYsknx/DG92dhaLjsJH7ZxW1JGD8wAY8tisO59guR0jkRPdpV44ERL+Kzswtglae0dnZormrZsYOIFqXA1H0FNMxFrBq1DE8NXwupuKUSFszuDlzCNPiISb7BEjYrx+jngf53s3978jHzGRukRYIKZQI2Tf0KnWRqpIqi8GjiIGy9/ZuQdWGwHb+jTI00gY7Pd5GXzRKwoP8CTO06FQv6L/BYeeUzlo9Y5ivaAwmy4IPjvMwSBm/cnIh/39EOeT1HIl2ehPpLzuK1bbeIedfMQ4HuOC7HSWDs3B4dZz2BlGkzQZYtRfzY8RgkbW8Py8jfk4+qpipYDQZUbtmC8mXPo3LLlrAFXQjVdSJUgRmhDOawEwxh4CVq2djQAENMLIwNDSDWlm/CIkAEUwtEmPAmfn+5UOXUq7dcb0D/LDVEIoZXVLG3mzHbAlBb7/Jgxh8DwkYch+JYQnmNhRLS7qwUO49EYdu1abC0dHY4Xaxt8feKEB/fHi+80B5bL+ViyaR8MCfLMQpr8Py2BXj6L2ugsHV2aFNBzn9vBVTfaPHU9R1Z24OjhSBY3R24Whv4iEl/vMl8rBxcx/a/h30vbRcJekt44+pzlipR2iKgptz4IhQKldvdKSQKbJu2zW1QhgtiBaAZ0PpvT1gMUPxyLzLEBiCxH7pc690vzMW3elv2bfjf2f+5LPLylhbHp7cw17F8vLZ8RHso7RJt52WWMKiWMMiJ7YRbvzTj0IEfseEvsNsY4uXx9m4RC7Nno/ShWVDoa9GUmIC81VugfmUTG3c8Zw6g10OWn49BJQC2XcDP83oh2irF+TsDsy8IJVyF8uaGqstDyLtJBEMYeBG/jYcPO/UYNl26hKi+fdk2a3wETRCgAjgMeInlxsWaRtQZ2P8INt1UZzDjYk0jMtXRALhdM96ry42ITrOgHmKorFG8hbU/cBWCQviEhRCdQrVJE0pIu/MkHy1rxPqiGTj7hcals0NVFZtOWl6uxXMfr8CSSfnAyXIMxz+wdMOtmH/zPmj1LwLik0Czzl5BPl2sRYoJqOs6C+qCd/gJN3/h6pPlKyYjIXSDrxAPcYu1YMNH9EVSWhxXscxHtPsbZOEPnuY1NW0sFJd+wiBJFrDtAjb8BXhi9xPol9EPIrkIPWVpKHloJpS6Ghi0DuK3vJzdcV2dfbEcK4IZDPu0EjVFWwL23QolXIXy5goZY+zN4xvSuGQvQtXU0ABrTCxEDQ2QqlTcBaoXQWMqKWHFL4hd0Fjr6mEqKYEsI4MdFEYRTNugcUSoNmiEALfdBhw4AOTltbbbs1FYXouSmiaXNl/pKiWyU5yPa7UCx44BAwYAH3zQet3xqS7HKiT26rJtfsFoieaugtktNc5pMRiXMUIdK5QIIeqXfHIMb+8vgtnq0MapWYaEgn5Il/tua9Y5Q4clt/wdFw4XoLxKgx9+G4FFtyyHIk7KxiR/+A+HCnLLfkIV9vD534FfNrO+XhsiKWsvuOkfzmMjIIAiqPBosVZjqEH2v7MBAIUPFkLloQIMADV1ZZxaobltg+bO1mAxAN//Baj8BVD3A67d7rYCzKf92JUK1wr3C/tfwId/fOi0uE4ikmBq16l4auBToZtXyw8GY0kRfjKfx7zhepRGGdFVosXcdy8gtY6BLD0LPVb/t1X8+vgB01hWhuL6BjjlC0okSJg2DSmLn+Y857AsBvMyl7aL8uS5uWj/ztu85uR+Pzn26rhQx/EJjyqtKDamtUoLeBYGPgSN4Y9TMJWWuvw8k6alQdG1S5sT5UHQ+AFtgxah+IjlhlImdhfLDaVM7LLNXSx3KKrL/sCloipU5wUuxxJClIakvVkLjlVtCcyIFjdBL41Du3ZAsthzWzNbQlz5JRGWbboLi4fcBsQbMeP6LZDJmmGoZZD/ymycbta6/o4LtILKVazytTaEu6obTAJM1uMamrHn3WF47db/OYlbQ1M1HtkxgVu4BUf8SS+70uBaLeZrlwi0Eu5xXg4V3MzCUnvc8R+KMlyMBQAC8rcpGPjP9YCu2nPim+MPGLEY1WePI8okgpS0/NLxM+0tVO3SfO1HqEqyr64UIYlLDlaV1oegESkVcCdoREqFyza3gibIUAEcBrzEcqOdKgrlegNbpQXb5zNWIUE7VevX995uxtatA4qK2JuxttdQk9Fir/zaYBh2uyMMA7Rvz96MrVsHDB4szPXoSwgK6RP2diwhWpOFpL2ZAzYrxR9lVZiX+CGSRZXYKZ6Ljc/Gw2RotWy1RasFVj6nw9E383Hxohzrdj2Kv09YjShpE8xWCZbvfAqna9VI6ckp1ZQ7fL7K98cn+2eFx82AQqLAgPQB9n8DcOvzdQzNIACKdSWIZxoxZVM3KGWt1ZEmYy0WJ0vs4RYvSErAgODy54Ncwy2GfwhAxPqFh3/o0f/rT3rZnxWudomQeIVbxGvN7HHIOC+1xx2/30OK8To1hr28GYX1YmR3Hey+Z7DjflatQr1Jj3XLr0PW+TrMOJsCqYUErSeuUO3SuOxHiOQ5Lh7foMYl+xAG1iYD3AkDa1Obm2lPwsCLoJGmp8N06VJLdRkAAUSxMZCmpzvPL0xJXLQLRJiwXTNqNfvZ2649kYhB/yw10pRxEFWxf3O1KNhuxjIz2ZuptjdegVaXg41QC8Z8IUSXCCG7Wrh0d3DTrs1W1X7qxgx0bgYyTcDreZ8gVlTtUfyyO9ch+lQ+4uXlUEWV49re3+BMdQc0mKJwQtcVw3p9i47tqoQVvwC/lmV8uir82eHRvcLQVI2Ll37HqZIDeGvXXBiaqt3u0haa0RYrsXp9bD+Oh6pyccXvOFXq/dh8Oir82eHaiSJkrdW0Whx+eAouKkzoeJmNO+5VbMWIn8uhPa9DdGUtjpQdQWVjpdfd6BRWLNr/AsS5XTCuQobURDWSHp/v8Sv8QLtFCNU1IVTdF0Lq8XWHD2EgSJXWg6BhRCJE9e0LRWoKogD2by7WihBBK8BhxNONk17PoKpECXMTUFUihT6e7RvN5VrhXF128ABzqS6HAi4LxoSwLghRaRaqWs2nkqyQijGxT18s2/YSxqbk48zRcmSL8qEYuAJQuA+2MOzPR+Fv5aiuV0EcbUQsalFek4pXv5hrj0m+b9q/oI3JgfvW+H7C96v8P7u1gStuFs0Zek9n/xM7CFF3toYv3r0Wr0/e6WJX+GjPfJfQDAOsuFc7ANNH/8s+7p2vHkZ+5UGncAuGWPGgdgC6DPmX07H/9uEoTlaJSFrYFglwsUuEyjaia9Thx/pCFA6LxnM763FNuQQp9Wzccb2EgUElg0Jfi4J7J6L7G59Ak5ntdh/5e/LRWFaEOTuKMUjdE7L0TODWW9nQgzYIUb0VqmuCkN0XvFkpIiIxLhRVWg/HYPR6SCsrAbMZ4spKNhmOq6AJMlQAh5m214xKxYammEytqYTHj7MdSmpquF0rnq51kYhBxzg1TpRbEJfYjAQ1K4qDvQCOK768u0LZDoSoNAtVrebre1argUVLtVj+zAqMRT7wWzmy4UYEO4jfyloVlFFASnIFjpZpsW7bkzA0RuHXPTl47M6V6E0q2FZovTwIaX8IUv/bkMFnsZ3QC/Pa3AxMfXeCyxB3toZiEIz770h77LGNDydtxRfvXoviFnODCEBnKDD9xn9CIVfZx02/8Z/4+r1rW/YImAiwQVyG3lEVwL477eMuV/yOe6RV3KwSIz/l1aqMC3z8saGKKRaSUNhGbML1cuNlZMW1R4KkClFmXWvc8UAZmPbJmHmkGdG6arci2FH8/m3bBQySZLHid8UKj54sIVLahKqoCrUfX6I+JB5fLngSqC1VWvMff0BUXg5ragokXbv6V6UNhqAJIrQLBEeE6gLhiX37gAceAE6dYhdSRke3PtfQwC6Q7NIFePVV7tdKW997TQ177dliubt1Y2/EgPCLXy688f1ZLP/8hIuHedFNuQHHE/PtEiFUpwl33R0kIgZ/HZiJ5ybmeXydTgcsf0aHsSn5SFGVI7uHFgppDlCrA+K0MJhOovCozi5+++XVoFAfjQkvPomKy6n2/SQlluHT+SvRI7EBUKZwE8FcBJ87D3BKj/BaG7gKVXdzT85z71/mM9ZPJrgRwKdKDqDM2mgXoQArhVNFUejS4gu28ekdn6K8+hyy13eDhVjxj57TcPeof7rvAqE/B/I5O25n3DRMi6qAWCR1PnbpAZS6OXaaKApd0pyPjZGf+vOWPeLOH5ujznFrJeA7NlKEMp9528bzmbtNuNpCLxae7QjNs6shMbNdWEwigsPJZmyY3gXaDrm47e1fEV1ZiyatCqcX3oNLMRbES+NxqPgQmstLXMWvFy9V+bLnUf3++85VV57dIoLbnYH/fiq3bEHFqtUuHtqkhU8Ez9cbCO4WxFVXuxcH/gqDYAgaHtAuEFcwNnuC49/+4Hgzdvw4e42bzc43Yt26sTdpkS5+AeFsB0L0+BWqT7C/lWSt1rES/CTw0+/oGvsRZHViGGMt+KMuF5XWrnbxa5Wn4PWvl6OpTgxxTAMSBpxD9YEOaKrLwOtf/wur71gEhS0hzpsI5rq4zZ8gimDCZ1Ee177EfMf6WSn+cOqHLtve2jXXxdYgAvBo4iDMGLveZbxCmQCFnP1FcMfof3kOzVAmAC0L46aP/pfbxW37d83F+ss/OVklTIQ9dpfhrsfmAlcRx6eXLtexoQyo4AIf2wjfubcVvyt7L4D641VoVCpgbAKqErVQX9ahf0MMZPtM2JBWiw/+2htT3zoCS8kFyJ56Brpe6dgZUw0xw+CF3zUYJO3ISfwCwlRdhaqoCrWfkAdZBEqoq7RCCZogQAVwBGC7ITObgd69gZMnW2/EmprYZMIePVjrDN/WZEOGADNmAH//O2A0stc3wEZ9NzYCBQXsjV56emSLX0DYRXK+OlJw8RoLsY9AgjJsInjZ32bhpg7LAUsndEw4j7PVnVBZHwtFnB798gCr3BaTrMX4gVb0mFSHGqsGqglWHP04AedKRMh/fwVWTMtvFcG9VwFyN19j8hF8ofL1chGWfObNx7/MdWwAARfuhMyMG9a62Bq6Qcb29xVStLkRwFOuX4sv2lglOhIZply/1nt6nAf4iDg+/liuY/mI6lBVirnaRvjMvW3c8creC6BZtga4fBlR48ahuU8fRNfoQVTxUB05gkHlJS1hGVlYc4sat79VhA4VViR8VwxdDynu+tWMbrWAdPxwzi1kuPphfbU5E6pdmhDdF8K+yM0fbCL4gQeAI0ecq7RRUWyV9sgRtkrLVxgEU9AIDBXAYcbdtxG5uewNWX09u44gN5e9CbMtsORzzezbB7z1FqDRsNeb7TpkGPbv2lr2/+7ChcG9BoVYvBaqRXKhbJMWaCVZqwWmDtuOXZ+NwC1Dd+DEZdajt/fw9Zg99X+wyvNcYpK12vb21+sGs208TxdrW0WwLSbZHQH2qRUcrsKSz7z5+Je5juUjwDmgUCZg09SvMGLTQJypvwRxTT023rvf7369vI996067VWK+tj9uvcG9pYILfEQcH38s17FchXKkVYoBfjcEsbJYe9yxXfy2hFwwK1ZA3SbkwjHueN2tiTjcux3U3xVD3UQw54ARnfQySGBFdZ8+zq/1ApeqayjbnHHdj7f5CrXILawhIEJVaYMtaASGCuAw4qk3tUpFoE434FKJGOp0C1QqBQD+ccWO++/enbVAnDjhfDMWFQXEx7MiuUeP4FyDQi1eC9UiOSECOfjsI9CgjOYY4PGb1uKUvnUfj417Cd82zMY37z3hEpPsiGMv+9PFWix8bxUWPxcLbRvfp51IW9zGVVjymTefvsRcx/K9ceBQ1VYoE9AusQfKzc1IT8oLifh1PLaTVUKmcjuOS8WUj4jjEz3MdSxXoRzKKGOu8LkhkIqleGr4U6gvPY+Epas9J7wBLnHHy3bp8XhqJap6SDHngBEAUBxjAhObhPQaPa85+6q6CrFQTqj9cO0VHKiVQiixzplgVGk9Jc2pVDBrNOwCO40GEpWKXT0QxghkG7QPcJjwFVdc2lQLi7oapU21+OVCFawti6Rs10xVFfv6ffu471+tZm++pFL2ZkwqZR937+57f4EgZM9cm1h8bmIe7h3e0XOSXADHsXmNHfG3TVog++CEQYfk+Is405CF6no1tnw9C/VNMThV3wEifRl0FVaPv+NsaGOrsGK5CSlJZpw9qkf+XYdR9eUbrAhrC48+tQFjamKjgT//O/u3u/nYhKUj7oQln3nz6UvMdSwfAW6ran/1NBsR/dXT7GN3758rpiakSRRIANsWzVPfXoOxCcUWBU41A2/t9jyOC7aK6Zpf1uDDPz7Eml/W4K4v7nLpK8xHxHHtpctnLNdexTah7oi39mQGswFbC7bihf0vYGvBVrf9lAOFT59lg9mAbftfx/kHp6P41C8wJmpQ/cwT3kMuVqyANTkR5pISzPvBgFmHzehYK4PMwsAoJqg2l6E+VtjgH7un1pFA2pwFsB+uvYJtoj5l8dP2dDc+hKonMQBXcaDRuBcGGg03seFun21ilg1l5WgkYP8+fBjE2lII4CpoggStAIcBrnHFNvjGFXsT1/VoRHQyYK2QIydbDLWafTKYN2JcF68Fal8QapFcJLVJ83pOWlqdmcsacbI2F1v3T8HT41aitl6FysYsJEVX4t4B+eh55wpoPP2SM+hgOJCPhJhkrMg9jPxfp6GdtByxP64Bzv03fIvbuFobuApLvvPm41/mMpZPVTkAu0QkRSFzrZjyqeoC3P2xXMdyXXTGN8o4FHYJrnO3zed0xQncJ9YhkTRjXV4juh1YjpXMImjadXG7f10UsPwGYMIpC/Iqo6CzNOJCnBVMVBoazeWItjAo/WwLEm691d4iLdCv8iOpzVmoegWHbCFdMKq0XGOWbeeBa8xyCKACOMQEO67YV2XZFoJhVdXjTK0ECQlsylwwr0EuYlAI+4JQojOQhWlC7sPrObFU2/v8XtKn4kDdctwyvxS1hZ2gUlUinpHDaFRALS9H9Kl8QO2ms4NDr2CL8TJ61O/HqhuPI1ZWB6nIHN7FbVxFIB9hGc6wDT4CPACfdciikIe86XMuXK0NkRCWwUUo8xHqobRLcJm7fT4SYON4DeQNRpw1VGDGli9RsOFnt0EX9j6/DRWQSeSoTQDqlVGQNZmRHZcJ/c33oXTXm1BU1tj7BCckZQX8Vb5Qnloh9hOqXsEhWUjno0rLClUAZeUQ1de3JrZ5EwfBjlkOMlQAhxhbKuHChWyqYNsKsGNcMUFLMAvhFlfMtbJs87jzrSz7CxcxKITvVgjRCUROmzRP5+TDH49gKrMBhb+Vo7wmBbvKV+CZ57UQiZKwbA+bEpcUV44GRoXqehUK3YVlOIjf8poU7Do0BYtzj0GtvNw6gWAtbuPStYGrCIy0dmve4CrAOVa1FRIF3r7lDVy3aRDOlh3CW7vmwmoxQSR29m/bopDbNnwPKArZ2ITLFgUMZgP2756PKdevdakS87U2hMtHyxU+Qp2PrzkUnSUc52OWMDDHy9FFlIJUvQ6KetegC8eQi3s/OovoeiOqlQwUEgX6J3eCLD0TiXfPRcLUqSi4dyIULWEZaTfNhClA320ktTkTSoz78iMHPS0uWFVaH4JGkJjlIEIFcBjgElesr2FgromCRNWIeBXxGVcc7MpyIHARg0LYF7gch6vNIhRt0nzh7pyoJfXoenELCqsMdvG7aKnWbuNzTIlLiisHoEJlrYMIHrQKIFZn8Vu+AovmfAL1gUpnlRSMxW1CWxuAP1+MspuqtiG5O9B7us845C5E5GJtePerh/Fv3cGQRyHf1vkWXtaGKwGuQp2r+A+VVcLdfOpipahcsgDqVZvtArb7G5+ASUx0Er+q6ibUKAC5RIH+UZ2c0t40ajW6v/GJXQQXv/kiYiQqxJgcpIUfX+WHss2Zt32EqldwUNPigl2l5RCzzNToITWZYJJKQVTx/GOWgwRNguNIMJLgPN2U6SoJfj9mhbGZgUxO0DNPBK2m5esKL9eKtwpwUVUDTl1iv+KwVZYBoEtyjL0C7Gv/wUSolDdvCJXeJtR+fOF4TsQWC6IsRjSQKDyt+AHpyssu4teGLSVufOp8aGIq0WBSwdjQiPomLYaPzIZSWYDCozpnAR0fouS2n15hF3U5VXZF7OIxRxEbiUlyoaRNlXzC2c+ANguwHK0NrRB0kqmd4pCtFhMUxhLs1p0HAyAjMQPdIMPW279x8QDPfu9a3C89DwB43JyBDeIS9E4f7JQGV1zxO84aq1yS4DrK1C5WCcOwDyMmYS2UcE1z21qwFWt+WQPicOfJgMGC/gsEj4/2NJ+G0gt2AdukVaHwiZn4/Mwu3PNOIdo1SKCXEyggRb/4HI+BF5VFhSi4dyK0JTVILjXgQpIKEkYOKURBS0Vzn+SWw8tuIcQ+uBD2tDgv4sBYXIzm02fgXP1gIO/cqbUCDPgWB54sFjodyNGjQHMzIJeD6dEDjO36CZLgoElwVwDubpxqaoDCkwxERAy1ig2rKDwJiDkktgWjshwqQtHjVwibhZD78fV+bOek8GI17jXvQYrsMj6Jm4kLzUvwW1kDFi9Tu13ArdUC8+YBx7YSpCjLEG3SgRjlKD6dCVn6MhQ2ZKPc3LONgA6RleDPaG2w4WfSm1vaVrXP73IZ4s7awLRsd0QklmLT1K9w3aZBaDIb2LS4G1wtC7bewpc/HwRDy7jeylKXKGRP3QzcbRfS2hBJccW+4GqX4GOVCNZ8FJnZ6P7GJzh27y0wllyActFz6NgjFWUmPRiDFV3LxNAYRbDeGOexnYwmMxs9Nn2KuGeWo2Lf96i2FMMglyHD2g4xud3cfpUf6GI5IdqcCdVyzdf7CbrFwRccqrTWunqIrVZIjc0wx/tRpfUgaJjCQjC2NlSNjUBhIXsOIiCClgrgMOMprjiqRZfyTWzzdJ2LRAw6xqnxe5EVFhMDca0UHTNFEIl8V5ZDQSh6/ArVJUKI/XB5P7ZzsmXXUSQdqoFGqsejso+QPaM/ZLFaqN0EtQFAZakOpV/kI0Vdg9PlnREjqoYmphJ3XrcVp2s6oFyvwefnZmHxhjbV40CtBFwE4JVobeDyvvgkvfkhlIWIQ7ZVhWeMXe9ROCqUCfYqrqdYY6GjkLkIWz5WgUgRylzEP9/OEoG8L2/z0WRm4/TCeyB76hm0r7Ag4YcSbOsuwd2lViTUWmCVy3Ck/Fd0bayEBu47yiRkdEHVYw/gdNE+RJcpIVLIEHPX3Wj/t0dchK0QfW+F6JwgVPcFX+8nqBYHrngQB4xIhKi+fWH+4w+IL14EIxJBQggYvZ4VHXzEgdCCJshQARwBeIortsE3sU3oynKo8OaZFaLqKlSXCCH2w/X9KKRizJnQG5X9XkTBO/lQkHL88WE+uk9fAbj5RVRZqrOPM4hToEyIw95v+uKWoTtwUtcVAPD9ryMwdfx2aLXDeL1vr3AVgHy6NgQbIYUt164VfgplhZv58YlD9rsHbQBRyAazAR8UbBVE2HLtqnClCWWunSVC4RW+FGOBrlc6ElrS3u77xYROehmIRIxTWVGQ6WtdFss5UllUiIIFM6Go1sPQLhU9PYwDhKm8CtE5QajuC1zejxCxywHjSQTr9ZBWVgISCStAGhtZAZuby4oHPuJAaEETRGgQRgTgGFccFcUGsdg7QZDWxDaNhh3HpVe07TpXq9nruKAAMJmcb8RMJnb78ePhF7++ECJYYsagLHRLjQPDAJKW1m/+dIkQYj98348mTYvu01fAwKRAQcpR8E4+Kkt1TmOcxC+Tgu7TV0CSRPD4TWudxj1+01o0x3CeKjccBaDVxP5tE4CO8AmZCCZcwya4vi+ugRxc98dhfjbLQieZGqmiKDyaOMjF1xsMbMftKFMjzcNxuYZgtBW2BMQubB3hGkLBdX9c5xdsuIZ1cH1fgRAvjce+mGp80MPB7x1jwsUUDbQ33g6DNsG+WK6yqNDptTYPsEJXDYM2waNItiFESEXC7bdDnpvDfsUpkQAMw9tWIMQ+AOHCO0KCozg4d4717B4/7ioQjEbgyBH2vPARB8EQNEGCVoDDDJe4YlswS0ICvxZlkXQjFqh/V4iqq1BdIoRocebP+7GJYJvIPfbWQpjjMxBjKkK9NBMSfTGUTIVd/GrUYFPiytmUuB0/TcbkwTtwRmJBcruLgEHn2hvYX/j0rg22tYFLZZdrxZbr++Jq7eC6P47zUygTOFkbhMbFKiH2LtgA9xVbrh5YrlYBrvvjU1EOdpWYi1Ui2F5hXaMOh4oPQcwwuOtXMzrpZSiOMcEoJmg0lyE+NQXd57V2ezg2+2ZUDxwASU0DzKpoJOw/AGVlLSfxCwhTeeVqKwhFlwch+wWHxCZhE8EPPMCKXJEIiG5dDG/vlcqXYAqaIEAFcBjxFFeck0Pw2zErqvVsF4icHJFfiW2ON2J6fes1aOt4YrsRi49nx/XoEZxrUAj/rlCL5LzZLPjM09d+fM3D357FNhF87K2FkDWcAFN1GipTDZqlZyCVm9AUnYu8v7Li1zElbvNPt2NUr91Y/dODuHvoe8grY4M0nHoDe0Job28w4WoxEFrYcrV2CC2UOaKQKPDpHZ/6HihWACM5jPOB0MKWq1VASKEcqhZlXODTVo2vYLf1/G0uL8ELv2vQrRaQwAomNgmN5jKntLfub3yCY7Nvhvj0ecScvwBGmQTSVAGxmaCpc3vkcRC/APdFYYG2OePiNQ60VRqf9+PrGIH6ov3GJgocxYFUyooCvZ674HAjaEhODshvv7FiWCYDk5MDxraAJUwJcDaoAA4T3hLbztRWwRzHgNREwRzXiDO1hHdiWyTdiAnh3w3FIjkh5sl1HoFUkTVpWpjjM8BUnYZCboBeroACBhiaFTCnZdjFr2NK3M35jaixZuHmm2Jw4LO1SNQvAuMuIKMtkeTtFbKyK7Sw5dq1QmihHKEILWy5dlUQUijzSXMLdqWYy/vyR7A7Bl78bdsFDJJ2hHT8cFT36YP0Gj3iY8Uo/WyLU9pb9cABiDl/AVFGK2AsBwA0ykSoHziAk/gFuFVehRCEQniNuYroQCvJQnak8IlNIJjNQO/ewMmT7sWBWt1qleAqONqmzJ07B1gJZAQwWtkFdVEJCb5T5kIAFcBhgEtim1gBiJL1LYlt4JXYFuzKMl+E6r4Q7EVyQsyTzzwCCcqIMRVBZaqBXt76AzbZVIN68x8uIRfPPO/c7UE3GPawDPgSwVwFZbDblgld2RVa2NrG+rJ2CC2UIxShha1trC+rgJBCmWsVOxSVYi7vi2/8sov4lWTZ+/yqHX5gJNx6q1PamzkzHYwyyS5+AYBRJkFS08DrPfmqvAohCIXo8sB1HoEuchOqI4VP3AmE3FyQEyeAmhpYxWJYU1IgUanYTt/+CA7be7KlzIlFMIhkLRG0HFPmQgAVwCGGT2Kb7Tk+iW3Briz7Axe/a6AeYSHEqxA+Y6HEvq/zUS/NRLP0DBQwALCCEQGVimikyU+j8LdktylxNrRa4MGHRHjlX0sxBs+0iuBBqwB5m95qkeLtFbqyK7Sw5YOAQpmztUFofFglhBa2fBBKKHOtYvMVnv7i633x8QlXNVU5id8BonYgKpXbPr+alj7BNhEcd6kEogYDxFYCKwMQhgFpqoBZFe30ukD9rEIIQiG8uUIKU2/nRCgfsVc8VWpVKhgYBhKrFUaJFNaycojq6xHVt6/3Si2flDkHQcM5ZS7IUAEcYnxEZ0MpE7cumATb2J4Qdrsj7qKzg11Z9hdfflch7AtCiFd/fblCz8PX+ags1UGiL4ZUboLBIIeViJGZegEVtVrU15hxuUnlUfwCbLeIks/yMbZzO+z64xmMMf4dFz4DhjV9APUNM/2PJA4EX/YGoSu7QOT0GfZEpM/PB0ILW6HxNT+uVWw+wjOYVgk+PYWlIikMlaWY+vZhZFiTUFVRgPOGaGR76PNrE8En7hyHHkerITJa0Cgh+CNJBrGVQGEmkO4/gMqiQmgyswWxLwghCIXw5gq5wM3bOQl6WIaPSq252QizXN6yncDKtVLrRdCIlArn9DsAIITd3mabi6AJAVQAh4FgJLYFu7IcCL78rkLYF4RYJCdEdwchRLS38zG5UxwK3smHkqlAU3QuGlRpkOiOoKIhHUmqCpTqM1HfwCbBeRK/ti4SIFbMy3gY//riRmjleoxTLAbOv+1sKwiVt9eXvSEYld1wImRq3BVMJPTi9QTXKjafBWrBtErw6Sk8+6vZOGW5gEFqEZiKi7DEW5Bea/Xa59eGBCKIwaBcI4VVKUPtDdch6egJKCtb+wTj/34K2L4ghCAUolOEUMLUl5UiqGEZXCu1jrHqXCu1HFLmmBo9pCYTTFIpiMqPlLkgwRDSVp5T3ME1W5oPnm7IdJUEvx+zwtjMenV75omg1fhObPNWAS6qasCpS/XsPtB6mXdJjrFXgH3tP1gs+eQY3t5fBLO19VKUiBj8dWAmnpuYx3k/3gSuu6pqt9Q4XlVmX8fgM8YbHs9Hrgo3XNrs1OdXk6a1i9ooUgS1/AIqDVloEmXan7fh0ic4tzs0vzyHqsZ4xMrqIBWbAUbE9uZtG94QTLH20ytsn1un6m6bebgTySk9wtND2Be+zpe795Kc5z4M40+MO0GYo85xEYSRLJIB7u9ja8FWrPllDYhDeDUDBgv6LwhpXLTjPCRmgiiDBcRswVM76pBUa3XbyszW5zeqTAdteS0qk2PQkJZkH9e2D3BSnzEgn/2fs21AIkHCtGlIWfw05/fDxUYRqNXCXWVWnpvjVK0Woj1Z+bLnUf3++wGfE7/xIhCMxcVoPn0GbYPV5Z07tVaAAb8ECNHpQI4eBZqbAbkcTI8eYGzVmSAJDq56jVaAw4jQiW3BqCyHAqE8wsFeJMenw4O/i9sA5/NBLAysRgniJXr0P/c+FMoqJ/ELOPcHRjOgll9AVTNQ8E6+i0h2Es+/rgIYMdTK6taDu7MVBPJVPBfxzMXeEAmVXaGS47j6mf/kcPHOcq2ahlMkc60U81lU5+974dtT2CxhUBsjgUSkwG+Pj8fwl7+wL3ZrK26jyy5DU14HXUosGlMTnURyW59w2bcfIJpEId4ihtXmIfXDNiBEmzNfCJXi5kskh8Tj641gV2o9CBqmsBCMbSV+YyNQWMh+VhEQQUsFcJgROjrb0zUuEjHoGKfG70VWWEwMxLVSdMwUQSTyXVkONqHwCIe6w4M3fIl52/kouFiHpgNZSLZU44nhW5Gk0LuIXxs2Efz7m/lo1puQFHse5voGHHplFszaPog2lTqHZKRpgQvtg+vv5dq5gY+9IVgC0Z+qrb+RyAL3+L1S4SIIhRTJtrHBEMpchCcXq0QoOkp4mkdGxz7o/sYcp7CLih65iPn6GyTUm9DhkglmqQQGdbxbm4SjCI6+XA2D5RLa60RoVshRrdIgJrebW9tAINXVSOkUwUWIB93jywVPUcgiEaLat2crtWZALBaBad+eXQAHcBcIQguaIEOjkCMAW2KbTtfais8RW2s+nY4dxyUBzjHpkBD2OmytLIsgImIUnmRQXR1e8Qu0em8X3ZSLvw7MxKKbcp3ErZPwtBIQ0io8uSJkhwdH+Ipom5hf/vkJvL2/CMs/P4G/vLoPBlPrLyTb+Xj82i5YOuBNPDfidRib0tBI3ItfG0SmxWdnFyA5rgQSphnJMaWQmRoQc+k7yBpOoIkkOb++/z3sV++MCBBJ2b+F9Pdyjf0N9jx8wSUWWchI5Cu8x69QcBGEXCKQr5T449uyb0OOOgcMGEhEEjBgXDy6oYg89jYPm4ht0sRBfPo8EnZ+AVGTEcmVzTDCCgvj3TFpe71FFYfOllgoM9rhdBqwfUZHpL+5xa194fz06ahYtRrV77+PilWrcX76dFgN3D4TISKIhajMughxQuxC3IbN45u08AkkTJuGpIVPoP07bwc/5KItHgQCU1gIEcNApFZDxDBgCgvhl0AQWtAEkauqArx+/Xr84x//QFlZGbp3746XXnoJw4cPD/e0gpLYdoXdiHm1DQhRvY2UDg9cq8gKqRgPjdLAEFuJwt+qUF4jwf/OPIkeMvfiV6cDlj+jw9j0Nahp0iAt5jwq9EmIimoACNMakuEongO1FQjVuSEUPYS97VvIqi0XcXuF9/gVCi6LtviI5EiPP+ZilQhFRwlf89BkZjuFXTDEhIoYBg1yMSwxCsTXNXhdLKeJ0qBPal9ApsMBUoI3/tIXUanpaBCZIG8zNtAKbqR0iuBaRQ60V7BgBFMgREoELQeuGgH8/vvv49FHH8X69esxdOhQbNiwAePGjcPx48eRmZkZtnkFM7HNdiP2978DRiPQ1guuVAK1tezPj4ULg3cNBrooTAjhyaXDA1drQiAimpeYl6uhGLgC2S2BFaOxGsufcW1vZhe/KflIUZVDo9Cj4bQKRmXrr5tkUw1qTEWux/DXViBk54ZA5iHEPLmIWyGT4yLBzxwBcBGEQolkIDLij31ZJULVUcLXPCQ1DfawC8KIYBEDJDoZ+muyIS8qcfEJ29HpgPx8iGpq8DMpwYa/ZCEqNRMrblwBtVLtcpxA7QdCRCoL0X1BSH+vEAvuOBEMgRBJEbQcuGoE8IsvvojZs2fj3nvvBQC89NJL+PLLL/Hqq69ixYoVYZlTsBPbIuFGTAj/rhAtzgDvVWYu8xSiTRpvMa/QOongscjH0qeXo8P4RtRY66ESxeDcZ1EYn7YIKapyZPdKwYHCXEC0vyUkg+WSVAWTVMAbPS5V00iIR+YyTyGrtlzF7RXe41cofAkxoUQyIGz8cbCqxFzfS7DDN8yqaJCmCqdtpKkCkpQR6P7M+tZkuNm3IG38LMTUWSBTxSPhyBGYykvws/mCk/jVRrn/5ipQ4ShUpHKgi9yE8vcKsaiPM0ILBA+ChuTkgPz2GyuGZTIwOTlg1C03Q2GMQQauEgFsNBpx6NAhPPnkk07bR48ejX379rl9TXNzM5qbm+2Pa2trBZ1TsBPbIuVGTIiFY76EpxAim481wdu8g1JFdhDB5NcyDKh7HJtX3I5RvXbjf7+Nwt1D30NyfDWye6WiMWsByP7VkMlNMDQrkGyqwSWpClK5CURfjMpSnUcPMS8ioXODUNVdoau2VNwKihAiGRAu/jiYVWKhO0r4Q2VRIRL2H4DYTNAoE4FRJoE0VdjDLnA/2MVus2+B9MwFnH/lWSRIUtGxrAY6uQjHe2qwcUpHn+IXEK6CG+xIZV/CVKgevkLMlRNCCwRPLdCsVjSeOwdYCWQEMFpZP3FUQoL3hLkQcVUIYJ1OB4vFguTkZKftycnJKC8vd/uaFStW4LnnngvKfIKd2BbsyjIfhIoGDnaLMyHmGdQqcosIllyai5zaE3hi8L+x46fJeGLwv6GJuwxJakc0Zi3AsY/W2EMyzGkZqDEVwSTNBNEXQ8lUOLVG84qvymokdG4QqrobjKotDboQBK6V1lDGHwe7+ipURwmAf6Xa1vJMWVmLps7tUT9wACQ1DTCroiHdf8Ap7CJt/Cycf+VZRBktIE0lMEKKo3FmLOkJZKcM9yl+AeEquN4QosuDUK3SQjFXnwhdqfWRMGetqwfEIhhEMvY5rglzIeCqEMA2mDYr+AkhLtts5OfnY/78+fbHtbW1yHBsCO0nfBLbbGkVfBLbgl1Z5otQPX69IYR4DfUCN7/6BCu0uKRvh77R38BqFuOeUZsAAJ2iL2Bf6XBUfbTG3uc376+eQzB8imAuldVg2xuE6h/Mx7oglFDn2jKN4pVgVFqFiD8ORT9fX3CZJ9/z1zbMIs9DGIbN/5vUZwwSJKms+BUTnIk3YmtvGSyEoF9GP5/i10awK7hC+HOFEqZh7xUsdKWWa8JcmwhaTglzIYhDvioEsFarhVgsdqn2VlRUuFSFbcjlcsjlbdesBg7DeI3OhlImBiGAxSC1B1aIFSYoZc6C0F10NpfKsiiAyrI/hKLHrxDiNeQL3Dzg62ZAXg+s/fxx3DJ0BwgAAhFe+uohDOl7CIoEq88+wUffzIeS8SGCuVRWg2lvELJ/cDDmKYTvmOITrj2AhRSZQlWJQ7GYztc8+VSqHcWtUaNC3pr/Qu2lz69CVw3dnvfQtbwRhEhxIaYZFhFw21ET/i8hBXqT3v66QBd1hWqhnDeEEKZh7xUcrEqtF0EjUioAQiC2WOwBGxYxw253xJ2gCQFXhQCWyWTo168fdu/ejcmTJ9u37969GxMnTgz5fHwlthWXmaGvVIKYxTBXxiA6tclnYhuXyjIxSGF0ENV8Ksv+4usrfyHsC0IskhOiS0SgQtzXzYBOB3z4w624qfdyyMRGiEVm1BmjceforSipyUKDtSN63um9T/CnZ5/AcPVKpCawIrjHjFVISGmzOptP+7JgCDquAjJSq7s06EIQfFVagyUyhagSB9smwWWeXCvV1SVnnMRv7+43QLLuFeAfneDUbgatIrjwrvHoerQEMBvxh0YEk4hBeq0VFpEVfX4rgbGe/bkoxKIuruLTk9Dm6s8N9iI3rjYKIbzELnCs1IrN5lahKpFyq9T6SJizFBdDVtMIhhCIjEYYVVH8EuaCyFUhgAFg/vz5uPPOO9G/f38MHjwYGzduRFFREebMmROW+Xi6ZvR6BqiJg5QhEEdZYDFJgJo46PUMEhI8Xyu+KstWgxTGSgWsLaIamnrOleVACXaPX6EWyQXaJSLQKrK3m4FJuR2x/Bkdbuq1BSmSSrRXXsCh0r7o3K4QZqsE6eqLeO3Eeg59glfDBDUMTTUgpBkxf7wDaGb75+/1l0jvH+xtfkL5jik+8VVpDVfHBiH7+QbTJsHVJyyJT0CJioHSYEXNA1Og2PQ5pJcrkf33x6D4xzpXERylQd/UvqgvKENlvAxVMWYomq04nSxFvYIgpZ6BbNV/UNllEvB/PwW8qIuL+OSySC2QSGUhhGlYewX7EAgipQJisxlyo9EuVJvBo1LrKWFOr4eCEBCpFEQiAWM2Q0EIGL0eXgVNiLhqBPC0adNQWVmJpUuXoqysDHl5efj888+RlcX9K26haXvNqFTsQkyTiUF8LANABCjYftTHj7MLMmtq+EVxMwzraa8qUYAhFohkZhCTiHNlOdgI5REO9iI5LvsItE2a480AsTCwGiWQR5tReL4Zy9+19fm9hOwe3aEQjcOQ5E9xpiwTscrLKKlKx3XJa7Ds6RVY/LyXPsHxZciO+hKGIguiRWZIv/kUOP5+6Py9kd4/2Nf8hPQdU7ziq9Iazo4NQvTzDbZNgqtPePY3c3BqtBhRBi2qa3ZAObwBy78EUPCtqwi29fmtrsb5DmrUiE2IratHVbIMr03JxMSciUh58T0odTV2n7BN9IksFlhFIkAi4eWd5SI+A/UJC7XIzVsVOej+Xl94q9QqlRBb2AQ7q0gExmqF3GKGyDHFzZdA8CBoGJMJTHx86ziugiYEXDUCGADmzp2LuXPnhnsaTtiumQceAI4cAUQiIDraeUxUFNDQwD7fpQv3KO62olodJ4bBDFikBBYjt8pysAmFR1iIKjPXffiqInOxUBALA/1PnWGpUyBu4Bmc/FiBB3vl2/v8KgauYLtCGB5Cp/35OHO0COnqC2gslWJIVL6TCG4bkpGdVgvFCT0UtsMShNbfG+7+wYH6d8PlO74K8VVpjeS+vpFgk+DlE5YyqJVKIAbQlBSNV6ckYO62YmcRDAD5+TAWn8elk4eRamiCIYFBXUoCfpx9Hd67dR20UVpUdptut1SUffsBokkUVGYREnWXYZZIodNqOdsXbPgSn4H6hIVY5OarihxUfy9X3Ingmho2BlkuB1EoAKsVjEgEhhA2DlksZoUEF4EgtKAJMleVAA4E0iJ8hO4HDLDXgsXS0vkB7L8drQe27YSwzzU0sAEtnsjLA555hv2G4vBh9hqMimJfLxcDEAOQsq3+CgqArl3ZPtgJCezr8vK8719oNv81D+8fLEJJdRPSE5SYdk0mjE0NMDYB/913DsfOl7PvvWX8sfONeP3rY5g5pAOn/WvlFpgMDXAsNJsYdjvXzzPQfRhMFszYtB+F5XV2If/BT3/grdkD7SL4lm4J+OAnMY6fawJT14hoQx1EXyVh5u1LEKOoQGrnZBhzn4LRKAOMtQBkQO5TiK16FicOmpEcdxoNzUb0UTyCW2cswIgpMlzep8DolKWIUVxiX1+fAmPTMYA4/KBnGKCk0PVD735n67+bTOwfX5iagCNvAjVFgCoT6HOns/ArKQSaGTidSHfHn/qR6364zsHb3LZOAipOAIyIFbg/vwXc9XHrHH3Nr+sU9jWO+0jOZbcLcf4oLkzKmGT/t7HRCCOMAICxqWOxQ7EDf1T/YReZXRO6YmzqWPv/ydOXTgPNcBLKEpEEpy+dRm0GO8ZgNuBvu//mtJ8dx3Zgw6gNAYngfw/9N3ac2oGShhKkR6djcpfJTvPnMjfb/Nruh8+8PJ0/b3Po0mkwPrmjHW5880fU//4NOt9/D5iL5TBV6XBSoUdaQwMUTUaoocAn9/XHwzcuhcwsQ21tLaSqVGSuexsnHrodcl0NKo3l0OhE0FutgJnAnJUF8U032T8jq8GAC7Nnw1j4h10YyrZtQ9amTZwtBgatBvVGo/P/W6sVSq2G28/nAF8PAFVvv43KYwVOVeT6YwUQbd4M9V//CgBQv/YaarZtg+liCaTt0qH6y1/Y4xqN3nYtLDaB8MwzrJe3poadr9LNDXpTEztGpQJSU7kJBKEFjR/YPjPi+Hm6gSG+RlAAABcvXhSkDRqFQqFQKBQKJbgUFxejXTvPFhMqgDlitVpRWlqK2NhYj72DKSy2nsnFxcWIa5svTvEIPW/+Qc+b/9Bz5x/0vPkPPXf+Qc8bdwghqKurQ1paGkQikcdx1ALBEZFI5PVOguJKXFwc/Y/qB/S8+Qc9b/5Dz51/0PPmP/Tc+Qc9b9yId1x45wHP0phCoVAoFAqFQvkTQgUwhUKhUCgUCuWqggpgiuDI5XIsWbIkKFHSf2boefMPet78h547/6DnzX/oufMPet6Ehy6Co1AoFAqFQqFcVdAKMIVCoVAoFArlqoIKYAqFQqFQKBTKVQUVwBQKhUKhUCiUqwoqgCkUCoVCoVAoVxVUAFMEYe/evWAYxu2fgwcP2se5e/61114L48wjg/bt27uclyeffNJpTFFRESZMmIDo6GhotVo8/PDDMIYyQz7COH/+PGbPno0OHTpAqVSiU6dOWLJkics5odece9avX48OHTpAoVCgX79++P7778M9pYhixYoVuOaaaxAbG4ukpCRMmjQJhYWFTmNmzZrlcm0NGjQoTDOOHJ599lmX85KSkmJ/nhCCZ599FmlpaVAqlRg5ciQKCgrCOOPIwN3vAYZhMG/ePAD0ehMamgRHEYQhQ4agrKzMadvixYuxZ88e9O/f32n75s2bMXbsWPtjLoktVwNLly7FfffdZ38cExNj/7fFYsH48eORmJiIH374AZWVlZg5cyYIIXj55ZfDMd2wc/LkSVitVmzYsAGdO3fGsWPHcN9996GhoQFr1qxxGkuvOWfef/99PProo1i/fj2GDh2KDRs2YNy4cTh+/DgyMzPDPb2I4Ntvv8W8efNwzTXXwGw2Y9GiRRg9ejSOHz+O6Oho+7ixY8di8+bN9scymSwc0404unfvjj179tgfi8Vi+79Xr16NF198EVu2bEHXrl3x/PPPY9SoUSgsLERsbGw4phsRHDx4EBaLxf742LFjGDVqFKZOnWrfRq83ASEUShAwGo0kKSmJLF261Gk7ALJjx47wTCqCycrKIuvWrfP4/Oeff05EIhEpKSmxb3v33XeJXC4ner0+BDO8Mli9ejXp0KGD0zZ6zbkyYMAAMmfOHKdtOTk55MknnwzTjCKfiooKAoB8++239m0zZ84kEydODN+kIpQlS5aQXr16uX3OarWSlJQUsnLlSvs2g8FA4uPjyWuvvRaiGV4ZPPLII6RTp07EarUSQuj1JjTUAkEJCjt37oROp8OsWbNcnnvwwQeh1WpxzTXX4LXXXoPVag39BCOQVatWQaPRoHfv3li+fLnTV/k//fQT8vLykJaWZt82ZswYNDc349ChQ+GYbkSi1+uhVqtdttNrrhWj0YhDhw5h9OjRTttHjx6Nffv2hWlWkY9erwcAl+tr7969SEpKQteuXXHfffehoqIiHNOLOE6dOoW0tDR06NABt99+O86ePQsAOHfuHMrLy52uP7lcjhEjRtDrzwGj0Yi33noL99xzDxiGsW+n15twUAsEJShs2rQJY8aMQUZGhtP2ZcuW4YYbboBSqcTXX3+Nxx9/HDqdDk8//XSYZhoZPPLII+jbty8SEhJw4MAB5Ofn49y5c3jjjTcAAOXl5UhOTnZ6TUJCAmQyGcrLy8Mx5YjjzJkzePnll7F27Vqn7fSac0an08FisbhcT8nJyfRa8gAhBPPnz8ewYcOQl5dn3z5u3DhMnToVWVlZOHfuHBYvXozrr78ehw4duqoTuwYOHIitW7eia9euuHTpEp5//nkMGTIEBQUF9mvM3fV34cKFcEw3Ivn4449RU1PjVESi15vAhLsETYlslixZQgB4/XPw4EGn1xQXFxORSEQ++ugjn/tfs2YNiYuLC9b0w4o/587GRx99RAAQnU5HCCHkvvvuI6NHj3YZJ5VKybvvvhvU9xFq/DlvJSUlpHPnzmT27Nk+9/9nvua4UFJSQgCQffv2OW1//vnnSXZ2dphmFdnMnTuXZGVlkeLiYq/jSktLiVQqJdu2bQvRzK4M6uvrSXJyMlm7di358ccfCQBSWlrqNObee+8lY8aMCdMMI4/Ro0eTm2++2esYer0FBq0AU7zy4IMP4vbbb/c6pn379k6PN2/eDI1Gg1tuucXn/gcNGoTa2lpcunTJpSJwpePPubNhW9l7+vRpaDQapKSkYP/+/U5jqqurYTKZrvrzVlpaiuuuuw6DBw/Gxo0bfe7/z3zNcUGr1UIsFrtUeysqKq7K8+GLhx56CDt37sR3332Hdu3aeR2bmpqKrKwsnDp1KkSzuzKIjo5Gjx49cOrUKUyaNAkA+61WamqqfQy9/lq5cOEC9uzZg+3bt3sdR6+3wKACmOIVrVYLrVbLeTwhBJs3b8Zdd90FqVTqc/yRI0egUCigUqkCmGVkwvfcOXLkyBEAsP+CGDx4MJYvX46ysjL7tq+++gpyuRz9+vUTZsIRAp/zVlJSguuuuw79+vXD5s2bIRL5XtbwZ77muCCTydCvXz/s3r0bkydPtm/fvXs3Jk6cGMaZRRaEEDz00EPYsWMH9u7diw4dOvh8TWVlJYqLi52EHQVobm7GiRMnMHz4cHTo0AEpKSnYvXs3+vTpA4D1u3777bdYtWpVmGcaGWzevBlJSUkYP36813H0eguQcJegKX8u9uzZQwCQ48ePuzy3c+dOsnHjRnL06FFy+vRp8vrrr5O4uDjy8MMPh2GmkcO+ffvIiy++SI4cOULOnj1L3n//fZKWlkZuueUW+xiz2Uzy8vLIDTfcQA4fPkz27NlD2rVrRx588MEwzjy82GwP119/Pbl48SIpKyuz/7FBrzn3vPfee0QqlZJNmzaR48ePk0cffZRER0eT8+fPh3tqEcMDDzxA4uPjyd69e52urcbGRkIIIXV1deTxxx8n+/btI+fOnSPffPMNGTx4MElPTye1tbVhnn14efzxx8nevXvJ2bNnyc8//0xuvvlmEhsba7++Vq5cSeLj48n27dvJ0aNHyR133EFSU1Ov+vNGCCEWi4VkZmaShQsXOm2n15vwUAFMEZQ77riDDBkyxO1zX3zxBenduzeJiYkhUVFRJC8vj7z00kvEZDKFeJaRxaFDh8jAgQNJfHw8USgUJDs7myxZsoQ0NDQ4jbtw4QIZP348USqVRK1WkwcffJAYDIYwzTr8bN682aNH2Aa95jzzyiuvkKysLCKTyUjfvn2d2ntRiMdra/PmzYQQQhobG8no0aNJYmIikUqlJDMzk8ycOZMUFRWFd+IRwLRp00hqaiqRSqUkLS2N3HrrraSgoMD+vNVqJUuWLCEpKSlELpeTa6+9lhw9ejSMM44cvvzySwKAFBYWOm2n15vwMIQQEo7KM4VCoVAoFAqFEg5oH2AKhUKhUCgUylUFFcAUCoVCoVAolKsKKoApFAqFQqFQKFcVVABTKBQKhUKhUK4qqACmUCgUCoVCoVxVUAFMoVAoFAqFQrmqoAKYQqFQKBQKhXJVQQUwhUKhhJlnn30WvXv3Dvc0XBg5ciQeffTRoOx71qxZmDRpUsD7KSwsREpKCurq6jyO2bJli+DR1xUVFUhMTERJSYmg+6VQKKGBCmAKhXLFMWvWLDAMgzlz5rg8N3fuXDAMg1mzZoV+YhxgGAYff/yx07YFCxbg66+/9nufgQrovXv3gmEY1NTUOG3fvn07li1bZn/cvn17vPTSS34fJxgsWrQI8+bNQ2xsbEiPm5SUhDvvvBNLliwJ6XEpFIowUAFMoVCuSDIyMvDee++hqanJvs1gMODdd99FZmZmGGfGn5iYGGg0mnBPwwW1Wh1yYcmHixcvYufOnbj77rvDcvy7774bb7/9Nqqrq8NyfAqF4j9UAFMolCuSvn37IjMzE9u3b7dv2759OzIyMtCnTx+nsbt27cKwYcOgUqmg0Whw880348yZM05j9u3bh969e0OhUKB///74+OOPwTAMfv31VwCtVdKvv/4a/fv3R1RUFIYMGYLCwkKn/Xz66afo168fFAoFOnbsiOeeew5msxkAW0EFgMmTJ4NhGPtjdxXc//znP+jevTvkcjlSU1Px4IMP+n2u3nrrLfTv3x+xsbFISUnB9OnTUVFRAQA4f/48rrvuOgBAQkKCU/Xc0QIxcuRIXLhwAY899hgYhgHDMB7n/tJLL9nfGwBYLBbMnz/ffv6feOIJEEKcXkMIwerVq9GxY0colUr06tULH330kdf39cEHH6BXr15o166d0/YtW7YgMzMTUVFRmDx5MiorK11e6+1zAoCTJ09i2LBhUCgU6NatG/bs2eNSve/RowdSUlKwY8cOr/OkUCiRBxXAFArliuXuu+/G5s2b7Y//85//4J577nEZ19DQgPnz5+PgwYP4+uuvIRKJMHnyZFitVgBAXV0dJkyYgB49euDw4cNYtmwZFi5c6PaYixYtwtq1a/HLL79AIpE4He/LL7/EjBkz8PDDD+P48ePYsGEDtmzZguXLlwMADh48CADYvHkzysrK7I/b8uqrr2LevHm4//77cfToUezcuROdO3f27yQBMBqNWLZsGX777Td8/PHHOHfunF3kZmRkYNu2bQBYP21ZWRn++c9/uuxj+/btaNeuHZYuXYqysjKUlZVxPv7atWvxn//8B5s2bcIPP/yAqqoqF9H49NNPY/PmzXj11VdRUFCAxx57DDNmzMC3337rcb/fffcd+vfv77Rt//79uOeeezB37lz8+uuvuO666/D88887jfH1OVmtVkyaNAlRUVHYv38/Nm7ciEWLFrmdw4ABA/D9999zPhcUCiVCIBQKhXKFMXPmTDJx4kRy+fJlIpfLyblz58j58+eJQqEgly9fJhMnTiQzZ870+PqKigoCgBw9epQQQsirr75KNBoNaWpqso95/fXXCQBy5MgRQggh33zzDQFA9uzZYx/z2WefEQD21w0fPpy88MILTsd68803SWpqqv0xALJjxw6nMUuWLCG9evWyP05LSyOLFi3ifD7avt4XBw4cIABIXV0dIaT1vVVXVzuNGzFiBHnkkUfsj7Oyssi6det8HnvdunUkKyvL/jg1NZWsXLnS/thkMpF27dqRiRMnEkIIqa+vJwqFguzbt89pP7NnzyZ33HGHx/fRq1cvsnTpUqdtd9xxBxk7dqzTtmnTppH4+Hj7Y1+f0xdffEEkEgkpKyuzP7979263n91jjz1GRo4c6XGOFAolMpGET3pTKBRKYGi1WowfPx7//e9/QQjB+PHjodVqXcadOXMGixcvxs8//wydTmev/BYVFSEvLw+FhYXo2bMnFAqF/TUDBgxwe8yePXva/52amgqA7QiQmZmJQ4cO4eDBg/ZKIsB+/W8wGNDY2IioqCif76miogKlpaW44YYbuJ0EDhw5cgTPPvssfv31V1RVVTm9/27dugl2HHfo9XqUlZVh8ODB9m0SiQT9+/e32yCOHz8Og8GAUaNGOb3WaDS62FkcaWpqcvrMAODEiROYPHmy07bBgwdj165d9se+PqfCwkJkZGQgJSXF/ryn60GpVKKxsdHjHCkUSmRCBTCFQrmiueeee+z+2FdeecXtmAkTJiAjIwOvv/460tLSYLVakZeXB6PRCID1n9o8rTZIG4+qDalUav+37TU2QWm1WvHcc8/h1ltvdXldW6HmCaVSyWkcVxoaGjB69GiMHj0ab731FhITE1FUVIQxY8bY338giEQil3NlMpl47cN2/j777DOkp6c7PSeXyz2+TqvVuixA8/S5tT2et8/J3fXgiaqqKiQmJnIaS6FQIgcqgCkUyhXN2LFj7UJuzJgxLs9XVlbixIkT2LBhA4YPHw4A+OGHH5zG5OTk4O2330Zzc7NdcP3yyy+859K3b18UFhZ69etKpVJYLBaPz8fGxqJ9+/b4+uuv7YvTAuHkyZPQ6XRYuXIlMjIyALi+N5lMBgBe52Ub13ZMYmIiysvLnUSjbeEgAMTHxyM1NRU///wzrr32WgCA2WzGoUOH0LdvXwBAt27dIJfLUVRUhBEjRnB+b3369MHx48edtnXr1g0///yz07a2j319Tjk5OSgqKsKlS5eQnJwMAB792seOHcPIkSM5z5lCoUQGVABTKJQrGrFYjBMnTtj/3ZaEhARoNBps3LgRqampKCoqwpNPPuk0Zvr06Vi0aBHuv/9+PPnkkygqKsKaNWsAgHMlEACeeeYZ3HzzzcjIyMDUqVMhEonw+++/4+jRo/aFWDZxO3ToUMjlciQkJLjs59lnn8WcOXOQlJSEcePGoa6uDj/++CMeeughj8duampyEp4A214tMzMTMpkML7/8MubMmYNjx4459fYFgKysLDAMg//973+46aaboFQqERMT43KM9u3b47vvvsPtt98OuVwOrVaLkSNH4vLly1i9ejWmTJmCXbt24YsvvkBcXJz9dY888ghWrlyJLl26IDc3Fy+++KJTz+HY2FgsWLAAjz32GKxWK4YNG4ba2lrs27cPMTExmDlzptv3PGbMGNx7772wWCz2z/7hhx/GkCFDsHr1akyaNAlfffWVk/2By+c0atQodOrUCTNnzsTq1atRV1dnXwTneD00Njbi0KFDeOGFFzx+LhQKJUIJn/2YQqFQ/MO2CM4TbRfB7d69m+Tm5hK5XE569uxJ9u7d67Kg6ccffyQ9e/YkMpmM9OvXj7zzzjsEADl58iQhxP1CsSNHjhAA5Ny5c/Ztu3btIkOGDCFKpZLExcWRAQMGkI0bN9qf37lzJ+ncuTORSCT2hWLuFpK99tprJDs7m0ilUpKamkoeeughj+93yZIlBIDLnxEjRhBCCHnnnXdI+/btiVwuJ4MHDyY7d+50WuBHCCFLly4lKSkphGEY+7lruwjup59+Ij179iRyuZw4/vp49dVXSUZGBomOjiZ33XUXWb58udMiOJPJRB555BESFxdHVCoVmT9/PrnrrrucPkOr1Ur++c9/2t9zYmIiGTNmDPn22289vm+z2UzS09PJrl27nLZv2rSJtGvXjiiVSjJhwgSyZs0ap0VwhPj+nE6cOEGGDh1KZDIZycnJIZ9++ikB4HSsd955h2RnZ3ucH4VCiVwYQjgYpigUCuUq4+2338bdd98NvV4vuC+XIhzr16/HJ598gi+//DKox/nxxx8xbNgwnD59Gp06dQLALox79NFHMX369KAem0KhCA+1QFAoFAqArVu3omPHjkhPT8dvv/2GhQsX4rbbbqPiN8K5//77UV1djbq6OkFT63bs2IGYmBh06dIFp0+fxiOPPIKhQ4faxW9FRQWmTJmCO+64Q7BjUiiU0EErwBQKhQJg9erVWL9+PcrLy5GamopJkyZh+fLlnFqXUf58bN26FcuWLUNxcTG0Wi1uvPFGrF27NiIjqykUCn+oAKZQKBQKhUKhXFXQKGQKhUKhUCgUylUFFcAUCoVCoVAolKsKKoApFAqFQqFQKFcVVABTKBQKhUKhUK4qqACmUCgUCoVCoVxVUAFMoVAoFAqFQrmqoAKYQqFQKBQKhXJVQQUwhUKhUCgUCuWqggpgCoVCoVAoFMpVxf8DmS+rNg++ihQAAAAASUVORK5CYII=", + "image/png": "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1FlnneWzLjIyUt1yyy1V9vnmm28UoL755hvvsnvvvVf5+/OyZ88eBai5c+dWWQeoKVOmeL8/77zzVLt27VRpaal3WXFxsYqPj/d57rVr1ypAzZ492+f5srKylNVqVRMnTqzlVSv13//+V7Vt21YlJCSoXr16qfz8/Fr38ee7775TgHrkkUeUUkq53W7VqVMn1bFjR+V2u3227dixo8/53LhxY7XnZsqUKVXO5xlnnKEuvvjiKtt6fu579uzxWV7551RQUKAsFou65pprfLb7/vvvFeDz3DNmzFAGg6HKtfTBBx8oQH3xxRd+zoZu0aJFClD/+c9/qqxzOBw+j4o6duyoLBaL2rdvn3dZaWmpio+PV3fddZd32Q033KDCw8PV/v37ffa//PLLVUREhCosLFRKKXXVVVep3r17V9tOpZR69tln/Z47f9atW+fzs65NXa7TW265RXXs2NFnu8rXSyCvRwhRPRkCIUQL9/7773P++efTqlUrTCYTZrOZOXPmsGPHjqC16dixY2zcuJGRI0disVi8y6Oiohg+fLjPtp999hmapjF69GicTqf3kZyczJlnnlnjR9igv/57772Xjz/+mK+++oo//viDQYMGYbPZvNsMGjSIiy++uNZ2e25+u/XWWwF9WMfYsWPZt28fX331VaAvv1GsXbsWu93OTTfd5LN8wIABdOzY0WfZZ599Ro8ePejdu7fPOR46dGitwwSqU1hYiNls9nlUrljSu3dvOnTo4P3eYrHQtWtXnyElX3/9NZdddhmpqak++44dO5aSkhLvpxDnnnsuP/74I/fccw//+9//KC4urnObT8WpXqeVBfv1CNHUSQAWogX76KOPvOWbFixYwNq1a9m4cSO33nordrs9aO0qKCjA7XaTnJxcZV3lZQcOHEApRVJSUpVAtW7dOvLz82s81tSpUxk6dCjnnnsuZ555Jl999RXZ2dkMGjSIgoICjh07xqZNm7zDEqpz5MgR3n//fc4991xat25NYWEhhYWFXHPNNWia5g3HoeLw4cNA1fPpb9mBAwf46aefqpzfqKgolFI1nmNPgK08DjoqKoqNGzeycePGaoeHJCQkVFkWHh5OaWmpz+vwDFeoqF27dj6vc/Lkyfzf//0f69at4/LLLychIYHLLrvspMsEel7Xnj17Atr+VK/Tyur79QjR0sgYYCFasAULFtCpUyfeffddnzGc1dWuPVWe3tzKz+8JKR5xcXFomkZeXl6V56i8LDExEU3TWLVqld9xsLWNjd21axe9e/f2ft+rVy+++eYbLr30UgYPHswFF1yA2WzmrrvuqvF53nnnHUpKStiwYQNxcXFV1i9evJiCggK/6+pTdee4csDyhMvqznHFOrSJiYlYrVa/N6B51lenT58+xMXF8emnnzJ9+nTvcqPRSN++fQH9JraTlZCQ4Hds+R9//OHTNpPJxLhx4xg3bhyFhYWsWLGCRx99lKFDh5KVlRXwOF6Ptm3b0rNnT5YtW0ZJSUmt+5/qdVpZfb8eIVoa6QEWogXTNI2wsDCf8JuXl1elCgRU7Xmriec/88rbJyUlYbFY+Omnn3yWVz5eZGQk5557Lh999JFPT/SRI0f49NNPfba96qqrUEqRk5ND3759qzx69uxZY1t79OjB8uXLfYJgjx49+Oabb9i1axcvvPACzz77LDExMTU+z5w5c4iKiuKrr77im2++8Xk8++yzlJWV8fbbb1e7f3XnrKbt/W3rCa6Vz/GSJUt8vu/Xrx8Wi6VKm9asWVOlt/aqq65i165dJCQk+D3HlSdtqCgsLIyHH36YX375hZkzZwb02urisssu4+uvv/YGXo8333yTiIgIvyX6YmNjufbaa7n33nux2Wzeihl1/Rk8/vjjFBQUcP/996OUqrL+6NGjLFu2DDj167Qm1b0eIUT1pAdYiGbu66+/9vsf4hVXXMFVV13FRx99xD333OOtAvDUU0/Rtm3bKiXBevbsycqVK/n0009p27YtUVFRPpUCKm8Lev3Xyy+/HKPRSK9evQgLC2P06NG88cYbnHbaaZx55pls2LCBhQsXVnmOp556imHDhjF48GDGjx+Py+Vi5syZREZG+ozPPf/887nzzjv561//yqZNm7jooouIjIwkNzeX1atX07NnzxorEPzzn/9kyJAh9O/fn4cffpiMjAxyc3N57733KCkpISkpiRkzZjB06FC/H7WD3oO5YcMG7r77bi699NIq688//3xmz57NnDlz+Nvf/ub3OU477TSsVitvv/02GRkZtGrVinbt2nk/yvd3jhctWsS7775L586dsVgs9OzZk3POOYdu3boxYcIEnE4ncXFxLF68mNWrV/vsHxcXx4QJE3j66ae5/fbbue6668jKymLq1KlVhkA8+OCDfPjhh1x00UU89NBD9OrVC7fbzf79+1m2bBnjx4/nvPPOq/YcT5o0iczMTB555BG+++47rr/+etLS0igrK2P37t28/vrrGI3Gk+q1nDJlCp999hmXXHIJTzzxBPHx8bz99tt8/vnnzJo1y/vGZfjw4fTo0YO+ffvSunVr9u3bx/PPP0/Hjh3p0qWL95wCvPDCC9xyyy2YzWa6detGVFSU32Nfd911PP744zz11FNkZmZy2223cdppp1FSUsL69et59dVXuf766xkyZMgpX6eVBfJ6hBA1COYdeEKIhuOpBlDdw3On+z/+8Q+VlpamwsPDVUZGhnrttdf8Vh3YunWrOv/881VERIRPlQB/VSDKysrU7bffrlq3bq00TfM5XlFRkbr99ttVUlKSioyMVMOHD1d79+6tUgVCKaWWLFmievXqpcLCwlSHDh3UP/7xD79tU0qpN954Q5133nkqMjJSWa1Wddppp6kxY8aoTZs21XqufvzxR3Xttdeq1q1bK5PJpFJSUtRf//pXtW3bNrVz506VmJio0tPTVV5ent/9H3zwQQWorVu3VnuMRx55RAFq8+bNSqmqd/UrpdQ777yj0tPTldls9jkf/l7z3r171ZAhQ1RUVJQCfKoG/Prrr2rIkCEqOjpatW7dWt13333q888/r/JzcrvdasaMGSo1NVWFhYWpXr16qU8//VRdfPHFVSpMHD16VD322GOqW7duKiwsTMXExKiePXuqhx56qNrzUtmSJUvU8OHDVVJSkjKZTCoqKkr17t1bjR8/XmVmZvps27FjR3XllVdWeQ5/bfv555/V8OHDVUxMjAoLC1NnnnlmlWoas2fPVgMGDFCJiYne6+m2225Te/fu9dlu8uTJql27dspgMFQ5X9X59ttv1bXXXqvatm2rzGazio6OVv3791fPPvusKi4u9tk2kOs0kCoQgb4eIYR/mlJ+PrcRQgghhBCimZIxwEIIIYQQokWRACyEEEIIIVoUCcBCCCGEEKJFkQAshBBCCCFaFAnAQgghhBCiRZEALIQQQgghWhQJwEIIIYQQokWRACyEEEIIIVoUCcBCCCGEEKJFkQAshBBCCCFaFAnAQgghhBCiRZEALIQQQgghWhQJwEIIIYQQokWRACyEEEIIIVoUCcBCCCGEEKJFkQAshBBCCCFaFAnAQgghhBCiRZEALIQQQgghWhQJwEII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afBavi2c9ACLemUxG/nw7gFSBUI0Kk+1h+p4PvaurD6rQA4fPpzU1FRee+012rVrh9vtpkePHgF9nF5XBoOhStsdDkednsMzNOPzzz+nffv2PuuqmyK6uvPlb3nFShagl0bzHFMp5RN+Kz6HpmkYjUaWL1/OmjVrWLZsGf/+97/5+9//zvr1671vLGpjtVprXO92u+nTpw9vv/12lXWtW7eu9fmjoqL44YcfWLlyJcuWLeOJJ55g6tSpbNy4sdoefSHqwmCxkLZwYehXgWiiJACLemcxG7n9ws7BboYQjebw4cPs2LGDV199lQsvvBCA1atX17hPWFgYoN+sVtt2lbdp3bo1eXl5PkFy69at3vUxMTG0bduWdevWecelOp1ONm/e7O297d69O+Hh4ezfv9/vcAd/0tPTcTqdbNmyhT59+gDw+++/U1hYGND+Ht27d+fDDz/0af+aNWuIioryhnFN0zj//PM5//zzeeKJJ+jYsSOLFy9m3Lhxfs9JZV26dMFqtfLVV19x++23V1l/9tln8+6779KmTZuTru1uMpkYNGgQgwYNYsqUKcTGxvL1118zcuTIk3o+ISozWCwkHL9BVtQvGQIhhGjyjh49WuVx4MAB7/oDBw743aa+eKoI/Pe//+X333/n66+/Zty4cTXu07FjRzRN47PPPuPQoUPVtictLY3vvvuOnJwc8vPzAb06xKFDh5g1axa7du3ipZde4ssvv/TZ74EHHuAf//gHixcvJjMzk3vuuccnqEZFRTFhwgQeeugh5s+fz65du9iyZQsvvfQS8+fP99uW9PR0Bg0axJ133smGDRvYsmULd955J1artUqPbk3uuecesrKyuO+++8jMzOSTTz5hypQpjBs3DoPBwPr165k+fTqbNm1i//79fPTRRxw6dIiMjAzvOfnpp5/YuXMn+fn5fnu/LRYLkyZNYuLEid5hHevWrWPOnDkA3HTTTSQmJjJixAhWrVrFnj17+Pbbb3nggQfIzq79JqPPPvuMf/3rX2zdupV9+/bx5ptv4na76datW8DnQQgRREoEpKioSAGqqKgo2E0RolkrLS1V27dvV6Wlpaf0PEePHlWAAtTRo0frqXXVW758ucrIyFDh4eGqV69eauXKlQpQixcvVkoptWfPHgWoLVu2ePd58sknVXJystI0Td1yyy1KKaUuvvhi9cADD3i3Wbt2rerVq5cKDw9XFf9kv/LKKyo1NVVFRkaqMWPGqGeeeUZ17NjRu97hcKgHHnhARUdHq9jYWDVu3Dg1ZswYNWLECO82brdbvfDCC6pbt27KbDar1q1bq6FDh6pvv/222tf5xx9/qMsvv1yFh4erjh07qoULF6o2bdqo//znP95tKr5uj5iYGDV37lzv9ytXrlTnnHOOCgsLU8nJyWrSpEnK4XAopZTavn27Gjp0qGrdurUKDw9XXbt2Vf/+97+9+x48eFANHjxYtWrVSgHqm2++8dtWl8ulnn76adWxY0dlNptVhw4d1PTp073rc3Nz1ZgxY1RiYqIKDw9XnTt3VnfccYf37/wtt9zic74q/mxWrVqlLr74YhUXF6esVqvq1auXevfdd6s9b/V1XQshahZoXpOpkAMUqlMhC9Hc1NeUsaE+E1xzkZ2dTWpqKitWrKj2hjMhUyEL0VhkKmQhhBD17uuvv+bo0aP07NmT3NxcJk6cSFpamtTAFUI0KRKARciwO1xSPUKIEOdwOHj00UfZvXs3UVFRDBgwgLfffrtK1QchhM5tt0slhxAkAViEBLvDxZ9fWcP23GKMmoZLKRZvyeHDuwdICBYihAwdOpShQ4cGuxlCNAluu529N96oT2lsNILLRdGSJaQtXCghOMikCoQICQvW7WN7brE+5blboRRszy1mwbp9wW6aaKIiIyNRSqGUkvG/QoigKFi0SA+/SoHTCUpRtiOTgkWLgt20Fk8CsAgJWbYSjJXKKBk1jSybzKwkhBCiaXJkZes9vxUZjfpyEVQSgEVISI2PwFWpIIlLKVLjI4LUItEcKKXIzMys1xnfhBAiUObUFKg8aYvLpS8XQSUBWISE0f060r1ttD7luUFD06B722hG9+sY7KaJJkopxcMPP0xGRgYPP/ywhGAhRKOLu+EGwjPS0f9zM4GmEZ6RQdwNNwS7aS2e3AQnQoLFbOTDuwdIFQhRLzzhd/bs2QDer88++2ydZiyryK3c7LLtAuC0+NMwaNJ/EDKUG47qPxtanQbysxEhwmCxkLZwoVSBCEESgEXIsJiN3H5h52A3QzRxlcOvR32EYCGEqCuDxULC2LHBboaoRN4mCyGajerCr8fs2bNDejjEvHnziI2NbfDjDBw4kAcffLDBj9PQKp+vqdP/Re+zzg5eg4QQTYYEYCFEs1Bb+PUI9RDcHDRWkBdCiJMlAVgI0eQFGn49JAQLIUTLJgFYCNGk1TX8etQ1BLvdThzOUsocxzhctB+32+mzfuDAgfztb3/jb3/7G7GxsSQkJPDYY4/5PH9BQQFjxowhLi6OiIgILr/8cn777bcaj/vpp5/Sp08fLBYLnTt3Ztq0aTidzmq3dzqd3H///d42TJo0iVtuuYWrr7660utxM3HiROLj40lOTmbq1Kk+6/fv38+IESNo1aoV0dHRjBo1igMHDnjX//jjj1xyySVERUURHR1Nnz592LRpEytXruSvf/0rRUVFaJqGpmlVnruiJUuW0LdvXywWC4mJiYwcOdK7rry8nIkTJ9K+fXsiIyM577zzWLlyZZXncLudlDtKcbocuFzl3p/NypUrOffcc4mMjCQ2Npbzzz+ffftkch0hhARgIUQTdrLh18NfCHYrd5WH01XOXttv2JUTB24OOI+y27YTp6vcuw3A/PnzMZlMrF+/nn/9618899xzvP76697nHjt2LJs2bWLJkiWsXbsWpRRXXHEFDofDb/v+97//MXr0aO6//362b9/Oq6++yrx583jmmWeqfU0zZ87k7bffZu7cuXz//fcUFxfz8ccfV9lu/vz5REZGsn79embNmsWTTz7J8uXLAf28Xn311dhsNr799luWL1/Orl27uP76673733TTTaSkpLBx40Y2b97MI488gtlsZsCAATz//PNER0eTm5tLbm4uEyZM8NvWzz//nJEjR3LllVeyZcsWvvrqK/r27etd/9e//pXvv/+eRYsW8dNPP3HdtdcybNgwfvt1p1754fh531fwG2XKiQuFQ7nZa9tJeVkJV199NRdfdBE//biVtWu+584775QbIIUQOiUCUlRUpABVVFQU7KYI0ayVlpaq7du3q9LS0hq3c7vdavz48Qo45cf48eOV2+1WSin1a/6vVR7b8n5Um3M3V3lsy/vRu825A85Vp3U9zfs8Sik1adIklZGRoT/vr78qQH3//ffe9fn5+cpqtar33ntPKaXU3LlzVUxMjHf9hRdeqKZPn+7zut966y3Vtm3bas9LUlKSevbZZ73fO51O1aFDBzVixAjvsosvvlhdcMEFPvudc845atKkSUoppZYtW6aMRqPav3+/d/22bdsUoDZs2KCUUioqKkrNmzfPbxsqv47q9O/fX910001+1/3+++9K0zSVk5Nz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X7+e6667jptvvpnNmzdz+umn88gjjwS06e5z8ng8zJgxg+TkZNavX8/y5cuZN29eyD5MmDCBzz//POKx0NDQ6CUIDQ0NjcOMq6++WkyfPl3U1NSIxMREsXv3brFnzx5hMplETU2NmD59urj66qvD7l9dXS0AsWXLFiGEEE899ZTIyckRNpvN1+avf/2rAERpaakQQoh///vfAhAff/yxr80///lPAfj2O/nkk8XChQsDXuv//u//RH5+vu8xIFatWhXQZv78+WL06NG+x/369RPz5s2LeDw6798dGzZsEIBoamoSQnS8t/r6+oB2p556qrjtttt8jwcMGCCWLVvW7WsvW7ZMDBgwwPc4Pz9fPProo77HTqdTFBQUiOnTpwshhGhubhYmk0msXbs24DjXX3+9uPzyy8O+j9GjR4uHHnooYNvll18upk2bFrDt0ksvFRkZGb7H3X1O77//vjAYDKKiosL3/EcffRTys7vjjjvEaaedFraPGhoavRND/KS3hoaGxsFhNps5//zzef755xFCcP7552M2m4Pa/fTTT9x333189dVXWCwWX+S3rKyMkSNHsnPnTo477jhMJpNvnwkTJoR8zeOOO873d35+PiAdAYqKiti0aRNff/21L5II8va/3W6ntbWV5OTkbt9TdXU1Bw4c4Mwzz4xsECKgtLSUBx54gM2bN1NXVxfw/keMGNFjrxOKhoYGKioqmDx5sm+bwWBg/PjxvjSI7du3Y7fbOfvsswP2dTgcQeks/thstoDPDGDHjh1cdNFFAdsmT57MmjVrfI+7+5x27txJYWEheXl5vufDzYekpCRaW1vD9lFDQ6N3oglgDQ2Nw5rrrrvOlx/7xBNPhGxz4YUXUlhYyF//+lf69euHx+Nh5MiROBwOQOafenNavYhOOapejEaj72/vPl5B6fF4ePDBB7n44ouD9uss1MKRlJQUUbtIaWlpYerUqUydOpUXX3yR3NxcysrKOOecc3zv/2DQ6XRBY+V0OlUdwzt+//znP+nfv3/Ac4mJiWH3M5vNQQvQwn1unV+vq88p1HwIR11dHbm5uRG11dDQ6D1oAlhDQ+OwZtq0aT4hd8455wQ9X1tby44dO3jmmWc4+eSTAfjiiy8C2gwbNoyXXnqJtrY2n+DauHGj6r4cf/zx7Ny5s8t8XaPRiNvtDvt8WloaAwcO5JNPPvEtTjsYvvvuOywWC48++iiFhYVA8HtLSEgA6LJf3nad2+Tm5lJZWRkgGr0LBwEyMjLIz8/nq6++4pRTTgHA5XKxadMmjj/+eABGjBhBYmIiZWVlnHrqqRG/t7Fjx7J9+/aAbSNGjOCrr74K2Nb5cXef07BhwygrK6Oqqoq+ffsChM3X3rp1K6eddlrEfdbQ0OgdaAJYQ0PjsEav17Njxw7f353JysoiJyeH5cuXk5+fT1lZGbNnzw5oc8UVVzBv3jxuvPFGZs+eTVlZGUuWLAGIOBIIcP/993PBBRdQWFjIzJkz0el0fPvtt2zZssW3EMsrbk888UQSExPJysoKOs4DDzzATTfdRJ8+fTj33HNpamriyy+/5A9/+EPY17bZbAHCE6S9WlFREQkJCfzlL3/hpptuYuvWrQHevgADBgxAURT+8Y9/cN5555GUlERqamrQawwcOJD//Oc/XHbZZSQmJmI2mznttNOoqalh8eLFXHLJJaxZs4b333+f9PR033633XYbjz76KEcffTTDhw/nscceC/AcTktL4+677+aOO+7A4/Fw0kkn0djYyNq1a0lNTeXqq68O+Z7POeccfvvb3+J2u32f/a233sqUKVNYvHgxM2bM4MMPPwxIf4jkczr77LMZMmQIV199NYsXL6apqcm3CM5/PrS2trJp0yYWLlwY9nPR0NDopcQv/VhDQ0MjOryL4MLReRHcRx99JIYPHy4SExPFcccdJz799NOgBU1ffvmlOO6440RCQoIYN26cePnllwUgvvvuOyFE6IVipaWlAhC7d+/2bVuzZo2YMmWKSEpKEunp6WLChAli+fLlvuffeecdcdRRRwmDweBbKBZqIdnTTz8thg4dKoxGo8jPzxd/+MMfwr7f+fPnCyDo59RTTxVCCPHyyy+LgQMHisTERDF58mTxzjvvBCzwE0KIhx56SOTl5QlFUXxj13kR3Lp168Rxxx0nEhMThf/Xx1NPPSUKCwtFSkqKuOqqq8SCBQsCFsE5nU5x2223ifT0dJGZmSnuvPNOcdVVVwV8hh6PR/zpT3/yvefc3FxxzjnniM8++yzs+3a5XKJ///5izZo1AdufffZZUVBQIJKSksSFF14olixZErAITojuP6cdO3aIE088USQkJIhhw4aJd999VwABr/Xyyy+LoUOHhu2fhoZG70URIoKEKQ0NDY0jjJdeeolrr72WhoaGHs/L1eg5nnzySd5++20++OCDmL7Ol19+yUknncSPP/7IkCFDALkw7vbbb+eKK66I6WtraGj0PFoKhIaGhgbwwgsvMHjwYPr3788333zDrFmz+NWvfqWJ317OjTfeSH19PU1NTT1atW7VqlWkpqZy9NFH8+OPP3Lbbbdx4okn+sRvdXU1l1xyCZdffnmPvaaGhsahQ4sAa2hoaACLFy/mySefpLKykvz8fGbMmMGCBQsisi7T+Pnxwgsv8PDDD7Nv3z7MZjNnnXUWS5cu7ZUlqzU0NNSjCWANDQ0NDQ0NDY0jCq0UsoaGhoaGhoaGxhGFJoA1NDQ0NDQ0NDSOKDQBrKGhoaGhoaGhcUShCWANDQ0NDQ0NDY0jCk0Aa2hoaGhoaGhoHFFoAlhDQ0NDQ0NDQ+OIQhPAGhoaGhoaGhoaRxSaANbQ0NDQ0NDQ0Dii0ASwhoaGhoaGhobGEcX/A5RE/QHus/GpAAAAAElFTkSuQmCC", "text/plain": [ "

" ] @@ -311,7 +311,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzMAAAIVCAYAAADlKaEpAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XecJEXd+PFPdffkzXu7lwMccBwHHFmS4hFEEAzAo4BKEFEU8CH4QzGACD4YUMEAIlEkiIqSMxw5HuGOi1zOYfPu5O6u+v0xs7M7O7OXl7vlvu/ndc/zbE13dfXsMjXfrqpvKWOMQQghhBBCCCEGGWtbN0AIIYQQQgghNocEM0IIIYQQQohBSYIZIYQQQgghxKAkwYwQQgghhBBiUJJgRgghhBBCCDEoSTAjhBBCCCGEGJQkmBFCCCGEEEIMShLMCCGEEEIIIQYlCWaEEEIIIYQQg5IEM0KI7cqdd96JUopp06ZttTqXLFmCUoo777yzUPazn/0MpdRWu8a28Nxzz3HAAQcQi8VQSvHggw9u0vkvvPACSileeOGFQtlZZ53FuHHjtmo7+yr3+9gebMrfxLhx4zjrrLMGtkF9lPvdbIt2CCHE9kSCGSHEDumb3/wmr7/++rZuxmYzxvDlL3+ZQCDAww8/zOuvv84RRxyxxfX+9Kc/5b///e9WaOHgM9j/JoQQYkfkbOsGCCHEtjBq1ChGjRq1rZux2VatWkVraytf+tKXOOqoo7ZavePHj99qdQ0WyWSSaDQ66P8mhBBiRyQjM0KI7d5ZZ51FRUUFCxYs4Pjjj6eiooLRo0dz6aWXkslkio5dtWoVX/7yl6msrKS6upqvfOUrrFmzpqTO/qYU3XvvvRxyyCFUVFRQUVHBPvvsw2233VZ0zLPPPstRRx1FVVUV0WiUww47jOeee67omKamJr71rW8xevRoQqEQDQ0NHHbYYTz77LMbvN9XXnmFo446isrKSqLRKIceeiiPPfZYUdu7v3T/4Ac/QCm1walhc+fO5bOf/SzRaJQhQ4Zw3nnn0dXVVXJcualMSikuuOACbr75ZnbbbTdCoRB77LEH//jHP0rOnzlzJl/4wheora0lHA6zzz778Le//W2D9wwwf/58Tj/9dBobGwmFQkycOJE///nPG3Vue3s755xzDnV1dVRUVPC5z32ORYsWoZTiZz/7WeG47t/7u+++yymnnEJtbW0hgCv3N+G6LpdddhnDhg0jGo1y+OGH89Zbb21UmwAymQw///nPmThxIuFwmPr6eqZMmcJrr71WOMYYw4033sg+++xDJBKhtraWU045hUWLFm30dbpprbnmmmuYMGECkUiEmpoa9t57b2644YZNrksIIQYDGZkRQgwKruvy+c9/nnPOOYdLL72Ul156iauvvprq6mquuOIKAFKpFEcffTSrVq3i2muvZbfdduOxxx7jK1/5ykZd44orruDqq6/mpJNO4tJLL6W6upqZM2eydOnSwjF33303Z5xxBl/4whf429/+RiAQ4Oabb+bYY4/lqaeeKoySfP3rX+fdd9/lF7/4Bbvtthvt7e28++67tLS0rLcNL774Iscccwx77703t912G6FQiBtvvJETTzyR++67j6985St885vfZPLkyZx00klceOGFnH766YRCoX7rXLt2LUcccQSBQIAbb7yRoUOHcs8993DBBRds1PsC8PDDDzN16lR+/vOfE4vFuPHGGznttNNwHIdTTjkFgHnz5nHooYfS2NjIH/7wB+rr67n77rs566yzWLt2LZdddlm/9c+ePZtDDz2UMWPG8Nvf/pZhw4bx1FNP8b3vfY/m5mauvPLKfs/VWnPiiScybdo0fvazn7Hffvvx+uuv89nPfrbfc0466SROPfVUzjvvPBKJRL/HnXvuudx11118//vf55hjjmHmzJmcdNJJZQPBvjzP47jjjuPll1/moosu4sgjj8TzPN544w2WLVvGoYceCsC3v/1t7rzzTr73ve/xq1/9itbWVn7+859z6KGHMn36dIYOHbrBa3X79a9/zc9+9jN+8pOf8KlPfQrXdZk7dy7t7e0bXYcQQgwqRgghtiN33HGHAczbb79dKDvzzDMNYP75z38WHXv88cebCRMmFH6+6aabDGAeeuihouPOPfdcA5g77rijUHbllVea3h+BixYtMrZtm69+9av9ti2RSJi6ujpz4oknFpX7vm8mT55sDjrooEJZRUWFueiiizbupns5+OCDTWNjo+nq6iqUeZ5n9txzTzNq1CijtTbGGLN48WIDmN/85jcbrPMHP/iBUUqZ999/v6j8mGOOMYCZOnVqoezMM880Y8eOLToOMJFIxKxZs6aoTbvvvrvZZZddCmWnnnqqCYVCZtmyZUXnH3fccSYajZr29vaitvf+fRx77LFm1KhRpqOjo+jcCy64wITDYdPa2trv/T322GMGMDfddFNR+bXXXmsAc+WVVxbKun/vV1xxRUk9ff8m5syZYwBz8cUXFx13zz33GMCceeaZ/bbJGGPuuusuA5hbbrml32Nef/11A5jf/va3ReXLly83kUjEXHbZZYWycr+bsWPHFrXjhBNOMPvss8962yWEEB8nMs1MCDEoKKU48cQTi8r23nvvolGTqVOnUllZyec///mi404//fQN1v/MM8/g+z7nn39+v8e89tprtLa2cuaZZ+J5XuGf1prPfvazvP3224Wn/AcddBB33nkn11xzDW+88Qau626wDYlEgjfffJNTTjmFioqKQrlt23z9619nxYoVzJs3b4P19DV16lQmTZrE5MmTi8o35n3pdtRRRxWNENi2zVe+8hUWLFjAihUrAHj++ec56qijGD16dNG5Z511Fslkst/F9el0mueee44vfelLRKPRovf2+OOPJ51O88Ybb/TbthdffBGAL3/5y0Xlp512Wr/nnHzyyeu/YXLvG8BXv/rVovIvf/nLOM6GJzY88cQThMNhvvGNb/R7zKOPPopSiq997WtF9z1s2DAmT55clGluYxx00EFMnz6d7373uzz11FN0dnZu0vlCCDHYSDAjhBgUotEo4XC4qCwUCpFOpws/t7S0lJ2SM2zYsA3W39TUBLDeBeBr164F4JRTTiEQCBT9+9WvfoUxhtbWVgDuv/9+zjzzTG699VYOOeQQ6urqOOOMM8qu3+nW1taGMYbhw4eXvDZixIjCPW6qlpaWsu/Bxrwv6zu2u6y7TS0tLZvV9paWFjzP449//GPJ+3r88ccD0Nzc3G/bWlpacByHurq6ovL1Tc8q185y9ULpvTuOQ319/QbPb2pqYsSIEVhW/13t2rVrMcYwdOjQknt/44031nvf5Vx++eVcd911vPHGGxx33HHU19dz1FFHbdVU50IIsT2RNTNCiI+N+vr6souz1xdAdGtoaABgxYoVJSML3YYMGQLAH//4Rw4++OCyx3R/gR4yZAjXX389119/PcuWLePhhx/mhz/8IevWrePJJ58se25tbS2WZbF69eqS11atWlXUhk1RX19f9j3YmPdlfcd2l3V/sa+vr9+sttfW1hZGn/obGdtpp536bVt9fT2e59Ha2loU0Kzv/jZmP5nu+1qzZg0jR44slHuet1FBZUNDA6+88gpa634DmiFDhqCU4uWXXy677ml9a6HKcRyHSy65hEsuuYT29naeffZZfvSjH3HssceyfPlyotHoJtUnhBDbOxmZEUJ8bEyZMoWuri4efvjhovJ77713g+d+5jOfwbZtbrrppn6POeyww6ipqWH27NkccMABZf8Fg8GS88aMGcMFF1zAMcccw7vvvttv/bFYjE984hP85z//IZVKFcq11tx9992MGjWK3XbbbYP30teUKVOYNWsW06dPLyrfmPel23PPPVcYmQLwfZ/777+f8ePHF0azjjrqKJ5//vlC8NLtrrvuIhqN9hsARqNRpkyZwnvvvcfee+9d9n1d30hI9/46999/f1F5uWxrm+LTn/40APfcc09R+T//+U88z9vg+ccddxzpdHq9m4OecMIJGGNYuXJl2fvea6+9Nrv9NTU1nHLKKZx//vm0trayZMmSza5LCCG2VzIyI4T42DjjjDP4/e9/zxlnnMEvfvELdt11Vx5//HGeeuqpDZ47btw4fvSjH3H11VeTSqU47bTTqK6uZvbs2TQ3N3PVVVdRUVHBH//4R84880xaW1s55ZRTaGxspKmpienTp9PU1MRNN91ER0cHU6ZM4fTTT2f33XensrKSt99+myeffJKTTjppve249tprOeaYY5gyZQrf//73CQaD3HjjjcycOZP77rtvo3eo7+2iiy7i9ttv53Of+xzXXHNNIZvZ3LlzN7qOIUOGcOSRR/LTn/60kM1s7ty5RQHDlVdeyaOPPsqUKVO44oorqKur45577uGxxx7j17/+NdXV1f3Wf8MNN3D44YfzyU9+ku985zuMGzeOrq4uFixYwCOPPMLzzz/f77mf/exnOeyww7j00kvp7Oxk//335/XXX+euu+4CWO80r/WZOHEiX/va17j++usJBAIcffTRzJw5k+uuu46qqqoNnn/aaadxxx13cN555zFv3jymTJmC1po333yTiRMncuqpp3LYYYfxrW99i7PPPptp06bxqU99ilgsxurVq3nllVfYa6+9+M53vrPRbT7xxBPZc889OeCAA2hoaGDp0qVcf/31jB07ll133XWz3gchhNiubdv8A0IIUay/bGaxWKzk2L7Zp4wxZsWKFebkk082FRUVprKy0px88snmtdde22A2s2533XWXOfDAA004HDYVFRVm3333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vn072rVrByD/Gte4uDgsWbKkXGOWNt7OnTsjPT0dBw4cQKdOnQAA+/fvR3p6Orp06VLq9d24cQOXLl2ySXoV5ePjgw4dOmD79u0YMmSIZf727dsxePBgp8t07twZ//3vf23mff/994iOjoa3t7fLYnNVvM4kJCS4dD+6iif3ratU5r4VEUydOhUbNmxAbGwsIiMjS1ymOuxjqjzMS8VzR14CmJuqmurwucncVEVV9hMHqpILFy5IQkKCvPHGG1KjRg1JSEiQhIQEyczMtPRp3ry5rF+/3jK9ePFiCQ4OlvXr10tSUpKMHDlSQkNDJSMjw+3xPv7449KmTRvZu3ev7N27Vx588EF58sknbfpYx5uZmSl//OMfZc+ePZKcnCwxMTHSuXNnadCggcvj/eqrr8Tb21s++eQTOX78uMyYMUMCAgLk/PnzIiIyd+5cGTNmjKX/uXPnxN/fX2bOnCnHjx+XTz75RLy9veXrr792aVyuive9996TDRs2yOnTp+Wnn36SuXPnCgBZt26d22PNzMy0HJsA5N1335WEhAS5cOGC01g9vW/LGq8n962IyB/+8AcJDg6W2NhYSUlJsfzcuXPH0qeq7WOqvpiXXIu5yX2Ym9yLuan07utiZty4cQLA4ScmJsbSB4CsXr3aMm0ymWT+/PliMBhEr9dLjx49JCkpqVLivXHjhowePVoCAwMlMDBQRo8e7fDIQOt479y5I/369ZO6deuKt7e3NG7cWMaNGycXL150S3wfffSRhIeHi4+Pj7Rv397m8YHjxo2Tnj172vSPjY2Vdu3aiY+Pj0RERMiKFSvcEpcr4l2yZIk88MAD4uvrK7Vq1ZJu3brJli1bKiVO8+Mh7X/GjRvnNFYRz+7bssbryX0rIk5jtX/fV7V9TNUX85LrMTe5B3OTezE3lZ4iUnBnEBERERERkYbw0cxERERERKRJLGaIiIiIiEiTWMwQEREREZEmsZghIiIiIiJNYjFDRERERESaxGKGiIiIiIg0icUMERERERFpEosZIiIiIiLSJBYzRERERESkSSxmiIiIiIhIk1jMEBERERGRJrGYISIiIiIiTWIxQ0REREREmsRihoiIiIiINInFDBERERERaRKLGSIiIiIi0iQWM0REREREpEksZoiIiIiISJNYzBARERERkSaxmCEiIiIiIk1iMUNERERERJrEYoaI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WqZTUlJk4MCBotfrpXHjxvKPf/zD4YbUjIwMmTp1qoSFhYm3t7c0atRIRo8eLRcvXpSYmBjx8vKSXbt2WfpfuHBBgoODZfny5UXGevToUXn00UfF19dXateuLRMmTLDcAClSugcAiIicPn1ahgwZIjVr1hQ/Pz+JioqSGTNmWG7kLOm4EhE5f/68/Pa3v5WgoCDx9/eX6Oho2b9/v9N9KlK6G0FjY2OlS5cuotfrpWbNmtK/f3/LzbMlHTd8AABR1WOfW7788kuJiIgQvV4vnTt3lk2bNlXbHOXsAQATJ06UF198sdh95uwBAPYPURg8eLBl34jkP5imW7du4uPjI82aNZOtW7c6fGanpKTI2LFjJSQkRPR6vTRp0kQmTJgg6enpsmbNGgkICJDTp09b+h86dEh8fHxky5YtRcYaGxsrHTt2FB8fHzEYDDJnzhzJzc21tJfmc18k/4b+vn37So0aNSQgIEDatGkjb775pqW9NMfNkSNHpF+/fuLv7y+BgYHSvXt3OXv2rNN9KuKY151Zt26dPPTQQ+Lj4yMhISEydOhQS1tOTo78+c9/loiICPH29haDwSBDhgyRo0ePiggfAFBVKSJOLswkqiTLly/HN998g23btpWq/71799C0aVP861//QteuXd0cHRER3c/sc9S2bdswYMAAZGdnw8fHB9euXUNUVBQOHTqEyMhID0dLdH/iPTPkURMnTsStW7eQmZlZqr8EfeHCBcybN4+FDBERuZ11jrpz5w6++eYbNG3a1HIfUHJyMpYvX85ChsiDeGaGiIiIqAQdOnRAZmYmli9f7tJ7NomoYljMEBERERGRJvFpZkREREREpEksZoiIiIiISJNYzBARERERkSaxmCEiIiIiIk1iMUNERERERJrEYoaIiIiIiDSJxQwREREREWkSixkiIiIiItKk/w9dHBjownNqWwAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA08AAAIVCAYAAAAJXMQ/AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XmcHEX5+PFPdfecO7N37psQIIQcXOEGQ+QURA45BAEVFQEPQEH4IiCgCOhPFAW55D7lMoCCnOEKkBASCJBA7nOz9+7s3N1dvz96dnZnZzZZQkIS8rxfr+XF1FR318xupubpqnpKaa01QgghhBBCCCHWydjcDRBCCCGEEEKIrYEET0IIIYQQQgjRBxI8CSGEEEIIIUQfSPAkhBBCCCGEEH0gwZMQQgghhBBC9IEET0IIIYQQQgjRBxI8CSGEEEIIIUQfSPAkhBBCCCGEEH0gwZMQQgghhBBC9IEET0KIbdrdd9+NUopZs2ZttHMuXboUpRR33313vuzKK69EKbXRrrE5vPTSS+yxxx6UlZWhlOKpp576XMe/+uqrKKV49dVX82VnnnkmI0eO3Kjt7KnU72NL8Hn+JkaOHMmZZ565aRvUQ6nfzeZohxBCbEkkeBJCiC/BWWedxYwZMzZ3MzaY1poTTzwRn8/HtGnTmDFjBgcddNAXPu9vfvMbnnzyyY3Qwq3P1v43IYQQ2yJrczdACCG2BUOHDmXo0KGbuxkbbPXq1TQ3N3PssccyderUjXbe0aNHb7RzbS0SiQThcHir/5sQQohtkYw8CSFED2eeeSaRSISFCxdy5JFHEolEGDZsGBdeeCHpdLqg7urVqznxxBOJRqNUVFRw0kknUVdXV3TO3qZoPfjgg+yzzz5EIhEikQiTJk3izjvvLKjz4osvMnXqVMrLywmHw+y333689NJLBXUaGhr40Y9+xLBhwwgEAvTr14/99tuPF198cb2v94033mDq1KlEo1HC4TD77rsvzz77bEHbO7/kX3zxxSil1jvVbv78+Rx++OGEw2Fqa2s5++yzicViRfVKTQ1TSnHeeedx6623ssMOOxAIBNh55515+OGHi46fN28exxxzDFVVVQSDQSZNmsQ999yz3tcM8Nlnn/Gd73yH/v37EwgEGDt2LH//+9/7dGxrays/+MEPqK6uJhKJ8I1vfIPFixejlOLKK6/M1+v8vc+ePZsTTjiBqqqqfMBY6m8im81y0UUXMXDgQMLhMPvvvz/vvvtun9oEkE6nueqqqxg7dizBYJCamhqmTJnCW2+9la+jtebmm29m0qRJhEIhqqqqOOGEE1i8eHGfr9PJdV2uueYadtxxR0KhEJWVlUyYMIG//OUvn/tcQgixNZCRJyGEKCGbzfLNb36TH/zgB1x44YW89tprXH311VRUVHD55ZcDkEwm+frXv87q1au59tpr2WGHHXj22Wc56aST+nSNyy+/nKuvvprjjjuOCy+8kIqKCubNm8eyZcvyde6//35OP/10jjnmGO655x58Ph+33norhx12GM8//3x+FOi73/0us2fP5ne/+x077LADra2tzJ49m6ampnW2Yfr06RxyyCFMmDCBO++8k0AgwM0338zRRx/NQw89xEknncRZZ53FxIkTOe644/jpT3/Kd77zHQKBQK/nXLt2LQcddBA+n4+bb76ZAQMG8MADD3Deeef16X0BmDZtGq+88gpXXXUVZWVl3HzzzZxyyilYlsUJJ5wAwIIFC9h3333p378/f/3rX6mpqeH+++/nzDPPZO3atVx00UW9nv/jjz9m3333Zfjw4fzpT39i4MCBPP/88/zsZz+jsbGRK664otdjXdfl6KOPZtasWVx55ZXstttuzJgxg8MPP7zXY4477jhOPvlkzj77bOLxeK/1fvjDH3Lvvffyy1/+kkMOOYR58+Zx3HHHlQw8e7JtmyOOOILXX3+dX/ziFxx88MHYts3bb7/N8uXL2XfffQH48Y9/zN13383PfvYzrrvuOpqbm7nqqqvYd999mTt3LgMGDFjvtTpdf/31XHnllVx22WUceOCBZLNZ5s+fT2tra5/PIYQQWxUthBDbsLvuuksDeubMmfmyM844QwP60UcfLah75JFH6h133DH/+JZbbtGA/ve//11Q74c//KEG9F133ZUvu+KKK3T3j9zFixdr0zT1qaee2mvb4vG4rq6u1kcffXRBueM4euLEiXry5Mn5skgkon/xi1/07UV3s/fee+v+/fvrWCyWL7NtW++yyy566NCh2nVdrbXWS5Ys0YC+4YYb1nvOiy++WCul9Jw5cwrKDznkEA3oV155JV92xhln6BEjRhTUA3QoFNJ1dXUFbdppp5309ttvny87+eSTdSAQ0MuXLy84/ogjjtDhcFi3trYWtL377+Owww7TQ4cO1W1tbQXHnnfeeToYDOrm5uZeX9+zzz6rAX3LLbcUlF977bUa0FdccUW+rPP3fvnllxedp+ffxCeffKIBff755xfUe+CBBzSgzzjjjF7bpLXW9957rwb07bff3mudGTNmaED/6U9/KihfsWKFDoVC+qKLLsqXlfrdjBgxoqAdRx11lJ40adI62yWEEF8lMm1PCCFKUEpx9NFHF5RNmDChYFTolVdeIRqN8s1vfrOg3ne+8531nv+FF17AcRzOPffcXuu89dZbNDc3c8YZZ2Dbdv7HdV0OP/xwZs6cmR/FmDx5MnfffTfXXHMNb7/9Ntlsdr1tiMfjvPPOO5xwwglEIpF8uWmafPe732XlypUsWLBgvefp6ZVXXmHcuHFMnDixoLwv70unqVOnFoyAmKbJSSedxMKFC1m5ciUAL7/8MlOnTmXYsGEFx5555pkkEolekzGkUileeukljj32WMLhcMF7e+SRR5JKpXj77bd7bdv06dMBOPHEEwvKTznllF6POf7449f9gvHeN4BTTz21oPzEE0/EstY/UeS///0vwWCQ73//+73WeeaZZ1BKcdpppxW87oEDBzJx4sSCTIh9MXnyZObOncs555zD888/T3t7++c6XgghtjYSPAkhRAnhcJhgMFhQFggESKVS+cdNTU0lpzgNHDhwvedvaGgAWGfCgLVr1wJwwgkn4PP5Cn6uu+46tNY0NzcD8Mgjj3DGGWdwxx13sM8++1BdXc3pp59ecv1Vp5aWFrTWDBo0qOi5wYMH51/j59XU1FTyPejL+7Kuup1lnW1qamraoLY3NTVh2zY33XRT0ft65JFHAtDY2Nhr25qamrAsi+rq6oLydU13K9XOUueF4tduWRY1NTXrPb6hoYHBgwdjGL137WvXrkVrzYABA4pe+9tvv73O113KJZdcwh//+EfefvttjjjiCGpqapg6depGTf0vhBBbElnzJIQQG6impqbkYv51BSyd+vXrB8DKlSuLRk461dbWAnDTTTex9957l6zT+YW9traWG2+8kRtvvJHly5czbdo0fv3rX1NfX89zzz1X8tiqqioMw2DNmjVFz61evbqgDZ9HTU1NyfegL+/Luup2lnUGEjU1NRvU9qqqqvzoWm8jf6NGjeq1bTU1Ndi2TXNzc0EAta7X15f9nDpfV11dHUOGDMmX27bdpyC2X79+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pcI4c+YMqlatihUrVqBTp06BDoeoSOyXrgz7pdLFvsn/2DeVLTzzRKXGYrFg8+bN6NGjh25+jx49sGbNmgBFRVS49PR0AEB0dHSAIyGi0sB+icoj9k1lC5MnKjVnz56FzWZDtWrVdPOrVauGU6dOBSgqIu+klJg0aRI6dOiAxo0bBzocIioF7JeovGHfVPZcl8nTtGnTIIQo8t+mTZsCHWaFIYTQTUspPeYRBdrYsWOxfft2fPnll4EOha5D7JeuLfZLVF6wbyp7DIEOIBDGjh2LQYMGFVmnZs2a1yaYCiwmJgaqqnr8mnf69GmPX/2IAmncuHFYvHgxVq5ciRo1agQ6HLoOsV+6NtgvUXnCvqlsui6Tp5iYGMTExAQ6jArPZDKhVatWWLp0KQYMGOCcv3TpUvTr1y+AkRHZSSkxbtw4LFq0CMuXL0etWrUCHRJdp9gvXRvsl6g8YN9Utl2XyVNJpKam4vz580hNTYXNZkNycjIA4MYbb0RYWFhggysHJk2ahGHDhqF169Zo164d5s6di9TUVDz66KOBDq1cyszMxMGDB53TKSkpSE5ORnR0NBITEwMYWfk0ZswYfPHFF/jxxx8RHh7u/DU6MjISwcHBAY6OyDv2S1eH/ZL/sW/yL/ZNZZykIo0YMUIC8Pi3bNmyQIdWbsyaNUsmJSVJk8kkW7ZsKVesWBHokMqtZcuWeT0eR4wYEejQyiVv+xKA/PTTTwMdGlGh2C9dPfZL/sW+yb/YN5VtfM4TERERERGRD67L0faIiIiIiIhKiskTERERERGRD5g8ERERERER+YDJExERERERkQ+YPBEREREREfmAyRMREREREZEPmDwRERERERH5gMkTERERERGRD5g8ERERERER+YDJExERERERkQ+YPBEREREREfmAyRMREREREZEPmDwRERERERH5gMkTERERERGRD5g8ERERERER+YDJExERERERkQ+YPBEREREREfmAyRMREREREZEPmDwRERERERH5gMkTERERERGRD5g8ERERERER+YDJExERERERkQ+YPBEREREREfmAyRMREREREZEPmDwRERERERH5gMkTERERERGRD5g8ERERERER+YDJExERERERkQ+YPBEREREREfmAyRMREREREZEPmDwRERERERH5gMkTERERERGRD5g8ERERERER+YDJExERERER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jAcffNCZyAHF9+vulixZgoEDB6JPnz7YunUr/vjjD93f+IEHHsBff/2Fr776Ctu3b8c999yDXr164cCBA4W2SWWAJHJz+vRpCUDu2LFDSillSkqKBCC3bt0qpZRy2bJlEoC8cOGCbrnOnTvLCRMmOKeTkpLk22+/raszdepU2axZM928t99+WyYlJTmn4+Li5MyZM53TeXl5skaNGrJfv35SSikzMzNlUFCQXLNmja6dhx56SA4ePLjQ7WrWrJl86aWXdPM+/fRTGRkZKfft2ycTExPluHHjpKZpHssOGDBAjhw5stC23bdrxIgRMikpSVqtVue8e+65R953331SSin37dsnAch169Y5y/fs2SMBOPfZH3/8ISMiImROTo5uXTfccIP88MMPndOjR4+WdevWlUOHDpWNGzeW2dnZhcY5d+5cWalSJZmZmemct2TJEqkoijx16pSUUspFixbJ4j4ann/+edmjRw/dvGPHjkkAct++fV6XcT+uPvzwQxkeHi7PnTvntf7UqVNlSEiIvHTpknPek08+KW+66aZC4xo8eLC85ZZbvJb5cty4H9uO44OIAse9b3G3YcMGCUBmZGRIKStWH1XYtrRo0UJOmzat0LZGjBjhjEdK+7Z36NBBV6dNmzZy8uTJUkopf/vtN6mqqjx27Jiz/JdffpEA5KJFi6SUUn788ceyXr16uj4yNzdXBgcHy99++805r0+fPrJjx46ye/fu8rbbbvPapzo8++yzHm3OmjVLhoWFSZvNJqX03P/eDBs2TI4aNUo3b9WqVVJRlEL7RPfj5plnnpG1atWSFovFa/3i+nVv2rVrJ4cOHeq17ODBg1IIIU+cOKGb3717d/nMM89IKT37IG/HJ117vHCUcOjQITz//PNYt24dzp496/zlPzU19ZrfmJmeno60tDS0a9fOOc9gMKB169bOyyJ2796NnJwc3HbbbbplLRYLWrRoUWjb2dnZzrNJ7vM7dOiAwYMHe/2FEgCCg4Nx+fLlEm1Lo0aNoKqqczouLs556cKePXuc2+VQv3593TXqmzdvRmZmpse9VNnZ2brLCN544w00btwYX3/9NTZt2uR1Gx327NmDZs2aITQ01DnvlltugaZp2LdvH6pVq+bTtm3evBnLli1DWFiYR9mhQ4dQt27dYo+r5ORktGjRAtHR0YWup2bNmrp7FOLi4jwu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ly7JcePGyfj4eGk0GmVCQoIcOnSoTE1NlcuWLZMGg0GuWrXKWf/o0aMyMjJSzp49u9BYt2/fLrt27SqDgoJkdHS0fPjhh503zErp24ARUkq5f/9+OWDAABkVFSWDg4Nl/fr15cSJE503/hZ3XEkp5ZEjR+Rdd90lIyIiZEhIiGzdurVcv369130qpW83Di9fvly2b99ems1mGRUVJXv27Om82bq444YDRhCVPe59yxdffCFr1qwpzWazbNeunVy8eHGF7aO8DRgxatQo+cgjjxS5z7wNGOE+6Ea/fv2c+0ZK+0BGHTp0kCaTSdatW1f++uuvHp/ZaWlpcvjw4TImJkaazWZZu3Zt+fDDD8v09HQ5f/58GRoaKvfv3++sv2nTJmkymeSSJUsKjXX58uWyTZs20mQyydjYWDl58mSZl5fnLPflc19K+wAQt912mwwLC5OhoaGyadOmcvr06c5yX46bbdu2yR49esiQkBAZHh4uO3bsKA8dOuR1n0rp2a97891338nmzZtLk8kkY2Ji5MCBA51lFotFvvDCC7JmzZrSaDTK2NhYOWDAALl9+3YpJQeMKKuElF4udCWqoGbPno0ff/wRv/32m0/1c3NzUadOHXz55Ze45ZZbSjk6IiK6nrn3Ub/99ht69+6NnJwcmEwmnDlzBvXr18emTZtQq1atAEdLdH3iPU90XRk1ahQuXLiAjIwMn540f/ToUUyZMoWJExERlTrXPury5cv48ccfUadOHed9XCkpKZg9ezYTJ6IA4pknIiIiojKmVatWyMjIwOzZs/16zy0RXR0mT0RERERERD7gaHtEREREREQ+YPJERERERETkAyZPREREREREPmDyRERERERE5AMmT0RERERERD5g8kREREREROQDJk9EREREREQ+YPJERERERETkg/8HXqmOnO3bMAkAAAAASUVORK5CYII=", "text/plain": [ "
" ] @@ -367,9 +367,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:mypy]", + "display_name": "Python [conda env:interactive]", "language": "python", - "name": "conda-env-mypy-py" + "name": "conda-env-interactive-py" }, "language_info": { "codemirror_mode": { @@ -381,7 +381,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.8" + "version": "3.11.11" } }, "nbformat": 4, diff --git a/edu/examples/Dipole/dipole.py b/edu/examples/Dipole/dipole.py index 676a0b3e..f188a3ea 100755 --- a/edu/examples/Dipole/dipole.py +++ b/edu/examples/Dipole/dipole.py @@ -53,7 +53,7 @@ def main(alt_minRE, alt_maxRE, lat_min, lat_max, origins, extent, nLatsPerBlock, origin = -1*origin - extent lat0 = (2*(lat_max - lat_min))*origin - dlat = extent * ((lat_max - lat_min)*2) / (nLatsPerBlock - nGCs) + dlat = extent * (2*(lat_max - lat_min)) / (nLatsPerBlock - nGCs*2) # Put latitudes down evenly (centers & corners) # - This forms the invariant latitudes which field lines must pass thru diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index f5c3f584..1bdfd0c2 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -335,7 +335,7 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t lat0 = 2.0 * (max_lat - min_lat) * lat_origin; precision_t dlat = 2.0 * size_up_norm(1) * (max_lat - min_lat) / - (nLats - nGCs); + (nLats - nGCs * 2); arma_vec lat1d(nLats); arma_vec lat1dDown(nLats + 1); From d86b038bc0e7e6f0a0c688b6cb7f2aa232647400 Mon Sep 17 00:00:00 2001 From: Aaron James Ridley Date: Tue, 13 May 2025 15:23:29 -0400 Subject: [PATCH 532/691] DOC: describe using astyle within vscode --- CONTRIBUTING.md | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 07ced9ce..6f8bcef8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -34,29 +34,20 @@ on WSL with Ubuntu, the command seems to be: astyle --options=.astylerc src/*.cpp -#### Linting +Astyle can also be used within VSCode as an extension. Install the "Astyle" extension (author: Chieh Yu). Then go to settings (the "Manage" wheel on the bottom left, then click on "settings"). Under "Extensions", click on "Astyle Configuration". Within that, you can set the location of the astylerc file. Click on "Edit in settings.json". Modify the file so it has the following line: + "[cpp]": { + "editor.defaultFormatter": "chiehyu.vscode-astyle", + "editor.formatOnSave": true + }, + "astyle.astylerc": "${workspaceRoot}/.astylerc" -For *C++* code make sure to use a static code checker like -[cpplint](https://github.com/cpplint/cpplint) to check the code for -any style issues before submitting. For *Python*, -[flake8](https://flake8.pycqa.org/en/latest/) is a good option. Both -of these may by installed using pip. +This should then allow you to format the code using the defaults that we have set in the astyle file. This can be done with (Ctrl-Shift-I for Linux, Alt-Shift-F for Windows) and upon saving the file - this reformats the whole file to put it into the astyle format. -To install `cpplint` +#### Linting -```sh -# depending on your system one of these lines applies -pip install --user cpplint -pip install cpplint -python3 -m pip cpplint -python3 -m pip --user cpplint -``` +For *Python*, +[flake8](https://flake8.pycqa.org/en/latest/) is a good option. This may by installed using pip. -Using a linter in an editor is a good supplement, but not a replacement for the -static linters. The linter in the 'atom' editor requires that you install the -`linter` and `gcc-linter` packages. Atom also has additional packages -`whitespaces` and `tabs-to-spaces` to automatically remove whitespaces at the -end of the lines, and convert tabs to spaces. ## Commit Styling From d8c29af5ff73cd3ce328b717d7fdee3421e0b7f6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 14 May 2025 07:00:48 -0400 Subject: [PATCH 533/691] BUG: need a communicator for members of same ensemble --- include/parallel.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/parallel.h b/include/parallel.h index 6da886c5..11372be3 100644 --- a/include/parallel.h +++ b/include/parallel.h @@ -30,6 +30,7 @@ extern std::string cGrid; /// communicator for all of aether extern MPI_Comm aether_comm; +extern MPI_Comm aether_member_comm; /********************************************************************** \brief initialize mpi and figure out ensembles and grid blocks From fe71babaf326c466d4eaeea6fc749d7f93bec290 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 14 May 2025 07:02:54 -0400 Subject: [PATCH 534/691] BUG: static causes issues for second grid --- src/exchange_messages.cpp | 138 +++++++++++++++++++++++++++++--------- 1 file changed, 107 insertions(+), 31 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 8e0a41be..895bb854 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -36,6 +36,58 @@ bool Neutrals::exchange_old(Grid &grid) { return DidWork; } +void average_value_at_pole(Grid &grid, arma_cube &value, arma_cube &velocity, + int64_t iLast, int64_t iPole, + bool doesTouchPole) { + // Now let's deal with the poles: + // north pole first: + int64_t iX, nX = grid.get_nX(); + int64_t iZ, nZ = grid.get_nZ(); + int64_t nGCs = grid.get_nGCs(); + int64_t iY, iInc = 1; + + if (iPole < iLast) + iInc = -1; + + double weight, sumValue, sumWeight, totalValue, totalWeight, poleValue; + + for (iZ = nGCs; iZ < nZ - nGCs; iZ++) { + + sumValue = 0.0; + sumWeight = 0.0; + + if (doesTouchPole) { + for (iX = nGCs; iX < nX - nGCs; iX++) { + // determine the weight based on the northward velocity: + weight = iInc * velocity(iX, iLast, iZ) / 1000.0 + 1.0; + + if (weight < 0.01) + weight = 0.01; + + sumValue = sumValue + value(iX, iLast, iZ) * weight; + sumWeight = sumWeight + weight; + } + } + + MPI_Allreduce(&sumValue, &totalValue, 1, MPI_DOUBLE, MPI_SUM, + aether_comm); + MPI_Allreduce(&sumWeight, &totalWeight, 1, MPI_DOUBLE, MPI_SUM, + aether_comm); + poleValue = totalValue / totalWeight; + + //if (iZ == 10) + //std::cout << "pole value : " << poleValue << " " << totalValue << " " << totalWeight << " " + //<< iProc << " " << doesTouchPole << "\n"; + + if (doesTouchPole) { + for (iX = nGCs; iX < nX - nGCs; iX++) + for (iY = iLast + iInc; iY == iPole; iY += iInc) + value(iX, iY, iZ) = poleValue; + } + } + +} + // ----------------------------------------------------------------------------- // This is the main exchange messages for the neutrals. // We are exchanging densities, temperatures, and velocities @@ -53,7 +105,7 @@ bool Ions::exchange_old(Grid &grid) { for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); - DidWork = exchange_one_var(grid, temperature_scgc, false); + //DidWork = exchange_one_var(grid, temperature_scgc, false); DidWork = exchange_one_var(grid, electron_temperature_scgc, false); // velocity components: @@ -64,6 +116,25 @@ bool Ions::exchange_old(Grid &grid) { // don't reverse vertical across the pole: DidWork = exchange_one_var(grid, velocity_vcgc[2], false); + int64_t iPole = grid.get_nY() - 1; + int64_t iLast = iPole - nGCs; + + average_value_at_pole(grid, temperature_scgc, velocity_vcgc[1], + iLast, iPole, grid.DoesTouchNorthPole); + + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) + average_value_at_pole(grid, species[iSpecies].density_scgc, velocity_vcgc[1], + iLast, iPole, grid.DoesTouchNorthPole); + + iPole = 0; + iLast = nGCs; + average_value_at_pole(grid, temperature_scgc, velocity_vcgc[1], + iLast, iPole, grid.DoesTouchSouthPole); + + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) + average_value_at_pole(grid, species[iSpecies].density_scgc, velocity_vcgc[1], + iLast, iPole, grid.DoesTouchSouthPole); + report.exit(function); return DidWork; } @@ -119,9 +190,9 @@ bool pack_border(const arma_cube &value, int iDir) { bool DidWork = true; - static int64_t nX = value.n_rows; - static int64_t nY = value.n_cols; - static int64_t nZ = value.n_slices; + int64_t nX = value.n_rows; + int64_t nY = value.n_cols; + int64_t nZ = value.n_slices; int64_t iXstart, iXend; int64_t iYstart, iYend; @@ -221,9 +292,9 @@ bool unpack_border(arma_cube &value, bool XbecomesY) { bool DidWork = true; - static int64_t nX = value.n_rows; - static int64_t nY = value.n_cols; - static int64_t nZ = value.n_slices; + int64_t nX = value.n_rows; + int64_t nY = value.n_cols; + int64_t nZ = value.n_slices; int64_t iXstart, iXend; int64_t iYstart, iYend; @@ -345,6 +416,7 @@ bool unpack_border(arma_cube &value, } catch (...) { DidWork = false; } + return DidWork; } @@ -394,7 +466,7 @@ bool pack_one_var_on_one_face(arma_cube var_scgc, int iDirToPass, Grid &grid) { - static int nG = grid.get_nGCs(); + int nG = grid.get_nGCs(); int iDir = grid.interchangesOneVar[iDirToPass].iFace; int iReceiver = grid.interchangesOneVar[iDirToPass].iProc_to; precision_t *buffer = grid.interchangesOneVar[iDirToPass].buffer; @@ -475,9 +547,9 @@ bool Grid::send_one_var_one_face(int64_t iFace) { if (report.test_verbose(4)) std::cout << "in send_one_var_one_face : " << iFace << " from: " << - iProc << " to: " << - interchangesOneVar[iFace].iProc_to << " tag: " << - interchangesOneVar[iFace].iTag << "\n"; + iProc << " to: " << + interchangesOneVar[iFace].iProc_to << " tag: " << + interchangesOneVar[iFace].iTag << "\n"; MPI_Isend(interchangesOneVar[iFace].buffer, interchangesOneVar[iFace].iSizeTotal, @@ -521,9 +593,9 @@ bool Grid::receive_one_var_one_face(int64_t iFace) { if (report.test_verbose(4)) std::cout << "in receive_one_var_one_face : " << iFace << " from: " << - iProc << " to: " << - interchangesOneVar[iFace].iProc_to << " tag: " << - interchangesOneVar[iFace].iTag << "\n"; + iProc << " to: " << + interchangesOneVar[iFace].iProc_to << " tag: " << + interchangesOneVar[iFace].iTag << "\n"; MPI_Recv(interchangesOneVar[iFace].rbuffer, @@ -1026,24 +1098,28 @@ bool exchange_one_var(Grid &grid, int iTag, iDir, nDir; int iSpecies; - static int64_t nX = grid.get_nX(); - static int64_t nY = grid.get_nY(); - static int64_t nZ = grid.get_nZ(); - static int64_t nG = grid.get_nGCs(); - static arma_cube var_scgc; + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); + int64_t nG = grid.get_nGCs(); + arma_cube var_scgc; - static int64_t nVarsToPass = 1; + int64_t nVarsToPass = 1; if (!grid.isExchangeInitialized) { DidWork = exchange_sides_init(grid, nVarsToPass); grid.isExchangeInitialized = true; + std::cout << "initializing : " << grid.get_gridtype() << " " << nZ << " " << + iProc << "\n"; } + var_scgc.set_size(nX, nY, nZ); int64_t iP; precision_t oneSign = 1.0; nDir = 4; + if (grid.get_IsDipole() && grid.get_IsClosed()) nDir++; @@ -1139,10 +1215,10 @@ bool test_ghostcell_interpolation(Grid &grid) { bool didWork = true; - static int64_t iX, nX = grid.get_nX(); - static int64_t iY, nY = grid.get_nY(); - static int64_t iZ, nZ = grid.get_nZ(); - static int64_t nG = grid.get_nGCs(); + int64_t iX, nX = grid.get_nX(); + int64_t iY, nY = grid.get_nY(); + int64_t iZ, nZ = grid.get_nZ(); + int64_t nG = grid.get_nGCs(); int64_t iStart, iEnd, jStart, jEnd, iDir; // Check the latitudes and longitudes to make sure that they map to @@ -1252,9 +1328,9 @@ arma_cube interpolate_ghostcells(arma_cube varIn, Grid &grid) { bool didWork = true; int64_t iDir; - static int64_t iX, ix_, nX = grid.get_nX(); - static int64_t iY, iy_, nY = grid.get_nY(); - static int64_t iG, nG = grid.get_nGCs(); + int64_t iX, ix_, nX = grid.get_nX(); + int64_t iY, iy_, nY = grid.get_nY(); + int64_t iG, nG = grid.get_nGCs(); precision_t r_; arma_cube varOut = varIn; @@ -1322,10 +1398,10 @@ bool find_ghostcell_interpolation_coefs(Grid &grid) { bool didWork = true; - static int64_t iX, nX = grid.get_nX(); - static int64_t iY, nY = grid.get_nY(); - static int64_t iZ, nZ = grid.get_nZ(); - static int64_t nG = grid.get_nGCs(); + int64_t iX, nX = grid.get_nX(); + int64_t iY, nY = grid.get_nY(); + int64_t iZ, nZ = grid.get_nZ(); + int64_t nG = grid.get_nGCs(); // Test to see if the longitudes are the same as the original arma_cube yOther = grid.refy_angle * cRtoD; From 165582890d29ed1a3fc8961876b3333d4033496b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 14 May 2025 07:03:55 -0400 Subject: [PATCH 535/691] FEAT: new communicator for ensemble --- src/init_parallel.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index c940148a..e89751d2 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -22,6 +22,7 @@ std::string cMember; std::string cGrid; MPI_Comm aether_comm; +MPI_Comm aether_member_comm; bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion) { @@ -71,6 +72,11 @@ bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion) { iMember = iProc / nGrids; iGrid = iProc % nGrids; + // Need a communicator for each ensemble member, this allows + // communication between all blocks in one ensemble member without + // the others getting the messages: + MPI_Comm_split(aether_comm, iMember, iGrid, &aether_member_comm); + if (report.test_verbose(2)) std::cout << "iProc : " << iProc << "; iMember : " << iMember From 5fe11f9af853b870389ae468dd67712107423d38 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 14 May 2025 07:05:16 -0400 Subject: [PATCH 536/691] FEAT: sync mean across ensemble member --- src/tools.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/tools.cpp b/src/tools.cpp index d041bf49..c62b3172 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -238,6 +238,23 @@ precision_t sync_mean_across_all_procs(precision_t value) { return global_value; } +// ---------------------------------------------------------------------------- +// Calculate the average value across all processors +// - this is the same as sync_mean_across_all_procs, but is limited to +// processors in a given member +// ---------------------------------------------------------------------------- + +precision_t sync_mean_across_member(precision_t value) { + precision_t global_value; + double vSend, vReceive; + double nSend, nReceive; + vSend = value; + nSend = 1.0; + MPI_Allreduce(&vSend, &vReceive, 1, MPI_DOUBLE, MPI_SUM, aether_member_comm); + MPI_Allreduce(&nSend, &nReceive, 1, MPI_DOUBLE, MPI_SUM, aether_member_comm); + global_value = vReceive / nReceive; + return global_value; +} // ---------------------------------------------------------------------------- // Generate a vector of normally distributed random doubles // ---------------------------------------------------------------------------- From 243b38debb42cc2dde9a9dab9a8a515f9bece2ff Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 19:57:08 -0400 Subject: [PATCH 537/691] FEAT: get grid to grid message passing to work --- src/grid_match.cpp | 164 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 145 insertions(+), 19 deletions(-) diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 39639dab..ecb62c92 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -62,11 +62,27 @@ bool exchange_information(int64_t *nPointsToPass, return true; } -bool grid_match(Grid gGrid, - Grid mGrid, +// ----------------------------------------------------------------------------- +// This function: +// on the requesting information side: +// - figures out which processor each point of the other grid is on +// - counts the points for each processor +// - exchanges how many points to pass for each processor +// - makes lists of coordinates to send to each processor +// - sends those lists +// on the interpolator side: +// - builds interpolators for the requested information +// ----------------------------------------------------------------------------- + +bool grid_match(Grid &gGrid, + Grid &mGrid, Quadtree gQuadtree, Quadtree mQuadtree) { + std::string function = "grid_match"; + static int iFunction = -1; + report.enter(function, iFunction); + // Let's do magnetic to geographic first: int64_t iX, mnX = mGrid.get_nX(); @@ -86,6 +102,7 @@ bool grid_match(Grid gGrid, // This is not the most efficient way to do this, but the first pass, let's // just count how many points we need to send to the other processors: + mGrid.gridToGridMap.set_size(mnX, mnY, mnZ); for (iX = mGCs; iX < mnX - mGCs; iX++) { for (iY = mGCs; iY < mnY - mGCs; iY++) { for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { @@ -103,6 +120,7 @@ bool grid_match(Grid gGrid, if (jNode < 0 || jNode >= nGrids) { std::cout << "out of bounds!!! " << jNode << "\n"; } + mGrid.gridToGridMap(iX, iY, iZ) = jNode; nPointsToPass[jNode] = nPointsToPass[jNode]+1; /* std::cout << "lon, lat, node: " << lon*cRtoD << " " << lat*cRtoD << " " @@ -115,13 +133,13 @@ bool grid_match(Grid gGrid, } } } - std::cout << "made it here: " << iProc << "\n"; MPI_Barrier(aether_comm); - for (jNode = 0; jNode < nGrids ; jNode++) - std::cout << "nPtsToPass : " << iProc << " " << nPointsToPass[jNode] << "\n"; - - std::cout << "sending number of points :\n"; + if (report.test_verbose(3)) { + for (jNode = 0; jNode < nGrids ; jNode++) + std::cout << "nPtsToPass : " << iProc << " " << nPointsToPass[jNode] << "\n"; + std::cout << "sending number of points :\n"; + } // This section sends the number of points that need to be transfered to each processor. // Then the processor saves the number of points, so it can be remembered, and both the @@ -135,27 +153,23 @@ bool grid_match(Grid gGrid, nPointsToReceive[jNode] = nPointsDummy[iGrid]; } - MPI_Barrier(aether_comm); - - for (jNode = 0; jNode < nGrids ; jNode++) { - std::cout << "nPtsToReceive : " << iProc << " " << jNode << " " << nPointsToReceive[jNode] << "\n"; - MPI_Barrier(aether_comm); + if (report.test_verbose(3)) { + for (jNode = 0; jNode < nGrids ; jNode++) { + std::cout << "nPtsToReceive : " << iProc << " " << jNode << " " << nPointsToReceive[jNode] << "\n"; + } } // Now we need to create an array of send points and an array of receive points. std::vector latsToPass(nGrids); std::vector lonsToPass(nGrids); std::vector altsToPass(nGrids); - for (jNode = 0; jNode < nGrids ; jNode++) { - latsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - lonsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - altsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - } - std::vector latsToInterTo(nGrids); std::vector lonsToInterTo(nGrids); std::vector altsToInterTo(nGrids); for (jNode = 0; jNode < nGrids ; jNode++) { + latsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); + lonsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); + altsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); latsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); lonsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); altsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); @@ -186,11 +200,123 @@ bool grid_match(Grid gGrid, } } bool didWork; + // Pass first coordinate (lons) + didWork = exchange_information(nPointsToPass, + lonsToPass, + nPointsToReceive, + lonsToInterTo); + // Pass second coordinate (lats) didWork = exchange_information(nPointsToPass, latsToPass, nPointsToReceive, latsToInterTo); + // Pass third coordinate (alts): + didWork = exchange_information(nPointsToPass, + altsToPass, + nPointsToReceive, + altsToInterTo); + if (report.test_verbose(2)) { + for (jNode = 0; jNode < nGrids ; jNode++) { + std::cout << "Received the following points from iGrid = " << jNode << "\n"; + std::cout << " -> points received : " << nPointsToReceive[jNode] << "\n"; + for (int64_t iPt = 0; iPt < nPointsToReceive[jNode]; iPt++) + std::cout << " -> " << iPt << " " + << lonsToInterTo[jNode][iPt] << " " + << latsToInterTo[jNode][iPt] << " " + << altsToInterTo[jNode][iPt] << "\n"; + } + } - return true; + struct grid_to_grid_t oneGrid; + + int64_t nPts; + for (jNode = 0; jNode < nGrids ; jNode++) { + // These are backwards now, since we will switch sender and reciever: + oneGrid.nPts = nPointsToReceive[jNode]; + oneGrid.nPtsReceive = nPointsToPass[jNode]; + oneGrid.iProcTo = iMember * nGrids + jNode; + if (report.test_verbose(2)) + std::cout << "Making interpolation coefficients for : " << jNode + << "; points : " << oneGrid.nPts << "\n"; + if (oneGrid.nPts > 0) { + // Interpolation function takes vectors, + // so transfer these arrays to vectors: + std::vector Lons(oneGrid.nPts); + std::vector Lats(oneGrid.nPts); + std::vector Alts(oneGrid.nPts); + for (int64_t iPt = 0; iPt < oneGrid.nPts; iPt++) { + Lons[iPt] = lonsToInterTo[jNode][iPt]; + Lats[iPt] = latsToInterTo[jNode][iPt]; + Alts[iPt] = altsToInterTo[jNode][iPt]; + } + oneGrid.interpCoefs = gGrid.get_interpolation_coefs(Lons, Lats, Alts); + } + gGrid.gridToGridCoefs.push_back(oneGrid); + } + + report.exit(function); + return didWork; } + +bool get_data_from_other_grid(Grid &gGrid, + Grid &mGrid, + arma_cube &gData, + arma_cube &mData) { + + std::string function = "get_data_from_other_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + int64_t jNode, iPt; + std::vector dataToSend(nGrids); + std::vector dataToReceive(nGrids); + int64_t *nPointsToSend = static_cast(malloc(nGrids * sizeof(int64_t))); + int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof(int64_t))); + + for (jNode = 0; jNode < nGrids ; jNode++) { + if (report.test_verbose(2)) + std::cout << "nPts : " << jNode << " " << gGrid.gridToGridCoefs[jNode].nPts << "\n"; + nPointsToSend[jNode] = gGrid.gridToGridCoefs[jNode].nPts; + nPointsToReceive[jNode] = gGrid.gridToGridCoefs[jNode].nPtsReceive; + dataToSend[jNode] = static_cast(malloc(gGrid.gridToGridCoefs[jNode].nPts * sizeof(precision_t))); + dataToReceive[jNode] = static_cast(malloc(gGrid.gridToGridCoefs[jNode].nPtsReceive * sizeof(precision_t))); + std::vector values = gGrid.get_interpolation_values(gData, gGrid.gridToGridCoefs[jNode].interpCoefs); + + for (iPt = 0; iPt < gGrid.gridToGridCoefs[jNode].nPts; iPt++) { + dataToSend[jNode][iPt] = values[iPt]; + if (report.test_verbose(2)) + std::cout << "datatosend : " << iPt << " " << dataToSend[jNode][iPt] << "\n"; + } + } + bool didWork = exchange_information(nPointsToSend, + dataToSend, + nPointsToReceive, + dataToReceive); + int64_t iX, mnX = mGrid.get_nX(); + int64_t iY, mnY = mGrid.get_nY(); + int64_t iZ, mnZ = mGrid.get_nZ(); + int64_t mGCs = mGrid.get_nGCs(); + std::vector iCounter(nGrids); + for (jNode = 0; jNode < nGrids ; jNode++) + iCounter[jNode] = 0; + + for (iX = mGCs; iX < mnX - mGCs; iX++) { + for (iY = mGCs; iY < mnY - mGCs; iY++) { + for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { + jNode = mGrid.gridToGridMap(iX, iY, iZ); + if (report.test_verbose(2)) { + std::cout << "unpacking point : " << iX << " " << iY << " " << iZ << " " << jNode << " " + << iCounter[jNode] << " " << dataToReceive[jNode][iCounter[jNode]] << "\n"; + } + + mData(iX, iY, iZ) = dataToReceive[jNode][iCounter[jNode]]; + iCounter[jNode] = iCounter[jNode]+1; + } + } + } + + report.exit(function); + return true; + +} \ No newline at end of file From fc6f18b497d14aaefb209ba379a923d005811690 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 19:57:50 -0400 Subject: [PATCH 538/691] FEAT: needed for grid to grid MP --- include/calc_grid_derived.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/include/calc_grid_derived.h b/include/calc_grid_derived.h index 28d5237f..046fbd46 100644 --- a/include/calc_grid_derived.h +++ b/include/calc_grid_derived.h @@ -19,9 +19,14 @@ arma_vec calc_bin_widths(arma_vec centers); // ---------------------------------------------------------------------------- // A helper function for mapping grids // ---------------------------------------------------------------------------- -bool grid_match(Grid gGrid, - Grid mGrid, +bool grid_match(Grid &gGrid, + Grid &mGrid, Quadtree gQuadtree, Quadtree mQuadtree); +bool get_data_from_other_grid(Grid &gGrid, + Grid &mGrid, + arma_cube &gData, + arma_cube &mData); + #endif // INCLUDE_CALC_GRID_DERIVED_H_ From 406642dfaa91ca37d0a031a9e3296da51a03aef7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 19:58:44 -0400 Subject: [PATCH 539/691] FEAT: needed for grid to grid MP --- include/grid.h | 80 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 59 insertions(+), 21 deletions(-) diff --git a/include/grid.h b/include/grid.h index fed807e9..b56fead2 100644 --- a/include/grid.h +++ b/include/grid.h @@ -11,6 +11,33 @@ // Grid class // ---------------------------------------------------------------------------- + struct interp_coef_t + { + // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] + uint64_t iRow; + uint64_t iCol; + uint64_t iAlt; + // The coefficients along row, column and altitude + precision_t rRow; + precision_t rCol; + precision_t rAlt; + // Whether the point is within this grid or not + bool in_grid; + // If this is set to true: + bool above_grid, below_grid; + // do interpolation in lat and lon, but extrapolate in altitude + }; + + struct grid_to_grid_t { + int64_t iProcTo; + int64_t nPts; + int64_t nPtsReceive; + std::vector interpCoefs; + std::vector valueToSend; + std::vector valueToReceive; + }; + + class Grid { @@ -20,13 +47,24 @@ class Grid const int iDipole_ = 3; int iGridShape_ = -1; - // Armidillo Cube Versions: + // The index and coefficient used for interpolation + // Each point is processed by the function set_interpolation_coefs and stored + // in the form of this structure. + // If the point is out of the grid, in_grid = false and all other members are undefined + + std::vector gridToGridCoefs; + arma::Cube gridToGridMap; + + // Armadillo Cube Versions: // Cell Center Coordinates arma_cube geoLon_scgc, geoX_scgc; arma_cube geoLat_scgc, geoY_scgc; arma_cube geoAlt_scgc, geoZ_scgc; arma_cube geoLocalTime_scgc; + // This is an array for testing things: + arma_cube test_scgc; + // Reference coordinate arma_cube refx_scgc, refy_scgc; @@ -434,6 +472,22 @@ class Grid bool set_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, const std::vector &Alts); + + /** + * \brief Set the interpolation coefficients + * \param Lons The longitude of points + * \param Lats The latitude of points + * \param Alts The altitude of points + * \pre This instance is an geo grid + * \pre Lons, Lats and Alts have the same size + * \return list of interpolation coefficients + */ + + std::vector get_interpolation_coefs( + const std::vector &Lons, + const std::vector &Lats, + const std::vector &Alts); + /** * \brief Create a map of geographic locations to data and do the interpolation * \param data The value at the positions of geoLon, geoLat, and geoAlt @@ -443,6 +497,8 @@ class Grid * an empty vector if the data is not the same size as the geo grid. */ std::vector get_interpolation_values(const arma_cube &data) const; + std::vector get_interpolation_values(arma_cube data, + std::vector coefArray); private: bool IsGeoGrid; @@ -513,24 +569,6 @@ class Grid bool col_max_exclusive; }; - // The index and coefficient used for interpolation - // Each point is processed by the function set_interpolation_coefs and stored - // in the form of this structure. - // If the point is out of the grid, in_grid = false and all other members are undefined - struct interp_coef_t - { - // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] - uint64_t iRow; - uint64_t iCol; - uint64_t iAlt; - // The coefficients along row, column and altitude - precision_t rRow; - precision_t rCol; - precision_t rAlt; - // Whether the point is within this grid or not - bool in_grid; - }; - // Return the index of the last element that has altitude smaller than or euqal to the input uint64_t search_altitude(const precision_t alt_in) const; @@ -540,11 +578,11 @@ class Grid void get_cubesphere_grid_range(struct cubesphere_range &cr) const; // Helper function for set_interpolation_coefs - void set_interp_coef_sphere(const sphere_range &sr, + struct interp_coef_t get_interp_coef_sphere(const sphere_range &sr, const precision_t lon_in, const precision_t lat_in, const precision_t alt_in); - void set_interp_coef_cubesphere(const cubesphere_range &cr, + struct interp_coef_t get_interp_coef_cubesphere(const cubesphere_range &cr, const precision_t lon_in, const precision_t lat_in, const precision_t alt_in); From b365ed045fd52c6482f79156b4a3f13812209848 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 19:59:30 -0400 Subject: [PATCH 540/691] FEAT: testing grid to grid MP --- src/advance.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/advance.cpp b/src/advance.cpp index 023a73d5..c6252c40 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -46,6 +46,11 @@ bool advance(Planets &planet, didWork = neutralsMag.check_for_nonfinites("Top of Advance - ion grid"); } + // here we are going to grab stuff from the neutral grid and put it on the + // ion grid + didWork = get_data_from_other_grid(gGrid, mGrid, neutrals.temperature_scgc, mGrid.test_scgc); + + gGrid.calc_sza(planet, time); mGrid.calc_sza(planet, time); From e9c01dea0f36fd321b6977f02f0b20955a3674d8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 20:00:02 -0400 Subject: [PATCH 541/691] FEAT: testing grid to grid MP --- src/grid.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index 9ed462c3..eb9f8798 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -80,6 +80,9 @@ Grid::Grid(std::string gridtype) { geoAlt_scgc.set_size(nX, nY, nZ); geoLocalTime_scgc.set_size(nX, nY, nZ); + test_scgc.set_size(nX, nY, nZ); + test_scgc.zeros(); + refx_scgc.set_size(nX, nY, nZ); refy_scgc.set_size(nX, nY, nZ); refx_angle.set_size(nX, nY, nZ); From 7bde45e5c566d58ef7efeda5f2c8be5e2d3c3d17 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 20:00:43 -0400 Subject: [PATCH 542/691] STY: remove space --- src/main/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 9d0a0a3f..946e293e 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -100,7 +100,6 @@ int main() { didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); } - didWork = grid_match(gGrid, mGrid, quadtree, quadtree_ion); // Initialize Neutrals on geographic grid: From 21c934dd277c30ee0881d9c381225606b3d18295 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 20:01:27 -0400 Subject: [PATCH 543/691] FEAT: make an output file for test results --- src/output.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/output.cpp b/src/output.cpp index 2a16a8c0..97a85a1c 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -41,6 +41,9 @@ std::string get_filename_from_type(std::string type_output) { if (type_output == "therm") filename = "3DTH"; + if (type_output == "test") + filename = "3DTE"; + return filename; } @@ -153,7 +156,6 @@ bool output(const Neutrals &neutrals, store_variable("density_" + neutrals.species[iSpecies].cName, neutrals.density_unit, neutrals.species[iSpecies].density_scgc); - // Neutral Temperature: if (type_output == "neutrals" || type_output == "states") @@ -322,6 +324,13 @@ bool output(const Neutrals &neutrals, grid.cent_acc_vcgc[2]); } + // Neutral Temperature: + if (type_output == "test") + AllOutputContainers[iOutput]. + store_variable("test_grid", + "none", + grid.test_scgc); + // ------------------------------------------------------------ // Set output file names From b7b2449d6ec2f8e394d939101906e54981334f03 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 20 May 2025 20:05:06 -0400 Subject: [PATCH 544/691] FEAT: allow above and below grid interpolation --- src/solver_grid_interpolation.cpp | 183 +++++++++++++++++++++++++----- 1 file changed, 155 insertions(+), 28 deletions(-) diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index 39bb2dc3..29379f34 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -184,7 +184,8 @@ void Grid::get_cubesphere_grid_range(struct cubesphere_range &cr) const { // Almost the copy of interp_sphere_linear_helper // -------------------------------------------------------------------------- -void Grid::set_interp_coef_sphere(const sphere_range &sr, +struct interp_coef_t Grid::get_interp_coef_sphere( + const sphere_range &sr, const precision_t lon_in, const precision_t lat_in, const precision_t alt_in) { @@ -200,13 +201,15 @@ void Grid::set_interp_coef_sphere(const sphere_range &sr, // Determine whether the point is inside this grid // Treat north pole specially because latitude is inclusive for both -cPI/2 and cPI/2 + // Dpn't check for altitude here! if (lon_in < sr.lon_min || lon_in >= sr.lon_max || lat_in < sr.lat_min - || lat_in > sr.lat_max || (lat_in == sr.lat_max && sr.lat_max != cPI / 2) - || alt_in < sr.alt_min || alt_in > sr.alt_max) { - interp_coefs.push_back(coef); - return; + || lat_in > sr.lat_max || (lat_in == sr.lat_max && sr.lat_max != cPI / 2)) { + return coef; } + // This point is in the grid! + coef.in_grid = true; + // ASSUMPTION: LONGITUDE AND LATITUDE ARE LINEARLY SPACED, nGCs >= 1 // For the cell containing it, directly calculate its x and y index // Find its z index using binary search @@ -228,13 +231,27 @@ void Grid::set_interp_coef_sphere(const sphere_range &sr, // The altitude may not be linearly spaced, so use binary search to find // the first element smaller than or equal to the altitude of the give point // Implemented in search_altitude - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); - // Put the coefficient into the vector - coef.in_grid = true; - interp_coefs.push_back(coef); + if (alt_in < sr.alt_min) { + coef.iAlt = nGCs; + coef.rAlt = alt_in - sr.alt_min; + coef.below_grid = true; + coef.above_grid = false; + } else { + if (alt_in > sr.alt_max) { + coef.iAlt = nAlts - nGCs; + coef.rAlt = alt_in - sr.alt_max; + coef.below_grid = false; + coef.above_grid = true; + } else { + coef.iAlt = search_altitude(alt_in); + coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) + / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + coef.below_grid = false; + coef.above_grid = false; + } + } + return coef; } // -------------------------------------------------------------------------- @@ -242,7 +259,7 @@ void Grid::set_interp_coef_sphere(const sphere_range &sr, // Almost the copy of interp_cubesphere_linear_helper // -------------------------------------------------------------------------- -void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, +struct interp_coef_t Grid::get_interp_coef_cubesphere(const cubesphere_range &cr, const precision_t lon_in, const precision_t lat_in, const precision_t alt_in) { @@ -259,8 +276,7 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, // Determine whether the projection point is on the surface of the grid if (surface_in != cr.surface_number) { - interp_coefs.push_back(coef); - return; + return coef; } // Calculate the theoretical fractional row index and column index @@ -280,12 +296,13 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, || row_frac_index > row_index_max || (row_frac_index == row_index_max && cr.row_max_exclusive) || col_frac_index > col_index_max || (col_frac_index == col_index_max && - cr.col_max_exclusive) - || alt_in < cr.alt_min || alt_in > cr.alt_max) { - interp_coefs.push_back(coef); - return; + cr.col_max_exclusive)) { + return coef; } + // This point is in the grid! + coef.in_grid = true; + // Get the real integer index and the interpolation coefficient uint64_t row_index, col_index, alt_index; precision_t rRow, rCol, rAlt; @@ -303,13 +320,27 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, coef.rCol = col_frac_index - coef.iCol; coef.iCol += nGCs - 1; // Use binary search to find the index for altitude - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); - // Put the coefficient into the vector - coef.in_grid = true; - interp_coefs.push_back(coef); + if (alt_in < cr.alt_min) { + coef.iAlt = nGCs; + coef.rAlt = 0.0; + coef.below_grid = true; + coef.above_grid = false; + } else { + if (alt_in > cr.alt_max) { + coef.iAlt = nAlts - nGCs; + coef.rAlt = 0.0; + coef.below_grid = false; + coef.above_grid = true; + } else { + coef.iAlt = search_altitude(alt_in); + coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) + / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + coef.below_grid = false; + coef.above_grid = false; + } + } + return coef; } // -------------------------------------------------------------------------- @@ -319,6 +350,8 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, bool Grid::set_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, const std::vector &Alts) { + + struct interp_coef_t coef; // If this is not a geo grid, return false if (!IsGeoGrid) return false; @@ -337,21 +370,84 @@ bool Grid::set_interpolation_coefs(const std::vector &Lons, get_cubesphere_grid_range(cr); // Calculate the index and coefficients for each point - for (size_t i = 0; i < Lons.size(); ++i) - set_interp_coef_cubesphere(cr, Lons[i], Lats[i], Alts[i]); + for (size_t i = 0; i < Lons.size(); ++i) { + coef = get_interp_coef_cubesphere(cr, Lons[i], Lats[i], Alts[i]); + interp_coefs.push_back(coef); + } + } else { // Calculate the range of the grid struct sphere_range sr; get_sphere_grid_range(sr); // Calculate the index and coefficients for each point - for (size_t i = 0; i < Lons.size(); ++i) - set_interp_coef_sphere(sr, Lons[i], Lats[i], Alts[i]); + for (size_t i = 0; i < Lons.size(); ++i) { + coef = get_interp_coef_sphere(sr, Lons[i], Lats[i], Alts[i]); + interp_coefs.push_back(coef); + } } return true; } +// -------------------------------------------------------------------------- +// Set the interpolation coefficients +// (v2 - return a list of interpolation coefficients) +// -------------------------------------------------------------------------- + +std::vector Grid::get_interpolation_coefs( + const std::vector &Lons, + const std::vector &Lats, + const std::vector &Alts) { + + int64_t nPts = Lons.size(), iPt; + std::vector listOfCoefs; + struct interp_coef_t singleCoef; + bool isBad = false; + + // If this is not a geo grid, return false + if (!IsGeoGrid) + isBad = true; + + // If the size of Lons, Lats and Alts are not the same, return false + if (Lons.size() != Lats.size() || Lats.size() != Alts.size()) + isBad = true; + + if (isBad) { + for (iPt = 0; iPt < nPts; ++iPt) { + // Put the coefficient into the vector + singleCoef.in_grid = false; + listOfCoefs.push_back(singleCoef); + } + return listOfCoefs; + } + + // Handle according to whether it is cubesphere or not + if (IsCubeSphereGrid) { + // Calculate the range of the grid + struct cubesphere_range cr; + get_cubesphere_grid_range(cr); + + // Calculate the index and coefficients for each point + for (iPt = 0; iPt < nPts; ++iPt) { + singleCoef = get_interp_coef_cubesphere(cr, Lons[iPt], Lats[iPt], Alts[iPt]); + listOfCoefs.push_back(singleCoef); + } + } else { + // Calculate the range of the grid + struct sphere_range sr; + get_sphere_grid_range(sr); + + // Calculate the index and coefficients for each point + for (iPt = 0; iPt < nPts; ++iPt) { + singleCoef = get_interp_coef_sphere(sr, Lons[iPt], Lats[iPt], Alts[iPt]); + listOfCoefs.push_back(singleCoef); + } + } + + return listOfCoefs; +} + // -------------------------------------------------------------------------- // Do the interpolation based on the coefficients stored in interp_coefs // -------------------------------------------------------------------------- @@ -381,3 +477,34 @@ std::vector Grid::get_interpolation_values( return ans; } + +// -------------------------------------------------------------------------- +// Do the interpolation based on the coefficients passed in +// -------------------------------------------------------------------------- + +std::vector Grid::get_interpolation_values(arma_cube data, + std::vector coefArray ) { + std::vector ans; + + // If the size of data is not the same as the size of grid, return an empty vector + if (data.n_rows != nLons || data.n_cols != nLats || data.n_slices != nAlts) + return ans; + + for (auto &it : coefArray) { + // Do interpolation if in_grid = true. Push cNinf otherwise + if (it.in_grid) { + ans.push_back(interpolate_unit_cube( + data.subcube(it.iRow, it.iCol, it.iAlt, unit_cube_size), + it.rRow, + it.rCol, + it.rAlt + )); + // Add std::cout if needed here + // std::cout << "iProc = " << iProc << " interpolates the point successfully\n"; + } else + ans.push_back(cNinf); + } + + return ans; +} + From ab076ec80aa56574bc1a1a0ed4c7796f65640170 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 22 May 2025 20:46:10 -0400 Subject: [PATCH 545/691] BUG: Fix read_armadillo.py, indexing was weird/inconsistent --- srcPython/read_armadillo.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/srcPython/read_armadillo.py b/srcPython/read_armadillo.py index 4c75c0b8..9f9427ed 100644 --- a/srcPython/read_armadillo.py +++ b/srcPython/read_armadillo.py @@ -111,13 +111,10 @@ def cube2np(files2read): f"File ({thisf}) does not appear to be an armadillo cube.\n" f"Found shape: {shape}") shape = np.array(shape, dtype=int) # convert shape to np array of int's - ls = np.zeros(shape) # holder for this file's outputs, dtype is float - for i in range(int(shape[0])): # n_x - for j in range(int(shape[2])): # n_z - # each line is n_y long. Convert it to a python list & retain it - l = f.readline().strip().replace(' ',',').split(',') - ls[i,:, j] = l # n_y - out.append(ls.T) # speed not a huge issue, work with lists + # Read in cube, transform shape, use same indexing as arma does + one_cube = np.loadtxt(thisf, skiprows=2, ).reshape(shape) + + out.append(one_cube) # speed not a huge issue, work with lists # remove 0th dimension if we only are reading one file if len(files2read) == 1: @@ -165,12 +162,10 @@ def mat2np(files2read): f"File ({thisf}) does not appear to be an armadillo matrix.\n" f"Found shape: {shape}") shape = np.array(shape, dtype=int) # convert shape to np array of int's - ls = np.zeros(shape) # holder for this file's outputs, dtype is float - for i in range(int(shape[0])): # n_x - # each line is n_y long. Convert it to a python list & retain it - l = f.readline().strip().replace(' ',',').split(',') - ls[i,:] = l # n_y - out.append(ls.T) # speed not a huge issue, work with lists + + one_mat = np.loadtxt(thisf, skiprows=2).reshape(shape) + + out.append(ls) # speed not a huge issue, work with lists # remove 0th dimension if we only are reading one file if len(files2read) == 1: From 59e28f678a1faa3c54c9730577a2255db0e9916f Mon Sep 17 00:00:00 2001 From: Thomas Ignaczak <53984067+badfluff@users.noreply.github.com> Date: Fri, 6 Jun 2025 12:12:47 -0400 Subject: [PATCH 546/691] bug: use consts for ion get_species_id --- include/ions.h | 2 +- src/ions.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/ions.h b/include/ions.h index 17a0adea..41da16c8 100644 --- a/include/ions.h +++ b/include/ions.h @@ -98,7 +98,7 @@ class Ions { void init_ion_temperature(Neutrals neutrals, Grid grid); void set_floor(); void fill_electrons(); - int get_species_id(std::string name); + int get_species_id(const std::string &name)const; void calc_efield(Grid grid); void calc_exb_drift(Grid grid); void calc_ion_drift(Neutrals neutrals, diff --git a/src/ions.cpp b/src/ions.cpp index 558df96b..3b633b5e 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -264,7 +264,7 @@ void Ions::fill_electrons() { // Will return nSpecies for electrons //---------------------------------------------------------------------- -int Ions::get_species_id(std::string name) { +int Ions::get_species_id(const std::string &name) const{ std::string function = "Ions::get_species_id"; static int iFunction = -1; From 028a532530fa55d13a3202747f85137cd30d19a0 Mon Sep 17 00:00:00 2001 From: t-barnard Date: Fri, 6 Jun 2025 12:52:25 -0400 Subject: [PATCH 547/691] bug fix: speed up chemistry read and clean chem display --- include/chemistry.h | 16 ++++----- include/neutrals.h | 2 +- src/chemistry.cpp | 83 +++++++++++++++++++++++++-------------------- src/neutrals.cpp | 2 +- 4 files changed, 57 insertions(+), 46 deletions(-) diff --git a/include/chemistry.h b/include/chemistry.h index c201aa91..118d0189 100644 --- a/include/chemistry.h +++ b/include/chemistry.h @@ -104,14 +104,14 @@ class Chemistry { int read_chemistry_file(Neutrals neutrals, Ions ions); - reaction_type interpret_reaction_line(Neutrals neutrals, - Ions ions, - std::vector line, - json headers); - - void find_species_id(std::string name, - Neutrals neutrals, - Ions ions, + reaction_type interpret_reaction_line(const Neutrals &neutrals, + const Ions &ions, + const std::vector &line, + const json &headers); + + void find_species_id(const std::string &name, + const Neutrals &neutrals, + const Ions &ions, int &id_, bool &IsNeutral); diff --git a/include/neutrals.h b/include/neutrals.h index be0c0a01..105ceb4a 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -406,7 +406,7 @@ class Neutrals { \brief Get the species ID number (int) given the species name (string) \param name string holding the species name (e.g., "O+") **/ - int get_species_id(std::string name); + int get_species_id(const std::string &name) const; /***************************************************************************** \brief Checks for nans and +/- infinities in density, temp, and velocity diff --git a/src/chemistry.cpp b/src/chemistry.cpp index 4d90a1aa..5026414a 100644 --- a/src/chemistry.cpp +++ b/src/chemistry.cpp @@ -23,16 +23,16 @@ Chemistry::Chemistry(Neutrals neutrals, Ions ions) { - std::string function = "Chemistry::Chemistry"; - static int iFunction = -1; - report.enter(function, iFunction); + std::string function = "Chemistry::Chemistry"; //record current function + static int iFunction = -1; //usually -1 for report function + report.enter(function, iFunction); //keeps track of functions for: verbose levels, etc. - if (read_chemistry_file(neutrals, ions) > 0) { + if (read_chemistry_file(neutrals, ions) > 0) { //searching for valid chem file report.print(0, "Could not read chemistry file!"); - throw std::invalid_argument( "Invalid chemistry file" ); + throw std::invalid_argument( "Invalid chemistry file" ); //throw & catch can be used for error handling } - report.exit(function); + report.exit(function);//done with this function, see report.cpp return; } @@ -414,8 +414,8 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, throw std::invalid_argument( "Invalid chemistry file" ); } - int iRate_ = headers["rate"]; - int iLoss1_ = headers["loss1"]; + int iRate_ = headers["rate"];//record column index of reaction rate in csv file + int iLoss1_ = headers["loss1"];//record column index of loss1 if (!check_chemistry_file(headers, csv, report)) { iErr = 1; @@ -425,7 +425,7 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, nReactions = 0; // Skip 2 lines of headers! - for (int iLine = 2; iLine < nLines; iLine++) { + for (int iLine = 2; iLine < nLines; iLine++) {//run for [54] reactions // Some final rows can have comments in them, so we want to // skip anything where the length of the string in column 2 // is == 0: @@ -444,7 +444,7 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, if (headers.contains("uncertainty")) { if (csv[iLine][headers["uncertainty"]].length() > 0) { // uncertainty column exists! - json values = input.get_perturb_values(); + json values = input.get_perturb_values(); //(inputs.cpp) if (values.contains("Chemistry")) { json chemistryList = values["Chemistry"]; @@ -512,7 +512,7 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, reactions.push_back(reaction); nReactions++; } - } + } //end run through reactions------------------------------------------------------------------------------ } } else { report.print(0, "Could not open good chemistry file!"); @@ -529,10 +529,10 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, // Interpret a comma separated line of the chemical reaction file // ----------------------------------------------------------------------------- -Chemistry::reaction_type Chemistry::interpret_reaction_line(Neutrals neutrals, - Ions ions, - std::vector line, - json headers) { +Chemistry::reaction_type Chemistry::interpret_reaction_line(const Neutrals &neutrals, + const Ions &ions, + const std::vector &line, + const json &headers) { std::string function = "Chemistry::interpret_reaction_line"; static int iFunction = -1; @@ -545,9 +545,9 @@ Chemistry::reaction_type Chemistry::interpret_reaction_line(Neutrals neutrals, bool IsNeutral; // Losses (left side) first: - reaction.nLosses = 0; + reaction.nLosses = 0; //nlosses = # of losses in reaction - for (i = headers["loss1"]; i < headers["loss3"]; i++) { + for (i = headers["loss1"]; i < headers["loss3"]; i++) { // loss 1,2,3 find_species_id(line[i], neutrals, ions, id_, IsNeutral); if (id_ >= 0) { @@ -634,9 +634,9 @@ Chemistry::reaction_type Chemistry::interpret_reaction_line(Neutrals neutrals, // Match a string to the neutral or ion species // ----------------------------------------------------------------------------- -void Chemistry::find_species_id(std::string name, - Neutrals neutrals, - Ions ions, +void Chemistry::find_species_id(const std::string &name, + const Neutrals &neutrals, + const Ions &ions, int &id_, bool &IsNeutral) { @@ -647,13 +647,13 @@ void Chemistry::find_species_id(std::string name, int iSpecies; IsNeutral = false; - id_ = neutrals.get_species_id(name); + id_ = neutrals.get_species_id(name); //from earth.in, starts at 0 w/ first species under "#NEUTRALS",(neutrals.cpp) if (id_ > -1) IsNeutral = true; else - id_ = ions.get_species_id(name); + id_ = ions.get_species_id(name);//from earth.in, starts at 0 w/ first species under "#IONS",(ions.cpp) report.exit(function); return; @@ -670,28 +670,39 @@ void Chemistry::display_reaction(Chemistry::reaction_type reaction) { std::cout << "Number of Losses : " << reaction.nLosses << "\n"; std::cout << "Number of Sources : " << reaction.nSources << "\n"; - for (i = 0; i < reaction.nLosses; i++) - std::cout << reaction.losses_names[i] << " + "; - - std::cout << " -> "; + for (i = 0; i < reaction.nLosses; i++) // First line for reaction + if (i < reaction.nLosses - 1) {// + std::cout << reaction.losses_names[i] << " + "; + } else {// + std::cout << reaction.losses_names[i] << " -> "; + } for (i = 0; i < reaction.nSources; i++) - std::cout << reaction.sources_names[i] << " + "; - - std::cout << " ( RR : " << reaction.rate << ")\n"; + if (i < reaction.nSources - 1) {// + std::cout << reaction.sources_names[i] << " + "; + } else {// + std::cout << reaction.sources_names[i] << " (RR : " << reaction.rate << ")\n"; + } - for (i = 0; i < reaction.nLosses; i++) - std::cout << reaction.losses_ids[i] + for (i = 0; i < reaction.nLosses; i++)//Second line for reaction + if (i < reaction.nLosses - 1) {// + std::cout << reaction.losses_ids[i] << "(" << reaction.losses_IsNeutral[i] << ")" << " + "; - - std::cout << " -> "; + } else {// + std::cout << reaction.losses_ids[i] + << "(" << reaction.losses_IsNeutral[i] << ")" << " -> "; + } for (i = 0; i < reaction.nSources; i++) - std::cout << reaction.sources_ids[i] + if (i < reaction.nSources - 1) {// + std::cout << reaction.sources_ids[i] + << "(" << reaction.sources_IsNeutral[i] << ")" << " + "; + } else {// + std::cout << reaction.sources_ids[i] << "(" << reaction.sources_IsNeutral[i] - << ")" << " + "; + << ")" << " (RR : " << reaction.rate << ")\n"; + } - std::cout << " ( RR : " << reaction.rate << ")\n"; if (reaction.type > 0) { std::cout << "Temperature Dependence: (" diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 376572c9..a4e55f0c 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -318,7 +318,7 @@ bool Neutrals::check_for_nonfinites() { // This will return -1 if the species is not found or name is empty //---------------------------------------------------------------------- -int Neutrals::get_species_id(std::string name) { +int Neutrals::get_species_id(const std::string &name) const { std::string function = "Neutrals::get_species_id"; static int iFunction = -1; From f0f534195d2edf7d1047240995e5dde17bc5a311 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Tue, 1 Jul 2025 14:36:12 -0400 Subject: [PATCH 548/691] Create fism.py (direct from D Brandt) --- srcPython/fism.py | 383 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 srcPython/fism.py diff --git a/srcPython/fism.py b/srcPython/fism.py new file mode 100644 index 00000000..dd158880 --- /dev/null +++ b/srcPython/fism.py @@ -0,0 +1,383 @@ +#!/usr/bin/env python + +# Authors of this code: +# Daniel A. Brandt, Ph.D., Michigan Tech Research Institute, daabrand@mtu.edu +# Aaron J. Ridley, Ph.D., University of Michigan, ridley@umich.edu + +# This file contains a suite of tools that do the following: +# 1. Download FISM2 data for a time period the user desires. +# 2. Rebin that data into the binning scheme the user desires (i.e. EUVAC-37, NEUVAC-59, or SOLOMON). +# 3. Outputs a FISM2 file with the rebinnined irradiances in the desired bins (for use by euv.cpp) + +# Top-level imports: +import numpy as np +import matplotlib.pyplot as plt +from datetime import datetime, timedelta +import matplotlib +matplotlib.use('Qt5Agg') +import pathlib +import os +from urllib.request import urlretrieve +from netCDF4 import Dataset +import scipy.integrate as integ + +# Directory management: +here = pathlib.Path(__file__).parent.resolve() + +# Physical constants: +h = 6.62607015e-34 # Planck's constant in SI units of J s +c = 299792458 # Speed of light in m s^-1 + +# Helper Functions: +def getFism(dateStart, dateEnd, stanBands=False): + """ + Download FISM2 daily data, either in the Standard Bands or not. Default is to download the data NOT in the + Standard Bands. Note that this function downloads the data to a pre-determined location. The download is also + 'smart'. If the data already exists (over the exact same time period). It is NOT overwitten. If the requested data + covers times OUTSIDE the time period of existing data, the NEW data is simply appended or prepended to a file + containing the existing data. + Args: + dateStart: str + The start date in 'YYYY-MM-DD' format. + dateEnd: str + The end date in 'YYYY-MM-DD' format. + stanBands: bool + If True, downloads FISM2 data in the STAN BANDS. Default is False. + Returns: + fismFile: str + The location of the downloaded FISM data. + """ + dateStartDatetime = datetime.strptime(dateStart, "%Y-%m-%d") + dateEndDatetime = datetime.strptime(dateEnd, "%Y-%m-%d") + + # Helper function to manage the obtaining of data, given a URL: + def urlObtain(url, fname): + if os.path.isfile(fname) == True: + print('File already exists (loading in data) '+str(fname)) + else: + urlretrieve(url, fname) + + if stanBands: + URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' + fname = 'FISM2_daily_stan_bands.nc' + saveLoc = here.joinpath('../../tmp/') + if os.path.exists(saveLoc) == False: + os.makedirs(saveLoc) + urlObtain(URL, saveLoc.joinpath(fname)) + datetimes, wavelengths, irradiance, uncertainties = readFism(saveLoc.joinpath(fname), stanBands=True) + else: + URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_hr_data/daily_data.nc' + fname = 'FISM2_daily_bands.nc' + saveLoc = here.joinpath('../../tmp/') + if os.path.exists(saveLoc) == False: + os.makedirs(saveLoc) + urlObtain(URL, saveLoc.joinpath(fname)) + datetimes, wavelengths, irradiance, uncertainties = readFism(saveLoc.joinpath(fname)) + + # Subset the data in time, and save the subset data to a relative path: + subset_inds = np.where((datetimes >= dateStartDatetime) & (datetimes <= dateEndDatetime))[0] + subset_times = datetimes[subset_inds] + subset_irradiance = irradiance[subset_inds, :] + subset_uncertainty = uncertainties[subset_inds, :] + + return subset_times, wavelengths, subset_irradiance, subset_uncertainty + +def rebin(fism_out, binning_scheme='EUVAC', zero=True): + """ + Takes the output of getFism and rebins the data into whatever format the user desires. + Args: + fism_out: arraylike + The output of getFism. Contains 4 elements: (1) datetime values for the FISM2 spectra, (2) the wavelengths + of the spectrum, (3) the actual FISM2 irradiance spectra, and (4) uncertainties on the FISM2 irradiances (is + non-NaN only for FISM2 data not in the Standard Bands). + binning_scheme: str + Determines the binning scheme to be used. Valid arguments include the following: + 'EUVAC': Uses the 37 wavelength band scheme described in Richards, et al. 1994; doi.org/10.1029/94JA00518 + 'NEUVAC': Uses the 59 wavelength band scheme described in Brandt and Ridley, 2024; doi.org/10.1029/2024SW004043 + 'HFG': Uses the 23 wavelength band scheme described in Solomon and Qian, 2005; https://doi.org/10.1029/2005JA011160 + 'SOLOMON': Same situation as for argument 'HFG'. + NOTE: If 'HFG' or 'SOLOMON' is chosen, the values of fism_out must correspond to getFism being run with the + argument stanBands = True. If this IS NOT the case, an error will be thrown. + zero: bool + Controls whether singular (bright) wavelength lines are set to a value of zero after they are extracted. + Default is True. + Returns: + fism2_file: str + The location of the rebinned FISM data. + fism2_data: arraylike + Contains 3 elements: (a) a list of datetimes for the data and (b) the rebinned FISM2 data. + """ + # Unpack the contents of fism_out: + datetimes, wavelengths, irradiance, uncertainties = fism_out + + # Get the native wavelength resolution of the input data: + # nativeResolution = np.concatenate((np.diff(wavelengths), np.array([np.diff(wavelengths)[-1]])), axis=0) + nativeWavelengths = wavelengths.copy() + + if binning_scheme != 'HFG' and binning_scheme != 'SOLOMON': + if binning_scheme == 'EUVAC': + # Grab the euv_37.csv file: + fileStr = str(here.joinpath('euv_files/euv_37.csv')) + bin_bounds = read_euv_csv_file(fileStr) + tag = '_37' + elif binning_scheme == 'NEUVAC': + # Grab the euv_59.csv file: + fileStr = str(here.joinpath('euv_files/euv_59.csv')) + bin_bounds = read_euv_csv_file(fileStr) + tag = '_59' + else: + raise FileNotFoundError('The .csv files for specifying bin boundaries cannot be found!!') + + # Perform the rebinning! + shorts = bin_bounds['short'] / 10. + longs = bin_bounds['long'] / 10. + newWaves = 0.5 * (shorts + longs) + + # Instantiate the new data array: + if len(irradiance.shape) < 2: + fism2_data = np.zeros((1, newWaves.shape[0])) + else: + fism2_data = np.zeros((irradiance.shape[0], newWaves.shape[0])) + + # First go through all the wavelengths that are singular + myData = irradiance + for iWave, short in enumerate(shorts): + long = longs[iWave] + if (long == short): + i = np.argmin(np.abs(wavelengths - short)) + i2 = np.argmin(np.abs(nativeWavelengths - short)) + try: + fism2_data[:, iWave] = myData[:, i] * (nativeWavelengths[i2 + 1] - nativeWavelengths[i2]) + except: + fism2_data[:, iWave] = myData[i] * (nativeWavelengths[i2 + 1] - nativeWavelengths[i2]) + if zero == True: + # Zero out bin so we don't double count it. + try: + myData[:, i] = np.zeros_like(myData[:, i]) + except: + myData[i] = 0.0 + + # Then go through the ranges + for iWave, short in enumerate(shorts): + long = longs[iWave] + if (long != short): + d1 = np.abs(wavelengths - short) + iStart = np.argmin(d1) + d2 = np.abs(wavelengths - long) + iEnd = np.argmin(d2) + wave_int = 0.0 + # For wavelengths at or below 0.2 nm, just compute the sum: + if long <= 0.2: + for i in range(iStart + 1, iEnd + 1): + fism2_data[:, iWave] += myData[:, i] * \ + (wavelengths[i + 1] - wavelengths[i]) + wave_int += (wavelengths[i + 1] - wavelengths[i]) + else: + # For issues computing the sum, integrate instead: + try: + fism2_data[:, iWave] = integ.trapezoid(myData[:, iStart:iEnd], wavelengths[iStart:iEnd], axis=1) + except: + fism2_data[:, iWave] = integ.trapezoid(myData[iStart:iEnd], wavelengths[iStart:iEnd]) + + # # Plotting for a sanity check: + # plt.figure() + # plt.plot(wavelengths[iStart:iEnd], myData[0, iStart:iEnd], marker='o') + # plt.scatter(newWaves, fism2_data[0, :]) + # plt.show() + + elif binning_scheme == 'HFG' or binning_scheme == 'SOLOMON': + # Determine whether the supplied data already conforms to the Solomon and Qian binning scheme. + tag = '_solomon' + if fism_out[2].shape[1] != 23: + raise ValueError("Incorrect dimensions for element 3 of argument 'fism_out'. Dimensions must be (n,23), " + "resulting from running function 'getFism' with argument 'stanBands'=True. ") + # Should the data confirm to the proper dimensions, there is no rebinning step that needs to be done. Simply + # continue. + fism2_data = fism_out[2] + else: + # If the input irradiance data DOES NOT conform to the Solomon and Qian binning scheme, throw an error. + raise ValueError("Invalid value for argument 'binning_scheme'. Must be 'EUVAC', 'NEUVAC', 'HFG', or 'SOLOMON'.") + + # Save the rebinned data to a relative path (outside the package directory) in the form of a .txt file: + fism2_file = here.joinpath('../../tmp/fism2_file'+tag+'.txt') + saveFism(fism2_data, datetimes, fism2_file) + + return fism2_file, fism2_data + +def saveFism(data, times, filename): + """ + Takes (rebinned) FISM2 data and saves it a .txt file at a user-defined location. + Args: + data: numpy.ndarray + Irradiance data in a nxm array where the first dimension corresponds to observations (the spectrum number) + and the second dimension corresponds to wavelengths. + times: numpy.ndarray + The time values at which each spectrum is recorded. + filename: str + The desired location where the data will be saved. + Returns: + Nothing. Simply saves a file. + """ + # A helper function for working with integers: + def numStr(num): + if int(num) < 10: + return ' ' + str(int(num)) + else: + return str(int(num)) + + # Define a helper function for opening a file to write the data, in such a way as to include parent directories if + # needed: + def safe_open_w(path): + ''' Open "path" for writing, creating any parent directories as needed. + (https://stackoverflow.com/questions/23793987/write-a-file-to-a-directory-that-doesnt-exist) + ''' + os.makedirs(os.path.dirname(path), exist_ok=True) + return open(path, 'w') + + # Open the new file and begin writing, line by line: + with safe_open_w(str(filename)) as output: + # Write the header information: + output.write("#START\n") + # Write the irradiances themselves: + firstLine = ['%.6g' % (element) for element in data[0, :]] + firstLine_joined = ' '.join(firstLine) + # The first line should always be a duplicate of the first line of data, but starting at UTC=00:00 of the first date: + output.write(' ' + str(times[0].year) + ' ' + numStr(times[0].month) + ' ' + numStr( + times[0].day) + ' 0 0 0 ' + firstLine_joined + '\n') + # The rest of the lines can be straight from the data: + for i in range(data.shape[0]): + currentLine_joined = ' '.join(['%.6g' % (element) for element in data[i, :]]) + output.writelines(' ' + str(times[i].year) + ' ' + numStr(times[i].month) + ' ' + numStr( + times[i].day) + ' ' + numStr(times[i].hour) + ' 0 0 ' + currentLine_joined + '\n') + # The last line should occur 12 hours from the last datapoint, but have duplicate values there: + lastLine_joined = ' '.join(['%.6g' % (element) for element in data[-1, :]]) + lastTime = times[-1] + timedelta(hours=12) + output.write(' ' + str(lastTime.year) + ' ' + numStr(lastTime.month) + ' ' + numStr( + lastTime.day) + ' 0 0 0 ' + lastLine_joined + '\n') + + print('FISM2 data saved to: ') + os.system('readlink -f '+str(filename)) + return + +def readFism(fism_file, stanBands=False): + """ + Load in spectrum data from a FISM2 file. + Args: + fism_file: str + The location of a FISM2 NETCDF4 file. + stanBands: bool + If True, expects the data to be read in to be in the STAN BANDS. Default is False. + Returns: + datetimes: numpy.ndarray + An array of datetimes for reach FISM2 spectrum. + wavelengths: numpy.ndarray + A one-dimensional array of wavelengths at which there are irradiance values. + irradiances: numpy.ndarray + A two-dimensional array of irradiance values in each wavelength bin. + uncertainties: numpy.ndarray + A two-dimensional array of irradiance uncertainty values at each bin. Only returned if stanBands is False. + """ + fism2Data = Dataset(fism_file) + wavelengths = np.asarray(fism2Data.variables['wavelength']) + if stanBands: + flux = np.asarray(fism2Data.variables['ssi']) # photons/cm^2/second + pFlux = flux * 1e4 # photons/m^2/second + # Convert fluxes to irradiances: + irradiance = np.zeros_like(flux) + for i in range(flux.shape[1]): + irradiance[:, i] = spectralIrradiance(pFlux[:, i], wavelengths[i] * 10.)# W/m^2 + uncertainties = np.full_like(irradiance, np.nan) + else: + irradiance = np.asarray(fism2Data.variables['irradiance']) + uncertainties = np.asarray(fism2Data.variables['uncertainty']) + dates = fism2Data.variables['date'] + datetimes = [] + for j in range(len(dates)): + year = dates[j][:4] + day = dates[j][4:] + currentDatetime = datetime(int(year), 1, 1) + timedelta(int(day) -1 ) + timedelta(hours=12) + datetimes.append(currentDatetime) + datetimes = np.asarray(datetimes) + + return datetimes, wavelengths, irradiance, uncertainties + +def spectralIrradiance(photonFlux, wavelength): + """ + Convert the photon flux to the corresponding spectral irradiance, given a specific wavelength. + Args: + photonFlux: numpy.ndarray, float, or int + Photon flux in units of photons s^-1 m^-2. For a singular wavelength, units are in photons m^-2. + wavelength: wavelength: float + A specific wavelength in Angstroms. + Returns: + irradiance: numpy.ndarray or float + The corresponding spectral irradiance in units of W/m^2/nm. + """ + photonEnergy = (h*c) / (wavelength*1e-10) # Convert the wavelength in the denominator to meters. + irradiance= photonFlux * photonEnergy + return irradiance + +def read_euv_csv_file(file): + """ + Originally written by Aaron J. Ridley, within the file 'fism2_process.py': + https://github.com/aaronjridley/EUV/blob/main/fism2_process.py + + This file reads in binning data from a CSV file that specifies bin boundaries and cross sections for either the + EUVAC model or the NEUVAC model. + Args: + file: str + The location of the .csv file to be read. + Returns: + wavelengths: numpy.ndarray + The wavelength bin boundaries for either the EUVAC model or the NEUVAC model. + """ + fpin = open(file, 'r') + + iFound = 0 + afac = [] + f74113 = [] + for line in fpin: + aline = line.split(',') + s = aline[-1].strip().split('.')[0] + if (aline[0].strip() == "Short"): + if (s.isnumeric()): + short = np.asarray(aline[5:], dtype=float) + else: + short = np.asarray(aline[5:-1], dtype=float) + iFound += 1 + if (aline[0].strip() == "Long"): + if (s.isnumeric()): + long = np.asarray(aline[5:], dtype=float) + else: + long = np.asarray(aline[5:-1], dtype=float) + if (aline[0].strip() == "F74113"): + if (s.isnumeric()): + f74113 = np.asarray(aline[5:], dtype=float) + else: + f74113 = np.asarray(aline[5:-1], dtype=float) + iFound += 1 + if (aline[0].strip() == "AFAC"): + if (s.isnumeric()): + afac = np.asarray(aline[5:], dtype=float) + else: + afac = np.asarray(aline[5:-1], dtype=float) + iFound += 1 + # Save and convert from Angstroms to nm (FISM is in nm) + wavelengths = {'short': short / 10.0, + 'long': long / 10.0, + 'afac': afac, + 'f74113': f74113} + return wavelengths + +# Execution (testing): +if __name__ == '__main__': + # Download some FISM2 data for the time period stated by the user. + dateStart = '2015-08-13' + dateEnd = '2015-08-19' + # fismOut = getFism(dateStart, dateEnd) + # rebinnedFismFile, rebinnedFismData = rebin(fismOut, binning_scheme='EUVAC') + # rebinnedFismFile_N, rebinnedFismData_N = rebin(fismOut, binning_scheme='NEUVAC') + + fismOut_S = getFism(dateStart, dateEnd, stanBands=True) + rebinnedFismFile_S, rebinnedFismData_S = rebin(fismOut_S, binning_scheme='SOLOMON') + From a650409f0b368625111edc10951985fd5a6c11a8 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 2 Jul 2025 10:24:10 -0400 Subject: [PATCH 549/691] FEAT: Read in FISM data --- include/euv.h | 27 ++++++++++++++++++++++ include/inputs.h | 6 +++++ src/euv.cpp | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ src/inputs.cpp | 11 ++++++++- 4 files changed, 102 insertions(+), 1 deletion(-) diff --git a/include/euv.h b/include/euv.h index 138e74f3..686be2f8 100644 --- a/include/euv.h +++ b/include/euv.h @@ -93,6 +93,11 @@ class Euv { /// NEUVAC model intercept: std::vector neuvac_int; + + // To avoid having to start from 0 each iteration: + int fism_prev_index = 0; + // Declare this so it is not passed between function: + index_file_output_struct fismData; // -------------------------------------------------------------------- // Functions: @@ -115,6 +120,17 @@ class Euv { \param indices Need the F107 and F107a **/ bool solomon_hfg(Times time, Indices indices); + + /********************************************************************** + \brief returns the FISM spectrum for a given time + + Unlike the other EUV models ([N]EUVAC, Solomon, etc.), the soectrum + is read from a file. These data are stored in fismData + + \param time The times within the model (dt is needed) + **/ + + bool fism(Times time); /********************************************************************** \brief Compute the EUV spectrum given F107 and F107a (new version) @@ -161,6 +177,17 @@ class Euv { **/ bool read_file(); + /********************************************************************** + \brief Read in the FISM file + + Read in the CSV file with FISM data. This can be made with + srcPython/fism.py. The data are read into a index_file_output_struct, + where each row is one time, and each col is a "variable". These should + match the number of bins in the provided EUV file. + **/ + index_file_output_struct read_fism(std::string fism_filename); + + /********************************************************************** \brief Interprets the EUV CSV rows and returns the relevant row diff --git a/include/inputs.h b/include/inputs.h index c753d874..9436fbca 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -224,6 +224,12 @@ class Inputs { **/ std::string get_euv_file(); + /********************************************************************** + \brief returns settings[" + \param + **/ + std::string get_euv_fismfile(); + /********************************************************************** \brief returns settings[" \param diff --git a/src/euv.cpp b/src/euv.cpp index e97a47a0..ddcb709b 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -44,6 +44,11 @@ Euv::Euv() { } } + // read in FISM data - does not need to be "slotted" + if (input.get_euv_model() == "fism"){ + fismData = read_fism(input.get_euv_fismfile()); + } + // Slot the EUVAC model coefficients: if (input.get_euv_model() == "euvac") { IsOk = slot_euv("F74113", "", euvac_f74113); @@ -167,6 +172,60 @@ bool Euv::read_file() { return DidWork; } +// ------------------------------------------------------------------------------- +// Read in FISM data. FISM files are created with srcPython/fism.py, +// and the data are read in to an index_file_output_struct. +// Inside the struct, we have time & each of the "variables" correspond to a +// FISM bin. This number of bins should match the number of bins in the EUV file +// ------------------------------------------------------------------------------- + +index_file_output_struct Euv::read_fism(std::string fism_filename){ + + std::ifstream fismfstream; + fismfstream.open(fism_filename); + std::vector> fism_file; + fism_file = read_csv(fismfstream); + + index_file_output_struct fism_contents; + + // one row per time + fism_contents.nTimes = fism_file.size(); + // first six cols are the YYYY,MM,DD,HH,mm,ss (no ms) + // the rest are the binned fism data + fism_contents.nVars = fism_file[0].size() - 6; + + // check that the user provided the correct EUV file + // The number of bins in euv file should match the number of fism bins ("nVars") + if (fism_contents.nVars != nWavelengths){ + report.error("Number of FISM wavelengths does not match the EUV file provided!"); + report.error("Either change EUV file or check your FISM file is correct."); + IsOk = false; + } + + std::vector itime(7, 0); + std::vector> values; // holds all values + std::vector values_tmp(fism_contents.nVars); // holds values in each row + + for (int iLine=0; iLine < fism_file.size(); iLine ++){ + + itime[0] = stoi(fism_file[iLine][0]); + itime[1] = stoi(fism_file[iLine][1]); + itime[2] = stoi(fism_file[iLine][2]); + itime[3] = stoi(fism_file[iLine][3]); + itime[4] = stoi(fism_file[iLine][4]); + itime[5] = stoi(fism_file[iLine][5]); + itime[6] = 0; // 0 ms + fism_contents.times.push_back(time_int_to_real(itime)); + for (int iVar=0;iVar Date: Wed, 2 Jul 2025 11:23:47 -0400 Subject: [PATCH 550/691] FEAT: Get stored FISM, make it available as EUV model --- include/euv.h | 8 ++++--- src/calc_euv.cpp | 3 +++ src/euv.cpp | 61 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 60 insertions(+), 12 deletions(-) diff --git a/include/euv.h b/include/euv.h index 686be2f8..0006dfc5 100644 --- a/include/euv.h +++ b/include/euv.h @@ -124,13 +124,15 @@ class Euv { /********************************************************************** \brief returns the FISM spectrum for a given time - Unlike the other EUV models ([N]EUVAC, Solomon, etc.), the soectrum - is read from a file. These data are stored in fismData + Unlike the other EUV models ([N]EUVAC, Solomon, etc.), the spectrum + is read from a file (stored in fismData). This does the same thing + as get_index, however FISM is not stored in Indices since it can + have variable # of bins \param time The times within the model (dt is needed) **/ - bool fism(Times time); + bool get_fism(Times time); /********************************************************************** \brief Compute the EUV spectrum given F107 and F107a (new version) diff --git a/src/calc_euv.cpp b/src/calc_euv.cpp index 2c971f2d..35683130 100644 --- a/src/calc_euv.cpp +++ b/src/calc_euv.cpp @@ -49,6 +49,9 @@ bool calc_euv(Planets planet, didWork = euv.neuvac(time, indices); else if (euvModel == "hfg") didWork = euv.solomon_hfg(time, indices); + else if (euvModel == "fism"){ + didWork = euv.get_fism(time); + } if (didWork) euv.scale_from_1au(planet, time); diff --git a/src/euv.cpp b/src/euv.cpp index ddcb709b..7df04c8c 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -44,10 +44,9 @@ Euv::Euv() { } } - // read in FISM data - does not need to be "slotted" - if (input.get_euv_model() == "fism"){ + // Read in FISM data - does not need to be "slotted" + if (input.get_euv_model() == "fism") fismData = read_fism(input.get_euv_fismfile()); - } // Slot the EUVAC model coefficients: if (input.get_euv_model() == "euvac") { @@ -175,11 +174,11 @@ bool Euv::read_file() { // ------------------------------------------------------------------------------- // Read in FISM data. FISM files are created with srcPython/fism.py, // and the data are read in to an index_file_output_struct. -// Inside the struct, we have time & each of the "variables" correspond to a +// Inside the struct, we have time & each of the "variables" correspond to a // FISM bin. This number of bins should match the number of bins in the EUV file // ------------------------------------------------------------------------------- -index_file_output_struct Euv::read_fism(std::string fism_filename){ +index_file_output_struct Euv::read_fism(std::string fism_filename) { std::ifstream fismfstream; fismfstream.open(fism_filename); @@ -196,7 +195,7 @@ index_file_output_struct Euv::read_fism(std::string fism_filename){ // check that the user provided the correct EUV file // The number of bins in euv file should match the number of fism bins ("nVars") - if (fism_contents.nVars != nWavelengths){ + if (fism_contents.nVars != nWavelengths) { report.error("Number of FISM wavelengths does not match the EUV file provided!"); report.error("Either change EUV file or check your FISM file is correct."); IsOk = false; @@ -205,8 +204,8 @@ index_file_output_struct Euv::read_fism(std::string fism_filename){ std::vector itime(7, 0); std::vector> values; // holds all values std::vector values_tmp(fism_contents.nVars); // holds values in each row - - for (int iLine=0; iLine < fism_file.size(); iLine ++){ + + for (int iLine = 0; iLine < fism_file.size(); iLine ++) { itime[0] = stoi(fism_file[iLine][0]); itime[1] = stoi(fism_file[iLine][1]); @@ -216,8 +215,10 @@ index_file_output_struct Euv::read_fism(std::string fism_filename){ itime[5] = stoi(fism_file[iLine][5]); itime[6] = 0; // 0 ms fism_contents.times.push_back(time_int_to_real(itime)); - for (int iVar=0;iVar fismData.times[-1]) { + report.error("FISM data does not cover the entire time range!"); + report.error("Please check that your FISM file is correct."); + IsOk = false; + } + } + + // Get the index prior to the current time + while (fismData.times[fism_prev_index + 1] <= time_now) + fism_prev_index ++; + + // Determine time-interpolation weighting factor + precision_t dt_fism; + dt_fism = fismData.times[fism_prev_index + 1] - fismData.times[fism_prev_index]; + precision_t x = (time_now - fismData.times[fism_prev_index]) / dt_fism; + std::cout << x << "\n"; + + // store the wavelength: + for (int iWave = 0; iWave < nWavelengths; iWave ++) + wavelengths_intensity_1au[iWave] = + (1.0 - x) * fismData.values[fism_prev_index][iWave] + + x * fismData.values[fism_prev_index + 1][iWave]; + + return IsOk; +} + // -------------------------------------------------------------------------- // Calculate EUVAC // -------------------------------------------------------------------------- From f7e381ed0e032c9f996f6146cc48517202c53d44 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 2 Jul 2025 11:26:14 -0400 Subject: [PATCH 551/691] FEAT: Python script to download & rebin FISM automatically --- srcPython/fism.py | 92 ++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/srcPython/fism.py b/srcPython/fism.py index dd158880..92752878 100644 --- a/srcPython/fism.py +++ b/srcPython/fism.py @@ -10,11 +10,9 @@ # 3. Outputs a FISM2 file with the rebinnined irradiances in the desired bins (for use by euv.cpp) # Top-level imports: +import argparse import numpy as np -import matplotlib.pyplot as plt from datetime import datetime, timedelta -import matplotlib -matplotlib.use('Qt5Agg') import pathlib import os from urllib.request import urlretrieve @@ -23,13 +21,14 @@ # Directory management: here = pathlib.Path(__file__).parent.resolve() +saveLoc = here.joinpath('.') # Physical constants: h = 6.62607015e-34 # Planck's constant in SI units of J s c = 299792458 # Speed of light in m s^-1 # Helper Functions: -def getFism(dateStart, dateEnd, stanBands=False): +def getFism(dateStart, dateEnd, saveLoc, stanBands=False): """ Download FISM2 daily data, either in the Standard Bands or not. Default is to download the data NOT in the Standard Bands. Note that this function downloads the data to a pre-determined location. The download is also @@ -41,6 +40,8 @@ def getFism(dateStart, dateEnd, stanBands=False): The start date in 'YYYY-MM-DD' format. dateEnd: str The end date in 'YYYY-MM-DD' format. + saveLoc: str/path + The path to save data to stanBands: bool If True, downloads FISM2 data in the STAN BANDS. Default is False. Returns: @@ -56,40 +57,32 @@ def urlObtain(url, fname): print('File already exists (loading in data) '+str(fname)) else: urlretrieve(url, fname) + + URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' + fname = 'FISM2_daily.nc' + urlObtain(URL, fname) if stanBands: - URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' - fname = 'FISM2_daily_stan_bands.nc' - saveLoc = here.joinpath('../../tmp/') - if os.path.exists(saveLoc) == False: - os.makedirs(saveLoc) - urlObtain(URL, saveLoc.joinpath(fname)) - datetimes, wavelengths, irradiance, uncertainties = readFism(saveLoc.joinpath(fname), stanBands=True) + datetimes, wavelengths, irradiance = readFism(fname, stanBands=True) else: - URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_hr_data/daily_data.nc' - fname = 'FISM2_daily_bands.nc' - saveLoc = here.joinpath('../../tmp/') - if os.path.exists(saveLoc) == False: - os.makedirs(saveLoc) - urlObtain(URL, saveLoc.joinpath(fname)) - datetimes, wavelengths, irradiance, uncertainties = readFism(saveLoc.joinpath(fname)) + datetimes, wavelengths, irradiance = readFism(fname, stanBands=False) # Subset the data in time, and save the subset data to a relative path: subset_inds = np.where((datetimes >= dateStartDatetime) & (datetimes <= dateEndDatetime))[0] subset_times = datetimes[subset_inds] subset_irradiance = irradiance[subset_inds, :] - subset_uncertainty = uncertainties[subset_inds, :] - return subset_times, wavelengths, subset_irradiance, subset_uncertainty + return subset_times, wavelengths, subset_irradiance -def rebin(fism_out, binning_scheme='EUVAC', zero=True): +def rebin(fism_out, saveLoc, binning_scheme='EUVAC', zero=True): """ Takes the output of getFism and rebins the data into whatever format the user desires. Args: fism_out: arraylike The output of getFism. Contains 4 elements: (1) datetime values for the FISM2 spectra, (2) the wavelengths - of the spectrum, (3) the actual FISM2 irradiance spectra, and (4) uncertainties on the FISM2 irradiances (is - non-NaN only for FISM2 data not in the Standard Bands). + of the spectrum, (3) the actual FISM2 irradiance spectra. + saveLoc: path + Path to save data files to. binning_scheme: str Determines the binning scheme to be used. Valid arguments include the following: 'EUVAC': Uses the 37 wavelength band scheme described in Richards, et al. 1994; doi.org/10.1029/94JA00518 @@ -108,7 +101,7 @@ def rebin(fism_out, binning_scheme='EUVAC', zero=True): Contains 3 elements: (a) a list of datetimes for the data and (b) the rebinned FISM2 data. """ # Unpack the contents of fism_out: - datetimes, wavelengths, irradiance, uncertainties = fism_out + datetimes, wavelengths, irradiance = fism_out # Get the native wavelength resolution of the input data: # nativeResolution = np.concatenate((np.diff(wavelengths), np.array([np.diff(wavelengths)[-1]])), axis=0) @@ -117,12 +110,12 @@ def rebin(fism_out, binning_scheme='EUVAC', zero=True): if binning_scheme != 'HFG' and binning_scheme != 'SOLOMON': if binning_scheme == 'EUVAC': # Grab the euv_37.csv file: - fileStr = str(here.joinpath('euv_files/euv_37.csv')) + fileStr = str(saveLoc.joinpath('euv.csv')) bin_bounds = read_euv_csv_file(fileStr) tag = '_37' elif binning_scheme == 'NEUVAC': # Grab the euv_59.csv file: - fileStr = str(here.joinpath('euv_files/euv_59.csv')) + fileStr = str(saveLoc.joinpath('euv_59.csv')) bin_bounds = read_euv_csv_file(fileStr) tag = '_59' else: @@ -179,12 +172,6 @@ def rebin(fism_out, binning_scheme='EUVAC', zero=True): except: fism2_data[:, iWave] = integ.trapezoid(myData[iStart:iEnd], wavelengths[iStart:iEnd]) - # # Plotting for a sanity check: - # plt.figure() - # plt.plot(wavelengths[iStart:iEnd], myData[0, iStart:iEnd], marker='o') - # plt.scatter(newWaves, fism2_data[0, :]) - # plt.show() - elif binning_scheme == 'HFG' or binning_scheme == 'SOLOMON': # Determine whether the supplied data already conforms to the Solomon and Qian binning scheme. tag = '_solomon' @@ -199,7 +186,7 @@ def rebin(fism_out, binning_scheme='EUVAC', zero=True): raise ValueError("Invalid value for argument 'binning_scheme'. Must be 'EUVAC', 'NEUVAC', 'HFG', or 'SOLOMON'.") # Save the rebinned data to a relative path (outside the package directory) in the form of a .txt file: - fism2_file = here.joinpath('../../tmp/fism2_file'+tag+'.txt') + fism2_file = saveLoc.joinpath('fism2_file'+tag+'.txt') saveFism(fism2_data, datetimes, fism2_file) return fism2_file, fism2_data @@ -286,10 +273,8 @@ def readFism(fism_file, stanBands=False): irradiance = np.zeros_like(flux) for i in range(flux.shape[1]): irradiance[:, i] = spectralIrradiance(pFlux[:, i], wavelengths[i] * 10.)# W/m^2 - uncertainties = np.full_like(irradiance, np.nan) else: - irradiance = np.asarray(fism2Data.variables['irradiance']) - uncertainties = np.asarray(fism2Data.variables['uncertainty']) + irradiance = np.asarray(fism2Data.variables['ssi']) dates = fism2Data.variables['date'] datetimes = [] for j in range(len(dates)): @@ -299,7 +284,7 @@ def readFism(fism_file, stanBands=False): datetimes.append(currentDatetime) datetimes = np.asarray(datetimes) - return datetimes, wavelengths, irradiance, uncertainties + return datetimes, wavelengths, irradiance def spectralIrradiance(photonFlux, wavelength): """ @@ -369,15 +354,40 @@ def read_euv_csv_file(file): 'f74113': f74113} return wavelengths + +def get_args(): + + parser = argparse.ArgumentParser(description = 'Create FISM input data') + parser.add_argument('start', + help='Start date (format YYYYMMDD)', + type=str) + parser.add_argument('end', + help='End date (format YYYYMMDD)', + type=str) + parser.add_argument('-b', '--binning', + help="Binning scheme to use. Can be [solomon,neuvac,euvac] " + "(case insensitive)", + type=str) + + args = parser.parse_args() + + return args + # Execution (testing): if __name__ == '__main__': # Download some FISM2 data for the time period stated by the user. - dateStart = '2015-08-13' - dateEnd = '2015-08-19' + + args = get_args() + # fismOut = getFism(dateStart, dateEnd) # rebinnedFismFile, rebinnedFismData = rebin(fismOut, binning_scheme='EUVAC') # rebinnedFismFile_N, rebinnedFismData_N = rebin(fismOut, binning_scheme='NEUVAC') - fismOut_S = getFism(dateStart, dateEnd, stanBands=True) - rebinnedFismFile_S, rebinnedFismData_S = rebin(fismOut_S, binning_scheme='SOLOMON') + fismOut_S = getFism(dateStart, dateEnd, saveLoc, stanBands=True) + rebinnedFismFile_S, rebinnedFismData_S = rebin(fismOut_S, saveLoc, binning_scheme='SOLOMON') + + fismOut_N = getFism(dateStart, dateEnd, saveLoc, stanBands=False) + rebinnedFismFile_N, rebinnedFismData_N = rebin(fismOut_N, saveLoc, binning_scheme='NEUVAC') + fismOut_E = getFism(dateStart, dateEnd, saveLoc, stanBands=True) + rebinnedFismFile_E, rebinnedFismData_E = rebin(fismOut_E, saveLoc, binning_scheme='EUVAC') From bb8cfb618492ab6a84713af566d61f4359f4b015 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 2 Jul 2025 11:42:43 -0400 Subject: [PATCH 552/691] STY: Clean up fism code: add reporting & remove debugging cout's --- src/euv.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/euv.cpp b/src/euv.cpp index 7df04c8c..e43f9a45 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -438,8 +438,13 @@ bool Euv::euvac(Times time, bool Euv::get_fism(Times time) { // This is functionally similar to get_indices, however we do not store FISM in // the Indices class since it has variable number of bins. + + std::string function = "Euv::get_fism"; + static int iFunction = -1; + report.enter(function, iFunction); double time_now = time.get_current(); + bool didWork = true; if (fism_prev_index == 0) { // This is probably the first time we're "running" fism. @@ -450,7 +455,7 @@ bool Euv::get_fism(Times time) { if (time_now < fismData.times[0] && end_time > fismData.times[-1]) { report.error("FISM data does not cover the entire time range!"); report.error("Please check that your FISM file is correct."); - IsOk = false; + didWork = false; } } @@ -462,7 +467,6 @@ bool Euv::get_fism(Times time) { precision_t dt_fism; dt_fism = fismData.times[fism_prev_index + 1] - fismData.times[fism_prev_index]; precision_t x = (time_now - fismData.times[fism_prev_index]) / dt_fism; - std::cout << x << "\n"; // store the wavelength: for (int iWave = 0; iWave < nWavelengths; iWave ++) @@ -470,7 +474,8 @@ bool Euv::get_fism(Times time) { (1.0 - x) * fismData.values[fism_prev_index][iWave] + x * fismData.values[fism_prev_index + 1][iWave]; - return IsOk; + report.exit(function); + return didWork; } // -------------------------------------------------------------------------- From 8044ddd53c2711b311c04c0169694e69b7c46427 Mon Sep 17 00:00:00 2001 From: "Daniel A. Brandt" Date: Thu, 3 Jul 2025 16:39:43 -0400 Subject: [PATCH 553/691] Major updates to fism.py: Errors regarding rebinning and case sensitivity resolved. --- srcPython/fism.py | 257 +++++++++++++++++++++++++++------------------- 1 file changed, 150 insertions(+), 107 deletions(-) diff --git a/srcPython/fism.py b/srcPython/fism.py index 92752878..a64ae886 100644 --- a/srcPython/fism.py +++ b/srcPython/fism.py @@ -2,6 +2,7 @@ # Authors of this code: # Daniel A. Brandt, Ph.D., Michigan Tech Research Institute, daabrand@mtu.edu +# Aaron L. Bukowski, Ph.D., University of Michigan, abukowski@umich.edu # Aaron J. Ridley, Ph.D., University of Michigan, ridley@umich.edu # This file contains a suite of tools that do the following: @@ -14,83 +15,137 @@ import numpy as np from datetime import datetime, timedelta import pathlib -import os -from urllib.request import urlretrieve +import os, sys +import pooch from netCDF4 import Dataset import scipy.integrate as integ # Directory management: here = pathlib.Path(__file__).parent.resolve() -saveLoc = here.joinpath('.') +euvDir = here.parent.joinpath('share/run/UA/inputs') # Physical constants: h = 6.62607015e-34 # Planck's constant in SI units of J s c = 299792458 # Speed of light in m s^-1 # Helper Functions: -def getFism(dateStart, dateEnd, saveLoc, stanBands=False): +def getFism2(dateStart, dateEnd, source, downloadDir=None): """ - Download FISM2 daily data, either in the Standard Bands or not. Default is to download the data NOT in the - Standard Bands. Note that this function downloads the data to a pre-determined location. The download is also - 'smart'. If the data already exists (over the exact same time period). It is NOT overwitten. If the requested data - covers times OUTSIDE the time period of existing data, the NEW data is simply appended or prepended to a file - containing the existing data. - Args: - dateStart: str - The start date in 'YYYY-MM-DD' format. - dateEnd: str - The end date in 'YYYY-MM-DD' format. - saveLoc: str/path - The path to save data to - stanBands: bool - If True, downloads FISM2 data in the STAN BANDS. Default is False. - Returns: - fismFile: str - The location of the downloaded FISM data. + Given a starting date and an ending date, automatically download irradiance data from LISIRD for a specific source, + including FISM2 daily or FISM2 in the Standard Bands. + :param dateStart: str + The starting date for the data in YYYY-MM-DD format. + :param dateEnd: str + The ending date for the data in YYYY-MM-DD format. + :param source: str + The type of data to be obtained. Valid inputs are: + - FISM2 (for daily averages of FISM2 data) + - FISM2S (for daily averages of FISM2 standard bands, according to Solomon and Qian 2005) + :return times: ndarray + Datetime values for each spectrum. + :return wavelengths: ndarray + Wavelength bins (bin boundaries) for the spectral data. + :return irradiance: ndarray + A 2D array where each row is a spectrum at a particular time, and the columns are wavelength bands. """ + # Converting the input time strings to datetimes: dateStartDatetime = datetime.strptime(dateStart, "%Y-%m-%d") dateEndDatetime = datetime.strptime(dateEnd, "%Y-%m-%d") - # Helper function to manage the obtaining of data, given a URL: - def urlObtain(url, fname): - if os.path.isfile(fname) == True: - print('File already exists (loading in data) '+str(fname)) - else: - urlretrieve(url, fname) - - URL = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' - fname = 'FISM2_daily.nc' - urlObtain(URL, fname) - - if stanBands: - datetimes, wavelengths, irradiance = readFism(fname, stanBands=True) + # Check if the user has asked for a source that can be obtained: + validSources = ['FISM2', 'FISM2S'] + if source not in validSources: + raise ValueError("Variable 'source' must be either 'FISM2' or 'FISM2S.") + + # If the download directory is not specified, set it to the top directory that the package is in: + if downloadDir is None: + downloadDir = os.getcwd() + + # Download the most recent file for the corresponding source and read it in: + if source == 'FISM2': + url = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_hr_data/daily_data.nc' + fname = 'FISM2_daily_data.nc' + urlObtain(url, loc=downloadDir, fname=fname) # hash='dbee404e1c75689b47691b8a4a733236bb66abbdc0f01b8cbd8236f69fe9d469' + datetimes, wavelengths, irradiance, uncertainties = obtainFism2(downloadDir + '/' + fname) else: - datetimes, wavelengths, irradiance = readFism(fname, stanBands=False) + url = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' + fname = 'FISM2_daily_bands.nc' + urlObtain(url, loc=downloadDir, fname=fname) # hash='27e3183f8ad6b289de191a63d3feada64c9d3f6b2973315ceda4a42c41638465' + datetimes, wavelengths, irradiance, uncertainties = obtainFism2(downloadDir + '/' + fname, bands=True) + + # Subset the data according to user demands: + validInds = np.where((datetimes >= dateStartDatetime) & (datetimes <= dateEndDatetime))[0] + times = datetimes[validInds] + if source == 'FISM2S': + irradiance = irradiance[-1, validInds, :] + else: + irradiance = irradiance[validInds, :] - # Subset the data in time, and save the subset data to a relative path: - subset_inds = np.where((datetimes >= dateStartDatetime) & (datetimes <= dateEndDatetime))[0] - subset_times = datetimes[subset_inds] - subset_irradiance = irradiance[subset_inds, :] + # Return the resulting data: + return times, wavelengths, irradiance - return subset_times, wavelengths, subset_irradiance +def obtainFism2(myFism2File, bands=False): + """ + Load in spectrum data from a FISM2 file. + :param myFism2File: str + The location of the NETCDF4 file. + :param bands: bool + If True, loads in the data segmented into the Solomon and Qian 2005 standard bands. + :return datetimes: ndarray + An array of datetimes for each TIMED/SEE spectra. + :return wavelengths: ndarray + A one-dimensional array of wavelengths at which there are irradiance values. + :return irradiances: ndarray + A two-dimensional array of irradiance values at each time. + :return uncertainties: ndarray + A two-dimensional array of irradiance uncertainty values at each time. + """ + fism2Data = Dataset(myFism2File) + wavelengths = np.asarray(fism2Data.variables["wavelength"]) + if bands == True: # STANDARD BANDS + flux = np.asarray(fism2Data.variables["ssi"]) # photons/cm2/second + # bandwidths = np.asarray(fism2Data.variables['band_width']) + pFlux = flux * 1.0e4 # photons/m2/second + # Convert fluxes to irradiances: + irr = np.zeros_like(flux) + for i in range(flux.shape[1]): + irr[:, i] = spectralIrradiance(pFlux[:, i], wavelengths[i] * 10.0) # W/m^2 + irradiance = np.array([flux, irr]) + uncertainties = np.full_like(irradiance, fill_value=np.nan) # TODO: Replace with an estimation of uncertainty + else: # NATIVE DATA + irradiance = np.asarray(fism2Data.variables["irradiance"]) # W/m^2/nm + uncertainties = np.asarray(fism2Data.variables["uncertainty"]) + dates = fism2Data.variables["date"] + datetimes = [] + for i in range(len(dates)): + year = dates[i][:4] + day = dates[i][4:] + currentDatetime = ( + datetime(int(year), 1, 1) + + timedelta(int(day) - 1) + + timedelta(hours=12) + ) + datetimes.append(currentDatetime) + datetimes = np.asarray(datetimes) + return datetimes, wavelengths, irradiance, uncertainties -def rebin(fism_out, saveLoc, binning_scheme='EUVAC', zero=True): +def rebin(fism_out, saveLoc=os.getcwd(), binning_scheme='EUVAC', zero=True): """ Takes the output of getFism and rebins the data into whatever format the user desires. Args: fism_out: arraylike - The output of getFism. Contains 4 elements: (1) datetime values for the FISM2 spectra, (2) the wavelengths + The output of getFism2. Contains 4 elements: (1) datetime values for the FISM2 spectra, (2) the wavelengths of the spectrum, (3) the actual FISM2 irradiance spectra. saveLoc: path - Path to save data files to. + Path to save data files to. Defaults to the current working directory. binning_scheme: str Determines the binning scheme to be used. Valid arguments include the following: - 'EUVAC': Uses the 37 wavelength band scheme described in Richards, et al. 1994; doi.org/10.1029/94JA00518 - 'NEUVAC': Uses the 59 wavelength band scheme described in Brandt and Ridley, 2024; doi.org/10.1029/2024SW004043 + 'EUVAC' or 'Euvac' or 'euvac': Uses the 37 wavelength band scheme described in Richards, et al. 1994; doi.org/10.1029/94JA00518 + 'NEUVAC' or 'Neuvac' or 'neuvac': Uses the 59 wavelength band scheme described in Brandt and Ridley, 2024; doi.org/10.1029/2024SW004043 'HFG': Uses the 23 wavelength band scheme described in Solomon and Qian, 2005; https://doi.org/10.1029/2005JA011160 - 'SOLOMON': Same situation as for argument 'HFG'. - NOTE: If 'HFG' or 'SOLOMON' is chosen, the values of fism_out must correspond to getFism being run with the - argument stanBands = True. If this IS NOT the case, an error will be thrown. + 'SOLOMON' or 'Solomon' or 'solomon': Same situation as for argument 'HFG'. + NOTE: If 'HFG' or 'SOLOMON' is chosen, the values of fism_out must correspond to getFism2 being run with the + argument source='FISM2'. If this IS NOT the case, an error will be thrown. zero: bool Controls whether singular (bright) wavelength lines are set to a value of zero after they are extracted. Default is True. @@ -107,15 +162,15 @@ def rebin(fism_out, saveLoc, binning_scheme='EUVAC', zero=True): # nativeResolution = np.concatenate((np.diff(wavelengths), np.array([np.diff(wavelengths)[-1]])), axis=0) nativeWavelengths = wavelengths.copy() - if binning_scheme != 'HFG' and binning_scheme != 'SOLOMON': - if binning_scheme == 'EUVAC': + if binning_scheme != 'HFG' and binning_scheme != 'SOLOMON' and binning_scheme != 'Solomon' and binning_scheme != 'solomon': + if binning_scheme == 'EUVAC' or binning_scheme == 'Euvac' or binning_scheme == 'euvac': # Grab the euv_37.csv file: - fileStr = str(saveLoc.joinpath('euv.csv')) + fileStr = str(euvDir.joinpath('euv.csv')) bin_bounds = read_euv_csv_file(fileStr) tag = '_37' - elif binning_scheme == 'NEUVAC': + elif binning_scheme == 'NEUVAC' or binning_scheme == 'Neuvac' or binning_scheme == 'neuvac': # Grab the euv_59.csv file: - fileStr = str(saveLoc.joinpath('euv_59.csv')) + fileStr = str(euvDir.joinpath('euv_59.csv')) bin_bounds = read_euv_csv_file(fileStr) tag = '_59' else: @@ -172,7 +227,7 @@ def rebin(fism_out, saveLoc, binning_scheme='EUVAC', zero=True): except: fism2_data[:, iWave] = integ.trapezoid(myData[iStart:iEnd], wavelengths[iStart:iEnd]) - elif binning_scheme == 'HFG' or binning_scheme == 'SOLOMON': + elif binning_scheme == 'HFG' or binning_scheme == 'SOLOMON' or binning_scheme == 'Solomon' or binning_scheme == 'solomon': # Determine whether the supplied data already conforms to the Solomon and Qian binning scheme. tag = '_solomon' if fism_out[2].shape[1] != 23: @@ -186,7 +241,7 @@ def rebin(fism_out, saveLoc, binning_scheme='EUVAC', zero=True): raise ValueError("Invalid value for argument 'binning_scheme'. Must be 'EUVAC', 'NEUVAC', 'HFG', or 'SOLOMON'.") # Save the rebinned data to a relative path (outside the package directory) in the form of a .txt file: - fism2_file = saveLoc.joinpath('fism2_file'+tag+'.txt') + fism2_file = pathlib.Path(os.getcwd()).joinpath('fism2_file'+tag+'.txt') saveFism(fism2_data, datetimes, fism2_file) return fism2_file, fism2_data @@ -246,46 +301,6 @@ def safe_open_w(path): os.system('readlink -f '+str(filename)) return -def readFism(fism_file, stanBands=False): - """ - Load in spectrum data from a FISM2 file. - Args: - fism_file: str - The location of a FISM2 NETCDF4 file. - stanBands: bool - If True, expects the data to be read in to be in the STAN BANDS. Default is False. - Returns: - datetimes: numpy.ndarray - An array of datetimes for reach FISM2 spectrum. - wavelengths: numpy.ndarray - A one-dimensional array of wavelengths at which there are irradiance values. - irradiances: numpy.ndarray - A two-dimensional array of irradiance values in each wavelength bin. - uncertainties: numpy.ndarray - A two-dimensional array of irradiance uncertainty values at each bin. Only returned if stanBands is False. - """ - fism2Data = Dataset(fism_file) - wavelengths = np.asarray(fism2Data.variables['wavelength']) - if stanBands: - flux = np.asarray(fism2Data.variables['ssi']) # photons/cm^2/second - pFlux = flux * 1e4 # photons/m^2/second - # Convert fluxes to irradiances: - irradiance = np.zeros_like(flux) - for i in range(flux.shape[1]): - irradiance[:, i] = spectralIrradiance(pFlux[:, i], wavelengths[i] * 10.)# W/m^2 - else: - irradiance = np.asarray(fism2Data.variables['ssi']) - dates = fism2Data.variables['date'] - datetimes = [] - for j in range(len(dates)): - year = dates[j][:4] - day = dates[j][4:] - currentDatetime = datetime(int(year), 1, 1) + timedelta(int(day) -1 ) + timedelta(hours=12) - datetimes.append(currentDatetime) - datetimes = np.asarray(datetimes) - - return datetimes, wavelengths, irradiance - def spectralIrradiance(photonFlux, wavelength): """ Convert the photon flux to the corresponding spectral irradiance, given a specific wavelength. @@ -354,6 +369,28 @@ def read_euv_csv_file(file): 'f74113': f74113} return wavelengths +def urlObtain(URL, loc=None, fname=None, hash=None): + """ + Helper function that uses Pooch to download files to a location specified by the user. + :param URL: str + The location of a file to be downloaded. + :param loc: str + The place the file will be downloaded. + :param fname: str + The name the file will have once it is downloaded. + :param hash: str + A known hash (checksum) of the file. Will be used to verify the download or check if an existing file needs to + be updated. + :return: + """ + if loc is None: + loc = os.getcwd() + if os.path.isfile(str(loc) + '/' + fname) is False: + fname_loc = pooch.retrieve(url=URL, known_hash=hash, fname=fname, path=loc) + else: + fname_loc = str(loc) + '/' + fname + + return fname_loc def get_args(): @@ -378,16 +415,22 @@ def get_args(): # Download some FISM2 data for the time period stated by the user. args = get_args() + dateStart = args.start + dateEnd = args.end + binning_scheme = args.binning + + if binning_scheme == 'HFG' or binning_scheme == 'SOLOMON' or binning_scheme == 'Solomon' or binning_scheme == 'solomon': + # SOLOMON (STAN BANDS; b23) + fism2_out_23 = getFism2(dateStart, dateEnd, 'FISM2S', downloadDir=None) + fism2_file_23, fism2_data_23 = rebin(fism2_out_23, binning_scheme=binning_scheme) + else: + fism2_out_raw = getFism2(dateStart, dateEnd, 'FISM2', downloadDir=None) + if binning_scheme == 'NEUVAC' or binning_scheme == 'Neuvac' or binning_scheme == 'neuvac': + # NEUVAC BINS (b59) + fism2_file_59, fism2_data_59 = rebin(fism2_out_raw, binning_scheme=binning_scheme, zero=True) + else: + # EUVAC BINS (b37) + fism2_file_37, fism2_data_37 = rebin(fism2_out_raw, binning_scheme=binning_scheme, zero=True) - # fismOut = getFism(dateStart, dateEnd) - # rebinnedFismFile, rebinnedFismData = rebin(fismOut, binning_scheme='EUVAC') - # rebinnedFismFile_N, rebinnedFismData_N = rebin(fismOut, binning_scheme='NEUVAC') - - fismOut_S = getFism(dateStart, dateEnd, saveLoc, stanBands=True) - rebinnedFismFile_S, rebinnedFismData_S = rebin(fismOut_S, saveLoc, binning_scheme='SOLOMON') - - fismOut_N = getFism(dateStart, dateEnd, saveLoc, stanBands=False) - rebinnedFismFile_N, rebinnedFismData_N = rebin(fismOut_N, saveLoc, binning_scheme='NEUVAC') - - fismOut_E = getFism(dateStart, dateEnd, saveLoc, stanBands=True) - rebinnedFismFile_E, rebinnedFismData_E = rebin(fismOut_E, saveLoc, binning_scheme='EUVAC') + # Exit with a zero error code: + sys.exit(0) From 2606ba8333f3a59a5ae48978ebe2d673889e2684 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 10 Jul 2025 16:17:58 -0400 Subject: [PATCH 554/691] bugs: fism csv file needs to be comma separated, without any #start --- srcPython/fism.py | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/srcPython/fism.py b/srcPython/fism.py index a64ae886..d5d55495 100644 --- a/srcPython/fism.py +++ b/srcPython/fism.py @@ -49,8 +49,12 @@ def getFism2(dateStart, dateEnd, source, downloadDir=None): A 2D array where each row is a spectrum at a particular time, and the columns are wavelength bands. """ # Converting the input time strings to datetimes: - dateStartDatetime = datetime.strptime(dateStart, "%Y-%m-%d") - dateEndDatetime = datetime.strptime(dateEnd, "%Y-%m-%d") + try: + dateStartDatetime = datetime.strptime(dateStart, "%Y-%m-%d") + dateEndDatetime = datetime.strptime(dateEnd, "%Y-%m-%d") + except: + dateStartDatetime = datetime.strptime(dateStart, "%Y%m%d") + dateEndDatetime = datetime.strptime(dateEnd, "%Y%m%d") # Check if the user has asked for a source that can be obtained: validSources = ['FISM2', 'FISM2S'] @@ -262,10 +266,7 @@ def saveFism(data, times, filename): """ # A helper function for working with integers: def numStr(num): - if int(num) < 10: - return ' ' + str(int(num)) - else: - return str(int(num)) + return ',' + str(int(num)) # Define a helper function for opening a file to write the data, in such a way as to include parent directories if # needed: @@ -279,23 +280,23 @@ def safe_open_w(path): # Open the new file and begin writing, line by line: with safe_open_w(str(filename)) as output: # Write the header information: - output.write("#START\n") + # output.write("#START\n") # Write the irradiances themselves: firstLine = ['%.6g' % (element) for element in data[0, :]] - firstLine_joined = ' '.join(firstLine) + firstLine_joined = ','.join(firstLine) # The first line should always be a duplicate of the first line of data, but starting at UTC=00:00 of the first date: - output.write(' ' + str(times[0].year) + ' ' + numStr(times[0].month) + ' ' + numStr( - times[0].day) + ' 0 0 0 ' + firstLine_joined + '\n') + output.write(str(times[0].year) + numStr(times[0].month) + numStr( + times[0].day) + ',0,0,0,' + firstLine_joined + '\n') # The rest of the lines can be straight from the data: for i in range(data.shape[0]): - currentLine_joined = ' '.join(['%.6g' % (element) for element in data[i, :]]) - output.writelines(' ' + str(times[i].year) + ' ' + numStr(times[i].month) + ' ' + numStr( - times[i].day) + ' ' + numStr(times[i].hour) + ' 0 0 ' + currentLine_joined + '\n') + currentLine_joined = ','.join(['%.6g' % (element) for element in data[i, :]]) + output.writelines(str(times[i].year) + numStr(times[i].month) + numStr( + times[i].day) + numStr(times[i].hour) + ',0,0,' + currentLine_joined + '\n') # The last line should occur 12 hours from the last datapoint, but have duplicate values there: - lastLine_joined = ' '.join(['%.6g' % (element) for element in data[-1, :]]) + lastLine_joined = ','.join(['%.6g' % (element) for element in data[-1, :]]) lastTime = times[-1] + timedelta(hours=12) - output.write(' ' + str(lastTime.year) + ' ' + numStr(lastTime.month) + ' ' + numStr( - lastTime.day) + ' 0 0 0 ' + lastLine_joined + '\n') + output.write(str(lastTime.year) + numStr(lastTime.month) + numStr( + lastTime.day) + ',0,0,0,' + lastLine_joined + '\n') print('FISM2 data saved to: ') os.system('readlink -f '+str(filename)) From a3bd162f6ac3229d42857ea517c0f700f8115bad Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 10 Jul 2025 16:45:19 -0400 Subject: [PATCH 555/691] maint: clean debug info, add fism.md with info on new fism stuff --- doc/internals/fism.md | 30 ++++++++++++++++++++++++++++++ src/euv.cpp | 1 - 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 doc/internals/fism.md diff --git a/doc/internals/fism.md b/doc/internals/fism.md new file mode 100644 index 00000000..1133396e --- /dev/null +++ b/doc/internals/fism.md @@ -0,0 +1,30 @@ +# FISM + +FISM can be used as a EUV model. + +Needs the FISM files automatically made by `srcPython/fism.py`. + +FISM contains the binned flux already, however Aether must still be provided with an +EUV csv file containing the cross-sections. + +The different fism models available in fism.py contain different numbers of bins, so +the euv file must be different. + +| Model | number of bins | euv file | +| :--- | :-------------: | -------: | +| HFG | 23 | euv_solomon.csv | +| Solomon | 23 | euv_solomon.csv | +| NEUVAC | 37/59 | euv.csv / euv_59.csv | +| EUVAC | 37 | euv.csv | + +The input format, when using fism data: + + "Euv" : { + "doUse" : true, + "Model" : "fism", + "File" : "UA/inputs/euv_59.csv", + "fismFile": "fism2_file_59.txt", + "IncludePhotoElectrons" : true, + "HeatingEfficiency" : 0.05, + "dt" : 60.0 + }, diff --git a/src/euv.cpp b/src/euv.cpp index e43f9a45..a5457351 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -450,7 +450,6 @@ bool Euv::get_fism(Times time) { // This is probably the first time we're "running" fism. // Make sure the file covers the entire time range of the run. double end_time = time.get_end(); - std::cout << "first time in fism\n"; if (time_now < fismData.times[0] && end_time > fismData.times[-1]) { report.error("FISM data does not cover the entire time range!"); From 201649bf4302722e89f9f02a3d9e115b4f232a10 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 10 Jul 2025 16:46:16 -0400 Subject: [PATCH 556/691] bug: set default download location & euv model in fism.py --- srcPython/fism.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/srcPython/fism.py b/srcPython/fism.py index d5d55495..d4cc8ecb 100644 --- a/srcPython/fism.py +++ b/srcPython/fism.py @@ -70,12 +70,12 @@ def getFism2(dateStart, dateEnd, source, downloadDir=None): url = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_hr_data/daily_data.nc' fname = 'FISM2_daily_data.nc' urlObtain(url, loc=downloadDir, fname=fname) # hash='dbee404e1c75689b47691b8a4a733236bb66abbdc0f01b8cbd8236f69fe9d469' - datetimes, wavelengths, irradiance, uncertainties = obtainFism2(downloadDir + '/' + fname) + datetimes, wavelengths, irradiance, uncertainties = obtainFism2(os.path.join(downloadDir, fname)) else: url = 'https://lasp.colorado.edu/eve/data_access/eve_data/fism/daily_bands/daily_bands.nc' fname = 'FISM2_daily_bands.nc' urlObtain(url, loc=downloadDir, fname=fname) # hash='27e3183f8ad6b289de191a63d3feada64c9d3f6b2973315ceda4a42c41638465' - datetimes, wavelengths, irradiance, uncertainties = obtainFism2(downloadDir + '/' + fname, bands=True) + datetimes, wavelengths, irradiance, uncertainties = obtainFism2(os.path.join(downloadDir, fname), bands=True) # Subset the data according to user demands: validInds = np.where((datetimes >= dateStartDatetime) & (datetimes <= dateEndDatetime))[0] @@ -405,7 +405,7 @@ def get_args(): parser.add_argument('-b', '--binning', help="Binning scheme to use. Can be [solomon,neuvac,euvac] " "(case insensitive)", - type=str) + type=str, default="neuvac") args = parser.parse_args() @@ -422,10 +422,10 @@ def get_args(): if binning_scheme == 'HFG' or binning_scheme == 'SOLOMON' or binning_scheme == 'Solomon' or binning_scheme == 'solomon': # SOLOMON (STAN BANDS; b23) - fism2_out_23 = getFism2(dateStart, dateEnd, 'FISM2S', downloadDir=None) + fism2_out_23 = getFism2(dateStart, dateEnd, 'FISM2S', downloadDir=here) fism2_file_23, fism2_data_23 = rebin(fism2_out_23, binning_scheme=binning_scheme) else: - fism2_out_raw = getFism2(dateStart, dateEnd, 'FISM2', downloadDir=None) + fism2_out_raw = getFism2(dateStart, dateEnd, 'FISM2', downloadDir=here) if binning_scheme == 'NEUVAC' or binning_scheme == 'Neuvac' or binning_scheme == 'neuvac': # NEUVAC BINS (b59) fism2_file_59, fism2_data_59 = rebin(fism2_out_raw, binning_scheme=binning_scheme, zero=True) From 226ed39b121bc9e217ab37205637024124164ee5 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Thu, 10 Jul 2025 16:47:15 -0400 Subject: [PATCH 557/691] git: add fism files to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 12bc3ad8..ec439684 100644 --- a/.gitignore +++ b/.gitignore @@ -38,3 +38,7 @@ _deps #vs code settings .vscode .DS_Store + +# fism files +srcPython/FISM*.nc +srcPython/fism*.txt \ No newline at end of file From 91a3a1b1d408a462f0c2f5eac2b860af94e8b7f2 Mon Sep 17 00:00:00 2001 From: "Daniel A. Brandt" Date: Mon, 14 Jul 2025 15:39:48 -0400 Subject: [PATCH 558/691] Added neuvac.py within srcPython; generates a .txt file for irradiances from the NEUVAC model, in the same manner as fism.py. --- src/euv.cpp | 3 +- srcPython/.idea/.gitignore | 3 + .../inspectionProfiles/profiles_settings.xml | 6 + srcPython/.idea/misc.xml | 4 + srcPython/.idea/modules.xml | 8 + srcPython/.idea/srcPython.iml | 12 + srcPython/.idea/vcs.xml | 6 + srcPython/fism.py | 10 +- srcPython/neuvac.py | 475 ++++++++++++++++++ 9 files changed, 521 insertions(+), 6 deletions(-) create mode 100644 srcPython/.idea/.gitignore create mode 100644 srcPython/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 srcPython/.idea/misc.xml create mode 100644 srcPython/.idea/modules.xml create mode 100644 srcPython/.idea/srcPython.iml create mode 100644 srcPython/.idea/vcs.xml create mode 100644 srcPython/neuvac.py diff --git a/src/euv.cpp b/src/euv.cpp index e43f9a45..d22086c5 100644 --- a/src/euv.cpp +++ b/src/euv.cpp @@ -47,7 +47,8 @@ Euv::Euv() { // Read in FISM data - does not need to be "slotted" if (input.get_euv_model() == "fism") fismData = read_fism(input.get_euv_fismfile()); - + // Read in NEUVAC data - also does not need to be "slotted" + // Slot the EUVAC model coefficients: if (input.get_euv_model() == "euvac") { IsOk = slot_euv("F74113", "", euvac_f74113); diff --git a/srcPython/.idea/.gitignore b/srcPython/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/srcPython/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/srcPython/.idea/inspectionProfiles/profiles_settings.xml b/srcPython/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 00000000..105ce2da --- /dev/null +++ b/srcPython/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/srcPython/.idea/misc.xml b/srcPython/.idea/misc.xml new file mode 100644 index 00000000..76a040b9 --- /dev/null +++ b/srcPython/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/srcPython/.idea/modules.xml b/srcPython/.idea/modules.xml new file mode 100644 index 00000000..c7044f5d --- /dev/null +++ b/srcPython/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/srcPython/.idea/srcPython.iml b/srcPython/.idea/srcPython.iml new file mode 100644 index 00000000..410274b1 --- /dev/null +++ b/srcPython/.idea/srcPython.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/srcPython/.idea/vcs.xml b/srcPython/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/srcPython/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/srcPython/fism.py b/srcPython/fism.py index d5d55495..0bb7e788 100644 --- a/srcPython/fism.py +++ b/srcPython/fism.py @@ -276,7 +276,7 @@ def safe_open_w(path): ''' os.makedirs(os.path.dirname(path), exist_ok=True) return open(path, 'w') - + # Open the new file and begin writing, line by line: with safe_open_w(str(filename)) as output: # Write the header information: @@ -298,7 +298,7 @@ def safe_open_w(path): output.write(str(lastTime.year) + numStr(lastTime.month) + numStr( lastTime.day) + ',0,0,0,' + lastLine_joined + '\n') - print('FISM2 data saved to: ') + print('Irradiance data saved to: ') os.system('readlink -f '+str(filename)) return @@ -405,7 +405,7 @@ def get_args(): parser.add_argument('-b', '--binning', help="Binning scheme to use. Can be [solomon,neuvac,euvac] " "(case insensitive)", - type=str) + type=str, default="neuvac") args = parser.parse_args() @@ -422,10 +422,10 @@ def get_args(): if binning_scheme == 'HFG' or binning_scheme == 'SOLOMON' or binning_scheme == 'Solomon' or binning_scheme == 'solomon': # SOLOMON (STAN BANDS; b23) - fism2_out_23 = getFism2(dateStart, dateEnd, 'FISM2S', downloadDir=None) + fism2_out_23 = getFism2(dateStart, dateEnd, 'FISM2S', downloadDir=here) fism2_file_23, fism2_data_23 = rebin(fism2_out_23, binning_scheme=binning_scheme) else: - fism2_out_raw = getFism2(dateStart, dateEnd, 'FISM2', downloadDir=None) + fism2_out_raw = getFism2(dateStart, dateEnd, 'FISM2', downloadDir=here) if binning_scheme == 'NEUVAC' or binning_scheme == 'Neuvac' or binning_scheme == 'neuvac': # NEUVAC BINS (b59) fism2_file_59, fism2_data_59 = rebin(fism2_out_raw, binning_scheme=binning_scheme, zero=True) diff --git a/srcPython/neuvac.py b/srcPython/neuvac.py new file mode 100644 index 00000000..3fb0dadb --- /dev/null +++ b/srcPython/neuvac.py @@ -0,0 +1,475 @@ +#!/usr/bin/env python + +# Authors of this code: +# Daniel A. Brandt, Ph.D., Michigan Tech Research Institute, daabrand@mtu.edu + +# This file contains a suite of tools that do the following: +# 1 - Obtain F10.7 data between any dates of the user's choosing. +# 2 - Generate NEUVAC irradiances between any two dates of the user's choosing. +# 3 - Output the NEUVAC irradiances to a .csv file to be used by Aether, either in the b37 or b59 bins. + +# Top-level imports: +import argparse +import numpy as np +from datetime import datetime +import pathlib +from pathlib import Path +import pandas as pd +from scipy.interpolate import CubicSpline +import urllib.request, pickle +from fism import saveFism +import os, sys +import pooch + +# Directory management: +here = pathlib.Path(__file__).parent.resolve() +euvDir = here.parent.joinpath('share/run/UA/inputs') + +# Physical constants: +h = 6.62607015e-34 # Planck's constant in SI units of J s +c = 299792458 # Speed of light in m s^-1 + +# Global variable(s): +# Waves Table (coefficients for the old NEUVAC Model): +# Format: 0-Min, 1-Max, 2-S_1i, 3-S_Ai, 4-S_Di, 5-I_i, 6-Pi, 7-Ai +waveTable = np.array([ + [1700.00, 1750.00, 1.31491e-06, 6.71054e-06, 5.78034e-07, 0.00355128, 1.05517, 0.901612], + [1650.00, 1700.00, 5.19285e-07, 2.62376e-06, 3.08447e-07, 0.00218156, 1.06245, 0.964892], + [1600.00, 1650.00, 3.85348e-07, 1.73851e-06, 3.34911e-07, 0.00115310, 1.07246, 0.959562], + [1550.00, 1600.00, 2.96220e-07, 1.29250e-06, 2.61812e-07, 0.000814814, 1.04567, 0.967804], + [1500.00, 1550.00, 2.35326e-07, 1.21123e-06, 2.27793e-07, 0.000566574, 1.13520, 0.970257], + [1450.00, 1500.00, 1.86793e-07, 5.96399e-07, 1.48283e-07, 0.000331058, 1.01564, 0.940506], + [1400.00, 1450.00, 1.96396e-07, 5.84154e-07, 1.82438e-07, 0.000207013, 1.67546, 0.945697], + [1350.00, 1400.00, 1.04362e-07, 5.02422e-07, 1.45100e-07, 0.000153277, 1.04246, 0.992749], + [1300.00, 1350.00, 1.74403e-07, 6.32214e-07, 4.03009e-07, 0.000311075, 1.00964, 1.09381], + [1250.00, 1300.00, 7.12738e-08, 2.44220e-07, 9.56532e-08, 9.68823e-05, 1.15737, 1.01121], + [1200.00, 1250.00, 8.74335e-06, 5.02272e-05, 1.32536e-05, 0.00263307, 1.46273, 0.987493], + [1215.67, 1215.67, 6.43713e-06, 5.16823e-05, 1.11399e-05, 0.00247063, 1.26340, 0.998295], + [1150.00, 1200.00, 1.15468e-07, 2.74916e-07, 1.65125e-07, 0.000105178, 1.66887, 1.00997], + [1100.00, 1150.00, 7.71861e-08, 2.15061e-07, 1.44227e-07, 5.16157e-05, 0.971988, 1.05634], + [1050.00, 1100.00, 5.84127e-08, 3.08808e-07, 1.25160e-07, 4.65227e-05, 1.58808, 1.05327], + [1000.00, 1050.00, 2.23073e-07, 6.92710e-07, 5.19444e-07, 5.44992e-05, 0.449052, 1.10271], + [1031.91, 1031.91, 6.18723e-08, 1.21679e-07, 2.28527e-07, 3.14905e-05, 1.42684, 1.17863], + [1025.72, 1025.72, 1.61504e-07, 4.38856e-07, 2.79663e-07, 1.06365e-05, 1.09262, 1.05186], + [950.00, 1000.00, 1.70358e-07, 5.20531e-07, 3.86006e-07, 3.34989e-05, 0.491283, 1.09676], + [977.02, 977.02, 1.51857e-07, 5.60743e-07, 2.74541e-07, 6.71100e-06, 1.44918, 1.04869], + [900.00, 950.00, 7.27646e-08, 4.53511e-07, 1.91513e-07, 3.93851e-05, 1.21476, 1.06473], + [850.00, 900.00, 1.45264e-07, 2.82927e-07, 4.22856e-07, 4.83494e-05, 1.15579, 1.14948], + [800.00, 850.00, 6.69560e-08, 1.26613e-07, 1.76066e-07, 3.69687e-05, 1.14722, 1.12832], + [750.00, 800.00, 3.22816e-08, 7.81757e-08, 6.32959e-08, 4.42679e-05, 0.969748, 1.06692], + [789.36, 789.36, 1.19733e-08, 2.53334e-08, 1.58546e-08, 1.25539e-05, 1.48302, 1.00982], + [770.41, 770.41, 7.33597e-09, 2.10650e-08, 1.63125e-08, 8.88041e-06, 1.18634, 1.06584], + [765.15, 765.15, 4.85967e-09, 1.05567e-08, 5.42104e-09, 1.15262e-05, 1.17912, 1.03352], + [700.00, 750.00, 1.85139e-08, 3.63837e-08, 3.29576e-08, 1.72134e-05, 1.25328, 1.06364], + [703.36, 703.36, 5.34708e-09, 9.65120e-09, 4.54419e-09, 8.80278e-06, 1.51207, 0.972520], + [650.00, 700.00, 1.79851e-08, 6.39605e-08, 1.86000e-08, 1.41950e-05, 1.11181, 0.945801], + [600.00, 650.00, 1.52595e-07, 5.29641e-07, 1.41837e-07, 3.96165e-05, 1.00554, 0.949913], + [629.73, 629.73, 4.96048e-08, 2.46454e-07, 3.12902e-08, 1.59200e-05, 1.01611, 0.846628], + [609.76, 609.76, 2.80641e-08, 3.24530e-07, 1.81554e-08, 1.68460e-06, 0.973085, 0.793355], + [550.00, 600.00, 1.12234e-07, 6.29889e-07, 1.56092e-07, 2.79143e-05, 0.961457, 0.970150], + [584.33, 584.33, 7.91646e-08, 3.05430e-07, 5.14430e-08, 1.70372e-05, 0.844250, 0.881026], + [554.31, 554.31, 2.47485e-08, 2.68042e-07, 5.40951e-08, 1.16226e-06, 1.08699, 1.01483], + [500.00, 550.00, 1.12037e-07, 7.84515e-07, 6.32364e-08, 4.55230e-06, 1.13480, 0.816868], + [450.00, 500.00, 1.10016e-07, 3.96192e-07, 7.37101e-08, 2.62692e-05, 1.15344, 0.865234], + [465.22, 465.22, 9.60010e-09, 1.75358e-08, 6.91440e-11, 1.45142e-05, 1.62256, -0.203971], + [400.00, 450.00, 5.15555e-08, 2.89821e-07, 3.85807e-08, 1.64207e-05, 1.36652, 0.893190], + [350.00, 400.00, 3.91955e-07, 1.43942e-06, 3.16713e-07, -2.36108e-06, 1.05819, 0.910235], + [368.07, 368.07, 1.38855e-07, 7.21254e-07, 1.01814e-07, 8.71098e-07, 1.26707, 0.890513], + [300.00, 350.00, 1.35439e-06, 1.09238e-05, 8.24308e-07, 4.35250e-05, 1.22619, 0.816515], + [303.78, 303.78, 7.43959e-07, 5.94012e-06, 4.05188e-07, 9.23799e-05, 1.32976, 0.796970], + [303.31, 303.31, 5.25977e-07, 7.87164e-06, 3.07932e-07, 7.87468e-05, 0.945961, 0.759694], + [250.00, 300.00, 9.10710e-07, 3.91586e-06, 1.20177e-06, -9.64301e-06, 1.07360, 0.958369], + [284.15, 284.15, 8.67633e-07, 6.00671e-06, 3.97664e-07, -0.000107230, 1.20608, 0.773950], + [256.30, 256.30, 6.44996e-08, 4.12637e-07, 1.05193e-07, 6.61853e-06, 1.48670, 1.03265], + [200.00, 250.00, 4.83013e-07, 1.18898e-06, 8.94772e-07, 5.34779e-05, 1.04532, 1.07888], + [150.00, 200.00, 7.13305e-07, 2.47623e-06, 9.78936e-07, 0.000261230, 1.47374, 1.01156], + [100.00, 150.00, 4.03676e-08, 2.28270e-07, 4.43965e-08, 2.16162e-05, 1.09062, 0.970310], + [50.00, 100.00, 1.69769e-07, 6.93618e-07, 2.89457e-07, 2.03013e-05, 1.07887, 1.06022], + [32.00, 50.00, 1.23478e-07, 4.43644e-07, 1.75749e-07, -1.34567e-05, 1.27409, 1.01254], + [23.00, 32.00, 6.10174e-08, 2.34313e-07, 1.10591e-07, -1.22729e-05, 0.699812, 1.04841], + [16.00, 23.00, 2.23866e-07, 7.97533e-07, 3.03563e-07, -5.62012e-05, 0.706360, 0.987835], + [8.00, 16.00, 3.10773e-07, 1.22767e-06, 3.74797e-07, -8.41459e-05, 1.39529, 0.963859], + [4.00, 8.00, 1.17378e-08, 7.13970e-08, 1.38839e-08, -3.63146e-06, 0.811119, 0.920702], + [2.00, 4.00, 3.97985e-09, 4.12085e-08, 4.71914e-09, -1.86099e-06, 1.15214, 0.916686], + [1.00, 2.00, 3.52498e-09, 1.57342e-08, 4.03741e-09, -8.84488e-07, 0.951714, 0.943490] + ]) + +# Helper Functions: +def rollingAverage(myData, window_length=1, impute_edges=True, center=True): + """ + Using pandas, compute a rolling average of over 'data' using a window length of 'windowlength'. Sets the leading and + trailing windows to the values of the original data. + :param myData: arraylike + The data over which to compute the rolling average. + :param window_length: int + The size of the window over which to average. + :param impute_edges: bool + A boolean determining whether the edges will be interpolated. Default is True. + :param center: bool + A boolean determining whether the centered average will be used. + :return: rolled, arraylike + The rolling average data. + """ + myDataframe = pd.DataFrame(data=myData, columns=['Var']) + myDataframe['Rolling'] = myDataframe['Var'].rolling(window=window_length, center=center).mean() + firstValidIndex = myDataframe['Rolling'].first_valid_index() + lastValidIndex = myDataframe['Rolling'].last_valid_index() + if impute_edges == True: + # Sample x-axis: + sampleXaxis = np.linspace(0, window_length, window_length) + middleIndex = int(0.5*window_length) + # Use cubic interpolation to fill the gaps on the edges: + leadingEdgeStartingVal = myDataframe['Var'][:window_length].values[0] + leadingEndingVal = myDataframe['Rolling'][firstValidIndex] + leadingEdgeMiddleVal = np.mean([leadingEdgeStartingVal, leadingEndingVal]) + leadingSpline = CubicSpline([sampleXaxis[0], sampleXaxis[middleIndex], sampleXaxis[-1]], + [leadingEdgeStartingVal, leadingEdgeMiddleVal, leadingEndingVal]) + leadingImputedValues = leadingSpline(sampleXaxis) + + trailingEdgeStartingVal = myDataframe['Rolling'][lastValidIndex] + trailingEndingVal = myDataframe['Var'].values[-1] + trailingEdgeMiddleVal = np.mean([trailingEdgeStartingVal, trailingEndingVal]) + trailingSpline = CubicSpline([sampleXaxis[0], sampleXaxis[middleIndex], sampleXaxis[-1]], + [trailingEdgeStartingVal, trailingEdgeMiddleVal, trailingEndingVal]) + trailingImputedValues = trailingSpline(sampleXaxis) + # Ingest the imputed values: + myDataframe['Rolling'][:window_length] = leadingImputedValues + myDataframe['Rolling'][-window_length:] = trailingImputedValues + else: + myDataframe['Rolling'][:window_length] = myDataframe['Var'][:window_length] + myDataframe['Rolling'][-window_length:] = myDataframe['Var'][-window_length:] + rolled = myDataframe['Rolling'].values + return rolled + +def readCLS(filename): + """ + Load in flare-corrected, Sun-Earth distance adjusted flux values recorded by the Collecte Localisation Satellites + (CLS). + :param filename: str + The location of the data file. + :return times: list + The datetimes for each data value. + :return data: ndarray + The solar flux data for F30, F15, F10.7, F8, and F3.2. + """ + times = [] + precisionVals = [] + with open(filename, 'r') as myFile: + allLines = myFile.readlines() + data = np.zeros((len(allLines)-25, 5)) + i = 0 + j = 0 + for line in allLines: + if i >= 25: + elements = line.split() + data[j, :] = np.array([float(elements[5]), float(elements[9]), float(elements[13]), float(elements[17]), float(elements[21])]) + times.append( datetime(int(elements[0]), int(elements[1]), int(elements[2]), 12) ) + precisionVals.append( [float(elements[6]), float(elements[10]), float(elements[14]), float(elements[18]), float(elements[22])] ) + j += 1 + i += 1 + # Print the precision: + # print('Mean precision values...') + # print('F30: '+str(np.nanmean([element[0] for element in precisionVals]))+' sfu') # 6 + # print('F15: ' + str(np.nanmean([element[1] for element in precisionVals])) + ' sfu') # 8 + # print('F10.7: ' + str(np.nanmean([element[2] for element in precisionVals])) + ' sfu') # 13 + # print('F8: ' + str(np.nanmean([element[3] for element in precisionVals])) + ' sfu') # 12 + # print('F3.2: ' + str(np.nanmean([element[4] for element in precisionVals])) + ' sfu') # 11 + return times, data + +def getCLSF107(dateStart, dateEnd, truncate=True): + """ + Obtains Sun-Earth distance adjusted, flare-corrected F10.7 data from Collecte Localisation Satellites. Downloads the + most recent measurements to a file. Reads the file and extracts the F10.7 values between two dates. Note that if the + ending date is less than or equal to the last date in the version of the file that has already been downloaded, the + file IS NOT re-downloaded, but simply parsed. Otherwise, the file is redownloaded. + :param dateStart: str + The starting date in YYYYMMDD format. + :param dateEnd: str + The ending date in YYYYMMDD format. + :param truncate: bool + Controls whether to truncate the data to exclude the most recent 81 days. Defaults is True. + """ + dateStart = dateStart[:4]+'-'+dateStart[4:6]+'-'+dateStart[6:] + dateEnd = dateEnd[:4]+'-'+dateEnd[4:6]+'-'+dateEnd[6:] + dateTimeStart = datetime.strptime(dateStart, '%Y-%m-%d') + dateTimeEnd = datetime.strptime(dateEnd, '%Y-%m-%d') + fname = euvDir.joinpath("radio_flux_adjusted_observation.txt") + if fname.exists(): + # Read in the file: + times, data = readCLS(fname) + # Check if the ending date exceeds the ending date in the file. If so, redownloading the file: + if times[-1] > dateTimeEnd: + out = urllib.request.urlretrieve( + 'ftp://ftpsedr.cls.fr/pub/previsol/solarflux/observation/radio_flux_adjusted_observation.txt', fname) + times, data = readCLS(fname) + else: + # Download the file: + out = urllib.request.urlretrieve('ftp://ftpsedr.cls.fr/pub/previsol/solarflux/observation/radio_flux_adjusted_observation.txt', fname) + times, data = readCLS(fname) + + # Compute the 81-day (centered) averaged F10.7 and 54-day averaged (: + F107 = data[:, 2] + F107A = rollingAverage(F107, window_length=81, impute_edges=True) + F107B = rollingAverage(F107, window_length=54, impute_edges=True, center=False) + print(f'\n\nlen(F107) = {len(F107)}, len(F107B) = {len(F107B)}, len(F107B) = {len(F107B)}') + # Extract the values in the desired time range: + goodInds = np.where((np.asarray(times) >= dateTimeStart) & (np.asarray(times) <= dateTimeEnd))[0] + # Truncation: + if truncate and len(goodInds) >= 2*81: + goodInds = goodInds[:-81] + return np.asarray(times)[goodInds], np.asarray(F107)[goodInds], np.asarray(F107A)[goodInds], np.asarray(F107B)[goodInds] + +def mycorrelate2d(df, normalized=False): + """ + Compute the correlation matrix from 2D data, where each row is cross correlated with the others. + This function handles NaN values by ignoring them. + :param df: ndarray + A 2D array of dimensions n x m. + :param normalized: bool + Determines whether the resulting correlation matrix is normalized. Default is False. + :returns ccm: ndarray + The [normalized] cross-correlation matrix. + Source: https://stackoverflow.com/questions/54292947/basics-of-normalizing-cross-correlation-with-a-view-to-comparing-signals + """ + # Initialize cross correlation matrix with zeros + ccm = np.zeros((df.shape[1], df.shape[1])) + # Fill in each entry of the matrix one-by-one: + for i in range(df.shape[1]): + outer_row = df[:, i] + for j in range(df.shape[1]): + inner_row = df[:, j] + goodInds = np.logical_and(~np.isnan(outer_row), ~np.isnan(inner_row)) + if (not normalized): + x = np.correlate(outer_row[goodInds], inner_row[goodInds]) + else: + x = get_cc(outer_row[goodInds], inner_row[goodInds]) + # a = (inner_row - np.mean(inner_row)) / (np.std(inner_row) * len(inner_row)) + # b = (outer_row - np.mean(outer_row)) / (np.std(outer_row) ) + # x = np.correlate(a, b) + ccm[i, j] = x + return ccm + +def get_cc(array1, array2, normalize=True): + """ + Compute the cross-correlation of two 1D arrays of the same length. + :param array1: ndarray + A 1D array of length n. + :param array2: ndarray + A 1D array of length n. + :return c: float + The normalized correlation of the two arrays. + """ + if normalize: + a = (array1 - np.mean(array1)) / (np.std(array1) * len(array1)) + b = (array2 - np.mean(array2)) / (np.std(array2)) + c = np.correlate(a, b) + else: + c = np.correlate(array1, array2) + return c + +def loadPickle(pickleFilename): + """ + Given the name of a (pre-existing) pickle file, load its contents. + :param: pickleFilename, str + A string with the location/name of the filename. + :return: var + The loaded data. + """ + with open(pickleFilename, 'rb') as pickleFile: + var = pickle.load(pickleFile) + return var + +# CORE NEUVAC FUNCTIONS: +def irrFunc(F107input, A, B, C, D, E, F): + F107, F107A = F107input + return A * (F107 ** B) + C * (F107A ** D) + E * (F107A - F107) + F + +def neuvacEUV(f107, f107b, bands=None, tableFile=None, statsFiles=None): + """ + Use a parametric model to compute solar flux in the 59 conventional wavelength bands used by Aether/GITM. Capable + of returning perturbed irradiance values that are perturbed according to the variations of in the intensity of each + bin + :param f107: ndarray + F10.7 values. + :param f107b: ndarray + 81-day center-averaged F10.7 values; must be the same length as f107. + :param bands: str + If None or 'NEUVAC', returns irradiances in the GITM Bands. If 'EUVAC', returns them in the 37 bands used by + EUVAC. If 'SOLOMON', returns them in the 22 bands used by Solomon and Qian. + :param tableFile: str + Corresponds to the .txt file holding the NEUVAC coefficients most recently-generated by fitNeuvac.py. If + not given, simply uses the table file corresponding to the selected bin structure. Default is None. + :param statsFiles: Bool + Determines whether data for uncertainty quantification is exploited. Involves usage of a list containing + 2 elements where the first element is a file containing the 59x59 correlation matrix and the second + element is a file containing the 1x59 standard deviation values for NEUVAC. NOT REQUIRED. + :return euvIrradiance: ndarray + A nxm ndarray where n is the number of EUV irradiance values and m is the number of wavelength bands. + :return perturbedEuvIrradiance: ndarray + A nxm ndarray where n is the number of EUV irradiance values perturbed due to inherent uncertainty and m is the + number of wavelength bands. + :return savedPerts: ndarray + A nxm ndarray of the perturbations (time series of the NEUVAC+Perturbation - NEUVAC) + :return cc2: ndarray + A mxm ndarray of the correlation matrix between each wavelength's time-series of the NEUVAC+Perturbation - + NEUVAC. + """ + if type(f107) != np.ndarray: + f107 = np.asarray([f107]) + f107b = np.asarray([f107b]) + if bands == 'SOLOMON': + solarFlux = np.zeros((1, 22)) + else: + solarFlux = np.zeros((1, waveTable.shape[0])) + else: + if bands == 'SOLOMON': + solarFlux = np.zeros((len(f107), 22)) + else: + solarFlux = np.zeros((len(f107), waveTable.shape[0])) + euvIrradiance = np.zeros_like(solarFlux) + perturbedEuvIrradiance = np.zeros_like(solarFlux) + # Gather the model parameters: + if tableFile is None: + if bands == 'SOLOMON': + tableFile = euvDir.joinpath('neuvac_table_stan_bands.txt') #'../data/neuvac_table_stan_bands.txt' + else: + tableFile = euvDir.joinpath('neuvac_table.txt') #'../data/neuvac_table.txt' + neuvacTable = [] + with open(here.parent.joinpath(tableFile)) as neuvacFile: # open(tableFile) + contents = neuvacFile.readlines() + i = 0 + for line in contents: + if i > 17: + neuvacTable.append([float(element) for element in line.split(' ')]) + i+=1 + neuvacTable = np.asarray(neuvacTable) + + # If no stats file is provided, simply return the base model output (using the required table file): + if not statsFiles: + # Loop across the F10.7 (and F10.7A) values: + for i in range(len(f107)): + k = 0 + for j in (range(solarFlux.shape[1])): + irrRes = irrFunc([f107[i], f107b[i]], *neuvacTable[j, 2:]) + if irrRes < 0: + irrRes = 0 + euvIrradiance[i, k] = irrRes + else: + euvIrradiance[i, k] = irrRes + k += 1 + if bands == 'EUVAC': # Returns values ONLY for those corresponding to the wavelengths used by EUVAC + return euvIrradiance[:, 7:44], None, None, None + else: + return euvIrradiance, None, None, None + else: + # Include statistical data for calculating uncertainties via perturbations: + if bands == 'NEUVAC': + statsFiles = [euvDir.joinpath('corMat.pkl'), euvDir.joinpath('sigma_NEUVAC.pkl')] + elif bands == 'EUVAC': + statsFiles = [euvDir.joinpath('corMatEUVAC.pkl'), euvDir.joinpath('sigma_EUVAC.pkl')] + else: + statsFiles = [euvDir.joinpath('corMatStanBands.pkl'), euvDir.joinpath('sigma_NEUVAC_StanBands.pkl')] + corMatFile = statsFiles[0] + corMat = loadPickle(corMatFile) + sigmaFile = statsFiles[1] + STDNeuvacResids = loadPickle(sigmaFile) + # Loop across the F10.7 (and F10.7A) values: + nTimes = len(f107) + nWaves = solarFlux.shape[1] + savedPerts = np.zeros((nTimes, nWaves)) + for i in range(len(f107)): + # Loop across the wavelengths (59 conventional wavelengths): + k = 0 + P_n = [] + for j in (range(solarFlux.shape[1])): + # Percentage perturbation: + P_j = np.random.normal(0, 1.0) + P_n.append(P_j) + P_1 = P_n[0] + # Normalized Correlated Perturbation: + if bands == 'SOLOMON': + if j < 5: + C_j1 = corMat[0, j] # 3 # Only consider correlation with the third wavelength bin of the SOLOMON bins! + else: + C_j1 = corMat[5, j] # Only consider correlation with the fifth wavelength bin of the SOLOMON bins! + else: + if j < 7: + # Only consider correlation with the third wavelength bin (of the NEUVAC bins!) when bands are below 8. + C_j1 = corMat[0, j] # 2 + else: + # Only consider correlation with the first wavelength bin (of the EUVAC bins!) when bands are above 8. + C_j1 = corMat[7, j] + N_j = C_j1 * P_1 + (1.0 - C_j1) * P_j + # Actual Normalized Correlated Perturbation: + A_j = STDNeuvacResids[j] * N_j + irrRes = irrFunc([f107[i], f107b[i]], *neuvacTable[j, 2:]) + if irrRes < 0: + irrRes = 0 + euvIrradiance[i, k] = irrRes + if irrRes + A_j < 0: + perturbedEuvIrradiance[i, k] = 0 + else: + perturbedEuvIrradiance[i, k] = irrRes + A_j + else: + euvIrradiance[i, k] = irrRes + perturbedEuvIrradiance[i, k] = irrRes + A_j + savedPerts[i, j] = A_j + k += 1 + + # Generate a correlation matrix of the perturbations (to compare to the input correlation matrix as a sanity check): + cc2 = mycorrelate2d(savedPerts, normalized=True) + + if bands == 'EUVAC': # Returns values ONLY for those corresponding to the wavelengths used by EUVAC + return euvIrradiance[:, 7:44], perturbedEuvIrradiance[:, 7:44], savedPerts, cc2 + else: + return euvIrradiance, perturbedEuvIrradiance, savedPerts, cc2 + +# ----------------------------------------------------------------------------------------------------------------------------------------- +# Argument Parsing Function: +def get_args(): + + parser = argparse.ArgumentParser(description = 'Create NEUVAC input data') + parser.add_argument('start', + help='Start date (format YYYYMMDD)', + type=str) + parser.add_argument('end', + help='End date (format YYYYMMDD)', + type=str) + parser.add_argument('-b', '--binning', + help="Binning scheme to use. Can be [solomon,neuvac,euvac] " + "(case insensitive)", + type=str, default="neuvac") + args = parser.parse_args() + + return args +# ----------------------------------------------------------------------------------------------------------------------------------------- + +# Example Execution: + +# python neuvac.py 20110319 20110321 -b euvac + +args = get_args() +dateStart = args.start +dateEnd = args.end +binning_scheme = args.binning + +# Load F10.7 data (from Collecte Localisation Satellites): +times, F107, F107A, F107B = getCLSF107(dateStart, dateEnd) + +# Generate NEUVAC Irradiance from that F10.7 data: +if binning_scheme == 'HFG' or binning_scheme == 'SOLOMON' or binning_scheme == 'Solomon' or binning_scheme == 'solomon': + # SOLOMON (STAN BANDS; b23) + irradiance, _, _, _ = neuvacEUV(F107, F107B, bands='SOLOMON') +else: + if binning_scheme == 'NEUVAC' or binning_scheme == 'Neuvac' or binning_scheme == 'neuvac': + # NEUVAC BINS (b59) + irradiance, _, _, _ = neuvacEUV(F107, F107B, bands='NEUVAC') + else: + # EUVAC BINS (b37) + irradiance, _, _, _ = neuvacEUV(F107, F107B, bands='EUVAC') + +# Save the NEUVAC Irradiance to a file that Aether can use: +tag = str(irradiance.shape[1]) +fname = os.getcwd() + '/neuvac_file_'+tag+'.txt' +saveFism(irradiance, times, fname) + From 46e85edd46845c2f67c2927ad4f7d681bca89402 Mon Sep 17 00:00:00 2001 From: "Daniel A. Brandt" Date: Mon, 14 Jul 2025 17:27:05 -0400 Subject: [PATCH 559/691] Added version 2 of the euv_59.csv file; contains updated NEUVAC coefficients. --- share/run/UA/inputs/euv_59_v2.csv | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 share/run/UA/inputs/euv_59_v2.csv diff --git a/share/run/UA/inputs/euv_59_v2.csv b/share/run/UA/inputs/euv_59_v2.csv new file mode 100644 index 00000000..7f807952 --- /dev/null +++ b/share/run/UA/inputs/euv_59_v2.csv @@ -0,0 +1,43 @@ + Short,,wave,1.0000E+00,Angstroms, 1.0000E+00, 2.0000E+00, 4.0000E+00, 8.0000E+00, 1.6000E+01, 2.3000E+01, 3.2000E+01, 5.0000E+01, 1.0000E+02, 1.5000E+02, 2.0000E+02, 2.5630E+02, 2.8415E+02, 2.5000E+02, 3.0331E+02, 3.0378E+02, 3.0000E+02, 3.6807E+02, 3.5000E+02, 4.0000E+02, 4.6522E+02, 4.5000E+02, 5.0000E+02, 5.5437E+02, 5.8433E+02, 5.5000E+02, 6.0976E+02, 6.2973E+02, 6.0000E+02, 6.5000E+02, 7.0331E+02, 7.0000E+02, 7.6515E+02, 7.7041E+02, 7.8936E+02, 7.5000E+02, 8.0000E+02, 8.5000E+02, 9.0000E+02, 9.7702E+02, 9.5000E+02, 1.0257E+03, 1.0319E+03, 1.0000E+03, 1.0500E+03, 1.1000E+03, 1.1500E+03, 1.2157E+03, 1.2000E+03, 1.2500E+03, 1.3000E+03, 1.3500E+03, 1.4000E+03, 1.4500E+03, 1.5000E+03, 1.5500E+03, 1.6000E+03, 1.6500E+03, 1.7000E+03, from GITM + Long,,wave,1.0000E+00,Angstroms, 2.0000E+00, 4.0000E+00, 8.0000E+00, 1.6000E+01, 2.3000E+01, 3.2000E+01, 5.0000E+01, 1.0000E+02, 1.5000E+02, 2.0000E+02, 2.5000E+02, 2.5630E+02, 2.8415E+02, 3.0000E+02, 3.0331E+02, 3.0378E+02, 3.5000E+02, 3.6807E+02, 4.0000E+02, 4.5000E+02, 4.6522E+02, 5.0000E+02, 5.5000E+02, 5.5437E+02, 5.8433E+02, 6.0000E+02, 6.0976E+02, 6.2973E+02, 6.5000E+02, 7.0000E+02, 7.0331E+02, 7.5000E+02, 7.6515E+02, 7.7041E+02, 7.8936E+02, 8.0000E+02, 8.5000E+02, 9.0000E+02, 9.5000E+02, 9.7702E+02, 1.0000E+03, 1.0257E+03, 1.0319E+03, 1.0500E+03, 1.1000E+03, 1.1500E+03, 1.2000E+03, 1.2157E+03, 1.2500E+03, 1.3000E+03, 1.3500E+03, 1.4000E+03, 1.4500E+03, 1.5000E+03, 1.5500E+03, 1.6000E+03, 1.6500E+03, 1.7000E+03, 1.7500E+03, from GITM + F74113,,,1.0000E+09,/cm2/s, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.2000E+00, 4.5000E-01, 4.8000E+00, 3.1000E+00, 4.6000E-01, 2.1000E-01, 1.6790E+00, 8.0000E-01, 6.9000E+00, 9.6500E-01, 6.5000E-01, 3.1400E-01, 3.8300E-01, 2.9000E-01, 2.8500E-01, 4.5200E-01, 7.2000E-01, 1.2700E+00, 3.5700E-01, 5.3000E-01, 1.5900E+00, 3.4200E-01, 2.3000E-01, 3.6000E-01, 1.4100E-01, 1.7000E-01, 2.6000E-01, 7.0200E-01, 7.5800E-01, 1.6250E+00, 3.5370E+00, 3.0000E+00, 4.4000E+00, 1.4750E+00, 3.5000E+00, 2.1000E+00, 2.4670E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + AFAC,,,1.0000E+00,, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.0017E-02, 7.1250E-03, 1.3375E-02, 1.9450E-02, 2.7750E-03, 1.3768E-01, 2.6467E-02, 2.5000E-02, 3.3333E-03, 2.2450E-02, 6.5917E-03, 3.6542E-02, 7.4083E-03, 7.4917E-03, 2.0225E-02, 8.7583E-03, 3.2667E-03, 5.1583E-03, 3.6583E-03, 1.6175E-02, 3.3250E-03, 1.1800E-02, 4.2667E-03, 3.0417E-03, 4.7500E-03, 3.8500E-03, 1.2808E-02, 3.2750E-03, 4.7667E-03, 4.8167E-03, 5.6750E-03, 4.9833E-03, 3.9417E-03, 4.4167E-03, 5.1833E-03, 5.2833E-03, 4.3750E-03, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + NEUV_S1,,,1.0000e+00,slope, 4.7721e-01, 4.8836e-01, 5.1112e-01, 4.6218e-01, 4.4626e-01, 4.5621e-01, 4.6444e-01, 2.5497e-01, 4.5348e-01, 2.7143e-01, 1.0616e+00, 4.3086e-01, 4.8995e-01, 4.3046e-01, 1.9877e-01, 4.5349e-01, 5.1979e-01, 4.5590e-01, 4.0438e-01, 4.4541e-01, 4.5721e-01, 5.2010e-01, 4.5938e-01, 4.5614e-01, 4.9421e-01, 4.6293e-01, 4.6222e-01, 4.5820e-01, 4.4724e-01, 4.5370e-01, 4.5756e-01, 4.6456e-01, 4.5873e-01, 4.5651e-01, 4.5443e-01, 4.4956e-01, 4.1966e-01, 5.3686e-01, 4.3159e-01, 3.6366e-01, 4.7233e-01, 4.7194e-01, 4.5386e-01, 4.5133e-01, 4.6587e-01, 4.4840e-01, 5.3661e-01, 1.0786e-01, 2.6182e-01, 4.4807e-01, 4.2671e-01, 4.9602e-01, 4.4946e-01, 5.0319e-01, 4.3481e-01, 4.9051e-01, 1.5122e-01, 3.8279e-01, 7.0315e-01,from GITM + NEUV_S2,,,1.0000e+00,slope, -4.7721e-01, -4.8836e-01, -5.1112e-01, -4.6218e-01, -4.4626e-01, -4.5620e-01, -4.6443e-01, -2.5496e-01, -4.5348e-01, -2.7142e-01, -1.0616e+00, -4.3086e-01, -4.8995e-01, -4.3045e-01, -1.9877e-01, -4.5349e-01, -5.1978e-01, -4.5590e-01, -4.0438e-01, -4.4540e-01, -4.5721e-01, -5.2010e-01, -4.5938e-01, -4.5614e-01, -4.9421e-01, -4.6293e-01, -4.6222e-01, -4.5820e-01, -4.4724e-01, -4.5370e-01, -4.5756e-01, -4.6456e-01, -4.5873e-01, -4.5651e-01, -4.5443e-01, -4.4956e-01, -4.1966e-01, -5.3685e-01, -4.3158e-01, -3.6366e-01, -4.7233e-01, -4.7194e-01, -4.5386e-01, -4.5133e-01, -4.6587e-01, -4.4840e-01, -5.3661e-01, -1.0781e-01, -2.6182e-01, -4.4807e-01, -4.2671e-01, -4.9602e-01, -4.4946e-01, -5.0318e-01, -4.3481e-01, -4.9051e-01, -1.5121e-01, -3.8278e-01, -7.0314e-01,from GITM + NEUV_S3,,,1.0000e+00,slope, 4.7721e-01, 4.8836e-01, 5.1112e-01, 4.6218e-01, 4.4626e-01, 4.5621e-01, 4.6444e-01, 2.5496e-01, 4.5348e-01, 2.7143e-01, 1.0616e+00, 4.3086e-01, 4.8995e-01, 4.3045e-01, 1.9877e-01, 4.5349e-01, 5.1979e-01, 4.5590e-01, 4.0438e-01, 4.4541e-01, 4.5721e-01, 5.2010e-01, 4.5938e-01, 4.5614e-01, 4.9421e-01, 4.6293e-01, 4.6222e-01, 4.5820e-01, 4.4724e-01, 4.5370e-01, 4.5756e-01, 4.6456e-01, 4.5873e-01, 4.5651e-01, 4.5443e-01, 4.4956e-01, 4.1966e-01, 5.3685e-01, 4.3158e-01, 3.6366e-01, 4.7233e-01, 4.7194e-01, 4.5386e-01, 4.5133e-01, 4.6587e-01, 4.4840e-01, 5.3661e-01, 1.0783e-01, 2.6182e-01, 4.4807e-01, 4.2671e-01, 4.9602e-01, 4.4946e-01, 5.0319e-01, 4.3481e-01, 4.9051e-01, 1.5121e-01, 3.8278e-01, 7.0314e-01,from GITM + NEUV_l1,,,1.0000e+00,ints, 6.3336e-12, -1.7586e-09, -5.8173e-07, -2.7526e-05, -7.9475e-05, -2.5214e-05, -7.7868e-05, -1.8471e-04, -1.0315e-05, -4.5460e-06, -1.7387e-04, -2.8295e-06, -9.3578e-05, -8.0510e-05, 2.5654e-04, 9.7116e-07, -4.2748e-05, 1.8657e-05, -4.2105e-05, 1.1967e-05, 1.3408e-05, -3.2775e-06, 7.3782e-06, 2.1466e-05, 2.6201e-05, 8.4018e-06, -1.1750e-06, 4.4671e-05, 2.3090e-07, 1.1496e-05, 1.0248e-05, 1.1219e-05, 1.0442e-05, 1.1598e-05, 1.0931e-05, 3.5491e-05, 5.7380e-05, 7.2432e-05, 6.6057e-05, 9.0619e-05, 3.0050e-05, 3.3145e-05, 2.8926e-05, 3.9467e-05, 3.6713e-05, 4.8318e-05, 1.5926e-04, 3.6572e-03, 3.2218e-04, 8.4120e-05, 2.6237e-04, 1.4758e-04, 1.9098e-04, 2.9104e-04, 4.6908e-04, 7.1953e-04, 1.0507e-03, 1.9508e-03, 3.2611e-03,from GITM + NEUV_P1,,,1.0000e+00,powers, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 9.9997e-01, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00,from GITM + NEUV_P2,,,1.0000e+00,powers, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00,from GITM + O2,O2,abs,1.0000E-22,m2, 4.0000E-04, 4.0000E-03, 2.4000E-02, 1.4000E-01, 1.0200E+00, 1.0000E-01, 3.2000E-01, 1.1800E+00, 4.0000E+00, 7.1000E+00, 1.0600E+01, 1.3200E+01, 1.5700E+01, 1.5100E+01, 1.6800E+01, 1.6800E+01, 1.7190E+01, 1.8400E+01, 1.8170E+01, 1.9390E+01, 2.0400E+01, 2.1590E+01, 2.4060E+01, 2.5590E+01, 2.2000E+01, 2.5040E+01, 2.6100E+01, 2.5800E+01, 2.6020E+01, 2.6270E+01, 2.5000E+01, 2.9050E+01, 2.1960E+01, 2.5180E+01, 2.6660E+01, 2.7090E+01, 2.0870E+01, 9.8500E+00, 1.5540E+01, 4.0000E+00, 1.6530E+01, 1.6000E+00, 1.0000E+00, 1.1000E+00, 1.0000E+00, 1.0000E-01, 3.0000E-01, 1.0000E-02, 3.0000E+00, 3.0000E-01, 2.2000E+00, 1.2000E+01, 1.5000E+01, 1.3000E+01, 1.0000E+01, 6.0000E+00, 3.4000E+00, 1.5000E+00, 5.0000E-01, from GITM + O,O,abs,1.0000E-22,m2, 2.0000E-04, 2.0000E-03, 1.2000E-02, 7.0000E-02, 5.1000E-01, 5.0000E-02, 1.6000E-01, 5.9000E-01, 1.6000E+00, 2.9000E+00, 5.3000E+00, 6.0500E+00, 7.1300E+00, 6.6100E+00, 7.6800E+00, 7.7000E+00, 8.6700E+00, 9.9500E+00, 9.6400E+00, 1.1210E+01, 1.1250E+01, 1.1640E+01, 1.1910E+01, 1.2130E+01, 1.2170E+01, 1.1900E+01, 1.2230E+01, 1.2220E+01, 1.2210E+01, 1.0040E+01, 1.1350E+01, 8.0000E+00, 4.1800E+00, 4.1800E+00, 4.2800E+00, 4.2300E+00, 4.3800E+00, 4.1800E+00, 2.1200E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N2,N2,abs,1.0000E-22,m2, 3.0000E-04, 3.0000E-03, 1.5000E-02, 9.0000E-02, 4.8000E-01, 1.1600E+00, 2.4000E-01, 6.0000E-01, 1.9000E+00, 4.4000E+00, 8.0000E+00, 9.7000E+00, 1.0600E+01, 1.0300E+01, 1.1600E+01, 1.1600E+01, 1.3000E+01, 1.8000E+01, 1.7510E+01, 2.1070E+01, 2.1800E+01, 2.1850E+01, 2.4530E+01, 2.4690E+01, 2.3200E+01, 2.2380E+01, 2.3100E+01, 2.3200E+01, 2.3220E+01, 2.9750E+01, 2.6300E+01, 3.0940E+01, 3.5460E+01, 2.6880E+01, 1.9260E+01, 3.0710E+01, 1.5050E+01, 4.6630E+01, 1.6990E+01, 7.0000E-01, 3.6160E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CO2,CO2,abs,1.0000E-22,m2, 3.5800E-03, 3.5800E-03, 3.5800E-03, 3.5800E-01, 3.5800E-01, 3.5800E-01, 3.5800E-01, 1.5500E+00, 4.6200E+00, 9.0900E+00, 1.4360E+01, 1.6510E+01, 1.9020E+01, 1.7520E+01, 2.1490E+01, 2.1590E+01, 2.3570E+01, 2.5270E+01, 2.4870E+01, 2.8270E+01, 2.9530E+01, 3.0250E+01, 3.1490E+01, 3.3200E+01, 3.4200E+01, 3.4910E+01, 3.5300E+01, 3.4300E+01, 3.4450E+01, 3.3700E+01, 2.3520E+01, 3.2830E+01, 9.3840E+01, 6.1940E+01, 2.6490E+01, 3.9830E+01, 1.3980E+01, 4.4670E+01, 5.2080E+01, 4.2870E+01, 5.0310E+01, 1.5100E+01, 1.4200E+01, 1.8240E+01, 1.7400E+01, 4.0800E+01, 8.8200E-01, 4.9600E-02, 8.1000E-02, 3.7300E-01, 7.3900E-01, 6.0700E-01, 5.2400E-01, 5.4400E-01, 4.3100E-01, 2.5800E-01, 1.2600E-01, 4.8000E-02, 1.6000E-02, from GITM + CO,CO,abs,1.0000E-22,m2, 4.1700E-03, 4.1700E-03, 4.1700E-03, 4.1700E-01, 4.1700E-01, 4.1700E-01, 4.1700E-01, 8.7000E-01, 2.3900E+00, 4.6700E+00, 7.0100E+00, 8.6100E+00, 1.0540E+01, 9.4200E+00, 1.1870E+01, 1.1900E+01, 1.3440E+01, 1.5260E+01, 1.4960E+01, 1.7960E+01, 2.0170E+01, 2.0570E+01, 2.1090E+01, 2.1620E+01, 2.2000E+01, 2.1910E+01, 2.2100E+01, 2.2030E+01, 2.1920E+01, 2.1040E+01, 2.3850E+01, 2.5200E+01, 2.6280E+01, 1.5260E+01, 3.3130E+01, 2.0540E+01, 2.2610E+01, 3.6980E+01, 5.0320E+01, 2.8500E+01, 5.2830E+01, 1.3900E+00, 1.3900E+00, 8.5700E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CH4,CH4,abs,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.6430E-01, 4.2100E-01, 4.5350E-01, 2.0400E-01, 5.9300E-01, 1.4960E+00, 2.7940E+00, 3.8570E+00, 5.0530E+00, 4.3600E+00, 6.0330E+00, 6.0590E+00, 7.8290E+00, 1.0165E+01, 9.7760E+00, 1.4701E+01, 1.8770E+01, 2.1449E+01, 2.4644E+01, 2.7924E+01, 3.1052E+01, 3.0697E+01, 3.3178E+01, 3.5276E+01, 3.4990E+01, 3.9280E+01, 4.1069E+01, 4.2927E+01, 4.5458E+01, 4.5716E+01, 4.6472E+01, 4.5921E+01, 4.8327E+01, 4.8968E+01, 4.8001E+01, 4.1154E+01, 3.8192E+01, 3.2700E+01, 3.0121E+01, 2.9108E+01, 2.8400E+01, 1.8000E+01, 1.9200E+01, 1.7860E+01, 1.8318E+01, 1.9068E+01, 1.2826E+01, 3.2898E+00, 1.2600E-01, 7.9900E-04, 1.4000E-05, 7.0000E-06, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + H2,H2,abs,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.0000E-02, 8.0000E-02, 2.1000E-01, 4.3000E-01, 6.0000E-01, 8.4000E-01, 7.3000E-01, 1.0200E+00, 1.0200E+00, 1.4200E+00, 1.9400E+00, 1.9000E+00, 3.0300E+00, 3.8700E+00, 4.5000E+00, 5.3600E+00, 6.1700E+00, 7.0200E+00, 6.8600E+00, 7.8100E+00, 8.4600E+00, 8.4500E+00, 9.9000E+00, 1.0730E+01, 1.1370E+01, 1.0760E+01, 8.6400E+00, 7.3400E+00, 8.7500E+00, 8.2500E+00, 4.8000E-01, 1.9000E-01, 0.0000E+00, 5.0000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + HCN,HCN,abs,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + He,He,abs,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.4400E-01, 4.7900E-01, 1.1570E+00, 1.6010E+00, 2.1210E+00, 2.5950E+00, 2.3200E+00, 2.9530E+00, 2.9620E+00, 3.5440E+00, 4.2680E+00, 4.1420E+00, 5.4470E+00, 6.5630E+00, 7.2080E+00, 9.5800E-01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + NO,NO,abs,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.4000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.4000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.0000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O2,O2+,ion,1.0000E-22,m2, 4.0000E-04, 4.0000E-03, 2.4000E-02, 1.4000E-01, 1.0200E+00, 1.0000E-01, 3.2000E-01, 1.1800E+00, 4.0000E+00, 7.1000E+00, 1.0600E+01, 1.3200E+01, 1.5700E+01, 1.5100E+01, 1.6800E+01, 1.6800E+01, 1.7190E+01, 1.8400E+01, 1.8170E+01, 1.9390E+01, 2.0400E+01, 2.1590E+01, 2.4060E+01, 2.5590E+01, 2.2000E+01, 2.5040E+01, 2.6100E+01, 2.5800E+01, 2.5940E+01, 2.2050E+01, 2.3000E+01, 2.3810E+01, 8.5900E+00, 9.6900E+00, 1.1050E+01, 9.3900E+00, 6.1200E+00, 4.6900E+00, 9.3400E+00, 2.5000E+00, 1.2220E+01, 1.0000E+00, 0.0000E+00, 2.7000E-01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+,ion,1.0000E-22,m2, 6.0000E-05, 6.0000E-04, 4.0000E-03, 2.0000E-02, 1.5000E-02, 1.5000E-02, 5.0000E-02, 1.8000E-01, 4.6000E-01, 7.8000E-01, 1.3800E+00, 1.5100E+00, 1.7800E+00, 1.6500E+00, 1.9200E+00, 1.9300E+00, 2.2500E+00, 2.5900E+00, 2.5100E+00, 3.0300E+00, 3.1500E+00, 3.2600E+00, 3.4500E+00, 3.5200E+00, 3.5300E+00, 3.4500E+00, 3.6700E+00, 3.7900E+00, 3.7800E+00, 4.0100E+00, 4.9100E+00, 4.2000E+00, 4.1800E+00, 4.1800E+00, 4.2800E+00, 4.2300E+00, 4.3800E+00, 4.1800E+00, 2.1200E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+2D,ion,1.0000E-22,m2, 6.0000E-05, 6.0000E-04, 4.0000E-03, 2.0000E-02, 1.5000E-02, 1.5000E-02, 5.0000E-02, 1.9000E-01, 5.1000E-01, 9.9000E-01, 1.8600E+00, 2.1200E+00, 2.6400E+00, 2.3800E+00, 2.8400E+00, 2.8500E+00, 3.4700E+00, 3.9800E+00, 3.8600E+00, 4.7100E+00, 5.0600E+00, 5.2400E+00, 5.3600E+00, 5.4600E+00, 5.4800E+00, 5.3600E+00, 5.5000E+00, 5.5000E+00, 5.4900E+00, 5.5200E+00, 6.4400E+00, 3.8000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+2P,ion,1.0000E-22,m2, 7.0000E-05, 7.0000E-04, 4.0000E-03, 3.0000E-02, 2.0000E-02, 2.0000E-02, 6.0000E-02, 2.2000E-01, 6.2000E-01, 1.1300E+00, 2.0700E+00, 2.4200E+00, 2.7100E+00, 2.5800E+00, 2.9200E+00, 2.9300E+00, 2.9500E+00, 3.3800E+00, 3.2800E+00, 3.4800E+00, 3.0400E+00, 3.1400E+00, 3.1000E+00, 3.1500E+00, 3.1600E+00, 3.0900E+00, 3.0600E+00, 2.9300E+00, 2.9300E+00, 5.0000E-01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N2,N2+,ion,1.0000E-22,m2, 3.0000E-04, 3.0000E-03, 1.5000E-02, 9.0000E-02, 4.8000E-01, 1.1600E+00, 2.4000E-01, 6.0000E-01, 1.9000E+00, 4.4000E+00, 8.0000E+00, 9.7000E+00, 1.0600E+01, 1.0300E+01, 1.1600E+01, 1.1600E+01, 1.3000E+01, 1.8000E+01, 1.7510E+01, 2.1070E+01, 2.1800E+01, 2.1850E+01, 2.4530E+01, 2.4690E+01, 2.3200E+01, 2.2380E+01, 2.3100E+01, 2.3200E+01, 2.3220E+01, 2.5060E+01, 2.3000E+01, 2.3200E+01, 2.3770E+01, 1.8390E+01, 1.0180E+01, 1.6750E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N,N+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 1.0000E-01, 5.0000E-01, 1.0000E+00, 1.0000E+00, 1.0000E+00, 2.0000E+00, 2.5000E+00, 3.5000E+00, 4.0000E+00, 5.0000E+00, 5.0000E+00, 6.0000E+00, 6.0000E+00, 6.5000E+00, 8.0000E+00, 7.0000E+00, 1.0000E+01, 1.0000E+01, 1.0000E+01, 1.1000E+01, 1.1500E+01, 1.2000E+01, 1.1000E+01, 1.2000E+01, 1.2000E+01, 1.2000E+01, 1.2000E+01, 1.2000E+01, 1.1000E+01, 1.1000E+01, 1.1000E+01, 1.0000E+01, 1.0000E+01, 1.0000E+01, 1.0000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CO2,CO2+,ion,1.0000E-22,m2, 1.5500E+00, 1.5500E+00, 1.5500E+00, 1.5500E+00, 1.5500E+00, 1.5500E+00, 1.5500E+00, 1.5500E+00, 4.6200E+00, 9.0900E+00, 1.4320E+01, 1.6110E+01, 1.8600E+01, 1.7140E+01, 2.1390E+01, 2.1440E+01, 2.3630E+01, 2.5560E+01, 2.5520E+01, 2.7170E+01, 2.8760E+01, 3.0680E+01, 3.2602E+01, 3.3210E+01, 3.3860E+01, 3.4960E+01, 3.5300E+01, 3.4300E+01, 3.4570E+01, 3.2290E+01, 2.0860E+01, 2.7490E+01, 8.6320E+01, 5.1770E+01, 2.1680E+01, 3.4090E+01, 1.0930E+01, 7.1400E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CO,CO+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CH4,CH4+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.0000E-01, 5.9000E-01, 1.5000E+00, 2.7900E+00, 3.8600E+00, 5.0500E+00, 4.3600E+00, 6.0300E+00, 6.0600E+00, 7.8300E+00, 1.0170E+01, 9.7800E+00, 1.4700E+01, 1.8770E+01, 2.1450E+01, 2.4640E+01, 2.7920E+01, 3.1050E+01, 3.0700E+01, 3.3180E+01, 3.5280E+01, 3.4990E+01, 3.9280E+01, 4.1070E+01, 4.2930E+01, 4.4800E+01, 4.4800E+01, 4.4610E+01, 4.4690E+01, 4.0280E+01, 2.5530E+01, 1.3860E+01, 1.4000E-01, 4.8000E-01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + H2,H2+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.0000E-02, 8.0000E-02, 2.0000E-01, 4.0000E-01, 5.5000E-01, 7.5000E-01, 6.5000E-01, 9.0000E-01, 9.0000E-01, 1.3000E+00, 1.7800E+00, 1.7400E+00, 2.8900E+00, 3.7800E+00, 4.0500E+00, 5.2500E+00, 6.0500E+00, 6.9000E+00, 6.7400E+00, 7.6700E+00, 8.3000E+00, 8.2900E+00, 9.7000E+00, 1.0730E+01, 9.7600E+00, 8.6200E+00, 7.0700E+00, 5.0700E+00, 6.6300E+00, 9.0000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + HCN,HCN+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + NO,NO+,ion,1.0000E-22,m2, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.4000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.4000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 1.0000E+01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 2.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O2,O2+,pei,1.0000E+00,, 1.3469E+02, 1.3469E+02, 3.2212E+01, 1.3309E+01, 3.9615E+01, 3.9615E+01, 2.8340E+00, 1.0920E+00, 1.0920E+00, 4.1600E-01, 1.8400E-01, 1.8400E-01, 1.8400E-01, 1.8400E-01, 9.0000E-02, 9.0000E-02, 2.4000E-02, 2.4000E-02, 2.4000E-02, 2.4000E-02, 2.4000E-02, 2.4000E-02, 2.4000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O2,O+,pei,1.0000E+00,, 7.6136E+01, 7.6136E+01, 1.7944E+01, 6.9810E+00, 2.0338E+01, 2.0338E+01, 1.4370E+00, 5.2100E-01, 5.2100E-01, 1.6300E-01, 5.2000E-02, 5.2000E-02, 5.2000E-02, 5.2000E-02, 1.4000E-02, 1.4000E-02, 1.0000E-03, 1.0000E-03, 1.0000E-03, 1.0000E-03, 1.0000E-03, 1.0000E-03, 1.0000E-03, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N2,N2+,pei,1.0000E+00,, 2.6399E+02, 2.6399E+02, 6.2570E+01, 2.5213E+01, 8.5400E+00, 8.5400E+00, 6.1420E+00, 2.2880E+00, 2.2880E+00, 7.8600E-01, 3.2400E-01, 3.2400E-01, 3.2400E-01, 3.2400E-01, 1.6900E-01, 1.6900E-01, 3.1000E-02, 3.1000E-02, 3.1000E-02, 3.1000E-02, 3.1000E-02, 3.1000E-02, 3.1000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N2,N+,pei,1.0000E+00,, 7.8674E+01, 7.8674E+01, 1.8310E+01, 6.9480E+00, 2.2950E+00, 2.2950E+00, 1.6470E+00, 1.6470E+00, 5.7100E-01, 1.4600E-01, 3.7000E-02, 3.7000E-02, 3.7000E-02, 3.7000E-02, 8.0000E-03, 8.0000E-03, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CH4,CH4+,pei,1.0000E+00,, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + CH4,CH3+,pei,1.0000E+00,, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+,pei,1.0000E+00,, 8.1240E+01, 8.1240E+01, 1.8896E+01, 9.4250E+00, 2.8622E+01, 2.8622E+01, 2.0190E+00, 9.0200E-01, 9.0200E-01, 4.7000E-01, 3.2500E-01, 3.2500E-01, 3.2500E-01, 3.2500E-01, 2.0900E-01, 2.0900E-01, 8.4000E-02, 8.4000E-02, 8.4000E-02, 8.4000E-02, 8.4000E-02, 8.4000E-02, 8.4000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+2D,pei,1.0000E+00,, 8.8526E+01, 8.8526E+01, 2.0691E+01, 9.3650E+00, 2.8199E+01, 2.8199E+01, 1.9620E+00, 8.5300E-01, 8.5300E-01, 4.1800E-01, 2.5300E-01, 2.5300E-01, 2.5300E-01, 2.5300E-01, 1.4800E-01, 1.4800E-01, 3.4000E-02, 3.4000E-02, 3.4000E-02, 3.4000E-02, 3.4000E-02, 3.4000E-02, 3.4000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O,O+2P,pei,1.0000E+00,, 4.7358E+01, 4.7358E+01, 1.1007E+01, 4.7720E+00, 1.4556E+01, 1.4556E+01, 1.0140E+00, 4.3600E-01, 4.3600E-01, 2.0300E-01, 1.1600E-01, 1.1600E-01, 1.1600E-01, 1.1600E-01, 6.1000E-02, 6.1000E-02, 9.0000E-03, 9.0000E-03, 9.0000E-03, 9.0000E-03, 9.0000E-03, 9.0000E-03, 9.0000E-03, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + N2,N_4S,ped,1.0000E+00,, 2.4500E+02, 2.4500E+02, 5.2052E+01, 2.5255E+01, 9.0490E+00, 9.0490E+00, 6.5320E+00, 2.9090E+00, 2.9090E+00, 1.3710E+00, 7.6400E-01, 7.6400E-01, 7.6400E-01, 7.6400E-01, 5.1500E-01, 5.1500E-01, 1.5700E-01, 1.5700E-01, 1.5700E-01, 1.5700E-01, 1.5700E-01, 1.5700E-01, 1.5700E-01, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM + O2,O,ped,1.0000E+00,, 8.7864E+01, 8.7864E+01, 2.0318E+01, 1.7821E+01, 5.6969E+01, 5.6969E+01, 4.1130E+00, 2.0410E+00, 2.0410E+00, 1.2710E+00, 9.9600E-01, 9.9600E-01, 9.9600E-01, 9.9600E-01, 7.6200E-01, 7.6200E-01, 6.5300E-01, 6.5300E-01, 6.5300E-01, 6.5300E-01, 6.5300E-01, 6.5300E-01, 6.5300E-01, 1.1000E-02, 1.1000E-02, 1.1000E-02, 1.1000E-02, 1.1000E-02, 1.1000E-02, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, 0.0000E+00, from GITM From 592aebfa4a7e06a4157df7ea9d6a203fb4df5a72 Mon Sep 17 00:00:00 2001 From: "Daniel A. Brandt" Date: Tue, 15 Jul 2025 09:16:31 -0400 Subject: [PATCH 560/691] Added additional information to doc/internals/fism.md to explain how users can execute fism.py. --- doc/internals/fism.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/doc/internals/fism.md b/doc/internals/fism.md index 1133396e..5b1322e8 100644 --- a/doc/internals/fism.md +++ b/doc/internals/fism.md @@ -1,10 +1,10 @@ -# FISM +# FISM-2 -FISM can be used as a EUV model. +FISM-2 can be used as a EUV model. -Needs the FISM files automatically made by `srcPython/fism.py`. +Needs the FISM-2 files automatically made by `srcPython/fism.py`. -FISM contains the binned flux already, however Aether must still be provided with an +FISM-2 contains the binned flux already, however Aether must still be provided with an EUV csv file containing the cross-sections. The different fism models available in fism.py contain different numbers of bins, so @@ -28,3 +28,15 @@ The input format, when using fism data: "HeatingEfficiency" : 0.05, "dt" : 60.0 }, + +To generate FISM-2 irradiances between two dates, one may call fism.py like so: + +srcPython/fism.py 20110319 20110321 -b neuvac + +Note that the optional argument '-b' defaults to the binning scheme of the NEUVAC model, +which employs 59 bins. To use the 37 bins of the EUVAC model, the argument should be +'euvac', while to use the 23 bins used by the HFG model, the argument should be 'solomon'. + +fism.py should always be run before Aether is run using the FISM-2 model. Even though the +entire FISM-2 irradiances are stored in the repository, Aether will need a separate .csv +file containing the temporal subset of FISM-2 irradiances in the desired binning scheme. From 516782fe302a0162cbe656f0b0d0f8afda0e935e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:50:57 -0400 Subject: [PATCH 561/691] Note that adjusted means to 1AU and not to Earth --- srcPython/neuvac.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/srcPython/neuvac.py b/srcPython/neuvac.py index 3fb0dadb..9134e899 100644 --- a/srcPython/neuvac.py +++ b/srcPython/neuvac.py @@ -178,10 +178,13 @@ def readCLS(filename): def getCLSF107(dateStart, dateEnd, truncate=True): """ - Obtains Sun-Earth distance adjusted, flare-corrected F10.7 data from Collecte Localisation Satellites. Downloads the - most recent measurements to a file. Reads the file and extracts the F10.7 values between two dates. Note that if the - ending date is less than or equal to the last date in the version of the file that has already been downloaded, the - file IS NOT re-downloaded, but simply parsed. Otherwise, the file is redownloaded. + Obtains flare-corrected F10.7 data from Collecte Localisation Satellites. The "adjusted" here means that it has been + adjusted from measurements from Earth to 1AU. (Aether/GITM need measurements at 1AU, so they can adjust to the + proper sun-planet distance, where planet can be Earth, Venus, Mars, etc.) A description of the data is + provided here: https://spaceweather.cls.fr/services/radioflux/. + Downloads the most recent measurements to a file. Reads the file and extracts the F10.7 values between two dates. + Note that if the ending date is less than or equal to the last date in the version of the file that has already + been downloaded, the file IS NOT re-downloaded, but simply parsed. Otherwise, the file is redownloaded. :param dateStart: str The starting date in YYYYMMDD format. :param dateEnd: str From 7fdbc00572c68c42b340d9ea3215eb8a4b1a50bb Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:52:39 -0400 Subject: [PATCH 562/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/.gitignore | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 srcPython/.idea/.gitignore diff --git a/srcPython/.idea/.gitignore b/srcPython/.idea/.gitignore deleted file mode 100644 index 26d33521..00000000 --- a/srcPython/.idea/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml From d39113ba75ef3f2e2f673a03bbe23ba8622e7b16 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:53:14 -0400 Subject: [PATCH 563/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/inspectionProfiles/profiles_settings.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 srcPython/.idea/inspectionProfiles/profiles_settings.xml diff --git a/srcPython/.idea/inspectionProfiles/profiles_settings.xml b/srcPython/.idea/inspectionProfiles/profiles_settings.xml deleted file mode 100644 index 105ce2da..00000000 --- a/srcPython/.idea/inspectionProfiles/profiles_settings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file From 87e48289f7d5463b22e2da50d269696ce315b7a4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:53:31 -0400 Subject: [PATCH 564/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/misc.xml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 srcPython/.idea/misc.xml diff --git a/srcPython/.idea/misc.xml b/srcPython/.idea/misc.xml deleted file mode 100644 index 76a040b9..00000000 --- a/srcPython/.idea/misc.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 86bfcb7c182d2f5c3ba06a236691781c222bd5b2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:53:50 -0400 Subject: [PATCH 565/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/vcs.xml | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 srcPython/.idea/vcs.xml diff --git a/srcPython/.idea/vcs.xml b/srcPython/.idea/vcs.xml deleted file mode 100644 index 6c0b8635..00000000 --- a/srcPython/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 32f5efe623a5f64946976ff9dbf9bb6fcfe16d93 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:54:27 -0400 Subject: [PATCH 566/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/modules.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 srcPython/.idea/modules.xml diff --git a/srcPython/.idea/modules.xml b/srcPython/.idea/modules.xml deleted file mode 100644 index c7044f5d..00000000 --- a/srcPython/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From ce2b86aa70be0ab5434e05261cf74598ef575512 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 07:54:46 -0400 Subject: [PATCH 567/691] This file is a custom setup file for an editor, maybe --- srcPython/.idea/srcPython.iml | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 srcPython/.idea/srcPython.iml diff --git a/srcPython/.idea/srcPython.iml b/srcPython/.idea/srcPython.iml deleted file mode 100644 index 410274b1..00000000 --- a/srcPython/.idea/srcPython.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - \ No newline at end of file From 63dafb45caa19ed957a83697773ea47e60ce3874 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 08:10:12 -0400 Subject: [PATCH 568/691] BUG: shouldnt have so much output --- src/grid_match.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 25da6188..4cb3fea0 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -3,8 +3,8 @@ #include "aether.h" -bool grid_match(Grid gGrid, - Grid mGrid, +bool grid_match(Grid gGrid, + Grid mGrid, Quadtree gQuadtree, Quadtree mQuadtree) { @@ -24,6 +24,7 @@ bool grid_match(Grid gGrid, for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { lon = mGrid.geoLon_scgc(iX, iY, iZ); lat = mGrid.geoLat_scgc(iX, iY, iZ); + if (gGrid.iGridShape_ == gGrid.iSphere_) { norms(0) = lon / cPI; norms(1) = lat / cPI; @@ -33,14 +34,9 @@ bool grid_match(Grid gGrid, norms = sphere_to_cube(lon, lat); iNode = gQuadtree.find_point(norms); } - std::cout << "lon, lat, node: " << lon*cRtoD << " " - << lat*cRtoD << " " - << norms(0) << " " - << norms(1) << " " - << norms(2) << " " - << iNode << "\n"; } } } + return true; } From a22076165d6f9d159236a87720c2bc1bda3f2630 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 17 Jul 2025 11:55:28 -0400 Subject: [PATCH 569/691] I hate warnings --- ext/IE/mh86.f | 126 +++++++++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/ext/IE/mh86.f b/ext/IE/mh86.f index 35785c53..87548c6a 100644 --- a/ext/IE/mh86.f +++ b/ext/IE/mh86.f @@ -105,14 +105,12 @@ SUBROUTINE MHEMODL (RMLAT,RMLT,HP,BY,BZ,MODL,ET,EP,EPOT) TIME = RMLTLON/15. TIME = RMLT - 20 IF (TIME .GT. TMX) THEN - TIME = TIME - 24. - GO TO 20 - ENDIF - 30 IF (TIME .LT. TMN) THEN - TIME = TIME + 24. - GO TO 30 - ENDIF + do while (time > tmx) + time = time - 24.0 + enddo + do while (time < tmn) + time = time + 24.0 + enddo H = SIGN (1.,RMLAT) RMLA = MIN(MAX(ABS(RMLAT),RMLAMN(MODL)), RMLAMX(MODL)) @@ -255,8 +253,9 @@ SUBROUTINE MHINIT (MODL,IUN,IPR,ISTAT) ENDIF READ (IUN,*) NLABS - DO 10 I=1,NLABS - 10 READ (IUN,'(A)',END=998,ERR=999) LABELS + DO I=1,NLABS + READ (IUN,'(A)',END=998,ERR=999) LABELS + enddo READ (IUN,*,END=998,ERR=999) KFIT IF (KFIT .NE. 2) THEN @@ -297,8 +296,9 @@ SUBROUTINE MHINIT (MODL,IUN,IPR,ISTAT) IF (MODL .EQ. 2) THEN C Reverse the sign of BETA for MHS to conform to MHI convention - DO 20 I=1,NBETA - 20 BETA(I,NDX,MODL) = -BETA(I,NDX,MODL) + DO I=1,NBETA + BETA(I,NDX,MODL) = -BETA(I,NDX,MODL) + enddo ENDIF ENDDO C 30 IF (IPR .EQ. 1) WRITE (6,'(''MHINIT: Read ''A,'' pars: I MODL BY B @@ -392,10 +392,11 @@ SUBROUTINE GETFIT (NDX,MODL,TIME,RMLA,DFIT,ESFIT,EEFIT,ISTAT) DFIT = 0.0 DDXFIT = 0. DDYFIT = 0. - DO 30 I=1,NBETA - DFIT = DFIT + BETA(I,NDX,MODL)*F(1,1,I) - DDXFIT = DDXFIT + BETA(I,NDX,MODL)*F(2,1,I)/Y - 30 DDYFIT = DDYFIT + BETA(I,NDX,MODL)*F(1,2,I) + DO I=1,NBETA + DFIT = DFIT + BETA(I,NDX,MODL)*F(1,1,I) + DDXFIT = DDXFIT + BETA(I,NDX,MODL)*F(2,1,I)/Y + DDYFIT = DDYFIT + BETA(I,NDX,MODL)*F(1,2,I) + enddo DDYFIT = -DDYFIT DFIT = -DFIT/1000. ESFIT = -DDYFIT @@ -422,10 +423,11 @@ SUBROUTINE BASPRC (TX,TY,NX,NY,KX,KY,X,Y,F) NDERIV = MIN0 (3,KX-1,KY-1) N = NX*NY - DO 10 I=1,N - DO 10 J=1,9 - 10 F(J,I) = 0. - + DO I=1,N + DO J=1,9 + F(J,I) = 0. + enddo + enddo XP = MOD (X,TX(NX+1)) CALL INTERV (TX, NX+KX, XP, ILEFTX, MFLAG) YP = Y @@ -449,24 +451,25 @@ SUBROUTINE BASPRC (TX,TY,NX,NY,KX,KY,X,Y,F) CALL BSPLVD (TY, KY, YP, ILEFTY, A, VALY, NDERIV) NPX = NX - (KX-1) - DO 20 MX=1,KX - IX = LFTMKX + MX - IF (IX .GE. NX-(KX-2)) IX = IX-NX+(KX-1) - - DO 30 MY=1,KY - IY = LFTMKY + MY - 1 - IF (IY .GT. 0) THEN - DO 40 JX=1,3 - LX = MX + KX*(JX-1) - DO 50 JY=1,3 - J = JX + (JY-1)*3 - LY = MY + KY*(JY-1) - I = IX + (IY-1)*NPX - 50 F(J,I) = VALX(LX)*VALY(LY) - 40 CONTINUE - ENDIF - 30 CONTINUE - 20 CONTINUE + DO MX=1,KX + IX = LFTMKX + MX + IF (IX .GE. NX-(KX-2)) IX = IX-NX+(KX-1) + + DO MY=1,KY + IY = LFTMKY + MY - 1 + IF (IY .GT. 0) THEN + DO JX=1,3 + LX = MX + KX*(JX-1) + DO JY=1,3 + J = JX + (JY-1)*3 + LY = MY + KY*(JY-1) + I = IX + (IY-1)*NPX + F(J,I) = VALX(LX)*VALY(LY) + enddo + enddo + ENDIF + enddo + enddo RETURN END @@ -631,14 +634,15 @@ SUBROUTINE BSPLVD ( T, K, X, LEFT, A, DBIATX, NDERIV ) C ORDER BEFORE BSPLVB IS CALLED TO PUT VALUES FOR THE NEXT C HIGHER ORDER ON TOP OF IT. IDERIV = MHIGH - DO 15 M=2,MHIGH + DO M=2,MHIGH JP1MID = 1 - DO 11 J=IDERIV,K + DO J=IDERIV,K DBIATX(J,IDERIV) = DBIATX(JP1MID,1) - 11 JP1MID = JP1MID + 1 + JP1MID = JP1MID + 1 + enddo IDERIV = IDERIV - 1 CALL BSPLVB(T,KP1-IDERIV,2,X,LEFT,DBIATX) - 15 CONTINUE + enddo C C AT THIS POINT, B(LEFT-K+I, K+1-J)(X) IS IN DBIATX(I,J) FOR C I=J,...,K AND J=1,...,MHIGH ('=' NDERIV). IN PARTICULAR, THE @@ -647,15 +651,17 @@ SUBROUTINE BSPLVD ( T, K, X, LEFT, A, DBIATX, NDERIV ) C RATE THEIR B-REPR. BY DIFFERENCING, THEN EVALUATE AT X. C JLOW = 1 - DO 20 I=1,K - DO 19 J=JLOW,K - 19 A(J,I) = 0. + DO I=1,K + DO J=JLOW,K + A(J,I) = 0. + enddo JLOW = I - 20 A(I,I) = 1. + A(I,I) = 1. + enddo C AT THIS POINT, A(.,J) CONTAINS THE B-COEFFS FOR THE J-TH OF THE C K B-SPLINES OF INTEREST HERE. C - DO 40 M=2,MHIGH + DO M=2,MHIGH KP1MM = KP1 - M FKP1MM = FLOAT(KP1MM) IL = LEFT @@ -665,14 +671,16 @@ SUBROUTINE BSPLVD ( T, K, X, LEFT, A, DBIATX, NDERIV ) C B-SPLINES FROM THOSE FOR PRECEDING DERIVATIVE BY DIFFERENCING C AND STORE AGAIN IN A(.,J) . THE FACT THAT A(I,J) = 0 FOR C I .LT. J IS USED. - DO 25 LDUMMY=1,KP1MM + DO LDUMMY=1,KP1MM FACTOR = FKP1MM/(T(IL+KP1MM) - T(IL)) C THE ASSUMPTION THAT T(LEFT).LT.T(LEFT+1) MAKES DENOMINATOR C IN FACTOR NONZERO. - DO 24 J=1,I - 24 A(I,J) = (A(I,J) - A(I-1,J))*FACTOR + DO J=1,I + A(I,J) = (A(I,J) - A(I-1,J))*FACTOR + enddo IL = IL - 1 - 25 I = I - 1 + I = I - 1 + enddo C C FOR I=1,...,K, COMBINE B-COEFFS A(.,I) WITH B-SPLINE VALUES C STORED IN DBIATX(.,M) TO GET VALUE OF (M-1)ST DERIVATIVE OF @@ -681,12 +689,15 @@ SUBROUTINE BSPLVD ( T, K, X, LEFT, A, DBIATX, NDERIV ) C OF ORDER M THERE IS SAFE SINCE THE REMAINING B-SPLINE DERIVAT- C IVES OF THE SAME ORDER DO NOT USE THIS VALUE DUE TO THE FACT C THAT A(J,I) = 0 FOR J .LT. I . - 30 DO 40 I=1,K + 30 DO I=1,K SUM = 0. JLOW = MAX0(I,M) - DO 35 J=JLOW,K - 35 SUM = A(J,I)*DBIATX(J,M) + SUM - 40 DBIATX(I,M) = SUM + DO J=JLOW,K + SUM = A(J,I)*DBIATX(J,M) + SUM + enddo + DBIATX(I,M) = SUM + enddo + enddo 99 RETURN END @@ -772,10 +783,11 @@ SUBROUTINE BSPLVB ( T, JHIGH, INDEX, X, LEFT, BIATX ) DELTAR(J) = T(LEFT+J) - X DELTAL(J) = X - T(LEFT+1-J) SAVED = 0. - DO 26 I=1,J + DO I=1,J TERM = BIATX(I)/(DELTAR(I) + DELTAL(JP1-I)) BIATX(I) = SAVED + DELTAR(I)*TERM - 26 SAVED = DELTAL(JP1-I)*TERM + SAVED = DELTAL(JP1-I)*TERM + enddo BIATX(JP1) = SAVED J = JP1 IF (J .LT. JHIGH) GO TO 20 From ff07fa4fa5cf39f20e78fb162e6b4d0bb7049e3d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:09:35 -0400 Subject: [PATCH 570/691] STY: tabs --- include/cubesphere.h | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/include/cubesphere.h b/include/cubesphere.h index e99036a6..ecca2aed 100644 --- a/include/cubesphere.h +++ b/include/cubesphere.h @@ -15,32 +15,32 @@ namespace CubeSphere { /// The normalized origins of each face of the cube (i.e. corner) static const arma_mat ORIGINS = { - {-1.0, -1.0, -1.0}, - { 1.0, -1.0, -1.0}, - { 1.0, 1.0, -1.0}, - {-1.0, 1.0, -1.0}, - {-1.0, -1.0, -1.0}, - { 1.0, -1.0, 1.0} + {-1.0, -1.0, -1.0}, + { 1.0, -1.0, -1.0}, + { 1.0, 1.0, -1.0}, + {-1.0, 1.0, -1.0}, + {-1.0, -1.0, -1.0}, + { 1.0, -1.0, 1.0} }; /// Normalized right steps in cube static const arma_mat RIGHTS = { - { 2.0, 0.0, 0.0}, - { 0.0, 2.0, 0.0}, - {-2.0, 0.0, 0.0}, - { 0.0, -2.0, 0.0}, - { 0.0, 2.0, 0.0}, - { 0.0, 2.0, 0.0} + { 2.0, 0.0, 0.0}, + { 0.0, 2.0, 0.0}, + {-2.0, 0.0, 0.0}, + { 0.0, -2.0, 0.0}, + { 0.0, 2.0, 0.0}, + { 0.0, 2.0, 0.0} }; /// Normalized right steps in cube static const arma_mat UPS = { - { 0.0, 0.0, 2.0}, - { 0.0, 0.0, 2.0}, - { 0.0, 0.0, 2.0}, - { 0.0, 0.0, 2.0}, - { 2.0, 0.0, 0.0}, - {-2.0, 0.0, 0.0} + { 0.0, 0.0, 2.0}, + { 0.0, 0.0, 2.0}, + { 0.0, 0.0, 2.0}, + { 0.0, 0.0, 2.0}, + { 2.0, 0.0, 0.0}, + {-2.0, 0.0, 0.0} }; } // CubeSphere:: From 9c22a68dd91ea1518c5c50d11e0a881e0d87a259 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:10:41 -0400 Subject: [PATCH 571/691] STY: spaces and tabs --- include/inputs.h | 431 ++++++++++++++++++++++++----------------------- 1 file changed, 216 insertions(+), 215 deletions(-) diff --git a/include/inputs.h b/include/inputs.h index c753d874..ad8964f7 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -19,7 +19,7 @@ class Inputs { -public: + public: int iVerbose; int iVerboseProc; @@ -45,7 +45,7 @@ class Inputs { // - "cubesphere", sets grid.iGridShape_ = iCubesphere_ // - "dipole", sets grid.iGridShape_ = iDipole_ std::string shape; - + // Minimum altitude to simulate: precision_t alt_min; // Some grids allow the specification of the maximum altitude: @@ -61,7 +61,7 @@ class Inputs { bool IsUniformAlt; // Only needed for Mag Field grid: - // min_apex (not used) and LatStretch is used + // min_apex (not used) and LatStretch is used // as lat = min_lat + dlat where dlat = acos(cos(lat^stretch))^(1/stretch) precision_t min_apex, LatStretch, FieldLineStretch, max_blat; @@ -75,41 +75,41 @@ class Inputs { /********************************************************************** - \brief - \param + \brief + \param **/ Inputs() {} - + /********************************************************************** - \brief - \param + \brief + \param **/ Inputs(Times &time); /********************************************************************** - \brief - \param + \brief + \param **/ int read(Times &time); /********************************************************************** - \brief - \param + \brief + \param **/ bool read_inputs_json(Times &time); - + /********************************************************************** - \brief - \param + \brief + \param **/ bool set_verbose(json in); - + // -------------------------------------------------------------------- // get functions: // - These functions offer access to specific parts of the settings json. // - They call the general functions that check whether the key(s) exists. // - If the key does not exist, an error flag (in report) is set. - // - + // - // -------------------------------------------------------------------- // --------------------- @@ -121,13 +121,13 @@ class Inputs { \param none **/ int get_verbose(); - + /********************************************************************** \brief returns settings["Debug"]["iProc"] \param none **/ int get_verbose_proc(); - + /********************************************************************** \brief returns settings["Debug"]["dt"] \param none @@ -144,13 +144,13 @@ class Inputs { \param none **/ precision_t get_n_outputs(); - + /********************************************************************** \brief returns settings["Outputs"]["dt"][iOutput] \param iOutput int specifying which output file type to report on **/ precision_t get_dt_output(int iOutput); - + /********************************************************************** \brief returns settings["Outputs"]["type"][iOutput] \param iOutput int specifying which output file type to report on @@ -162,7 +162,7 @@ class Inputs { \param none **/ precision_t get_dt_euv(); - + /********************************************************************** \brief returns settings["Euv"]["IncludePhotoElectrons"] \param none @@ -175,263 +175,263 @@ class Inputs { \param none **/ std::string get_diffuse_auroral_model(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_potential_model(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_electrodynamics_dir(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_electrodynamics_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_electrodynamics_north_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_electrodynamics_south_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_euv_heating_eff_neutrals(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_euv_model(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_euv_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_euv_douse(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_aurora_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_chemistry_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_indices_lookup_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::vector get_omniweb_files(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_number_of_omniweb_files(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_f107_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_planet(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_planetary_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_planet_species_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_collision_file(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_do_calc_bulk_ion_temp(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_eddy_coef(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_eddy_bottom(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_eddy_top(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_use_eddy_momentum(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_use_eddy_energy(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_bfield_type(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_do_restart(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_restartout_dir(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_restartin_dir(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_dt_write_restarts(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_original_seed(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_updated_seed(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ void set_seed(int seed); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool write_restart(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ - json get_perturb_values(); - + json get_perturb_values(); + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_do_lat_dependent_radius(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_do_J2(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_check_for_nans(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_nan_test(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_nan_test_variable(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_is_cubesphere(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_NO_cooling(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_O_cooling(); @@ -474,53 +474,54 @@ class Inputs { /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_use_centripetal(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_use_coriolis(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_cent_acc(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_student_name(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_is_student(); - - + + /********************************************************************** \brief returns settings[" - \param + \param **/ json get_initial_condition_types(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ json get_boundary_condition_types(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_advection_neutrals_vertical(); + std::string get_advection_neutrals_horizontal(); bool get_advection_neutrals_bulkwinds(); bool get_advection_neutrals_implicitfriction(); @@ -528,227 +529,227 @@ class Inputs { /********************************************************************** \brief returns settings[" - \param + \param **/ int get_nLons(std::string gridtype); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_nLats(std::string gridtype); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_nAlts(std::string gridtype); /********************************************************************** \brief returns settings[gridtype, "shape"] - \param + \param **/ std::string get_grid_shape(std::string gridtype); - + /********************************************************************** \brief returns settings[" - \param + \param **/ int get_nMembers(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_logfile(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::string get_logfile(int64_t iLog); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::vector get_species_vector(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ bool get_logfile_append(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ precision_t get_logfile_dt(); // Satellites - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::vector get_satellite_files(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::vector get_satellite_names(); - + /********************************************************************** \brief returns settings[" - \param + \param **/ std::vector get_satellite_dts(); - + // General get_setting functions with error checks: - + /********************************************************************** - \brief - \param + \brief + \param **/ std::string get_setting_str(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::string get_setting_str(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::string get_setting_str(std::string key1, std::string key2, std::string key3); - + /********************************************************************** - \brief - \param + \brief + \param **/ json get_setting_json(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ json get_setting_json(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ bool get_setting_bool(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ bool get_setting_bool(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ bool get_setting_bool(std::string key1, std::string key2, std::string key3); - + /********************************************************************** - \brief - \param + \brief + \param **/ precision_t get_setting_float(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ precision_t get_setting_float(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ int64_t get_setting_int(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ int64_t get_setting_int(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::vector get_setting_intarr(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::vector get_setting_intarr(std::string key1, std::string key2); /********************************************************************** - \brief - \param + \brief + \param **/ std::vector get_setting_timearr(std::string key1); // Check settings functions: - + /********************************************************************** - \brief - \param + \brief + \param **/ bool check_settings(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ bool check_settings(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::string check_settings_str(std::string key1); - + /********************************************************************** - \brief - \param + \brief + \param **/ std::string check_settings_str(std::string key1, std::string key2); - + /********************************************************************** - \brief - \param + \brief + \param **/ precision_t check_settings_pt(std::string key1, std::string key2); - + /********************************************************************** \brief Check to see if internal state of class is ok **/ bool is_ok(); - -private: + + private: // This is the main variable that contains all of the settings in Aether: json settings; - + // These are a bunch of misc strings that should go away: std::string euv_file = "UA/inputs/euv.csv"; std::string aurora_file = "UA/inputs/aurora_earth.csv"; @@ -778,7 +779,7 @@ class Inputs { std::string restart_in_directory = "UA/restartIn"; bool DoRestart; - + precision_t dt_euv; precision_t dt_report; @@ -787,7 +788,7 @@ class Inputs { int nAltsGeo; int updated_seed; - + /// An internal variable to hold the state of the class bool isOk; From 8b4310aa6c402025bb71e7eb3525658028f26ef4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:11:56 -0400 Subject: [PATCH 572/691] FEAT: added variables for calc_ion_v --- include/ions.h | 69 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/include/ions.h b/include/ions.h index 05ab7bbe..b43a5f89 100644 --- a/include/ions.h +++ b/include/ions.h @@ -11,13 +11,13 @@ * \class Ions * * \brief Defines the ion states - * + * * The Ion class defines the ion states as well as a bunch - * of derived states and source/loss terms. + * of derived states and source/loss terms. * * \author Aaron Ridley * - * \date 2021/03/28 + * \date 2021/03/28 * **************************************************************/ @@ -29,7 +29,7 @@ class Ions { // species of ion. We will then have a vector of these species. int64_t nSpecies = 8; - + struct species_chars { /// Name of the species @@ -68,7 +68,7 @@ class Ions { /// Ion - Electron collision frequencies: std::vector nu_ion_electron; - + // Sources and Losses: /// Number density of species (/m3) @@ -187,12 +187,25 @@ class Ions { /// Average energy of diffuse electron aurora (keV, tbc): arma_mat avee; + // Some variables that we are going to use in calc_ion_v: + std::vector gravity_vcgc; + std::vector wind_acc; + std::vector total_acc; + std::vector efield_acc; + std::vector a_par; + std::vector a_perp; + std::vector a_x_b; + std::vector grad_Pi_plus_Pe; + arma_cube rho, nuin, nuin_sum, Nie, sum_rho; + arma_cube top, bottom; + + /// Number of species to advect: int nSpeciesAdvect; - + /// IDs of species to advect: std::vector species_to_advect; - + // names and units const std::string density_name = "Neutral Bulk Density"; const std::string density_unit = "/m3"; @@ -207,7 +220,7 @@ class Ions { const std::string potential_name = "Potential"; const std::string potential_unit = "Volts"; - + // -------------------------------------------------------------------- // Functions: @@ -225,11 +238,11 @@ class Ions { species_chars create_species(Grid grid); /********************************************************************** - \brief + \brief \param planet contains information about the species to simulate **/ int read_planet_file(Planets planet); - + /********************************************************************** \brief Initialize the ion temperature (to the neutral temperature) \param neutrals the neutral class to grab the temperature from @@ -325,16 +338,16 @@ class Ions { \param dt the delta-t for the current time **/ void calc_ion_drift(Neutrals neutrals, - Grid grid, - precision_t dt); - + Grid grid, + precision_t dt); + /********************************************************************** \brief Calculate the ion + electron pressure gradient \param iIon which ion to act upon \param grid this is the grid to solve the equation on **/ std::vector calc_ion_electron_pressure_gradient(int64_t iIon, - Grid grid); + Grid grid); /********************************************************************** \brief Calculates the ion temperature(s) on the given grid @@ -356,7 +369,7 @@ class Ions { /// @brief Calculate epsilon /// @details intermediate variable used in photoelectron & ionization heating /// From (Smithro & Solomon, 2008). - /// @param neutrals + /// @param neutrals /// @return epsilon **/ arma_cube calc_epsilon(Neutrals &neutrals); @@ -366,17 +379,17 @@ class Ions { \details Based on (Swartz & Nisbet, 1972) & (Smithro & Solomon, 2008) Uses equations 9-12 from (Zhu & Ridley, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 - \param epsilon - \return Qphe + \param epsilon + \return Qphe **/ arma_cube calc_photoelectron_heating(arma_cube epsilon); /********************************************************************** \brief Calculates auroral heating - \details NOTE: in GITM this is solved separately for ion precipitation & auroral + \details NOTE: in GITM this is solved separately for ion precipitation & auroral ionization. In Aether these are both in ions.species[iIon].ionization_scgc... - \param epsilon - \return Qaurora + \param epsilon + \return Qaurora **/ arma_cube calc_ionization_heating(arma_cube epsilon); @@ -394,26 +407,28 @@ class Ions { /********************************************************************** \brief Calculates electron-neutral elastic collisional heating \details From Schunk and Nagy 2009 - \param neutrals + \param neutrals \return vector **/ - std::vector calc_electron_neutral_elastic_collisions(Neutrals &neutrals); + std::vector calc_electron_neutral_elastic_collisions( + Neutrals &neutrals); /********************************************************************** \brief Calculates the electron-neutral inelastic collisional heating \details From Schunk and Nagy 2009 pages 277, 282. This includes N2, O2 rotation, fine structure, O(1D) exitation & vibration, N2 vibration. See equation 15 from (Zhu, Ridley, Deng, 2016) https://doi.org/10.1016/j.jastp.2016.01.005 - \param neutrals + \param neutrals \return vector **/ - std::vector calc_electron_neutral_inelastic_collisions(Neutrals &neutrals); + std::vector calc_electron_neutral_inelastic_collisions( + Neutrals &neutrals); /********************************************************************** \brief Calculate the thermoelectric current (same at all altitudes) \details Use eq. 6 of https://doi.org/10.1016/j.jastp.2016.01.005 - Since we do not know e- parallel velocity, the dipole needs to do it this way too. - \param grid + \param grid \return arma_mat JParaAlt **/ arma_mat calc_thermoelectric_current(Grid &grid); @@ -422,7 +437,7 @@ class Ions { \brief Check all of the variables for nonfinites, such as nans \param none **/ - bool check_for_nonfinites(); + bool check_for_nonfinites(std::string location); /********************************************************************** \brief Run through a test of an arma_cube to see if it contains nans @@ -445,7 +460,7 @@ class Ions { bool exchange_old(Grid &grid); /********************************************************************** - \brief Vertical advection solver - Rusanov + \brief Vertical advection solver - Rusanov \param grid The grid to define the neutrals on \param time contains information about the current time **/ From a3cecb6274ce5717c0edc246fc10e261ecfc5512 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:12:49 -0400 Subject: [PATCH 573/691] FEAT: working on adding horizontal cubesphere solver --- include/neutrals.h | 240 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 184 insertions(+), 56 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index d7ac5321..1ee222b6 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -11,7 +11,7 @@ * \class Neutrals * * \brief Defines the neutral states - * + * * The Neutrals class defines the neutrals states as well as a bunch * of derived states and source/loss terms. The initial temperature * structure as well as the lower boundary densities can be set @@ -19,7 +19,7 @@ * * \author Aaron Ridley * - * \date 2021/03/28 + * \date 2021/03/28 * **************************************************************/ @@ -52,7 +52,7 @@ class Neutrals { /// Number density of species (/m3) arma_cube density_scgc; arma_cube newDensity_scgc; - + /// Velocity of each species (m/s). For all below: /// Index 0 = longitudinal component of velocity /// Index 1 = latitudinal @@ -65,14 +65,14 @@ class Neutrals { /// Coefficient for the friction term (sum of friction coefs with others) arma_cube neutral_friction_coef; - + /// Acceleration of each species based on Eddy contribution. /// Only in vertical direction. arma_cube acc_eddy; - + /// Acceleration of each species due to ion drag. std::vector acc_ion_drag; - + /// concentration (density of species / total density) arma_cube concentration_scgc; // mass concentration (mass * density of species / rho) @@ -104,7 +104,7 @@ class Neutrals { std::vector iEuvPeiId_; /// Which ion species results from the ionization? std::vector iEuvPeiSpecies_; - + int nAuroraIonSpecies; std::vector iAuroraIonSpecies_; float Aurora_Coef; @@ -127,7 +127,7 @@ class Neutrals { /// Chemistry source rate (/m3/s) arma_cube sources_scgc; - + /// Chemistry loss rate (/m3/s) arma_cube losses_scgc; @@ -145,7 +145,7 @@ class Neutrals { /// sound speed + abs(bulk velocity (m/s)) std::vector cMax_vcgc; - + /// bunk temperature (K) arma_cube temperature_scgc; arma_cube newTemperature_scgc; @@ -177,7 +177,7 @@ class Neutrals { /// Viscosity arma_cube viscosity_scgc; - /// O cooling + /// O cooling arma_cube O_cool_scgc; /// NO cooling @@ -225,10 +225,10 @@ class Neutrals { std::vector initial_altitudes; std::vector initial_temperatures; int64_t nInitial_temps = 0; - + /// Number of species to advect: int nSpeciesAdvect; - + /// IDs of species to advect: std::vector species_to_advect; @@ -257,9 +257,9 @@ class Neutrals { \param indices used to help set initial conditions **/ Neutrals(Grid grid, - Planets planet, - Times time, - Indices indices); + Planets planet, + Times time, + Indices indices); /********************************************************************** \brief Creates the variables within the species_chars structure @@ -270,7 +270,7 @@ class Neutrals { /********************************************************************** \brief Read in the planet-specific file - This file specifies the species to model, their masses, + This file specifies the species to model, their masses, diffusion coefficients and all of the other things needed for specifying the neutrals. @@ -285,8 +285,8 @@ class Neutrals { \param indices used to help set initial conditions **/ bool initial_conditions(Grid grid, - Times time, - Indices indices); + Times time, + Indices indices); /********************************************************************** \brief temporary function to set neutral densities with in the model @@ -301,14 +301,14 @@ class Neutrals { \param grid The grid to define the neutrals on **/ void fill_with_hydrostatic(int64_t iStart, - int64_t iEnd, - Grid grid); + int64_t iEnd, + Grid grid); void fill_with_hydrostatic(int64_t iSpecies, - int64_t iStart, - int64_t iEnd, - Grid grid); - + int64_t iStart, + int64_t iEnd, + Grid grid); + /********************************************************************** \brief Limit the density to a floor and a ceiling **/ @@ -324,38 +324,38 @@ class Neutrals { \param grid The grid to define the neutrals on **/ void calc_scale_height(Grid grid); - + /********************************************************************** \brief Calculate the viscosity coefficient **/ void calc_viscosity(); - + /********************************************************************** \brief Calculate the eddy diffusion coefficient in valid pressure **/ void calc_kappa_eddy(); - + /********************************************************************** \brief Calculate the concentration for each species (species ndensity / total ndensity) **/ void calc_concentration(); /********************************************************************** - \brief Calculate the density of each species from the mass concentration + \brief Calculate the density of each species from the mass concentration for each species and rho (ndensity = con * rho / mass) **/ void calc_density_from_mass_concentration(); - + /********************************************************************** \brief Calculate the bulk mean major mass **/ void calc_mean_major_mass(); - + /********************************************************************** \brief Calculate the mean pressure **/ void calc_pressure(); - + /********************************************************************** \brief Calculate bulk velocity **/ @@ -421,8 +421,8 @@ class Neutrals { \param indices used to help set initial conditions **/ bool set_bcs(Grid grid, - Times time, - Indices indices); + Times time, + Indices indices); /********************************************************************** \brief Set lower boundary conditions for the neutrals @@ -431,8 +431,8 @@ class Neutrals { \param indices used to help set initial conditions **/ bool set_lower_bcs(Grid grid, - Times time, - Indices indices); + Times time, + Indices indices); /********************************************************************** \brief Set upper boundary conditions for the neutrals @@ -448,7 +448,7 @@ class Neutrals { \param grid The grid to define the neutrals on **/ bool set_horizontal_bcs(int64_t iDir, Grid grid); - + /********************************************************************** \brief Get the species ID number (int) given the species name (string) \param name string holding the species name (e.g., "O+") @@ -470,7 +470,7 @@ class Neutrals { \param dir directory to write restart files \param DoRead read the restart files if true, write if false **/ - bool restart_file(std::string dir, std::string cGridtype, bool DoRead); + bool restart_file(std::string dir, std::string cGridtype, bool DoRead); /********************************************************************** \brief Exchange messages between processors @@ -482,9 +482,9 @@ class Neutrals { /********************************************************************** \brief add eddy contributions to vertical acceleration \param grid The grid to define the neutrals on - **/ + **/ void vertical_momentum_eddy(Grid &grid); - + /********************************************************************** \brief Exchange one face for the NEUTRALS @@ -503,29 +503,29 @@ class Neutrals { **/ bool exchange_one_face(int iReceiver, int iSender, - precision_t *buffer, - int64_t iTotalSize, - int nG, int iDir); + precision_t *buffer, + int64_t iTotalSize, + int nG, int iDir); bool pack_one_face(int iReceiver, - precision_t *buffer, - int nG, int iDir, - bool IsPole); + precision_t *buffer, + int nG, int iDir, + bool IsPole); bool unpack_one_face(int iSender, - precision_t *buffer, - int nG, int iDir, - bool DoReverseX, - bool DoReverseY, - bool XbecomesY); + precision_t *buffer, + int nG, int iDir, + bool DoReverseX, + bool DoReverseY, + bool XbecomesY); /********************************************************************** - \brief Vertical advection solver - Rusanov + \brief Vertical advection solver - Rusanov \param grid The grid to define the neutrals on \param time contains information about the current time **/ void solver_vertical_rusanov(Grid grid, - Times time); - + Times time); + /********************************************************************** \brief Call the correct vertical advection scheme \param grid The grid to define the neutrals on @@ -542,18 +542,146 @@ class Neutrals { \param vels updated velocity, which acts as a source term for the implicit solve **/ arma_vec calc_friction_one_cell(int64_t iLong, int64_t iLat, int64_t iAlt, - precision_t dt, arma_vec &vels); + precision_t dt, arma_vec &vels); /********************************************************************** \brief Calculate the neutral friction in all cells (calls one_cell above) \param dt time step **/ - void calc_neutral_friction_implicit(precision_t dt); + void calc_neutral_friction_implicit(precision_t dt); /********************************************************************** \brief Calculate the neutral friction coefficients for semi-implicit solver **/ - void calc_neutral_friction_coefs(); + void calc_neutral_friction_coefs(); + + /********************************************************************** + \brief Residuals for **fluid motion** horizontally with Rusanov + \brief It actually updates the weighted residuals (-1/Area*R) for efficiency + + \param grid + \param time + \param states + **/ + std::vector residual_horizontal_rusanov(std::vector& states, + Grid& grid, Times& time, int64_t iAlt); + + /********************************************************************** + \brief Solves for **fluid motion** horizontally with RK4 + + \param grid + \param time + \param report + **/ + void solver_horizontal_RK4(Grid& grid, Times& time); + + /********************************************************************** + \brief Solves for **fluid motion** horizontally with RK1 + + \param grid + \param time + \param report + **/ + void solver_horizontal_RK1(Grid& grid, Times& time); + + /********************************************************************** + \brief Call the correct horizontal advection scheme with CE eqn + \param grid The grid to define the neutrals on + \param time contains information about the current time + **/ + bool advect_horizontal(Grid& grid, Times& time); + + /********************************************************************** + \brief Solves for fluid motion (pure advect) horizontally with Rusanov + + \param grid + \param time + \param report + **/ + void solver_horizontal_rusanov_advection(Grid& grid, Times& time); + + /********************************************************************** + \brief Solves for fluid motion (pure advect) horizontally with RK1 + + \param grid + \param time + \param report + **/ + void solver_horizontal_RK1_advection(Grid& grid, Times& time); + + /********************************************************************** + \brief Solves for fluid motion (pure advect) horizontally with RK2 + + \param grid + \param time + \param report + **/ + void solver_horizontal_RK2_advection(Grid& grid, Times& time); + + /********************************************************************** + \brief Solves for fluid motion (pure advect) horizontally with RK4 + + \param grid + \param time + \param report + **/ + void solver_horizontal_RK4_advection(Grid& grid, Times& time); + + /********************************************************************** + \brief Residuals for fluid motion (pure advect) horizontally with HLLE + \brief It actually updates the weighted residuals (-1/Area*R) for efficiency + + \param grid + \param time + \param states + **/ + std::vector residual_horizontal_hlle_advection( + std::vector& states, Grid& grid, Times& time); + + /********************************************************************** + \brief Residuals for fluid motion (pure advect) horizontally with Rusanov + \brief It actually updates the weighted residuals (-1/Area*R) for efficiency + + \param grid + \param time + \param states + **/ + std::vector residual_horizontal_rusanov_advection( + std::vector& states, Grid& grid, Times& time); + + /********************************************************************** + \brief Call the horizontal advection scheme with only advection + \param grid The grid to define the neutrals on + \param time contains information about the current time + **/ + bool advect_horizontal_advection(Grid& grid, Times& time); + + /********************************************************************** + \brief Setup initial condition for the cosine bell test + \brief For advection test + \param grid The grid to define the neutrals on + \param time contains information about the current time + \param indices used to help set initial conditions + \param planet planet data for extracting the radius + **/ + bool cosine_bell_ic(Grid grid, + Times time, + Indices indices, + Planets planet); + + /********************************************************************** + \brief Setup initial condition for the blob test + \brief For Actual Cubesphere fluid solver + \param grid The grid to define the neutrals on + \param time contains information about the current time + \param indices used to help set initial conditions + \param planet planet data for extracting the radius + **/ + bool blob_ic(Grid grid, + Times time, + Indices indices, + Planets planet); + }; #endif // INCLUDE_NEUTRALS_H_ From 5fe512c5af3ccce96d7474a717407eef25647cfd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:14:46 -0400 Subject: [PATCH 574/691] STY: tabs and spaces + horizontal cubesphere --- include/solvers.h | 122 ++++++++++++++++++++++++++++++---------------- 1 file changed, 79 insertions(+), 43 deletions(-) diff --git a/include/solvers.h b/include/solvers.h index 4e5ebb6f..dd4afe4f 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -21,32 +21,68 @@ struct projection_struct { arma_mat grad_edge_DU; }; -arma_vec limiter_mc(arma_vec &left, arma_vec &right, int64_t nPts, int64_t nGCs); +arma_vec limiter_mc(arma_vec &left, arma_vec &right, int64_t nPts, + int64_t nGCs); arma_vec calc_grad_1d(arma_vec &values, - arma_vec &x, - int64_t nPts, - int64_t nGCs); + arma_vec &x, + int64_t nPts, + int64_t nGCs); arma_mat calc_grad(arma_mat values, arma_mat x, int64_t nGCs, bool DoX); + +projection_struct project_to_edges(arma_mat &values, + arma_mat &x_centers, arma_mat &x_edges, + arma_mat &y_centers, arma_mat &y_edges, + int64_t nGCs); + +namespace Cubesphere_tools { +/* +struct projection_struct { + arma_mat gradLR; + arma_mat gradDU; + arma_mat R; + arma_mat L; + arma_mat U; + arma_mat D; +}; +*/ +arma_vec limiter_mc(arma_vec &left, arma_vec &right, int64_t nPts, + int64_t nGCs); +void print(arma_vec values); +arma_vec calc_grad_1d(arma_vec &values, arma_vec &x, int64_t nPts, + int64_t nGCs); +arma_mat calc_grad(arma_mat values, arma_mat x, int64_t nGCs, bool DoX); + +arma_mat project_from_left(arma_mat values, arma_mat gradients, + arma_mat x_centers, arma_mat x_edges, int64_t nGCs); +arma_mat project_from_right(arma_mat values, arma_mat gradients, + arma_mat x_centers, arma_mat x_edges, int64_t nGCs); +arma_vec limiter_value(arma_vec projected, arma_vec values, int64_t nPts, + int64_t nGCs); +//projection_struct project_to_edges(arma_mat &values, arma_mat &x_centers, +// arma_mat &x_edges, arma_mat &y_centers, arma_mat &y_edges, int64_t nGCs); +} + + void advect(Grid &grid, Times &time, Neutrals &neutrals); arma_vec solver_conduction( - arma_vec value, - arma_vec lambda, - arma_vec front, - arma_vec source, - arma_vec dx, - precision_t dt, - int64_t nGCs, - bool return_diff = false, - arma_vec source2 = arma_vec()); + arma_vec value, + arma_vec lambda, + arma_vec front, + arma_vec source, + arma_vec dx, + precision_t dt, + int64_t nGCs, + bool return_diff = false, + arma_vec source2 = arma_vec()); arma_cube solver_chemistry(arma_cube density, - arma_cube source, - arma_cube loss, - precision_t dt); + arma_cube source, + arma_cube loss, + precision_t dt); std::vector coriolis(std::vector velocity, precision_t rotation_rate, @@ -56,32 +92,32 @@ std::vector coriolis(std::vector velocity, /// or an interpolated value should be used. const int iPrevious_ = 1; const int iNext_ = 2; -const int iClosest_ = 3; +const int iClosest_ = 3; const int iInterp_ = 4; double interpolate_1d(double outX, - std::vector inXs, - std::vector inValues); + std::vector inXs, + std::vector inValues); double interpolate_1d_get_index_doubles(double intime, - std::vector times); + std::vector times); // Overloading the interpolation function: double interpolate_1d_w_index(std::vector values, - double interpolation_index, - int interpolation_type); + double interpolation_index, + int interpolation_type); double interpolate_1d_w_index(std::vector values, - double interpolation_index, - int interpolation_type); + double interpolation_index, + int interpolation_type); double interpolate_1d_w_index(std::vector values, - float interpolation_index, - int interpolation_type); + float interpolation_index, + int interpolation_type); double interpolate_1d_w_index(arma_vec values, - double interpolation_index, - int interpolation_type); + double interpolation_index, + int interpolation_type); fmat interpolate_1d_w_index(std::vector values, - double interpolation_index, - int interpolation_type); + double interpolation_index, + int interpolation_type); arma_cube calc_gradient_lon(arma_cube value, Grid grid); arma_cube calc_gradient_lat(arma_cube value, Grid grid); @@ -113,18 +149,18 @@ precision_t interpolate_unit_cube(const arma_cube &data, const precision_t zRatio); precision_t limiter_mc(precision_t dUp, - precision_t dDown, - precision_t beta); - - - /********************************************************************** - \brief Calculate dt (cell size / cMax) in each direction, and take min - \param dt returns the neutral time-step - \param grid The grid to define the neutrals on - **/ - precision_t calc_dt(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc); + precision_t dDown, + precision_t beta); + + +/********************************************************************** + \brief Calculate dt (cell size / cMax) in each direction, and take min + \param dt returns the neutral time-step + \param grid The grid to define the neutrals on + **/ +precision_t calc_dt(Grid grid, std::vector cMax_vcgc); +precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc); +precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc); +precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc); #endif // INCLUDE_SOLVERS_H_ From 2fd3d917783d14fa090dbc4a9fb71872c436866e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:17:39 -0400 Subject: [PATCH 575/691] FEAT: optimizing --- src/calc_ion_drift.cpp | 44 ++++++++++++++---------------------------- 1 file changed, 15 insertions(+), 29 deletions(-) diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index ab1c6acb..bff5df9a 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -16,7 +16,8 @@ void Ions::calc_efield(Grid grid) { efield_vcgc[iComp] = -efield_vcgc[iComp]; // Remove component along b-field (should be zero, anyways!) - arma_cube edotb = dot_product(efield_vcgc, grid.bfield_unit_vcgc); + arma_cube edotb; + edotb = dot_product(efield_vcgc, grid.bfield_unit_vcgc); for (int64_t iComp = 0; iComp < 3; iComp++) efield_vcgc[iComp] = @@ -28,8 +29,8 @@ void Ions::calc_efield(Grid grid) { // -------------------------------------------------------------------------- void Ions::calc_exb_drift(Grid grid) { - arma_cube bmag2 = - (grid.bfield_mag_scgc) % (grid.bfield_mag_scgc); + arma_cube bmag2; + bmag2 = (grid.bfield_mag_scgc) % (grid.bfield_mag_scgc); exb_vcgc = cross_product(efield_vcgc, grid.bfield_vcgc); for (int64_t iComp = 0; iComp < 3; iComp++) @@ -89,35 +90,20 @@ void Ions::calc_ion_drift(Neutrals neutrals, report.print(5, "going into calc_exb_drift"); calc_exb_drift(grid); - std::vector gravity_vcgc = make_cube_vector(nX, nY, nZ, 3); - std::vector wind_acc = make_cube_vector(nX, nY, nZ, 3); - std::vector total_acc = make_cube_vector(nX, nY, nZ, 3); - std::vector efield_acc = make_cube_vector(nX, nY, nZ, 3); - int64_t iIon, iNeutral, iDim; + int64_t iComp; - std::vector grad_Pi_plus_Pe; - arma_cube rho, nuin, nuin_sum, Nie, sum_rho; - arma_cube top, bottom; - - nuin_sum.set_size(nX, nY, nZ); nuin_sum.zeros(); - - sum_rho.set_size(nX, nY, nZ); sum_rho.zeros(); fill_electrons(); - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp].zeros(); - std::vector a_par = make_cube_vector(nX, nY, nZ, 3); - std::vector a_perp = make_cube_vector(nX, nY, nZ, 3); - std::vector a_x_b; - for (iIon = 0; iIon < nSpecies; iIon++) { - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) species[iIon].perp_velocity_vcgc[iComp].zeros(); if (species[iIon].DoAdvect) { @@ -141,7 +127,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, // Neutral Wind Forcing: report.print(5, "neutral winds"); - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) wind_acc[iComp].zeros(); nuin_sum.zeros(); @@ -150,14 +136,14 @@ void Ions::calc_ion_drift(Neutrals neutrals, nuin = species[iIon].nu_ion_neutral_vcgc[iNeutral]; nuin_sum = nuin_sum + species[iIon].nu_ion_neutral_vcgc[iNeutral]; - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { wind_acc[iComp] = wind_acc[iComp] + nuin % neutrals.velocity_vcgc[iComp]; } } // Total Forcing (sum everything - this is A_s): - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { total_acc[iComp] = - grad_Pi_plus_Pe[iComp] + gravity_vcgc[iComp] @@ -169,7 +155,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, // With a Planetary Magnetic field arma_cube a_dot_b = dot_product(total_acc, grid.bfield_unit_vcgc); - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { a_par[iComp] = a_dot_b % grid.bfield_unit_vcgc[iComp]; a_perp[iComp] = total_acc[iComp] - a_par[iComp]; } @@ -183,7 +169,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, Nie % Nie % grid.bfield_mag_scgc % grid.bfield_mag_scgc; bottom.clamp(1e-32, 1e32); - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { // I redefined A to be an acceleration instead of a force, which // then changes the definition of top top = rho % nuin % a_perp[iComp] + Nie % a_x_b[iComp]; @@ -204,7 +190,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, } } else { // No Planetary Magnetic field - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { a_par[iComp] = total_acc[iComp]; // Steady state: //species[iIon].par_velocity_vcgc[iComp] = @@ -220,7 +206,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, // Calculate the mass-weighted average total velocity sum_rho = sum_rho + rho; - for (int64_t iComp = 0; iComp < 3; iComp++) { + for (iComp = 0; iComp < 3; iComp++) { species[iIon].velocity_vcgc[iComp] = //species[iIon].perp_velocity_vcgc[iComp] + species[iIon].par_velocity_vcgc[iComp]; @@ -232,7 +218,7 @@ void Ions::calc_ion_drift(Neutrals neutrals, } // for iIon - for (int64_t iComp = 0; iComp < 3; iComp++) + for (iComp = 0; iComp < 3; iComp++) velocity_vcgc[iComp] = velocity_vcgc[iComp] / sum_rho; report.exit(function); From bb59b824e334d19f930665a1a8c537699cb757dd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:18:43 -0400 Subject: [PATCH 576/691] FEAT: advection neutrals horizontal --- src/inputs.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index 703c0517..c8e385d3 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -551,9 +551,8 @@ precision_t Inputs::get_dt_output(int iOutput) { if (iOutput < nOutputs) value = settings.at("Outputs").at("dt").at(iOutput); - else{ + else report.error("Output Error; more output types than dt's provided."); - } return value; } @@ -779,7 +778,8 @@ bool Inputs::get_do_ionization_heating() { // ----------------------------------------------------------------------- bool Inputs::get_do_electron_ion_collisional_heating() { - return get_setting_bool("Sources", "Ions", "IncludeElectronIonCollisionalHeating"); + return get_setting_bool("Sources", "Ions", + "IncludeElectronIonCollisionalHeating"); } // ----------------------------------------------------------------------- @@ -787,7 +787,8 @@ bool Inputs::get_do_electron_ion_collisional_heating() { // ----------------------------------------------------------------------- bool Inputs::get_do_electron_neutral_elastic_collisional_heating() { - return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralElasticCollisionalHeating"); + return get_setting_bool("Sources", "Ions", + "IncludeElectronNeutralElasticCollisionalHeating"); } // ----------------------------------------------------------------------- @@ -795,7 +796,8 @@ bool Inputs::get_do_electron_neutral_elastic_collisional_heating() { // ----------------------------------------------------------------------- bool Inputs::get_do_electron_neutral_inelastic_collisional_heating() { - return get_setting_bool("Sources", "Ions", "IncludeElectronNeutralInelasticCollisionalHeating"); + return get_setting_bool("Sources", "Ions", + "IncludeElectronNeutralInelasticCollisionalHeating"); } // ----------------------------------------------------------------------- @@ -1200,6 +1202,10 @@ std::string Inputs::get_advection_neutrals_vertical() { return get_setting_str("Advection", "Neutrals", "Vertical"); } +std::string Inputs::get_advection_neutrals_horizontal() { + return get_setting_str("Advection", "Neutrals", "Horizontal"); +} + std::string Inputs::get_advection_ions_along() { return get_setting_str("Advection", "Ions", "Along"); } From 4038fe38f3c2f2641549c3469dc6877ab73e526c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:19:28 -0400 Subject: [PATCH 577/691] FEAT: optimizing --- src/ions.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/ions.cpp b/src/ions.cpp index 075c8df0..bb372a33 100644 --- a/src/ions.cpp +++ b/src/ions.cpp @@ -107,6 +107,25 @@ Ions::Ions(Grid grid, Planets planet) { velocity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); cMax_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + // Some variables that will be used in calc_ion_v: + gravity_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); + wind_acc = make_cube_vector(nLons, nLats, nAlts, 3); + total_acc = make_cube_vector(nLons, nLats, nAlts, 3); + efield_acc = make_cube_vector(nLons, nLats, nAlts, 3); + a_par = make_cube_vector(nLons, nLats, nAlts, 3); + a_perp = make_cube_vector(nLons, nLats, nAlts, 3); + a_x_b = make_cube_vector(nLons, nLats, nAlts, 3); + grad_Pi_plus_Pe = make_cube_vector(nLons, nLats, nAlts, 3); + rho.set_size(nLons, nLats, nAlts); + nuin.set_size(nLons, nLats, nAlts); + nuin_sum.set_size(nLons, nLats, nAlts); + Nie.set_size(nLons, nLats, nAlts); + sum_rho.set_size(nLons, nLats, nAlts); + top.set_size(nLons, nLats, nAlts); + bottom.set_size(nLons, nLats, nAlts); + + + Cv_scgc.set_size(nLons, nLats, nAlts); Cv_scgc.zeros(); lambda.set_size(nLons, nLats, nAlts); @@ -260,7 +279,7 @@ void Ions::nan_test(std::string variable) { // Checks for nans and +/- infinities in density, temp, and velocity //---------------------------------------------------------------------- -bool Ions::check_for_nonfinites() { +bool Ions::check_for_nonfinites(std::string location) { bool didWork = true; if (!all_finite(density_scgc, "density_scgc") || @@ -269,7 +288,7 @@ bool Ions::check_for_nonfinites() { didWork = false; if (!didWork) - throw std::string("Check for nonfinites failed!!!\n"); + report.error("ions are nan from location : " + location); return didWork; } @@ -495,7 +514,7 @@ void Ions::fill_electrons() { // Will return nSpecies for electrons //---------------------------------------------------------------------- -int Ions::get_species_id(const std::string &name) const{ +int Ions::get_species_id(const std::string &name) const { std::string function = "Ions::get_species_id"; static int iFunction = -1; From 066f57a1ecb849cfeb141cdb18c99d1d52c88d61 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:20:06 -0400 Subject: [PATCH 578/691] STY: spaces and tabs --- src/main/main.cpp | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 9d0a0a3f..c290c84b 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -9,7 +9,7 @@ // ----------------------------------------------------------------------------- int main() { - + int iErr = 0; std::string sError; bool didWork = true; @@ -24,6 +24,7 @@ int main() { try { // Create inputs (reading the input file): input = Inputs(time); + if (!input.is_ok()) throw std::string("input initialization failed!"); @@ -31,32 +32,37 @@ int main() { report.print(-1, "Hello " + input.get_student_name() + " - welcome to Aether!"); - // For now, the number of processors and blocks are set by the + // For now, the number of processors and blocks are set by the // neutral grid shape, since this could be sphere (1 root) or // cubesphere (6 root) Quadtree quadtree(input.get_grid_shape("neuGrid")); Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); + if (!quadtree.is_ok()) throw std::string("quadtree initialization failed!"); // Initialize MPI and parallel aspects of the code: didWork = init_parallel(quadtree, quadtree_ion); + if (!didWork) throw std::string("init_parallel failed!"); // Everything should be set for the inputs now, so write a restart file: didWork = input.write_restart(); + if (!didWork) throw std::string("input.write_restart failed!"); // Initialize the EUV system: Euv euv; + if (!euv.is_ok()) throw std::string("EUV initialization failed!"); // Initialize the planet: Planets planet; MPI_Barrier(aether_comm); + if (!planet.is_ok()) throw std::string("planet initialization failed!"); @@ -64,6 +70,7 @@ int main() { Indices indices; didWork = read_and_store_indices(indices); MPI_Barrier(aether_comm); + if (!didWork) throw std::string("read_and_store_indices failed!"); @@ -74,6 +81,7 @@ int main() { Grid gGrid("neuGrid"); didWork = gGrid.init_geo_grid(quadtree, planet); MPI_Barrier(aether_comm); + if (!didWork) throw std::string("init_geo_grid failed!"); @@ -92,6 +100,7 @@ int main() { if (mGrid.iGridShape_ == mGrid.iDipole_) { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); + if (!didWork) throw std::string("init_dipole_grid failed!"); } else { @@ -124,9 +133,12 @@ int main() { if (input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites("After Inputs"); + if (!didWork) throw std::string("NaNs found in Neutrals in Initialize!\n"); - didWork = ions.check_for_nonfinites(); + + didWork = ions.check_for_nonfinites("NaNs found in Ions in Initialize!\n"); + if (!didWork) throw std::string("NaNs found in Ions in Initialize!\n"); } @@ -152,9 +164,12 @@ int main() { // Initialize electrodynamics and check if electrodynamics times // works with input time Electrodynamics electrodynamics(time); + if (!electrodynamics.is_ok()) throw std::string("electrodynamics on geo grid initialization failed!"); + Electrodynamics electrodynamicsMag(time); + if (!electrodynamicsMag.is_ok()) throw std::string("electrodynamics on mag grid initialization failed!"); @@ -172,6 +187,7 @@ int main() { didWork = output(neutrals, ions, gGrid, time, planet); didWork = output(neutralsMag, ionsMag, mGrid, time, planet); } + if (!didWork) throw std::string("Initial output failed!"); @@ -232,14 +248,18 @@ int main() { if (!time.check_time_gate(input.get_dt_write_restarts())) { report.print(3, "Writing restart files"); - didWork = neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); - didWork = neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); + didWork = neutrals.restart_file(input.get_restartout_dir(), + gGrid.get_gridtype(), DoWrite); + didWork = neutralsMag.restart_file(input.get_restartout_dir(), + mGrid.get_gridtype(), DoWrite); if (!didWork) throw std::string("Writing Restart for Neutrals Failed!!!\n"); - didWork = ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); - didWork = ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); + didWork = ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), + DoWrite); + didWork = ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), + DoWrite); if (!didWork) throw std::string("Writing Restart for Ions Failed!!!\n"); From afb783b8376dd722554f32ada74e90da716f6e18 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:21:03 -0400 Subject: [PATCH 579/691] FEAT: allow horizontal advection --- src/neutrals_advect.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index a80dc274..8316cbeb 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -33,3 +33,41 @@ bool Neutrals::advect_vertical(Grid grid, Times time) { return didWork; } +bool Neutrals::advect_horizontal(Grid & grid, Times & time) { + bool didWork = true; + + std::string function = "Neutrals::advance_horizontal"; + static int iFunction = -1; + report.enter(function, iFunction); + + if (input.get_advection_neutrals_horizontal() == "advect_test") + solver_horizontal_RK4_advection(grid, time); + else if (input.get_advection_neutrals_horizontal() == "fv") { + solver_horizontal_RK1(grid, time); + + std::cout << "after rk1 : " << velocity_vcgc[0](20, 13, 10) << "\n"; + } else { + std::cout << "Horizontal solver not found!\n"; + std::cout << " ==> Requested : " + << input.get_advection_neutrals_horizontal() + << "\n"; + didWork = false; + } + + report.exit(function); + return didWork; +} + +bool Neutrals::advect_horizontal_advection(Grid & grid, Times & time) { + bool didWork = true; + + std::string function = "Neutrals::advance_horizontal_advection"; + static int iFunction = -1; + report.enter(function, iFunction); + + //solver_horizontal_rusanov_advection(grid, time); + solver_horizontal_RK4_advection(grid, time); + + report.exit(function); + return didWork; +} From 2ac8e4f15c737fa8a76e10f25ef39c1e307d4e3a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:21:49 -0400 Subject: [PATCH 580/691] FEAT: add bell test ICs for advection --- src/neutrals_ics.cpp | 216 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 216 insertions(+) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 225eeb19..7b9613ba 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -200,5 +200,221 @@ bool Neutrals::initial_conditions(Grid grid, return didWork; } +bool Neutrals::cosine_bell_ic(Grid grid, + Times time, + Indices indices, + Planets planet) { + std::string function = "Neutrals::cosine_bell_ic"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Planet.get_radius() takes in latitude + // but at current stage is unimplemented + // Anyway, we use equator radius as assumption for CubeSphere + // CubeSphere must be a perfect sphere!! + precision_t planet_R = planet.get_radius(0); + + // radius of planet + altitude + // just pick alt at (0,0) loction + arma_vec R_Alts = grid.geoAlt_scgc.tube(0, 0) + planet_R; + + + /** Get a bunch of constants for setting up the ic **/ + precision_t R = R_Alts(2); // select R in the middle + //7.37128e+06 meters Earth radius + 1000km height + //std::cout << R << std::endl; + + // Determine flow direction + // 0 - Equatorial + // pi/2 - Meridional + // pi/4 - NE direction + precision_t alpha_0 = 0.; + + // Scaling factor for physical velocity + // 12 day period in miliseconds + precision_t u_0 = cTWOPI * R / (12.*24.*60.*60.); + + // Radius of the cosine bell + precision_t r_0 = R / 3.; + + // Center of the cosine bell + precision_t lon_0 = 7.*cPI / 4. + cPI / 8; + precision_t lat_0 = 0.; + + // Maximum height for the cosine bell + precision_t h_0 = 1000.; + + // Some grid dimensions and coordinates + int64_t nLats = grid.get_nLats(); + int64_t nLons = grid.get_nLons(); + int64_t nAlts = grid.get_nAlts(); + arma_mat lat_grid = grid.geoLat_scgc.slice(2); + arma_mat lon_grid = grid.geoLon_scgc.slice(2); + + // Calculate for physical velocity for every altitude + // First we prepare velocities for one slice + arma_mat slice_u = velocity_vcgc[0].slice(2); + arma_mat slice_v = velocity_vcgc[1].slice(2); + + // Fill velocities in one slice + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { + precision_t curr_lat = lat_grid(iLon, iLat); + precision_t curr_lon = lon_grid(iLon, iLat); + slice_u(iLon, iLat) = u_0 * (cos(alpha_0) * cos(curr_lat) + sin(alpha_0) * cos( + curr_lon) * sin(curr_lat)); + slice_v(iLon, iLat) = -u_0 * sin(alpha_0) * sin(curr_lon); + } + } + + // Update this slice of velocity to all slices (for completeness) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { + velocity_vcgc[0].slice(iAlt) = slice_u; + velocity_vcgc[1].slice(iAlt) = slice_v; + } + + // Calculate the cosine bell or rho_scgc + // First, again take a slice + arma_mat slice_rho = rho_scgc.slice(2); + + // Fill rho in one slice + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { + precision_t curr_lat = lat_grid(iLon, iLat); + precision_t curr_lon = lon_grid(iLon, iLat); + + // Calculate great circle distance + precision_t dlon_2 = (curr_lon - lon_0) / 2.0; + precision_t dlat_2 = (curr_lat - lat_0) / 2.0; + + precision_t r_d = 2.0 * R * asin(sqrt(sin(dlat_2) * sin(dlat_2) + sin( + dlon_2) * sin(dlon_2) * cos(curr_lat) * cos(lat_0))); + + if (r_d < r_0) + slice_rho(iLon, iLat) = (h_0 / 2) * (1 + cos(cPI * r_d / r_0)); + + else + slice_rho(iLon, iLat) = 0.; + } + } + + // Update this slice of rho to all slices (for completeness) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { + rho_scgc.slice(iAlt) = slice_rho; + + // Do zero concentration conversion + for (int64_t iSpec = 0; iSpec < nSpecies; iSpec++) + species[iSpec].density_scgc.slice(iAlt) = slice_rho / species[iSpec].mass; + } + + // Add some velocity pertubation + //std::cout << velocity_vcgc[0].slice(2) << std::endl; + //std::cout << rho_scgc.slice(2) << std::endl; + + return 1; +} + +bool Neutrals::blob_ic(Grid grid, + Times time, + Indices indices, + Planets planet) { + std::string function = "Neutrals::blob_ic"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Planet.get_radius() takes in latitude + // but at current stage is unimplemented + // Anyway, we use equator radius as assumption for CubeSphere + // CubeSphere must be a perfect sphere!! + precision_t planet_R = planet.get_radius(0); + + // radius of planet + altitude + // just pick alt at (0,0) loction + arma_vec R_Alts = grid.geoAlt_scgc.tube(0, 0) + planet_R; + + + /** Get a bunch of constants for setting up the ic **/ + precision_t R = R_Alts(2); // select R in the middle + //7.37128e+06 meters Earth radius + 1000km height + //std::cout << R << std::endl; + + // Radius of the blob + // Hardcoded + precision_t r_0 = 111321 * 10; + + // Center of the blob + precision_t lon_0 = 7.*cPI / 4. - cPI / 8.; + precision_t lat_0 = 0.; + + // Some grid dimensions and coordinates + int64_t nLats = grid.get_nLats(); + int64_t nLons = grid.get_nLons(); + int64_t nAlts = grid.get_nAlts(); + arma_mat lat_grid = grid.geoLat_scgc.slice(2); + arma_mat lon_grid = grid.geoLon_scgc.slice(2); + + // Calculate for physical velocity for every altitude + // First we prepare velocities for one slice + arma_mat slice_u = velocity_vcgc[0].slice(2); + arma_mat slice_v = velocity_vcgc[1].slice(2); + + // Fill velocities in one slice + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { + slice_u(iLon, iLat) = 0.; + slice_v(iLon, iLat) = 0.; + } + } + + // Update this slice of velocity to all slices (for completeness) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { + velocity_vcgc[0].slice(iAlt) = slice_u; + velocity_vcgc[1].slice(iAlt) = slice_v; + } + + // Calculate the cosine bell or rho_scgc + // First, again take a slice + arma_mat slice_rho = rho_scgc.slice(2); + + // Fill rho in one slice + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { + precision_t curr_lat = lat_grid(iLon, iLat); + precision_t curr_lon = lon_grid(iLon, iLat); + + // Calculate great circle distance + precision_t dlon_2 = (curr_lon - lon_0) / 2.0; + precision_t dlat_2 = (curr_lat - lat_0) / 2.0; + + precision_t r_d = 2.0 * R * asin(sqrt(sin(dlat_2) * sin(dlat_2) + sin( + dlon_2) * sin(dlon_2) * cos(curr_lat) * cos(lat_0))); + + if (r_d < r_0) + slice_rho(iLon, iLat) = 5e-12; + + else + slice_rho(iLon, iLat) = 1e-12; + } + } + + // Update this slice of rho to all slices (for completeness) + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) { + rho_scgc.slice(iAlt) = slice_rho; + + // Do zero concentration conversion + for (int64_t iSpec = 0; iSpec < nSpecies; iSpec++) + species[iSpec].density_scgc.slice(iAlt) = slice_rho / species[iSpec].mass; + } + + // Temperature setup + for (int64_t iAlt = 0; iAlt < nAlts; iAlt++) + temperature_scgc.slice(iAlt) = 600.*arma_mat(nLons, nLats, fill::ones); + + // Add some velocity pertubation + //std::cout << velocity_vcgc[0].slice(2) << std::endl; + //std::cout << rho_scgc.slice(2) << std::endl; + + return 1; +} From ed1632a443ab7a10624cb880ee513b6f4a2f7ad2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:22:40 -0400 Subject: [PATCH 581/691] FEAT: horizontal solver for cubesphere --- src/solver_horizontal_cubesphere.cpp | 861 ++++++++++++++++++++++++++- 1 file changed, 860 insertions(+), 1 deletion(-) diff --git a/src/solver_horizontal_cubesphere.cpp b/src/solver_horizontal_cubesphere.cpp index ebce8b2c..88d491b9 100644 --- a/src/solver_horizontal_cubesphere.cpp +++ b/src/solver_horizontal_cubesphere.cpp @@ -3,4 +3,863 @@ // Initial version: F. Cheng, July 2023 -#include "../include/aether.h" \ No newline at end of file +#include "aether.h" + +// using namespace Cubesphere_tools; + +std::vector Neutrals::residual_horizontal_rusanov( + std::vector& states, + Grid& grid, + Times& time, + int64_t iAlt) { + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = states[0]; + + /* VELOCITY */ + // Get contravariant velocity + //arma_mat xVel = states[1]; // u^1 + //arma_mat yVel = states[2]; // u^2 + + // Generate contravriant momentum + arma_mat xMomentum = states[1]; // x1momentum + arma_mat yMomentum = states[2]; // x2momentum + + // Resolve to contravariant velocity + arma_mat xVel = xMomentum / rho; // u^1 + arma_mat yVel = yMomentum / rho; // u^2 + + // Generate velocity magnitude squared + arma_mat vel2 = xVel % xVel + yVel % yVel; + + /* TEMP and ENERGY */ + // Generate total energy (rhoE) (TODO: Verify) + arma_mat rhoE = states[3]; + + /** Advancing **/ + /* Initialize projection constructs and storages */ + projection_struct rhoP; + projection_struct xMomentumP; + projection_struct yMomentumP; + projection_struct rhoEP; + projection_struct gammaP; + projection_struct tempP; + projection_struct numberDensityP; + + // They are all pure scalar fields without sqrt(g) + arma_mat rhoL, rhoR, rhoD, rhoU; + arma_mat xVelL, xVelR, xVelD, xVelU; + arma_mat yVelL, yVelR, yVelD, yVelU; + arma_mat totalEL, totalER, totalED, totalEU; + + arma_mat velL2, velR2, velD2, velU2; + arma_mat internaleL, internaleR, internaleD, internaleU; + arma_mat pressureL, pressureR, pressureD, pressureU; + + /** Initialize Flux and Wave Speed Storages */ + arma_mat eq1FluxLR, eq1FluxDU; + arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + + arma_mat eq2FluxLR, eq2FluxDU; + arma_mat eq2FluxL, eq2FluxR, eq2FluxD, eq2FluxU; + + arma_mat eq3FluxLR, eq3FluxDU; + arma_mat eq3FluxL, eq3FluxR, eq3FluxD, eq3FluxU; + + arma_mat eq4FluxLR, eq4FluxDU; + arma_mat eq4FluxL, eq4FluxR, eq4FluxD, eq4FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat diff; // for Riemann Solver + + /* Projection */ + rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); + xMomentumP = project_to_edges(xMomentum, x, xEdges, y, yEdges, nGCs); + yMomentumP = project_to_edges(yMomentum, x, xEdges, y, yEdges, nGCs); + rhoEP = project_to_edges(rhoE, x, xEdges, y, yEdges, nGCs); + // Also need to project gamma and temp - these should be passed, since + // they need to be updated for the RK4 scheme: + gammaP = project_to_edges(gamma_scgc.slice(iAlt), x, xEdges, y, yEdges, nGCs); + tempP = project_to_edges(temperature_scgc.slice(iAlt), x, xEdges, y, yEdges, + nGCs); + numberDensityP = project_to_edges(density_scgc.slice(iAlt), x, xEdges, y, + yEdges, + nGCs); + + // Resolve Scalar Fields into rho, xVel, yVel, and totalE (without rho) + rhoL = rhoP.L; + rhoR = rhoP.R; + rhoD = rhoP.D; + rhoU = rhoP.U; + + xVelL = xMomentumP.L / rhoL; + xVelR = xMomentumP.R / rhoR; + xVelD = xMomentumP.D / rhoD; + xVelU = xMomentumP.U / rhoU; + + yVelL = yMomentumP.L / rhoL; + yVelR = yMomentumP.R / rhoR; + yVelD = yMomentumP.D / rhoD; + yVelU = yMomentumP.U / rhoU; + + totalEL = rhoEP.L / rhoL; + totalER = rhoEP.R / rhoR; + totalED = rhoEP.D / rhoD; + totalEU = rhoEP.U / rhoU; + + velL2 = xVelL % xVelL + yVelL % yVelL; + velR2 = xVelR % xVelR + yVelR % yVelR; + velD2 = xVelD % xVelD + yVelD % yVelD; + velU2 = xVelU % xVelU + yVelU % yVelU; + + internaleL = totalEL - 0.5 * velL2; + internaleR = totalER - 0.5 * velR2; + internaleD = totalED - 0.5 * velD2; + internaleU = totalEU - 0.5 * velU2; + + //pressureL = (gammaP.L - 1) % (rhoP.L % internaleL); + //pressureR = (gammaP.R - 1) % (rhoP.R % internaleR); + //pressureD = (gammaP.D - 1) % (rhoP.D % internaleD); + //pressureU = (gammaP.U - 1) % (rhoP.U % internaleU); + + pressureL = cKB * (numberDensityP.L % tempP.L); + pressureR = cKB * (numberDensityP.R % tempP.R); + pressureD = cKB * (numberDensityP.D % tempP.D); + pressureU = cKB * (numberDensityP.U % tempP.U); + + /* Calculate Edge Fluxes */ + // Note that dot product between normal vector at edge and flux vector + // resolves into a pure one component flux or either hat{x} or hat{y} + // Flux calculated from the left of the edge + eq1FluxL = rhoL % xVelL % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the right of the edge + eq1FluxR = rhoR % xVelR % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the down of the edge + eq1FluxD = rhoD % yVelD % grid.sqrt_g_Down.slice(iAlt); + // Flux calculated from the up of the edge + eq1FluxU = rhoU % yVelU % grid.sqrt_g_Down.slice(iAlt); + /* + eq2FluxL = (rhoL % xVelL % xVelL + + pressureL % grid.g11_upper_Left.slice(iAlt)) % + grid.sqrt_g_Left.slice(iAlt); + eq2FluxR = (rhoR % xVelR % xVelR + + pressureR % grid.g11_upper_Left.slice(iAlt)) % + grid.sqrt_g_Left.slice(iAlt); + eq2FluxD = (rhoD % yVelD % xVelD + + pressureD % grid.g12_upper_Down.slice(iAlt)) % + grid.sqrt_g_Down.slice(iAlt); + eq2FluxU = (rhoU % yVelU % xVelU + + pressureU % grid.g12_upper_Down.slice(iAlt)) % + grid.sqrt_g_Down.slice(iAlt); + */ + eq2FluxL = (rhoL % xVelL % xVelL + + pressureL) % + grid.sqrt_g_Left.slice(iAlt); + eq2FluxR = (rhoR % xVelR % xVelR + + pressureR) % + grid.sqrt_g_Left.slice(iAlt); + eq2FluxD = (rhoD % yVelD % xVelD + + pressureD) % + grid.sqrt_g_Down.slice(iAlt); + eq2FluxU = (rhoU % yVelU % xVelU + + pressureU) % + grid.sqrt_g_Down.slice(iAlt); + /* + eq3FluxL = (rhoL % xVelL % yVelL + + pressureL % grid.g21_upper_Left.slice(iAlt)) % + grid.sqrt_g_Left.slice(iAlt); + eq3FluxR = (rhoR % xVelR % yVelR + + pressureR % grid.g21_upper_Left.slice(iAlt)) % + grid.sqrt_g_Left.slice(iAlt); + eq3FluxD = (rhoD % yVelD % yVelD + + pressureD % grid.g22_upper_Down.slice(iAlt)) % + grid.sqrt_g_Down.slice(iAlt); + eq3FluxU = (rhoU % yVelU % yVelU + + pressureU % grid.g22_upper_Down.slice(iAlt)) % + grid.sqrt_g_Down.slice(iAlt); + */ + eq3FluxL = (rhoL % xVelL % yVelL + + pressureL) % + grid.sqrt_g_Left.slice(iAlt); + eq3FluxR = (rhoR % xVelR % yVelR + + pressureR) % + grid.sqrt_g_Left.slice(iAlt); + eq3FluxD = (rhoD % yVelD % yVelD + + pressureD) % + grid.sqrt_g_Down.slice(iAlt); + eq3FluxU = (rhoU % yVelU % yVelU + + pressureU) % + grid.sqrt_g_Down.slice(iAlt); + + eq4FluxL = (rhoEP.L + pressureL) % xVelL % grid.sqrt_g_Left.slice(iAlt); + eq4FluxR = (rhoEP.R + pressureR) % xVelR % grid.sqrt_g_Left.slice(iAlt); + eq4FluxD = (rhoEP.D + pressureD) % yVelD % grid.sqrt_g_Down.slice(iAlt); + eq4FluxU = (rhoEP.U + pressureU) % yVelU % grid.sqrt_g_Down.slice(iAlt); + + /* Wave Speed Calculation */ + wsL = sqrt(velL2) + sqrt(gammaP.L % (gammaP.L - 1.) % tempP.L); + wsR = sqrt(velR2) + sqrt(gammaP.R % (gammaP.R - 1.) % tempP.R); + wsD = sqrt(velD2) + sqrt(gammaP.D % (gammaP.D - 1.) % tempP.D); + wsU = sqrt(velU2) + sqrt(gammaP.U % (gammaP.U - 1.) % tempP.U); + + //wsL = abs(xVelL) + sqrt(gammaP.L % (gammaP.L - 1.) % internaleL); + //wsR = abs(xVelR) + sqrt(gammaP.R % (gammaP.R - 1.) % internaleR); + //wsD = abs(yVelD) + sqrt(gammaP.D % (gammaP.D - 1.) % internaleD); + //wsU = abs(yVelU) + sqrt(gammaP.U % (gammaP.U - 1.) % internaleU); + + // Find the maximum wave speed + wsLR = wsR; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); + } + } + + /* Calculate average flux at the edges (Rusanov Flux) */ + /* Why is it + instead of - for the state difference? + * Because the projection actually works backwards + * Left states are actually right + * Right states are actually left + * Due to the convention in the past codes + * We keep it this way for consistency + */ + + // State difference, need to add sqrt(g) + diff = (rhoR - rhoL) % grid.sqrt_g_Left.slice(iAlt); + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU - rhoD) % grid.sqrt_g_Down.slice(iAlt); + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + if (iAlt == -1) { + std::cout << "in solver: " << iProc << " " << + wsDU(13, 23) << " " << + wsU(13, 23) << " " << + wsD(13, 23) << " " << + gammaP.D(13, 23) << " " << + internaleD(13, 23) << " " << + gammaP.U(14, 23) << " " << + internaleU(13, 23) << " " << + diff(13, 22) << "\n"; + } + + diff = (rhoR % xVelR - rhoL % xVelL) % grid.sqrt_g_Left.slice(iAlt); + eq2FluxLR = (eq2FluxL + eq2FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU % xVelU - rhoD % xVelD) % grid.sqrt_g_Down.slice(iAlt); + eq2FluxDU = (eq2FluxD + eq2FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (rhoR % yVelR - rhoL % yVelL) % grid.sqrt_g_Left.slice(iAlt); + eq3FluxLR = (eq3FluxL + eq3FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU % yVelU - rhoD % yVelD) % grid.sqrt_g_Down.slice(iAlt); + eq3FluxDU = (eq3FluxD + eq3FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (rhoR % totalER - rhoL % totalEL) % grid.sqrt_g_Left.slice(iAlt); + eq4FluxLR = (eq4FluxL + eq4FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU % totalEU - rhoD % totalED) % grid.sqrt_g_Down.slice(iAlt); + eq4FluxDU = (eq4FluxD + eq4FluxU) / 2 + 0.5 * wsDU % diff; + + // Setup residual storage for return + arma_mat eq1_residual(nXs, nYs, fill::zeros); + arma_mat eq2_residual(nXs, nYs, fill::zeros); + arma_mat eq3_residual(nXs, nYs, fill::zeros); + arma_mat eq4_residual(nXs, nYs, fill::zeros); + + // State Update + // Note the ghost cells WILL NOT BE UPDATED + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + precision_t rhoResidual_ij = dx * eq1FluxLR(i + 1, j) - + dx * eq1FluxLR(i, j) + + dx * eq1FluxDU(i, j + 1) - + dx * eq1FluxDU(i, j); + eq1_residual(i, j) = -1 / area * rhoResidual_ij; + precision_t xMomentumResidual_ij = dx * eq2FluxLR(i + 1, j) - + dx * eq2FluxLR(i, j) + + dx * eq2FluxDU(i, j + 1) - + dx * eq2FluxDU(i, j); + eq2_residual(i, j) = -1 / area * xMomentumResidual_ij; + precision_t yMomentumResidual_ij = dx * eq3FluxLR(i + 1, j) - + dx * eq3FluxLR(i, j) + + dx * eq3FluxDU(i, j + 1) - + dx * eq3FluxDU(i, j); + eq3_residual(i, j) = -1 / area * yMomentumResidual_ij; + precision_t rhoEResidual_ij = dx * eq4FluxLR(i + 1, j) - + dx * eq4FluxLR(i, j) + + dx * eq4FluxDU(i, j + 1) - + dx * eq4FluxDU(i, j); + eq4_residual(i, j) = -1 / area * rhoEResidual_ij; + } + } + + if (iAlt == -1) { + std::cout << "in solver2: " << iProc << " " << + eq1_residual(13, 22) << " " << + eq2_residual(13, 22) << " " << + eq3_residual(13, 22) << " " << + eq4_residual(13, 22) << " " << + area << "\n"; + } + + + // Setup return vector + std::vector return_vector; + return_vector.push_back(eq1_residual); + return_vector.push_back(eq2_residual); + return_vector.push_back(eq3_residual); + return_vector.push_back(eq4_residual); + + return return_vector; +} + +void Neutrals::solver_horizontal_RK1(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK1"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + arma_mat x(nXs, nYs), y(nXs, nYs); + arma_mat jacobian(nXs, nYs), rho(nXs, nYs), rhoE(nXs, nYs), vel2(nXs, nYs); + arma_mat uVel(nXs, nYs), vVel(nXs, nYs), xVel(nXs, nYs), yVel(nXs, nYs); + arma_mat xMomentum(nXs, nYs), yMomentum(nXs, nYs); + arma_mat xMomentum_0(nXs, nYs), yMomentum_0(nXs, nYs); + arma_mat rho_0(nXs, nYs), rhoE_0(nXs, nYs); + arma_mat f_0_eq1(nXs, nYs), f_0_eq2(nXs, nYs); + arma_mat f_0_eq3(nXs, nYs), f_0_eq4(nXs, nYs); + + calc_concentration(); + + // Advance for bulk calculation first, calculate for every altitude + + std::cout << "nAlts : " << nAlts << "\n"; + + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + std::cout << "iAlt : " << iAlt << "\n"; + /** Extract Grid Features **/ + x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + uVel = velocity_vcgc[0].slice(iAlt); + vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + vel2 = xVel % xVel + yVel % yVel; + // Generate contravriant momentum (no sqrt(g)) + xMomentum = rho % xVel; // x1momentum + yMomentum = rho % yVel; // x2momentum + + /* TEMP and ENERGY */ + // Generate total energy (rhoE (no sqrt(g))) + // (TODO: Verify units) + rhoE = rho % (temperature_scgc.slice(iAlt) % Cv_scgc.slice( + iAlt) + 0.5 * vel2); + + + if (iAlt == -1) { + std::cout << "before solve: " << iProc << " " << temperature_scgc(13, 22, + 2) << " " << + rhoE(13, 22) << " " << xVel(13, 22) << " " << yVel(13, 22) << " " << + rho_scgc(13, 22, 2) << "\n"; + } + + if (iAlt == -2) { + std::cout << "before solve: " << + temperature_scgc(13, 22, 2) << " " << + xVel(13, 22) << " " << yVel(13, 22) << " " << + rho_scgc(13, 22, 2) << "\n"; + } + + + /** Advancing with RK4 **/ + // Setup Containers + rho_0 = rho; + xMomentum_0 = xMomentum; + yMomentum_0 = yMomentum; + rhoE_0 = rhoE; + + // FIRST (1) STEP, Compute F_0-> State_1 + // Pass in state vector + std::vector state_0; + state_0.push_back(rho_0); + state_0.push_back(xMomentum_0); + state_0.push_back(yMomentum_0); + state_0.push_back(rhoE_0); + std::vector f_0_vec = residual_horizontal_rusanov(state_0, grid, time, + iAlt); + // Extract Gradients + f_0_eq1 = f_0_vec[0]; + f_0_eq2 = f_0_vec[1]; + f_0_eq3 = f_0_vec[2]; + f_0_eq4 = f_0_vec[3]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho(i, j) = rho_0(i, j) + dt * f_0_eq1(i, j) / jacobian(i, j); + xMomentum(i, j) = xMomentum_0(i, j) - dt * f_0_eq2(i, j) / jacobian(i, j); + yMomentum(i, j) = yMomentum_0(i, j) - dt * f_0_eq3(i, j) / jacobian(i, j); + rhoE(i, j) = rhoE_0(i, j) + dt * f_0_eq4(i, j) / jacobian(i, j); + } + } + + if (iAlt == -1) { + std::cout << "after solve: " << iProc << " " << + dt << " " << + f_0_eq1(13, 22) << " " << + f_0_eq2(13, 22) << " " << + f_0_eq3(13, 22) << " " << + f_0_eq4(13, 22) << " " << + rhoE(13, 22) << " " << xMomentum(13, 22) << " " << yMomentum(13, 22) << " " << + rho_scgc(13, 22, 2) << "\n"; + } + + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + xVel = xMomentum / rho; // u^1 + yVel = yMomentum / rho; // u^2 + vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + + if (iProc == 0 && iAlt == -2) { + std::cout << "a11 : " << grid.A11_scgc(13, 20, 2) << " " + << grid.A12_scgc(13, 20, 2) << "\n"; + std::cout << "inv : " << grid.A11_inv_scgc(13, 20, 2) << " " + << grid.A12_inv_scgc(13, 20, 2) << "\n"; + } + + velocity_vcgc[0].slice(iAlt) = xVel % grid.A11_scgc.slice( + iAlt) + yVel % grid.A12_scgc.slice(iAlt); + velocity_vcgc[1].slice(iAlt) = + xVel % grid.A21_scgc.slice(iAlt) + + yVel % grid.A22_scgc.slice(iAlt); + + /* Update temperature */ + temperature_scgc.slice(iAlt) = (rhoE / rho - 0.5 * vel2) / Cv_scgc.slice(iAlt); + + + //if (iAlt == 10) { + std::cout << "after solve: " << iAlt << " " << + temperature_scgc(13, 22, 10) << " " << + velocity_vcgc[0](13, 22, 10) << " " << velocity_vcgc[1](13, 22, 10) << " " << + rho_scgc(13, 22, 10) << "\n"; + //} + + calc_density_from_mass_concentration(); + //assign_bulk_velocity(); + + } + + report.exit(function); + return; +} + +/* +void Neutrals::solver_horizontal_RK1(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK1"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + iAlt = 0; + + arma_mat x(nXs, nYs), y(nXs, nYs); + arma_mat jacobian(nXs, nYs), rho(nXs, nYs), rhoE(nXs, nYs), vel2(nXs, nYs); + arma_mat uVel(nXs, nYs), vVel(nXs, nYs), xVel(nXs, nYs), yVel(nXs, nYs); + arma_mat xMomentum(nXs, nYs), yMomentum(nXs, nYs); + arma_mat xMomentum_0(nXs, nYs), yMomentum_0(nXs, nYs); + arma_mat rho_0(nXs, nYs), rhoE_0(nXs, nYs); + arma_mat f_0_eq1(nXs, nYs), f_0_eq2(nXs, nYs); + arma_mat f_0_eq3(nXs, nYs), f_0_eq4(nXs, nYs); + +// Advance for bulk calculation first, calculate for every altitude +for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + // Extract Grid Features +arma_mat x = grid.refx_scgc.slice(iAlt); +arma_mat xEdges = grid.refx_Left.slice(iAlt); +arma_mat y = grid.refy_scgc.slice(iAlt); +arma_mat yEdges = grid.refy_Down.slice(iAlt); + +// Get reference grid dimensions (Assume dx = dy and equidistant) +arma_vec x_vec = x.col(0); +precision_t dx = x_vec(1) - x_vec(0); +precision_t area = dx * dx; +arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + +// States preprocessing +// MASS DENSITY +arma_mat rho = rho_scgc.slice(iAlt); + +// VELOCITY +// Get spherical velocity +arma_mat uVel = velocity_vcgc[0].slice(iAlt); +arma_mat vVel = velocity_vcgc[1].slice(iAlt); +// Convert to contravariant (reference) velocity +arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 +arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 +arma_mat vel2 = xVel % xVel + yVel % yVel; +// Generate contravriant momentum (no sqrt(g)) +arma_mat xMomentum = rho % xVel; // x1momentum +arma_mat yMomentum = rho % yVel; // x2momentum + +// TEMP and ENERGY +// Generate total energy (rhoE (no sqrt(g))) +// (TODO: Verify units) +arma_mat rhoE = rho % (temperature_scgc.slice(iAlt) % + Cv_scgc.slice(iAlt) + 0.5 * vel2); + +// Advancing with RK4 +// Setup Containers +arma_mat rho_0 = rho; +arma_mat xMomentum_0 = xMomentum; +arma_mat yMomentum_0 = yMomentum; +arma_mat rhoE_0 = rhoE; + +// FIRST (1) STEP, Compute F_0-> State_1 +// Pass in state vector +std::vector state_0; +state_0.push_back(rho_0); +state_0.push_back(xMomentum_0); +state_0.push_back(yMomentum_0); +state_0.push_back(rhoE_0); +std::vector f_0_vec = residual_horizontal_rusanov(state_0, grid, time, + iAlt); +// Extract Gradients +arma_mat f_0_eq1 = f_0_vec[0]; +arma_mat f_0_eq2 = f_0_vec[1]; +arma_mat f_0_eq3 = f_0_vec[2]; +arma_mat f_0_eq4 = f_0_vec[3]; + +// Update Bulk Scalars and Contravariant velocity +// Euler State Update +for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho(i, j) = rho_0(i, j) + dt * f_0_eq1(i, j) / jacobian(i, j); + xMomentum(i, j) = xMomentum_0(i, j) - dt * f_0_eq2(i, j) / jacobian(i, j); + yMomentum(i, j) = yMomentum_0(i, j) - dt * f_0_eq3(i, j) / jacobian(i, j); + rhoE(i, j) = rhoE_0(i, j) + dt * f_0_eq4(i, j) / jacobian(i, j); + } +} + +// Re-derive Spherical Velocity and Bulk States +// Density +rho_scgc.slice(iAlt) = rho; + +// Bulk Velocity +xVel = xMomentum / rho; // u^1 +yVel = yMomentum / rho; // u^2 +vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant +velocity_vcgc[0].slice(iAlt) = xVel % grid.A11_scgc.slice( + iAlt) + yVel % grid.A12_scgc.slice(iAlt); +velocity_vcgc[1].slice(iAlt) = xVel % grid.A21_scgc.slice( + iAlt) + yVel % grid.A22_scgc.slice(iAlt); + +// Update specie number density and velocity +for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].mass_concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + species[iSpec].velocity_vcgc[0].slice(iAlt) = velocity_vcgc[0].slice(iAlt); + species[iSpec].velocity_vcgc[1].slice(iAlt) = velocity_vcgc[1].slice(iAlt); +} + +// Update temperature +temperature_scgc.slice(iAlt) = (rhoE / rho - 0.5 * vel2) / Cv_scgc.slice(iAlt); + +report.exit(function); +return; +} + +*/ + +void Neutrals::solver_horizontal_RK4(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK4"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt() / 10; + + // Advance for bulk calculation first, calculate for every altitude + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + arma_mat uVel = velocity_vcgc[0].slice(iAlt); + arma_mat vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + arma_mat vel2 = xVel % xVel + yVel % yVel; + // Generate contravriant momentum (no sqrt(g)) + arma_mat xMomentum = rho % xVel; // x1momentum + arma_mat yMomentum = rho % yVel; // x2momentum + + /* TEMP and ENERGY */ + // Generate total energy (rhoE (no sqrt(g))) + // (TODO: Verify units) + //arma_mat rhoE = rho % (temperature_scgc.slice(iAlt) % Cv_scgc.slice( + // iAlt) + 0.5 * vel2); + arma_mat rhoE = rho % (temperature_scgc.slice(iAlt) % + Cv_scgc.slice(iAlt) + + 0.5 * vel2); + + /** Advancing with RK4 **/ + // Setup Containers + arma_mat rho_0 = rho; + arma_mat rho_1(nXs, nYs, fill::zeros); // corresponding f_1 + arma_mat rho_2(nXs, nYs, fill::zeros); // corresponding f_2 + arma_mat rho_3(nXs, nYs, fill::zeros); // corresponding f_3 + + arma_mat xMomentum_0 = xMomentum; + arma_mat xMomentum_1(nXs, nYs, fill::zeros); // corresponding f_1 + arma_mat xMomentum_2(nXs, nYs, fill::zeros); // corresponding f_2 + arma_mat xMomentum_3(nXs, nYs, fill::zeros); // corresponding f_3 + + arma_mat yMomentum_0 = yMomentum; + arma_mat yMomentum_1(nXs, nYs, fill::zeros); // corresponding f_1 + arma_mat yMomentum_2(nXs, nYs, fill::zeros); // corresponding f_2 + arma_mat yMomentum_3(nXs, nYs, fill::zeros); // corresponding f_3 + + arma_mat rhoE_0 = rhoE; + arma_mat rhoE_1(nXs, nYs, fill::zeros); // corresponding f_1 + arma_mat rhoE_2(nXs, nYs, fill::zeros); // corresponding f_2 + arma_mat rhoE_3(nXs, nYs, fill::zeros); // corresponding f_3 + + // FIRST (1) STEP, Compute F_0-> State_1 + // Pass in state vector + std::vector state_0; + state_0.push_back(rho_0); + state_0.push_back(xMomentum_0); + state_0.push_back(yMomentum_0); + state_0.push_back(rhoE_0); + std::vector f_0_vec = residual_horizontal_rusanov(state_0, grid, time, + iAlt); + // Extract Gradients + arma_mat f_0_eq1 = f_0_vec[0]; + arma_mat f_0_eq2 = f_0_vec[1]; + arma_mat f_0_eq3 = f_0_vec[2]; + arma_mat f_0_eq4 = f_0_vec[3]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho_1(i, j) = rho_0(i, j) + 0.5 * dt * f_0_eq1(i, j) / jacobian(i, j); + xMomentum_1(i, j) = xMomentum_0(i, j) + 0.5 * dt * f_0_eq2(i, j) / jacobian(i, + j); + yMomentum_1(i, j) = yMomentum_0(i, j) + 0.5 * dt * f_0_eq3(i, j) / jacobian(i, + j); + rhoE_1(i, j) = rhoE_0(i, j) + 0.5 * dt * f_0_eq4(i, j) / jacobian(i, j); + } + } + + // SECOND (2) STEP, Compute F_1-> State_2 + // Pass in state vector + std::vector state_1; + state_1.push_back(rho_1); + state_1.push_back(xMomentum_1); + state_1.push_back(yMomentum_1); + state_1.push_back(rhoE_1); + std::vector f_1_vec = residual_horizontal_rusanov(state_1, grid, time, + iAlt); + // Extract Gradients + arma_mat f_1_eq1 = f_1_vec[0]; + arma_mat f_1_eq2 = f_1_vec[1]; + arma_mat f_1_eq3 = f_1_vec[2]; + arma_mat f_1_eq4 = f_1_vec[3]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho_2(i, j) = rho_0(i, j) + 0.5 * dt * f_1_eq1(i, j) / jacobian(i, j); + xMomentum_2(i, j) = xMomentum_0(i, j) + 0.5 * dt * f_1_eq2(i, j) / jacobian(i, + j); + yMomentum_2(i, j) = yMomentum_0(i, j) + 0.5 * dt * f_1_eq3(i, j) / jacobian(i, + j); + rhoE_2(i, j) = rhoE_0(i, j) + 0.5 * dt * f_1_eq4(i, j) / jacobian(i, j); + } + } + + // THIRD (3) STEP, Compute F_2-> State_3 + // Pass in state vector + std::vector state_2; + state_2.push_back(rho_2); + state_2.push_back(xMomentum_2); + state_2.push_back(yMomentum_2); + state_2.push_back(rhoE_2); + std::vector f_2_vec = residual_horizontal_rusanov(state_2, grid, time, + iAlt); + // Extract Gradients + arma_mat f_2_eq1 = f_2_vec[0]; + arma_mat f_2_eq2 = f_2_vec[1]; + arma_mat f_2_eq3 = f_2_vec[2]; + arma_mat f_2_eq4 = f_2_vec[3]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho_3(i, j) = rho_0(i, j) + dt * f_2_eq1(i, j) / jacobian(i, j); + xMomentum_3(i, j) = xMomentum_0(i, j) + dt * f_2_eq2(i, j) / jacobian(i, j); + yMomentum_3(i, j) = yMomentum_0(i, j) + dt * f_2_eq3(i, j) / jacobian(i, j); + rhoE_3(i, j) = rhoE_0(i, j) + dt * f_2_eq4(i, j) / jacobian(i, j); + } + } + + // FOURTH (4) STEP, Compute F_3 + // Pass in state vector + std::vector state_3; + state_3.push_back(rho_3); + state_3.push_back(xMomentum_3); + state_3.push_back(yMomentum_3); + state_3.push_back(rhoE_3); + std::vector f_3_vec = residual_horizontal_rusanov(state_3, grid, time, + iAlt); + // Extract Gradients + arma_mat f_3_eq1 = f_3_vec[0]; + arma_mat f_3_eq2 = f_3_vec[1]; + arma_mat f_3_eq3 = f_3_vec[2]; + arma_mat f_3_eq4 = f_3_vec[3]; + + // Summing all steps for final update + arma_mat f_sum_eq1 = f_0_eq1 + 2 * f_1_eq1 + 2 * f_2_eq1 + f_3_eq1; + arma_mat f_sum_eq2 = f_0_eq2 + 2 * f_1_eq2 + 2 * f_2_eq2 + f_3_eq2; + arma_mat f_sum_eq3 = f_0_eq3 + 2 * f_1_eq3 + 2 * f_2_eq3 + f_3_eq3; + arma_mat f_sum_eq4 = f_0_eq4 + 2 * f_1_eq4 + 2 * f_2_eq4 + f_3_eq4; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + rho(i, j) = rho(i, j) + dt / 6 * f_sum_eq1(i, j) / jacobian(i, j); + xMomentum(i, j) = xMomentum(i, j) + dt / 6 * f_sum_eq2(i, j) / jacobian(i, j); + yMomentum(i, j) = yMomentum(i, j) + dt / 6 * f_sum_eq3(i, j) / jacobian(i, j); + rhoE(i, j) = rhoE(i, j) + dt / 6 * f_sum_eq4(i, j) / jacobian(i, j); + } + } + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + xVel = xMomentum / rho; // u^1 + yVel = yMomentum / rho; // u^2 + vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + velocity_vcgc[0].slice(iAlt) = xVel % grid.A11_scgc.slice( + iAlt) + yVel % grid.A12_scgc.slice(iAlt); + velocity_vcgc[1].slice(iAlt) = xVel % grid.A21_scgc.slice( + iAlt) + yVel % grid.A22_scgc.slice(iAlt); + + /* Update specie number density and velocity */ + for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + species[iSpec].velocity_vcgc[0].slice(iAlt) = velocity_vcgc[0].slice(iAlt); + species[iSpec].velocity_vcgc[1].slice(iAlt) = velocity_vcgc[1].slice(iAlt); + } + + /* Update temperature */ + temperature_scgc.slice(iAlt) = (rhoE / rho - 0.5 * vel2) / Cv_scgc.slice(iAlt); + + report.exit(function); + return; + } +} From 3084f94a5a13863e83cfaa347eee6ec206e11e2d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:24:25 -0400 Subject: [PATCH 582/691] FEAT: cubesphere tools for solvers --- src/cubesphere_tools.cpp | 300 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 src/cubesphere_tools.cpp diff --git a/src/cubesphere_tools.cpp b/src/cubesphere_tools.cpp new file mode 100644 index 00000000..d94011bb --- /dev/null +++ b/src/cubesphere_tools.cpp @@ -0,0 +1,300 @@ +// Copyright 2024, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +// Initial version: F. Cheng, Feb 2024 + +#include "aether.h" + +arma_vec Cubesphere_tools::limiter_mc(arma_vec &left, + arma_vec &right, + int64_t nPts, + int64_t nGCs) { + + precision_t beta = 0.8; + + arma_vec s = left % right; + arma_vec combined = (left + right) * 0.5; + + left = left * beta; + right = right * beta; + arma_vec limited = left; + + for (int64_t i = 1; i < nPts + 2 * nGCs - 1; i++) { + if (s(i) < 0) { + // Sign < 0 means opposite signed left and right: + limited(i) = 0.0; + } else { + if (left(i) > 0 && right(i) > 0) { + if (right(i) < limited(i)) + limited(i) = right(i); + + if (combined(i) < limited(i)) + limited(i) = combined(i); + } else { + if (right(i) > limited(i)) + limited(i) = right(i); + + if (combined(i) > limited(i)) + limited(i) = combined(i); + } + } + } + + return limited; +} + +void Cubesphere_tools::print(arma_vec values) { + int64_t nP = values.n_elem; + + for (int64_t i = 0; i < nP; i++) + std::cout << values(i) << " "; + + std::cout << "\n"; +} + +// --------------------------------------------------------- +// calc gradients at centers +// - values and x defined at centers +// --------------------------------------------------------- + +arma_vec Cubesphere_tools::calc_grad_1d(arma_vec &values, + arma_vec &x, + int64_t nPts, + int64_t nGCs) { + + arma_vec gradients = values * 0.0; + arma_vec gradL = values * 0.0; + arma_vec gradR = values * 0.0; + + precision_t factor1 = 0.625; + precision_t factor2 = 0.0416667; + precision_t h; + + int64_t i; + arma_vec hv = values * 0.0; + + i = nGCs - 1; + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); + gradL(i) = (values(i) - values(i - 1)) / (x(i) - x(i - 1)); + + // This is attempting to vectorize the problem, but it seems to be slower? + // int64_t iS = nGCs; + // int64_t iE = nPts + nGCs - 1; + // hv.rows(iS, iE) = 2.0 / (x.rows(iS, iE) - x.rows(iS-1, iE-1)); + // gradL.rows(iS, iE) = hv.rows(iS,iE) % (factor1 * (values.rows(iS, iE) - + // values.rows(iS-1, iE-1)) - + // factor2 * (values.rows(iS+1, iE+1) - + // values.rows(iS-2, iE-2))); + // hv.rows(iS, iE) = 2.0 / (x.rows(iS+1, iE+1) - x.rows(iS, iE)); + // gradR.rows(iS, iE) = hv.rows(iS,iE) % (factor1 * (values.rows(iS+1, iE+1) - + // values.rows(iS, iE)) - + // factor2 * (values.rows(iS+2, iE+2) - + // values.rows(iS-1, iE-1))); + + for (i = nGCs; i < nPts + nGCs; i++) { + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); + } + + i = nPts + nGCs; + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + gradR(i) = (values(i + 1) - values(i)) / (x(i + 1) - x(i)); + + gradients = Cubesphere_tools::limiter_mc(gradL, gradR, nPts, nGCs); + + return gradients; +} + +// --------------------------------------------------------- +// calc gradients at centers for 2d matrices +// - values and x defined at centers +// --------------------------------------------------------- + +arma_mat Cubesphere_tools::calc_grad(arma_mat values, + arma_mat x, + int64_t nGCs, + bool DoX) { + + arma_mat v2d, x2d; + + if (DoX) { + v2d = values; + x2d = x; + } else { + v2d = values.t(); + x2d = x.t(); + } + + int64_t nX = v2d.n_rows; + int64_t nY = v2d.n_cols; + arma_mat grad2d = v2d * 0.0; + + int64_t nPts = nX - 2 * nGCs; + arma_vec values1d(nX); + arma_vec x1d(nX); + + for (int64_t j = 1; j < nY - 1; j++) { + values1d = v2d.col(j); + x1d = x2d.col(j); + grad2d.col(j) = calc_grad_1d(values1d, x1d, nPts, nGCs); + } + + arma_mat gradients; + + if (DoX) + gradients = grad2d; + else + gradients = grad2d.t(); + + return gradients; +} + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat Cubesphere_tools::project_from_left(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i + 1, j) = values(i, j) + + gradients(i, j) * (x_edges(i + 1, j) - x_centers(i, j)); + } + + projected(1, j) = projected(2, j); + projected(0, j) = projected(1, j); + projected(nX, j) = projected(nX - 1, j); + } + + return projected; +} + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat Cubesphere_tools::project_from_right(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i, j) = values(i, j) + + gradients(i, j) * (x_edges(i, j) - x_centers(i, j)); + } + + projected(0, j) = projected(1, j); + projected(nX - 1, j) = projected(nX - 2, j); + projected(nX, j) = projected(nX - 1, j); + } + + return projected; +} + +// --------------------------------------------------------- +// Limiter on values +// projected is assumed to be on the edge between the +// i-1 and i cell (i-1/2) +// limited is returned at edges +// --------------------------------------------------------- + +arma_vec Cubesphere_tools::limiter_value(arma_vec projected, + arma_vec values, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec limited = projected; + + precision_t mini, maxi; + + for (int64_t i = iStart + 1; i < iEnd - 1; i++) { + + mini = values(i - 1); + + if (values(i) < mini) + mini = values(i); + + maxi = values(i - 1); + + if (values(i) > maxi) + maxi = values(i); + + if (limited(i) < mini) + limited(i) = mini; + + if (limited(i) > maxi) + limited(i) = maxi; + } + + return limited; +} + +// // --------------------------------------------------------- +// // take gradients and project to all edges +// // --------------------------------------------------------- + +// projection_struct Cubesphere_tools::project_to_edges(arma_mat &values, +// arma_mat &x_centers, arma_mat &x_edges, +// arma_mat &y_centers, arma_mat &y_edges, +// int64_t nGCs) { + +// int64_t nX = values.n_rows; +// int64_t nY = values.n_cols; + +// projection_struct proj; + +// proj.gradLR = calc_grad(values, x_centers, nGCs, true); +// proj.gradDU = calc_grad(values.t(), y_centers.t(), nGCs, true).t(); + +// proj.R = project_from_left(values, proj.gradLR, +// x_centers, x_edges, nGCs); +// // Left side of edge from left +// proj.L = project_from_right(values, proj.gradLR, +// x_centers, x_edges, nGCs); +// // Up side of edge from down (left) +// proj.U = project_from_left(values.t(), proj.gradDU.t(), +// y_centers.t(), y_edges.t(), nGCs) +// .t(); +// // Down side of edge from up (right) +// proj.D = project_from_right(values.t(), proj.gradDU.t(), +// y_centers.t(), y_edges.t(), nGCs) +// .t(); + +// return proj; +// } From a4cae5f26537d56e61a6e153134dc56950000804 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 13 Aug 2025 14:24:54 -0400 Subject: [PATCH 583/691] FEAT: advection only with cubesphere --- ...solver_horizontal_cubesphere_advection.cpp | 993 ++++++++++++++++++ 1 file changed, 993 insertions(+) create mode 100644 src/solver_horizontal_cubesphere_advection.cpp diff --git a/src/solver_horizontal_cubesphere_advection.cpp b/src/solver_horizontal_cubesphere_advection.cpp new file mode 100644 index 00000000..e96b1e88 --- /dev/null +++ b/src/solver_horizontal_cubesphere_advection.cpp @@ -0,0 +1,993 @@ +// Copyright 2023, the Aether Development Team (see doc/dev_team.md for members) +// Full license can be found in License.md + +// Initial version: F. Cheng, July 2023 + +#include "aether.h" + +using namespace Cubesphere_tools; + +// DOES NOT WORK WELL +std::vector Neutrals::residual_horizontal_hlle_advection( + std::vector& states, Grid& grid, Times& time) { + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** State/Velocity extraction **/ + /* MASS DENSITY */ + arma_mat rho = states[0]; + + /* VELOCITY */ + // Convert to contravariant (reference) velocity + arma_mat xVel = states[1]; // u^1 + arma_mat yVel = states[2]; // u^2 + + // Generate velocity magnitude squared + arma_mat vel2 = xVel % xVel + yVel % yVel; + + /** Advancing **/ + /* Initialize projection constructs and storages */ + projection_struct rhoP; + projection_struct xVelP; + projection_struct yVelP; + + // They are all pure scalar fields without sqrt(g) + arma_mat rhoL, rhoR, rhoD, rhoU; + arma_mat xVelL, xVelR, xVelD, xVelU; + arma_mat yVelL, yVelR, yVelD, yVelU; + + arma_mat velL2, velR2, velD2, velU2; + + /** Initialize Flux and Wave Speed Storages */ + arma_mat eq1FluxLR_left, eq1FluxDU_down; + arma_mat eq1FluxLR_right, eq1FluxDU_upper; + arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + + arma_mat wsL, wsR, wsD, wsU; + arma_mat wsL_min, wsL_max, wsR_min, wsR_max; + arma_mat wsD_min, wsD_max, wsU_min, wsU_max; + arma_mat wsLR_max, wsDU_max, wsLR_min, wsDU_min; + + arma_mat diff; // for Riemann Solver + + /* Projection */ + rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); + xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); + yVelP = project_to_edges(yVel, x, xEdges, y, yEdges, nGCs); + + // Resolve Scalar Fields into rho, xVel, yVel, and totalE (without rho) + rhoL = rhoP.L; + rhoR = rhoP.R; + rhoD = rhoP.D; + rhoU = rhoP.U; + + xVelL = xVelP.L; + xVelR = xVelP.R; + xVelD = xVelP.D; + xVelU = xVelP.U; + + yVelL = yVelP.L; + yVelR = yVelP.R; + yVelD = yVelP.D; + yVelU = yVelP.U; + + //velL2 = xVelL % xVelL + yVelL % yVelL; + //velR2 = xVelR % xVelR + yVelR % yVelR; + //velD2 = xVelD % xVelD + yVelD % yVelD; + //velU2 = xVelU % xVelU + yVelU % yVelU; + + /* Calculate Edge Fluxes */ + // Note that dot product between normal vector at edge and flux vector + // resolves into a pure one component flux or either hat{x} or hat{y} + + // Flux calculated from the left of the edge + eq1FluxL = rhoL % xVelL % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the right of the edge + eq1FluxR = rhoR % xVelR % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the down of the edge + eq1FluxD = rhoD % yVelD % grid.sqrt_g_Down.slice(iAlt); + // Flux calculated from the up of the edge + eq1FluxU = rhoU % yVelU % grid.sqrt_g_Down.slice(iAlt); + + /* Wave Speed Calculation (Left/Down) */ + wsL = xVelL; + wsR = xVelR; + wsD = yVelD; + wsU = yVelU; + + wsL_max = wsL; + wsL_min = wsL; + wsR_max = wsR; + wsR_min = wsR; + wsD_max = wsD; + wsD_min = wsD; + wsU_max = wsU; + wsU_min = wsU; + + // Process wave speeds from each direction first + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + + if (wsL(i, j) > 0.) + wsL_min(i, j) = 0.; + + else + wsL_max(i, j) = 0.; + + if (wsR(i, j) > 0.) + wsR_min(i, j) = 0.; + + else + wsR_max(i, j) = 0.; + } + } + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsD(i, j) > 0.) + wsD_min(i, j) = 0.; + + else + wsD_max(i, j) = 0.; + + if (wsU(i, j) > 0.) + wsU_min(i, j) = 0.; + + else + wsU_max(i, j) = 0.; + } + } + + // Process edge wave speeds + wsLR_max = wsR_max; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL_max(i, j) > wsLR_max(i, j)) + wsLR_max(i, j) = wsL_max(i, j); + } + } + + wsDU_max = wsD_max; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU_max(i, j) > wsDU_max(i, j)) + wsDU_max(i, j) = wsU_max(i, j); + } + } + + wsLR_min = wsR_min; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL_min(i, j) < wsLR_min(i, j)) + wsLR_min(i, j) = wsL_min(i, j); + } + } + + wsDU_min = wsD_min; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU_min(i, j) < wsDU_min(i, j)) + wsDU_min(i, j) = wsU_min(i, j); + } + } + + /* Calculate average flux at the edges (HLLE Flux) */ + arma_mat wsLR_sum = wsLR_max + wsLR_min; + arma_mat wsLR_diff = wsLR_max - wsLR_min; + diff = (rhoR - rhoL) % grid.sqrt_g_Left.slice( + iAlt); // State difference, need to add sqrt(g) + eq1FluxLR_left = 0.5 * (eq1FluxL + eq1FluxR) + 0.5 * (wsLR_sum / wsLR_diff) % + (eq1FluxR - eq1FluxL) - (wsLR_max % wsLR_min) / wsLR_diff % diff; + + arma_mat wsDU_sum = wsDU_max + wsDU_min; + arma_mat wsDU_diff = wsDU_max - wsDU_min; + diff = (rhoU - rhoD) % grid.sqrt_g_Down.slice(iAlt); + eq1FluxDU_down = 0.5 * (eq1FluxU + eq1FluxD) + 0.5 * (wsDU_sum / wsDU_diff) % + (eq1FluxD - eq1FluxU) - (wsDU_max % wsDU_min) / wsDU_diff % diff; + + /* Wave Speed Calculation (Right/Up) */ + wsL = -xVelL; + wsR = -xVelR; + wsD = -yVelD; + wsU = -yVelU; + + wsL_max = wsL; + wsL_min = wsL; + wsR_max = wsR; + wsR_min = wsR; + wsD_max = wsD; + wsD_min = wsD; + wsU_max = wsU; + wsU_min = wsU; + + // Process wave speeds from each direction first + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + + if (wsL(i, j) > 0.) + wsL_min(i, j) = 0.; + + else + wsL_max(i, j) = 0.; + + if (wsR(i, j) > 0.) + wsR_min(i, j) = 0.; + + else + wsR_max(i, j) = 0.; + } + } + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsD(i, j) > 0.) + wsD_min(i, j) = 0.; + + else + wsD_max(i, j) = 0.; + + if (wsU(i, j) > 0.) + wsU_min(i, j) = 0.; + + else + wsU_max(i, j) = 0.; + } + } + + // Process edge wave speeds + wsLR_max = wsR_max; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL_max(i, j) > wsLR_max(i, j)) + wsLR_max(i, j) = wsL_max(i, j); + } + } + + wsDU_max = wsD_max; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU_max(i, j) > wsDU_max(i, j)) + wsDU_max(i, j) = wsU_max(i, j); + } + } + + wsLR_min = wsR_min; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL_min(i, j) < wsLR_min(i, j)) + wsLR_min(i, j) = wsL_min(i, j); + } + } + + wsDU_min = wsD_min; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU_min(i, j) < wsDU_min(i, j)) + wsDU_min(i, j) = wsU_min(i, j); + } + } + + /* Calculate average flux at the edges (HLLE Flux) */ + wsLR_sum = wsLR_max + wsLR_min; + wsLR_diff = wsLR_max - wsLR_min; + diff = (rhoR - rhoL) % grid.sqrt_g_Left.slice( + iAlt); // State difference, need to add sqrt(g) + eq1FluxLR_right = 0.5 * (eq1FluxL + eq1FluxR) + 0.5 * (wsLR_sum / wsLR_diff) % + (eq1FluxR - eq1FluxL) - (wsLR_max % wsLR_min) / wsLR_diff % diff; + + wsDU_sum = wsDU_max + wsDU_min; + wsDU_diff = wsDU_max - wsDU_min; + diff = (rhoU - rhoD) % grid.sqrt_g_Down.slice(iAlt); + eq1FluxDU_upper = 0.5 * (eq1FluxU + eq1FluxD) + 0.5 * (wsDU_sum / wsDU_diff) % + (eq1FluxD - eq1FluxU) - (wsDU_max % wsDU_min) / wsDU_diff % diff; + + + // Setup residual storage for return + arma_mat eq1_residual(nXs, nYs, fill::zeros); + + // State Update + // Note the ghost cells WILL NOT BE UPDATED + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + precision_t rhoResidual_ij = dx * eq1FluxLR_right(i + 1, j) - + dx * eq1FluxLR_left(i, j) + + dx * eq1FluxDU_upper(i, j + 1) - + dx * eq1FluxDU_down(i, j); + eq1_residual(i, j) = -1 / area * rhoResidual_ij; + } + } + + // Setup return vector + std::vector return_vector; + return_vector.push_back(eq1_residual); + + return return_vector; +} + +// WORKS, but diffusive +std::vector Neutrals::residual_horizontal_rusanov_advection( + std::vector& states, Grid& grid, Times& time) { + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** State/Velocity extraction **/ + /* MASS DENSITY */ + arma_mat rho = states[0]; + + /* VELOCITY */ + // Convert to contravariant (reference) velocity + arma_mat xVel = states[1]; // u^1 + arma_mat yVel = states[2]; // u^2 + + // Generate velocity magnitude squared + arma_mat vel2 = xVel % xVel + yVel % yVel; + + /** Advancing **/ + /* Initialize projection constructs and storages */ + projection_struct rhoP; + projection_struct xVelP; + projection_struct yVelP; + + // They are all pure scalar fields without sqrt(g) + arma_mat rhoL, rhoR, rhoD, rhoU; + arma_mat xVelL, xVelR, xVelD, xVelU; + arma_mat yVelL, yVelR, yVelD, yVelU; + + arma_mat velL2, velR2, velD2, velU2; + + /** Initialize Flux and Wave Speed Storages */ + arma_mat eq1FluxLR, eq1FluxDU; + arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat diff; // for Riemann Solver + + /* Projection */ + rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); + xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); + yVelP = project_to_edges(yVel, x, xEdges, y, yEdges, nGCs); + + // Resolve Scalar Fields into rho, xVel, yVel, and totalE (without rho) + rhoL = rhoP.L; + rhoR = rhoP.R; + rhoD = rhoP.D; + rhoU = rhoP.U; + + xVelL = xVelP.L; + xVelR = xVelP.R; + xVelD = xVelP.D; + xVelU = xVelP.U; + + yVelL = yVelP.L; + yVelR = yVelP.R; + yVelD = yVelP.D; + yVelU = yVelP.U; + + velL2 = xVelL % xVelL + yVelL % yVelL; + velR2 = xVelR % xVelR + yVelR % yVelR; + velD2 = xVelD % xVelD + yVelD % yVelD; + velU2 = xVelU % xVelU + yVelU % yVelU; + + /* Calculate Edge Fluxes */ + // Note that dot product between normal vector at edge and flux vector + // resolves into a pure one component flux or either hat{x} or hat{y} + + // Flux calculated from the left of the edge + eq1FluxL = rhoL % xVelL % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the right of the edge + eq1FluxR = rhoR % xVelR % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the down of the edge + eq1FluxD = rhoD % yVelD % grid.sqrt_g_Down.slice(iAlt); + // Flux calculated from the up of the edge + eq1FluxU = rhoU % yVelU % grid.sqrt_g_Down.slice(iAlt); + + /* Wave Speed Calculation */ + wsL = sqrt(velL2); + wsR = sqrt(velR2); + wsD = sqrt(velD2); + wsU = sqrt(velU2); + + wsLR = wsR; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); + } + } + + /* Calculate average flux at the edges (Rusanov Flux) */ + diff = (rhoR - rhoL) % grid.sqrt_g_Left.slice( + iAlt); // State difference, need to add sqrt(g) + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU - rhoD) % grid.sqrt_g_Down.slice(iAlt); + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + // Setup residual storage for return + arma_mat eq1_residual(nXs, nYs, fill::zeros); + + // State Update + // Note the ghost cells WILL NOT BE UPDATED + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + precision_t rhoResidual_ij = dx * eq1FluxLR(i + 1, j) - + dx * eq1FluxLR(i, j) + + dx * eq1FluxDU(i, j + 1) - + dx * eq1FluxDU(i, j); + eq1_residual(i, j) = -1 / area * rhoResidual_ij; + } + } + + // Setup return vector + std::vector return_vector; + return_vector.push_back(eq1_residual); + + return return_vector; +} + +void Neutrals::solver_horizontal_rusanov_advection(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_rusanov_advection"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + + // Advance for bulk calculation first, calculate for every altitude + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + arma_mat uVel = velocity_vcgc[0].slice(iAlt); + arma_mat vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + + // Generate velocity magnitude squared + arma_mat vel2 = xVel % xVel + yVel % yVel; + + /** Advancing **/ + /* Initialize projection constructs and storages */ + projection_struct rhoP; + projection_struct xVelP; + projection_struct yVelP; + + // They are all pure scalar fields without sqrt(g) + arma_mat rhoL, rhoR, rhoD, rhoU; + arma_mat xVelL, xVelR, xVelD, xVelU; + arma_mat yVelL, yVelR, yVelD, yVelU; + + arma_mat velL2, velR2, velD2, velU2; + + /** Initialize Flux and Wave Speed Storages */ + arma_mat eq1FluxLR, eq1FluxDU; + arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat diff; // for Riemann Solver + + /* Projection */ + rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); + xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); + yVelP = project_to_edges(yVel, x, xEdges, y, yEdges, nGCs); + + // Resolve Scalar Fields into rho, xVel, yVel, and totalE (without rho) + rhoL = rhoP.L; + rhoR = rhoP.R; + rhoD = rhoP.D; + rhoU = rhoP.U; + + xVelL = xVelP.L; + xVelR = xVelP.R; + xVelD = xVelP.D; + xVelU = xVelP.U; + + yVelL = yVelP.L; + yVelR = yVelP.R; + yVelD = yVelP.D; + yVelU = yVelP.U; + + velL2 = xVelL % xVelL + yVelL % yVelL; + velR2 = xVelR % xVelR + yVelR % yVelR; + velD2 = xVelD % xVelD + yVelD % yVelD; + velU2 = xVelU % xVelU + yVelU % yVelU; + + + /* Calculate Edge Fluxes */ + // Note that dot product between normal vector at edge and flux vector + // resolves into a pure one component flux or either hat{x} or hat{y} + + // Flux calculated from the left of the edge + eq1FluxL = rhoL % xVelL % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the right of the edge + eq1FluxR = rhoR % xVelR % grid.sqrt_g_Left.slice(iAlt); + // Flux calculated from the down of the edge + eq1FluxD = rhoD % yVelD % grid.sqrt_g_Down.slice(iAlt); + // Flux calculated from the up of the edge + eq1FluxU = rhoU % yVelU % grid.sqrt_g_Down.slice(iAlt); + + /* Wave Speed Calculation */ + wsL = sqrt(velL2); + wsR = sqrt(velR2); + wsD = sqrt(velD2); + wsU = sqrt(velU2); + + wsLR = wsR; + + for (int i = 0; i < nXs + 1; i++) { + for (int j = 0; j < nYs; j++) { + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + + for (int i = 0; i < nXs; i++) { + for (int j = 0; j < nYs + 1; j++) { + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); + } + } + + /* Calculate average flux at the edges (Rusanov Flux) */ + diff = (rhoR - rhoL) % grid.sqrt_g_Left.slice( + iAlt); // State difference, need to add sqrt(g) + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoU - rhoD) % grid.sqrt_g_Down.slice(iAlt); + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) { + precision_t rhoResidual_ij = dx * eq1FluxLR(i + 1, j) - + dx * eq1FluxLR(i, j) + + dx * eq1FluxDU(i, j + 1) - + dx * eq1FluxDU(i, j); + rho(i, j) = rho(i, j) - dt / area / jacobian(i, j) * rhoResidual_ij; + } + } + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + //vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + //velocity_vcgc[0].slice(iAlt) = xVel%grid.A11_scgc.slice(iAlt) + yVel%grid.A12_scgc.slice(iAlt); + //velocity_vcgc[1].slice(iAlt) = xVel%grid.A21_scgc.slice(iAlt) + yVel%grid.A22_scgc.slice(iAlt); + + /* Update specie density */ + for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + } + + + report.exit(function); + return; + } +} + +void Neutrals::solver_horizontal_RK1_advection(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK1_advection"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + // Advance for bulk calculation first, calculate for every altitude + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + arma_mat uVel = velocity_vcgc[0].slice(iAlt); + arma_mat vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + + /** Advancing with RK4 **/ + // Setup Containers + arma_mat rho_0 = rho; + + // FIRST (1) STEP, Compute F_0-> State_1 + // Pass in state vector + std::vector state_0; + state_0.push_back(rho_0); + state_0.push_back(xVel); + state_0.push_back(yVel); + std::vector f_0_vec = residual_horizontal_rusanov_advection(state_0, + grid, time); + + // Extract Gradients + arma_mat f_0_eq1 = f_0_vec[0]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho(i, j) = rho_0(i, j) + dt * f_0_eq1(i, j) / jacobian(i, j); + } + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + //vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + //velocity_vcgc[0].slice(iAlt) = xVel%grid.A11_scgc.slice(iAlt) + yVel%grid.A12_scgc.slice(iAlt); + //velocity_vcgc[1].slice(iAlt) = xVel%grid.A21_scgc.slice(iAlt) + yVel%grid.A22_scgc.slice(iAlt); + + /* Update specie density */ + for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + } + + + report.exit(function); + return; + } +} + +void Neutrals::solver_horizontal_RK2_advection(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK2_advection"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + // Advance for bulk calculation first, calculate for every altitude + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + arma_mat uVel = velocity_vcgc[0].slice(iAlt); + arma_mat vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + + /** Advancing with RK4 **/ + // Setup Containers + arma_mat rho_0 = rho; + arma_mat rho_1(nXs, nYs, fill::zeros); // corresponding f_1 + + // FIRST (1) STEP, Compute F_0-> State_1 + // Pass in state vector + std::vector state_0; + state_0.push_back(rho_0); + state_0.push_back(xVel); + state_0.push_back(yVel); + std::vector f_0_vec = residual_horizontal_hlle_advection(state_0, + grid, time); + // Extract Gradients + arma_mat f_0_eq1 = f_0_vec[0]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho_1(i, j) = rho_0(i, j) + dt * f_0_eq1(i, j) / jacobian(i, j); + } + + // SECOND (2) STEP, Compute F_1-> State_2 + // Pass in state vector + std::vector state_1; + state_1.push_back(rho_1); + state_1.push_back(xVel); + state_1.push_back(yVel); + std::vector f_1_vec = residual_horizontal_hlle_advection(state_1, + grid, time); + // Extract Gradients + arma_mat f_1_eq1 = f_1_vec[0]; + + // Summing all steps for final update + arma_mat f_sum_eq1 = f_0_eq1 + f_1_eq1; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho(i, j) = rho(i, j) + 0.5 * dt * f_sum_eq1(i, j) / jacobian(i, j); + } + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + //vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + //velocity_vcgc[0].slice(iAlt) = xVel%grid.A11_scgc.slice(iAlt) + yVel%grid.A12_scgc.slice(iAlt); + //velocity_vcgc[1].slice(iAlt) = xVel%grid.A21_scgc.slice(iAlt) + yVel%grid.A22_scgc.slice(iAlt); + + /* Update specie density */ + for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + } + + + report.exit(function); + return; + } +} + +void Neutrals::solver_horizontal_RK4_advection(Grid& grid, Times& time) { + // Function Reporting + std::string function = "Neutrals::solver_horizontal_RK4_advection"; + static int iFunction = -1; + report.enter(function, iFunction); + + // Dimensions of Spatial Discretization + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + int iAlt, iSpec; + + // Time Discretization (TODO: change dt calculation method) + precision_t dt = time.get_dt(); + + // Advance for bulk calculation first, calculate for every altitude + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + /** Extract Grid Features **/ + arma_mat x = grid.refx_scgc.slice(iAlt); + arma_mat xEdges = grid.refx_Left.slice(iAlt); + arma_mat y = grid.refy_scgc.slice(iAlt); + arma_mat yEdges = grid.refy_Down.slice(iAlt); + + // Get reference grid dimensions (Assume dx = dy and equidistant) + arma_vec x_vec = x.col(0); + precision_t dx = x_vec(1) - x_vec(0); + precision_t area = dx * dx; + arma_mat jacobian = grid.sqrt_g_scgc.slice(iAlt); + + /** States preprocessing **/ + /* MASS DENSITY */ + arma_mat rho = rho_scgc.slice(iAlt); + + /* VELOCITY */ + // Get spherical velocity + arma_mat uVel = velocity_vcgc[0].slice(iAlt); + arma_mat vVel = velocity_vcgc[1].slice(iAlt); + // Convert to contravariant (reference) velocity + arma_mat xVel = uVel % grid.A11_inv_scgc.slice(iAlt) + vVel % + grid.A12_inv_scgc.slice(iAlt); // u^1 + arma_mat yVel = uVel % grid.A21_inv_scgc.slice(iAlt) + vVel % + grid.A22_inv_scgc.slice(iAlt); // u^2 + + /** Advancing with RK4 **/ + // Setup Containers + arma_mat rho_0 = rho; + arma_mat rho_1(nXs, nYs, fill::zeros); // corresponding f_1 + arma_mat rho_2(nXs, nYs, fill::zeros); // corresponding f_2 + arma_mat rho_3(nXs, nYs, fill::zeros); // corresponding f_3 + + // FIRST (1) STEP, Compute F_0-> State_1 + // Pass in state vector + std::vector state_0; + state_0.push_back(rho_0); + state_0.push_back(xVel); + state_0.push_back(yVel); + std::vector f_0_vec = residual_horizontal_rusanov_advection(state_0, + grid, time); + // Extract Gradients + arma_mat f_0_eq1 = f_0_vec[0]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho_1(i, j) = rho_0(i, j) + 0.5 * dt * f_0_eq1(i, j) / jacobian(i, j); + } + + // SECOND (2) STEP, Compute F_1-> State_2 + // Pass in state vector + std::vector state_1; + state_1.push_back(rho_1); + state_1.push_back(xVel); + state_1.push_back(yVel); + std::vector f_1_vec = residual_horizontal_rusanov_advection(state_1, + grid, time); + // Extract Gradients + arma_mat f_1_eq1 = f_1_vec[0]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho_2(i, j) = rho_0(i, j) + 0.5 * dt * f_1_eq1(i, j) / jacobian(i, j); + } + + // THIRD (3) STEP, Compute F_2-> State_3 + // Pass in state vector + std::vector state_2; + state_2.push_back(rho_2); + state_2.push_back(xVel); + state_2.push_back(yVel); + std::vector f_2_vec = residual_horizontal_rusanov_advection(state_2, + grid, time); + // Extract Gradients + arma_mat f_2_eq1 = f_2_vec[0]; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho_3(i, j) = rho_0(i, j) + dt * f_2_eq1(i, j) / jacobian(i, j); + } + + // FOURTH (4) STEP, Compute F_3 + // Pass in state vector + std::vector state_3; + state_3.push_back(rho_3); + state_3.push_back(xVel); + state_3.push_back(yVel); + std::vector f_3_vec = residual_horizontal_rusanov_advection(state_3, + grid, time); + // Extract Gradients + arma_mat f_3_eq1 = f_3_vec[0]; + + // Summing all steps for final update + arma_mat f_sum_eq1 = f_0_eq1 + 2 * f_1_eq1 + 2 * f_2_eq1 + f_3_eq1; + + /* Update Bulk Scalars and Contravariant velocity */ + // Euler State Update + for (int j = nGCs; j < nYs - nGCs; j++) { + for (int i = nGCs; i < nXs - nGCs; i++) + rho(i, j) = rho(i, j) + dt / 6 * f_sum_eq1(i, j) / jacobian(i, j); + } + + /* Re-derive Spherical Velocity and Bulk States */ + // Density + rho_scgc.slice(iAlt) = rho; + + // Bulk Velocity + //vel2 = xVel % xVel + yVel % yVel; // Squared Magnitude of Contravariant + //velocity_vcgc[0].slice(iAlt) = xVel%grid.A11_scgc.slice(iAlt) + yVel%grid.A12_scgc.slice(iAlt); + //velocity_vcgc[1].slice(iAlt) = xVel%grid.A21_scgc.slice(iAlt) + yVel%grid.A22_scgc.slice(iAlt); + + /* Update specie density */ + for (iSpec = 0; iSpec < nSpecies; iSpec++) { + //species[iSpec].density_scgc.slice(iAlt) = rho % species[iSpec].concentration_scgc.slice(iAlt); + species[iSpec].density_scgc.slice(iAlt) = rho / species[iSpec].mass; + } + + + report.exit(function); + return; + } +} \ No newline at end of file From e1172caec844fc71f82ebdf416ad8d8d2a7ca515 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 14:57:45 -0400 Subject: [PATCH 584/691] BUG: Typo in input/importError in postaether --- srcPython/postAether.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index f4e0455c..b3523cab 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -15,7 +15,7 @@ try: from netCDF4 import Dataset from h5py import File -except InputError: +except ImportError: print("NetCDF and/or h5py not found") # ---------------------------------------------------------------------- From c039efd0d31cd2b4f3de2915f84e1cd5196ac37d Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 16:21:25 -0400 Subject: [PATCH 585/691] FEAT: Dipole interpolation coefficients --- include/grid.h | 4 +- src/solver_grid_interpolation.cpp | 128 +++++++++++++++++++++++++----- 2 files changed, 111 insertions(+), 21 deletions(-) diff --git a/include/grid.h b/include/grid.h index ebee7cc9..cde1a92c 100644 --- a/include/grid.h +++ b/include/grid.h @@ -426,7 +426,9 @@ class Grid */ bool set_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, - const std::vector &Alts); + const std::vector &Alts, + bool areLocsGeo=true, + bool areLocsIJK=true); /** * \brief Set the interpolation coefficients for the dipole grid diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index a974de13..2c6ea23c 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -399,39 +399,127 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, // Set the interpolation coefficients // -------------------------------------------------------------------------- -bool Grid::set_interpolation_coefs(const std::vector &Lons, - const std::vector &Lats, - const std::vector &Alts) { - // If this is not a geo grid, return false - if (!IsGeoGrid) - return false; +bool Grid::set_interpolation_coefs(const std::vector &i_coords, + const std::vector &j_coords, + const std::vector &k_coords, + bool areLocsGeo,// geo or mag? + bool areLocsIJK // Are locs in 'native' coords? + ) { + /* + Inputs: + i_coord: longitude, either geo or mag (depends if areLocsGeo) + j_coord: + - Latitude if geographic + - Invariant latitude if magnetic (areLocsGeo = false) + - L-shell / dipole 'p': if magnetic and (areLocsIJK = false) + k_coord: + - Altitude/radius if NOT areLocsIJK + - distance along field line, or dipole 'q' if areLocsIJK + */ + + std::string function = "Grid::set_interpolation_coefs"; + static int iFunction = -1; + report.enter(function, iFunction); // If the size of Lons, Lats and Alts are not the same, return false - if (Lons.size() != Lats.size() || Lats.size() != Alts.size()) + if (i_coords.size() != j_coords.size() || j_coords.size() != k_coords.size()) { + report.error("Length of i,j,k vectors do not match!"); return false; + } // Clear the previous interpolation coefficients interp_coefs.clear(); - // Handle according to whether it is cubesphere or not - if (IsCubeSphereGrid) { - // Calculate the range of the grid - struct cubesphere_range cr; - get_cubesphere_grid_range(cr); + if (IsGeoGrid) { + // Handle according to whether it is cubesphere or not + if (IsCubeSphereGrid) { + // Calculate the range of the grid + struct cubesphere_range cr; + get_cubesphere_grid_range(cr); + + // Calculate the index and coefficients for each point + for (size_t i = 0; i < i_coords.size(); ++i) + set_interp_coef_cubesphere(cr, i_coords[i], j_coords[i], k_coords[i]); + } else if (IsLatLonGrid) { + // Calculate the range of the grid + struct sphere_range sr; + get_sphere_grid_range(sr); + + // Calculate the index and coefficients for each point + for (size_t i = 0; i < i_coords.size(); ++i) + set_interp_coef_sphere(sr, i_coords[i], j_coords[i], k_coords[i]); + } + } + + else { // IsDipole - // Calculate the index and coefficients for each point - for (size_t i = 0; i < Lons.size(); ++i) - set_interp_coef_cubesphere(cr, Lons[i], Lats[i], Alts[i]); - } else { // Calculate the range of the grid - struct sphere_range sr; - get_sphere_grid_range(sr); + struct dipole_range dr; + get_dipole_grid_range(dr); + + Planets planet; + + // make holders for dipole coordinates. + int64_t iLoc, nPts = i_coords.size(); + std::vector mlon(nPts), p_coord(nPts), q_coord(nPts), dipijk(3); + + // these are the magnetic coordinates. A temporary step! + // this is a vector of cubes with shape (nPts, 1, 1) - avoids having to overload things + std::vector magCoords; + + if (areLocsGeo) { + arma_cube cubeCoord; + cubeCoord = vec2cube(i_coords); + magCoords.push_back(cubeCoord); + cubeCoord = vec2cube(j_coords); + magCoords.push_back(cubeCoord); + cubeCoord = vec2cube(k_coords); + magCoords.push_back(cubeCoord); + + magCoords = geo_to_mag(magCoords[0], magCoords[1], magCoords[2], planet); + // for (iLoc = 0; iLoc < nPts; iLoc++) { + // magCoords = geo_to_mag(i_coords[iLoc], j_coords[iLoc], k_coords[iLoc], planet); + // mlon[iLoc] = magCoords[0]; + // p_coord[iLoc] = magCoords[1]; + // q_coord[iLoc] = magCoords[2]; + } + + else { + magCoords = {vec2cube(i_coords),vec2cube(j_coords), vec2cube(k_coords)}; + } + + // std::vector dipcoords = geo_to_mag(i_coords[0], j_coords[0], k_coords[0], planet); + std::vector dipCoords; + if (!areLocsIJK) { + std::vector planet_radii(nPts); + for (iLoc = 0; iLoc < nPts; iLoc++) { + // Convert from mag->dipole coordinates. + if (areLocsGeo){ // we were given the geo-latitude + planet_radii[iLoc] = planet.get_radius(j_coords[iLoc]); + } else{ + // equatorial radius :( + planet_radii[iLoc] = planet.get_radius(0.0); + } + dipCoords = mag_to_ijk(i_coords[iLoc], j_coords[iLoc], k_coords[iLoc], planet_radii[iLoc]); + mlon[iLoc] = dipCoords[0]; + p_coord[iLoc] = dipCoords[1]; + q_coord[iLoc] = dipCoords[2]; + } + } else { + // just save the values + for (iLoc = 0; iLoc < nPts; iLoc++) { + mlon[iLoc] = i_coords[iLoc]; + p_coord[iLoc] = j_coords[iLoc]; + q_coord[iLoc] = k_coords[iLoc]; + } + } // Calculate the index and coefficients for each point - for (size_t i = 0; i < Lons.size(); ++i) - set_interp_coef_sphere(sr, Lons[i], Lats[i], Alts[i]); + for (size_t i = 0; i < i_coords.size(); ++i) + set_interp_coef_dipole(dr, mlon[i], p_coord[i], q_coord[i]); } + report.exit(function); return true; } From fea307eddf87877b573fd9c87899cba58abed2c1 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 17:04:28 -0400 Subject: [PATCH 586/691] FEAT: Conversions btwn mag/geo (moved one out of init_mag_grid) --- include/tools.h | 28 ++++++++++ src/init_mag_grid.cpp | 42 --------------- src/tools.cpp | 121 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+), 42 deletions(-) diff --git a/include/tools.h b/include/tools.h index 5c83ed34..fd899c48 100644 --- a/include/tools.h +++ b/include/tools.h @@ -297,4 +297,32 @@ arma_vec sphere_to_cube(precision_t lon_in, precision_t lat_in); // Probably needs to be moved. arma_cube delTheta(arma_cube magLat); +//////////////////////////////////////////// +// convert cell coordinates to geographic // +//////////////////////////////////////////// +std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, + arma_cube magAlt, + Planets planet); + +//////////////////////////////////////////// +// convert mag coordinates to dipole ijk // +//////////////////////////////////////////// +std::vector mag_to_ijk(precision_t mlon, + precision_t mlat, + precision_t radius, + precision_t planet_radius); + + +//////////////////////////////////////////// +// convert cell coordinates to geographic // +//////////////////////////////////////////// +std::vector geo_to_mag(arma_cube glon, + arma_cube glat, + arma_cube radius, + Planets &planet) ; + + +arma_cube vec2cube(std::vector ivec); + + #endif // INCLUDE_TOOLS_H_ diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 1bdfd0c2..8b8e0836 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -160,48 +160,6 @@ std::pair qp_to_r_theta(precision_t q, return {r, theta}; } -//////////////////////////////////////////// -// convert cell coordinates to geographic // -//////////////////////////////////////////// -std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, - arma_cube magAlt, - Planets planet) { - std::string function = "Grid::mag_to_geo"; - static int iFunction = -1; - report.enter(function, iFunction); - - std::vector llr, xyz_mag, xyz_geo, xyzRot1, xyzRot2; - llr.push_back(magLon); - llr.push_back(magLat); - llr.push_back(magAlt); - xyz_mag = transform_llr_to_xyz_3d(llr); - - precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); - precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); - std::vector dipole_center = planet.get_dipole_center(); - - // Reverse our dipole rotations: - xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); - xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); - - // offset dipole (not fully suported yet, so will be zero) - if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || - (dipole_center[2] != 0.0)) { - - dipole_center = {0.0, 0.0, 0.0}; - } - - xyz_geo.push_back(xyzRot2[0] + dipole_center[0]); - xyz_geo.push_back(xyzRot2[1] + dipole_center[1]); - xyz_geo.push_back(xyzRot2[2] + dipole_center[2]); - - // transform back to lon, lat, radius: - llr = transform_xyz_to_llr_3d(xyzRot2); - - report.exit(function); - return llr; -} - // ---------------------------------------------------------------------- // Initialize the dipole grid. // - inputs (min_apex, min_alt, LatStretch, FieldLineStretch, max_lat_dipole) diff --git a/src/tools.cpp b/src/tools.cpp index c62b3172..4ced3b73 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -856,3 +856,124 @@ arma_vec sphere_to_cube(precision_t lon_in, precision_t lat_in) { return ans; } + +//////////////////////////////////////////// +// convert cell coordinates to geographic // +//////////////////////////////////////////// +std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, + arma_cube magAlt, + Planets planet) { + std::string function = "Grid::mag_to_geo"; + static int iFunction = -1; + report.enter(function, iFunction); + + std::vector llr, xyz_mag, xyz_geo, xyzRot1, xyzRot2; + llr.push_back(magLon); + llr.push_back(magLat); + llr.push_back(magAlt); + xyz_mag = transform_llr_to_xyz_3d(llr); + + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + std::vector dipole_center = planet.get_dipole_center(); + + // Reverse our dipole rotations: + xyzRot1 = rotate_around_y_3d(xyz_mag, magnetic_pole_tilt); + xyzRot2 = rotate_around_z_3d(xyzRot1, magnetic_pole_rotation); + + // offset dipole (not fully suported yet, so will be zero) + if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || + (dipole_center[2] != 0.0)) { + + dipole_center = {0.0, 0.0, 0.0}; + } + + xyz_geo.push_back(xyzRot2[0] + dipole_center[0]); + xyz_geo.push_back(xyzRot2[1] + dipole_center[1]); + xyz_geo.push_back(xyzRot2[2] + dipole_center[2]); + + // transform back to lon, lat, radius: + llr = transform_xyz_to_llr_3d(xyzRot2); + + report.exit(function); + return llr; +} + +//////////////////////////////////////////// +// convert cell coordinates to magnetic // +//////////////////////////////////////////// + +std::vector geo_to_mag(arma_cube glon, + arma_cube glat, + arma_cube radius, + Planets &planet) { + + std::string function = "Grid::geo_to_gmag"; + static int iFunction = -1; + report.enter(function, iFunction); + + std::vector llr, xyz_mag, xyz_geo, xyzRot1, xyzRot2; + llr.push_back(glon); + llr.push_back(glat); + llr.push_back(radius); + xyz_mag = transform_llr_to_xyz_3d(llr); + + precision_t magnetic_pole_rotation = planet.get_dipole_rotation(); + precision_t magnetic_pole_tilt = planet.get_dipole_tilt(); + std::vector dipole_center = planet.get_dipole_center(); + + // Reverse our dipole rotations: + xyzRot1 = rotate_around_z_3d(xyz_mag, -magnetic_pole_tilt); + xyzRot2 = rotate_around_y_3d(xyzRot1, -magnetic_pole_rotation); + + // offset dipole (not fully suported yet, so will be zero) + if ((dipole_center[0] != 0.0) || (dipole_center[1] != 0.0) || + (dipole_center[2] != 0.0)) { + + dipole_center = {0.0, 0.0, 0.0}; + } + + xyz_geo.push_back(xyzRot2[0] - dipole_center[0]); + xyz_geo.push_back(xyzRot2[1] - dipole_center[1]); + xyz_geo.push_back(xyzRot2[2] - dipole_center[2]); + + // transform back to lon, lat, radius: + llr = transform_xyz_to_llr_3d(xyzRot2); + + report.exit(function); + return llr; +} + + +std::vector mag_to_ijk(precision_t mlon, + precision_t mLat, + precision_t radius, + precision_t planet_radius) { + + precision_t i_lon, j_p, k_q; + + // precision_t planet_radius = planet.get_radius(); + + i_lon = mlon; + j_p = radius / planet_radius / pow(cos(mLat), 2); + k_q = sin(mLat) / pow(radius / planet_radius, 2.); + + return {i_lon, j_p, k_q}; +} + +// ----------------------------------------------------------------------- +// Transform a flat vector into a 1D cube (avoids having to overload everything) +// - this is overloaded for one vec/cube +// ----------------------------------------------------------------------- + +arma_cube vec2cube(std::vector ivec) { + arma_cube outvec; + int sizei = ivec.size(); + arma_cube I; + + I.set_size(sizei, 1, 1); + for (int i =0; i Date: Wed, 13 Aug 2025 17:23:25 -0400 Subject: [PATCH 587/691] add thermoelectric heating=false to defaults.json --- share/run/UA/inputs/defaults.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 78086e2c..fd7bfc84 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -112,7 +112,8 @@ "IncludeIonizationHeating": true, "IncludeElectronIonCollisionalHeating":true, "IncludeElectronNeutralElasticCollisionalHeating":true, - "IncludeElectronNeutralInelasticCollisionalHeating":true}}, + "IncludeElectronNeutralInelasticCollisionalHeating":true, + "IncludeThermoelectricHeating": false}}, "Seed" : 0, From 6d5ae64b5a33f2ad3b3c8a70a13985cf09da8384 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 17:25:11 -0400 Subject: [PATCH 588/691] sty: rename binary > bisect search --- src/solver_grid_interpolation.cpp | 38 +++++++++++++++++-------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index 2c6ea23c..409ffd3d 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -76,7 +76,8 @@ int64_t get_cube_surface_number(const arma_vec &point_in) { // - Optional argument (nGCs=0) since we cannot see grid info. // -------------------------------------------------------------------------- -uint64_t binary_search_array(precision_t val_in, arma_vec ref_arr, int64_t nGCs = 0) { +uint64_t bisect_search_array(precision_t val_in, arma_vec ref_arr, + int64_t nGCs = 0) { // Copy from std::upper_bound. Can't directly use it // mainly because geoAlt_scgc(0, 0, *) can't be formed as an iterator uint64_t first, last, len; @@ -186,16 +187,16 @@ void Grid::get_cubesphere_grid_range(struct cubesphere_range &cr) const { void Grid::get_dipole_grid_range(struct dipole_range &dr) const { // Retrieve the range and delta of longitude, latitude and altitude - // ** Note these are magnetic coordinates. Not labeled for consistency ** - dr.lon_min = magLon_Corner(nGCs, nGCs, nGCs); - dr.lon_max = magLon_Corner(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + // ** Note the max/min are magnetic coordinates. ** + dr.lon_min = i_corner_scgc(nGCs, nGCs, nGCs); + dr.lon_max = i_corner_scgc(nLons - nGCs, nLats - nGCs, nAlts - nGCs); - dr.lat_min = magLat_Corner(nGCs, nGCs, nGCs); - dr.lat_max = magLat_Corner(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + dr.lat_min = j_corner_scgc(nGCs, nGCs, nGCs); + dr.lat_max = j_corner_scgc(nLons - nGCs, nLats - nGCs, nAlts - nGCs); // magAlt and geoAlt are the same, doesn't matter which we use: - dr.alt_min = geoAlt_scgc(nGCs, nGCs, nGCs); - dr.alt_max = geoAlt_scgc(nLons - nGCs, nLats - nGCs, nAlts - nGCs); + dr.alt_min = k_corner_scgc(nGCs, nGCs, nGCs); + dr.alt_max = k_corner_scgc(nLons - nGCs, nLats - nGCs, nAlts - nGCs); // MagLon steps are uniform: dr.dLon = magLon_Corner(1, 0, 0) - magLon_Corner(0, 0, 0); @@ -250,9 +251,10 @@ void Grid::set_interp_coef_sphere(const sphere_range &sr, // The altitude may not be linearly spaced, so use binary search to find // the first element smaller than or equal to the altitude of the give point - // Implemented in binary_search_array + // Implemented in bisect_search_array // - since Alt can be latitude-dependent, this needs to be done last. - coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), nGCs); + coef.iAlt = bisect_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), + nGCs); coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); @@ -328,9 +330,11 @@ void Grid::set_interp_coef_cubesphere(const cubesphere_range &cr, coef.rCol = col_frac_index - coef.iCol; coef.iCol += nGCs - 1; // Use binary search to find the index for altitude (handles oblate planets) - coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), nGCs); + coef.iAlt = bisect_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), + nGCs); coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) - / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, + coef.iCol, coef.iAlt)); // Put the coefficient into the vector coef.in_grid = true; @@ -357,7 +361,7 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, // ASSUMPTION: LONGITUDE IS LINEARLY SPACED, nGCs >= 1 // For the cell containing it, directly calculate its x index - // Find y & z indices using binary search + // Find y & z indices using a bisecting search // The number of dLon between the innermost ghost cell and the given point coef.rRow = (lon_in - dr.lon_min) / dr.dLon + 0.5; @@ -370,15 +374,15 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, // Different from the sphere, latitude & altitude are not evenly spaced. - // Use binary search for both. + // Use the bisect search function for both. // Lat needs to be done a little different because it could be increasing or // decreasing (depending on the hemisphere we're in). Take the absolute value! - coef.iCol = binary_search_array(abs(lat_in), - abs(magInvLat_scgc.tube(coef.iRow, coef.iCol)), nGCs); + coef.iCol = bisect_search_array(abs(lat_in), + abs(j_center_scgc.tube(coef.iRow, coef.iCol)), nGCs); // need alt index to find lat coef - coef.iAlt = binary_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), + coef.iAlt = bisect_search_array(alt_in, k_center_scgc.tube(coef.iRow, coef.iCol), nGCs); // then we can do the ratios: From cfd09cf0323265bb18fdfc188a4a9701fa7c8e17 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 18:41:04 -0400 Subject: [PATCH 589/691] test: Some stuff for the gradient test on the dipole grid. it doesnt work. Hopefully this code can either help someone (me) firgure it out again later, or be deleted. To revert this commit we need to remove the debug flag from the call to test_gradient_ijk. NBD. --- include/test.h | 2 +- src/main/main.cpp | 9 +- src/solver_gradients.cpp | 7 +- srcTest/test_gradient.cpp | 284 +++++++++++++++++++++++++------------- 4 files changed, 196 insertions(+), 106 deletions(-) diff --git a/include/test.h b/include/test.h index ea74ab86..d6f9b287 100644 --- a/include/test.h +++ b/include/test.h @@ -11,7 +11,7 @@ // Cubesphere is not done nor tested bool test_gradient(Planets planet, Quadtree quadtree, json test_config, Grid gGrid, Grid mGrid); bool test_gradient_cubesphere(Planets planet, Quadtree quadtree, Grid grid); -bool test_gradient_ijk(Planets planet, Grid grid); +bool test_gradient_ijk(Planets planet, Grid grid, bool debug); #endif \ No newline at end of file diff --git a/src/main/main.cpp b/src/main/main.cpp index 0ec17726..f5e6957a 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -12,7 +12,7 @@ int main() { int iErr = 0; std::string sError; - bool didWork = true; + bool didWork = true, testsPassing=true; Times time; @@ -117,8 +117,11 @@ int main() { Ions ionsMag(mGrid, planet); if (tests["test_gradient"]) { - test_gradient(planet, quadtree, tests, gGrid, mGrid); - } + testsPassing = test_gradient(planet, quadtree, tests, gGrid, mGrid); + } + + if (!testsPassing && tests["exit_on_fail"]) + throw std::string("Cannot continue!!"); // ----------------------------------------------------------------- // This is a unit test for checking for nans and infinities. diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index ef1c06c7..761b17e5 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -367,10 +367,9 @@ arma_cube calc_gradient2o_k(arma_cube value, Grid grid) { arma_cube calc_gradient_alt(arma_cube value, Grid grid) { - int64_t nX = grid.get_nLons(); - int64_t nY = grid.get_nLats(); - int64_t nZ = grid.get_nAlts(); - int64_t nGCs = grid.get_nGCs(); + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); int64_t iK; arma_cube gradient(nX, nY, nZ); diff --git a/srcTest/test_gradient.cpp b/srcTest/test_gradient.cpp index 6270e35a..cc0e546f 100644 --- a/srcTest/test_gradient.cpp +++ b/srcTest/test_gradient.cpp @@ -6,23 +6,94 @@ #include "aether.h" + +// Modularize the test function so it's easy to change +std::vector test_func(Grid grid, Planets planet, bool debug) { + + // one element for each coord; compatibility w/ doing individual functions + // out_vals has 6 elements: + // - first 3 are the function & last 3 are expected gradient + std::vector out_vals; + arma_cube one_elem, i_coords, j_coords, k_coords; + + if (grid.IsLatLonGrid) { + i_coords = grid.geoLon_scgc; + j_coords = grid.geoLat_scgc; + k_coords = grid.radius_scgc; + + // use the func cos(i) * sin(j) * r^2 + one_elem = cos(i_coords) % sin(j_coords) % k_coords % k_coords; + out_vals.push_back(one_elem); + out_vals.push_back(one_elem); + out_vals.push_back(one_elem); + + // The true gradient values: + out_vals.push_back(-600.0 * sin(i_coords) % tan(j_coords) % k_coords); + out_vals.push_back(cos(i_coords) % cos(j_coords) % k_coords); + out_vals.push_back(2.0 * cos(i_coords) % sin(j_coords) % k_coords); + } + + if (grid.IsDipole) { + std::cout<<"I AMN DIPOLE\n"; + precision_t planetRadius = planet.get_radius(0.0); + i_coords = grid.magLon_scgc; + j_coords = grid.magP_scgc; + k_coords = grid.magQ_scgc; + + // use the func cos(i) * sin(j) * r^2 + // one_elem = cos(grid.magLon_scgc) % sin(grid.magLat_scgc) % grid.radius_scgc % grid.radius_scgc; + one_elem = i_coords % i_coords + j_coords % j_coords + k_coords % k_coords; + out_vals.push_back(one_elem); + out_vals.push_back(one_elem); + out_vals.push_back(one_elem); + + arma_cube delT = pow(1 + 3.0 * cos(cPI/2. - grid.magLat_scgc) % cos(cPI/2. - grid.magLat_scgc), + 0.5); + + // arma_cube r = grid.radius_scgc / planetRadius; + // // The true gradient values: + // out_vals.push_back(-k_coords % k_coords % sin(i_coords) % j_coords % j_coords + // / (r % pow(cos(grid.magLat_scgc), 2.0))); // mayB sin + // out_vals.push_back(2.0 * delT % j_coords % j_coords % cos(i_coords) % j_coords + // / pow(cos(grid.magLat_scgc), 3.0)); // mayb sin??? + // out_vals.push_back(2.0 * delT % k_coords % cos(i_coords) % j_coords % j_coords + // / pow(r, 3.0)); + + out_vals.push_back(2.0 * i_coords + / (grid.radius_scgc % cos(grid.magLat_scgc))); // mayB sin + out_vals.push_back(2.0 * j_coords + % delT / pow(cos(grid.magLat_scgc), 3.0)); // mayb sin??? + out_vals.push_back(2.0 * k_coords + % delT / pow(grid.radius_scgc, 3.0)); + + } + + if (debug) { + std::string numproc = tostr(iProc, 2); + std::string gridshape = "gridshape-" + tostr(grid.iGridShape_, 2); + i_coords.save(gridshape + "_proc-" + numproc + "_i_center.txt", arma_ascii); + j_coords.save(gridshape + "_proc-" + numproc + "_j_center.txt", arma_ascii); + k_coords.save(gridshape + "_proc-" + numproc + "_k_center.txt", arma_ascii); + } + + return out_vals; +} + bool test_gradient(Planets planet, Quadtree quadtree, json test_config, Grid gGrid, Grid mGrid) { std::string function = "test_gradient"; static int iFunction = -1; report.enter(function, iFunction); - bool didWork; + bool didWork = true; + bool debug = test_config["dump_debug_cubes"]; report.print(2, "Testing neutral grid"); - if (gGrid.IsCubeSphereGrid) - didWork = test_gradient_cubesphere(planet, quadtree, gGrid); - if (gGrid.IsDipole || gGrid.IsLatLonGrid) - didWork = test_gradient_ijk(planet, gGrid); - - MPI_Barrier(aether_comm); + didWork = didWork && test_gradient_ijk(planet, gGrid, debug); + else + report.error("Cubesphere gradient test not built yet sorry"); if (!didWork && test_config["exit_on_fail"]) throw std::string("Gradient test failed - neutral grid"); @@ -30,122 +101,139 @@ bool test_gradient(Planets planet, Quadtree quadtree, json test_config, report.print(2, "Testing ion grid"); if (mGrid.IsCubeSphereGrid) // it's technically possible... - didWork = test_gradient_cubesphere(planet, quadtree, mGrid); + didWork = didWork && test_gradient_cubesphere(planet, quadtree, mGrid); if (mGrid.IsDipole || mGrid.IsLatLonGrid) - didWork = test_gradient_ijk(planet, mGrid); - - if (!didWork && test_config["exit_on_fail"]) - throw std::string("Gradient test failed - ion grid"); - + didWork = didWork && test_gradient_ijk(planet, mGrid, debug); + // if (!didWork && test_config["exit_on_fail"]) + // throw std::string("Gradient test failed - ion grid"); report.exit(function); return didWork; } -bool test_gradient_ijk(Planets planet, Grid grid) { +void send_message(std::string Message, int nGood, int nBad) { + std::string newMessage; + newMessage = "iProc: " + tostr(iProc, 2) + " " + Message; + printf("%s has FAILED! (%i/%i); or (%f) perc\n", newMessage.data(), nBad, nGood, + 100.*nBad / nGood); + return; +} + - std::string function = "test_gradient_dipole"; +bool test_gradient_ijk(Planets planet, Grid grid, bool debug) { + + std::string function = "test_gradient_ijk"; static int iFunction = -1; report.enter(function, iFunction); - int64_t nIs = grid.get_nX(); - int64_t nJs = grid.get_nY(); - int64_t nKs = grid.get_nZ(); + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t nZ = grid.get_nZ(); int64_t nGCs = grid.get_nGCs(); - int64_t nX, nY, nZ; - precision_t tol = 1e-3; - bool didWork = true; - - arma_cube predicted_gradient, true_gradient; - arma::uvec err_points; + // numbers of grid points without ghost cells: + int64_t nI, nJ, nK; + nI = nX - 2 * nGCs; + nJ = nY - 2 * nGCs; + nK = nZ - 2 * nGCs; - arma_cube gradient_error; - gradient_error.set_size(nIs, nJs, nKs); - gradient_error.zeros(); + bool didWork = true; int64_t nCellsTot = nX * nY * nZ; - int64_t nCellsNGCs = (nX - 2 * nGCs) * (nY - 2 * nGCs) * (nZ - 2 * nGCs); - - report.print(2, "Beginning i-gradient"); - - ///////////////////////////////////////////////////////////// - // Test the gradient in i-direction, d/dx(sin x) = cos(x) // - ///////////////////////////////////////////////////////////// - - predicted_gradient = calc_gradient2o_i(sin(grid.i_center_scgc), grid); - true_gradient = cos(grid.i_center_scgc) / (grid.di_center_m_scgc); - - gradient_error = abs(predicted_gradient - true_gradient) / abs(true_gradient); - err_points = find(abs(gradient_error.subcube(nGCs, nGCs, - nGCs, // don't look at ghost cells - size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) - > tol); - - didWork = all_finite(predicted_gradient, "Gradient_4o_i"); - - std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() - << ") => Points in i-gradient, above tol: " << - 100.0 * err_points.n_elem / predicted_gradient.n_elem - << "% (" << err_points.n_elem << ", " << - predicted_gradient.n_elem << ")\n"; + int64_t nCellsNGCs = nI * nJ * nK; + + report.print(2, "Beginning gradient test"); + + std::vector tmp, func_values, true_gradient, predicted_gradient; + tmp = test_func(grid, planet, debug); + + func_values.push_back(tmp[0]); + func_values.push_back(tmp[1]); + func_values.push_back(tmp[2]); + true_gradient.push_back(tmp[3]); + true_gradient.push_back(tmp[4]); + true_gradient.push_back(tmp[5]); + + if (grid.IsDipole) { + predicted_gradient.push_back(calc_gradient2o_i(func_values[0], grid)); + predicted_gradient.push_back(calc_gradient2o_j(func_values[1], grid)); + predicted_gradient.push_back(calc_gradient2o_k(func_values[2], grid)); + } else { + predicted_gradient.push_back(calc_gradient2o_i(func_values[0], grid)); + predicted_gradient.push_back(calc_gradient2o_j(func_values[1], grid)); + predicted_gradient.push_back(calc_gradient2o_k(func_values[2], grid)); + } - if (err_points.n_elem > true_gradient.n_elem * tol) + arma::uvec bad_is, bad_js, bad_ks; + + // Look for values > 5% different from expected + bad_is = find(abs( + (predicted_gradient[0].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2) + - true_gradient[0].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) + / true_gradient[0].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) > 0.25); + bad_js = find(abs( + (predicted_gradient[1].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2) + - true_gradient[1].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) + / true_gradient[1].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) > 0.25); + bad_ks = find(abs( + (predicted_gradient[2].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2) + - true_gradient[2].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) + / true_gradient[2].subcube(2, 2, 2, nI + 2, nJ + 2, nK + 2)) > 0.25); + + // ghost cells are hard; if more than 1% of *real* cells are out of spec, the test fails. + if (bad_is.n_elem > 0.1 * nCellsNGCs) { + send_message("grad_i:", nCellsNGCs, bad_is.n_elem); didWork = false; + } - report.print(2, "Beginning j-gradient"); - - ///////////////////////////////////////////////////////////// - // Test the gradient in j-direction, d/dx(cos x) = -sin(x) // - ///////////////////////////////////////////////////////////// - - predicted_gradient = calc_gradient2o_j(cos(grid.j_center_scgc), grid); - true_gradient = -1.0 * sin(grid.j_center_scgc) / grid.dj_center_m_scgc; - - gradient_error = predicted_gradient - true_gradient; - err_points = find(abs(gradient_error.subcube(nGCs, nGCs, nGCs, - size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) - > tol); - - didWork = didWork && all_finite(predicted_gradient, "Gradient_2o_j"); - - std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() - << ") => Points in j-gradient, above tol: " << - 100.0 * err_points.n_elem / predicted_gradient.n_elem - << "% (" << err_points.n_elem << ", " << - predicted_gradient.n_elem << ")\n"; - - if (err_points.n_elem > true_gradient.n_elem * tol) + if (bad_js.n_elem > 0.1 * nCellsNGCs) { + send_message("grad_j:", nCellsNGCs, bad_js.n_elem); didWork = false; + } + if (bad_ks.n_elem > 0.1 * nCellsNGCs) { + send_message("grad_k:", nCellsNGCs, bad_ks.n_elem); + didWork = false; + } - report.print(2, "Beginning k-gradient"); - - ////////////////////////////////////////////////////// - // Test the gradient in k-direction, d/dx(x^2) = 2x // - ////////////////////////////////////////////////////// - - predicted_gradient = calc_gradient2o_k(grid.radius2_scgc, grid); - true_gradient = 2.0 * grid.radius_scgc / grid.dk_center_m_scgc; - - gradient_error = (predicted_gradient - true_gradient); - err_points = find(abs(gradient_error.subcube(nGCs, nGCs, nGCs, - size(nIs - 2 * nGCs, nJs - 2 * nGCs, nKs - 2 * nGCs))) - > tol); - - didWork = didWork && all_finite(predicted_gradient, "Gradient_2o_k"); + // Output if requested: + std::string numproc = tostr(iProc, 2); + + if (debug) { + std::string numproc = tostr(iProc, 2); + std::string gridshape = "gridshape-" + tostr(grid.iGridShape_, 2) + "_iproc-"; + grid.di_center_m_scgc.save(gridshape + numproc + "_di_center_m.txt", + arma_ascii); + grid.dj_center_m_scgc.save(gridshape + numproc + "_dj_center_m.txt", + arma_ascii); + grid.dk_center_m_scgc.save(gridshape + numproc + "_dk_center_m.txt", + arma_ascii); + + func_values[0].save(gridshape + numproc + "_testfunc.txt", arma_ascii); + true_gradient[0].save(gridshape + numproc + "_actual_grad_i.txt", + arma_ascii); + true_gradient[1].save(gridshape + numproc + "_actual_grad_j.txt", + arma_ascii); + true_gradient[2].save(gridshape + numproc + "_actual_grad_k.txt", + arma_ascii); + + predicted_gradient[0].save(gridshape + numproc + "_i-predicted-grad.txt", + arma_ascii); + predicted_gradient[1].save(gridshape + numproc + "_j-predicted-grad.txt", + arma_ascii); + predicted_gradient[2].save(gridshape + numproc + "_k-predicted-grad.txt", + arma_ascii); + } - std::cout << "(iproc " << iProc << ", gridtype: " << grid.get_gridtype() - << ") => Points in k-gradient, above tol: " << - 100.0 * err_points.n_elem / predicted_gradient.n_elem - << "% (" << err_points.n_elem << ", " << - predicted_gradient.n_elem << ")\n"; + // For completeness, check for non-finites + didWork = didWork && all_finite(true_gradient, "TRUE GRADIENT"); + didWork = didWork && all_finite(func_values, "FUNCTION"); + didWork = didWork && all_finite(predicted_gradient, "AETHER'S GRADIENT"); - if (err_points.n_elem > true_gradient.n_elem * tol) - didWork = false; + report.report_errors(); report.exit(function); @@ -153,7 +241,7 @@ bool test_gradient_ijk(Planets planet, Grid grid) { } -// This is non-functional. +// This is non-functional. // Taken from src/main/main_test_gradient.cpp with enough edits to compile. bool test_gradient_cubesphere(Planets planet, Quadtree quadtree, Grid grid) { From 61ed7792715a27cc269aff2fba9c8556744fd6b4 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 18:42:12 -0400 Subject: [PATCH 590/691] STY: ASTYLE, YO --- include/grid.h | 30 +++++++++-------------- include/tools.h | 53 +++++++++++++++++++++------------------- src/output.cpp | 2 +- src/solver_gradients.cpp | 2 +- 4 files changed, 42 insertions(+), 45 deletions(-) diff --git a/include/grid.h b/include/grid.h index cde1a92c..9bb98b27 100644 --- a/include/grid.h +++ b/include/grid.h @@ -11,10 +11,9 @@ // Grid class // ---------------------------------------------------------------------------- -class Grid -{ +class Grid { -public: + public: const int iSphere_ = 1; const int iCubesphere_ = 2; const int iDipole_ = 3; @@ -97,7 +96,7 @@ class Grid arma_cube magAlt_Down; arma_cube magAlt_Below; arma_cube magAlt_Corner; - + arma_cube magP_Corner; arma_cube magQ_Corner; arma_cube magInvLat_Corner; @@ -358,7 +357,7 @@ class Grid int iProcZ; bool isExchangeInitialized = false; - + arma_vec edge_Xp; arma_vec edge_Yp; arma_vec edge_Xm; @@ -374,8 +373,7 @@ class Grid // again, z will only be in one int64_t iRootZ; - struct messages_struct - { + struct messages_struct { int64_t iFace; int64_t iProc_to; int64_t iSizeTotal; @@ -442,7 +440,7 @@ class Grid bool set_dipole_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, const std::vector &Alts); - + /** * \brief Create a map of geographic locations to data and do the interpolation * \param data The value at the positions of geoLon, geoLat, and geoAlt @@ -453,7 +451,7 @@ class Grid */ std::vector get_interpolation_values(const arma_cube &data) const; -private: + private: bool IsGeoGrid; bool HasBField; bool IsExperimental; @@ -481,8 +479,7 @@ class Grid // interpolation members // The struct representing the range of a spherical grid - struct sphere_range - { + struct sphere_range { precision_t lon_min; precision_t lon_max; precision_t dLon; @@ -493,8 +490,7 @@ class Grid precision_t alt_max; }; // The struct representing the range of a cubesphere grid - struct cubesphere_range - { + struct cubesphere_range { // The minimum value and delta change of row and col // We don't use row_max and col_max because they are not promised to be // greater than min, for example the right norm of suface 2 expands along @@ -521,7 +517,7 @@ class Grid bool col_max_exclusive; }; // The struct representing the range of a dipole grid (in magnetic coordinates) - struct dipole_range{ + struct dipole_range { precision_t lon_min; precision_t lon_max; precision_t dLon; @@ -536,8 +532,7 @@ class Grid // Each point is processed by the function set_interpolation_coefs and stored // in the form of this structure. // If the point is out of the grid, in_grid = false and all other members are undefined - struct interp_coef_t - { + struct interp_coef_t { // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] uint64_t iRow; uint64_t iCol; @@ -578,8 +573,7 @@ class Grid // Initialize connections between processors void init_connection(); // Used for message exchange - struct idx2d_t - { + struct idx2d_t { // Index of row and column int64_t ilon; int64_t ilat; diff --git a/include/tools.h b/include/tools.h index fd899c48..e8200476 100644 --- a/include/tools.h +++ b/include/tools.h @@ -8,11 +8,11 @@ // Structure for a 2x2 matrix for a cubesphere: // ---------------------------------------------------------------------------- -struct mat_2x2{ - arma_mat A11; - arma_mat A12; - arma_mat A21; - arma_mat A22; +struct mat_2x2 { + arma_mat A11; + arma_mat A12; + arma_mat A21; + arma_mat A22; }; // ----------------------------------------------------------------------------- @@ -23,9 +23,9 @@ struct mat_2x2{ // ----------------------------------------------------------------------------- bool find_interpolation_coefficients(arma_vec inX, - arma_vec outX, - arma_vec &outIndex, - arma_vec &outRatio); + arma_vec outX, + arma_vec &outIndex, + arma_vec &outRatio); // ----------------------------------------------------------------------------- // This takes the index and ratio determined in the above function and @@ -33,8 +33,8 @@ bool find_interpolation_coefficients(arma_vec inX, // ----------------------------------------------------------------------------- arma_vec interpolate1d(arma_vec inY, - arma_vec &index, - arma_vec &ratio); + arma_vec &index, + arma_vec &ratio); // ----------------------------------------------------------------------------- // Set all of the ghost cells to a constant value that is fed in. @@ -42,8 +42,8 @@ arma_vec interpolate1d(arma_vec inY, // ----------------------------------------------------------------------------- void set_gcs_to_value(arma_cube &var_scgc, - precision_t value, - int64_t nGCs); + precision_t value, + int64_t nGCs); // ---------------------------------------------------------------------------- // Fix corners in an arma cube @@ -101,39 +101,39 @@ precision_t sync_mean_across_all_procs(precision_t value); // ---------------------------------------------------------------------- std::vector get_normal_random_vect(double mean, - double std, - int64_t nValues, - int seed); + double std, + int64_t nValues, + int seed); // ---------------------------------------------------------------------- // Generate a vector of uniformly distributed random unsigned ints // ---------------------------------------------------------------------- std::vector get_random_unsigned_vect(int64_t nValues, - int seed); + int seed); // ---------------------------------------------------------------------- // Make a vector of arma cubes: // ---------------------------------------------------------------------- std::vector make_cube_vector(int64_t nLons, - int64_t nLats, - int64_t nAlts, - int64_t nComps); + int64_t nLats, + int64_t nAlts, + int64_t nComps); // ---------------------------------------------------------------------- // Take the dot product between two armadilo cubes // ---------------------------------------------------------------------- arma_cube dot_product(std::vector vec1, - std::vector vec2); + std::vector vec2); // ---------------------------------------------------------------------- // Take the cross product between two arma cubes // ---------------------------------------------------------------------- std::vector cross_product(std::vector vec1, - std::vector vec2); + std::vector vec2); // ---------------------------------------------------------------------- // Convert an armadillo vector to a c++ vector @@ -220,7 +220,8 @@ bool is_approx_equal(arma_vec &vec1, arma_vec &vec2, precision_t tol); //------------------------------------------------------------- // Overload col vector function with row vec //------------------------------------------------------------- -bool is_approx_equal(Row &vec1, Row &vec2, precision_t tol); +bool is_approx_equal(Row &vec1, Row &vec2, + precision_t tol); //------------------------------------------------------------- // Checks whether a vector is constant (all values the same) @@ -234,7 +235,8 @@ bool is_approx_constant(arma_vec &vec, precision_t tol); // u and v are spherical velocities // u1 and u2 are contravariant velocities // -------------------------------------------------------------------------- -void sphvect2ref(arma_mat& u, arma_mat& v, arma_mat& u1, arma_mat& u2, mat_2x2 &A_inv_mat); +void sphvect2ref(arma_mat& u, arma_mat& v, arma_mat& u1, arma_mat& u2, + mat_2x2 &A_inv_mat); // -------------------------------------------------------------------------- // Convert spherical vector (velocities) to reference (contravariant) vector @@ -242,7 +244,8 @@ void sphvect2ref(arma_mat& u, arma_mat& v, arma_mat& u1, arma_mat& u2, mat_2x2 & // u and v are spherical velocities // u1 and u2 are contravariant velocities // -------------------------------------------------------------------------- -void refvect2sph(arma_mat &u1, arma_mat &u2, arma_mat &u, arma_mat &v, mat_2x2 &A_mat); +void refvect2sph(arma_mat &u1, arma_mat &u2, arma_mat &u, arma_mat &v, + mat_2x2 &A_mat); //----------------------------------------------------------------------- // Checks if armacube(s) has all finite values, if not, adds them to @@ -293,7 +296,7 @@ std::vector indef_vector(arma_cube cube); // -------------------------------------------------------------------------- arma_vec sphere_to_cube(precision_t lon_in, precision_t lat_in); -// Used for dipole gradients & distances. +// Used for dipole gradients & distances. // Probably needs to be moved. arma_cube delTheta(arma_cube magLat); diff --git a/src/output.cpp b/src/output.cpp index fc1e7767..205701a7 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -28,7 +28,7 @@ std::string get_filename_from_type(std::string type_output) { if (type_output == "bfield") filename = "3DBF"; - + if (type_output == "delta") filename = "3DDE"; diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 761b17e5..b67617fb 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -73,7 +73,7 @@ arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { for (iX = 1; iX < nX - 1; iX++) gradient.row(iX) = (value.row(iX + 1) - value.row(iX - 1)) / - (2 * grid.di_center_m_scgc.row(iX)); + (2.0 * grid.di_center_m_scgc.row(iX)); // Lower (one sided): iX = 0; From 85f9c8722f106e872c57cd4c8e5f4b9fe0ef6e90 Mon Sep 17 00:00:00 2001 From: Aaron Bukowski Date: Wed, 13 Aug 2025 18:42:26 -0400 Subject: [PATCH 591/691] add radius to bfield output --- src/output.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/output.cpp b/src/output.cpp index 205701a7..f4adf0d9 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -287,6 +287,9 @@ bool output(const Neutrals &neutrals, "Magnetic Invariant Latitude", "degrees", grid.magInvLat_scgc * cRtoD); + AllOutputContainers[iOutput].store_variable("radius", + "m", + grid.radius_scgc); AllOutputContainers[iOutput].store_variable("mlt", "Magnetic Local Time", "hours", From e4ee36fad147388c228f5f4b10fd9465ece28ec8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:08:27 -0400 Subject: [PATCH 592/691] FEAT: added equal-angle terms for cubesphere --- include/grid.h | 93 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/include/grid.h b/include/grid.h index fed807e9..c9c82a1e 100644 --- a/include/grid.h +++ b/include/grid.h @@ -7,14 +7,47 @@ #include #include "mpi.h" +// ---------------------------------------------------------------------------- +// This structure needs to be defined outside of the grid, since we can just +// pass this stuff to the solver. +// ---------------------------------------------------------------------------- + +struct cubesphere_chars { + // For convenience, store the grid size: + int64_t nXt, nYt, nGCs; + int64_t iXfirst_, iXlast_; + int64_t iYfirst_, iYlast_; + + // These are for Ronchi et al., JCP 124, 93-114, 1996 + arma_mat X, Y, Z, C, D, d; + // These are the only things that depend on altitude: + arma_cube dlx, dln, dS; + // In theory, the radius is just a 1D vector: + arma_vec R; + // xi is the LR direction + // nu is the UD direction + arma_mat xi, nu; + // for the equal-angle grid, we can just use these: + precision_t dxi, dnu; + arma_mat Apn, Apx, Atn, Atx; + arma_mat Axt, Axp, Ant, Anp; + + // These are for computing normals to the cell edges (horizontal) + arma_mat nXiLon; + arma_mat nXiLat; + arma_mat nNuLon; + arma_mat nNuLat; + arma_mat lat, lon; +}; + + // ---------------------------------------------------------------------------- // Grid class // ---------------------------------------------------------------------------- -class Grid -{ +class Grid { -public: + public: const int iSphere_ = 1; const int iCubesphere_ = 2; const int iDipole_ = 3; @@ -66,6 +99,8 @@ class Grid arma_cube g11_upper_Down, g12_upper_Down, g21_upper_Down, g22_upper_Down; arma_cube sqrt_g_Down; + cubesphere_chars cubeC, cubeL, cubeD; + // These define the magnetic grid: // Armidillo Cube Versions: arma_cube magLon_scgc, magX_scgc; @@ -110,7 +145,7 @@ class Grid arma_cube magQ_Below; arma_cube magP_Corner; arma_cube magQ_Corner; - + // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent arma_vec mag_pole_north_ll; @@ -317,6 +352,29 @@ class Grid void create_sphere_grid(Quadtree quadtree); void create_cubesphere_connection(Quadtree quadtree); void create_cubesphere_grid(Quadtree quadtree); + + // These two go together, since one builds the angles and the + // other scales by the radius: + void init_cubesphere_grid(Quadtree quadtree, + arma_vec dr, + arma_vec du, + arma_vec ll, + precision_t left_off, + precision_t down_off, + cubesphere_chars &cubeX); + void scale_cube_by_radius(cubesphere_chars &cubeX); + + void convert_vector_xn_to_ll(arma_mat aXi, + arma_mat aNu, + arma_mat &aLon, + arma_mat &aLat, + cubesphere_chars grid); + void convert_vector_ll_to_xn(arma_mat aLon, + arma_mat aLat, + arma_mat &aXi, + arma_mat &aNu, + cubesphere_chars grid); + void create_altitudes(Planets planet); void fill_grid_bfield(Planets planet); bool read_restart(std::string dir); @@ -346,11 +404,11 @@ class Grid // nLats: number of latitudes (nY) // spacing_factor: (not supported yet), so always 1.0. Will adjust baselat spacing, eventually. arma_vec baselat_spacing(precision_t extent, - precision_t origin, - precision_t upper_lim, - precision_t lower_lim, - // int16_t nLats, - precision_t spacing_factor); + precision_t origin, + precision_t upper_lim, + precision_t lower_lim, + // int16_t nLats, + precision_t spacing_factor); // Update ghost cells with values from other processors void exchange(arma_cube &data, const bool pole_inverse); @@ -381,8 +439,7 @@ class Grid int64_t iRootYp; int64_t iRootYm; - struct messages_struct - { + struct messages_struct { int64_t iFace; int64_t iProc_to; int64_t iSizeTotal; @@ -444,7 +501,7 @@ class Grid */ std::vector get_interpolation_values(const arma_cube &data) const; -private: + private: bool IsGeoGrid; bool HasBField; bool IsExperimental; @@ -473,8 +530,7 @@ class Grid // interpolation members // The struct representing the range of a spherical grid - struct sphere_range - { + struct sphere_range { precision_t lon_min; precision_t lon_max; precision_t dLon; @@ -485,8 +541,7 @@ class Grid precision_t alt_max; }; // The struct representing the range of a cubesphere grid - struct cubesphere_range - { + struct cubesphere_range { // The minimum value and delta change of row and col // We don't use row_max and col_max because they are not promised to be // greater than min, for example the right norm of suface 2 expands along @@ -517,8 +572,7 @@ class Grid // Each point is processed by the function set_interpolation_coefs and stored // in the form of this structure. // If the point is out of the grid, in_grid = false and all other members are undefined - struct interp_coef_t - { + struct interp_coef_t { // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] uint64_t iRow; uint64_t iCol; @@ -555,8 +609,7 @@ class Grid // Initialize connections between processors void init_connection(); // Used for message exchange - struct idx2d_t - { + struct idx2d_t { // Index of row and column int64_t ilon; int64_t ilat; From 60d61ad937b0584c58f68a06bd796e49317908da Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:09:06 -0400 Subject: [PATCH 593/691] FEAT: added rochi cubesphere solver --- include/neutrals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/neutrals.h b/include/neutrals.h index 1ee222b6..61686eab 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -583,6 +583,7 @@ class Neutrals { \param report **/ void solver_horizontal_RK1(Grid& grid, Times& time); + void solver_horizontal_RK1_rochi(Grid& grid, Times& time); /********************************************************************** \brief Call the correct horizontal advection scheme with CE eqn From b9d0fa1e473353bb9710276c9b68194615d64e5b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:11:20 -0400 Subject: [PATCH 594/691] commented out some things that dont work yet --- src/advance.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index ba1af5f8..db69c24f 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -74,7 +74,6 @@ bool advance(Planets &planet, didWork = neutralsMag.check_for_nonfinites("Ion Grid: After extras"); - ions.fill_electrons(); ions.calc_sound_speed(); ions.calc_cMax(); @@ -111,7 +110,6 @@ bool advance(Planets &planet, didWork = neutralsMag.check_for_nonfinites("Ion Grid: set bcs"); - // advect in the 3rd dimension (vertical), but only if we have it: if (gGrid.get_nAlts(false) > 1) { neutrals.advect_vertical(gGrid, time); @@ -119,7 +117,11 @@ bool advance(Planets &planet, if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Neutral Advection"); - ions.advect_vertical(gGrid, time); + // ajr - ions.advect_vertical(gGrid, time); + + if (didWork & input.get_check_for_nans()) + didWork = ions.check_for_nonfinites("After Vertical Ion Advection"); + } // advect in the 1st and 2nd dimensions (horizontal), but only if @@ -127,12 +129,17 @@ bool advance(Planets &planet, if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { neutrals.exchange_old(gGrid); ions.exchange_old(gGrid); - advect(gGrid, time, neutrals); + neutrals.advect_horizontal(gGrid, time); } - if (didWork & input.get_check_for_nans()) { + if (input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); didWork = neutralsMag.check_for_nonfinites("Ion Grid: After Horizontal Advection"); + + if (!didWork) { + report.exit(function); + return didWork; + } } // ------------------------------------ @@ -199,10 +206,10 @@ bool advance(Planets &planet, didWork = neutralsMag.check_for_nonfinites("Ion Grid: After Add Sources"); } - ions.calc_ion_temperature(neutrals, gGrid, time); - // ions.calc_electron_temperature(neutrals, gGrid, time); + //ions.calc_ion_temperature(neutrals, gGrid, time); + //ions.calc_electron_temperature(neutrals, gGrid, time); //ionsMag.calc_ion_temperature(neutralsMag, mGrid, time); - ionsMag.calc_electron_temperature(neutralsMag, mGrid, time); + //ionsMag.calc_electron_temperature(neutralsMag, mGrid, time); if (didWork & input.get_check_for_nans()) didWork = neutrals.check_for_nonfinites("After Vertical Advection"); From e4af8a44309bfbe1da1385bddb7231e35590dff8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:12:11 -0400 Subject: [PATCH 595/691] FEAT: added equal-angular cubesphere grid --- src/grid_cubesphere.cpp | 450 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 427 insertions(+), 23 deletions(-) diff --git a/src/grid_cubesphere.cpp b/src/grid_cubesphere.cpp index d5c6742d..4be8c25c 100644 --- a/src/grid_cubesphere.cpp +++ b/src/grid_cubesphere.cpp @@ -72,6 +72,404 @@ void Grid::create_cubesphere_connection(Quadtree quadtree) { return; } + +// ---------------------------------------------------------------------- +// This function takes the normalized coordinates and makes latitude +// and longitude arrays from them. It can do this for the corners or +// edges, depending on the offset. +// ---------------------------------------------------------------------- + +void Grid::init_cubesphere_grid(Quadtree quadtree, + arma_vec dr, + arma_vec du, + arma_vec ll, + precision_t left_off, + precision_t down_off, + cubesphere_chars &cubeX) { + + std::string function = "Grid::init_cubesphere_grid"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dnu, dxi, nu0, xi0; + + // The du, dr, and ll were meant to be used on the cube + // and not really on the equal-angle grid. So, we probably + // want to rethink these... + if (quadtree.iSide == 0) { + dnu = du[2]; + dxi = dr[0]; + nu0 = ll[0]; + xi0 = ll[2]; + } + + if (quadtree.iSide == 1) { + dnu = du[2]; + dxi = dr[1]; + nu0 = ll[1]; + xi0 = ll[2]; + } + + if (quadtree.iSide == 2) { + dnu = du[2]; + dxi = -dr[0]; + nu0 = -ll[0]; + xi0 = ll[2]; + } + + if (quadtree.iSide == 3) { + dnu = du[2]; + dxi = -dr[1]; + nu0 = -ll[1]; + xi0 = ll[2]; + } + + if (quadtree.iSide == 4) { + dnu = du[0]; + dxi = dr[1]; + nu0 = ll[1]; + xi0 = ll[0]; + } + + if (quadtree.iSide == 5) { + dnu = -du[0]; + dxi = dr[1]; + nu0 = ll[1]; + xi0 = -ll[0]; + } + + // Normalized from -1 to 1 -> -pi/4 to pi/4 + dnu = dnu * cPI / 4.0; + dxi = dxi * cPI / 4.0; + nu0 = nu0 * cPI / 4.0; + xi0 = xi0 * cPI / 4.0; + + cubeX.dnu = dnu; + cubeX.dxi = dxi; + + int64_t iDU, iLR; + precision_t iD, iL; + int64_t nXp = nX, nYp = nY; + + // If we are shifting the grid over and doing edges, we + // need to increase the number of points by 1 in that + // direction: + if (left_off < cSmall) + nXp++; + + if (down_off < cSmall) + nYp++; + + // These are convenient for the solver: + cubeX.nXt = nXp; + cubeX.nYt = nYp; + cubeX.nGCs = nGCs; + cubeX.iXfirst_ = nGCs; + cubeX.iXlast_ = nXp - nGCs; + cubeX.iYfirst_ = nGCs; + cubeX.iYlast_ = nYp - nGCs; + + // these are coordinates: + cubeX.lat.resize(nXp, nYp); + cubeX.lon.resize(nXp, nYp); + cubeX.nu.resize(nXp, nYp); + cubeX.xi.resize(nXp, nYp); + + cubeX.X.resize(nXp, nYp); + cubeX.Y.resize(nXp, nYp); + cubeX.Z.resize(nXp, nYp); + cubeX.C.resize(nXp, nYp); + cubeX.D.resize(nXp, nYp); + cubeX.d.resize(nXp, nYp); + + // These are dependent on radius, + // but that is not included at this time: + cubeX.dlx.resize(nXp, nYp, nZ); + cubeX.dln.resize(nXp, nYp, nZ); + cubeX.dS.resize(nXp, nYp, nZ); + cubeX.R.resize(nZ); + + // These are matricies for rotating vectors: + cubeX.Apn.resize(nXp, nYp); + cubeX.Apx.resize(nXp, nYp); + cubeX.Atn.resize(nXp, nYp); + cubeX.Atx.resize(nXp, nYp); + cubeX.Axt.resize(nXp, nYp); + cubeX.Axp.resize(nXp, nYp); + cubeX.Ant.resize(nXp, nYp); + cubeX.Anp.resize(nXp, nYp); + + // These are for computing normals to the cell edges (horizontal) + cubeX.nXiLon.resize(nXp, nYp); + cubeX.nXiLat.resize(nXp, nYp); + cubeX.nNuLon.resize(nXp, nYp); + cubeX.nNuLat.resize(nXp, nYp); + + precision_t det, dmo, latp, lonp; + + // Loop through each point and derive the coordinate + for (iDU = 0; iDU < nY; iDU++) { + for (iLR = 0; iLR < nX; iLR++) { + + // the offsets are so we can find cell centers, edges, and corners + iD = iDU - nGCs + down_off; + iL = iLR - nGCs + left_off; + + // Define local coordinates: + // Xi is LR (x), Nu is UD (y) + cubeX.nu(iLR, iDU) = (nu0 + dnu * iD); + cubeX.xi(iLR, iDU) = (xi0 + dxi * iL); + + cubeX.X(iLR, iDU) = tan(cubeX.xi(iLR, iDU)); + cubeX.Y(iLR, iDU) = tan(cubeX.nu(iLR, iDU)); + + // Transformation from 3D Cartesian to LatLong + // lonp = std::atan2(y_cart, x_cart) + cPI/2.0; + if (quadtree.iSide == 0) { + lonp = std::atan(cubeX.X(iLR, iDU)); + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(1.0 / cubeX.Y(iLR, iDU) / std::cos(lonp)); + } + + if (quadtree.iSide == 1) { + lonp = std::atan(-1.0 / cubeX.X(iLR, iDU)); + + if (lonp < 0) + lonp = cPI + lonp; + + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(1.0 / cubeX.Y(iLR, iDU) / std::sin(lonp)); + } + + if (quadtree.iSide == 2) { + lonp = std::atan(cubeX.X(iLR, iDU)) + cPI; + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(-1.0 / cubeX.Y(iLR, iDU) / std::cos(lonp)); + } + + if (quadtree.iSide == 3) { + lonp = std::atan(-1.0 / cubeX.X(iLR, iDU)); + + if (lonp > 0) + lonp = lonp + cPI; + else + lonp = 2 * cPI + lonp; + + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(-1.0 / cubeX.Y(iLR, iDU) / std::sin(lonp)); + } + + if (quadtree.iSide == 4) { + lonp = std::atan2(cubeX.X(iLR, iDU), cubeX.Y(iLR, iDU)); + latp = std::atan2(-cubeX.Y(iLR, iDU), cos(lonp) ); + } + + if (quadtree.iSide == 5) { + lonp = std::atan2(-cubeX.X(iLR, iDU), cubeX.Y(iLR, iDU)); + latp = -std::atan2(-cubeX.Y(iLR, iDU), cos(lonp) ); + } + + if (latp > 0) + latp = cPI / 2 - latp; + else + latp = -(cPI / 2 + latp); + + if (lonp > cTWOPI) + lonp = lonp - cTWOPI; + + if (lonp < 0.0) + lonp = lonp + cTWOPI; + + // Fill Computed coords + cubeX.lat(iLR, iDU) = latp; + cubeX.lon(iLR, iDU) = lonp; + + cubeX.d(iLR, iDU) = + 1 + + cubeX.X(iLR, iDU) * cubeX.X(iLR, iDU) + + cubeX.Y(iLR, iDU) * cubeX.Y(iLR, iDU); + + cubeX.C(iLR, iDU) = + sqrt(1 + cubeX.X(iLR, iDU) * cubeX.X(iLR, iDU)); + cubeX.D(iLR, iDU) = + sqrt(1 + cubeX.Y(iLR, iDU) * cubeX.Y(iLR, iDU)); + + if (quadtree.iSide < 4) { + cubeX.Axt(iLR, iDU) = 0.0; + cubeX.Axp(iLR, iDU) = + cubeX.C(iLR, iDU) * cubeX.D(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + cubeX.Ant(iLR, iDU) = -1.0; + cubeX.Anp(iLR, iDU) = + cubeX.X(iLR, iDU) * cubeX.Y(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + } else { + if (cubeX.d(iLR, iDU) < 1.0001) + cubeX.d(iLR, iDU) = 1.0001; + + dmo = 1.0 / std::sqrt(cubeX.d(iLR, iDU) - 1); + + if (quadtree.iSide == 4) { + cubeX.Axt(iLR, iDU) = + - dmo * cubeX.D(iLR, iDU) * cubeX.X(iLR, iDU); + cubeX.Axp(iLR, iDU) = + dmo * cubeX.D(iLR, iDU) * cubeX.Y(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + cubeX.Ant(iLR, iDU) = + - dmo * cubeX.C(iLR, iDU) * cubeX.Y(iLR, iDU); + cubeX.Anp(iLR, iDU) = + - dmo * cubeX.C(iLR, iDU) * cubeX.X(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + + } else { + // iFace == 5 + cubeX.Axt(iLR, iDU) = + dmo * cubeX.D(iLR, iDU) * cubeX.X(iLR, iDU); + cubeX.Axp(iLR, iDU) = + - dmo * cubeX.D(iLR, iDU) * + cubeX.Y(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + cubeX.Ant(iLR, iDU) = + dmo * cubeX.C(iLR, iDU) * cubeX.Y(iLR, iDU); + cubeX.Anp(iLR, iDU) = + dmo * cubeX.C(iLR, iDU) * + cubeX.X(iLR, iDU) / + sqrt(cubeX.d(iLR, iDU)); + } + } + + // Calculate inverse of matrix for calculating Ax and An from At and Ap: + det = 1.0 / (cubeX.Axt(iLR, iDU) * cubeX.Anp(iLR, iDU) - + cubeX.Axp(iLR, iDU) * cubeX.Ant(iLR, iDU)); + + cubeX.Atx(iLR, iDU) = det * cubeX.Anp(iLR, iDU); + cubeX.Atn(iLR, iDU) = - det * cubeX.Axp(iLR, iDU); + cubeX.Apx(iLR, iDU) = - det * cubeX.Ant(iLR, iDU); + cubeX.Apn(iLR, iDU) = det * cubeX.Axt(iLR, iDU); + + // These (dlx and dln) need to be multiplied by radius + cubeX.dlx(iLR, iDU, 0) = + cubeX.D(iLR, iDU) * dxi / + cubeX.d(iLR, iDU) / + (cos(cubeX.xi(iLR, iDU)) * cos(cubeX.xi(iLR, iDU))); + cubeX.dln(iLR, iDU, 0) = + cubeX.C(iLR, iDU) * dnu / + cubeX.d(iLR, iDU) / + (cos(cubeX.nu(iLR, iDU)) * cos(cubeX.nu(iLR, iDU))); + + // Need to multiply dS * radius ^ 2 + cubeX.dS(iLR, iDU, 0) = + dxi * dnu / + (sqrt(cubeX.d(iLR, iDU) * cubeX.d(iLR, iDU) * cubeX.d(iLR, iDU)) * + cos(cubeX.xi(iLR, iDU)) * cos(cubeX.xi(iLR, iDU)) * + cos(cubeX.nu(iLR, iDU)) * cos(cubeX.nu(iLR, iDU))); + + } + } + + // Calculate norms given the values above: + arma_mat e1Lat, e1Lon, e2Lat, e2Lon, m, one, zero; + m.resize(nXp, nYp); + one.resize(nXp, nYp); + one.fill(1.0); + zero.resize(nXp, nYp); + zero.fill(0.0); + + // define e1 as the LR (xi) direction: + e1Lat.resize(nXp, nYp); + e1Lon.resize(nXp, nYp); + convert_vector_xn_to_ll(one, zero, e1Lon, e1Lat, cubeX); + m = sqrt(e1Lon % e1Lon + e1Lat % e1Lat); + + // Rotate by 90 deg (CCW) to get the norm: + cubeX.nNuLon = -e1Lat / m; + cubeX.nNuLat = e1Lon / m; + + // define e2 as the DU (nu) direction: + e2Lat.resize(nXp, nYp); + e2Lon.resize(nXp, nYp); + convert_vector_xn_to_ll(zero, one, e2Lon, e2Lat, cubeX); + m = sqrt(e2Lon % e2Lon + e2Lat % e2Lat); + // Rotate by 90 deg (CW) to get the norm: + cubeX.nXiLon = e2Lat / m; + cubeX.nXiLat = -e2Lon / m; + + report.exit(function); + return; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +void Grid::convert_vector_xn_to_ll(arma_mat aXi, + arma_mat aNu, + arma_mat &aLon, + arma_mat &aLat, + cubesphere_chars grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + aLat = -(grid.Atx % aXi + grid.Atn % aNu); + aLon = grid.Apx % aXi + grid.Apn % aNu; + + return; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +void Grid::convert_vector_ll_to_xn(arma_mat aLon, + arma_mat aLat, + arma_mat &aXi, + arma_mat &aNu, + cubesphere_chars grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + aXi = -grid.Axt % aLat + grid.Axp % aLon; + aNu = -grid.Ant % aLat + grid.Anp % aLon; + return; +} + + + +// ---------------------------------------------------------------------- +// This function scales the deltas in the grid by the radius +// - This assumes that radius is not dependent on lat / lon!!! +// ---------------------------------------------------------------------- + +void Grid::scale_cube_by_radius(cubesphere_chars &cubeX) { + + int64_t iZ; + + for (iZ = 1; iZ < nZ; iZ++) { + cubeX.R(iZ) = radius_scgc(nGCs, nGCs, iZ); + // These are distances: + cubeX.dlx.slice(iZ) = + cubeX.dlx.slice(0) * cubeX.R(iZ); + cubeX.dln.slice(iZ) = + cubeX.dln.slice(0) * cubeX.R(iZ); + // This is an area: + cubeX.dS.slice(iZ) = + cubeX.dS.slice(0) * cubeX.R(iZ) * cubeX.R(iZ); + } + + // Lastly, scale the 0th slice + iZ = 0; + cubeX.R(iZ) = radius_scgc(nGCs, nGCs, iZ); + cubeX.dlx.slice(iZ) = + cubeX.dlx.slice(0) * cubeX.R(iZ); + cubeX.dln.slice(iZ) = + cubeX.dln.slice(0) * cubeX.R(iZ); + // This is an area: + cubeX.dS.slice(iZ) = + cubeX.dS.slice(0) * cubeX.R(iZ) * cubeX.R(iZ); + + return; +} + // ---------------------------------------------------------------------- // This function takes the normalized coordinates and makes latitude // and longitude arrays from them. It can do this for the corners or @@ -85,10 +483,10 @@ void fill_cubesphere_lat_lon_from_norms(Quadtree quadtree, int64_t nGCs, precision_t left_off, precision_t down_off, - arma_mat &lat2d, - arma_mat &lon2d, - arma_mat &refx, - arma_mat &refy) { + arma_mat & lat2d, + arma_mat & lon2d, + arma_mat & refx, + arma_mat & refy) { int64_t nX = lat2d.n_rows; int64_t nY = lat2d.n_cols; @@ -172,25 +570,25 @@ void fill_cubesphere_lat_lon_from_norms(Quadtree quadtree, // generate transformation and metric tensors // ---------------------------------------------------------------------- void transformation_metrics(Quadtree quadtree, - arma_mat &lat2d, - arma_mat &lon2d, - arma_mat &refx, - arma_mat &refy, - arma_mat &A11, - arma_mat &A12, - arma_mat &A21, - arma_mat &A22, - arma_mat &A11_inv, - arma_mat &A12_inv, - arma_mat &A21_inv, - arma_mat &A22_inv, - arma_mat &g11_upper, - arma_mat &g12_upper, - arma_mat &g21_upper, - arma_mat &g22_upper, - arma_mat &sqrt_g, - arma_mat &refx_angle, - arma_mat &refy_angle) { + arma_mat & lat2d, + arma_mat & lon2d, + arma_mat & refx, + arma_mat & refy, + arma_mat & A11, + arma_mat & A12, + arma_mat & A21, + arma_mat & A22, + arma_mat & A11_inv, + arma_mat & A12_inv, + arma_mat & A21_inv, + arma_mat & A22_inv, + arma_mat & g11_upper, + arma_mat & g12_upper, + arma_mat & g21_upper, + arma_mat & g22_upper, + arma_mat & sqrt_g, + arma_mat & refx_angle, + arma_mat & refy_angle) { int64_t nX = lat2d.n_rows; int64_t nY = lat2d.n_cols; @@ -343,6 +741,12 @@ void Grid::create_cubesphere_grid(Quadtree quadtree) { du = size_up_norm / (nLats - 2 * nGCs); ll = lower_left_norm; + // This function builds the equal-angle grid, but doesn't + // scale them with altitude, since that has not been created, yet: + init_cubesphere_grid(quadtree, dr, du, ll, 0.5, 0.5, cubeC); + init_cubesphere_grid(quadtree, dr, du, ll, 0.0, 0.5, cubeL); + init_cubesphere_grid(quadtree, dr, du, ll, 0.5, 0.0, cubeD); + int64_t iAlt, iLon, iLat; // --------------------------------------------- From 8f183f9864cb28ea0a0ae95c213bc6585adedaa3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:13:18 -0400 Subject: [PATCH 596/691] FEAT: added equal-angular cubesphere grid --- src/init_geo_grid.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 78b75acb..0dbae8db 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -190,12 +190,10 @@ bool Grid::init_geo_grid(Quadtree quadtree, // report.print(1, "Restarting! Reading grid files!"); // DidWork = read_restart(input.get_restartin_dir()); //} else { - if (iGridShape_ == iCubesphere_) { - //if (input.get_do_restart()) - // report.print(0, "Not restarting the grid - it is too complicated!"); - + if (iGridShape_ == iCubesphere_) create_cubesphere_grid(quadtree); - } else + + else create_sphere_grid(quadtree); //MPI_Barrier(aether_comm); @@ -211,8 +209,15 @@ bool Grid::init_geo_grid(Quadtree quadtree, // Correct the reference grid with correct length scale: // (with R = actual radius) - if (iGridShape_ == iCubesphere_) + if (iGridShape_ == iCubesphere_) { correct_xy_grid(planet); + // New functions for equal-angular grid (center, left, down): + report.print(3, "Scaling Cube by Radius"); + scale_cube_by_radius(cubeC); + scale_cube_by_radius(cubeL); + scale_cube_by_radius(cubeD); + report.print(3, "Done Scaling Cube by Radius"); + } if (IsMagGrid) { report.print(0, "--> Grid is Magnetic, so rotating"); From 04a87ef1d769c813f258de41d68a66601657881f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:14:03 -0400 Subject: [PATCH 597/691] FEAT: equal-angular solver is default --- src/neutrals_advect.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index 8316cbeb..465afad3 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -42,11 +42,10 @@ bool Neutrals::advect_horizontal(Grid & grid, Times & time) { if (input.get_advection_neutrals_horizontal() == "advect_test") solver_horizontal_RK4_advection(grid, time); - else if (input.get_advection_neutrals_horizontal() == "fv") { - solver_horizontal_RK1(grid, time); + else if (input.get_advection_neutrals_horizontal() == "fv") + solver_horizontal_RK1_rochi(grid, time); - std::cout << "after rk1 : " << velocity_vcgc[0](20, 13, 10) << "\n"; - } else { + else { std::cout << "Horizontal solver not found!\n"; std::cout << " ==> Requested : " << input.get_advection_neutrals_horizontal() From 2faca6d235372b90a5bb1afec77406dcf8270f43 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:14:42 -0400 Subject: [PATCH 598/691] FEAT: added, and commented out, blob for testing --- src/neutrals_ics.cpp | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 7b9613ba..c6a0c281 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -35,6 +35,8 @@ bool Neutrals::initial_conditions(Grid grid, precision_t alt, r; int64_t nAlts = grid.get_nZ(true); int64_t nGCs = grid.get_nGCs(); + int64_t nLons = grid.get_nLons(); + int64_t nLats = grid.get_nLats(); report.print(3, "Creating Neutrals initial_condition"); @@ -120,10 +122,6 @@ bool Neutrals::initial_conditions(Grid grid, // temperature profile in the planet.in file. // --------------------------------------------------------------------- - int64_t nLons = grid.get_nLons(); - int64_t nLats = grid.get_nLats(); - int64_t nAlts = grid.get_nAlts(); - // Let's assume that the altitudes are not dependent on lat/lon: arma_vec alt1d(nAlts); @@ -190,6 +188,41 @@ bool Neutrals::initial_conditions(Grid grid, } // type = planet } + /* + This section is for putting an initial blob into the simulation + to test the advection solver. + precision_t lon_0 = 0.0; + precision_t lat_0 = 0.0; + precision_t r_0 = 150.0 * 1000.0 * 10.0; + + for (iAlt = 0; iAlt < nAlts; iAlt++) { + + for (int64_t iLat = 0; iLat < nLats; iLat++) { + for (int64_t iLon = 0; iLon < nLons; iLon++) { + precision_t curr_lat = grid.geoLat_scgc(iLon, iLat, iAlt); + precision_t curr_lon = grid.geoLon_scgc(iLon, iLat, iAlt); + precision_t R = grid.radius_scgc(iLon, iLat, iAlt); + + // Calculate great circle distance + precision_t dlon_2 = (curr_lon - lon_0) / 2.0; + precision_t dlat_2 = (curr_lat - lat_0) / 2.0; + + precision_t r_d = 2.0 * R * asin(sqrt(sin(dlat_2) * sin(dlat_2) + sin( + dlon_2) * sin(dlon_2) * cos(curr_lat) * cos(lat_0))); + + if (r_d < r_0) { + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + species[iSpecies].density_scgc(iLon, iLat, + iAlt) = species[iSpecies].density_scgc(iLon, iLat, iAlt) * 10.; + std::cout << "increasing density!\n"; + } + } + } + } + } + */ + + // ensure that the densities are all within bounds: clamp_density(); From c2ba58d828d2435f12c44422a72546627d7c6e39 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:15:28 -0400 Subject: [PATCH 599/691] removed a bunch of commented out code --- src/solver_vertical_rusanov.cpp | 75 +-------------------------------- 1 file changed, 2 insertions(+), 73 deletions(-) diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 8027cd94..8bac9c04 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -86,23 +86,6 @@ void calc_facevalues_alts_rusanov(Grid &grid, 0.5 * dVarLimited.slice(iZ) % grid.dalt_lower_scgc.slice(iZ); } - /* - if (iProc == 11) - std::cout << "facevalues : " - << inVar(7,19,17) << " " - << inVar(7,19,18) << " " - << inVar(7,19,19) << " " - << inVar(7,19,20) << " " - << dVarLimited(7,19,18) << " " - << grid.dalt_lower_scgc(7,19,17) << " " - << outRight(7, 19, 17) << " " - << outRight(7, 19, 18) << " " - << outLeft(7, 19, 17) << " " - << outLeft(7, 19, 18) << " " - << dVarUp(7, 19) << " " - << dVarDown(7, 19) << "\n"; - */ - return; } @@ -144,16 +127,6 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, varLeft.slice(iZ) - varRight.slice(iZ)) / grid.dalt_center_scgc.slice(iZ); - /* - if (iProc == 11) - std::cout << "calc_grad : " - << varLeft(7, 19, 17) << " " - << varLeft(7, 19, 18) << " " - << varRight(7, 19, 17) << " " - << varRight(7, 19, 18) << " " - << grid.dalt_center_scgc(7, 19, 17) << " " - << outGrad(7, 19, 17) << "\n"; - */ for (iZ = nGCs; iZ < nZs - nGCs + 1; iZ++) { for (iX = nGCs; iX < nXs - nGCs; iX++) for (iY = nGCs; iY < nYs - nGCs; iY++) { @@ -164,11 +137,7 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, diffFlux(iX, iY, iZ) = 0.5 * cMaxLocal * (varRight(iX, iY, iZ) - varLeft(iX, iY, iZ)); - //if (iZ <= 10 && iX == 4 && iY == 4) - // std::cout << "diff flux : " << diffFlux(iX, iY, iZ) - // << " " << cMaxLocal - // << " " << varRight(iX, iY, iZ) - // << " " << varLeft(iX, iY, iZ) << "\n"; + } } @@ -311,17 +280,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, species[iSpecies].velocity_vcgc[2] % gradLogN_s[iSpecies]) + dt * diffLogN_s[iSpecies]; species[iSpecies].newDensity_scgc = exp(log_s); - /* - std::cout << iSpecies << " " << log_s(2,2,19) << " " - << dt << " " - << divVertVel_s[iSpecies](2,2,19) << " " - << species[iSpecies].velocity_vcgc[2](2,2,19) << " " - << gradLogN_s[iSpecies](2,2,19) << " " - << species[iSpecies].velocity_vcgc[2](2,2,19) * gradLogN_s[iSpecies](2,2,19) << " " - << diffLogN_s[iSpecies](2,2,19) << " " - << species[iSpecies].density_scgc(2,2,19) << " " - << species[iSpecies].newDensity_scgc(2,2,19) << "\n"; - */ + accTotal = dt * grid.gravity_vcgc[2] - dt * temperature_scgc % gradLogN_s[iSpecies] * cKB / mass @@ -386,36 +345,6 @@ void Neutrals::solver_vertical_rusanov(Grid grid, } } - bool doPrintThis = false; - - if (doPrintThis) { - iX = 2; - iY = 2; - iSpecies = 0; - mass = species[iSpecies].mass; - - for (int iAlt = 19; iAlt < 20; iAlt++) { - std::cout << iAlt << " " - << log(species[iSpecies].density_scgc(iX, iY, iAlt)) << " " - << temperature_scgc(iX, iY, iAlt) << " " - << species[iSpecies].velocity_vcgc[2](iX, iY, iAlt) << " " - << temperature_scgc(iX, iY, iAlt) * gradLogN_s[iSpecies](iX, iY, - iAlt) * cKB / mass << " " - << gradTemp(iX, iY, iAlt) * cKB / mass << " " - << grid.gravity_vcgc[2](iX, iY, iAlt) << "\n"; - } - } - - //calc_neutral_friction(); - /* - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - if (species[iSpecies].DoAdvect) { - species[iSpecies].velocity_vcgc[2] = - species[iSpecies].velocity_vcgc[2] + dt * - species[iSpecies].acc_neutral_friction[2]; - } - } - */ calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); From 3e7cff874a13133f6c5da62a56cecaae1e9743a3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:16:32 -0400 Subject: [PATCH 600/691] FEAT: added equal-angle cubesphere solver --- src/solver_horizontal_cubesphere.cpp | 365 ++++++++++++++++++++++++++- 1 file changed, 358 insertions(+), 7 deletions(-) diff --git a/src/solver_horizontal_cubesphere.cpp b/src/solver_horizontal_cubesphere.cpp index 88d491b9..98868b1a 100644 --- a/src/solver_horizontal_cubesphere.cpp +++ b/src/solver_horizontal_cubesphere.cpp @@ -2,15 +2,310 @@ // Full license can be found in License.md // Initial version: F. Cheng, July 2023 +// Moved to new solver: August 2025 #include "aether.h" +// --------------------------------------------------------- +// Update States +// --------------------------------------------------------- + +void update_states_cubesphere(arma_mat rho, + arma_mat &xVel, + arma_mat &yVel, + arma_mat &temp, + arma_mat &drhodt, + arma_mat &dlonVeldt, + arma_mat &dlatVeldt, + arma_mat &dtempdt, + cubesphere_chars gridC, + cubesphere_chars gridL, + cubesphere_chars gridD, + precision_t dt, + int64_t iZ) { + + arma_mat xMomentum, yMomentum; + arma_mat rhoE, energy, vel2; + + precision_t cv = 1500.0; + + if (report.test_verbose(2)) + std::cout << " --> update_states\n"; + + // Derived variables: + xMomentum = rho % xVel; // x1momentum, pure scalar field + yMomentum = rho % yVel; // y1momentum, pure scalar field + rhoE = rho % temp; + + vel2 = xVel % xVel + yVel % yVel; + //energy = rho % (0.5 * vel2 + cv * temp); + energy = cv * rho % temp; + + /** Initialize projection constructs */ + static projection_struct rhoP; + static projection_struct xMomentumP, xVelP; + static projection_struct yMomentumP, yVelP; + static projection_struct energyP; + static projection_struct tempP; + + // They are all pure scalar fields without sqrt(g) + static arma_mat totaleL, totaleR, totaleD, totaleU; + static arma_mat velL2, velR2, velD2, velU2; + static arma_mat pressureL, pressureR, pressureD, pressureU; + + arma_mat dxVeldt = xVel * 0.0; + arma_mat dyVeldt = yVel * 0.0; + + dlonVeldt = dxVeldt * 0.0 + 1; + dlatVeldt = dyVeldt * 0.0 + 1; + + static arma_mat velNormL, velNormR, velNormU, velNormD; + + /** Initialize Flux and Wave Speed Storages */ + static arma_mat eq1FluxLR, eq1FluxDU; + static arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + static arma_mat eq2FluxLR, eq2FluxDU; + static arma_mat eq2FluxL, eq2FluxR, eq2FluxD, eq2FluxU; + static arma_mat eq3FluxLR, eq3FluxDU; + static arma_mat eq3FluxL, eq3FluxR, eq3FluxD, eq3FluxU; + static arma_mat eq4FluxLR, eq4FluxDU; + static arma_mat eq4FluxL, eq4FluxR, eq4FluxD, eq4FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat diff; // for Riemann Solver + + if (report.test_verbose(3)) + std::cout << " ---> Projecting\n"; + + rhoP = project_to_edges(rho, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + // project the lon / lat velocities to the edges: + xVelP = project_to_edges(xVel, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + yVelP = project_to_edges(yVel, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + xMomentumP = project_to_edges(xMomentum, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + yMomentumP = project_to_edges(yMomentum, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + energyP = project_to_edges(energy, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + tempP = project_to_edges(temp, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + + if (report.test_verbose(3)) + std::cout << " ---> Derived values\n"; + + velL2 = (xVelP.L % xVelP.L + yVelP.L % yVelP.L); + velR2 = (xVelP.R % xVelP.R + yVelP.R % yVelP.R); + velD2 = (xVelP.D % xVelP.D + yVelP.D % yVelP.D); + velU2 = (xVelP.U % xVelP.U + yVelP.U % yVelP.U); + + precision_t k = 1.38e-23; + // let's be Oxygen: + precision_t mass = 16.0 * 1.67e-27; + pressureL = k / mass * (rhoP.L % tempP.L); + pressureR = k / mass * (rhoP.R % tempP.R); + pressureD = k / mass * (rhoP.D % tempP.D); + pressureU = k / mass * (rhoP.U % tempP.U); + + arma_mat pressureLR = (pressureL + pressureR) / 2; + arma_mat pressureDU = (pressureD + pressureU) / 2; + + if (report.test_verbose(3)) + std::cout << " ---> Normal Velocities\n"; + + // Calculate the normal velocity at the boundaries: + velNormL = xVelP.L % gridL.nXiLon + yVelP.L % gridL.nXiLat; + velNormR = xVelP.R % gridL.nXiLon + yVelP.R % gridL.nXiLat; + velNormU = xVelP.U % gridD.nNuLon + yVelP.U % gridD.nNuLat; + velNormD = xVelP.D % gridD.nNuLon + yVelP.D % gridD.nNuLat; + + if (report.test_verbose(3)) + std::cout << " ---> Fluxes eq 1\n"; + + // Flux calculated from the left of the edge + eq1FluxL = rhoP.L % velNormL; + // Flux calculated from the right of the edge + eq1FluxR = rhoP.R % velNormR; + // Flux calculated from the down of the edge + eq1FluxD = rhoP.D % velNormD; + // Flux calculated from the up of the edge + eq1FluxU = rhoP.U % velNormU; + + if (report.test_verbose(3)) + std::cout << " ---> Fluxes eq 2\n"; + + eq2FluxL = (xMomentumP.L % velNormL); + eq2FluxR = (xMomentumP.R % velNormR); + eq2FluxD = (xMomentumP.D % velNormD); + eq2FluxU = (xMomentumP.U % velNormU); + + if (report.test_verbose(3)) + std::cout << " ---> Fluxes eq 3\n"; + + eq3FluxL = (yMomentumP.L % velNormL); + eq3FluxR = (yMomentumP.R % velNormR); + eq3FluxD = (yMomentumP.D % velNormD); + eq3FluxU = (yMomentumP.U % velNormU); + + eq4FluxL = energyP.L % velNormL; + eq4FluxR = energyP.R % velNormR; + eq4FluxD = energyP.D % velNormD; + eq4FluxU = energyP.U % velNormU; + + // ------------------------------------------------ + // Calculate the wave speed for the diffusive flux: + // In Reference velocities + if (report.test_verbose(3)) + std::cout << " ---> Diffusive Fluxes\n"; + + precision_t cGamma = 5.0 / 3.0; + + wsL.resize(gridC.nXt + 1, gridC.nYt); + wsR.resize(gridC.nXt + 1, gridC.nYt); + wsD.resize(gridC.nXt, gridC.nYt + 1); + wsU.resize(gridC.nXt, gridC.nYt + 1); + + wsL.zeros(); + wsR.zeros(); + wsU.zeros(); + wsD.zeros(); + + for (int64_t i = 0; i < gridC.nXt; i++) { + for (int64_t j = 0; j < gridC.nYt; j++) { + wsL(i, j) = sqrt(velL2(i, j)) + sqrt(cGamma * (cGamma - 1) * tempP.L(i, j)); + wsR(i, j) = sqrt(velR2(i, j)) + sqrt(cGamma * (cGamma - 1) * tempP.R(i, j)); + wsD(i, j) = sqrt(velD2(i, j)) + sqrt(cGamma * (cGamma - 1) * tempP.D(i, j)); + wsU(i, j) = sqrt(velU2(i, j)) + sqrt(cGamma * (cGamma - 1) * tempP.U(i, j)); + } + } + + wsLR = wsR; + + for (int64_t i = 0; i < gridC.nXt; i++) { + for (int64_t j = 0; j < gridC.nYt; j++) { + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + + for (int64_t i = 0; i < gridC.nXt; i++) { + for (int64_t j = 0; j < gridC.nYt; j++) { + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); + } + } + + // ------------------------------------------------ + // Calculate average flux at the edges (Rusanov Flux): + + if (report.test_verbose(3)) + std::cout << " ---> Averaging fluxes at edges\n"; + + diff = (rhoP.R - rhoP.L); + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoP.U - rhoP.D); + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (xMomentumP.R - xMomentumP.L); + eq2FluxLR = (eq2FluxL + eq2FluxR) / 2 + 0.5 * wsLR % diff; + diff = (xMomentumP.U - xMomentumP.D); + eq2FluxDU = (eq2FluxD + eq2FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (yMomentumP.R - yMomentumP.L); + eq3FluxLR = (eq3FluxL + eq3FluxR) / 2 + 0.5 * wsLR % diff; + diff = (yMomentumP.U - yMomentumP.D); + eq3FluxDU = (eq3FluxD + eq3FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (energyP.R - energyP.L); + eq4FluxLR = (eq4FluxL + eq4FluxR) / 2 + 0.5 * wsLR % diff; + diff = (energyP.U - energyP.D); + eq4FluxDU = (eq4FluxD + eq4FluxU) / 2 + 0.5 * wsDU % diff; + + // ------------------------------------------------ + // Update values: + if (report.test_verbose(3)) + std::cout << " ---> Updating equations of state\n"; + + precision_t dpdx, dpdn, pp, pm; + + arma_mat ax(gridC.nXt, gridC.nYt), an(gridC.nXt, gridC.nYt); + + ax.zeros(); + an.zeros(); + arma_mat dedt(gridC.nXt, gridC.nYt); + dedt.zeros(); + + arma_mat rhoNew = rho; + + // Only deal with inner cell + for (int64_t j = gridC.iYfirst_; j < gridC.iYlast_; j++) { + for (int64_t i = gridC.iXfirst_; i < gridC.iXlast_; i++) { + precision_t rhoResidual_ij = (gridL.dln(i + 1, j, iZ) * eq1FluxLR(i + 1, j) - + gridL.dln(i, j, iZ) * eq1FluxLR(i, j) + + gridD.dlx(i, j + 1, iZ) * eq1FluxDU(i, j + 1) - + gridD.dlx(i, j, iZ) * eq1FluxDU(i, j)); + drhodt(i, j) = rhoResidual_ij / gridC.dS(i, j, iZ); + + rhoNew(i, j) = rho(i, j) + dt * drhodt(i, j); + + precision_t xMomentumResidual_ij = (gridL.dln(i + 1, j, iZ) * eq2FluxLR(i + 1, + j) - + gridL.dln(i, j, iZ) * eq2FluxLR(i, j) + + gridD.dlx(i, j + 1, iZ) * eq2FluxDU(i, j + 1) - + gridD.dlx(i, j, iZ) * eq2FluxDU(i, j)); + dxVeldt(i, j) = xMomentumResidual_ij / gridC.dS(i, j, iZ) / rhoNew(i, j); + + precision_t yMomentumResidual_ij = (gridL.dln(i + 1, j, iZ) * eq3FluxLR(i + 1, + j) - + gridL.dln(i, j, iZ) * eq3FluxLR(i, j) + + gridD.dlx(i, j + 1, iZ) * eq3FluxDU(i, j + 1) - + gridD.dlx(i, j, iZ) * eq3FluxDU(i, j)); + dyVeldt(i, j) = yMomentumResidual_ij / gridC.dS(i, j, iZ) / rhoNew(i, j); + + // Calculate the gradient in the potential in the cubesphere + // coordinate system: + dpdx = 1 / gridC.R(iZ) * gridC.D(i, j) * + (pressureLR(i + 1, j) - pressureLR(i, j)) / gridC.dxi; + dpdn = 1 / gridC.R(iZ) * gridC.X(i, j) * gridC.Y(i, j) / + gridC.D(i, j) * + (pressureDU(i, j + 1) - pressureDU(i, j)) / gridC.dnu; + ax(i, j) = (dpdx + dpdn) / rhoNew(i, j); + + dpdx = 1 / gridC.R(iZ) * gridC.X(i, j) * gridC.Y(i, j) / + gridC.C(i, j) * (pressureLR(i + 1, j) - pressureLR(i, j)) / gridC.dxi; + dpdn = 1 / gridC.R(iZ) * gridC.C(i, j) * + (pressureDU(i, j + 1) - pressureDU(i, j)) / gridC.dnu; + an(i, j) = (dpdx + dpdn) / rhoNew(i, j); + + precision_t energyResidual_ij = (gridL.dln(i + 1, j, iZ) * eq4FluxLR(i + 1, j) - + gridL.dln(i, j, iZ) * eq4FluxLR(i, j) + + gridD.dlx(i, j + 1, iZ) * eq4FluxDU(i, j + 1) - + gridD.dlx(i, j, iZ) * eq4FluxDU(i, j)); + dedt(i, j) = energyResidual_ij / gridC.dS(i, j, iZ); + + } + } + + // lat is negative because of the Rochi definition of theta: + dlatVeldt = dyVeldt - (ax % gridC.Atx + an % gridC.Atn); + dlonVeldt = dxVeldt + ax % gridC.Apx + an % gridC.Apn; + dtempdt = dedt / rhoNew / cv; + + return; +} + + // using namespace Cubesphere_tools; std::vector Neutrals::residual_horizontal_rusanov( std::vector& states, - Grid& grid, - Times& time, + Grid & grid, + Times & time, int64_t iAlt) { // Dimensions of Spatial Discretization @@ -341,7 +636,66 @@ std::vector Neutrals::residual_horizontal_rusanov( return return_vector; } -void Neutrals::solver_horizontal_RK1(Grid& grid, Times& time) { + +//-------------------------------------------------------------------- +// New solver using Rochi +//-------------------------------------------------------------------- + +void Neutrals::solver_horizontal_RK1_rochi(Grid & grid, Times & time) { + + std::string function = "Neutrals::solver_horizontal_RK1_rochi"; + static int iFunction = -1; + report.enter(function, iFunction); + + precision_t dt = time.get_dt(); + + int64_t nXs = grid.get_nX(); + int64_t nYs = grid.get_nY(); + int64_t nGCs = grid.get_nGCs(); + int64_t nAlts = grid.get_nAlts(); + + calc_concentration(); + + arma_mat temp(nXs, nYs), rho(nXs, nYs), vLon(nXs, nYs), vLat(nXs, nYs); + + arma_mat k1rho(nXs, nYs); + arma_mat k1vLon(nXs, nYs), k1vLat(nXs, nYs); + arma_mat k1temp(nXs, nYs); + + int64_t iAlt; + + for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { + + /** States preprocessing **/ + /* MASS DENSITY */ + rho = rho_scgc.slice(iAlt); + vLon = velocity_vcgc[0].slice(iAlt); + vLat = velocity_vcgc[1].slice(iAlt); + temp = temperature_scgc.slice(iAlt); + + // k1 - start at t0, go to t+1/2 to figure out slope at t0 (k1) + update_states_cubesphere( + rho, vLon, vLat, temp, + k1rho, k1vLon, k1vLat, k1temp, + grid.cubeC, grid.cubeL, grid.cubeD, dt, iAlt); + // Take full step using k1: + rho_scgc.slice(iAlt) = rho - k1rho * dt; + velocity_vcgc[0].slice(iAlt) = vLon - k1vLon * dt; + velocity_vcgc[1].slice(iAlt) = vLat - k1vLat * dt; + temperature_scgc.slice(iAlt) = temp - k1temp * dt; + + } + + + calc_density_from_mass_concentration(); + + report.exit(function); + return; + +} + + +void Neutrals::solver_horizontal_RK1(Grid & grid, Times & time) { // Function Reporting std::string function = "Neutrals::solver_horizontal_RK1"; static int iFunction = -1; @@ -370,10 +724,7 @@ void Neutrals::solver_horizontal_RK1(Grid& grid, Times& time) { // Advance for bulk calculation first, calculate for every altitude - std::cout << "nAlts : " << nAlts << "\n"; - for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { - std::cout << "iAlt : " << iAlt << "\n"; /** Extract Grid Features **/ x = grid.refx_scgc.slice(iAlt); arma_mat xEdges = grid.refx_Left.slice(iAlt); @@ -642,7 +993,7 @@ return; */ -void Neutrals::solver_horizontal_RK4(Grid& grid, Times& time) { +void Neutrals::solver_horizontal_RK4(Grid & grid, Times & time) { // Function Reporting std::string function = "Neutrals::solver_horizontal_RK4"; static int iFunction = -1; From 7f765e3977b5d68ca081a7bd8b5dfb2f1b92fcf4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:17:24 -0400 Subject: [PATCH 601/691] tiny changes --- edu/examples/Advection/cubesphere_test.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/edu/examples/Advection/cubesphere_test.cpp b/edu/examples/Advection/cubesphere_test.cpp index f201e00b..f23176aa 100644 --- a/edu/examples/Advection/cubesphere_test.cpp +++ b/edu/examples/Advection/cubesphere_test.cpp @@ -97,7 +97,6 @@ void output(arma_mat &values, outfile << nX << " " << nY << "\n"; } outfile << values; - outfile << "----"; outfile.close(); } @@ -801,7 +800,7 @@ arma_mat init_rho(arma_mat &x, r = sqrt((x - 0.0) % (x - 0.0) + (y - 0.0) % (y - 0.0)); rho.fill(1.0); - // rho.elem( find( r < 0.25)).fill(2.2); + rho.elem( find( r < 0.25)).fill(2.2); // rho.elem( find( r < 0.25)) = 2.25 - r.elem( find( r < 0.25)); return rho; @@ -857,7 +856,7 @@ int main() { precision_t dt = 0.0001; // Time Step precision_t current_time = 0.0; // Initial Time 0 - precision_t total_time = 2.0; // Total simulation time + precision_t total_time = 0.1; // Total simulation time precision_t cfl = 0.1; // CFL Number precision_t gamma = 5.0 / 3.0; // Specific ratio of heat @@ -1274,4 +1273,4 @@ int main() output(xVelSph_output, "xvel_sph.txt", true); output(yVelSph_output, "yvel_sph.txt", true); return 0; -} \ No newline at end of file +} From 25284aa880975a86bd20c0a7c3511629b5a2573d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 21 Aug 2025 08:19:09 -0400 Subject: [PATCH 602/691] FEAT: 2d toy code for equal-angle cubesphere --- .../Advection/cubesphere_equal_angle.cpp | 1757 +++++++++++++++++ 1 file changed, 1757 insertions(+) create mode 100644 edu/examples/Advection/cubesphere_equal_angle.cpp diff --git a/edu/examples/Advection/cubesphere_equal_angle.cpp b/edu/examples/Advection/cubesphere_equal_angle.cpp new file mode 100644 index 00000000..3c3687e4 --- /dev/null +++ b/edu/examples/Advection/cubesphere_equal_angle.cpp @@ -0,0 +1,1757 @@ +/* + This is an example of a second order 2D solver for the Euler equations. + + to compile: + g++ -I/usr/local/include -I/Users/ridley/Software/Json/json/include -o cubesphere2d cubesphere2d.cpp + +*/ + +#include +#include + +using precision_t = double; + +/// Armadillo type vector (single column) with compile-time precision. +using arma_vec = arma::Col; +/// Armadillo type matrix (two dimension) with compile-time precision. +using arma_mat = arma::Mat; +/// Armadillo type cube (three dimension) with compile-time precision. +using arma_cube = arma::Cube; + +precision_t cPI = 3.141592653589793; +precision_t cTWOPI = 2.0 * cPI; +precision_t cRtoD = 180.0 / cPI; +precision_t cPIdiv2 = cPI / 2; +precision_t cGamma = 5.0 / 3.0; // Specific ratio of heat +precision_t cKb = 1.38e-23; +precision_t mmm = 16.0 * 1.67e-27; + +// --------------------------------------------------------- +// A couple of global variables +// --------------------------------------------------------- + +int64_t verbose = 1; + +struct projection_struct { + arma_mat gradLR; + arma_mat gradDU; + arma_mat R; + arma_mat L; + arma_mat U; + arma_mat D; +}; + +struct grid_struct { + + // sizes: + int64_t nXt, nYt, nGCs; + int64_t iXfirst_, iXlast_; + int64_t iYfirst_, iYlast_; + + // Positions: + arma_mat lon; + arma_mat lat; + + // These are for Ronchi et al., JCP 124, 93-114, 1996 + arma_mat X, Y, Z, C, D, d; + arma_mat dlx, dln, dS; + // xi is the LR direction + // nu is the UD direction + arma_mat xi, nu; + arma_mat x, y, r; + arma_mat Apn, Apx, Atn, Atx; + arma_mat Axt, Axp, Ant, Anp; + precision_t dxi, dnu, R; + arma_mat alpha; + arma_mat sinAlpha; + + arma_mat nXiLon; + arma_mat nXiLat; + arma_mat nNuLon; + arma_mat nNuLat; + // These are eq28 of Nair (g lower ij): + arma_mat gl11, gl12, gl21, gl22; + // These are eq29 of Nair (g upper ij): + arma_mat sqrtg; + arma_mat gu11, gu12, gu21, gu22; + // These are eq32 of Nair (sphere-to-cube): + arma_mat s2c11, s2c12, s2c21, s2c22; + arma_mat c2s11, c2s12, c2s21, c2s22; +}; + +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +precision_t calc_dt(arma_mat dx, + arma_mat dy, + arma_mat &wsLR, + arma_mat &wsDU, + int64_t nGCs) { + + if (verbose > 2) + std::cout << " --> calc_dt\n"; + + int64_t nX = wsLR.n_rows; + int64_t nY = wsLR.n_cols; + + precision_t wsX, wsY, dtX, dtY, dt; + + dt = 1e32; + + for (int64_t j = nGCs; j < nY - nGCs; j++) { + for (int64_t i = nGCs; i < nX - nGCs; i++) { + wsX = (wsLR(i + 1, j) + wsLR(i, j)) / 2; + dtX = dx(i, j) / wsX; + wsY = (wsDU(i, j + 1) + wsDU(i, j)) / 2; + dtY = dy(i, j) / wsY; + + if (dtX < dt) + dt = dtX; + + if (dtY < dt) + dt = dtY; + } + } + + return dt; +} + +/** + * Output function + * + * @param values Values + * @param filename FileName + * @param DoAppend + */ +void output(arma_mat &values, + std::string filename, + bool DoAppend) { + + std::ofstream outfile; + + if (DoAppend) + outfile.open(filename, std::ios_base::app); + else { + outfile.open(filename); + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + outfile << nX << " " << nY << "\n"; + } + + outfile << values; + outfile.close(); +} + +/** + * Transform spherical coordinates to 3D Cartesian + * + * doi: 10.1016/j.jcp.2007.07.022 + * Section 3, Eqn (23) + * + * @return dh Great Circle Distance between two points + */ +arma_vec sph2cart(precision_t lon, + precision_t lat, + precision_t r) { + arma_vec xyz(3); + xyz(0) = r * std::cos(lat) * std::cos(lon); + xyz(1) = r * std::cos(lat) * std::sin(lon); + xyz(2) = r * std::sin(lat); + return xyz; +} + +grid_struct init_grid_equidistant(int iFace, + int64_t nX, + int64_t nY, + int64_t nGCs, + precision_t R, + precision_t xOff, + precision_t yOff) { + + double a = R / std::sqrt(3); + + grid_struct grid; + int64_t nXt = nX + 2 * nGCs; + int64_t nYt = nY + 2 * nGCs; + + grid.nXt = nXt; + grid.nYt = nYt; + grid.nGCs = nGCs; + grid.iXfirst_ = nGCs; + grid.iYfirst_ = nGCs; + grid.iXlast_ = nX + nGCs; + grid.iYlast_ = nY + nGCs; + + // Positions: + grid.lon.resize(nXt, nYt); + grid.lat.resize(nXt, nYt); + + grid.x.resize(nXt, nYt); + grid.y.resize(nXt, nYt); + grid.r.resize(nXt, nYt); + grid.xi.resize(nXt, nYt); + grid.nu.resize(nXt, nYt); + grid.X.resize(nXt, nYt); + grid.Y.resize(nXt, nYt); + grid.Z.resize(nXt, nYt); + grid.C.resize(nXt, nYt); + grid.D.resize(nXt, nYt); + grid.d.resize(nXt, nYt); + grid.dlx.resize(nXt, nYt); + grid.dln.resize(nXt, nYt); + grid.dS.resize(nXt, nYt); + + grid.s2c11.resize(nXt, nYt); + grid.s2c12.resize(nXt, nYt); + grid.s2c21.resize(nXt, nYt); + grid.s2c22.resize(nXt, nYt); + grid.c2s11.resize(nXt, nYt); + grid.c2s12.resize(nXt, nYt); + grid.c2s21.resize(nXt, nYt); + grid.c2s22.resize(nXt, nYt); + + grid.gl11.resize(nXt, nYt); + grid.gl12.resize(nXt, nYt); + grid.gl21.resize(nXt, nYt); + grid.gl22.resize(nXt, nYt); + grid.gu11.resize(nXt, nYt); + grid.gu12.resize(nXt, nYt); + grid.gu21.resize(nXt, nYt); + grid.gu22.resize(nXt, nYt); + grid.sqrtg.resize(nXt, nYt); + + double iD, iL, x, y, theta, phi, r; + + double dx = 2 * a / nX; + double dy = 2 * a / nY; + double r3, r4; + double R2 = R * R; + + // Loop through each point and derive the coordinate + // DU is y-direction (down-up) + // LR is x-direction (left-right) + for (int iDU = 0; iDU < nYt; iDU++) { + for (int iLR = 0; iLR < nXt; iLR++) { + + // the offsets are so we can find cell centers, edges, and corners + // Centers assume Off = 0.5, which edges assume Off = 0 + double iD = iDU - nGCs + yOff; + double iL = iLR - nGCs + xOff; + + x = -a + iL * dx; + y = -a + iD * dy; + phi = std::atan(x / a); + // y = a * tan(theta) * sec(phi) => y * cos(phi) = a * tan(theta) + theta = std::atan(y * std::cos(phi) / a); + //std::cout << "Grid creation : " + // << iDU << " " + // << iLR << " " + // << y << " " + // << x << " " + // << theta * cRtoD << " " + // << phi * cRtoD << "\n"; + grid.lon(iLR, iDU) = phi; + grid.lat(iLR, iDU) = theta; + grid.X(iLR, iDU) = R * std::cos(theta) * std::cos(phi); + grid.Y(iLR, iDU) = R * std::cos(theta) * std::sin(phi); + grid.Z(iLR, iDU) = R * std::sin(theta); + grid.r(iLR, iDU) = std::sqrt(a * a + x * x + y * y); + + // Equation 28 of Nair: + r4 = r * r * r * r; + grid.gl11(iLR, iDU) = R2 / r4 * (a * a + y * y); + grid.gl12(iLR, iDU) = - R2 / r4 * (x * y); + grid.gl21(iLR, iDU) = - R2 / r4 * (x * y); + grid.gl22(iLR, iDU) = R2 / r4 * (a * a + x * x); + // Equation 29 of Nair: + r3 = r * r * r; + grid.sqrtg(iLR, iDU) = R2 * a / r3; + grid.gu11(iLR, iDU) = grid.gl22(iLR, iDU) / grid.sqrtg(iLR, iDU); + grid.gu12(iLR, iDU) = - grid.gl12(iLR, iDU) / grid.sqrtg(iLR, iDU); + grid.gu21(iLR, iDU) = - grid.gl21(iLR, iDU) / grid.sqrtg(iLR, iDU); + grid.gu22(iLR, iDU) = grid.gl11(iLR, iDU) / grid.sqrtg(iLR, iDU); + + grid.s2c11(iLR, iDU) = a / (R * std::cos(theta) * std::cos(phi)) * + (1 / std::cos(theta)); + grid.s2c12(iLR, iDU) = 0.0; + grid.s2c21(iLR, iDU) = a / (R * std::cos(theta) * std::cos(phi)) * + (std::tan(theta) * std::tan(phi)); + grid.s2c22(iLR, iDU) = a / (R * std::cos(theta) * std::cos(phi)) * + (1 / std::cos(phi)); + grid.c2s11(iLR, iDU) = (R * std::cos(theta) * std::cos(phi)) / a * std::cos( + theta); + grid.c2s12(iLR, iDU) = 0.0; + grid.c2s21(iLR, iDU) = -(R * std::cos(theta) * std::cos(phi)) / a * + std::sin(theta) * std::sin(phi); + grid.c2s22(iLR, iDU) = (R * std::cos(theta) * std::cos(phi)) / a * std::cos( + phi); + + } + } + + //xxx + return grid; +} + + +grid_struct init_grid(int iFace, + int64_t nX, int64_t nY, int64_t nGCs, + precision_t R, + precision_t xOff, precision_t yOff) { + + grid_struct grid; + int64_t nXt = nX + 2 * nGCs; + int64_t nYt = nY + 2 * nGCs; + + grid.nXt = nXt; + grid.nYt = nYt; + grid.nGCs = nGCs; + grid.iXfirst_ = nGCs; + grid.iYfirst_ = nGCs; + grid.iXlast_ = nX + nGCs; + grid.iYlast_ = nY + nGCs; + + // Positions: + grid.lon.resize(nXt, nYt); + grid.lat.resize(nXt, nYt); + + grid.xi.resize(nXt, nYt); + grid.nu.resize(nXt, nYt); + grid.X.resize(nXt, nYt); + grid.Y.resize(nXt, nYt); + grid.C.resize(nXt, nYt); + grid.D.resize(nXt, nYt); + grid.d.resize(nXt, nYt); + grid.dlx.resize(nXt, nYt); + grid.dln.resize(nXt, nYt); + grid.dS.resize(nXt, nYt); + + grid.Axt.resize(nXt, nYt); + grid.Axp.resize(nXt, nYt); + grid.Ant.resize(nXt, nYt); + grid.Anp.resize(nXt, nYt); + + grid.Apn.resize(nXt, nYt); + grid.Apx.resize(nXt, nYt); + grid.Atn.resize(nXt, nYt); + grid.Atx.resize(nXt, nYt); + + precision_t fortyfive = cPI / 4.0; + // Xi is LR (x), Nu is UD (y) + precision_t dxi = 2.0 * fortyfive / (nX - 1 + xOff * 2); + precision_t dnu = 2.0 * fortyfive / (nY - 1 + yOff * 2); + + grid.dxi = dxi; + grid.dnu = dnu; + grid.R = R; + + precision_t latp, lonp; + + // Loop through each point and derive the coordinate + + precision_t total_area = 0.0, det, dmo; + + for (int iDU = 0; iDU < nYt; iDU++) { + for (int iLR = 0; iLR < nXt; iLR++) { + + // the offsets are so we can find cell centers, edges, and corners + double iD = iDU - nGCs + yOff; + double iL = iLR - nGCs + xOff; + + // Define local coordinates: + // Xi is LR (x), Nu is UD (y) + grid.nu(iLR, iDU) = (-fortyfive + dnu * iD); + grid.xi(iLR, iDU) = (-fortyfive + dxi * iL); + + grid.X(iLR, iDU) = tan(grid.xi(iLR, iDU)); + grid.Y(iLR, iDU) = tan(grid.nu(iLR, iDU)); + + // Transformation from 3D Cartesian to LatLong + // lonp = std::atan2(y_cart, x_cart) + cPI/2.0; + if (iFace == 0) { + lonp = std::atan(grid.X(iLR, iDU)); + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(1.0 / grid.Y(iLR, iDU) / std::cos(lonp)); + } + + if (iFace == 1) { + lonp = std::atan(-1.0 / grid.X(iLR, iDU)); + + if (lonp < 0) + lonp = cPI + lonp; + + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(1.0 / grid.Y(iLR, iDU) / std::sin(lonp)); + } + + if (iFace == 2) { + lonp = std::atan(grid.X(iLR, iDU)) + cPI; + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(-1.0 / grid.Y(iLR, iDU) / std::cos(lonp)); + } + + if (iFace == 3) { + lonp = std::atan(-1.0 / grid.X(iLR, iDU)); + + if (lonp > 0) + lonp = lonp + cPI; + else + lonp = 2 * cPI + lonp; + + // Theta in Ronchi is from the north pole, so lat is 90 - theta + latp = std::atan(-1.0 / grid.Y(iLR, iDU) / std::sin(lonp)); + } + + if (iFace == 4) { + lonp = std::atan2(grid.X(iLR, iDU), grid.Y(iLR, iDU)); + latp = std::atan2(-grid.Y(iLR, iDU), cos(lonp) ); + } + + if (iFace == 5) { + lonp = std::atan2(-grid.X(iLR, iDU), grid.Y(iLR, iDU)); + latp = -std::atan2(-grid.Y(iLR, iDU), cos(lonp) ); + } + + if (latp > 0) + latp = cPI / 2 - latp; + else + latp = -(cPI / 2 + latp); + + // Fill Computed coords + grid.lat(iLR, iDU) = latp; + grid.lon(iLR, iDU) = lonp; + + grid.d(iLR, iDU) = + 1 + + grid.X(iLR, iDU) * grid.X(iLR, iDU) + + grid.Y(iLR, iDU) * grid.Y(iLR, iDU); + grid.C(iLR, iDU) = sqrt(1 + + grid.X(iLR, iDU) * grid.X(iLR, iDU)); + grid.D(iLR, iDU) = sqrt(1 + + grid.Y(iLR, iDU) * grid.Y(iLR, iDU)); + + if (iFace < 4) { + grid.Axt(iLR, iDU) = 0.0; + grid.Axp(iLR, iDU) = grid.C(iLR, iDU) * grid.D(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + grid.Ant(iLR, iDU) = -1.0; + grid.Anp(iLR, iDU) = grid.X(iLR, iDU) * grid.Y(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + } else { + dmo = 1.0 / std::sqrt(grid.d(iLR, iDU) - 1); + + //if (dmo > 100.0) + // dmo = 100.0; + + if (iFace == 4) { + grid.Axt(iLR, iDU) = - dmo * grid.D(iLR, iDU) * grid.X(iLR, iDU); + grid.Axp(iLR, iDU) = dmo * grid.D(iLR, iDU) * grid.Y(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + grid.Ant(iLR, iDU) = - dmo * grid.C(iLR, iDU) * grid.Y(iLR, iDU); + grid.Anp(iLR, iDU) = - dmo * grid.C(iLR, iDU) * grid.X(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + + } else { + // iFace == 5 + grid.Axt(iLR, iDU) = dmo * grid.D(iLR, iDU) * grid.X(iLR, iDU); + grid.Axp(iLR, iDU) = - dmo * grid.D(iLR, iDU) * grid.Y(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + grid.Ant(iLR, iDU) = dmo * grid.C(iLR, iDU) * grid.Y(iLR, iDU); + grid.Anp(iLR, iDU) = dmo * grid.C(iLR, iDU) * grid.X(iLR, iDU) / + sqrt(grid.d(iLR, iDU)); + } + } + + // Calculate inverse of matrix for calculating Ax and An from At and Ap: + det = 1.0 / (grid.Axt(iLR, iDU) * grid.Anp(iLR, iDU) - + grid.Axp(iLR, iDU) * grid.Ant(iLR, iDU)); + + grid.Atx(iLR, iDU) = det * grid.Anp(iLR, iDU); + grid.Atn(iLR, iDU) = - det * grid.Axp(iLR, iDU); + grid.Apx(iLR, iDU) = - det * grid.Ant(iLR, iDU); + //grid.Apx(iLR, iDU) = grid.d(iLR, iDU) / (grid.C(iLR, iDU) * grid.D(iLR, iDU)); + grid.Apn(iLR, iDU) = det * grid.Axt(iLR, iDU); + + grid.dlx(iLR, iDU) = + R * grid.D(iLR, iDU) * dxi / + grid.d(iLR, iDU) / + (cos(grid.xi(iLR, iDU)) * cos(grid.xi(iLR, iDU))); + grid.dln(iLR, iDU) = + R * grid.C(iLR, iDU) * dnu / + grid.d(iLR, iDU) / + (cos(grid.nu(iLR, iDU)) * cos(grid.nu(iLR, iDU))); + + //grid.dS(iLR, iDU) = R * R * dxi * dnu / + // (sqrt(grid.d(iLR, iDU) * grid.d(iLR, iDU) * grid.d(iLR, iDU))) * + // grid.C(iLR, iDU) * grid.C(iLR, iDU) * + // grid.D(iLR, iDU) * grid.D(iLR, iDU); + grid.dS(iLR, iDU) = R * R * dxi * dnu / + (sqrt(grid.d(iLR, iDU) * grid.d(iLR, iDU) * grid.d(iLR, iDU)) * + cos(grid.xi(iLR, iDU)) * cos(grid.xi(iLR, iDU)) * + cos(grid.nu(iLR, iDU)) * cos(grid.nu(iLR, iDU))); + //grid.dS(iLR, iDU) = R * R * dxi * dnu * + // grid.C(iLR, iDU) * grid.D(iLR, iDU) / + // (grid.d(iLR, iDU) * grid.d(iLR, iDU) * + // cos(grid.xi(iLR, iDU)) * cos(grid.xi(iLR, iDU)) * + // cos(grid.nu(iLR, iDU)) * cos(grid.nu(iLR, iDU))); + + if (iLR > 2 && iLR < nXt - 3 && + iDU > 2 && iDU < nYt - 3) + total_area = total_area + grid.dS(iLR, iDU); + } + } + + std::cout << "Total Area : " << total_area << "; expected : " << 4 * cPI * R * + R / 6.0 << "\n"; + + return grid; +} + +/** + * Calculate Great Circle Distance + * + * doi: 10.1016/j.jcp.2007.07.022 + * Section 3, Eqn (23) + * + * @return dh Great Circle Distance between two points + */ +precision_t calc_great_circle(precision_t lon1, + precision_t lon2, + precision_t lat1, + precision_t lat2) { + + precision_t dlon_2 = (lon2 - lon1) / 2.0; + precision_t dlat_2 = (lat2 - lat1) / 2.0; + + precision_t dh = 2.0 * std::asin(std::sqrt(std::sin(dlat_2) * std::sin(dlat_2) + + std::sin(dlon_2) * std::sin(dlon_2) * std::cos(lat1) * std::cos(lat2))); + + return dh; +} + +// --------------------------------------------------------- +// Angle between three points on a sphere +// --------------------------------------------------------- +precision_t calc_angle_given_three_lon_lat(precision_t p1_lon, + precision_t p1_lat, + precision_t p2_lon, + precision_t p2_lat, + precision_t p3_lon, + precision_t p3_lat, + precision_t R) { + + arma_vec p1 = sph2cart(p1_lon, p1_lat, R); + arma_vec p2 = sph2cart(p2_lon, p2_lat, R); + arma_vec p3 = sph2cart(p3_lon, p3_lat, R); + arma_vec d1 = p1 - p2; + arma_vec d2 = p3 - p2; + precision_t n1 = std::sqrt(d1(0) * d1(0) + + d1(1) * d1(1) + + d1(2) * d1(2)); + precision_t n2 = std::sqrt(d2(0) * d2(0) + + d2(1) * d2(1) + + d2(2) * d2(2)); + d1 = d1 / n1; + d2 = d2 / n2; + precision_t angle = std::acos(d1(0) * d2(0) + + d1(1) * d2(1) + + d1(2) * d2(2)); + + return angle; +} + +// --------------------------------------------------------- +// bin edges +// --------------------------------------------------------- + +arma_vec calc_bin_edges(arma_vec centers) { + + int64_t nPts = centers.n_elem; + arma_vec edges(nPts + 1); + + precision_t dc = centers(1) - centers(0); + + edges(0) = centers(0) - dc / 2.0; + edges(1) = centers(0) + dc / 2.0; + + for (int64_t i = 2; i < nPts + 1; i++) + edges(i) = 2 * centers(i - 1) - edges(i - 1); + + return edges; +} + +// --------------------------------------------------------- +// bin edges +// --------------------------------------------------------- + +arma_mat calc_bin_edges(arma_mat centers, bool DoX) { + + // X is first dimension (row), Y is second dimension (col) + + int64_t nX = centers.n_rows; + int64_t nY = centers.n_cols; + arma_mat edges; + arma_vec centers1d; + + if (DoX) { + if (verbose > 2) + std::cout << " --> x\n"; + + edges.resize(nX + 1, nY); + + for (int64_t j = 0; j < nY; j++) { + centers1d = centers.col(j); + edges.col(j) = calc_bin_edges(centers1d); + } + } else { + if (verbose > 2) + std::cout << " --> y\n"; + + edges.resize(nX, nY + 1); + + for (int64_t i = 0; i < nX; i++) { + centers1d = centers.row(i).as_col(); + edges.row(i) = calc_bin_edges(centers1d).as_row(); + } + } + + return edges; +} + +// --------------------------------------------------------- +// bin widths +// --------------------------------------------------------- + +arma_vec calc_bin_widths(arma_vec edges) { + + int64_t nPts = edges.n_elem - 1; + arma_vec widths(nPts); + + for (int64_t i = 0; i < nPts; i++) + widths(i) = edges(i + 1) - edges(i); + + return widths; +} + +// --------------------------------------------------------- +// bin widths 2d +// --------------------------------------------------------- + +arma_mat calc_bin_widths(arma_mat edges, bool DoX) { + + int64_t nX = edges.n_rows; + int64_t nY = edges.n_cols; + + arma_mat widths; + arma_vec edges1d; + + if (DoX) { + if (verbose > 2) + std::cout << " --> x\n"; + + nX--; + widths.resize(nX, nY); + + for (int64_t j = 0; j < nY; j++) { + edges1d = edges.col(j); + widths.col(j) = calc_bin_widths(edges1d); + } + } else { + if (verbose > 2) + std::cout << " --> y\n"; + + nY--; + widths.resize(nX, nY); + + for (int64_t i = 0; i < nX; i++) { + edges1d = edges.row(i).as_col(); + widths.row(i) = calc_bin_widths(edges1d).as_row(); + } + } + + return widths; +} + +/**SOME PROJECTION AND GRADIENT CODE **/ +// --------------------------------------------------------- +// +// --------------------------------------------------------- + +arma_vec limiter_mc(arma_vec &left, + arma_vec &right, + int64_t nPts, + int64_t nGCs) { + + precision_t beta = 0.8; + + arma_vec s = left % right; + arma_vec combined = (left + right) * 0.5; + + left = left * beta; + right = right * beta; + arma_vec limited = left; + + for (int64_t i = 1; i < nPts + 2 * nGCs - 1; i++) { + if (s(i) < 0) { + // Sign < 0 means opposite signed left and right: + limited(i) = 0.0; + } else { + if (left(i) > 0 && right(i) > 0) { + if (right(i) < limited(i)) + limited(i) = right(i); + + if (combined(i) < limited(i)) + limited(i) = combined(i); + } else { + if (right(i) > limited(i)) + limited(i) = right(i); + + if (combined(i) > limited(i)) + limited(i) = combined(i); + } + } + } + + return limited; +} + +void print(arma_vec values) { + int64_t nP = values.n_elem; + + for (int64_t i = 0; i < nP; i++) + std::cout << values(i) << " "; + + std::cout << "\n"; +} + +// --------------------------------------------------------- +// calc gradients at centers +// - values and x defined at centers +// --------------------------------------------------------- + +arma_vec calc_grad_1d(arma_vec &values, + arma_vec &x, + int64_t nPts, + int64_t nGCs) { + + arma_vec gradients = values * 0.0; + arma_vec gradL = values * 0.0; + arma_vec gradR = values * 0.0; + + precision_t factor1 = 0.625; + precision_t factor2 = 0.0416667; + precision_t h; + + int64_t i; + arma_vec hv = values * 0.0; + + i = nGCs - 1; + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); + gradL(i) = (values(i) - values(i - 1)) / (x(i) - x(i - 1)); + + // This is attempting to vectorize the problem, but it seems to be slower? + // int64_t iS = nGCs; + // int64_t iE = nPts + nGCs - 1; + // hv.rows(iS, iE) = 2.0 / (x.rows(iS, iE) - x.rows(iS-1, iE-1)); + // gradL.rows(iS, iE) = hv.rows(iS,iE) % (factor1 * (values.rows(iS, iE) - + // values.rows(iS-1, iE-1)) - + // factor2 * (values.rows(iS+1, iE+1) - + // values.rows(iS-2, iE-2))); + // hv.rows(iS, iE) = 2.0 / (x.rows(iS+1, iE+1) - x.rows(iS, iE)); + // gradR.rows(iS, iE) = hv.rows(iS,iE) % (factor1 * (values.rows(iS+1, iE+1) - + // values.rows(iS, iE)) - + // factor2 * (values.rows(iS+2, iE+2) - + // values.rows(iS-1, iE-1))); + + for (i = nGCs; i < nPts + nGCs; i++) { + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + h = 2.0 / (x(i + 1) - x(i)); + gradR(i) = h * (factor1 * (values(i + 1) - values(i)) - + factor2 * (values(i + 2) - values(i - 1))); + } + + i = nPts + nGCs; + h = 2.0 / (x(i) - x(i - 1)); + gradL(i) = h * (factor1 * (values(i) - values(i - 1)) - + factor2 * (values(i + 1) - values(i - 2))); + gradR(i) = (values(i + 1) - values(i)) / (x(i + 1) - x(i)); + + gradients = limiter_mc(gradL, gradR, nPts, nGCs); + + return gradients; +} + +// --------------------------------------------------------- +// calc gradients at centers for 2d matrices +// - values and x defined at centers +// --------------------------------------------------------- + +arma_mat calc_grad(arma_mat values, + arma_mat x, + int64_t nGCs, + bool DoX) { + + arma_mat v2d, x2d; + + if (DoX) { + v2d = values; + x2d = x; + } else { + v2d = values.t(); + x2d = x.t(); + } + + int64_t nX = v2d.n_rows; + int64_t nY = v2d.n_cols; + arma_mat grad2d = v2d * 0.0; + + int64_t nPts = nX - 2 * nGCs; + arma_vec values1d(nX); + arma_vec x1d(nX); + + for (int64_t j = 1; j < nY - 1; j++) { + values1d = v2d.col(j); + x1d = x2d.col(j); + grad2d.col(j) = calc_grad_1d(values1d, x1d, nPts, nGCs); + } + + arma_mat gradients; + + if (DoX) + gradients = grad2d; + else + gradients = grad2d.t(); + + return gradients; +} + +// --------------------------------------------------------- +// Project gradients + values to the right face, from the left +// returned values are on the i - 1/2 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat project_from_left(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i + 1, j) = values(i, j) + + gradients(i, j) * (x_edges(i + 1, j) - x_centers(i, j)); + } + + projected(1, j) = projected(2, j); + projected(0, j) = projected(1, j); + projected(nX, j) = projected(nX - 1, j); + } + + return projected; +} + +// --------------------------------------------------------- +// Project gradients + values to the left face, from the right +// returned values are on the i - 1 edges +// (between i-1 and i cell center) +// --------------------------------------------------------- + +arma_mat project_from_right(arma_mat values, + arma_mat gradients, + arma_mat x_centers, + arma_mat x_edges, + int64_t nGCs) { + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + // Define at edges: + arma_mat projected(nX + 1, nY); + projected.zeros(); + + // no gradient in the 0 or iEnd cells + for (int64_t j = 0; j < nY; j++) { + for (int64_t i = 1; i < nX - 1; i++) { + projected(i, j) = values(i, j) + + gradients(i, j) * (x_edges(i, j) - x_centers(i, j)); + } + + projected(0, j) = projected(1, j); + projected(nX - 1, j) = projected(nX - 2, j); + projected(nX, j) = projected(nX - 1, j); + } + + return projected; +} + +// --------------------------------------------------------- +// Limiter on values +// projected is assumed to be on the edge between the +// i-1 and i cell (i-1/2) +// limited is returned at edges +// --------------------------------------------------------- + +arma_vec limiter_value(arma_vec projected, + arma_vec values, + int64_t nPts, + int64_t nGCs) { + + int64_t iStart = 0; + int64_t iEnd = nPts + 2 * nGCs; + + arma_vec limited = projected; + + precision_t mini, maxi; + + for (int64_t i = iStart + 1; i < iEnd - 1; i++) { + + mini = values(i - 1); + + if (values(i) < mini) + mini = values(i); + + maxi = values(i - 1); + + if (values(i) > maxi) + maxi = values(i); + + if (limited(i) < mini) + limited(i) = mini; + + if (limited(i) > maxi) + limited(i) = maxi; + } + + return limited; +} + +// --------------------------------------------------------- +// take gradients and project to all edges +// --------------------------------------------------------- + +projection_struct project_to_edges(arma_mat &values, + arma_mat &x_centers, arma_mat &x_edges, + arma_mat &y_centers, arma_mat &y_edges, + int64_t nGCs) { + + int64_t nX = values.n_rows; + int64_t nY = values.n_cols; + + projection_struct proj; + + proj.gradLR = calc_grad(values, x_centers, nGCs, true); + proj.gradDU = calc_grad(values.t(), y_centers.t(), nGCs, true).t(); + + proj.R = project_from_left(values, proj.gradLR, + x_centers, x_edges, nGCs); + // Left side of edge from left + proj.L = project_from_right(values, proj.gradLR, + x_centers, x_edges, nGCs); + // Up side of edge from down (left) + proj.U = project_from_left(values.t(), proj.gradDU.t(), + y_centers.t(), y_edges.t(), nGCs) + .t(); + // Down side of edge from up (right) + proj.D = project_from_right(values.t(), proj.gradDU.t(), + y_centers.t(), y_edges.t(), nGCs) + .t(); + + return proj; +} + +/**** SOME INITIALIZATION FUNCTION, NOT CORE ****/ +// --------------------------------------------------------- +// initial rho: initialize the whole field to be 2.0 +// --------------------------------------------------------- +arma_mat init_rho(arma_mat &x, + arma_mat &y) { + + int64_t nX = x.n_rows; + int64_t nY = x.n_cols; + + arma_mat rho(nX, nY); + arma_mat r; + + r = sqrt((x - 0.0) % (x - 0.0) + (y - 0.0) % (y - 0.0)); + rho.fill(1.0); + rho.elem( find( r < 0.25)).fill(1.2); + + return rho; +} + +// --------------------------------------------------------- +// initial velocity: initialize zero velocity +// --------------------------------------------------------- + +arma_mat init_vel(arma_mat &x, + arma_mat &y) { + int64_t nX = x.n_rows; + int64_t nY = x.n_cols; + arma_mat vel(nX, nY); + // all cells positive to right: + vel.zeros(); + vel.fill(0.5); + return vel; +} + + +// --------------------------------------------------------- +// initial values +// --------------------------------------------------------- + +arma_mat init_value(arma_mat &x, + arma_mat &y, + precision_t inVal) { + int64_t nX = x.n_rows; + int64_t nY = x.n_cols; + arma_mat val(nX, nY); + val.fill(inVal); + return val; +} + +arma_mat init_vel2(arma_mat &x, + arma_mat &y) { + int64_t nX = x.n_rows; + int64_t nY = x.n_cols; + arma_mat vel(nX, nY); + // all cells positive to right: + vel.zeros(); + //vel.fill(1.0); + return vel; +} + +// --------------------------------------------------------- +// initial temp (E): constant total energy +// THIS IS NOT e but E, the total energy +// --------------------------------------------------------- + +arma_mat init_temp(arma_mat &x, + arma_mat &y) { + int64_t nX = x.n_rows; + int64_t nY = x.n_cols; + + arma_mat temp(nX, nY); + temp.fill(100.0); + return temp; +} + +// --------------------------------------------------------- +// Calculate the max speed in the x and y directions +// --------------------------------------------------------- + +void calc_cmax(arma_mat &xVel, + arma_mat &yVel, + arma_mat &temp, + arma_mat &xMax, + arma_mat &yMax) { + + if (verbose > 2) + std::cout << " --> calc_max\n"; + + arma_mat xVel2, yVel2; + + xVel2 = xVel % xVel; + yVel2 = yVel % yVel; + xMax = sqrt(xVel2) + sqrt(cKb / mmm * temp); + yMax = sqrt(yVel2) + sqrt(cKb / mmm * temp); + + return; +} + + +// --------------------------------------------------------- +// Set Boundary Conditions +// --------------------------------------------------------- + +void set_bcs(arma_mat &rho, + arma_mat &xVel, + arma_mat &yVel, + arma_mat &temp, + grid_struct gridC) { + + if (verbose > 2) + std::cout << " --> set_bcs\n"; + + // ------------------------------------------------ + // Exchange messages (set BCs, really): + for (int64_t i = gridC.iXfirst_; i < gridC.iXlast_; i++) { + for (int64_t j = 0; j < gridC.nGCs; j++) { + // bottom bc: + rho(i, gridC.iYfirst_ - 1 - j) = rho(i, gridC.iYlast_ - 1 - j); + // top bc: + rho(i, gridC.iYlast_ + j) = rho(i, gridC.iYfirst_ + j); + } + } + + for (int64_t j = gridC.iYfirst_; j < gridC.iYlast_; j++) { + for (int64_t i = 0; i < gridC.nGCs; i++) { + // left bc: + rho(gridC.iXfirst_ - 1 - i, j) = rho(gridC.iXlast_ - 1 - i, j); + // right bc: + rho(gridC.iXlast_ + i, j) = rho(gridC.iXfirst_ + i, j); + } + } + + return; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +void convert_vector_ll_to_xn(arma_mat aLon, + arma_mat aLat, + arma_mat &aXi, + arma_mat &aNu, + grid_struct grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + aXi = -grid.Axt % aLat + grid.Axp % aLon; + aNu = -grid.Ant % aLat + grid.Anp % aLon; + return; +} + +// --------------------------------------------------------- +// Convert vector from sphere to cube +// -> Using equation (32) of Nair: +// --------------------------------------------------------- + +void convert_vector_sphere_to_cube(arma_mat u, + arma_mat v, + arma_mat &u1, + arma_mat &u2, + grid_struct grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + u1 = grid.s2c11 % u + grid.s2c12 % v; + u2 = grid.s2c21 % u + grid.s2c22 % v; + return; +} + +// --------------------------------------------------------- +// Convert vector cube to sphere +// -> Using equation (32) of Nair: +// --------------------------------------------------------- + +void convert_vector_cube_to_sphere(arma_mat u1, + arma_mat u2, + arma_mat &u, + arma_mat &v, + grid_struct grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + u = grid.c2s11 % u1 + grid.c2s12 % u2; + v = grid.c2s21 % u1 + grid.c2s22 % u2; + return; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +void convert_vector_xn_to_ll(arma_mat aXi, + arma_mat aNu, + arma_mat &aLon, + arma_mat &aLat, + grid_struct grid) { + + // Ronchi defines aPhi = aLon, aTheta = -aLat + aLat = -(grid.Atx % aXi + grid.Atn % aNu); + aLon = grid.Apx % aXi + grid.Apn % aNu; + + return; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +arma_mat calc_angle_between_coords(grid_struct grid) { + + arma_mat e1Lat, e1Lon, e2Lat, e2Lon, m, one, zero; + arma_mat e1dote2, alpha; + + m.resize(grid.nXt, grid.nYt); + one.resize(grid.nXt, grid.nYt); + one.fill(1.0); + zero.resize(grid.nXt, grid.nYt); + zero.fill(0.0); + + // define e1 as the LR (xi) direction: + e1Lat.resize(grid.nXt, grid.nYt); + e1Lon.resize(grid.nXt, grid.nYt); + convert_vector_xn_to_ll(one, zero, e1Lon, e1Lat, grid); + m = sqrt(e1Lon % e1Lon + e1Lat % e1Lat); + e1Lon = e1Lon / m; + e1Lat = e1Lat / m; + + // define e2 as the DU (nu) direction: + e2Lat.resize(grid.nXt, grid.nYt); + e2Lon.resize(grid.nXt, grid.nYt); + convert_vector_xn_to_ll(zero, one, e2Lon, e2Lat, grid); + m = sqrt(e2Lon % e2Lon + e2Lat % e2Lat); + e2Lon = e2Lon / m; + e2Lat = e2Lat / m; + + alpha = acos(e1Lat % e2Lat + e1Lon % e2Lon); + + return alpha; +} + +// --------------------------------------------------------- +// Convert vector from Alat, Alon to Axi, Anu +// -> Using equation (7) of Ronchi et al: +// --------------------------------------------------------- + +void calc_norms(grid_struct &grid) { + + arma_mat e1Lat, e1Lon, e2Lat, e2Lon, m, one, zero; + + grid.nXiLon.resize(grid.nXt, grid.nYt); + grid.nXiLat.resize(grid.nXt, grid.nYt); + grid.nNuLon.resize(grid.nXt, grid.nYt); + grid.nNuLat.resize(grid.nXt, grid.nYt); + + m.resize(grid.nXt, grid.nYt); + one.resize(grid.nXt, grid.nYt); + one.fill(1.0); + zero.resize(grid.nXt, grid.nYt); + zero.fill(0.0); + + // define e1 as the LR (xi) direction: + e1Lat.resize(grid.nXt, grid.nYt); + e1Lon.resize(grid.nXt, grid.nYt); + convert_vector_xn_to_ll(one, zero, e1Lon, e1Lat, grid); + m = sqrt(e1Lon % e1Lon + e1Lat % e1Lat); + + // Rotate by 90 deg (CCW) to get the norm: + grid.nNuLon = -e1Lat / m; + grid.nNuLat = e1Lon / m; + + // define e2 as the DU (nu) direction: + e2Lat.resize(grid.nXt, grid.nYt); + e2Lon.resize(grid.nXt, grid.nYt); + convert_vector_xn_to_ll(zero, one, e2Lon, e2Lat, grid); + m = sqrt(e2Lon % e2Lon + e2Lat % e2Lat); + // Rotate by 90 deg (CW) to get the norm: + grid.nXiLon = e2Lat / m; + grid.nXiLat = -e2Lon / m; + + return; +} + + +// --------------------------------------------------------- +// Update States +// --------------------------------------------------------- + +void update_states(arma_mat rho, + arma_mat &xVel, + arma_mat &yVel, + arma_mat &temp, + arma_mat &drhodt, + arma_mat &dlonVeldt, + arma_mat &dlatVeldt, + arma_mat &dtempdt, + grid_struct gridC, + grid_struct gridL, + grid_struct gridD, + precision_t dt) { + + arma_mat xMomentum, yMomentum; + arma_mat rhoE, energy, vel2; + + precision_t cv = 1500.0; + + if (verbose > 2) + std::cout << " --> update_states\n"; + + // Derived variables: + xMomentum = rho % xVel; // x1momentum, pure scalar field + yMomentum = rho % yVel; // y1momentum, pure scalar field + rhoE = rho % temp; + + vel2 = xVel % xVel + yVel % yVel; + //energy = rho % (0.5 * vel2 + cv * temp); + energy = cv * rho % temp; + + /** Initialize projection constructs */ + static projection_struct rhoP; + static projection_struct xMomentumP, xVelP; + static projection_struct yMomentumP, yVelP; + static projection_struct energyP; + static projection_struct tempP; + + // They are all pure scalar fields without sqrt(g) + static arma_mat totaleL, totaleR, totaleD, totaleU; + static arma_mat velL2, velR2, velD2, velU2; + static arma_mat pressureL, pressureR, pressureD, pressureU; + + arma_mat dxVeldt = xVel * 0.0; + arma_mat dyVeldt = yVel * 0.0; + + dlonVeldt = dxVeldt * 0.0 + 1; + dlatVeldt = dyVeldt * 0.0 + 1; + + static arma_mat velNormL, velNormR, velNormU, velNormD; + + /** Initialize Flux and Wave Speed Storages */ + static arma_mat eq1FluxLR, eq1FluxDU; + static arma_mat eq1FluxL, eq1FluxR, eq1FluxD, eq1FluxU; + static arma_mat eq2FluxLR, eq2FluxDU; + static arma_mat eq2FluxL, eq2FluxR, eq2FluxD, eq2FluxU; + static arma_mat eq3FluxLR, eq3FluxDU; + static arma_mat eq3FluxL, eq3FluxR, eq3FluxD, eq3FluxU; + static arma_mat eq4FluxLR, eq4FluxDU; + static arma_mat eq4FluxL, eq4FluxR, eq4FluxD, eq4FluxU; + + arma_mat wsL, wsR, wsD, wsU, wsLR, wsDU; + + arma_mat diff; // for Riemann Solver + + if (verbose > 3) + std::cout << " ---> Projecting\n"; + + rhoP = project_to_edges(rho, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + // project the lon / lat velocities to the edges: + xVelP = project_to_edges(xVel, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + yVelP = project_to_edges(yVel, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + xMomentumP = project_to_edges(xMomentum, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + yMomentumP = project_to_edges(yMomentum, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + energyP = project_to_edges(energy, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + tempP = project_to_edges(temp, gridC.xi, gridL.xi, gridC.nu, gridD.nu, + gridC.nGCs); + + if (verbose > 3) + std::cout << " ---> Derived values\n"; + + velL2 = (xVelP.L % xVelP.L + yVelP.L % yVelP.L); + velR2 = (xVelP.R % xVelP.R + yVelP.R % yVelP.R); + velD2 = (xVelP.D % xVelP.D + yVelP.D % yVelP.D); + velU2 = (xVelP.U % xVelP.U + yVelP.U % yVelP.U); + + precision_t k = 1.38e-23; + // let's be Oxygen: + precision_t mass = 16.0 * 1.67e-27; + pressureL = k / mass * (rhoP.L % tempP.L); + pressureR = k / mass * (rhoP.R % tempP.R); + pressureD = k / mass * (rhoP.D % tempP.D); + pressureU = k / mass * (rhoP.U % tempP.U); + + arma_mat pressureLR = (pressureL + pressureR) / 2; + arma_mat pressureDU = (pressureD + pressureU) / 2; + + if (verbose > 3) + std::cout << " ---> Normal Velocities\n"; + + // Calculate the normal velocity at the boundaries: + velNormL = xVelP.L % gridL.nXiLon + yVelP.L % gridL.nXiLat; + velNormR = xVelP.R % gridL.nXiLon + yVelP.R % gridL.nXiLat; + velNormU = xVelP.U % gridD.nNuLon + yVelP.U % gridD.nNuLat; + velNormD = xVelP.D % gridD.nNuLon + yVelP.D % gridD.nNuLat; + + if (verbose > 3) + std::cout << " ---> Fluxes eq 1\n"; + + // Flux calculated from the left of the edge + eq1FluxL = rhoP.L % velNormL; + // Flux calculated from the right of the edge + eq1FluxR = rhoP.R % velNormR; + // Flux calculated from the down of the edge + eq1FluxD = rhoP.D % velNormD; + // Flux calculated from the up of the edge + eq1FluxU = rhoP.U % velNormU; + + if (verbose > 3) + std::cout << " ---> Fluxes eq 2\n"; + + eq2FluxL = (xMomentumP.L % velNormL); + eq2FluxR = (xMomentumP.R % velNormR); + eq2FluxD = (xMomentumP.D % velNormD); + eq2FluxU = (xMomentumP.U % velNormU); + + if (verbose > 3) + std::cout << " ---> Fluxes eq 3\n"; + + eq3FluxL = (yMomentumP.L % velNormL); + eq3FluxR = (yMomentumP.R % velNormR); + eq3FluxD = (yMomentumP.D % velNormD); + eq3FluxU = (yMomentumP.U % velNormU); + + eq4FluxL = energyP.L % velNormL; + eq4FluxR = energyP.R % velNormR; + eq4FluxD = energyP.D % velNormD; + eq4FluxU = energyP.U % velNormU; + + // ------------------------------------------------ + // Calculate the wave speed for the diffusive flux: + // In Reference velocities + if (verbose > 3) + std::cout << " ---> Diffusive Fluxes\n"; + + wsL = sqrt(velL2) + sqrt(cGamma * (cGamma - 1) * tempP.L); + wsR = sqrt(velR2) + sqrt(cGamma * (cGamma - 1) * tempP.R); + wsD = sqrt(velD2) + sqrt(cGamma * (cGamma - 1) * tempP.D); + wsU = sqrt(velU2) + sqrt(cGamma * (cGamma - 1) * tempP.U); + + wsLR = wsR; + + for (int64_t i = 0; i < gridC.nXt + 1; i++) { + for (int64_t j = 0; j < gridC.nYt; j++) { + if (wsL(i, j) > wsLR(i, j)) + wsLR(i, j) = wsL(i, j); + } + } + + wsDU = wsD; + + for (int64_t i = 0; i < gridC.nXt; i++) { + for (int64_t j = 0; j < gridC.nYt + 1; j++) { + if (wsU(i, j) > wsDU(i, j)) + wsDU(i, j) = wsU(i, j); + } + } + + // ------------------------------------------------ + // Calculate average flux at the edges (Rusanov Flux): + + if (verbose > 3) + std::cout << " ---> Averaging fluxes at edges\n"; + + diff = (rhoP.R - rhoP.L); + eq1FluxLR = (eq1FluxL + eq1FluxR) / 2 + 0.5 * wsLR % diff; + diff = (rhoP.U - rhoP.D); + eq1FluxDU = (eq1FluxD + eq1FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (xMomentumP.R - xMomentumP.L); + eq2FluxLR = (eq2FluxL + eq2FluxR) / 2 + 0.5 * wsLR % diff; + diff = (xMomentumP.U - xMomentumP.D); + eq2FluxDU = (eq2FluxD + eq2FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (yMomentumP.R - yMomentumP.L); + eq3FluxLR = (eq3FluxL + eq3FluxR) / 2 + 0.5 * wsLR % diff; + diff = (yMomentumP.U - yMomentumP.D); + eq3FluxDU = (eq3FluxD + eq3FluxU) / 2 + 0.5 * wsDU % diff; + + diff = (energyP.R - energyP.L); + eq4FluxLR = (eq4FluxL + eq4FluxR) / 2 + 0.5 * wsLR % diff; + diff = (energyP.U - energyP.D); + eq4FluxDU = (eq4FluxD + eq4FluxU) / 2 + 0.5 * wsDU % diff; + + // ------------------------------------------------ + // Update values: + if (verbose > 3) + std::cout << " ---> Updating equations of state\n"; + + precision_t dpdx, dpdn, pp, pm; + + arma_mat ax, an; + + ax = xVel * 0.0; + an = yVel * 0.0; + arma_mat dedt = xVel * 0.0; + + arma_mat rhoNew = rho; + + // Only deal with inner cell + for (int64_t j = gridC.iYfirst_; j < gridC.iYlast_; j++) { + for (int64_t i = gridC.iXfirst_; i < gridC.iXlast_; i++) { + precision_t rhoResidual_ij = (gridL.dln(i + 1, j) * eq1FluxLR(i + 1, j) - + gridL.dln(i, j) * eq1FluxLR(i, j) + + gridD.dlx(i, j + 1) * eq1FluxDU(i, j + 1) - + gridD.dlx(i, j) * eq1FluxDU(i, j)); + drhodt(i, j) = rhoResidual_ij / gridC.dS(i, j); + + rhoNew(i, j) = rho(i, j) + dt * drhodt(i, j); + + precision_t xMomentumResidual_ij = (gridL.dln(i + 1, j) * eq2FluxLR(i + 1, j) - + gridL.dln(i, j) * eq2FluxLR(i, j) + + gridD.dlx(i, j + 1) * eq2FluxDU(i, j + 1) - + gridD.dlx(i, j) * eq2FluxDU(i, j)); + dxVeldt(i, j) = xMomentumResidual_ij / gridC.dS(i, j) / rhoNew(i, j); + + precision_t yMomentumResidual_ij = (gridL.dln(i + 1, j) * eq3FluxLR(i + 1, j) - + gridL.dln(i, j) * eq3FluxLR(i, j) + + gridD.dlx(i, j + 1) * eq3FluxDU(i, j + 1) - + gridD.dlx(i, j) * eq3FluxDU(i, j)); + dyVeldt(i, j) = yMomentumResidual_ij / gridC.dS(i, j) / rhoNew(i, j); + + // Calculate the gradient in the potential in the cubesphere + // coordinate system: + dpdx = 1 / gridC.R * gridC.D(i, j) * + (pressureLR(i + 1, j) - pressureLR(i, j)) / gridC.dxi; + dpdn = 1 / gridC.R * gridC.X(i, j) * gridC.Y(i, j) / + gridC.D(i, j) * + (pressureDU(i, j + 1) - pressureDU(i, j)) / gridC.dnu; + ax(i, j) = (dpdx + dpdn) / rhoNew(i, j); + + dpdx = 1 / gridC.R * gridC.X(i, j) * gridC.Y(i, j) / + gridC.C(i, j) * (pressureLR(i + 1, j) - pressureLR(i, j)) / gridC.dxi; + dpdn = 1 / gridC.R * gridC.C(i, j) * + (pressureDU(i, j + 1) - pressureDU(i, j)) / gridC.dnu; + an(i, j) = (dpdx + dpdn) / rhoNew(i, j); + + precision_t energyResidual_ij = (gridL.dln(i + 1, j) * eq4FluxLR(i + 1, j) - + gridL.dln(i, j) * eq4FluxLR(i, j) + + gridD.dlx(i, j + 1) * eq4FluxDU(i, j + 1) - + gridD.dlx(i, j) * eq4FluxDU(i, j)); + dedt(i, j) = energyResidual_ij / gridC.dS(i, j); + + } + } + + dlatVeldt = dyVeldt - (ax % gridC.Atx + an % gridC.Atn); + dlonVeldt = dxVeldt + ax % gridC.Apx + an % gridC.Apn; + dtempdt = dedt / rhoNew / cv; + + return; +} + + +// --------------------------------------------------------- +// Main Code! +// --------------------------------------------------------- + +int main() { + precision_t dt; // Time Step + precision_t current_time = 0.0; // Initial Time 0 + precision_t total_time = 100.0; // Total simulation time + precision_t cfl = 0.75; + int iFace = 5; + + precision_t dtOut = total_time / 50.0; // Output Interval + precision_t dtReport = total_time / 200.0; // Output Interval + + int64_t iStep; // Iterator of Time Step + + int64_t nX = 50; // Number of x grid cells + int64_t nY = 50; // Number of y grid cells + int64_t nGCs = 2; // Number of ghost cells + + // Radius of Sphere + precision_t R = 10000.; + + if (verbose > 0) + std::cout << "> generating cubesphere cell center and metrics\n"; + + grid_struct gridC_eq = init_grid_equidistant(iFace, nX, nY, nGCs, R, 0.5, 0.5); + + output(gridC_eq.lat, "eq_lat.txt", false); + output(gridC_eq.lon, "eq_lon.txt", false); + output(gridC_eq.r, "eq_r.txt", false); + + grid_struct gridC = init_grid(iFace, nX, nY, nGCs, R, 0.5, 0.5); + grid_struct gridL = init_grid(iFace, nX + 1, nY, nGCs, R, 0.0, 0.5); + grid_struct gridD = init_grid(iFace, nX, nY + 1, nGCs, R, 0.5, 0.0); + + gridC.alpha = calc_angle_between_coords(gridC); + gridL.alpha = calc_angle_between_coords(gridL); + gridD.alpha = calc_angle_between_coords(gridD); + + gridC.sinAlpha = sin(gridC.alpha); + gridL.sinAlpha = sin(gridL.alpha); + gridD.sinAlpha = sin(gridD.alpha); + + calc_norms(gridC); + calc_norms(gridL); + calc_norms(gridD); + + /** State Initialization */ + /// Initialize Density + if (verbose > 0) + std::cout << "> initializing rho\n"; + + arma_mat rho = init_rho(gridC.xi, gridC.nu); // rho, pure scalar field + + /// Initialize Velocity and Momentum + if (verbose > 0) + std::cout << "> initializing vel\n"; + + // Initialize spherical velocity + // Supposed to be Longitudinal Velocity: + arma_mat vLon = init_value(gridC.xi, gridC.nu, 0.0); + // Supposed to be Latitudinal Velocity: + arma_mat vLat = init_value(gridC.xi, gridC.nu, 0.0); + + arma_mat vXi, vNu; + convert_vector_ll_to_xn(vLon, vLat, vXi, vNu, gridC); + + + /// Initialize total energy + if (verbose > 0) + std::cout << "> initializing energy\n"; + + arma_mat temp = init_temp(gridC.xi, gridC.nu); + + /** Output some pre-simulation results */ + if (verbose > 0) + std::cout << "-> outputting\n"; + + output(gridC.xi, "xi.txt", false); + output(gridC.dS, "dS.txt", false); + output(gridC.d, "d.txt", false); + output(gridC.nu, "nu.txt", false); + output(gridC.lat, "lat.txt", false); + output(gridC.lon, "lon.txt", false); + output(gridC.alpha, "alpha.txt", false); + output(rho, "rho.txt", false); + output(vLon, "vLon.txt", false); + output(vLat, "vLat.txt", false); + output(vXi, "vXi.txt", false); + output(vNu, "vNu.txt", false); + output(temp, "temp.txt", false); + iStep = 0; + + arma_mat xMax, yMax; + + arma_mat drhodt; + arma_mat dxVeldt, dyVeldt; + arma_mat dtempdt; + + drhodt.resize(gridC.nXt, gridC.nYt); + dxVeldt.resize(gridC.nXt, gridC.nYt); + dyVeldt.resize(gridC.nXt, gridC.nYt); + dtempdt.resize(gridC.nXt, gridC.nYt); + + arma_mat k1rho, k2rho, k3rho, k4rho, rhoInterK1, rhoInterK2, rhoInterK3; + k1rho.resize(gridC.nXt, gridC.nYt); + k2rho.resize(gridC.nXt, gridC.nYt); + k3rho.resize(gridC.nXt, gridC.nYt); + k4rho.resize(gridC.nXt, gridC.nYt); + rhoInterK1.resize(gridC.nXt, gridC.nYt); + rhoInterK2.resize(gridC.nXt, gridC.nYt); + rhoInterK3.resize(gridC.nXt, gridC.nYt); + + arma_mat k1vLon, k2vLon, k3vLon, k4vLon, vLonInterK1, vLonInterK2, vLonInterK3; + k1vLon.resize(gridC.nXt, gridC.nYt); + k2vLon.resize(gridC.nXt, gridC.nYt); + k3vLon.resize(gridC.nXt, gridC.nYt); + k4vLon.resize(gridC.nXt, gridC.nYt); + vLonInterK1.resize(gridC.nXt, gridC.nYt); + vLonInterK2.resize(gridC.nXt, gridC.nYt); + vLonInterK3.resize(gridC.nXt, gridC.nYt); + + arma_mat k1vLat, k2vLat, k3vLat, k4vLat, vLatInterK1, vLatInterK2, vLatInterK3; + k1vLat.resize(gridC.nXt, gridC.nYt); + k2vLat.resize(gridC.nXt, gridC.nYt); + k3vLat.resize(gridC.nXt, gridC.nYt); + k4vLat.resize(gridC.nXt, gridC.nYt); + vLatInterK1.resize(gridC.nXt, gridC.nYt); + vLatInterK2.resize(gridC.nXt, gridC.nYt); + vLatInterK3.resize(gridC.nXt, gridC.nYt); + + arma_mat k1temp, k2temp, k3temp, k4temp, tempInterK1, tempInterK2, tempInterK3; + k1temp.resize(gridC.nXt, gridC.nYt); + k2temp.resize(gridC.nXt, gridC.nYt); + k3temp.resize(gridC.nXt, gridC.nYt); + k4temp.resize(gridC.nXt, gridC.nYt); + tempInterK1.resize(gridC.nXt, gridC.nYt); + tempInterK2.resize(gridC.nXt, gridC.nYt); + tempInterK3.resize(gridC.nXt, gridC.nYt); + + while (current_time < total_time) { + + if (int((current_time - dt) / dtReport) != int((current_time ) / dtReport)) { + std::cout << "step : " << iStep << "; time : " << current_time << "\n"; + arma_vec amin, amax; + precision_t mini, maxi; + amin = rho.min(); + mini = amin.min(); + amax = max(rho, 1); + maxi = arma::max(amax); + std::cout << " -> min/max (rho) : " << mini << " / " << maxi << "\n"; + amin = temp.min(); + mini = amin.min(); + amax = max(temp, 1); + maxi = arma::max(amax); + std::cout << " -> min/max (temp) : " << mini << " / " << maxi << "\n"; + } + + calc_cmax(vLon, vLat, temp, xMax, yMax); + dt = calc_dt(gridC.dlx, gridC.dln, xMax, yMax, gridC.nGCs); + dt = cfl * dt; + std::cout << " dt: " << dt << "\n"; + + // k1 - start at t0, go to t+1/2 to figure out slope at t0 (k1) + update_states(rho, vLon, vLat, temp, + k1rho, k1vLon, k1vLat, k1temp, + gridC, gridL, gridD, dt / 2); + // Take 1/2 step to figure out t+1/2 values, using k1: + rhoInterK1 = rho + k1rho * dt / 2; + vLonInterK1 = vLon + k1vLon * dt / 2; + vLatInterK1 = vLat + k1vLat * dt / 2; + tempInterK1 = temp + k1temp * dt / 2; + set_bcs(rhoInterK1, vLonInterK1, vLatInterK1, tempInterK1, gridC); + + // k2 - start at t+1/2, go to t+1 to figure out slope at t+1/2 (k2) + update_states(rhoInterK1, vLonInterK1, vLatInterK1, tempInterK1, + k2rho, k2vLon, k2vLat, k2temp, + gridC, gridL, gridD, dt / 2); + // Take 1/2 step to figure out t+1/2 values, using k2: + rhoInterK2 = rho + k2rho * dt / 2; + vLonInterK2 = vLon + k2vLon * dt / 2; + vLatInterK2 = vLat + k2vLat * dt / 2; + tempInterK2 = temp + k2temp * dt / 2; + set_bcs(rhoInterK2, vLonInterK2, vLatInterK2, tempInterK2, gridC); + + // k3 - start at t+1/2, go to t+1 to figure out slope at t+1/2 (k3) + update_states(rhoInterK2, vLonInterK2, vLatInterK2, tempInterK2, + k3rho, k3vLon, k3vLat, k3temp, + gridC, gridL, gridD, dt / 2); + // Take full step to figure out k4, using k3 slope: + rhoInterK3 = rho + k3rho * dt; + vLonInterK3 = vLon + k3vLon * dt; + vLatInterK3 = vLat + k3vLat * dt; + tempInterK3 = temp + k3rho * dt; + set_bcs(rhoInterK3, vLonInterK3, vLatInterK3, tempInterK3, gridC); + + // k4 - start at t+1, go to t+2 to figure out slope at t+1 (k4) + update_states(rhoInterK3, vLonInterK3, vLatInterK3, tempInterK3, + k4rho, k4vLon, k4vLat, k4temp, + gridC, gridL, gridD, dt); + + rho = rho - dt / 6 * (k1rho + 2 * k2rho + 2 * k3rho + k4rho); + vLon = vLon - dt / 6 * (k1vLon + 2 * k2vLon + 2 * k3vLon + k4vLon); + vLat = vLat - dt / 6 * (k1vLat + 2 * k2vLat + 2 * k3vLat + k4vLat); + temp = temp - dt / 6 * (k1temp + 2 * k2temp + 2 * k3temp + k4temp); + set_bcs(rho, vLon, vLat, temp, gridC); + + iStep++; + current_time += dt; + + if (verbose > 3) + std::cout << " ---> Outputing\n"; + + if (int((current_time - dt) / dtOut) != int((current_time ) / dtOut)) { + std::cout << "> Outputing at time : " << current_time << "\n"; + output(rho, "rho.txt", true); + output(vLon, "vLon.txt", true); + output(vLat, "vLat.txt", true); + output(temp, "temp.txt", true); + } + } + + return 0; +} From d7b9cb9877077085cf47eec59183576ff577f611 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Aug 2025 15:05:30 -0400 Subject: [PATCH 603/691] STY: spacing, BUG: removed variables --- include/grid.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/include/grid.h b/include/grid.h index da702265..daae63d9 100644 --- a/include/grid.h +++ b/include/grid.h @@ -100,10 +100,7 @@ class Grid { arma_cube sqrt_g_Down; cubesphere_chars cubeC, cubeL, cubeD; - - // These define the magnetic grid: - // Armidillo Cube Versions: - arma_cube magLon_scgc, magX_scgc; + // The magnetic latitude and altitude need to be defined better. This should be the angle between // magnetic equator and the point, but sometimes it is invariant latitude. // These define the magnetic grid (only defined for a dipole grid): @@ -510,8 +507,8 @@ class Grid { bool set_interpolation_coefs(const std::vector &Lons, const std::vector &Lats, const std::vector &Alts, - bool areLocsGeo=true, - bool areLocsIJK=true); + bool areLocsGeo = true, + bool areLocsIJK = true); /** * \brief Set the interpolation coefficients for the dipole grid From 180a6a2e333cb4018f531689bab4473cc585afa4 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Aug 2025 15:06:04 -0400 Subject: [PATCH 604/691] Moved advection solver into neutral class --- src/solver_advection.cpp | 48 +++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 1e69c7bc..48e88688 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -282,9 +282,7 @@ precision_t calc_dt(arma_mat &xWidth, // // --------------------------------------------------------- -void advect(Grid &grid, - Times &time, - Neutrals &neutrals) { +void Neutrals::advect_sphere(Grid &grid, Times &time) { std::string function = "advect"; static int iFunction = -1; @@ -337,9 +335,9 @@ void advect(Grid &grid, arma_mat gamma2d; // These are all needed by the solver: - neutrals.calc_mass_density(); - neutrals.calc_mean_major_mass(); - neutrals.calc_specific_heat(); + calc_mass_density(); + calc_mean_major_mass(); + calc_specific_heat(); arma_mat t_to_e; @@ -350,14 +348,14 @@ void advect(Grid &grid, if (report.test_verbose(3)) std::cout << "Advection: Working with iAlt: " << iAlt << "\n"; - xVel = neutrals.velocity_vcgc[0].slice(iAlt); - yVel = neutrals.velocity_vcgc[1].slice(iAlt); - rho = neutrals.rho_scgc.slice(iAlt); + xVel = velocity_vcgc[0].slice(iAlt); + yVel = velocity_vcgc[1].slice(iAlt); + rho = rho_scgc.slice(iAlt); // this is "e", or temperature expressed as an energy - gamma2d = neutrals.gamma_scgc.slice(iAlt); - t_to_e = 1.0 / (gamma2d - 1.0) * cKB / neutrals.mean_major_mass_scgc.slice( + gamma2d = gamma_scgc.slice(iAlt); + t_to_e = 1.0 / (gamma2d - 1.0) * cKB / mean_major_mass_scgc.slice( iAlt); - temp = t_to_e % neutrals.temperature_scgc.slice(iAlt); + temp = t_to_e % temperature_scgc.slice(iAlt); // ------------------------------------------------ // Calculate derived equations (at cell centers - these will be updated) @@ -542,8 +540,8 @@ void advect(Grid &grid, xVel = xMomentum / rho; yVel = yMomentum / rho; - neutrals.velocity_vcgc[0].slice(iAlt) = xVel; - neutrals.velocity_vcgc[1].slice(iAlt) = yVel; + velocity_vcgc[0].slice(iAlt) = xVel; + velocity_vcgc[1].slice(iAlt) = yVel; temp = (totalE / rho - 0.5 * (xVel % xVel + yVel % yVel)) / t_to_e; temp.clamp(200, 2000); @@ -555,35 +553,35 @@ void advect(Grid &grid, //if (cos(grid.geoLat_scgc(i,j,iAlt)) < 0.2) { // fac = fac * (0.2 - cos(grid.geoLat_scgc(i,j,iAlt))); //} - //dm = (1.0 - fac) * neutrals.temperature_scgc(i,j,iAlt); - //dp = (1.0 + fac) * neutrals.temperature_scgc(i,j,iAlt); + //dm = (1.0 - fac) * temperature_scgc(i,j,iAlt); + //dp = (1.0 + fac) * temperature_scgc(i,j,iAlt); //if (temp(i,j) < dm) temp(i,j) = dm; //if (temp(i,j) > dp) temp(i,j) = dp; - neutrals.temperature_scgc(i, j, iAlt) = temp(i, j); + temperature_scgc(i, j, iAlt) = temp(i, j); - //dm = (1.0 - fac) * neutrals.rho_scgc(i,j,iAlt); - //dp = (1.0 + fac) * neutrals.rho_scgc(i,j,iAlt); + //dm = (1.0 - fac) * rho_scgc(i,j,iAlt); + //dp = (1.0 + fac) * rho_scgc(i,j,iAlt); //if (rho(i,j) < dm) rho(i,j) = dm; //if (rho(i,j) > dp) rho(i,j) = dp; - neutrals.rho_scgc(i, j, iAlt) = rho(i, j); + rho_scgc(i, j, iAlt) = rho(i, j); } } if (report.test_verbose(3) && iAlt == 8) { - std::cout << "end t : " << neutrals.temperature_scgc.slice( - iAlt).min() << " " << neutrals.temperature_scgc.slice(iAlt).max() << "\n"; + std::cout << "end t : " << temperature_scgc.slice( + iAlt).min() << " " << temperature_scgc.slice(iAlt).max() << "\n"; std::cout << "end temp : " << temp.min() << " " << temp.max() << "\n"; std::cout << "end xVel : " << xVel.min() << " " << xVel.max() << "\n"; std::cout << "end yVel : " << yVel.min() << " " << yVel.max() << "\n"; } } - neutrals.calc_density_from_mass_concentration(); + calc_density_from_mass_concentration(); // Assign bulk horizontal velocity to all species: - for (int64_t iSpecies = 0; iSpecies < neutrals.nSpecies; iSpecies++) + for (int64_t iSpecies = 0; iSpecies < nSpecies; iSpecies++) for (int64_t iDir = 0; iDir < 2; iDir++) - neutrals.species[iSpecies].velocity_vcgc[iDir] = neutrals.velocity_vcgc[iDir]; + species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; report.exit(function); return; From 007ce26f8c8373b6a706e0a152665190adbd2112 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Aug 2025 15:06:29 -0400 Subject: [PATCH 605/691] Moved advection solver into neutral class --- include/neutrals.h | 5 +---- src/neutrals_advect.cpp | 25 ++++++++++++++----------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/include/neutrals.h b/include/neutrals.h index 61686eab..34f67e34 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -597,16 +597,15 @@ class Neutrals { \param grid \param time - \param report **/ void solver_horizontal_rusanov_advection(Grid& grid, Times& time); + void advect_sphere(Grid &grid, Times &time); /********************************************************************** \brief Solves for fluid motion (pure advect) horizontally with RK1 \param grid \param time - \param report **/ void solver_horizontal_RK1_advection(Grid& grid, Times& time); @@ -615,7 +614,6 @@ class Neutrals { \param grid \param time - \param report **/ void solver_horizontal_RK2_advection(Grid& grid, Times& time); @@ -624,7 +622,6 @@ class Neutrals { \param grid \param time - \param report **/ void solver_horizontal_RK4_advection(Grid& grid, Times& time); diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index 465afad3..f2b11652 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -40,18 +40,21 @@ bool Neutrals::advect_horizontal(Grid & grid, Times & time) { static int iFunction = -1; report.enter(function, iFunction); - if (input.get_advection_neutrals_horizontal() == "advect_test") - solver_horizontal_RK4_advection(grid, time); - else if (input.get_advection_neutrals_horizontal() == "fv") - solver_horizontal_RK1_rochi(grid, time); + if (grid.iGridShape_ == grid.iCubesphere_) { + if (input.get_advection_neutrals_horizontal() == "advect_test") + solver_horizontal_RK4_advection(grid, time); + else if (input.get_advection_neutrals_horizontal() == "fv") + solver_horizontal_RK1_rochi(grid, time); + else { + std::cout << "Horizontal solver not found!\n"; + std::cout << " ==> Requested : " + << input.get_advection_neutrals_horizontal() + << "\n"; + didWork = false; + } + } else + advect_sphere(grid, time); - else { - std::cout << "Horizontal solver not found!\n"; - std::cout << " ==> Requested : " - << input.get_advection_neutrals_horizontal() - << "\n"; - didWork = false; - } report.exit(function); return didWork; From 58ef38038cdc6603eeb85e04d12a749777b191d3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Aug 2025 15:06:52 -0400 Subject: [PATCH 606/691] remove cout --- src/exchange_messages.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 895bb854..09f5ed1e 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -1109,8 +1109,6 @@ bool exchange_one_var(Grid &grid, if (!grid.isExchangeInitialized) { DidWork = exchange_sides_init(grid, nVarsToPass); grid.isExchangeInitialized = true; - std::cout << "initializing : " << grid.get_gridtype() << " " << nZ << " " << - iProc << "\n"; } var_scgc.set_size(nX, nY, nZ); From dc68f6f3e5c0242a85b5bf05fbcb9857b4a09fb2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Fri, 22 Aug 2025 15:07:16 -0400 Subject: [PATCH 607/691] test run should be much faster --- share/run/UA/inputs/defaults.json | 2 +- share/run/aether.json | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index fd7bfc84..91ce86a8 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -24,7 +24,7 @@ "Advection" : { "Neutrals" : { "Vertical" : "rusanov", - "Horizontal" : "default", + "Horizontal" : "fv", "useBulkWinds" : true, "useImplicitFriction" : true}, "Ions" : { diff --git a/share/run/aether.json b/share/run/aether.json index cc3e330d..b192b5b5 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -10,21 +10,21 @@ "dt" : 10.0, "check_for_nans" : true}, - "EndTime" : [2011, 3, 20, 0, 10, 0], + "EndTime" : [2011, 3, 20, 0, 1, 0], "neuGrid" : { "Shape": "sphere4", - "nLonsPerBlock" : 24, - "nLatsPerBlock" : 22, + "nLonsPerBlock" : 20, + "nLatsPerBlock" : 18, "nAlts" : 40, - "dAltScale" : 0.25, + "dAltScale" : 0.3, "IsUniformAlt" : false}, "ionGrid": { "Shape": "dipole4", - "nLonsPerBlock": 36, + "nLonsPerBlock": 24, "nLatsPerBlock": 18, - "nAlts": 100, + "nAlts": 50, "LatRange": [10, 80], "AltRange": [80.0, 1000], "LonRange": [0.0, 360.0]}, From a9faa80d942d7f23a8ab63c915e2f2253f45fa26 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:08:50 -0400 Subject: [PATCH 608/691] tabs and adding in display cube and matrix --- include/tools.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/tools.h b/include/tools.h index e8200476..2283c1b7 100644 --- a/include/tools.h +++ b/include/tools.h @@ -64,6 +64,8 @@ std::string add_cmember(std::string inString); // ---------------------------------------------------------------------- void display_vector(arma_vec vec); +void display_matrix(std::string, arma_mat mat); +void display_cube(std::string, arma_cube values); // ---------------------------------------------------------------------- // Display an armadillo vector with a strong name in front @@ -311,7 +313,7 @@ std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, // convert mag coordinates to dipole ijk // //////////////////////////////////////////// std::vector mag_to_ijk(precision_t mlon, - precision_t mlat, + precision_t mlat, precision_t radius, precision_t planet_radius); @@ -320,9 +322,9 @@ std::vector mag_to_ijk(precision_t mlon, // convert cell coordinates to geographic // //////////////////////////////////////////// std::vector geo_to_mag(arma_cube glon, - arma_cube glat, - arma_cube radius, - Planets &planet) ; + arma_cube glat, + arma_cube radius, + Planets &planet) ; arma_cube vec2cube(std::vector ivec); From be8d2070dc96ebe56c6c1fdf59ee204822e25376 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:09:33 -0400 Subject: [PATCH 609/691] add in things needed for sphere --- share/run/UA/inputs/defaults.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 91ce86a8..5aad82bb 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -86,6 +86,10 @@ "nLonsPerBlock": 36, "nLatsPerBlock": 18, "nAlts": 100, + "AltFile": "", + "dAltScale" : 0.25, + "IsUniformAlt" : false, + "MinAlt": 80.0, "LatRange": [10, 80], "AltRange": [80.0, 1000], "LonRange": [0.0, 360.0]}, From efbfc8e16b7f7ca0fafd75dee8d0a340eeaeac2f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:10:08 -0400 Subject: [PATCH 610/691] turn back on some terms --- src/add_sources.cpp | 71 ++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/src/add_sources.cpp b/src/add_sources.cpp index b9eaf2a9..40786512 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -21,7 +21,7 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { heating_sources_total = heating_euv_scgc + heating_chemical_scgc + heating_ion_friction_scgc - //+ heating_ion_heat_transfer_scgc + + heating_ion_heat_transfer_scgc - O_cool_scgc - NO_cool_scgc; @@ -32,11 +32,11 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { int64_t iDir, iSpec, iSpecies; double tSim = time.get_simulation_time(); - // Horizontal winds use bulk winds: - if (input.get_use_coriolis()) - acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); - /* + // Horizontal winds use bulk winds: + if (input.get_use_coriolis()) + acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + // Vertical winds use species winds: for (iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { // Pick out the advected neutral species: @@ -48,62 +48,64 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { advected_neutral.velocity_vcgc[iDir] = advected_neutral.velocity_vcgc[iDir] + dt * (ramp * grid.cent_acc_vcgc[iDir] + - ramp * acc_coriolis[iDir] + - advected_neutral.acc_neutral_friction[iDir] / 4.0 + - advected_neutral.acc_ion_drag[iDir] + - advected_neutral.acc_eddy); + ramp * acc_coriolis[iDir] + + advected_neutral.acc_neutral_friction[iDir] / 4.0 + + advected_neutral.acc_ion_drag[iDir] + + advected_neutral.acc_eddy); } calc_mass_density(); // Calculate bulk vertical winds: velocity_vcgc[2].zeros(); + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) if (species[iSpecies].DoAdvect) { velocity_vcgc[2] = velocity_vcgc[2] + - species[iSpecies].mass * species[iSpecies].density_scgc % - species[iSpecies].velocity_vcgc[2] / rho_scgc; + species[iSpecies].mass * species[iSpecies].density_scgc % + species[iSpecies].velocity_vcgc[2] / rho_scgc; } - */ - - // Add Velocity sources to bulk winds: - for (iDir = 0; iDir < 2; iDir++) { - velocity_vcgc[iDir] = - velocity_vcgc[iDir] + dt * ( - grid.cent_acc_vcgc[iDir] + - acc_coriolis[iDir] + - acc_ion_collisions[iDir]); - acc_sources_total[iDir].zeros(); - } - // Apply Viscosity: - update_horizontal_velocity(grid, time); + // Add Velocity sources to bulk winds: + for (iDir = 0; iDir < 2; iDir++) { + velocity_vcgc[iDir] = + velocity_vcgc[iDir] + dt * ( + grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + + acc_ion_collisions[iDir]); + acc_sources_total[iDir].zeros(); + } - // Assign bulk horizontal velocity to all species: - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) - for (iDir = 0; iDir < 2; iDir++) - species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; + // Apply Viscosity: + update_horizontal_velocity(grid, time); - /* + // Assign bulk horizontal velocity to all species: + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) + for (iDir = 0; iDir < 2; iDir++) + species[iSpecies].velocity_vcgc[iDir] = velocity_vcgc[iDir]; + */ // If we only consider the bulk winds in the horizontal direction: if (input.get_advection_neutrals_bulkwinds()) { // Calculate Coriolis: if (input.get_use_coriolis()) acc_coriolis = coriolis(velocity_vcgc, planet.get_omega(), grid.geoLat_scgc); + // Add Velocity sources to bulk winds: for (int iDir = 0; iDir < 3; iDir++) { velocity_vcgc[iDir] = velocity_vcgc[iDir] + dt * ( - grid.cent_acc_vcgc[iDir] + - acc_coriolis[iDir] + - acc_ion_collisions[iDir]); + grid.cent_acc_vcgc[iDir] + + acc_coriolis[iDir] + + acc_ion_collisions[iDir]); acc_sources_total[iDir].zeros(); } + // Apply Viscosity: update_horizontal_velocity(grid, time); } else { for (int64_t iSpec = 0; iSpec < nSpeciesAdvect; iSpec++) { // Pick out the advected neutral species: species_chars & advected_neutral = species[species_to_advect[iSpec]]; + // Calculate Coriolis: if (input.get_use_coriolis()) acc_coriolis = coriolis(advected_neutral.velocity_vcgc, @@ -119,6 +121,7 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { acc_coriolis[iDir] + advected_neutral.acc_neutral_friction[iDir] / 4.0 + advected_neutral.acc_ion_drag[iDir]); + // eddy acceleration is only in the vertical direction: if (iDir == 2) advected_neutral.velocity_vcgc[iDir] = @@ -126,10 +129,12 @@ void Neutrals::add_sources(Times time, Planets planet, Grid grid) { dt * advected_neutral.acc_eddy; } } + calc_bulk_velocity(); } + assign_bulk_velocity(); - */ + report.exit(function); return; } From 2449592c81cbc06b89dcf758d2383a0ddbc1173a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:10:52 -0400 Subject: [PATCH 611/691] fill corners augmenting and display cube/matrix --- src/tools.cpp | 88 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 10 deletions(-) diff --git a/src/tools.cpp b/src/tools.cpp index 4ced3b73..efc6fcc2 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -121,7 +121,44 @@ void fill_corners(arma_cube &values, int64_t nGCs) { int64_t nXs = values.n_rows, iX; int64_t nYs = values.n_cols, iY; - int64_t iGCx, iGCy; + int64_t nZs = values.n_slices, iZ; + int64_t iGCx, iGCy, iGCz; + + // Bottom: + for (iGCz == 0; iGCz < nGCs; iGCz++) { + for (iGCx = 0; iGCx < nGCs; iGCx++) { + for (iY = 0; iY < nYs; iY++) { + // Bottom: + values(iGCx, iY, iGCz) = + values(nGCs, iY, nGCs); + values(nXs - iGCx - 1, iY, iGCz) = + values(nXs - nGCs - 1, iY, nGCs); + // top: + values(iGCx, iY, nZs - iGCz - 1) = + values(nGCs, iY, nZs - nGCs - 1); + values(nXs - iGCx - 1, iY, nZs - iGCz - 1) = + values(nXs - nGCs - 1, iY, nZs - nGCs - 1); + } + } + } + + for (iGCz = 0; iGCz < nGCs; iGCz++) { + for (iGCy = 0; iGCy < nGCs; iGCy++) { + for (iX = 0; iX < nXs; iX++) { + // Bottoms: + values(iX, iGCy, iGCz) = + values(iX, nGCs, nGCs); + values(iX, nYs - iGCy - 1, iGCz) = + values(iX, nYs - nGCs - 1, nGCs); + // tops: + values(iX, iGCy, nZs - iGCz - 1) = + values(iX, nGCs, nZs - nGCs - 1); + values(iX, nYs - iGCy - 1, nZs - iGCz - 1) = + values(iX, nYs - nGCs - 1, nZs - nGCs - 1); + + } + } + } for (iGCx = 0; iGCx < nGCs; iGCx++) { for (iGCy = 0; iGCy < nGCs; iGCy++) { @@ -159,6 +196,35 @@ void display_vector(arma_vec vec) { std::cout << "\n"; } +// ---------------------------------------------------------------------------- +// Neatly display an armadillo matrix with a name +// ---------------------------------------------------------------------------- + +void display_cube(std::string name, arma_cube values) { + std::cout << name << " "; + + for (int64_t i = 0; i < values.n_slices; i++) { + std::cout << "Slice : " << i << ":\n"; + display_matrix(" ", values.slice(i)); + } + +} + +// ---------------------------------------------------------------------------- +// Neatly display an armadillo matrix with a name +// ---------------------------------------------------------------------------- + +void display_matrix(std::string name, arma_mat mat) { + std::cout << name << "\n"; + + for (int64_t i = 0; i < mat.n_cols; i++) + display_vector(" ", mat.col(i)); + + std::cout << "\n"; +} + + + // ---------------------------------------------------------------------------- // Neatly display an armadillo vector with a name // ---------------------------------------------------------------------------- @@ -671,7 +737,8 @@ bool all_finite(arma_cube cube, std::string name) { "," + std::to_string(loc[1]) + "," + std::to_string(loc[2]) + ")"; int size = locations.size(); - std::cout << "all_finite ("< mag_to_geo(arma_cube magLon, arma_cube magLat, //////////////////////////////////////////// std::vector geo_to_mag(arma_cube glon, - arma_cube glat, - arma_cube radius, - Planets &planet) { + arma_cube glat, + arma_cube radius, + Planets &planet) { - std::string function = "Grid::geo_to_gmag"; + std::string function = "Grid::geo_to_gmag"; static int iFunction = -1; report.enter(function, iFunction); @@ -946,12 +1013,12 @@ std::vector geo_to_mag(arma_cube glon, std::vector mag_to_ijk(precision_t mlon, - precision_t mLat, + precision_t mLat, precision_t radius, precision_t planet_radius) { precision_t i_lon, j_p, k_q; - + // precision_t planet_radius = planet.get_radius(); i_lon = mlon; @@ -972,8 +1039,9 @@ arma_cube vec2cube(std::vector ivec) { arma_cube I; I.set_size(sizei, 1, 1); - for (int i =0; i Date: Sat, 23 Aug 2025 12:11:45 -0400 Subject: [PATCH 612/691] more infinity checks --- src/advance.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index 96230431..523e3e59 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -88,6 +88,9 @@ bool advance(Planets &planet, precision_t dtIon = calc_dt(gGrid, ions.cMax_vcgc); time.calc_dt(dtNeutral, dtIon); + if (report.test_verbose(1)) + std::cout << "dt in advance : " << time.get_dt() << "\n"; + didWork = neutralsMag.check_for_nonfinites("Ion Grid: after calc dt"); // ------------------------------------ @@ -129,9 +132,11 @@ bool advance(Planets &planet, if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { neutrals.exchange_old(gGrid); ions.exchange_old(gGrid); + + didWork = neutrals.check_for_nonfinites("Geo Grid: Before Horizontal Advection"); neutrals.advect_horizontal(gGrid, time); + didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); ionsMag.exchange_old(mGrid); - //advect(gGrid, time, neutrals); } if (input.get_check_for_nans()) { From ec083d115821f8b719ea9ae8fe48328655d5a213 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:12:08 -0400 Subject: [PATCH 613/691] removed comments --- src/solver_horizontal_cubesphere.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/solver_horizontal_cubesphere.cpp b/src/solver_horizontal_cubesphere.cpp index 98868b1a..26192564 100644 --- a/src/solver_horizontal_cubesphere.cpp +++ b/src/solver_horizontal_cubesphere.cpp @@ -666,8 +666,6 @@ void Neutrals::solver_horizontal_RK1_rochi(Grid & grid, Times & time) { for (iAlt = nGCs; iAlt < nAlts - nGCs; iAlt++) { - /** States preprocessing **/ - /* MASS DENSITY */ rho = rho_scgc.slice(iAlt); vLon = velocity_vcgc[0].slice(iAlt); vLat = velocity_vcgc[1].slice(iAlt); @@ -683,10 +681,8 @@ void Neutrals::solver_horizontal_RK1_rochi(Grid & grid, Times & time) { velocity_vcgc[0].slice(iAlt) = vLon - k1vLon * dt; velocity_vcgc[1].slice(iAlt) = vLat - k1vLat * dt; temperature_scgc.slice(iAlt) = temp - k1temp * dt; - } - calc_density_from_mass_concentration(); report.exit(function); From 557d6440171bbff8a9b27cac462fa353229356e2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:12:43 -0400 Subject: [PATCH 614/691] tabbifying --- src/solver_gradients.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index b67617fb..73754c10 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -342,20 +342,20 @@ arma_cube calc_gradient2o_k(arma_cube value, Grid grid) { // Interior: for (iZ = 1; iZ < nZ - 1; iZ++) gradient.slice(iZ) = - (value.slice(iZ + 1) - value.slice(iZ - 1)) / - (2 * grid.dk_center_m_scgc.slice(iZ)); + (value.slice(iZ + 1) - value.slice(iZ - 1)) / + (2 * grid.dk_center_m_scgc.slice(iZ)); // Lower (one sided): iZ = 0; gradient.slice(iZ) = - (value.slice(iZ + 1) - value.slice(iZ)) / - grid.dk_center_m_scgc.slice(iZ); + (value.slice(iZ + 1) - value.slice(iZ)) / + grid.dk_center_m_scgc.slice(iZ); // Upper (one sided): iZ = nZ - 1; gradient.slice(iZ) = - (value.slice(iZ) - value.slice(iZ - 1)) / - grid.dk_center_m_scgc.slice(iZ); + (value.slice(iZ) - value.slice(iZ - 1)) / + grid.dk_center_m_scgc.slice(iZ); } return gradient; From 8581c2befdf02f011df11c531829ab2553cd3071 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:13:19 -0400 Subject: [PATCH 615/691] crashout smoothly if wrong shape is given --- src/quadtree.cpp | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 35ebb2e5..aa61b98e 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -15,21 +15,38 @@ int64_t iProcQuery = -1; -Quadtree::Quadtree(std::string shape) { - if (shape == "cubesphere") +Quadtree::Quadtree(std::string shapeInput) { + IsOk = false; + std::string shape = mklower(shapeInput); + + if (shape == "cubesphere") { nRootNodes = 6; + IsOk = true; + } - if (shape == "sphere") + if (shape == "sphere") { nRootNodes = 1; + IsOk = true; + } - if (shape == "sphere4") + if (shape == "sphere4") { nRootNodes = 4; + IsOk = true; + } - if (shape == "dipole4") + if (shape == "dipole4") { nRootNodes = 4; + IsOk = true; + } - if (shape == "dipole6") + if (shape == "dipole6") { nRootNodes = 6; + IsOk = true; + } + + if (!IsOk) + report.error("quadtree shape not found : " + shape); + } // -------------------------------------------------------------------------- @@ -504,7 +521,7 @@ arma_vec Quadtree::wrap_point_cubesphere(arma_vec point) { // -------------------------------------------------------------------------- // This is the starting point for determining which node a point -// on the sphere is located. The point needs to be in normalized +// on the sphere is located. The point needs to be in normalized // coordinates. // -------------------------------------------------------------------------- @@ -514,8 +531,10 @@ int64_t Quadtree::find_point(arma_vec point) { if (IsSphere) wrap_point = wrap_point_sphere(point); + if (IsCubeSphere) wrap_point = wrap_point_cubesphere(point); + if (IsDipole) wrap_point = wrap_point_sphere(point); @@ -523,15 +542,17 @@ int64_t Quadtree::find_point(arma_vec point) { for (int64_t iRoot = 0; iRoot < nRootNodes; iRoot++) { iNode = find_point(wrap_point, root_nodes[iRoot]); + if (iNode > -1) break; } + return iNode; } // -------------------------------------------------------------------------- // This is the starting point for determining which root a point -// on the sphere is located. The point needs to be in normalized +// on the sphere is located. The point needs to be in normalized // coordinates. // -------------------------------------------------------------------------- @@ -541,8 +562,10 @@ int64_t Quadtree::find_root(arma_vec point) { if (IsSphere) wrap_point = wrap_point_sphere(point); + if (IsCubeSphere) wrap_point = wrap_point_cubesphere(point); + if (IsDipole) wrap_point = wrap_point_cubesphere(point); From c336dd480c7a6cd779e735f241534a65e2c6f878 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:13:43 -0400 Subject: [PATCH 616/691] added space --- src/neutrals_advect.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index f2b11652..7efaa231 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -45,6 +45,7 @@ bool Neutrals::advect_horizontal(Grid & grid, Times & time) { solver_horizontal_RK4_advection(grid, time); else if (input.get_advection_neutrals_horizontal() == "fv") solver_horizontal_RK1_rochi(grid, time); + else { std::cout << "Horizontal solver not found!\n"; std::cout << " ==> Requested : " From b090979e568382cbffdb7ddf3bfdb3bfb54e5cef Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:14:14 -0400 Subject: [PATCH 617/691] crashout smoother in general --- src/main/main.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index fcb62ce0..32f3ac0c 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -12,7 +12,7 @@ int main() { int iErr = 0; std::string sError; - bool didWork = true, testsPassing=true; + bool didWork = true, testsPassing = true; Times time; @@ -35,14 +35,18 @@ int main() { // Find out what tests we are running: json tests = input.get_tests(); - // For now, the number of processors and blocks are set by the + // For now, the number of processors and blocks are set by the // neutral grid shape, since this could be sphere (1 root) or // cubesphere (6 root) Quadtree quadtree(input.get_grid_shape("neuGrid")); - Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); if (!quadtree.is_ok()) - throw std::string("quadtree initialization failed!"); + throw std::string("quadtree for neutrals initialization failed!"); + + Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); + + if (!quadtree_ion.is_ok()) + throw std::string("quadtree for ions initialization failed!"); // Initialize MPI and parallel aspects of the code: didWork = init_parallel(quadtree, quadtree_ion); @@ -103,6 +107,7 @@ int main() { if (mGrid.iGridShape_ == mGrid.iDipole_) { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); + if (!didWork) throw std::string("init_dipole_grid failed!"); } else { @@ -113,7 +118,7 @@ int main() { } if (!didWork) - throw std::string("Initializing magneitic grid failed!"); + throw std::string("Initializing magneitic grid failed!"); didWork = grid_match(gGrid, mGrid, quadtree, quadtree_ion); @@ -126,9 +131,8 @@ int main() { Ions ions(gGrid, planet); Ions ionsMag(mGrid, planet); - if (tests["test_gradient"]) { + if (tests["test_gradient"]) testsPassing = test_gradient(planet, quadtree, tests, gGrid, mGrid); - } if (!testsPassing && tests["exit_on_fail"]) throw std::string("Cannot continue!!"); @@ -287,21 +291,19 @@ int main() { } // End of outer time loop - done with run! - report.report_errors(); - - report.exit(function); report.times(); } catch (std::string error) { - report.report_errors(); - - if (iProc == 0) { - std::cout << error << "\n"; - std::cout << "---- Must Exit! ----\n"; - } + report.error(error); } - // End parallel tasks: - iErr = MPI_Finalize(); + report.exit(function); + report.report_errors(); + + if (nProcs > 0) + // End parallel tasks: + iErr = MPI_Finalize(); + return iErr; + } From 998993fa6032bb262c0d6a513b3f7227d49c8d91 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:15:06 -0400 Subject: [PATCH 618/691] check to make sure nX = nY for cubesphere --- src/grid.cpp | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/src/grid.cpp b/src/grid.cpp index 93270b37..cbe9f409 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -19,6 +19,28 @@ Grid::Grid(std::string gridtype) { gridType = gridtype; + if (mklower(grid_input.shape).find("sphere") != std::string::npos) + iGridShape_ = iSphere_; + + if (mklower(grid_input.shape) == "cubesphere") + iGridShape_ = iCubesphere_; + + //lowercase, check for any number of dipole, so dipole2 matches & dipole does too + if (mklower(grid_input.shape).find("dipole") != std::string::npos) + iGridShape_ = iDipole_; + + if (iGridShape_ == iCubesphere_) { + if (grid_input.nX > grid_input.nY) { + report.error("Cubesphere grid: nX > nY, reducing nX"); + grid_input.nX = grid_input.nY; + } + + if (grid_input.nY > grid_input.nX) { + report.error("Cubesphere grid: nY > nX, reducing nY"); + grid_input.nY = grid_input.nX; + } + } + nX = grid_input.nX + nGCs * 2; nLons = nX; nY = grid_input.nY + nGCs * 2; @@ -66,16 +88,6 @@ Grid::Grid(std::string gridtype) { if (grid_input.nZ == 1) HasZdim = false; - if (mklower(grid_input.shape).find("sphere") != std::string::npos) - iGridShape_ = iSphere_; - - if (mklower(grid_input.shape) == "cubesphere") - iGridShape_ = iCubesphere_; - - //lowercase, check for any number of dipole, so dipole2 matches & dipole does too - if (mklower(grid_input.shape).find("dipole") != std::string::npos) - iGridShape_ = iDipole_; - geoLon_scgc.set_size(nX, nY, nZ); geoLat_scgc.set_size(nX, nY, nZ); geoAlt_scgc.set_size(nX, nY, nZ); From c32d8081d0fe20641dbfb0d0f963fd41a17aca0e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:15:53 -0400 Subject: [PATCH 619/691] simplify dtx and dtx --- src/calc_dt.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index beb0de18..96658471 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -92,22 +92,31 @@ precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { arma_mat dummy_1(nXs, nYs, fill::ones); // Loop through altitudes + for (int iAlt = 0; iAlt < nAlts; iAlt++) { // Conver cMax to contravariant velocity first - arma_mat u1 = sqrt( - cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) % - cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) + - cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt) % - cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt)); - arma_mat u2 = sqrt( - cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) % - cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) + - cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt) % - cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt)); - dtx.slice(iAlt) = grid.drefx(iAlt) * dummy_1 / u1; - dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; + //arma_mat u1 = sqrt( + // cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) % + // cMax_vcgc[0].slice(iAlt) % grid.A11_inv_scgc.slice(iAlt) + + // cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt) % + // cMax_vcgc[1].slice(iAlt) % grid.A12_inv_scgc.slice(iAlt)); + //arma_mat u2 = sqrt( + // cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) % + // cMax_vcgc[0].slice(iAlt) % grid.A21_inv_scgc.slice(iAlt) + + // cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt) % + // cMax_vcgc[1].slice(iAlt) % grid.A22_inv_scgc.slice(iAlt)); + dtx.slice(iAlt) = grid.cubeC.dlx.slice(iAlt) / cMax_vcgc[0].slice(iAlt); + dty.slice(iAlt) = grid.cubeC.dln.slice(iAlt) / cMax_vcgc[1].slice(iAlt); + //dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; } + //if (iProc == 0) + // display_cube("dtx : ", dtx); + + //if (iProc == 0) + // display_cube("dty : ", dty); + + // Take minimum dts in each direction: dta(0) = dtx.min(); dta(1) = dty.min(); @@ -116,6 +125,7 @@ precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { // Set a minimum dt: dta(3) = 10.0; // Take the minimum of all directions: + dt = dta.min(); if (report.test_verbose(3)) From fabbb08d19ef10ec6ca94528cc3bf7937e267cc2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Sat, 23 Aug 2025 12:16:48 -0400 Subject: [PATCH 620/691] turn back on interpolation + fill corners --- src/exchange_messages.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/exchange_messages.cpp b/src/exchange_messages.cpp index 09f5ed1e..518ca540 100644 --- a/src/exchange_messages.cpp +++ b/src/exchange_messages.cpp @@ -105,7 +105,7 @@ bool Ions::exchange_old(Grid &grid) { for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) DidWork = exchange_one_var(grid, species[iSpecies].density_scgc, false); - //DidWork = exchange_one_var(grid, temperature_scgc, false); + DidWork = exchange_one_var(grid, temperature_scgc, false); DidWork = exchange_one_var(grid, electron_temperature_scgc, false); // velocity components: @@ -1186,14 +1186,14 @@ bool exchange_one_var(Grid &grid, } // If this is a cubesphere grid, interpolate ghostcells to their proper location - //if (grid.IsCubeSphereGrid & grid.gcInterpolationSet) { - // report.print(3, "Interpolating Ghostcells to Proper Location"); - // var_scgc = interpolate_ghostcells(var_to_pass, grid); - // var_to_pass = var_scgc; - //} + if (grid.IsCubeSphereGrid & grid.gcInterpolationSet) { + report.print(3, "Interpolating Ghostcells to Proper Location"); + var_scgc = interpolate_ghostcells(var_to_pass, grid); + var_to_pass = var_scgc; + } // Now we fill in the corners so that we don't have zero values there: - //fill_corners(var_to_pass, nG); + fill_corners(var_to_pass, nG); report.exit(function); return DidWork; From 28c0fdb53beffc76b11bcbcf57ac784e8ef9ebca Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 10:54:59 -0400 Subject: [PATCH 621/691] FEAT: consolidate blocks into one grid if possible --- srcPython/postAether.py | 222 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 210 insertions(+), 12 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index b3523cab..59b04e42 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -39,6 +39,9 @@ def parse_args(): parser.add_argument('-oned', \ help='strip 1d files of ghostcells and store in one file', \ action="store_true") + parser.add_argument('-combine', \ + help='combine all of the blocks into a single block (spherical only)', \ + action="store_true") parser.add_argument('-dir', default=None, type=str, help="Directory to find Aether files in. Will look in current" " directory & $PWD/UA/output/") @@ -728,23 +731,28 @@ def get_sizes(allBlockData): # Write a NetCDF file from the data #---------------------------------------------------------------------------- -def write_netcdf(allBlockData, fileName, isVerbose = True): +def write_netcdf(allBlockData, fileName, \ + isVerbose = True, \ + isConsolidated = False): if (isVerbose): print(' Outputting file : ', fileName) ncfile = Dataset(fileName, 'w') - nBlocks = len(allBlockData) - nLons, nLats, nZ = get_sizes(allBlockData) + if (not isConsolidated): + oneBlock = allBlockData[0] + nBlocks = len(allBlockData) + nLons, nLats, nZ = get_sizes(allBlockData) + block_dim = ncfile.createDimension('block', None) + else: + oneBlock = allBlockData + nLons, nLats, nZ = np.shape(allBlockData[0]) lon_dim = ncfile.createDimension('lon', nLons) lat_dim = ncfile.createDimension('lat', nLats) z_dim = ncfile.createDimension('z', nZ) - block_dim = ncfile.createDimension('block', None) time_dim = ncfile.createDimension('time', None) - oneBlock = allBlockData[0] - time_out = ncfile.createVariable('time', np.float64, ('time',)) time_out[0] = datetime_to_epoch(oneBlock["time"]) @@ -760,14 +768,22 @@ def write_netcdf(allBlockData, fileName, isVerbose = True): else: longName = v unitName = oneBlock['units'][iV] - allNetCDFVars.append(ncfile.createVariable(v, np.float32, \ + if (isConsolidated): + allNetCDFVars.append(ncfile.createVariable(v, np.float32, \ + ('lon', 'lat', 'z'))) + else: + allNetCDFVars.append(ncfile.createVariable(v, np.float32, \ ('block', 'lon', 'lat', 'z'))) allNetCDFVars[-1].units = unitName allNetCDFVars[-1].long_name = longName - for iB, oneBlock in enumerate(allBlockData): - tmp = np.asarray(oneBlock[iV]) - allNetCDFVars[-1][iB,:,:,:] = tmp + if (isConsolidated): + tmp = np.asarray(allBlockData[iV]) + allNetCDFVars[-1][:,:,:] = tmp + else: + for iB, oneBlock in enumerate(allBlockData): + tmp = np.asarray(oneBlock[iV]) + allNetCDFVars[-1][iB,:,:,:] = tmp ncfile.close() @@ -927,6 +943,168 @@ def calc_std_of_ensembles(filesInfo, return stdData +#---------------------------------------------------------------------------- +# Test to see if grid is uniform: +#---------------------------------------------------------------------------- + +def calc_if_uniform_grid(dataToWrite): + + nBlocks = len(dataToWrite) + + # Let's figure out if we have a uniform horizontal grid: + isUniform = True + + for iBlock in range(nBlocks): + # Assume first 3 variables are lon, lat, alt: + longitude = dataToWrite[iBlock][0] + latitude = dataToWrite[iBlock][1] + + if (iBlock == 0): + dLon = longitude[1, 0, 0] - longitude[0, 0, 0] + dLat = latitude[0, 1, 0] - latitude[0, 0, 0] + else: + dLonT = longitude[1, 0, 0] - longitude[0, 0, 0] + dLatT = latitude[0, 1, 0] - latitude[0, 0, 0] + if (np.abs(dLat - dLatT) > dLat/1000.0): + isUniform = False + if (np.abs(dLon - dLonT) > dLon/1000.0): + isUniform = False + + return isUniform + + +#---------------------------------------------------------------------------- +# Figure out number of ghostcells +# - Simple method works if grid touches the south pole +#---------------------------------------------------------------------------- + +def calc_ghostcells(dataToWrite): + + nGCs = -1 + # --------------------------------------------- + # Try simple method first: + # Assume first 3 variables of first block are lon, lat, alt: + lon1d = dataToWrite[0][0][:, 0, 0] + lat1d = dataToWrite[0][1][0, :, 0] + + nGCs = 0 + print(lat1d) + while (lat1d[nGCs] < -90.0): + # Checking to see how many points are below south pole: + nGCs = nGCs + 1 + + if (nGCs < 0): + # Didn't find GCs, test longitude + while (lon1d[nGCs] < 0): + # Checking to see how many points are below south pole: + nGCs = nGCs + 1 + + return nGCs + + +#---------------------------------------------------------------------------- +# Figure out number of blocks in lat and lon +# - Assume a quadtree!!! +#---------------------------------------------------------------------------- + +def calc_blocks(dataToWrite, iLon_ = 0, iLat_ = 1): + + nBlocksLon = 1 + nBlocksLat = 1 + + nBlocksTotal = len(dataToWrite) + + # Brute force method: + # assume that all longitude blocks will have same latitude + # assume that all latitude blocks will have same longitude + + # assume var 0 is longitude and var 1 is latitude + iBlock = 0 + testLon = dataToWrite[iBlock][iLon_][0, 0, 0] + testLat = dataToWrite[iBlock][iLat_][0, 0, 0] + + iBlock = 1 + while (iBlock < nBlocksTotal): + if (np.abs(dataToWrite[iBlock][iLon_][0, 0, 0] - testLon) > 0.001): + nBlocksLon = nBlocksLon + 1 + if (np.abs(dataToWrite[iBlock][iLat_][0, 0, 0] - testLat) > 0.001): + nBlocksLat = nBlocksLat + 1 + iBlock = iBlock + 1 + + print(' -> nBlocksLon, nBlocksLat : ', nBlocksLon, nBlocksLat) + + if (not (nBlocksLat * nBlocksLon == nBlocksTotal)): + print("Finding nBlocksLat and nBlocksLon didn't work!") + print("Tell Aaron to fix this!") + nBlocksLat = -1 + nBlocksLon = -1 + + return nBlocksLon, nBlocksLat + +#---------------------------------------------------------------------------- +# Consolidate Blocks +#---------------------------------------------------------------------------- + +def consolidate_blocks(originalData, iLon_ = 0, iLat_ = 1): + + nBlocksLon, nBlocksLat = calc_blocks(originalData) + nGCs = calc_ghostcells(originalData) + nLons, nLats, nAlts = np.shape(originalData[0][0]) + nLons = nLons - 2 * nGCs + nLats = nLats - 2 * nGCs + nVars = len(originalData[0]) + nLonsTotal = nLons * nBlocksLon + 2 * nGCs + nLatsTotal = nLats * nBlocksLat + 2 * nGCs + Lat0 = originalData[0][iLat_][nGCs, nGCs, nGCs] + Lon0 = originalData[0][iLon_][nGCs, nGCs, nGCs] + dLat = originalData[0][iLat_][nGCs, nGCs + 1, nGCs] - Lat0 + dLon = originalData[0][iLon_][nGCs + 1, nGCs, nGCs] - Lon0 + nBlocks = len(originalData) + + consolidatedData = {} + for key in originalData[0].keys(): + if (isinstance(key, str)): + consolidatedData[key] = originalData[0][key] + else: + # need to move data over + data = np.zeros((nLonsTotal, nLatsTotal, nAlts)) + for iBlock in range(nBlocks): + # interior points: + iLatS = int((originalData[iBlock][iLat_][nGCs, nGCs, nGCs] - Lat0)/dLat) + nGCs + iLatE = iLatS + nLats + iLonS = int((originalData[iBlock][iLon_][nGCs, nGCs, nGCs] - Lon0)/dLon) + nGCs + iLonE = iLonS + nLons + iLonSO = nGCs + iLonEO = nGCs + nLons + iLatSO = nGCs + iLatEO = iLatSO + nLats + #print(iLonS, iLonE, nLonsTotal, ' -> ', iLonSO, iLonEO, nLons) + #print(iLatS, iLatE, nLatsTotal, ' -> ', iLatSO, iLatEO, nLats) + #print(nGCs) + data[iLonS:iLonE, iLatS:iLatE, 0:nAlts] = \ + originalData[iBlock][key][iLonSO:iLonEO, iLatSO:iLatEO, 0:nAlts] + + # Lat down edge: + if (iLatS == nGCs): + data[iLonS-nGCs:iLonE+nGCs, 0:nGCs, :] = \ + originalData[iBlock][key][0:nLons+2*nGCs, 0:nGCs, :] + # Lon Left edge: + if (iLonS == nGCs): + data[0:nGCs, iLatS-nGCs:iLatE+nGCs, :] = \ + originalData[iBlock][key][0:nGCs, 0:nLats+2*nGCs, :] + # Lat up edge + if (iLatE == nLatsTotal - nGCs): + data[iLonS-nGCs:iLonE+nGCs, iLatE:iLatE+nGCs, :] = \ + originalData[iBlock][key][0:nLons+2*nGCs, nLats:nLats+nGCs, :] + # long right edge + if (iLonE == nLonsTotal - nGCs): + data[iLonE:iLonE+nGCs, iLatS-nGCs:iLatE+nGCs, :] = \ + originalData[iBlock][key][nLons:nLons+nGCs, 0:nLats+2*nGCs, :] + consolidatedData[key] = data + + print(consolidatedData.keys()) + + return consolidatedData #---------------------------------------------------------------------------- # write and plot data @@ -940,10 +1118,30 @@ def write_and_plot_data(dataToWrite, output_netcdf, isVerbose = True): + # We want to figure out whether we can combine our blocks into + # a single block and just write that out - it is much easier to + # deal with in this case! + + canConsolidateBlocks = False + print(np.shape(dataToWrite)) + print('keys : ', dataToWrite[0].keys()) + print('shape of variable : ', np.shape(dataToWrite[0][0])) + isUniform = calc_if_uniform_grid(dataToWrite) + print(' -> isUniform : ', isUniform) + + if (isUniform): + nBlocksLon, nBlocksLat = calc_blocks(dataToWrite) + if (nBlocksLon > 0): + canConsolidateBlocks = True + + print('can consolidate blocks: ', canConsolidateBlocks) + if (canConsolidateBlocks): + dataToWrite = consolidate_blocks(dataToWrite) + if output_netcdf: netcdfFile = fileStart + fileAddon + '.nc' print(' --> Outputting nc file : ', netcdfFile) - write_netcdf(dataToWrite, netcdfFile, isVerbose = isVerbose) + write_netcdf(dataToWrite, netcdfFile, isVerbose = isVerbose, isConsolidated = canConsolidateBlocks) else: hdf5File = fileStart + fileAddon + '.hdf5' print(' --> Outputting hdf5 file : ', hdf5File) @@ -1032,4 +1230,4 @@ def main(args): # This allows code to cleanly exit on error main(args) - \ No newline at end of file + From e2051991e3b3443d3ebd345b2c6e0d8b92b9113f Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 11:12:13 -0400 Subject: [PATCH 622/691] FEAT: recovered from an old branch --- doc/internals/interpolation.md | 46 ++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 doc/internals/interpolation.md diff --git a/doc/internals/interpolation.md b/doc/internals/interpolation.md new file mode 100644 index 00000000..4eb0e08d --- /dev/null +++ b/doc/internals/interpolation.md @@ -0,0 +1,46 @@ + +# How to use the built in interpolator in Aether + +Before attempting interpolation, you need to have the geogrid, some +grids where you want to perform the interpolation (the size of the +grid should match exactly with the geogrid, and the values in the grid +should represent the quantity at the center of cells in the geogrid), +and a set of points at which you want to interpolate the values. + +First, place the longitude, latitude, and altitude of the points into +three different vectors. For example, if you have points p1 (lon 180, +lat 0, alt 10000), p2 (lon 90, lat -30, alt 15000), p3 (lon 270, lat +40, alt 10000), and p4 (lon 0, lat 0, alt 15000), then you should +create three vectors as follows: + +```bash +std::vector Lons = {180, 90, 270, 0}; +std::vector Lats = {0, -30, 40, 0}; +std::vector Alts = {10000, 15000, 10000, 15000}; +``` +Second, set the interpolation coefficients. Continuing with the +previous example, assuming you have a geogrid named "geo_grid," you +should call: + +```bash +geo_grid.set_interpolation_coefs(Lons, Lats, Alts); +``` + +All subsequent calls to geo_grid.get_interpolation_values will use +these coefficients until geo_grid.set_interpolation_coefs is called +again (and the coefficients are updated to the newly set ones). + +Finally, obtain the values at the set of points. Continuing with the +previous example, if you want to perform interpolation on "arma_cube +data1" and "arma_cube data2" with the set of points, you can execute: + +```bash +std::vector ans1 = geo_grid.get_interpolation_values(data1); +std::vector ans2 = geo_grid.get_interpolation_values(data2); +``` + +The first element in "ans1" (i.e., ans1[0]) represents the +interpolated value for the quantity "data1" at point p1 (lon 180, lat +0, alt 10000), and the second element is the result for point p2, and +so on. This is the same for "ans2", except that it is for the quantity +"data2". From 1d9b1706f04d5fb80ee52d3551a4f839f27e9991 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 17:19:53 -0400 Subject: [PATCH 623/691] STY: removed some print statements --- srcPython/postAether.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index 59b04e42..694b2ad4 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -988,7 +988,6 @@ def calc_ghostcells(dataToWrite): lat1d = dataToWrite[0][1][0, :, 0] nGCs = 0 - print(lat1d) while (lat1d[nGCs] < -90.0): # Checking to see how many points are below south pole: nGCs = nGCs + 1 @@ -1031,8 +1030,6 @@ def calc_blocks(dataToWrite, iLon_ = 0, iLat_ = 1): nBlocksLat = nBlocksLat + 1 iBlock = iBlock + 1 - print(' -> nBlocksLon, nBlocksLat : ', nBlocksLon, nBlocksLat) - if (not (nBlocksLat * nBlocksLon == nBlocksTotal)): print("Finding nBlocksLat and nBlocksLon didn't work!") print("Tell Aaron to fix this!") @@ -1102,8 +1099,6 @@ def consolidate_blocks(originalData, iLon_ = 0, iLat_ = 1): originalData[iBlock][key][nLons:nLons+nGCs, 0:nLats+2*nGCs, :] consolidatedData[key] = data - print(consolidatedData.keys()) - return consolidatedData #---------------------------------------------------------------------------- @@ -1123,18 +1118,14 @@ def write_and_plot_data(dataToWrite, # deal with in this case! canConsolidateBlocks = False - print(np.shape(dataToWrite)) - print('keys : ', dataToWrite[0].keys()) - print('shape of variable : ', np.shape(dataToWrite[0][0])) isUniform = calc_if_uniform_grid(dataToWrite) - print(' -> isUniform : ', isUniform) if (isUniform): nBlocksLon, nBlocksLat = calc_blocks(dataToWrite) if (nBlocksLon > 0): canConsolidateBlocks = True - print('can consolidate blocks: ', canConsolidateBlocks) + print(' -> can consolidate blocks: ', canConsolidateBlocks) if (canConsolidateBlocks): dataToWrite = consolidate_blocks(dataToWrite) From f5b12223269c6a844ecea795ed224fcdaaa5d2ad Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 17:20:54 -0400 Subject: [PATCH 624/691] FEAT: switch back on some features on dipole grid --- src/advance.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index 523e3e59..2c781f02 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -111,6 +111,9 @@ bool advance(Planets &planet, if (didWork) didWork = neutralsMag.set_bcs(mGrid, time, indices); + if (didWork) + didWork = ionsMag.set_bcs(mGrid, time, indices); + didWork = neutralsMag.check_for_nonfinites("Ion Grid: set bcs"); // advect in the 3rd dimension (vertical), but only if we have it: @@ -127,6 +130,21 @@ bool advance(Planets &planet, } + // advect in the 3rd dimension (vertical), but only if we have it: + if (mGrid.get_nAlts(false) > 1) { + neutralsMag.advect_vertical(mGrid, time); + + if (didWork & input.get_check_for_nans()) + didWork = neutralsMag.check_for_nonfinites("After Vertical Neutral Advection"); + + // ajr - ionsMag.advect_vertical(mGrid, time); + + if (didWork & input.get_check_for_nans()) + didWork = ionsMag.check_for_nonfinites("After Vertical Ion Advection"); + + } + + // advect in the 1st and 2nd dimensions (horizontal), but only if // we have those dimensions: if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { @@ -137,6 +155,7 @@ bool advance(Planets &planet, neutrals.advect_horizontal(gGrid, time); didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); ionsMag.exchange_old(mGrid); + //neutralsMag.exchange_old(mGrid); } if (input.get_check_for_nans()) { @@ -206,7 +225,7 @@ bool advance(Planets &planet, calc_ion_collisions(neutrals, ions); neutrals.add_sources(time, planet, gGrid); - //neutralsMag.add_sources(time, planet, mGrid); + neutralsMag.add_sources(time, planet, mGrid); if (didWork & input.get_check_for_nans()) { didWork = neutrals.check_for_nonfinites("Geo Grid: After Add Sources"); From 91b95b300447fcb380de89b7bcc1963aa0b59ba0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 17:21:24 -0400 Subject: [PATCH 625/691] STY: spaces --- src/neutrals.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/neutrals.cpp b/src/neutrals.cpp index 28993f14..b6cc83c4 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -263,9 +263,11 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, for (iNeutral = 0; iNeutral < nSpeciesAdvect; iNeutral++) { iSpecies = species_to_advect[iNeutral]; + for (iX = nGCs; iX < nX - nGCs; iX++) { for (iY = nGCs; iY < nY - nGCs; iY++) { iFirst = grid.first_lower_gc(iX, iY) + iStart; + // Integrate with hydrostatic equilibrium up: for (int iAlt = iFirst; iAlt < iEnd; iAlt++) { species[iSpecies].density_scgc(iX, iY, iAlt) = @@ -274,6 +276,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, species[iSpecies].density_scgc(iX, iY, iAlt - 1) * exp(-grid.dr_edge(iX, iY, iAlt) / species[iSpecies].scale_height_scgc(iX, iY, iAlt)); + } } } @@ -302,6 +305,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iSpecies, for (iX = nGCs; iX < nX - nGCs; iX++) { for (iY = nGCs; iY < nY - nGCs; iY++) { iFirst = grid.first_lower_gc(iX, iY) + iStart; + // Integrate with hydrostatic equilibrium up:I for (int iAlt = iFirst; iAlt < iEnd; iAlt++) { species[iSpecies].density_scgc(iX, iY, iAlt) = From 84ddaf1d88651cb99a8df7f2facfbfbf3130a6b7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 17:22:16 -0400 Subject: [PATCH 626/691] BUG: start with 0th cell --- src/neutrals_advect.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index 7efaa231..dcdd67cd 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -17,8 +17,10 @@ bool Neutrals::advect_vertical(Grid grid, Times time) { static int iFunction = -1; report.enter(function, iFunction); - if (input.get_advection_neutrals_vertical() == "hydro") - fill_with_hydrostatic(1, grid.get_nZ(), grid); + if (grid.get_IsDipole() || + input.get_advection_neutrals_vertical() == "hydro") + fill_with_hydrostatic(0, grid.get_nZ(), grid); + else if (input.get_advection_neutrals_vertical() == "rusanov") solver_vertical_rusanov(grid, time); else { From 445248053a3191e40941ff74b5ad820dd2e9edf8 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 17:23:53 -0400 Subject: [PATCH 627/691] STY: spacing + setting lower temp BC --- src/neutrals_bcs.cpp | 61 +++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 7d93ef56..77368a39 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -92,8 +92,8 @@ bool Neutrals::set_upper_bcs(Grid grid) { h = species[iSpecies].scale_height_scgc.slice(iAlt); species[iSpecies].density_scgc.slice(iAlt) = - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dk_edge_m.slice(iAlt) / h); + species[iSpecies].density_scgc.slice(iAlt - 1) % + exp(-grid.dk_edge_m.slice(iAlt) / h); } } @@ -173,13 +173,13 @@ bool Neutrals::set_lower_bcs(Grid grid, std::cout << " Found in MSIS!\n"; species[iSpecies].density_scgc.slice(0) = - msis.get_mat(species[iSpecies].cName); + msis.get_mat(species[iSpecies].cName); } else { if (report.test_verbose(3)) std::cout << " NOT Found in MSIS - setting constant\n"; species[iSpecies].density_scgc.slice(0). - fill(species[iSpecies].lower_bc_density); + fill(species[iSpecies].lower_bc_density); } } @@ -198,11 +198,16 @@ bool Neutrals::set_lower_bcs(Grid grid, // - The equator-most (j-hat) grid cell will be entirely below min_alt! for (int iLon = 0; iLon < nLons; iLon++) { for (int iLat = 0; iLat < nLats; iLat++) { - for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - // k-index of 1st lower ghost cell is not constant on the dipole grid. - // On the latlon grid with nGCS=2, this will be 1 - iAlt = grid.first_lower_gc(iLon, iLat); + // k-index of 1st lower ghost cell is not constant on the dipole grid. + // On the latlon grid with nGCS=2, this will be 1 + iAlt = grid.first_lower_gc(iLon, iLat); + temperature_scgc(iLon, iLat, iAlt) = initial_temperatures[0]; + // Set all lower ghost cells to bottom temperature: + temperature_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( + temperature_scgc(iLon, iLat, iAlt)); + + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { //----------------------------------------------- // Planet BCs - set to fixed constant values. @@ -213,15 +218,8 @@ bool Neutrals::set_lower_bcs(Grid grid, species[iSpecies].density_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( species[iSpecies].lower_bc_density); - // only fill 1st GC with lower temperature - temperature_scgc(iLon, iLat, iAlt) = initial_temperatures[0]; } // planet bc type - // Set all lower ghost cells to bottom temperature: - temperature_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( - temperature_scgc(iLon, iLat, iAlt)); - - // 1st ghost cell density is filled with a hydrostatic solution. sh_ave = (species[iSpecies].scale_height_scgc(iLon, iLat, iAlt) + species[iSpecies].scale_height_scgc(iLon, iLat, iAlt + 1)) / 2; @@ -251,7 +249,6 @@ bool Neutrals::set_lower_bcs(Grid grid, didWork = true; - calc_bulk_velocity(); if (!didWork) { @@ -292,8 +289,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = 0; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX - 1, iY) - - temperature_scgc.tube(iX - 2, iY); + 2 * temperature_scgc.tube(iX - 1, iY) - + temperature_scgc.tube(iX - 2, iY); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -302,8 +299,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX - 1, iY) - - species[iSpecies].density_scgc.tube(iX - 2, iY); + 2 * species[iSpecies].density_scgc.tube(iX - 1, iY) - + species[iSpecies].density_scgc.tube(iX - 2, iY); } } } @@ -314,8 +311,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = 0; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX + 1, iY) - - temperature_scgc.tube(iX + 2, iY); + 2 * temperature_scgc.tube(iX + 1, iY) - + temperature_scgc.tube(iX + 2, iY); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -324,8 +321,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX + 1, iY) - - species[iSpecies].density_scgc.tube(iX + 2, iY); + 2 * species[iSpecies].density_scgc.tube(iX + 1, iY) - + species[iSpecies].density_scgc.tube(iX + 2, iY); } } } @@ -336,8 +333,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = nX - nGCs; iY < nY; iY++) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX, iY - 1) - - temperature_scgc.tube(iX, iY - 2); + 2 * temperature_scgc.tube(iX, iY - 1) - + temperature_scgc.tube(iX, iY - 2); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -346,8 +343,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX, iY - 1) - - species[iSpecies].density_scgc.tube(iX, iY - 2); + 2 * species[iSpecies].density_scgc.tube(iX, iY - 1) - + species[iSpecies].density_scgc.tube(iX, iY - 2); } } } @@ -358,8 +355,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { for (iY = nGCs - 1; iY >= 0; iY--) { // Constant Gradient for Temperature: temperature_scgc.tube(iX, iY) = - 2 * temperature_scgc.tube(iX, iY + 1) - - temperature_scgc.tube(iX, iY + 2); + 2 * temperature_scgc.tube(iX, iY + 1) - + temperature_scgc.tube(iX, iY + 2); // Constant Value for Velocity: for (iV = 0; iV < 3; iV++) @@ -368,8 +365,8 @@ bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { // Constant Gradient for densities: for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) species[iSpecies].density_scgc.tube(iX, iY) = - 2 * species[iSpecies].density_scgc.tube(iX, iY + 1) - - species[iSpecies].density_scgc.tube(iX, iY + 2); + 2 * species[iSpecies].density_scgc.tube(iX, iY + 1) - + species[iSpecies].density_scgc.tube(iX, iY + 2); } } } From f2dac4d5b4300eb6de76a8b8cd93bcbc2318786e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 18:48:46 -0400 Subject: [PATCH 628/691] FEAT: fill ghostcells with values to allow good math --- include/tools.h | 1 + src/tools.cpp | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/include/tools.h b/include/tools.h index 2283c1b7..24a7fbe5 100644 --- a/include/tools.h +++ b/include/tools.h @@ -50,6 +50,7 @@ void set_gcs_to_value(arma_cube &var_scgc, // - basically fill in the corners with values near them // ---------------------------------------------------------------------------- +void fill_horizontal_ghostcels(arma_cube &values, int64_t nGCs); void fill_corners(arma_cube &values, int64_t nGCs); // ----------------------------------------------------------------------------- diff --git a/src/tools.cpp b/src/tools.cpp index efc6fcc2..9601d868 100644 --- a/src/tools.cpp +++ b/src/tools.cpp @@ -111,6 +111,39 @@ arma_vec interpolate1d(arma_vec inY, return outY; } +// ---------------------------------------------------------------------------- +// Fix corners in an arma cube +// - basically fill in the corners with values near them +// ---------------------------------------------------------------------------- + +void fill_horizontal_ghostcels(arma_cube &values, int64_t nGCs) { + + int64_t nXs = values.n_rows, iX; + int64_t nYs = values.n_cols, iY; + int64_t nZs = values.n_slices, iZ; + int64_t iGCx, iGCy, iGCz; + + for (iGCx = 0; iGCx < nGCs; iGCx++) { + for (iY = 0; iY < nYs; iY++) { + // Bottom: + values.tube(iGCx, iY) = values.tube(nGCs, iY); + values.tube(nXs - iGCx - 1, iY) = values.tube(nXs - nGCs - 1, iY); + } + } + + for (iX = 0; iX < nXs; iX++) { + for (iGCy = 0; iGCy < nGCs; iGCy++) { + // Bottom: + values.tube(iX, iGCy) = values.tube(iX, nGCs); + values.tube(iX, nYs - iGCy - 1) = values.tube(iX, nYs - nGCs - 1); + } + } + + //fill_corners(values, nGCs); + + return; + +} // ---------------------------------------------------------------------------- // Fix corners in an arma cube From 42e39f3118b28518178e8532cbaef080702e1de5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 18:49:01 -0400 Subject: [PATCH 629/691] FEAT: fill ghostcells with values to allow good math --- src/advance.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/advance.cpp b/src/advance.cpp index 2c781f02..375e24eb 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -144,7 +144,6 @@ bool advance(Planets &planet, } - // advect in the 1st and 2nd dimensions (horizontal), but only if // we have those dimensions: if (gGrid.get_HasXdim() || gGrid.get_HasYdim()) { @@ -155,6 +154,12 @@ bool advance(Planets &planet, neutrals.advect_horizontal(gGrid, time); didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); ionsMag.exchange_old(mGrid); + fill_horizontal_ghostcels(neutralsMag.temperature_scgc, mGrid.get_nGCs()); + + //for (int iSpecies = 0; iSpecies < neutralsMag.nSpecies; iSpecies++) + // fill_horizontal_ghostcels(neutralsMag.species[iSpecies].density_scgc, + // mGrid.get_nGCs()); + //neutralsMag.exchange_old(mGrid); } From ea9b0c868cffb11ba4d4c014e26a61db3d1fce35 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 20:43:56 -0400 Subject: [PATCH 630/691] FEAT: finally, a formatter for json files --- srcPython/format_json.py | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 srcPython/format_json.py diff --git a/srcPython/format_json.py b/srcPython/format_json.py new file mode 100755 index 00000000..2b4b6960 --- /dev/null +++ b/srcPython/format_json.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import os +import argparse +import json + +# ---------------------------------------------------------------------------- +# Get arguments as inputs into the code +#----------------------------------------------------------------------------- + +def get_args(): + + parser = argparse.ArgumentParser( + description = 'reformat json files') + + # Get the files to plot: + parser.add_argument('filelist', nargs='+', \ + help = 'list of files for formatting') + + args = parser.parse_args() + + return args + +# ---------------------------------------------------------------------- +# do system command +# ---------------------------------------------------------------------- + +def run_command(command, verbose = False): + if (verbose): + print(" -> Running Command : ") + print(" ", command) + os.system(command) + return True + +# Needed to run main script as the default executable from the command line +if __name__ == '__main__': + + # Get the input arguments + args = get_args() + filelist = args.filelist + + for file in filelist: + + fileSave = file + '.orig' + command = 'mv ' + file + ' ' + fileSave + run_command(command, verbose = True) + + with open(fileSave, 'r') as handle: + print('-> Reading : ', fileSave) + parsed = json.load(handle) + + fpOut = open(file, 'w') + print('-> Writing : ', file) + json.dump(parsed, fpOut, indent=4) + fpOut.close() + From 0a65a33f4f91ff17d3868a6e4a772e1d383032b6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 20:44:19 -0400 Subject: [PATCH 631/691] STY: formatted --- share/run/UA/inputs/defaults.json | 330 +++++++++++++++++------------- 1 file changed, 185 insertions(+), 145 deletions(-) diff --git a/share/run/UA/inputs/defaults.json b/share/run/UA/inputs/defaults.json index 5aad82bb..5e61f466 100644 --- a/share/run/UA/inputs/defaults.json +++ b/share/run/UA/inputs/defaults.json @@ -1,151 +1,191 @@ - { - "Debug" : { - "iVerbose" : 0, - "doInheritVerbose" : false, - "dt" : 60.0, - "TimingPercent" : 1.0, - "iTimingDepth" : 5, - "iProc" : 0, - "iFunctionVerbose" : { - "Grid::create_altitudes": 0}, - "check_for_nans" : false, - "nan_test" : { - "insert" : false, - "variable" : "temperature_scgc"} - }, - - "InitialConditions" : { - "type" : "Planet"}, - - "BoundaryConditions" : { - "type" : "Planet"}, - - "Advection" : { - "Neutrals" : { - "Vertical" : "rusanov", - "Horizontal" : "fv", - "useBulkWinds" : true, - "useImplicitFriction" : true}, - "Ions" : { - "Along" : "rusanov", - "Across" : "default"} - }, - - "Student" : { - "name" : "", - "is" : false }, - - "Planet" : { - "name" : "earth", - "file": "UA/inputs/earth.in"}, - - "BField" : "dipole", - - "Electrodynamics" : { - "Potential" : "weimer", - "DiffuseAurora" : "fta", - "Dir" : "UA/inputs/ext/ie/", - "File" : ""}, - - "Euv" : { - "doUse" : true, - "Model" : "euvac", - "File" : "UA/inputs/euv.csv", - "IncludePhotoElectrons" : true, - "HeatingEfficiency" : 0.05, - "dt" : 60.0}, - - "DoCalcBulkIonTemp" : false, - - "Eddy" : { - "Coefficient" : 50.0, - "BottomPressure" : 0.01, - "TopPressure" : 0.005, - "UseInEnergy": true, - "UseInMomentum": true}, - - "StartTime" : [2011, 3, 20, 0, 0, 0], - "EndTime" : [2011, 3, 20, 0, 10, 0], - - "neuGrid" : { - "Shape" : "sphere4", - "LatRange" : [-90.0, 90.0], - "nLatsPerBlock" : 18, - "LonRange" : [0.0, 360.0], - "nLonsPerBlock" : 20, - "nAlts" : 40, - "MinAlt" : 100.0, - "dAltkm" : 5.0, - "dAltScale" : 0.25, - "IsUniformAlt" : true, - "AltFile" : ""}, - + "Debug": { + "iVerbose": 0, + "doInheritVerbose": false, + "dt": 60.0, + "TimingPercent": 1.0, + "iTimingDepth": 5, + "iProc": 0, + "iFunctionVerbose": { + "Grid::create_altitudes": 0 + }, + "check_for_nans": false, + "nan_test": { + "insert": false, + "variable": "temperature_scgc" + } + }, + "InitialConditions": { + "type": "Planet" + }, + "BoundaryConditions": { + "type": "Planet" + }, + "Advection": { + "Neutrals": { + "Vertical": "rusanov", + "Horizontal": "fv", + "useBulkWinds": true, + "useImplicitFriction": true + }, + "Ions": { + "Along": "rusanov", + "Across": "default" + } + }, + "Student": { + "name": "", + "is": false + }, + "Planet": { + "name": "earth", + "file": "UA/inputs/earth.in" + }, + "BField": "dipole", + "Electrodynamics": { + "Potential": "weimer", + "DiffuseAurora": "fta", + "Dir": "UA/inputs/ext/ie/", + "File": "" + }, + "Euv": { + "doUse": true, + "Model": "euvac", + "File": "UA/inputs/euv.csv", + "IncludePhotoElectrons": true, + "HeatingEfficiency": 0.05, + "dt": 60.0 + }, + "DoCalcBulkIonTemp": false, + "Eddy": { + "Coefficient": 50.0, + "BottomPressure": 0.01, + "TopPressure": 0.005, + "UseInEnergy": true, + "UseInMomentum": true + }, + "StartTime": [ + 2011, + 3, + 20, + 0, + 0, + 0 + ], + "EndTime": [ + 2011, + 3, + 20, + 0, + 10, + 0 + ], + "neuGrid": { + "Shape": "sphere4", + "LatRange": [ + -90.0, + 90.0 + ], + "nLatsPerBlock": 18, + "LonRange": [ + 0.0, + 360.0 + ], + "nLonsPerBlock": 20, + "nAlts": 40, + "MinAlt": 100.0, + "dAltkm": 5.0, + "dAltScale": 0.25, + "IsUniformAlt": true, + "AltFile": "" + }, "ionGrid": { "Shape": "dipole4", "nLonsPerBlock": 36, "nLatsPerBlock": 18, "nAlts": 100, - "AltFile": "", - "dAltScale" : 0.25, - "IsUniformAlt" : false, - "MinAlt": 80.0, - "LatRange": [10, 80], - "AltRange": [80.0, 1000], - "LonRange": [0.0, 360.0]}, - - "Oblate" : { - "isOblate" : false, - "isJ2" : false}, - - "Ensembles" : { - "nMembers" : 1}, - - "Sources" : { - - "Grid" : { - "Coriolis" : true, - "Cent_acc": true }, - - "Neutrals" : { - "NO_cool" : false, - "O_cool": false }, - - "Ions" : { - "IncludePhotoElectronHeating": true, - "IncludeIonizationHeating": true, - "IncludeElectronIonCollisionalHeating":true, - "IncludeElectronNeutralElasticCollisionalHeating":true, - "IncludeElectronNeutralInelasticCollisionalHeating":true, - "IncludeThermoelectricHeating": false}}, - - "Seed" : 0, - - "F107File" : "UA/inputs/f107.txt", - "ChemistryFile" : "UA/inputs/chemistry_earth_richards.csv", - "CollisionsFile" : "UA/inputs/ion_neutral_collision_frequencies.csv", - "PlanetCharacteristicsFile" : "UA/inputs/orbits.csv", - "AuroraFile" : "UA/inputs/aurora_earth.csv", - "IndicesLookupFile" : "UA/inputs/indices_lookup.json", - - "OmniwebFile" : ["UA/inputs/omni_20110319.txt"], - - "Logfile" : { - "name" : ["UA/output/log_geo.txt", "UA/output/log_mag.txt"], - "append" : false, - "dt" : 10.0, - "species" : ["O2", "O2+"]}, - - "Outputs" : { - "type" : ["states", "grid"], - "dt" : [900, -1]}, - - "Restart" : { - "do" : false, - "OutDir" : "UA/restartOut", - "InDir" : "UA/restartIn", - "dt" : 3600.0}, - - "DoTests": {"test_gradient": false, - "exit_on_fail": true} -} + "AltFile": "", + "dAltScale": 0.25, + "IsUniformAlt": false, + "MinAlt": 80.0, + "LatRange": [ + 10, + 80 + ], + "AltRange": [ + 80.0, + 1000 + ], + "LonRange": [ + 0.0, + 360.0 + ] + }, + "Oblate": { + "isOblate": false, + "isJ2": false + }, + "Ensembles": { + "nMembers": 1 + }, + "Sources": { + "Grid": { + "Coriolis": true, + "Cent_acc": true + }, + "Neutrals": { + "NO_cool": false, + "O_cool": false + }, + "Ions": { + "IncludePhotoElectronHeating": true, + "IncludeIonizationHeating": true, + "IncludeElectronIonCollisionalHeating": true, + "IncludeElectronNeutralElasticCollisionalHeating": true, + "IncludeElectronNeutralInelasticCollisionalHeating": true, + "IncludeThermoelectricHeating": false + } + }, + "Seed": 0, + "F107File": "UA/inputs/f107.txt", + "ChemistryFile": "UA/inputs/chemistry_earth_richards.csv", + "CollisionsFile": "UA/inputs/ion_neutral_collision_frequencies.csv", + "PlanetCharacteristicsFile": "UA/inputs/orbits.csv", + "AuroraFile": "UA/inputs/aurora_earth.csv", + "IndicesLookupFile": "UA/inputs/indices_lookup.json", + "OmniwebFile": [ + "UA/inputs/omni_20110319.txt" + ], + "Logfile": { + "name": [ + "UA/output/log_geo.txt", + "UA/output/log_mag.txt" + ], + "append": false, + "dt": 10.0, + "species": [ + "O2", + "O2+" + ] + }, + "Outputs": { + "type": [ + "states", + "grid" + ], + "dt": [ + 900, + -1 + ] + }, + "Restart": { + "do": false, + "OutDir": "UA/restartOut", + "InDir": "UA/restartIn", + "dt": 3600.0 + }, + "DoTests": { + "test_gradient": false, + "exit_on_fail": true + } +} \ No newline at end of file From bb451e786e5173875f60d117aa2a5d948d933241 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 3 Sep 2025 21:20:17 -0400 Subject: [PATCH 632/691] BUG: need to exit main function before reporting time --- src/main/main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 32f3ac0c..54e8316f 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -291,13 +291,12 @@ int main() { } // End of outer time loop - done with run! - report.times(); - } catch (std::string error) { report.error(error); } report.exit(function); + report.times(); report.report_errors(); if (nProcs > 0) From 73ba4255ae6a732d671d619a6b16395158ab443d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 13:34:40 -0400 Subject: [PATCH 633/691] FEAT: set vertical BCs on the closed field lines --- include/grid.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/grid.h b/include/grid.h index daae63d9..c4187111 100644 --- a/include/grid.h +++ b/include/grid.h @@ -150,6 +150,7 @@ class Grid { // Whether to close field lines on dipole grid (Always false for geo grids) bool IsClosed; + bool setNorthAsDown, setSouthAsDown; // These are the locations of the magnetic poles: // ll -> lat, lon, radius independent From dd6671343da89d4ae8a1456105ad98b774615fe2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 13:35:31 -0400 Subject: [PATCH 634/691] FIX: set some vertical BCs below the grid --- src/advance.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/advance.cpp b/src/advance.cpp index 375e24eb..f56e6aea 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -155,6 +155,7 @@ bool advance(Planets &planet, didWork = neutrals.check_for_nonfinites("Geo Grid: After Horizontal Advection"); ionsMag.exchange_old(mGrid); fill_horizontal_ghostcels(neutralsMag.temperature_scgc, mGrid.get_nGCs()); + neutralsMag.set_lower_bcs(mGrid, time, indices); //for (int iSpecies = 0; iSpecies < neutralsMag.nSpecies; iSpecies++) // fill_horizontal_ghostcels(neutralsMag.species[iSpecies].density_scgc, @@ -221,6 +222,12 @@ bool advance(Planets &planet, chemistry.calc_chemistry(neutrals, ions, time, gGrid); chemistryMag.calc_chemistry(neutralsMag, ionsMag, time, mGrid); + // We could have some weird results in the non-physical cells, + // so correct them + if (mGrid.IsDipole) + didWork = ionsMag.set_bcs(mGrid, time, indices); + + if (input.get_O_cooling()) neutrals.calc_O_cool(); From d658e2f00ceddf40d3b64642450a5f405a0923ae Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 14:57:53 -0400 Subject: [PATCH 635/691] BUG: need dipole stuff so that variables are initialized --- src/init_geo_grid.cpp | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index d61fb623..ed333537 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -153,17 +153,19 @@ void Grid::create_altitudes(Planets planet) { // All cells on the geographic grid *should* be ok isTooLowCell = find(geoAlt_scgc < grid_input.alt_min * cKMtoM); isPhysicalCell = find(geoAlt_scgc >= grid_input.alt_min * cKMtoM); - // get the ghost cell indices on each lat/lon point. + // get the ghost cell indices on each lat/lon point. // may be redundant can fill lower with nGCs-1, but this is here for now arma::uvec theGCs; - for (iLon=0; iLon Date: Thu, 4 Sep 2025 14:59:11 -0400 Subject: [PATCH 636/691] FEAT: know which horizontal cells to set as BCs --- src/init_mag_grid.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8b8e0836..8fc17d2d 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -65,6 +65,8 @@ void Grid::create_dipole_connection(Quadtree quadtree) { // along the Z direction, which turns out to be the same processor // as the Y direction, so just take that one: IsClosed = false; + setNorthAsDown = false; + setSouthAsDown = false; if ((middle_norm(1) < 0) && (up_norm(1) > 0)) { // We are in the south and need to pass to the north: @@ -76,7 +78,9 @@ void Grid::create_dipole_connection(Quadtree quadtree) { // points are "higher" than the other edges, let's just add some // to the 3rd dimension: edge_Z(2) = 5.0; + // Let set_BCs know which side to use as BCs IsClosed = true; + setNorthAsDown = true; } if ((middle_norm(1) > 0) && (down_norm(1) < 0)) { @@ -86,7 +90,9 @@ void Grid::create_dipole_connection(Quadtree quadtree) { edge_Z = edge_Ym; // See note above... edge_Z(2) = 5.0; + // Let set_BCs know which side to use as BCs IsClosed = true; + setSouthAsDown = true; } // Check if touching South Pole: From f27299c3344ab860663394f73684ccfe4dede0a2 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 15:00:01 -0400 Subject: [PATCH 637/691] FEAT: working on BCs for closed fieldlines --- src/ions_bcs.cpp | 162 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 115 insertions(+), 47 deletions(-) diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index c17757a7..0c793853 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -6,14 +6,9 @@ #include "aether.h" // ----------------------------------------------------------------------------- -// Set initial conditions for the neutrals. -// Two methods implemented so far: -// - Planet: Use fixed density values in the planet.in file and the -// temperature profile to set the densities and temperature. -// Densities are filled with hydrostatic solution. -// - Msis: Use NRL MSIS to set the densities and temperatures. If the -// densities are not found, then set to density in planet.in -// file and fill with hydrostatic. +// Set boundary conditions for the ions. +// The dipolar grid is fundamentally different than the sphere/cubesphere grids. +// We need to treat them differently. // ----------------------------------------------------------------------------- //---------------------------------------------------------------------- @@ -67,33 +62,41 @@ bool Ions::set_upper_bcs(Grid grid) { arma_mat h; arma_mat aveT; - for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { - // Bulk Quantities: - // Constant gradient (ignoring grid spacing...) - temperature_scgc.slice(iAlt) = - 2 * temperature_scgc.slice(iAlt - 1) - temperature_scgc.slice(iAlt - 2); + // If we are on the dipole grid and our field-lines are closed, then + // we don't want to set upper boundary conditions, since we will + // be message passing them. - // For each species: - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + if (!grid.IsClosed) { + + for (iAlt = nAlts - nGCs; iAlt < nAlts; iAlt++) { + // Bulk Quantities: // Constant gradient (ignoring grid spacing...) - species[iSpecies].temperature_scgc.slice(iAlt) = - 2 * species[iSpecies].temperature_scgc.slice(iAlt - 1) - - species[iSpecies].temperature_scgc.slice(iAlt - 2); - - aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + - electron_temperature_scgc.slice(iAlt)); - // Calculate scale height for the species: - h = cKB / species[iSpecies].mass * + temperature_scgc.slice(iAlt) = + 2 * temperature_scgc.slice(iAlt - 1) - temperature_scgc.slice(iAlt - 2); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // Constant gradient (ignoring grid spacing...) + species[iSpecies].temperature_scgc.slice(iAlt) = + 2 * species[iSpecies].temperature_scgc.slice(iAlt - 1) - + species[iSpecies].temperature_scgc.slice(iAlt - 2); + + aveT = (species[iSpecies].temperature_scgc.slice(iAlt) + + electron_temperature_scgc.slice(iAlt)); + // Calculate scale height for the species: + h = cKB / species[iSpecies].mass * + species[iSpecies].temperature_scgc.slice(iAlt) / + abs(grid.gravity_vcgc[2].slice(iAlt)); + // Assume each species falls of with (modified) hydrostatic: + species[iSpecies].density_scgc.slice(iAlt) = species[iSpecies].temperature_scgc.slice(iAlt) / - abs(grid.gravity_vcgc[2].slice(iAlt)); - // Assume each species falls of with (modified) hydrostatic: - species[iSpecies].density_scgc.slice(iAlt) = - species[iSpecies].temperature_scgc.slice(iAlt) / - species[iSpecies].temperature_scgc.slice(iAlt - 1) % - species[iSpecies].density_scgc.slice(iAlt - 1) % - exp(-grid.dk_edge_m.slice(iAlt) / h); - species[iSpecies].velocity_vcgc[2].slice(iAlt).zeros(); + species[iSpecies].temperature_scgc.slice(iAlt - 1) % + species[iSpecies].density_scgc.slice(iAlt - 1) % + exp(-grid.dk_edge_m.slice(iAlt) / h); + species[iSpecies].velocity_vcgc[2].slice(iAlt).zeros(); + } } + } report.exit(function); @@ -114,26 +117,91 @@ bool Ions::set_lower_bcs(Grid grid, Times time, Indices indices) { int64_t nAlts = grid.get_nZ(); int64_t nX = grid.get_nX(), iX; - int64_t nY = grid.get_nY(), iY; + int64_t nY = grid.get_nY(), iY, iYs, iYe; int64_t nGCs = grid.get_nGCs(); - int64_t iAlt; + int64_t iAlt, iFirst; arma_mat h; arma_mat aveT; - for (iAlt = nGCs - 1; iAlt >= 0; iAlt--) { - // Bulk Quantities: - temperature_scgc.slice(iAlt) = temperature_scgc.slice(iAlt + 1); - - // For each species: - for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { - // assign all species temperatures the bulk temperature: - species[iSpecies].temperature_scgc.slice(iAlt) = - temperature_scgc.slice(iAlt); - // Assume each species falls off a bit. - // this BC shouldn't matter, since the bottom of the code - // should be in chemical equalibrium: - species[iSpecies].density_scgc.slice(iAlt) = - 0.95 * species[iSpecies].density_scgc.slice(iAlt + 1); + // This is true for all grids: + for (iX = 0; iX < nX; iX++) { + for (int iY = 0; iY < nY; iY++) { + iFirst = grid.first_lower_gc(iX, iY); + + for (iAlt = iFirst; iAlt >= 0; iAlt--) { + // Bulk Quantities: + temperature_scgc.slice(iAlt) = temperature_scgc.slice(iFirst + 1); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // assign all species temperatures the bulk temperature: + species[iSpecies].temperature_scgc.slice(iAlt) = + temperature_scgc.slice(iAlt); + // Assume each species falls off a bit. + // this BC shouldn't matter, since the bottom of the code + // should be in chemical equalibrium: + species[iSpecies].density_scgc.slice(iAlt) = + 0.95 * species[iSpecies].density_scgc.slice(iFirst + 1); + } + } + } + } + + // This section is for the dipole grid. If the field-lines are + // closed, then we will treat the N/S ghostcells as LOWER boundaries. + // If thr grid is in the south, then treat the north bounday as the + // lower boundary. If the grid is in the north, treat the south boundary + // as the lower boundary. + // Because we are expecting to be chemically dominant, the lower BCs don't + // matter as much for the ions. We really just want to fill them with some + // reasonable values. + + if (grid.setNorthAsDown) { + // First physical cell: + iFirst = nY - nGCs - 2; + iYs = nY - nGCs - 1; + iYe = nY; + } + + if (grid.setSouthAsDown) { + // First physical cell: + iFirst = nGCs; + iYs = 0; + iYe = nGCs; + } + + if (grid.setNorthAsDown || grid.setSouthAsDown) { + + for (iX = 0; iX < nX; iX++) { + for (int iY = iYs; iY < iYe; iY++) { + // Bulk Quantities: + temperature_scgc.tube(iX, iY) = temperature_scgc.tube(iX, iFirst); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // assign all species temperatures the bulk temperature: + species[iSpecies].temperature_scgc.tube(iX, iY) = + temperature_scgc.tube(iX, iFirst); + // Assume each species falls off a bit. + // this BC shouldn't matter, since the bottom of the code + // should be in chemical equalibrium: + species[iSpecies].density_scgc.tube(iX, iY) = + 0.95 * species[iSpecies].density_scgc.tube(iX, iFirst); + } + + for (iAlt = 0; iAlt <= grid.first_lower_gc(iX, iY); iAlt++) { + //std::cout << "ion bcs, dipole, setnorth iAlt : " + // << iAlt << " " + // << grid.first_lower_gc(iX, iFirst) << " " + // << temperature_scgc(iX, iFirst, grid.first_lower_gc(iX, iFirst) + 1) << " " + // << temperature_scgc(iX, iFirst, iAlt) << " " + // << grid.geoAlt_scgc(iX, iFirst, grid.first_lower_gc(iX, + // iFirst) + 1) / 1000.0 << "\n"; + temperature_scgc(iX, iY, iAlt) = + temperature_scgc(iX, iFirst, grid.first_lower_gc(iX, iFirst) + 1); + } + + } } } From 913f2a27870a2da77a6cc91337ceb2938c02a9ee Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 15:00:42 -0400 Subject: [PATCH 638/691] FEAT: setting horizontal BCs for closed field lines --- src/neutrals_bcs.cpp | 52 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 77368a39..59990c51 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -247,6 +247,58 @@ bool Neutrals::set_lower_bcs(Grid grid, } } + // This section is for the dipole grid. If the field-lines are + // closed, then we will treat the N/S ghostcells as LOWER boundaries. + // If thr grid is in the south, then treat the north bounday as the + // lower boundary. If the grid is in the north, treat the south boundary + // as the lower boundary. + // Because we are expecting to be chemically dominant, the lower BCs don't + // matter as much for the ions. We really just want to fill them with some + // reasonable values. + + int64_t nX = grid.get_nX(); + int64_t nY = grid.get_nY(); + int64_t iX, iY, iYs, iYe, iFirst; + + if (grid.setNorthAsDown) { + // First physical cell: + iFirst = nY - nGCs - 1; + iYs = nY - nGCs; + iYe = nY; + } + + if (grid.setSouthAsDown) { + // First physical cell: + iFirst = nGCs; + iYs = 0; + iYe = nGCs; + } + + if (grid.setNorthAsDown || grid.setSouthAsDown) { + + for (iX = 0; iX < nX; iX++) { + for (int iY = iYs; iY < iYe; iY++) { + // Bulk Quantities: + temperature_scgc.tube(iX, iY) = temperature_scgc.tube(iX, iFirst); + + // For each species: + for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + // Assume each species falls off a bit. + // this BC shouldn't matter, since we are not going to do + // horizontal advection on neutrals: + species[iSpecies].density_scgc.tube(iX, iY) = + 0.95 * species[iSpecies].density_scgc.tube(iX, iFirst); + } + + for (iAlt = 0; iAlt <= grid.first_lower_gc(iX, iY); iAlt++) { + temperature_scgc(iX, iY, iAlt) = + temperature_scgc(iX, iFirst, grid.first_lower_gc(iX, iFirst)); + } + + } + } + } + didWork = true; calc_bulk_velocity(); From 389789097007827fcbe5d35e4fdb44e1c2359372 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 4 Sep 2025 15:01:26 -0400 Subject: [PATCH 639/691] comment and spacing --- src/neutrals_ics.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 7cefe289..1f8b7c18 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -122,7 +122,7 @@ bool Neutrals::initial_conditions(Grid grid, // temperature profile in the planet.in file. // --------------------------------------------------------------------- - // Let's assume that the altitudes are not dependent on lat/lon: + // Let's assume that the altitudes are dependent on lat/lon: arma_vec alt1d(nAlts); arma_vec temp1d(nAlts); @@ -188,7 +188,7 @@ bool Neutrals::initial_conditions(Grid grid, report.print(2, "Filling with hydrostatic"); for (int iSpecies = 0; iSpecies < nSpecies; iSpecies++) - fill_with_hydrostatic(iSpecies, nGCs - 1, nAlts, grid); + fill_with_hydrostatic(iSpecies, nGCs - 1, nAlts, grid); } // type = planet } From be2a6b15b577885e21c9d7e220cca8146b0022ea Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:16:36 -0400 Subject: [PATCH 640/691] get to work with cubesphere --- tests/restart_ensembles/aether.json.whole | 33 ++++++++++++----------- tests/restart_ensembles/run_all.sh | 10 +++++-- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/tests/restart_ensembles/aether.json.whole b/tests/restart_ensembles/aether.json.whole index 5cb6453a..c0a74992 100644 --- a/tests/restart_ensembles/aether.json.whole +++ b/tests/restart_ensembles/aether.json.whole @@ -1,7 +1,7 @@ { "Ensembles" : { - "nMembers" : 5}, + "nMembers" : 3}, "Perturb": { "f107" : { "Mean" : 1.0, @@ -17,23 +17,26 @@ "iVerbose" : 0}, "StartTime" : [2011, 3, 20, 0, 0, 0], - "EndTime" : [2011, 3, 20, 0, 10, 0], + "EndTime" : [2011, 3, 20, 0, 6, 0], "neuGrid" : { - "nLons" : 12, - "nLats" : 12, - "nAlts" : 30}, - + "Shape": "cubesphere", + "nLonsPerBlock" : 20, + "nLatsPerBlock" : 20, + "nAlts" : 30, + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + "ionGrid": { - "dAltStretch": 0.2, - "LatStretch": 1, - "Shape": "dipole", - "nLonsPerBlock": 18, - "nLatsPerBlock" : 18, - "nAlts":36, - "LatMax":88, - "MinAlt": 80.0, - "MinApex": 125.0}, + "Shape": "cubesphere", + "nLonsPerBlock": 16, + "nLatsPerBlock": 16, + "nAlts": 30, + "LatRange": [-90, 90], + "AltRange": [100.0, 1000], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, "InitialConditions" : { "type" : "msis"}, diff --git a/tests/restart_ensembles/run_all.sh b/tests/restart_ensembles/run_all.sh index 6d2c6d49..636549b8 100755 --- a/tests/restart_ensembles/run_all.sh +++ b/tests/restart_ensembles/run_all.sh @@ -1,11 +1,17 @@ #!/bin/sh -NPROC=5 +# cubesphere has 6 blocks: +NBLOCKS=6 +# run with 3 members: +NMEMBERS=2 +# run for a total of 180s TOTALTIME=180 +# this is the mpi command MPI=/usr/bin/mpirun +# stop this many times NTIMES=2 # include -dowhole to run the whole simulation as comparison: -../../srcPython/run_restarts.py -totaltime=${TOTALTIME} -mpi=${MPI} -rundir=../../share/run -ensembles=${NPROC} -restarts=${NTIMES} +../../srcPython/run_restarts.py -totaltime=${TOTALTIME} -mpi=${MPI} -rundir=../../share/run -ensembles=${NMEMBERS} -restarts=${NTIMES} -blocks=${NBLOCKS} From 4d467bcb5870438e33b3b60cabb6e8ac90d167cd Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:17:51 -0400 Subject: [PATCH 641/691] BUG: need to write restart files for grid --- src/init_geo_grid.cpp | 2 ++ src/init_mag_grid.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index ed333537..29e0fafd 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -275,6 +275,8 @@ bool Grid::init_geo_grid(Quadtree quadtree, // Calculate magnetic field and magnetic coordinates: fill_grid_bfield(planet); + write_restart(input.get_restartout_dir()); + // Throw a little message for students: report.student_checker_function_name(input.get_is_student(), input.get_student_name(), diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 8fc17d2d..19185638 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -625,6 +625,8 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { fill_grid_bfield(planet); report.print(4, "Done filling dipole grid with b-field!"); + write_restart(input.get_restartout_dir()); + report.exit(function); return DidWork; } From bf98af986757cea384f5a8d4234d4cc216368b14 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:18:35 -0400 Subject: [PATCH 642/691] BUG: dont have every processor write --- src/time.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/time.cpp b/src/time.cpp index 6accc347..4463d04e 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -58,8 +58,11 @@ bool Times::restart_file(std::string dir, bool DoRead) { iStep--; dt = 0; increment_time(); - std::cout << "Restarted time, Current time : "; - display_itime(iCurrent); + + if (report.test_verbose(0)) { + std::cout << "Restarted time, Current time : "; + display_itime(iCurrent); + } } else { restart_time_json = { {"currenttime", current}, {"istep", iStep} From 63ef60d92ef3677804d7af221ddc91cccaf89609 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:19:21 -0400 Subject: [PATCH 643/691] allow control of perturbing restarts --- src/indices.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/indices.cpp b/src/indices.cpp index 4dedf81d..2ed8eb12 100644 --- a/src/indices.cpp +++ b/src/indices.cpp @@ -143,7 +143,7 @@ bool read_and_store_indices(Indices &indices) { bool Indices::perturb() { bool DidWork = true; bool DoReport = false; - int64_t iDebug = 2; + int64_t iDebug = 0; json perturb_values = input.get_perturb_values(); @@ -152,7 +152,7 @@ bool Indices::perturb() { for (auto it = perturb_values.begin(); it != perturb_values.end(); ++it) { std::string name = it.key(); - if (name != "Chemistry") { + if (name != "Chemistry" && name != "restart_control") { if (report.test_verbose(iDebug)) { std::cout << "Perturbing Index : " << name << "\n"; From c9a3dde78d15e5f212e96f314ee5e5a3515e2d7a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:19:44 -0400 Subject: [PATCH 644/691] allow control of perturbing restarts --- src/read_input_file.cpp | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/read_input_file.cpp b/src/read_input_file.cpp index 389e0878..66a5e883 100644 --- a/src/read_input_file.cpp +++ b/src/read_input_file.cpp @@ -24,6 +24,9 @@ bool Inputs::read_inputs_json(Times &time) { json defaults; json user_inputs; + // allow changing of perturbations during the restart process: + json perturbations; + isOk = true; // Set the default values first: @@ -54,6 +57,9 @@ bool Inputs::read_inputs_json(Times &time) { // if they really want: restart_inputs["Logfile"]["append"] = true; settings.merge_patch(restart_inputs); + + if (restart_inputs.contains("Perturb")) + perturbations["Perturb"] = restart_inputs["Perturb"]; } } } @@ -62,6 +68,21 @@ bool Inputs::read_inputs_json(Times &time) { // settings, with the default/restart settings being the default: settings.merge_patch(user_inputs); + // There are perturbations in the restart files: + if (perturbations.contains("Perturb")) + + // If the user wants the restart perturbations to overwrite the + // aether.json perturbations, then do it: + if (user_inputs.contains("Perturb")) { + if (user_inputs["Perturb"].contains("restart_control")) + if (user_inputs["Perturb"]["restart_control"]) + settings.merge_patch(perturbations); + } else + // if there are perturbations in the restart files, but none + // in the user files, then push the restart perturbations into + // the settings to make them consistent + settings.merge_patch(perturbations); + //change planet file to the one specified on aether.json: if (isOk) settings["PlanetSpeciesFile"] = get_setting_str("Planet", "file"); From 2371fb26f998f3cc2febc5d10127f3daea22b767 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 16 Sep 2025 20:53:57 -0400 Subject: [PATCH 645/691] FEAT: update to latest code --- tests/restarts/aether.first.json | 30 ++++++++++++++++++++---------- tests/restarts/aether.whole.json | 30 ++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 20 deletions(-) diff --git a/tests/restarts/aether.first.json b/tests/restarts/aether.first.json index 9fec0780..d8ae5f16 100644 --- a/tests/restarts/aether.first.json +++ b/tests/restarts/aether.first.json @@ -6,21 +6,23 @@ "dt" : 10.0}, "neuGrid" : { + "Shape" : "sphere", "nLons" : 12, "nLats" : 12, - "nAlts" : 30}, - + "nAlts" : 30, + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + "ionGrid": { - "dAltStretch": 0.2, - "LatStretch": 1, - "Shape": "dipole", + "Shape": "sphere", "nLonsPerBlock": 18, "nLatsPerBlock" : 18, "nAlts":36, - "LatMax":88, - "MinAlt": 80.0, - "MinApex": 125.0 - }, + "LatRange": [-90, 90], + "AltRange": [100.0, 1000], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 5, 0], @@ -30,6 +32,12 @@ "DiffuseAurora" : "fta", "File": "UA/inputs/b20110320n_omni.bin"}, + "InitialConditions" : { + "type" : "msis"}, + + "BoundaryConditions" : { + "type" : "msis"}, + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], "Outputs" : { @@ -38,6 +46,8 @@ "Restart" : { "do" : false, - "dt" : 900.0} + "dt" : 900.0}, + + "PlanetFile" : "UA/inputs/earth.in" } diff --git a/tests/restarts/aether.whole.json b/tests/restarts/aether.whole.json index 53b964d9..f421033d 100644 --- a/tests/restarts/aether.whole.json +++ b/tests/restarts/aether.whole.json @@ -6,21 +6,23 @@ "dt" : 10.0}, "neuGrid" : { + "Shape" : "sphere", "nLons" : 12, "nLats" : 12, - "nAlts" : 30}, - + "nAlts" : 30, + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + "ionGrid": { - "dAltStretch": 0.2, - "LatStretch": 1, - "Shape": "dipole", + "Shape": "sphere", "nLonsPerBlock": 18, "nLatsPerBlock" : 18, "nAlts":36, - "LatMax":88, - "MinAlt": 80.0, - "MinApex": 125.0 - }, + "LatRange": [-90, 90], + "AltRange": [100.0, 1000], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 10, 0], @@ -30,6 +32,12 @@ "DiffuseAurora" : "fta", "File": "UA/inputs/b20110320n_omni.bin"}, + "InitialConditions" : { + "type" : "msis"}, + + "BoundaryConditions" : { + "type" : "msis"}, + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], "Outputs" : { @@ -38,6 +46,8 @@ "Restart" : { "do" : false, - "dt" : 900.0} + "dt" : 900.0}, + + "PlanetFile" : "UA/inputs/earth.in" } From e3f6a07f59d9adacd36288daeb0b75b9d8df09f0 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 17 Sep 2025 11:42:18 -0400 Subject: [PATCH 646/691] STY: fewer couts --- src/main/main.cpp | 2 +- src/output_netcdf.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 54e8316f..377e91a5 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -111,7 +111,7 @@ int main() { if (!didWork) throw std::string("init_dipole_grid failed!"); } else { - std::cout << "Making Spherical Magnetic Grid\n"; + report.print(0, "Making Spherical Magnetic Grid\n"); mGrid.set_IsDipole(false); didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); diff --git a/src/output_netcdf.cpp b/src/output_netcdf.cpp index 4a30ef9e..0e2501bf 100644 --- a/src/output_netcdf.cpp +++ b/src/output_netcdf.cpp @@ -72,8 +72,10 @@ bool OutputContainer::read_container_netcdf() { std::string UNITS = "units"; try { - std::cout << "Reading NetCDF file into container : " - << whole_filename << "\n"; + if (report.test_verbose(0)) + std::cout << "Reading NetCDF file into container : " + << whole_filename << "\n"; + NcFile ncdf_file_in(whole_filename, NcFile::read); std::multimap variables_in_file; From 02feed7a78e1a052169949e5e8208ab9da05c88b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:01:08 -0400 Subject: [PATCH 647/691] FEAT: write y,m,d,h,m,s,ms to restart file --- src/time.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/time.cpp b/src/time.cpp index 4463d04e..e15d4a0d 100644 --- a/src/time.cpp +++ b/src/time.cpp @@ -64,8 +64,16 @@ bool Times::restart_file(std::string dir, bool DoRead) { display_itime(iCurrent); } } else { - restart_time_json = { {"currenttime", current}, - {"istep", iStep} + restart_time_json = { + {"currenttime", current}, + {"istep", iStep}, + {"year", year}, + {"month", month}, + {"day", day}, + {"hour", hour}, + {"minute", minute}, + {"second", second}, + {"millisecond", milli}, }; DidWork = write_json(filename, restart_time_json); } From a02941824fee2082d0483961595c2f78276aae53 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:01:57 -0400 Subject: [PATCH 648/691] FEAT: write current indices for restarting --- src/main/main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/main.cpp b/src/main/main.cpp index 377e91a5..49454b02 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -197,6 +197,14 @@ int main() { if (!didWork) throw std::string("Reading Restart for time Failed!!!\n"); + + didWork = indices.restart_file(input.get_restartin_dir(), + true, + time.get_current()); + + if (!didWork) + throw std::string("Reading Restart for Indices Failed!!!\n"); + } // This is for the initial output. If it is not a restart, this will go: From a5cf9e1369b9ec8ff5798e9daca45ccc0766a321 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:02:36 -0400 Subject: [PATCH 649/691] FEAT: read indices for restart --- src/advance.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/advance.cpp b/src/advance.cpp index f56e6aea..5d39bb6e 100644 --- a/src/advance.cpp +++ b/src/advance.cpp @@ -46,6 +46,8 @@ bool advance(Planets &planet, didWork = neutralsMag.check_for_nonfinites("Top of Advance - ion grid"); } + json dummy = indices.get_all_indices(time.get_current()); + gGrid.calc_sza(planet, time); mGrid.calc_sza(planet, time); @@ -258,13 +260,16 @@ bool advance(Planets &planet, if (time.check_time_gate(input.get_dt_write_restarts())) { report.print(3, "Writing restart files"); - neutrals.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), + neutrals.restart_file(input.get_restartout_dir(), + gGrid.get_gridtype(), DoWrite); - neutralsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), + neutralsMag.restart_file(input.get_restartout_dir(), + mGrid.get_gridtype(), DoWrite); ions.restart_file(input.get_restartout_dir(), gGrid.get_gridtype(), DoWrite); ionsMag.restart_file(input.get_restartout_dir(), mGrid.get_gridtype(), DoWrite); time.restart_file(input.get_restartout_dir(), DoWrite); + indices.restart_file(input.get_restartout_dir(), DoWrite, time.get_current()); } } From ae6f79b5ba89b93c55c8cb21121221d5275c05f7 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:03:56 -0400 Subject: [PATCH 650/691] FEAT: if restart process changes indices, reperturb --- src/indices.cpp | 176 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 171 insertions(+), 5 deletions(-) diff --git a/src/indices.cpp b/src/indices.cpp index 2ed8eb12..b26e2b5a 100644 --- a/src/indices.cpp +++ b/src/indices.cpp @@ -20,6 +20,9 @@ Indices::Indices() { index_time_pair single_index; single_index.nValues = 0; single_index.name = ""; + single_index.didPerturb = false; + single_index.isAddPerturb = false; + single_index.isConstantPerturb = false; std::string lookup_file = input.get_indices_lookup_file(); indices_lookup = read_json(lookup_file); @@ -181,6 +184,76 @@ bool Indices::perturb() { // Perturb a specific index in the way the user requested // ---------------------------------------------------------------------- +void Indices::reperturb_index(int iIndex, + precision_t unperturbedValue, + precision_t perturbedValue, + precision_t newValue) { + + int64_t nValues = all_indices_arrays[iIndex].nValues; + + if (all_indices_arrays[iIndex].didPerturb && + all_indices_arrays[iIndex].isConstantPerturb) { + precision_t perturb; + + if (all_indices_arrays[iIndex].isAddPerturb) { + // constant, non-normalized value: + perturb = newValue - unperturbedValue; + + if (iGrid == 0) + std::cout << " -> New Added Perturb : " << perturb << "\n"; + + for (int64_t iValue = 0; iValue < nValues; iValue++) { + all_indices_arrays[iIndex].values[iValue] = + all_indices_arrays[iIndex].originals[iValue] + perturb; + } + + } else { + // constant, normalized value: + perturb = newValue / unperturbedValue; + + if (iGrid == 0) + std::cout << " -> New (normalized) Multiplied Perturb : " + << perturb << "\n"; + + for (int64_t iValue = 0; iValue < nValues; iValue++) { + + all_indices_arrays[iIndex].values[iValue] = + all_indices_arrays[iIndex].originals[iValue] * perturb; + } + } + + } else { + std::string mess = "Reperturb index: don't know how to "; + mess = mess + "handle non-perturb or nonconstant perturb"; + report.error(mess); + } + +} + +// ---------------------------------------------------------------------- +// Perturb a specific index in the way the user requested +/* +The way this code works is that you can perturb things in different ways. +Multiply by a constant value: + - if the mean is 1.0, then the perturbed value will be unbiased + - if the mean is above or below 1.0, it will be biased. + - the standard deviation is normalized to 1, so it is a percentage + of the value. + - This will come up with a value that you multiply all of the values by, + like 0.843 or 1.203. +Multiply by a non-constant value: + - same as above, but each value will have a different random number + instead of a single (constant) value +Add a constant value: + - the mean and standard deviation are NOT normalized. + - a single value then derived given the mean and the standard dev. + - an unbiased value would have a mean = 0 +Add a non-constant value: + - same as above, but each value will have a different random number + instead of a single (constant) value +*/ +// ---------------------------------------------------------------------- + void Indices::perturb_index(int iIndex, int seed, json style, bool DoReport) { @@ -191,6 +264,8 @@ void Indices::perturb_index(int iIndex, int seed, bool add = true; bool constant = false; + all_indices_arrays[iIndex].didPerturb = true; + if (style.contains("Mean")) mean = style["Mean"]; @@ -200,15 +275,21 @@ void Indices::perturb_index(int iIndex, int seed, std = standard_deviation(all_indices_arrays[iIndex].values); // Add or Multiply the random values - if (style.contains("Add")) + if (style.contains("Add")) { add = style["Add"]; + if (add) + all_indices_arrays[iIndex].isAddPerturb = true; + } + // Only one value for all elements or individual values for elements if (style.contains("Constant")) constant = style["Constant"]; - if (constant) + if (constant) { nV = 1; + all_indices_arrays[iIndex].isConstantPerturb = true; + } std::vector perturbations = get_normal_random_vect(mean, std, @@ -220,6 +301,9 @@ void Indices::perturb_index(int iIndex, int seed, if (!constant) iV = iValue; + all_indices_arrays[iIndex].originals.push_back( + all_indices_arrays[iIndex].values[iValue]); + if (add) { if (DoReport && iValue == 0) std::cout << " ==> Adding " << perturbations[iV] << "\n"; @@ -316,7 +400,8 @@ precision_t Indices:: get_f107a(double time) { // This is the general function for getting an index // ---------------------------------------------------------------------- -precision_t Indices::get_index(double time, int index) { +precision_t Indices::get_index(double time, int index, + bool useNonperturbed /* = false */) { int64_t iLow, iMid, iHigh; @@ -353,8 +438,14 @@ precision_t Indices::get_index(double time, int index) { all_indices_arrays[index].times[iMid]); precision_t x = (time - all_indices_arrays[index].times[iMid]) / dt; - precision_t value = (1.0 - x) * all_indices_arrays[index].values[iMid] + - x * all_indices_arrays[index].values[iMid + 1]; + precision_t value; + + if (useNonperturbed) + value = (1.0 - x) * all_indices_arrays[index].originals[iMid] + + x * all_indices_arrays[index].originals[iMid + 1]; + else + value = (1.0 - x) * all_indices_arrays[index].values[iMid] + + x * all_indices_arrays[index].values[iMid + 1]; return value; } @@ -417,6 +508,81 @@ bool Indices::set_index(int index, return DidWork; } +json Indices::get_all_indices(double time) { + json outputJson; + + int64_t iIndex; + precision_t value; + + for (iIndex = 0; iIndex < nIndices; iIndex++) { + if (all_indices_arrays[iIndex].nValues > 0) { + value = get_index(time, iIndex); + outputJson[all_indices_arrays[iIndex].name] = value; + } + } + + return outputJson; +} + +// ----------------------------------------------------------------------------- +// This is for restarting the code. Either write or read the time. +// ----------------------------------------------------------------------------- + +bool Indices::restart_file(std::string dir, bool DoRead, double time) { + + std::string filename; + bool DidWork = true; + filename = dir + "/indices_" + cMember + ".json"; + + json restart_indices_json, original_indices_json; + + if (DoRead) { + restart_indices_json = read_json(filename); + + if (report.test_verbose(1)) { + std::cout << "Restarted indices, Current time : "; + std::cout << std::setw(2) << restart_indices_json << "\n"; + } + + original_indices_json = get_all_indices(time); + precision_t orig, rest, unperturbed; + + for (auto it = original_indices_json.begin(); + it != original_indices_json.end(); ++it) { + std::string name = it.key(); + orig = original_indices_json[name]; + rest = restart_indices_json[name]; + + if (abs(orig - rest) > cSmall) { + int iIndex = lookup_index_id(name); + unperturbed = get_index(time, iIndex, true); + + if (iGrid == 0) + std::cout << " -> Index was altered during restart : " + << name << " -> index number: " + << iIndex << "; orig, rest, un " + << orig << " " + << rest << " " + << unperturbed << " " + << all_indices_arrays[iIndex].isAddPerturb << "\n"; + + reperturb_index(iIndex, unperturbed, orig, rest); + + } + } + + + } else { + restart_indices_json = get_all_indices(time); + + if (iGrid == 0) + DidWork = write_json(filename, restart_indices_json); + } + + return DidWork; +} + + // ---------------------------------------------------------------------- // Dump the contents of an index_file_output_struct // ---------------------------------------------------------------------- From 320946e300d0807277476c5bb6da67d27fb20e1d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:04:06 -0400 Subject: [PATCH 651/691] FEAT: if restart process changes indices, reperturb --- include/indices.h | 69 +++++++++++++++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/include/indices.h b/include/indices.h index 0c58b216..1e1b6ba0 100644 --- a/include/indices.h +++ b/include/indices.h @@ -20,7 +20,7 @@ * \author Aaron Ridley * - * \date 2021/04/16 + * \date 2021/04/16 **************************************************************/ #include @@ -34,10 +34,10 @@ struct index_file_output_struct { /// number of times read in: int64_t nTimes; - + /// array of times that correspond to the values: std::vector times; - + /// number of variables read in: int nVars; @@ -62,9 +62,9 @@ void print_index_file_output_struct(index_file_output_struct contents); class Indices { -// ----------------------------------------------------------------------- -// Public functions and variables -// ----------------------------------------------------------------------- + // ----------------------------------------------------------------------- + // Public functions and variables + // ----------------------------------------------------------------------- public: @@ -88,10 +88,10 @@ class Indices { /************************************************************** \brief a series of functions that return the internal index number - In order to keep track of which index is which, the class uses + In order to keep track of which index is which, the class uses constants. These functions return these constants. The user doesn't really need to know about the constants, but they have to get the - constant (when reading the file, for example) and then provide that + constant (when reading the file, for example) and then provide that to the set index function. Conversely, we could create a bunch of set_ functions (such as the set_f107 function below). We figured that this minor inconvience is easier than making a bunch of set_ @@ -112,13 +112,17 @@ class Indices { int get_au_index_id(); int get_al_index_id(); + json get_all_indices(double time); + bool restart_file(std::string dir, bool DoRead, double time); + + /************************************************************** \brief Return the indices index of the variable name \param name the name of the variable to find the index for **/ - + int lookup_index_id(std::string name); - + /************************************************************** \brief This function sets the f107, does an 81 day ave, sets f107a too \param f107_contents contents from the f107 file (time, f107, etc.) @@ -134,9 +138,9 @@ class Indices { \param missing value for missing data **/ bool set_index(int index_id, - std::vector time, - std::vector values, - precision_t missing); + std::vector time, + std::vector values, + precision_t missing); /************************************************************** \brief set the index array into the indices class @@ -146,10 +150,10 @@ class Indices { \param missing value for missing data **/ bool set_index(std::string index_name, - std::vector timearray, - std::vector indexarray, - precision_t missing); - + std::vector timearray, + std::vector indexarray, + precision_t missing); + /************************************************************** \brief Perturbs the indices requested by user input **/ @@ -164,30 +168,44 @@ class Indices { **/ void perturb_index(int iIndex, int seed, json style, bool DoReport); + /************************************************************** + \brief Re-Perturbs the specific indices based on old values and the new value + \param iIndex which index to perturb + \param unperturbedValue unperturbed value (value read in at start)) + \param perturbedValue value that the code has now + \param newValue value that the restart index file contains + **/ + + void reperturb_index(int iIndex, + precision_t unperturbedValue, + precision_t perturbedValue, + precision_t newValue); + + /************************************************************** \brief The general function that returns the index value at the time \param time the time in seconds that the index is requested at \param the index to return (i.e., one of the constants defined above) **/ - precision_t get_index(double time, int index); + precision_t get_index(double time, int index, bool useNonperturbed = false); /************************************************************** * \brief Get the name of the indices at the specified index * \param iIndex which index to get name * \return The string of name if the function succeeds, empty string if iIndex is out of range **/ - std::string get_name(int iIndex); + std::string get_name(int iIndex); /************************************************************** \brief Return the number of the indices vector **/ int all_indices_array_size(); -// ----------------------------------------------------------------------- -// Private functions and variables -// ----------------------------------------------------------------------- + // ----------------------------------------------------------------------- + // Private functions and variables + // ----------------------------------------------------------------------- -private: + private: /// structure containing information about the specific index: struct index_time_pair { @@ -197,12 +215,17 @@ class Indices { /// a vector of values for the index: std::vector values; + std::vector originals; /// a vector of times for the values: std::vector times; /// the name of the index as a string: std::string name; + + bool didPerturb; + bool isAddPerturb; + bool isConstantPerturb; }; /// the vector that contains all of the indices vectors: From 7cc4d92d3c84cf963b28c8393f2596c246096d2d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 18 Sep 2025 13:04:34 -0400 Subject: [PATCH 652/691] FEAT: add perturbations to test --- tests/restart_ensembles/aether.json.whole | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/restart_ensembles/aether.json.whole b/tests/restart_ensembles/aether.json.whole index c0a74992..797526d5 100644 --- a/tests/restart_ensembles/aether.json.whole +++ b/tests/restart_ensembles/aether.json.whole @@ -19,6 +19,12 @@ "StartTime" : [2011, 3, 20, 0, 0, 0], "EndTime" : [2011, 3, 20, 0, 6, 0], + "Perturb": { + "f107" : { "Mean" : 1.0, + "Std" : 0.10, + "Add" : false, + "Constant" : true}}, + "neuGrid" : { "Shape": "cubesphere", "nLonsPerBlock" : 20, From f24c149ad30b178a502327963f1737dda6c7b01d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 23 Sep 2025 21:01:40 -0400 Subject: [PATCH 653/691] BUG: need the altitude of the lower BC from planet --- include/grid.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/grid.h b/include/grid.h index c4187111..d0715bf2 100644 --- a/include/grid.h +++ b/include/grid.h @@ -147,6 +147,7 @@ class Grid { // Matrices whose elements denote the altitude index of the interiormost ghost cell // in the k-up and k-down direction (altitude for geo grids, q for dipole). arma_mat first_lower_gc, first_upper_gc; + precision_t altitude_lower_bc; // Whether to close field lines on dipole grid (Always false for geo grids) bool IsClosed; From e4965bb93a7b0336025b19a0538af2c686e113ea Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 23 Sep 2025 21:01:57 -0400 Subject: [PATCH 654/691] BUG: need the altitude of the lower BC from planet --- include/planets.h | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/include/planets.h b/include/planets.h index a512daac..25ab1aa8 100644 --- a/include/planets.h +++ b/include/planets.h @@ -15,11 +15,11 @@ class Planets { -// ----------------------------------------------------------------------- -// Public functions and variables -// ----------------------------------------------------------------------- + // ----------------------------------------------------------------------- + // Public functions and variables + // ----------------------------------------------------------------------- -public: + public: // -------------------------------------------------------------------- // Functions: @@ -110,7 +110,7 @@ class Planets { precision_t get_dipole_strength(); /********************************************************************** - \brief Returns omega (rotation rate) of the planet + \brief Returns omega (rotation rate) of the planet **/ precision_t get_omega(); @@ -118,27 +118,32 @@ class Planets { \brief returns neutrals json for neutral density BCs **/ json get_neutrals(); - + /********************************************************************** \brief returns neutral temperature json for temperature ICs **/ json get_temperatures(); - + /********************************************************************** \brief returns ions json for ion density characteristics **/ json get_ions(); - + + /********************************************************************** + \brief returns altitude of the density boundary condition: + **/ + precision_t get_altitude_of_bc(); + /********************************************************************** \brief Check to see if internal state of class is ok **/ - + bool is_ok(); -// ----------------------------------------------------------------------- -// Private functions and variables -// ----------------------------------------------------------------------- - + // ----------------------------------------------------------------------- + // Private functions and variables + // ----------------------------------------------------------------------- + private: /// A structure to describe the planetary characteristics for each planet @@ -250,10 +255,14 @@ class Planets { /// Information about the initial temperature of the planet json temperatures; - + /// Information about the ions of the planet json ions; + /// This is needed to specify at what altitude the densities + /// are specified: + precision_t altitude_of_bc; + /// An internal variable to hold the state of the class bool IsOk; From 1cd92cb5f2ad1432088ff9273c58c7e2a8b4f83d Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 23 Sep 2025 21:02:32 -0400 Subject: [PATCH 655/691] BUG: need the altitude of the lower BC from planet --- src/planets.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/planets.cpp b/src/planets.cpp index 0528cfd7..200786b7 100644 --- a/src/planets.cpp +++ b/src/planets.cpp @@ -502,6 +502,14 @@ json Planets::get_ions() { return ions; } +// -------------------------------------------------------------------------- +// returns altitude of the density boundary condition +// -------------------------------------------------------------------------- + +precision_t Planets::get_altitude_of_bc() { + return altitude_of_bc; +} + // ----------------------------------------------------------------------------- // Read in the planet specific file that describes the species // ----------------------------------------------------------------------------- @@ -544,6 +552,17 @@ bool Planets::read_planet_specific_file() { std::cout << neutrals << "\n"; } // #neutrals + if (hash == "#altitude_of_bc") { + report.print(iDebug, "Found #altitude_of_bc!"); + altitude_of_bc = read_float(infile_ptr, "#altitude_of_bc"); + // Units read in = km + // Units needed in code = m: + altitude_of_bc = altitude_of_bc * 1000.0; + + if (report.test_verbose(iDebug)) + std::cout << altitude_of_bc << "\n"; + } // #altitude_of_bc + if (hash == "#temperature") { report.print(iDebug, "Found #temperatures!"); std::vector> lines = read_csv(infile_ptr); From ce96914fdb751016ad07af3605a0d9034be1b4c6 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Tue, 23 Sep 2025 21:03:07 -0400 Subject: [PATCH 656/691] FEAT: added sphere6 as a shape --- src/quadtree.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index aa61b98e..9918abaf 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -34,6 +34,11 @@ Quadtree::Quadtree(std::string shapeInput) { IsOk = true; } + if (shape == "sphere6") { + nRootNodes = 6; + IsOk = true; + } + if (shape == "dipole4") { nRootNodes = 4; IsOk = true; From f6bf8296f0ffc53deb305fb231933e94151bd64e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 06:59:49 -0400 Subject: [PATCH 657/691] BUG: need the altitude of the lower BC from planet --- include/neutrals.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/neutrals.h b/include/neutrals.h index 34f67e34..e51b3452 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -225,6 +225,7 @@ class Neutrals { std::vector initial_altitudes; std::vector initial_temperatures; int64_t nInitial_temps = 0; + precision_t altitude_of_bc; /// Number of species to advect: int nSpeciesAdvect; From 827d175c3640ded014ad8442ea0ed2a11c1235bf Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:01:13 -0400 Subject: [PATCH 658/691] FEAT: prep for physical cell only calcs --- src/solver_chemistry.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/solver_chemistry.cpp b/src/solver_chemistry.cpp index 3c9fd21d..ce40ca00 100644 --- a/src/solver_chemistry.cpp +++ b/src/solver_chemistry.cpp @@ -12,8 +12,20 @@ arma_cube solver_chemistry(arma_cube density, arma_cube source, arma_cube loss, precision_t dt) { - arma_cube normalized_loss = loss / (density + 1e-6); + arma_cube normalized_loss; + normalized_loss = loss / (density + 1e-6); arma_cube new_density = (density + dt * source) / (1.0 + dt * normalized_loss); return new_density; } + +arma_mat solver_chemistry(arma_mat density, + arma_mat source, + arma_mat loss, + precision_t dt) { + arma_mat normalized_loss; + normalized_loss = loss / (density + 1e-6); + arma_mat new_density = (density + dt * source) / + (1.0 + dt * normalized_loss); + return new_density; +} From 60c8086f7ffb6239be2d72719806c5f1e90682aa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:01:31 -0400 Subject: [PATCH 659/691] FEAT: prep for physical cell only calcs --- include/solvers.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/include/solvers.h b/include/solvers.h index d7d2412a..53385833 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -64,10 +64,6 @@ arma_vec limiter_value(arma_vec projected, arma_vec values, int64_t nPts, } -void advect(Grid &grid, - Times &time, - Neutrals &neutrals); - arma_vec solver_conduction( arma_vec value, arma_vec lambda, @@ -84,6 +80,11 @@ arma_cube solver_chemistry(arma_cube density, arma_cube loss, precision_t dt); +arma_mat solver_chemistry(arma_mat density, + arma_mat source, + arma_mat loss, + precision_t dt); + std::vector coriolis(std::vector velocity, precision_t rotation_rate, arma_cube lat_scgc); From 653650c8bc559890840f838cd44069364b55e8a9 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:02:44 -0400 Subject: [PATCH 660/691] BUG: need the altitude of the lower BC from planet --- share/run/UA/inputs/earth.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/share/run/UA/inputs/earth.in b/share/run/UA/inputs/earth.in index 6a968640..812097d7 100644 --- a/share/run/UA/inputs/earth.in +++ b/share/run/UA/inputs/earth.in @@ -25,6 +25,8 @@ BC is a density that is used in the lowest boundary cell if you In this example file, the values are from 96.87 km Jan 1, 2013 O_1D is made up. +#ALTITUDE_OF_BC +96.87 #NEUTRALS name, mass, vibration, thermal_cond, thermal_exp, advect, BC From 52b77838a795f876d63c5b8c7679f81c05844fc1 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:03:11 -0400 Subject: [PATCH 661/691] BUG: should be FLOAT --- src/file_input.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_input.cpp b/src/file_input.cpp index 29e3d67a..667f8e03 100644 --- a/src/file_input.cpp +++ b/src/file_input.cpp @@ -170,7 +170,7 @@ precision_t read_float(std::ifstream &file_ptr, std::string hash) { line = strip_string_end(line); try { - output = stoi(line); + output = stof(line); } catch (...) { std::cout << "Issue in read_float!\n"; std::cout << "In hash: "; From 4e08694f92a8164a6aae0170cf5697bba4c96a0b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:04:12 -0400 Subject: [PATCH 662/691] set geo grid before init_grid --- src/main/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 49454b02..ab93c1ec 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -113,8 +113,8 @@ int main() { } else { report.print(0, "Making Spherical Magnetic Grid\n"); mGrid.set_IsDipole(false); - didWork = mGrid.init_geo_grid(quadtree, planet); mGrid.set_IsGeoGrid(false); + didWork = mGrid.init_geo_grid(quadtree, planet); } if (!didWork) From f89490ee486a6615d5eb2be3a151c9f885f01194 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:05:03 -0400 Subject: [PATCH 663/691] BUG: scale the density to real altitude --- src/neutrals_bcs.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index 59990c51..ecb87da2 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -207,8 +207,23 @@ bool Neutrals::set_lower_bcs(Grid grid, temperature_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( temperature_scgc(iLon, iLat, iAlt)); + precision_t t = temperature_scgc(iLon, iLat, 0); + precision_t g = abs(grid.gravity_vcgc[2](iLon, iLat, iAlt)); + + precision_t alt1 = grid.geoAlt_scgc(iLon, iLat, iAlt); + precision_t alt0 = grid.altitude_lower_bc; + precision_t dz = alt1 - alt0; + for (iSpecies = 0; iSpecies < nSpecies; iSpecies++) { + precision_t m = mean_major_mass_scgc(iLon, iLat, iAlt); + + //if (m == 0) + m = species[iSpecies].mass; + + precision_t h = cKB * t / (m * g); + precision_t factor = exp(-dz / h); + //----------------------------------------------- // Planet BCs - set to fixed constant values. //----------------------------------------------- @@ -217,6 +232,7 @@ bool Neutrals::set_lower_bcs(Grid grid, // Fill all lower ghost cells density with lower boundary condition: species[iSpecies].density_scgc.subcube(iLon, iLat, 0, iLon, iLat, iAlt - 1).fill( + factor * species[iSpecies].lower_bc_density); } // planet bc type From 910c4e814286eca72010b206bcce7fa0c4551f85 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:06:18 -0400 Subject: [PATCH 664/691] BUG: get the correct grid settings --- src/init_geo_grid.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 29e0fafd..d14f1a0f 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -20,7 +20,9 @@ void Grid::create_altitudes(Planets planet) { arma_vec alt1d(nAlts); - Inputs::grid_input_struct grid_input = input.get_grid_inputs("neuGrid"); + Inputs::grid_input_struct grid_input; + + grid_input = input.get_grid_inputs(gridType); if (grid_input.IsUniformAlt) { for (iAlt = 0; iAlt < nAlts; iAlt++) @@ -217,6 +219,9 @@ bool Grid::init_geo_grid(Quadtree quadtree, //MPI_Barrier(aether_comm); create_altitudes(planet); + // set the altitude of the lower boundary values: + altitude_lower_bc = planet.get_altitude_of_bc(); + init_connection(); //DidWork = write_restart(input.get_restartout_dir()); From 6368921f7382abedd0845d0b596172bbdd285d53 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 07:06:42 -0400 Subject: [PATCH 665/691] BUG: need the altitude of the lower BC from planet --- src/init_mag_grid.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 19185638..0daf3043 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -215,6 +215,10 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { precision_t min_alt_re = (min_alt + planetRadius) / planetRadius; precision_t max_alt_re = (max_alt + planetRadius) / planetRadius; + // set the altitude of the lower boundary from the planet file + // -- this is used for setting densities hydrostatically. + altitude_lower_bc = planet.get_altitude_of_bc(); + if (nAlts % 2 != 0) { report.error("nAlts must be even!"); DidWork = false; From 39b2cc5494e28adaabf35bda49b3ca16e10a89aa Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 10:12:11 -0400 Subject: [PATCH 666/691] FEAT: define grid shapes and type in constants --- include/constants.h | 20 ++++++++++++++++---- include/grid.h | 3 +++ src/calc_dt.cpp | 9 +-------- src/calc_electron_temperature.cpp | 2 +- src/calc_neutral_derived.cpp | 2 +- src/init_parallel.cpp | 5 ++--- src/neutrals_advect.cpp | 2 +- src/output.cpp | 2 +- src/solver_gradients.cpp | 4 ++-- 9 files changed, 28 insertions(+), 21 deletions(-) diff --git a/include/constants.h b/include/constants.h index 474eb8f4..16183e9d 100644 --- a/include/constants.h +++ b/include/constants.h @@ -6,6 +6,18 @@ #include +// ------------------------------------------------------------------------- +// Define some constants for the code so that all functions understand +// stuff +// These are not physical constants, but are useful references +// ------------------------------------------------------------------------- + +const int iSphere_ = 1; +const int iCubesphere_ = 2; +const int iDipole_ = 3; +const std::string neutralType_ = "neuGrid"; +const std::string ionType_ = "ionGrid"; + // ------------------------------------------------------------------------- // Physical Constants // - Naming standards: @@ -65,7 +77,7 @@ const double cJULIAN2000 = 2451545.0; // ------------------------------------------------------------------------- const precision_t cPI = 3.141592653589793; -const precision_t cTWOPI = 2*cPI; +const precision_t cTWOPI = 2 * cPI; // ------------------------------------------------------------------------- // Conversion Constants: @@ -75,8 +87,8 @@ const precision_t cTWOPI = 2*cPI; // - Names are all UPPER CASE otherwise // ------------------------------------------------------------------------- -const precision_t cDtoR = cPI/180.0; -const precision_t cRtoD = 180.0/cPI; +const precision_t cDtoR = cPI / 180.0; +const precision_t cRtoD = 180.0 / cPI; // ------------------------------------------------------------------------- // converting time between seconds and other units of time: @@ -99,7 +111,7 @@ const double cMtoS = 60.0; const double cStoM = 1.0 / cMtoS; // MilliSeconds <-> Seconds: -const double cMStoS = 1.0/1000.0; +const double cMStoS = 1.0 / 1000.0; const double cStoMS = 1000.0; // ------------------------------------------------------------------------- diff --git a/include/grid.h b/include/grid.h index d0715bf2..c3826dfd 100644 --- a/include/grid.h +++ b/include/grid.h @@ -53,6 +53,9 @@ class Grid { const int iDipole_ = 3; int iGridShape_ = -1; + const std::string neutralType_ = "neuGrid"; + const std::string ionType_ = "ionGrid"; + // Armidillo Cube Versions: // Cell Center Coordinates arma_cube geoLon_scgc, geoX_scgc; diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index 96658471..1ab838bd 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -16,7 +16,7 @@ precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { precision_t dt; - if (grid.iGridShape_ == grid.iCubesphere_) + if (grid.iGridShape_ == iCubesphere_) dt = calc_dt_cubesphere(grid, cMax_vcgc); else dt = calc_dt_sphere(grid, cMax_vcgc); @@ -110,13 +110,6 @@ precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { //dty.slice(iAlt) = grid.drefy(iAlt) * dummy_1 / u2; } - //if (iProc == 0) - // display_cube("dtx : ", dtx); - - //if (iProc == 0) - // display_cube("dty : ", dty); - - // Take minimum dts in each direction: dta(0) = dtx.min(); dta(1) = dty.min(); diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index a5a00552..5b459982 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -616,7 +616,7 @@ arma_mat Ions::calc_thermoelectric_current(Grid &grid) { // with the dipole, the field-aligned current is in the k^ direction // But we do not solve for e- velocity (and exb is 0 parallel to B), so we cannot do this: - // if (grid.iGridShape_ == grid.iDipole_){ + // if (grid.iGridShape_ == iDipole_){ // for (int64_t iAlt = 0; iAlt < ions.density_scgc.n_slices; iAlt++){ // JParallel += (ions.density_scgc.slice(iAlt) * cE % (ions.velocity_vcgc[2].slice(iAlt) - ions.exb_vcgc[2].slice(iAlt))) // * grid.dalt_center_scgc[iAlt]; diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index d6802d93..d4959b8b 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -407,7 +407,7 @@ precision_t Neutrals::calc_dt(Grid grid) { precision_t dt; - if (grid.iGridShape_ == grid.iCubesphere_) + if (grid.iGridShape_ == iCubesphere_) dt = calc_dt_cubesphere(grid); else { int iDir; diff --git a/src/init_parallel.cpp b/src/init_parallel.cpp index e89751d2..4da0c6a1 100644 --- a/src/init_parallel.cpp +++ b/src/init_parallel.cpp @@ -105,9 +105,8 @@ bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion) { if (report.test_verbose(2)) std::cout << "seed : " << seed << "\n"; - quadtree.build("neuGrid"); - // #TODO - quadtree_ion.build("ionGrid"); + quadtree.build(neutralType_); + quadtree_ion.build(ionType_); } else { if (iProc == 0) { diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index dcdd67cd..613d4130 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -42,7 +42,7 @@ bool Neutrals::advect_horizontal(Grid & grid, Times & time) { static int iFunction = -1; report.enter(function, iFunction); - if (grid.iGridShape_ == grid.iCubesphere_) { + if (grid.iGridShape_ == iCubesphere_) { if (input.get_advection_neutrals_horizontal() == "advect_test") solver_horizontal_RK4_advection(grid, time); else if (input.get_advection_neutrals_horizontal() == "fv") diff --git a/src/output.cpp b/src/output.cpp index f4adf0d9..08ba1dd4 100644 --- a/src/output.cpp +++ b/src/output.cpp @@ -362,7 +362,7 @@ bool output(const Neutrals &neutrals, report.error("File output type not found!"); didWork = false; } else { - if (grid.get_IsGeoGrid()) + if (grid.get_gridtype() == neutralType_) filename = filename + "G_"; else filename = filename + "M_"; diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 73754c10..6a0d0ac2 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -18,9 +18,9 @@ std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { display_vector("gradient, value : ", value_scgc.tube(9, 9)); } - if (grid.iGridShape_ == grid.iCubesphere_) + if (grid.iGridShape_ == iCubesphere_) gradient_vcgc = calc_gradient_cubesphere(value_scgc, grid); - else if (grid.iGridShape_ == grid.iDipole_) + else if (grid.iGridShape_ == iDipole_) gradient_vcgc = calc_gradient_dipole(value_scgc, grid); else { From a6f24887c61f887da6cc025f284d67ae8e5dd510 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 10:12:44 -0400 Subject: [PATCH 667/691] FEAT: define grid shapes and type in constants --- src/main/main.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index ab93c1ec..7ed004b3 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -84,8 +84,8 @@ int main() { // Perturb the inputs if user has asked for this indices.perturb(); - // Initialize Geographic grid: - Grid gGrid("neuGrid"); + // Initialize neutral grid: + Grid gGrid(neutralType_); didWork = gGrid.init_geo_grid(quadtree, planet); MPI_Barrier(aether_comm); @@ -102,8 +102,8 @@ int main() { if (input.get_cent_acc()) gGrid.calc_cent_acc(planet); - // Initialize Magnetic grid: - Grid mGrid("ionGrid"); + // Initialize ion grid: + Grid mGrid(ionType_); if (mGrid.iGridShape_ == mGrid.iDipole_) { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); @@ -111,10 +111,10 @@ int main() { if (!didWork) throw std::string("init_dipole_grid failed!"); } else { - report.print(0, "Making Spherical Magnetic Grid\n"); + report.print(1, "Making Spherical Magnetic Grid\n"); mGrid.set_IsDipole(false); - mGrid.set_IsGeoGrid(false); didWork = mGrid.init_geo_grid(quadtree, planet); + mGrid.set_IsGeoGrid(false); } if (!didWork) From ccced609a643ae30bd634d6808d569aea6523a44 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 10:13:13 -0400 Subject: [PATCH 668/691] STY: more precise output --- src/init_geo_grid.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index d14f1a0f..7f1b27bf 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -188,17 +188,17 @@ bool Grid::init_geo_grid(Quadtree quadtree, report.enter(function, iFunction); bool DidWork = true; - IsGeoGrid = 1; + IsGeoGrid = true; if (iGridShape_ == iCubesphere_) { - report.print(0, "Creating Cubesphere Grid"); + report.print(0, "Creating Cubesphere Grid for : " + gridType); if (!Is0D & !Is1Dz) create_cubesphere_connection(quadtree); IsCubeSphereGrid = true; } else { - report.print(0, "Creating Spherical Grid"); + report.print(0, "Creating Spherical Grid for : " + gridType); if (!Is0D & !Is1Dz) create_sphere_connection(quadtree); From 449ed7241cc5ce34af74ede130a446edef3228f5 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 10:13:18 -0400 Subject: [PATCH 669/691] STY: more precise output --- src/init_mag_grid.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/init_mag_grid.cpp b/src/init_mag_grid.cpp index 0daf3043..be4bf6c1 100644 --- a/src/init_mag_grid.cpp +++ b/src/init_mag_grid.cpp @@ -186,16 +186,16 @@ bool Grid::init_dipole_grid(Quadtree quadtree_ion, Planets planet) { IsCubeSphereGrid = false; IsDipole = true; - report.print(0, "Creating inter-node dipole connections"); + report.print(0, "Creating inter-node dipole connections for: " + gridType); if (!Is0D & !Is1Dz) create_dipole_connection(quadtree_ion); - report.print(0, "Creating Dipole Grid"); + report.print(0, "Creating Dipole Grid for: " + gridType); report.print(3, "Getting grid inputs for dipole grid"); - Inputs::grid_input_struct grid_input = input.get_grid_inputs("ionGrid"); + Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridType); // Number of ghost cells: int64_t nGCs = get_nGCs(); From 1ed1318e6f86712ae5cab2e9f96d90c627067df3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:33:58 -0400 Subject: [PATCH 670/691] moved to constants --- include/grid.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/include/grid.h b/include/grid.h index c3826dfd..bc1cd15b 100644 --- a/include/grid.h +++ b/include/grid.h @@ -48,14 +48,7 @@ struct cubesphere_chars { class Grid { public: - const int iSphere_ = 1; - const int iCubesphere_ = 2; - const int iDipole_ = 3; int iGridShape_ = -1; - - const std::string neutralType_ = "neuGrid"; - const std::string ionType_ = "ionGrid"; - // Armidillo Cube Versions: // Cell Center Coordinates arma_cube geoLon_scgc, geoX_scgc; From 43c1eed58f20216e525b6c0186ebdfd55d93cf55 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:34:23 -0400 Subject: [PATCH 671/691] changed sphere6 --- include/sphere.h | 110 +++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/include/sphere.h b/include/sphere.h index 32de5fdf..b2483752 100644 --- a/include/sphere.h +++ b/include/sphere.h @@ -12,20 +12,20 @@ *************************************************/ namespace Sphere { - /// The normalized origins of each face of the cube (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0} - }; +/// The normalized origins of each face of the cube (i.e. corner) +static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0} +}; - /// Normalized right steps in cube - static const arma_mat RIGHTS = { - {2.0, 0.0, 0.0} - }; +/// Normalized right steps in cube +static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0} +}; - /// Normalized right steps in cube - static const arma_mat UPS = { - {0.0, 1.0, 0.0} - }; +/// Normalized right steps in cube +static const arma_mat UPS = { + {0.0, 1.0, 0.0} +}; }; @@ -34,31 +34,31 @@ namespace Sphere { *************************************************/ namespace Sphere4 { - /// The normalized origins of each node (i.e. corner) - static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - { 0.0, -0.25, 0.0}, - { 0.0, 0.0, 0.0}, - { 0.0, 0.25, 0.0} - }; - - /// Normalized right steps in node - static const arma_mat RIGHTS = { - {2.0, 0.0, 0.0}, - {2.0, 0.0, 0.0}, - {2.0, 0.0, 0.0}, - {2.0, 0.0, 0.0} - }; - - /// Normalized up steps in node - static const arma_mat UPS = { - {0.0, 0.25, 0.0}, - {0.0, 0.25, 0.0}, - {0.0, 0.25, 0.0}, - {0.0, 0.25, 0.0} - }; - - }; +/// The normalized origins of each node (i.e. corner) +static const arma_mat ORIGINS = { + { 0.0, -0.5, 0.0}, + { 0.0, -0.25, 0.0}, + { 0.0, 0.0, 0.0}, + { 0.0, 0.25, 0.0} +}; + +/// Normalized right steps in node +static const arma_mat RIGHTS = { + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0}, + {2.0, 0.0, 0.0} +}; + +/// Normalized up steps in node +static const arma_mat UPS = { + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0}, + {0.0, 0.25, 0.0} +}; + +}; /************************************************* * \brief A namespace with all (6-root) sphere grid logic. @@ -67,32 +67,32 @@ namespace Sphere6 { /// The normalized origins of each face of the cube (i.e. corner) static const arma_mat ORIGINS = { - { 0.0, -0.5, 0.0}, - {2.0/3.0, -0.5, 0.0}, - {4.0/3.0, -0.5, 0.0}, - { 0.0, 0.0, 0.0}, - {2.0/3.0, 0.0, 0.0}, - {4.0/3.0, 0.0, 0.0} + {0.0, -0.5, 0.0}, + {1.0, -0.5, 0.0}, + {0.0, -0.5 + 1.0 / 3.0, 0.0}, + {1.0, -0.5 + 1.0 / 3.0, 0.0}, + {0.0, -0.5 + 2.0 / 3.0, 0.0}, + {1.0, -0.5 + 2.0 / 3.0, 0.0} }; /// Normalized right steps in cube static const arma_mat RIGHTS = { - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0}, - { 2.0/3.0, 0.0, 0.0} + { 1.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0}, + { 1.0, 0.0, 0.0} }; /// Normalized right steps in cube static const arma_mat UPS = { - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0}, - { 0.0, 0.5, 0.0} + { 0.0, 1.0 / 3.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0}, + { 0.0, 1.0 / 3.0, 0.0} }; } // CubeSphere:: From 879b87a051140034e633d889c59be3f9a2733f53 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:35:20 -0400 Subject: [PATCH 672/691] use gridshape instead of booleans --- src/fill_grid.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/fill_grid.cpp b/src/fill_grid.cpp index e98e0603..3006b827 100644 --- a/src/fill_grid.cpp +++ b/src/fill_grid.cpp @@ -173,7 +173,7 @@ void Grid::fill_grid_bfield(Planets planet) { // Magnetic coordinates: // init_mag grid already initializes magLon & magInvLat - if (IsGeoGrid) { + if (iGridShape_ != iDipole_) { magInvLat_scgc(iLon, iLat, iAlt) = bfield_info.lat; magLon_scgc(iLon, iLat, iAlt) = bfield_info.lon; } @@ -192,7 +192,7 @@ void Grid::fill_grid_bfield(Planets planet) { // Now we modify the dipole's magnetic field to account for any imprecision. // Take the bfield_mag and put it into the third component (b-hat = k-hat) - if (IsDipole) { + if (iGridShape_ == iDipole_) { bfield_vcgc[2] = bfield_mag_scgc % sign(magInvLat_scgc * -1.0); bfield_vcgc[1].zeros(); bfield_vcgc[0].zeros(); @@ -228,6 +228,7 @@ void Grid::fill_grid_radius(Planets planet) { // This generalizes things so that radius could be a function of all // three dimensions. The Cubesphere has different latitudes in the first // and second dimensions. + for (iLon = 0; iLon < nLons; iLon++) for (iLat = 0; iLat < nLats; iLat++) for (iAlt = 0; iAlt < nAlts; iAlt++) From 3ad28434b7655900e3ca866cd21c70135deb13dc Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:36:03 -0400 Subject: [PATCH 673/691] set lower alt bc and report stuff --- src/grid.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/grid.cpp b/src/grid.cpp index cbe9f409..974acf44 100644 --- a/src/grid.cpp +++ b/src/grid.cpp @@ -32,11 +32,15 @@ Grid::Grid(std::string gridtype) { if (iGridShape_ == iCubesphere_) { if (grid_input.nX > grid_input.nY) { report.error("Cubesphere grid: nX > nY, reducing nX"); + report.print(0, gridType + + ": Cubesphere selected, but nX /= nY, reducing nX"); grid_input.nX = grid_input.nY; } if (grid_input.nY > grid_input.nX) { report.error("Cubesphere grid: nY > nX, reducing nY"); + report.print(0, gridType + + ": Cubesphere selected, but nX /= nY, reducing nY"); grid_input.nY = grid_input.nX; } } @@ -292,6 +296,7 @@ Grid::Grid(std::string gridtype) { UseThisCell.fill(true); first_lower_gc.set_size(nX, nY); first_upper_gc.set_size(nX, nY); + altitude_lower_bc = 0.0; cent_acc_vcgc = make_cube_vector(nLons, nLats, nAlts, 3); From 1eb2a6b8891730673d95ce25279f2b6328a99604 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:37:09 -0400 Subject: [PATCH 674/691] clean up and use gridshape --- src/solver_grid_interpolation.cpp | 61 ++++++++++++++++++------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index 409ffd3d..e5e294bb 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -382,7 +382,8 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, abs(j_center_scgc.tube(coef.iRow, coef.iCol)), nGCs); // need alt index to find lat coef - coef.iAlt = bisect_search_array(alt_in, k_center_scgc.tube(coef.iRow, coef.iCol), + coef.iAlt = bisect_search_array(alt_in, k_center_scgc.tube(coef.iRow, + coef.iCol), nGCs); // then we can do the ratios: @@ -425,6 +426,8 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, static int iFunction = -1; report.enter(function, iFunction); + report.print(1, "interpolation gridtype : " + gridType); + // If the size of Lons, Lats and Alts are not the same, return false if (i_coords.size() != j_coords.size() || j_coords.size() != k_coords.size()) { report.error("Length of i,j,k vectors do not match!"); @@ -434,28 +437,31 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, // Clear the previous interpolation coefficients interp_coefs.clear(); - if (IsGeoGrid) { - // Handle according to whether it is cubesphere or not - if (IsCubeSphereGrid) { - // Calculate the range of the grid - struct cubesphere_range cr; - get_cubesphere_grid_range(cr); - - // Calculate the index and coefficients for each point - for (size_t i = 0; i < i_coords.size(); ++i) - set_interp_coef_cubesphere(cr, i_coords[i], j_coords[i], k_coords[i]); - } else if (IsLatLonGrid) { - // Calculate the range of the grid - struct sphere_range sr; - get_sphere_grid_range(sr); - - // Calculate the index and coefficients for each point - for (size_t i = 0; i < i_coords.size(); ++i) - set_interp_coef_sphere(sr, i_coords[i], j_coords[i], k_coords[i]); - } + if (iGridShape_ == iCubesphere_) { + report.print(1, "interpolation grid is cubesphere"); + + // Calculate the range of the grid + struct cubesphere_range cr; + get_cubesphere_grid_range(cr); + + // Calculate the index and coefficients for each point + for (size_t i = 0; i < i_coords.size(); ++i) + set_interp_coef_cubesphere(cr, i_coords[i], j_coords[i], k_coords[i]); } - else { // IsDipole + if (iGridShape_ == iSphere_) { + report.print(1, "interpolation grid is sphere"); + + struct sphere_range sr; + get_sphere_grid_range(sr); + + // Calculate the index and coefficients for each point + for (size_t i = 0; i < i_coords.size(); ++i) + set_interp_coef_sphere(sr, i_coords[i], j_coords[i], k_coords[i]); + } + + if (iGridShape_ == iDipole_) { // IsDipole + report.print(1, "interpolation grid is dipole"); // Calculate the range of the grid struct dipole_range dr; @@ -489,22 +495,27 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, } else { - magCoords = {vec2cube(i_coords),vec2cube(j_coords), vec2cube(k_coords)}; + magCoords = {vec2cube(i_coords), vec2cube(j_coords), vec2cube(k_coords)}; } // std::vector dipcoords = geo_to_mag(i_coords[0], j_coords[0], k_coords[0], planet); std::vector dipCoords; + if (!areLocsIJK) { std::vector planet_radii(nPts); + for (iLoc = 0; iLoc < nPts; iLoc++) { // Convert from mag->dipole coordinates. - if (areLocsGeo){ // we were given the geo-latitude + if (areLocsGeo) // we were given the geo-latitude planet_radii[iLoc] = planet.get_radius(j_coords[iLoc]); - } else{ + + else { // equatorial radius :( planet_radii[iLoc] = planet.get_radius(0.0); } - dipCoords = mag_to_ijk(i_coords[iLoc], j_coords[iLoc], k_coords[iLoc], planet_radii[iLoc]); + + dipCoords = mag_to_ijk(i_coords[iLoc], j_coords[iLoc], k_coords[iLoc], + planet_radii[iLoc]); mlon[iLoc] = dipCoords[0]; p_coord[iLoc] = dipCoords[1]; q_coord[iLoc] = dipCoords[2]; From 167ce81bf62d06c2e6214afd6bd22bbf80a07710 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:37:44 -0400 Subject: [PATCH 675/691] use constants for shapes --- src/grid_match.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 1df5ce97..2497a13a 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -25,7 +25,7 @@ bool grid_match(Grid gGrid, lon = mGrid.geoLon_scgc(iX, iY, iZ); lat = mGrid.geoLat_scgc(iX, iY, iZ); - if (gGrid.iGridShape_ == gGrid.iSphere_) { + if (gGrid.iGridShape_ == iSphere_) { norms(0) = lon / cPI; norms(1) = lat / cPI; norms(2) = 0.0; @@ -34,6 +34,7 @@ bool grid_match(Grid gGrid, norms = sphere_to_cube(lon, lat); iNode = gQuadtree.find_point(norms); } + if (report.test_verbose(6)) std::cout << "lon, lat, node: " << lon*cRtoD << " " << lat*cRtoD << " " From 1464c8510e26ec9b3f9b356a3adf79f9de9c3af3 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:38:18 -0400 Subject: [PATCH 676/691] FEAT: output lats and lons verbose=1 --- src/grid_sphere.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/grid_sphere.cpp b/src/grid_sphere.cpp index 8f940ff9..d3bb2120 100644 --- a/src/grid_sphere.cpp +++ b/src/grid_sphere.cpp @@ -124,6 +124,11 @@ void Grid::create_sphere_grid(Quadtree quadtree) { for (iLon = 0; iLon < nLons; iLon++) lon1d(iLon) = lon0 + (iLon - nGCs + 0.5) * dlon; + if (report.test_verbose(1)) { + std::cout << function << ": " << lon0 << " " << dlon << "\n"; + display_vector("in function " + function + " lon1d : ", lon1d * cRtoD); + } + for (iLat = 0; iLat < nLats; iLat++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { geoLon_scgc.subcube(0, iLat, iAlt, nLons - 1, iLat, iAlt) = lon1d; @@ -146,6 +151,12 @@ void Grid::create_sphere_grid(Quadtree quadtree) { for (iLat = 0; iLat < nLats; iLat++) lat1d(iLat) = lat0 + (iLat - nGCs + 0.5) * dlat; + if (report.test_verbose(1)) { + std::cout << function << ": " << lat0 << " " << dlat << "\n"; + + display_vector("in function " + function + " lat1d : ", lat1d * cRtoD); + } + for (iLon = 0; iLon < nLons; iLon++) { for (iAlt = 0; iAlt < nAlts; iAlt++) { geoLat_scgc.subcube(iLon, 0, iAlt, iLon, nLats - 1, iAlt) = lat1d; From a3196bbbf48508345fab61efdb153b32ceae486e Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:38:55 -0400 Subject: [PATCH 677/691] FEAT: use gridshape --- src/init_geo_grid.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/init_geo_grid.cpp b/src/init_geo_grid.cpp index 7f1b27bf..ddb19d2c 100644 --- a/src/init_geo_grid.cpp +++ b/src/init_geo_grid.cpp @@ -235,14 +235,14 @@ bool Grid::init_geo_grid(Quadtree quadtree, if (iGridShape_ == iCubesphere_) { correct_xy_grid(planet); // New functions for equal-angular grid (center, left, down): - report.print(3, "Scaling Cube by Radius"); + report.print(2, "Scaling Cube by Radius"); scale_cube_by_radius(cubeC); scale_cube_by_radius(cubeL); scale_cube_by_radius(cubeD); - report.print(3, "Done Scaling Cube by Radius"); + report.print(2, "Done Scaling Cube by Radius"); } - if (IsMagGrid) { + if (gridType == ionType_) { report.print(0, "--> Grid is Magnetic, so rotating"); std::vector llr, xyz, xyzRot1, xyzRot2; llr.push_back(geoLon_scgc); @@ -269,14 +269,12 @@ bool Grid::init_geo_grid(Quadtree quadtree, // Calculate PFPC coordinates (i.e., XYZ from LLR) calc_xyz(planet); - // Calculate grid spacing calc_grid_spacing(planet); //calculate radial unit vector (for spherical or oblate planet) calc_rad_unit(planet); // Calculate gravity (including J2 term, if desired) calc_gravity(planet); - // Calculate magnetic field and magnetic coordinates: fill_grid_bfield(planet); From 35afea5faf8000c2ffe61545e030fb21eac51519 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:39:30 -0400 Subject: [PATCH 678/691] FEAT: check of latrange is set correctly for dipole --- src/inputs.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/inputs.cpp b/src/inputs.cpp index d4303538..21dc05e0 100644 --- a/src/inputs.cpp +++ b/src/inputs.cpp @@ -107,7 +107,7 @@ std::string dummy_string = "unknown"; bool Inputs::check_settings(std::string key1, std::string key2) { - if (report.test_verbose(5)) + if (report.test_verbose(10)) std::cout << "checking setting : " << key1 << " and " << key2 << "\n"; @@ -132,7 +132,7 @@ bool Inputs::check_settings(std::string key1, // 1 key: bool Inputs::check_settings(std::string key1) { - if (report.test_verbose(5)) + if (report.test_verbose(10)) std::cout << "checking setting : " << key1 << "\n"; // try to find the keys first @@ -466,6 +466,25 @@ Inputs::grid_input_struct Inputs::get_grid_inputs(std::string gridtype) { grid_specs.alt_min = min_max[0]; grid_specs.alt_max = min_max[1]; + precision_t minDipoleLat = 10.0 * cDtoR; + precision_t maxDipoleLat = 80.0 * cDtoR; + + if (grid_specs.lat_min < minDipoleLat) { + grid_specs.lat_min = minDipoleLat; + report.print(0, "Error in setting min lat for " + + grid_specs.shape + + " - moving to 10 deg"); + report.error("Setting min dipole lat to 10.0"); + } + + if (grid_specs.lat_max > maxDipoleLat) { + grid_specs.lat_max = maxDipoleLat; + report.print(0, "Error in setting max lat for " + + grid_specs.shape + + " - moving to 80 deg"); + report.error("Setting max dipole lat to 80.0"); + } + } else { grid_specs.alt_min = check_settings_pt(gridtype, "MinAlt"); grid_specs.alt_file = check_settings_str(gridtype, "AltFile"); From bd3093cab0806ef15d18f6597d7b26f4c51ccf2a Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:40:12 -0400 Subject: [PATCH 679/691] BUG: quadtree wrong for ion geo grid --- src/main/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/main.cpp b/src/main/main.cpp index 7ed004b3..e3405588 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -38,12 +38,12 @@ int main() { // For now, the number of processors and blocks are set by the // neutral grid shape, since this could be sphere (1 root) or // cubesphere (6 root) - Quadtree quadtree(input.get_grid_shape("neuGrid")); + Quadtree quadtree(input.get_grid_shape(neutralType_)); if (!quadtree.is_ok()) throw std::string("quadtree for neutrals initialization failed!"); - Quadtree quadtree_ion(input.get_grid_shape("ionGrid")); + Quadtree quadtree_ion(input.get_grid_shape(ionType_)); if (!quadtree_ion.is_ok()) throw std::string("quadtree for ions initialization failed!"); @@ -105,7 +105,7 @@ int main() { // Initialize ion grid: Grid mGrid(ionType_); - if (mGrid.iGridShape_ == mGrid.iDipole_) { + if (mGrid.iGridShape_ == iDipole_) { didWork = mGrid.init_dipole_grid(quadtree_ion, planet); if (!didWork) @@ -113,14 +113,13 @@ int main() { } else { report.print(1, "Making Spherical Magnetic Grid\n"); mGrid.set_IsDipole(false); - didWork = mGrid.init_geo_grid(quadtree, planet); + didWork = mGrid.init_geo_grid(quadtree_ion, planet); mGrid.set_IsGeoGrid(false); } if (!didWork) throw std::string("Initializing magneitic grid failed!"); - didWork = grid_match(gGrid, mGrid, quadtree, quadtree_ion); // Initialize Neutrals on geographic grid: From c6ad5e49252e6616d1e6ed840b7bd38fd6a3857b Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:41:01 -0400 Subject: [PATCH 680/691] define radius --- src/solver_advection.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/solver_advection.cpp b/src/solver_advection.cpp index 48e88688..8da03682 100644 --- a/src/solver_advection.cpp +++ b/src/solver_advection.cpp @@ -284,7 +284,7 @@ precision_t calc_dt(arma_mat &xWidth, void Neutrals::advect_sphere(Grid &grid, Times &time) { - std::string function = "advect"; + std::string function = "advect_sphere"; static int iFunction = -1; report.enter(function, iFunction); @@ -369,10 +369,12 @@ void Neutrals::advect_sphere(Grid &grid, Times &time) { xMomentum = rho % xVel; yMomentum = rho % yVel; - x = grid.x_Center.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); - y = grid.y_Center.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); - xEdges = grid.x_Left.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); - yEdges = grid.y_Down.slice(iAlt) * grid.radius_scgc(1, 1, iAlt); + precision_t radius = grid.radius_scgc(1, 1, iAlt); + + x = grid.x_Center.slice(iAlt) * radius; + y = grid.y_Center.slice(iAlt) * radius; + xEdges = grid.x_Left.slice(iAlt) * radius; + yEdges = grid.y_Down.slice(iAlt) * radius; rhoP = project_to_edges(rho, x, xEdges, y, yEdges, nGCs); xVelP = project_to_edges(xVel, x, xEdges, y, yEdges, nGCs); From 326b61ab0d9733762ff41e840944bbda90387f14 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:41:42 -0400 Subject: [PATCH 681/691] BUG: report error if shape not found --- src/quadtree.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index 9918abaf..bcc2c707 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -68,6 +68,12 @@ bool Quadtree::is_ok() { void Quadtree::build(std::string gridtype) { + std::string function = "Quadtree::build"; + static int iFunction = -1; + report.enter(function, iFunction); + + IsOk = false; + arma_mat origins; arma_mat rights; arma_mat ups; @@ -79,6 +85,7 @@ void Quadtree::build(std::string gridtype) { rights = CubeSphere::RIGHTS; ups = CubeSphere::UPS; IsCubeSphere = true; + IsOk = true; } if (grid_input.shape == "sphere") { @@ -86,6 +93,7 @@ void Quadtree::build(std::string gridtype) { rights = Sphere::RIGHTS; ups = Sphere::UPS; IsSphere = true; + IsOk = true; } if (grid_input.shape == "sphere4") { @@ -93,6 +101,15 @@ void Quadtree::build(std::string gridtype) { rights = Sphere4::RIGHTS; ups = Sphere4::UPS; IsSphere = true; + IsOk = true; + } + + if (grid_input.shape == "sphere6") { + origins = Sphere6::ORIGINS; + rights = Sphere6::RIGHTS; + ups = Sphere6::UPS; + IsSphere = true; + IsOk = true; } if (grid_input.shape == "dipole4") { @@ -100,6 +117,7 @@ void Quadtree::build(std::string gridtype) { rights = Dipole4::RIGHTS; ups = Dipole4::UPS; IsDipole = true; + IsOk = true; } if (grid_input.shape == "dipole6") { @@ -107,7 +125,13 @@ void Quadtree::build(std::string gridtype) { rights = Dipole6::RIGHTS; ups = Dipole6::UPS; IsDipole = true; + IsOk = true; + } + if (!IsOk) { + report.error("quadtree shape not found (in build): " + grid_input.shape); + report.exit(function); + return; } arma_vec o(3), r(3), u(3); @@ -168,6 +192,9 @@ void Quadtree::build(std::string gridtype) { tmp = new_node(o, r, u, iP, iDepth, iNode); root_nodes.push_back(tmp); } + + report.exit(function); + return; } // -------------------------------------------------------------------------- From aa7405d5449146a0b11f09b99c8a94d428b69f7c Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:42:30 -0400 Subject: [PATCH 682/691] BUG: works with sphere6 type now --- srcPython/postAether.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/srcPython/postAether.py b/srcPython/postAether.py index 694b2ad4..a938ffb2 100755 --- a/srcPython/postAether.py +++ b/srcPython/postAether.py @@ -1024,9 +1024,11 @@ def calc_blocks(dataToWrite, iLon_ = 0, iLat_ = 1): iBlock = 1 while (iBlock < nBlocksTotal): - if (np.abs(dataToWrite[iBlock][iLon_][0, 0, 0] - testLon) > 0.001): + if ((np.abs(dataToWrite[iBlock][iLon_][0, 0, 0] - testLon) > 0.1) and + (np.abs(dataToWrite[iBlock][iLat_][0, 0, 0] - testLat) < 0.1)): nBlocksLon = nBlocksLon + 1 - if (np.abs(dataToWrite[iBlock][iLat_][0, 0, 0] - testLat) > 0.001): + if ((np.abs(dataToWrite[iBlock][iLat_][0, 0, 0] - testLat) > 0.1) and + (np.abs(dataToWrite[iBlock][iLon_][0, 0, 0] - testLon) < 0.1)): nBlocksLat = nBlocksLat + 1 iBlock = iBlock + 1 @@ -1064,20 +1066,20 @@ def consolidate_blocks(originalData, iLon_ = 0, iLat_ = 1): consolidatedData[key] = originalData[0][key] else: # need to move data over + #print('variable : ', key) data = np.zeros((nLonsTotal, nLatsTotal, nAlts)) for iBlock in range(nBlocks): # interior points: - iLatS = int((originalData[iBlock][iLat_][nGCs, nGCs, nGCs] - Lat0)/dLat) + nGCs + iLatS = int(round((originalData[iBlock][iLat_][nGCs, nGCs, nGCs] - Lat0)/dLat)) + nGCs iLatE = iLatS + nLats - iLonS = int((originalData[iBlock][iLon_][nGCs, nGCs, nGCs] - Lon0)/dLon) + nGCs + iLonS = int(round((originalData[iBlock][iLon_][nGCs, nGCs, nGCs] - Lon0)/dLon)) + nGCs iLonE = iLonS + nLons iLonSO = nGCs iLonEO = nGCs + nLons iLatSO = nGCs iLatEO = iLatSO + nLats - #print(iLonS, iLonE, nLonsTotal, ' -> ', iLonSO, iLonEO, nLons) - #print(iLatS, iLatE, nLatsTotal, ' -> ', iLatSO, iLatEO, nLats) - #print(nGCs) + #print('lons : ', iLonS, iLonE, nLonsTotal, ' -> ', iLonSO, iLonEO, nLons) + #print('lats : ', iLatS, iLatE, nLatsTotal, ' -> ', iLatSO, iLatEO, nLats) data[iLonS:iLonE, iLatS:iLatE, 0:nAlts] = \ originalData[iBlock][key][iLonSO:iLonEO, iLatSO:iLatEO, 0:nAlts] From 3f5d6f7c30afa89c4eafed5e029cc6d6436af102 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 24 Sep 2025 16:43:39 -0400 Subject: [PATCH 683/691] FEAT: test all combos of grid shapes --- tests/grid_shapes/aether.json.whole | 42 +++++++++ tests/grid_shapes/aether_cube_cube.json | 42 +++++++++ tests/grid_shapes/aether_cube_dipole6.json | 42 +++++++++ tests/grid_shapes/aether_cube_sphere6.json | 42 +++++++++ tests/grid_shapes/aether_sphere4_dipole4.json | 42 +++++++++ tests/grid_shapes/aether_sphere4_sphere4.json | 42 +++++++++ tests/grid_shapes/aether_sphere6_dipole6.json | 42 +++++++++ tests/grid_shapes/aether_sphere6_sphere6.json | 42 +++++++++ tests/grid_shapes/aether_sphere_sphere.json | 42 +++++++++ tests/grid_shapes/run_test.sh | 92 +++++++++++++++++++ 10 files changed, 470 insertions(+) create mode 100644 tests/grid_shapes/aether.json.whole create mode 100644 tests/grid_shapes/aether_cube_cube.json create mode 100644 tests/grid_shapes/aether_cube_dipole6.json create mode 100644 tests/grid_shapes/aether_cube_sphere6.json create mode 100644 tests/grid_shapes/aether_sphere4_dipole4.json create mode 100644 tests/grid_shapes/aether_sphere4_sphere4.json create mode 100644 tests/grid_shapes/aether_sphere6_dipole6.json create mode 100644 tests/grid_shapes/aether_sphere6_sphere6.json create mode 100644 tests/grid_shapes/aether_sphere_sphere.json create mode 100755 tests/grid_shapes/run_test.sh diff --git a/tests/grid_shapes/aether.json.whole b/tests/grid_shapes/aether.json.whole new file mode 100644 index 00000000..84033c7b --- /dev/null +++ b/tests/grid_shapes/aether.json.whole @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "cubesphere", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "sphere6", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90.0, 90.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_cube_cube.json b/tests/grid_shapes/aether_cube_cube.json new file mode 100644 index 00000000..b8e19691 --- /dev/null +++ b/tests/grid_shapes/aether_cube_cube.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "cubesphere", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "cubesphere", + "nLonsPerBlock": 32, + "nLatsPerBlock": 32, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_cube_dipole6.json b/tests/grid_shapes/aether_cube_dipole6.json new file mode 100644 index 00000000..696d0352 --- /dev/null +++ b/tests/grid_shapes/aether_cube_dipole6.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "cubesphere", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "dipole6", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [10.0, 80.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_cube_sphere6.json b/tests/grid_shapes/aether_cube_sphere6.json new file mode 100644 index 00000000..84033c7b --- /dev/null +++ b/tests/grid_shapes/aether_cube_sphere6.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "cubesphere", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "sphere6", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90.0, 90.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_sphere4_dipole4.json b/tests/grid_shapes/aether_sphere4_dipole4.json new file mode 100644 index 00000000..19b55f43 --- /dev/null +++ b/tests/grid_shapes/aether_sphere4_dipole4.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "sphere4", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "dipole4", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [10.0, 80.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_sphere4_sphere4.json b/tests/grid_shapes/aether_sphere4_sphere4.json new file mode 100644 index 00000000..b402b0f5 --- /dev/null +++ b/tests/grid_shapes/aether_sphere4_sphere4.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "sphere4", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "sphere4", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_sphere6_dipole6.json b/tests/grid_shapes/aether_sphere6_dipole6.json new file mode 100644 index 00000000..c0bac693 --- /dev/null +++ b/tests/grid_shapes/aether_sphere6_dipole6.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "sphere6", + "nLonsPerBlock" : 26, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "dipole6", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [10.0, 80.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_sphere6_sphere6.json b/tests/grid_shapes/aether_sphere6_sphere6.json new file mode 100644 index 00000000..3b8a1c68 --- /dev/null +++ b/tests/grid_shapes/aether_sphere6_sphere6.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "sphere6", + "nLonsPerBlock" : 22, + "nLatsPerBlock" : 22, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "sphere6", + "nLonsPerBlock": 32, + "nLatsPerBlock": 16, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90.0, 90.0], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/aether_sphere_sphere.json b/tests/grid_shapes/aether_sphere_sphere.json new file mode 100644 index 00000000..935880b3 --- /dev/null +++ b/tests/grid_shapes/aether_sphere_sphere.json @@ -0,0 +1,42 @@ + +{ + "Debug" : { + "dt": 1.0, + "TimingPercent": 10.0, + "iVerbose" : 0}, + + "EndTime" : [2011, 3, 20, 0, 1, 0], + + "neuGrid" : { + "Shape": "sphere", + "nLonsPerBlock" : 32, + "nLatsPerBlock" : 16, + "nAlts" : 30, + "MinAlt": 95, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "ionGrid": { + "Shape": "sphere", + "nLonsPerBlock": 42, + "nLatsPerBlock": 22, + "nAlts": 40, + "MinAlt": 80, + "LatRange": [-90, 90], + "LonRange": [0.0, 360.0], + "dAltScale" : 0.3, + "IsUniformAlt" : false}, + + "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], + + "Electrodynamics" : { + "Potential" : "Weimer05", + "DiffuseAurora" : "fta"}, + + "Outputs" : { + "type" : ["states"], + "dt" : [60] } + +} diff --git a/tests/grid_shapes/run_test.sh b/tests/grid_shapes/run_test.sh new file mode 100755 index 00000000..4c87f3d0 --- /dev/null +++ b/tests/grid_shapes/run_test.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +RUN=sphere_sphere +PE=1 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=sphere_sphere +PE=4 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=sphere4_sphere4 +PE=4 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=sphere6_sphere6 +PE=6 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=cube_cube +PE=6 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=cube_sphere6 +PE=6 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=sphere4_dipole4 +PE=4 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=cube_dipole6 +PE=6 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + +RUN=sphere6_dipole6 +PE=6 +rm -rf ./run.${RUN} +cp -R ../../share/run ./run.${RUN} +cd run.${RUN} +cp ../aether_${RUN}.json ./aether.json +mpirun -np ${PE} ./aether +../../../srcPython/postAether.py -rm +cd .. + From 7a49ef5bb659f17110b6cb1984fd49784ccde3db Mon Sep 17 00:00:00 2001 From: t-barnard Date: Wed, 1 Oct 2025 15:09:37 -0400 Subject: [PATCH 684/691] Change grid to pass by reference in solvers.h functions --- include/solvers.h | 35 ++++++++++++++++++----------------- src/solver_gradients.cpp | 39 ++++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/include/solvers.h b/include/solvers.h index 4e5ebb6f..c8a90121 100644 --- a/include/solvers.h +++ b/include/solvers.h @@ -83,23 +83,24 @@ fmat interpolate_1d_w_index(std::vector values, double interpolation_index, int interpolation_type); -arma_cube calc_gradient_lon(arma_cube value, Grid grid); -arma_cube calc_gradient_lat(arma_cube value, Grid grid); -arma_cube calc_gradient_alt(arma_cube value, Grid grid); -std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid); -std::vector calc_gradient_cubesphere(arma_cube value, Grid grid); -arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid); -arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt); +arma_cube calc_gradient_lon(arma_cube value, Grid &grid); +arma_cube calc_gradient_lat(arma_cube value, Grid &grid); +arma_cube calc_gradient_alt(arma_cube value, Grid &grid); +// std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid); +void calc_gradient_vector(arma_cube value_scgc, Grid &grid, std::vector &gradient_vcgc); +std::vector calc_gradient_cubesphere(arma_cube value, Grid &grid); +arma_cube calc_gradient_alt_4th(arma_cube value, Grid &grid); +arma_mat project_onesided_alt_3rd(arma_cube value, Grid &grid, int64_t iAlt); // Calculate 4th-order gradients in the native coordinate system: -arma_cube calc_gradient4o_i(arma_cube value, Grid grid); -arma_cube calc_gradient4o_j(arma_cube value, Grid grid); -arma_cube calc_gradient4o_k(arma_cube value, Grid grid); +arma_cube calc_gradient4o_i(arma_cube value, Grid &grid); +arma_cube calc_gradient4o_j(arma_cube value, Grid &grid); +arma_cube calc_gradient4o_k(arma_cube value, Grid &grid); // Calculate 2nd-order gradients in the native coordinate system: -arma_cube calc_gradient2o_i(arma_cube value, Grid grid); -arma_cube calc_gradient2o_j(arma_cube value, Grid grid); -arma_cube calc_gradient2o_k(arma_cube value, Grid grid); +arma_cube calc_gradient2o_i(arma_cube value, Grid &grid); +arma_cube calc_gradient2o_j(arma_cube value, Grid &grid); +arma_cube calc_gradient2o_k(arma_cube value, Grid &grid); // interpolation in 1D precision_t linear_interpolation(const precision_t y0, @@ -122,9 +123,9 @@ precision_t limiter_mc(precision_t dUp, \param dt returns the neutral time-step \param grid The grid to define the neutrals on **/ - precision_t calc_dt(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc); - precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc); + precision_t calc_dt(Grid &grid, std::vector cMax_vcgc); + precision_t calc_dt_sphere(Grid &grid, std::vector cMax_vcgc); + precision_t calc_dt_cubesphere(Grid &grid, std::vector cMax_vcgc); + precision_t calc_dt_vertical(Grid &grid, std::vector cMax_vcgc); #endif // INCLUDE_SOLVERS_H_ diff --git a/src/solver_gradients.cpp b/src/solver_gradients.cpp index 6843eaa3..5d21eb6a 100644 --- a/src/solver_gradients.cpp +++ b/src/solver_gradients.cpp @@ -8,7 +8,7 @@ // It is assumed that this is lon, lat, rad // -------------------------------------------------------------------------- -std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { +std::vector calc_gradient_vector(arma_cube value_scgc, Grid &grid) { std::vector gradient_vcgc; @@ -56,7 +56,11 @@ std::vector calc_gradient_vector(arma_cube value_scgc, Grid grid) { // - these formulas assume that the grid is uniform. // -------------------------------------------------------------------------- -arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { +arma_cube calc_gradient2o_i(arma_cube value, Grid &grid) { + + std::string function = "calc_gradient2o_i"; + static int iFunction = -1; + report.enter(function, iFunction); int64_t nX = grid.get_nX(); int64_t nY = grid.get_nY(); @@ -85,7 +89,7 @@ arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { (value.row(iX) - value.row(iX - 1)) / grid.di_center_m_scgc.row(iX); } - + report.exit(function); return gradient; } @@ -94,7 +98,7 @@ arma_cube calc_gradient2o_i(arma_cube value, Grid grid) { // - these formulas assume that the grid is uniform. // -------------------------------------------------------------------------- -arma_cube calc_gradient4o_i(arma_cube value, Grid grid) { +arma_cube calc_gradient4o_i(arma_cube value, Grid &grid) { int64_t nX = grid.get_nX(); int64_t nY = grid.get_nY(); @@ -182,7 +186,7 @@ arma_cube calc_gradient_stretched_i(arma_cube value, Grid grid) { // Calculate the gradient in the longitudinal direction // -------------------------------------------------------------------------- -arma_cube calc_gradient_lon(arma_cube value, Grid grid) { +arma_cube calc_gradient_lon(arma_cube value, Grid &grid) { return calc_gradient2o_i(value, grid); } @@ -191,7 +195,11 @@ arma_cube calc_gradient_lon(arma_cube value, Grid grid) { // - these formulas assume that the grid is uniform. // -------------------------------------------------------------------------- -arma_cube calc_gradient2o_j(arma_cube value, Grid grid) { +arma_cube calc_gradient2o_j(arma_cube value, Grid &grid) { + + std::string function = "calc_gradient2o_j"; + static int iFunction = -1; + report.enter(function, iFunction); int64_t nX = grid.get_nX(); int64_t nY = grid.get_nY(); @@ -220,7 +228,7 @@ arma_cube calc_gradient2o_j(arma_cube value, Grid grid) { (value.col(iY) - value.col(iY - 1)) / grid.dj_center_m_scgc.col(iY); } - + report.exit(function); return gradient; } @@ -229,7 +237,7 @@ arma_cube calc_gradient2o_j(arma_cube value, Grid grid) { // - these formulas assume that the grid is uniform. // -------------------------------------------------------------------------- -arma_cube calc_gradient4o_j(arma_cube value, Grid grid) { +arma_cube calc_gradient4o_j(arma_cube value, Grid &grid) { int64_t nX = grid.get_nX(); int64_t nY = grid.get_nY(); @@ -317,7 +325,7 @@ arma_cube calc_gradient_stretched_j(arma_cube value, Grid grid) { // Calculate the gradient in the latitudinal direction // -------------------------------------------------------------------------- -arma_cube calc_gradient_lat(arma_cube value, Grid grid) { +arma_cube calc_gradient_lat(arma_cube value, Grid &grid) { return calc_gradient2o_j(value, grid); } @@ -325,7 +333,11 @@ arma_cube calc_gradient_lat(arma_cube value, Grid grid) { // Calculate the gradient in the altitudinal direction // -------------------------------------------------------------------------- -arma_cube calc_gradient_alt(arma_cube value, Grid grid) { +arma_cube calc_gradient_alt(arma_cube value, Grid &grid) { + + std::string function = "calc_gradient_alt"; + static int iFunction = -1; + report.enter(function, iFunction); int64_t nX = grid.get_nLons(); int64_t nY = grid.get_nLats(); @@ -358,6 +370,7 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { (value.slice(iK) - value.slice(iK - 1)) / grid.dk_edge_m.slice(iK); } + report.exit(function); return gradient; } @@ -366,7 +379,7 @@ arma_cube calc_gradient_alt(arma_cube value, Grid grid) { // Calculate the 4th order gradient in the altitudinal direction // -------------------------------------------------------------------------- -arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid) { +arma_cube calc_gradient_alt_4th(arma_cube value, Grid &grid) { int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); @@ -393,7 +406,7 @@ arma_cube calc_gradient_alt_4th(arma_cube value, Grid grid) { // - this is only defined for the bottom ghostcells! // -------------------------------------------------------------------------- -arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { +arma_mat project_onesided_alt_3rd(arma_cube value, Grid &grid, int64_t iAlt) { int64_t nLons = grid.get_nLons(); int64_t nLats = grid.get_nLats(); @@ -418,7 +431,7 @@ arma_mat project_onesided_alt_3rd(arma_cube value, Grid grid, int64_t iAlt) { // -------------------------------------------------------------------------- // Calculate the gradient in cubesphere spatial discretization // -------------------------------------------------------------------------- -std::vector calc_gradient_cubesphere(arma_cube value, Grid grid) { +std::vector calc_gradient_cubesphere(arma_cube value, Grid &grid) { // Must be used for cubesphere (Probably need a boolean check) int64_t nXs = grid.get_nY(); int64_t nYs = grid.get_nX(); From 819e68bc06fa02f9904ca17c5440e9ce1b441dc1 Mon Sep 17 00:00:00 2001 From: t-barnard Date: Wed, 1 Oct 2025 15:12:11 -0400 Subject: [PATCH 685/691] Added new timing function and option to use old timing function --- CMakeLists.txt | 8 ++++++++ include/report.h | 5 +++++ src/report.cpp | 20 ++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index a479a1fe..17159e86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,6 +100,14 @@ if (USE_NETCDF) target_link_libraries(aether PUBLIC ${NETCDF_LIBRARIES_C}) endif() +# use_old_timing +# cmake -DUSE_OLD_TIMING=ON .. +option(USE_OLD_TIMING "Use old timing for performance - default is off" OFF) +if (USE_OLD_TIMING) + add_definitions(-DOLD_TIMING) + set(OLD_TIMING "YES") +endif() + # Set up links for executable file(CREATE_LINK ${CMAKE_BINARY_DIR}/aether ${PROJECT_SOURCE_DIR}/share/run/aether SYMBOLIC) diff --git a/include/report.h b/include/report.h index e29696eb..892c65f1 100644 --- a/include/report.h +++ b/include/report.h @@ -23,6 +23,7 @@ #include #include #include +#include #include "aether.h" @@ -211,6 +212,8 @@ class Report { precision_t timing_total; /// This is the start-gate for the timer unsigned long long timing_start; + + struct timeval timing_start_new; /// This is the level of the function that is then compared to verbose int iLevel; /// This is a string that holds all of the function names above this one @@ -250,6 +253,8 @@ class Report { std::string error; }; + struct timeval start, end; + //Vector of error structs std::vector error_list; }; diff --git a/src/report.cpp b/src/report.cpp index 29bbc129..fc4b4f14 100644 --- a/src/report.cpp +++ b/src/report.cpp @@ -75,12 +75,20 @@ void Report::enter(std::string input, int &iFunction) { iVerbose = entries[iEntry].iFunctionVerbose; + #ifdef OLD_TIMING // This was taken from // https://stackoverflow.com/questions/19555121/how-to-get-current-timestamp-in-milliseconds-since-1970-just-the-way-java-gets unsigned long long now = std::chrono::duration_cast (std::chrono::system_clock::now().time_since_epoch()).count(); entries[iEntry].timing_start = now; + + #else//New timing + gettimeofday(&start, NULL); + entries[iEntry].timing_start_new = start; + + #endif + iLevel++; entries[iEntry].iLevel = iLevel; iCurrentFunction = iEntry; @@ -110,6 +118,7 @@ void Report::exit(std::string input) { if (DoReportOnExit) print(iLevel, "Exiting function : " + current_entry); + #ifdef OLD_TIMING // Get current system time: unsigned long long now = std::chrono::duration_cast (std::chrono::system_clock::now().time_since_epoch()).count(); @@ -118,6 +127,17 @@ void Report::exit(std::string input) { entries[iEntry].timing_total = entries[iEntry].timing_total + float(now - entries[iEntry].timing_start) / 1000.0; + #else //new timing + gettimeofday(&end, NULL); + start = entries[iEntry].timing_start_new; + long seconds = end.tv_sec - start.tv_sec; + long microseconds = end.tv_usec - start.tv_usec; + long elapsed_micro = seconds * 1000000 + microseconds; + precision_t elapsed_sec = elapsed_micro / 1000000.0; + + entries[iEntry].timing_total = entries[iEntry].timing_total + elapsed_sec; + #endif + // Increment the total number of times that the function has been called: entries[iEntry].nTimes++; From 3626e2a75a5c804da8e3222a008c96abf619b1fc Mon Sep 17 00:00:00 2001 From: t-barnard Date: Thu, 13 Nov 2025 12:30:16 -0500 Subject: [PATCH 686/691] change calls to grid, ion, neutral , etc. to references --- include/aurora.h | 2 +- include/calc_euv.h | 2 +- include/chemistry.h | 2 +- include/ions.h | 28 ++++++++++++------------- include/neutrals.h | 32 ++++++++++++++--------------- src/add_sources.cpp | 2 +- src/aurora.cpp | 2 +- src/calc_chemistry.cpp | 2 +- src/calc_dt.cpp | 8 ++++---- src/calc_electron_temperature.cpp | 2 +- src/calc_euv.cpp | 2 +- src/calc_ion_drift.cpp | 4 ++-- src/calc_ion_temperature.cpp | 4 ++-- src/calc_neutral_derived.cpp | 4 ++-- src/ions_advect.cpp | 2 +- src/ions_bcs.cpp | 6 +++--- src/neutrals.cpp | 8 ++++---- src/neutrals_advect.cpp | 2 +- src/neutrals_bcs.cpp | 8 ++++---- src/neutrals_energy.cpp | 2 +- src/neutrals_ics.cpp | 2 +- src/neutrals_momentum_viscosity.cpp | 2 +- src/solver_vertical_rusanov.cpp | 4 ++-- 23 files changed, 66 insertions(+), 66 deletions(-) diff --git a/include/aurora.h b/include/aurora.h index 75889cc9..f09c27f7 100644 --- a/include/aurora.h +++ b/include/aurora.h @@ -31,7 +31,7 @@ arma_vec calculate_fang(float eflux, // in ergs/cm2/s * param ions the class that contains all info about the ions **/ -void calc_aurora(Grid grid, +void calc_aurora(Grid &grid, Neutrals &neutrals, Ions &ions); diff --git a/include/calc_euv.h b/include/calc_euv.h index 561930a2..2de06b18 100644 --- a/include/calc_euv.h +++ b/include/calc_euv.h @@ -21,7 +21,7 @@ // ------------------------------------------------------------------------- bool calc_euv(Planets planet, - Grid grid, + Grid &grid, Times time, Euv &euv, Neutrals &neutrals, diff --git a/include/chemistry.h b/include/chemistry.h index 118d0189..e127412d 100644 --- a/include/chemistry.h +++ b/include/chemistry.h @@ -87,7 +87,7 @@ class Chemistry { void calc_chemistry(Neutrals &neutrals, Ions &ions, Times time, - Grid grid); + Grid &grid); void calc_chemical_sources(Neutrals &neutrals, Ions &ions); diff --git a/include/ions.h b/include/ions.h index 05ab7bbe..979490e5 100644 --- a/include/ions.h +++ b/include/ions.h @@ -216,13 +216,13 @@ class Ions { \param grid The grid to define the ions on \param planet contains information about the species to simulate **/ - Ions(Grid grid, Planets planet); + Ions(Grid &grid, Planets planet); /********************************************************************** \brief Creates the variables within the species_chars structure \param grid The grid to define the ions on **/ - species_chars create_species(Grid grid); + species_chars create_species(Grid &grid); /********************************************************************** \brief @@ -235,7 +235,7 @@ class Ions { \param neutrals the neutral class to grab the temperature from \param grid The grid that the ions are defined on **/ - void init_ion_temperature(Neutrals neutrals, Grid grid); + void init_ion_temperature(Neutrals neutrals, Grid &grid); /********************************************************************** \brief Sets the floor of the ion densities, just in case! @@ -277,13 +277,13 @@ class Ions { \param time The time class to get dt and the current time \param indices The indices class to get different indices that may be needed **/ - bool set_bcs(Grid grid, Times time, Indices indices); + bool set_bcs(Grid &grid, Times time, Indices indices); /********************************************************************** \brief Sets the upper boundary conditions for the ions \param grid The grid that the ions are defined on **/ - bool set_upper_bcs(Grid grid); + bool set_upper_bcs(Grid &grid); /********************************************************************** \brief Sets the lower boundary condition for the ions @@ -291,14 +291,14 @@ class Ions { \param time The time class to get dt and the current time \param indices The indices class to get different indices that may be needed **/ - bool set_lower_bcs(Grid grid, Times time, Indices indices); + bool set_lower_bcs(Grid &grid, Times time, Indices indices); /********************************************************************** \brief Advect the ions along the 3rd dimension (could be altitude) \param grid The grid that the ions are defined on \param time The time class to get dt and the current time **/ - bool advect_vertical(Grid grid, Times time); + bool advect_vertical(Grid &grid, Times time); /********************************************************************** \brief Get the ID of the ion species with the given name @@ -310,13 +310,13 @@ class Ions { \brief Calculates the electric field \param grid The grid that the ions are defined on **/ - void calc_efield(Grid grid); + void calc_efield(Grid &grid); /********************************************************************** \brief Calculates the E x B drift \param grid The grid that the ions are defined on **/ - void calc_exb_drift(Grid grid); + void calc_exb_drift(Grid &grid); /********************************************************************** \brief Calculate the ion drift @@ -324,8 +324,8 @@ class Ions { \param grid The grid that the ions are defined on \param dt the delta-t for the current time **/ - void calc_ion_drift(Neutrals neutrals, - Grid grid, + void calc_ion_drift(const Neutrals &neutrals, + Grid &grid, precision_t dt); /********************************************************************** @@ -342,7 +342,7 @@ class Ions { \param grid this is the grid to solve the equation on \param time the time class to know dt **/ - void calc_ion_temperature(Neutrals neutrals, Grid grid, Times time); + void calc_ion_temperature(const Neutrals &neutrals, Grid &grid, Times time); /********************************************************************** \brief Calculates the electron temperature on the given grid @@ -350,7 +350,7 @@ class Ions { \param grid this is the grid to solve the equation on \param time the time class to know dt **/ - void calc_electron_temperature(Neutrals neutrals, Grid grid, Times time); + void calc_electron_temperature(Neutrals neutrals, Grid &grid, Times time); /********************************************************************** /// @brief Calculate epsilon @@ -449,7 +449,7 @@ class Ions { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - void solver_vertical_rusanov(Grid grid, Times time); + void solver_vertical_rusanov(Grid &grid, Times time); }; #endif // INCLUDE_IONS_H_ diff --git a/include/neutrals.h b/include/neutrals.h index d7ac5321..36d4ce16 100644 --- a/include/neutrals.h +++ b/include/neutrals.h @@ -256,7 +256,7 @@ class Neutrals { \param time contains information about the current time \param indices used to help set initial conditions **/ - Neutrals(Grid grid, + Neutrals(Grid &grid, Planets planet, Times time, Indices indices); @@ -265,7 +265,7 @@ class Neutrals { \brief Creates the variables within the species_chars structure \param grid The grid to define the neutrals on **/ - species_chars create_species(Grid grid); + species_chars create_species(Grid &grid); /********************************************************************** \brief Read in the planet-specific file @@ -284,7 +284,7 @@ class Neutrals { \param time contains information about the current time \param indices used to help set initial conditions **/ - bool initial_conditions(Grid grid, + bool initial_conditions(Grid &grid, Times time, Indices indices); @@ -302,12 +302,12 @@ class Neutrals { **/ void fill_with_hydrostatic(int64_t iStart, int64_t iEnd, - Grid grid); + Grid &grid); void fill_with_hydrostatic(int64_t iSpecies, int64_t iStart, int64_t iEnd, - Grid grid); + Grid &grid); /********************************************************************** \brief Limit the density to a floor and a ceiling @@ -323,7 +323,7 @@ class Neutrals { \brief Calculate the scale heights for the individual species \param grid The grid to define the neutrals on **/ - void calc_scale_height(Grid grid); + void calc_scale_height(Grid &grid); /********************************************************************** \brief Calculate the viscosity coefficient @@ -380,21 +380,21 @@ class Neutrals { \brief Calculate the chapman integrals for the individual species \param grid The grid to define the neutrals on **/ - void calc_chapman(Grid grid); + void calc_chapman(Grid &grid); /********************************************************************** \brief Calculate the neutral bulk vertical thermal conduction \param grid The grid to define the neutrals on \param time The times within the model (dt is needed) **/ - void update_temperature(Grid grid, Times time); + void update_temperature(Grid &grid, Times time); /********************************************************************** \brief Calculate the neutral bulk horizontal viscosity \param grid The grid to define the neutrals on \param time The times within the model (dt is needed) **/ - void update_horizontal_velocity(Grid grid, Times time); + void update_horizontal_velocity(Grid &grid, Times time); /********************************************************************** \brief Calculate the O radiative cooling @@ -412,7 +412,7 @@ class Neutrals { \param planet Need things like rotation rate \param grid Need things like radius **/ - void add_sources(Times time, Planets planet, Grid grid); + void add_sources(Times time, Planets planet, Grid &grid); /********************************************************************** \brief Set boundary conditions for the neutrals @@ -420,7 +420,7 @@ class Neutrals { \param time contains information about the current time \param indices used to help set initial conditions **/ - bool set_bcs(Grid grid, + bool set_bcs(Grid &grid, Times time, Indices indices); @@ -430,7 +430,7 @@ class Neutrals { \param time contains information about the current time \param indices used to help set initial conditions **/ - bool set_lower_bcs(Grid grid, + bool set_lower_bcs(Grid &grid, Times time, Indices indices); @@ -440,14 +440,14 @@ class Neutrals { \param time contains information about the current time \param indices used to help set initial conditions **/ - bool set_upper_bcs(Grid grid); + bool set_upper_bcs(Grid &grid); /********************************************************************** \brief Set boundary conditions for the neutrals \param iDir direction of the BC to set \param grid The grid to define the neutrals on **/ - bool set_horizontal_bcs(int64_t iDir, Grid grid); + bool set_horizontal_bcs(int64_t iDir, Grid &grid); /********************************************************************** \brief Get the species ID number (int) given the species name (string) @@ -523,7 +523,7 @@ class Neutrals { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - void solver_vertical_rusanov(Grid grid, + void solver_vertical_rusanov(Grid &grid, Times time); /********************************************************************** @@ -531,7 +531,7 @@ class Neutrals { \param grid The grid to define the neutrals on \param time contains information about the current time **/ - bool advect_vertical(Grid grid, Times time); + bool advect_vertical(Grid &grid, Times time); /********************************************************************** \brief Calculate the neutral friction in one cell using an implicit solver diff --git a/src/add_sources.cpp b/src/add_sources.cpp index b9eaf2a9..acd2922d 100644 --- a/src/add_sources.cpp +++ b/src/add_sources.cpp @@ -10,7 +10,7 @@ // Adds all of the sources to the states. Needs time to get dt. // ----------------------------------------------------------------------------- -void Neutrals::add_sources(Times time, Planets planet, Grid grid) { +void Neutrals::add_sources(Times time, Planets planet, Grid &grid) { std::string function = "add_sources"; static int iFunction = -1; diff --git a/src/aurora.cpp b/src/aurora.cpp index 93a731bc..cd35ad02 100644 --- a/src/aurora.cpp +++ b/src/aurora.cpp @@ -112,7 +112,7 @@ arma_vec calculate_fang_v2(precision_t energy_bin, // ----------------------------------------------------------------------------- // Calculate aurora // ----------------------------------------------------------------------------- -void calc_aurora(Grid grid, +void calc_aurora(Grid &grid, Neutrals &neutrals, Ions &ions) { diff --git a/src/calc_chemistry.cpp b/src/calc_chemistry.cpp index 9d8d2eec..7a82845c 100644 --- a/src/calc_chemistry.cpp +++ b/src/calc_chemistry.cpp @@ -13,7 +13,7 @@ void Chemistry::calc_chemistry(Neutrals &neutrals, Ions &ions, Times time, - Grid grid) { + Grid &grid) { int iSpecies; diff --git a/src/calc_dt.cpp b/src/calc_dt.cpp index dc51d5b4..e951a028 100644 --- a/src/calc_dt.cpp +++ b/src/calc_dt.cpp @@ -8,7 +8,7 @@ // -------------------------------------------------------------------------- -precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { +precision_t calc_dt(Grid &grid, std::vector cMax_vcgc) { std::string function = "calc_dt"; static int iFunction = -1; @@ -29,7 +29,7 @@ precision_t calc_dt(Grid grid, std::vector cMax_vcgc) { // // -------------------------------------------------------------------------- -precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { +precision_t calc_dt_sphere(Grid &grid, std::vector cMax_vcgc) { std::string function = "calc_dt_sphere"; static int iFunction = -1; @@ -70,7 +70,7 @@ precision_t calc_dt_sphere(Grid grid, std::vector cMax_vcgc) { // // -------------------------------------------------------------------------- -precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { +precision_t calc_dt_cubesphere(Grid &grid, std::vector cMax_vcgc) { std::string function = "calc_dt_sphere"; static int iFunction = -1; @@ -132,7 +132,7 @@ precision_t calc_dt_cubesphere(Grid grid, std::vector cMax_vcgc) { // // -------------------------------------------------------------------------- -precision_t calc_dt_vertical(Grid grid, std::vector cMax_vcgc) { +precision_t calc_dt_vertical(Grid &grid, std::vector cMax_vcgc) { std::string function = "calc_dt_vertical"; static int iFunction = -1; diff --git a/src/calc_electron_temperature.cpp b/src/calc_electron_temperature.cpp index a5a00552..cf5a2bb2 100644 --- a/src/calc_electron_temperature.cpp +++ b/src/calc_electron_temperature.cpp @@ -8,7 +8,7 @@ // TODO (#24): this currently just sets the electron temperature to the neutral temperature // -------------------------------------------------------------------------- -void Ions::calc_electron_temperature(Neutrals neutrals, Grid grid, Times time) { +void Ions::calc_electron_temperature(Neutrals neutrals, Grid &grid, Times time) { std::string function = "Ions::calc_electron_temperature"; static int iFunction = -1; diff --git a/src/calc_euv.cpp b/src/calc_euv.cpp index 2c971f2d..d1bb5af5 100644 --- a/src/calc_euv.cpp +++ b/src/calc_euv.cpp @@ -14,7 +14,7 @@ // ----------------------------------------------------------------------------- bool calc_euv(Planets planet, - Grid grid, + Grid &grid, Times time, Euv &euv, Neutrals &neutrals, diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index ab1c6acb..e3ee58c9 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -7,7 +7,7 @@ // Calculate the electric field from the potential // -------------------------------------------------------------------------- -void Ions::calc_efield(Grid grid) { +void Ions::calc_efield(Grid &grid) { // efield = - grad(potential) efield_vcgc = calc_gradient_vector(potential_scgc, grid); @@ -27,7 +27,7 @@ void Ions::calc_efield(Grid grid) { // Calculate the E x B drift from the electric field and magnetic field // -------------------------------------------------------------------------- -void Ions::calc_exb_drift(Grid grid) { +void Ions::calc_exb_drift(Grid &grid) { arma_cube bmag2 = (grid.bfield_mag_scgc) % (grid.bfield_mag_scgc); exb_vcgc = cross_product(efield_vcgc, grid.bfield_vcgc); diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 84af5aaa..19e9b7c1 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -11,7 +11,7 @@ // Initialize the ion temperature - set equal to the neutral temperature // -------------------------------------------------------------------------- -void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { +void Ions::init_ion_temperature(Neutrals neutrals, Grid &grid) { int64_t iIon; @@ -46,7 +46,7 @@ void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { // Calculate the ion temperature // -------------------------------------------------------------------------- -void Ions::calc_ion_temperature(Neutrals neutrals, Grid grid, +void Ions::calc_ion_temperature(const Neutrals &neutrals, Grid &grid, Times time) { std::string function = "Ions::calc_ion_temperature"; diff --git a/src/calc_neutral_derived.cpp b/src/calc_neutral_derived.cpp index 541dbb77..824c974d 100644 --- a/src/calc_neutral_derived.cpp +++ b/src/calc_neutral_derived.cpp @@ -239,7 +239,7 @@ void Neutrals::assign_bulk_velocity() { // Calculate scale heights of different species //---------------------------------------------------------------------- -void Neutrals::calc_scale_height(Grid grid) { +void Neutrals::calc_scale_height(Grid &grid) { int64_t nAlts = grid.get_nAlts(); @@ -518,7 +518,7 @@ precision_t Neutrals::calc_dt_cubesphere(Grid grid) { // this is taken from Smith and Smith, JGR 1972, vol. 77, page 3592 // ---------------------------------------------------------------------- -void Neutrals::calc_chapman(Grid grid) { +void Neutrals::calc_chapman(Grid &grid) { int64_t iAlt, iLon, iLat; diff --git a/src/ions_advect.cpp b/src/ions_advect.cpp index 36bed83b..38ae889f 100644 --- a/src/ions_advect.cpp +++ b/src/ions_advect.cpp @@ -9,7 +9,7 @@ // This is where we will call the different advection schemes // ----------------------------------------------------------------------------- -bool Ions::advect_vertical(Grid grid, Times time) { +bool Ions::advect_vertical(Grid &grid, Times time) { bool didWork = true; diff --git a/src/ions_bcs.cpp b/src/ions_bcs.cpp index 29d4cc89..a6aac659 100644 --- a/src/ions_bcs.cpp +++ b/src/ions_bcs.cpp @@ -20,7 +20,7 @@ // set_bcs - This is for setting the vertical BCs //---------------------------------------------------------------------- -bool Ions::set_bcs(Grid grid, +bool Ions::set_bcs(Grid &grid, Times time, Indices indices) { @@ -51,7 +51,7 @@ bool Ions::set_bcs(Grid grid, // set upper boundary conditions for the ions //---------------------------------------------------------------------- -bool Ions::set_upper_bcs(Grid grid) { +bool Ions::set_upper_bcs(Grid &grid) { std::string function = "Ions::set_upper_bcs"; static int iFunction = -1; @@ -104,7 +104,7 @@ bool Ions::set_upper_bcs(Grid grid) { // set lower boundary conditions for the ions //---------------------------------------------------------------------- -bool Ions::set_lower_bcs(Grid grid, Times time, Indices indices) { +bool Ions::set_lower_bcs(Grid &grid, Times time, Indices indices) { std::string function = "Ions::set_lower_bcs"; static int iFunction = -1; diff --git a/src/neutrals.cpp b/src/neutrals.cpp index b452f6f6..5f73634d 100644 --- a/src/neutrals.cpp +++ b/src/neutrals.cpp @@ -11,7 +11,7 @@ // Create a single species by filling the species structure // ----------------------------------------------------------------------------- -Neutrals::species_chars Neutrals::create_species(Grid grid) { +Neutrals::species_chars Neutrals::create_species(Grid &grid) { species_chars tmp; @@ -81,7 +81,7 @@ Neutrals::species_chars Neutrals::create_species(Grid grid) { // Initialize neutrals // ----------------------------------------------------------------------------- -Neutrals::Neutrals(Grid grid, +Neutrals::Neutrals(Grid &grid, Planets planet, Times time, Indices indices) { @@ -251,7 +251,7 @@ int Neutrals::read_planet_file(Planets planet) { void Neutrals::fill_with_hydrostatic(int64_t iStart, int64_t iEnd, - Grid grid) { + Grid &grid) { int64_t iNeutral, iSpecies; @@ -281,7 +281,7 @@ void Neutrals::fill_with_hydrostatic(int64_t iStart, void Neutrals::fill_with_hydrostatic(int64_t iSpecies, int64_t iStart, int64_t iEnd, - Grid grid) { + Grid &grid) { // Integrate with hydrostatic equilibrium up: for (int iAlt = iStart; iAlt < iEnd; iAlt++) { diff --git a/src/neutrals_advect.cpp b/src/neutrals_advect.cpp index a80dc274..96a93251 100644 --- a/src/neutrals_advect.cpp +++ b/src/neutrals_advect.cpp @@ -9,7 +9,7 @@ // This is where we will call the different advection schemes // ----------------------------------------------------------------------------- -bool Neutrals::advect_vertical(Grid grid, Times time) { +bool Neutrals::advect_vertical(Grid &grid, Times time) { bool didWork = true; diff --git a/src/neutrals_bcs.cpp b/src/neutrals_bcs.cpp index e9308e23..112086a1 100644 --- a/src/neutrals_bcs.cpp +++ b/src/neutrals_bcs.cpp @@ -20,7 +20,7 @@ // set_bcs - This is for setting the vertical BCs //---------------------------------------------------------------------- -bool Neutrals::set_bcs(Grid grid, +bool Neutrals::set_bcs(Grid &grid, Times time, Indices indices) { @@ -51,7 +51,7 @@ bool Neutrals::set_bcs(Grid grid, // set lower boundary conditions for the neutrals //---------------------------------------------------------------------- -bool Neutrals::set_upper_bcs(Grid grid) { +bool Neutrals::set_upper_bcs(Grid &grid) { std::string function = "Neutrals::set_upper_bcs"; static int iFunction = -1; @@ -105,7 +105,7 @@ bool Neutrals::set_upper_bcs(Grid grid) { // set lower boundary conditions for the neutrals //---------------------------------------------------------------------- -bool Neutrals::set_lower_bcs(Grid grid, +bool Neutrals::set_lower_bcs(Grid &grid, Times time, Indices indices) { @@ -261,7 +261,7 @@ bool Neutrals::set_lower_bcs(Grid grid, // iDir = 3 -> -y //---------------------------------------------------------------------- -bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid grid) { +bool Neutrals::set_horizontal_bcs(int64_t iDir, Grid &grid) { std::string function = "Neutrals::set_horizontal_bcs"; static int iFunction = -1; diff --git a/src/neutrals_energy.cpp b/src/neutrals_energy.cpp index 893ab86e..7bc503a5 100644 --- a/src/neutrals_energy.cpp +++ b/src/neutrals_energy.cpp @@ -7,7 +7,7 @@ // Calculate thermal conduction // --------------------------------------------------------------------------- -void Neutrals::update_temperature(Grid grid, Times time) { +void Neutrals::update_temperature(Grid &grid, Times time) { std::string function = "Neutrals::calc_conduction"; static int iFunction = -1; diff --git a/src/neutrals_ics.cpp b/src/neutrals_ics.cpp index 225eeb19..07f60762 100644 --- a/src/neutrals_ics.cpp +++ b/src/neutrals_ics.cpp @@ -19,7 +19,7 @@ // file and fill with hydrostatic. // ----------------------------------------------------------------------------- -bool Neutrals::initial_conditions(Grid grid, +bool Neutrals::initial_conditions(Grid &grid, Times time, Indices indices) { diff --git a/src/neutrals_momentum_viscosity.cpp b/src/neutrals_momentum_viscosity.cpp index 4efaaaee..200128b4 100644 --- a/src/neutrals_momentum_viscosity.cpp +++ b/src/neutrals_momentum_viscosity.cpp @@ -7,7 +7,7 @@ // Calculate viscosity // --------------------------------------------------------------------------- -void Neutrals::update_horizontal_velocity(Grid grid, Times time) { +void Neutrals::update_horizontal_velocity(Grid &grid, Times time) { std::string function = "Neutrals::update_horizontal_velocity"; static int iFunction = -1; diff --git a/src/solver_vertical_rusanov.cpp b/src/solver_vertical_rusanov.cpp index 8027cd94..545a8428 100644 --- a/src/solver_vertical_rusanov.cpp +++ b/src/solver_vertical_rusanov.cpp @@ -187,7 +187,7 @@ void calc_grad_and_diff_alts_rusanov(Grid &grid, // // -------------------------------------------------------------------------- -void Neutrals::solver_vertical_rusanov(Grid grid, +void Neutrals::solver_vertical_rusanov(Grid &grid, Times time) { std::string function = "Neutrals::solver_vertical_rusanov"; @@ -436,7 +436,7 @@ void Neutrals::solver_vertical_rusanov(Grid grid, // // -------------------------------------------------------------------------- -void Ions::solver_vertical_rusanov(Grid grid, +void Ions::solver_vertical_rusanov(Grid &grid, Times time) { std::string function = "Ions::solver_vertical_rusanov"; From dfcc27d2224f70d1adc0c43ff29727f4dc64dddf Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Nov 2025 15:40:27 -0500 Subject: [PATCH 687/691] DOC: added more comments --- src/quadtree.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/quadtree.cpp b/src/quadtree.cpp index bcc2c707..832e5a78 100644 --- a/src/quadtree.cpp +++ b/src/quadtree.cpp @@ -1,12 +1,17 @@ // Copyright 2024, the Aether Development Team (see doc/dev_team.md for members) // Full license can be found in License.md -// Need to allow more types of grids. We have two axes of grids, really: -// - Neutral -// - Ion -// Within each of those, we can have several types of grids: +// The way that the quadtree works is that you start with a given number of +// root nodes. When the user wants higher resolution, they as for 4 times +// more processors, and then each root node is broken into 4. If 16 times +// more processors are asked for, then those 4 nodes are each broken into +// 4 more nodes. This goes on for as many processors as the user would like, +// but the processors has to equal nRootNodes * 4^depth +// +// The following grid shapes are suppored at this time: // - Cubesphere, this has 6 root nodes (2 polar, 4 equatorial) // - Sphere, this has 1 root node (whole grid) +// - Sphere4, this is a spherical grid, but has 4 root nodes (2 lats, 2 lons) // - Sphere6, this is a spherical grid, but has 6 root nodes (2 lats, 3 lons) // - Dipole4, which has 4 root nodes (4 lats, 1 lon) // - Dipole6, which has 4 root nodes (6 lats, 1 lon) @@ -80,6 +85,10 @@ void Quadtree::build(std::string gridtype) { Inputs::grid_input_struct grid_input = input.get_grid_inputs(gridtype); + // Here we are taking the shape and getting the sizes and positions + // of the root nodes. These are defined in the different header files + // such as sphere.h, cubesphere.h, and dipole.h + if (grid_input.shape == "cubesphere") { origins = CubeSphere::ORIGINS; rights = CubeSphere::RIGHTS; @@ -128,6 +137,7 @@ void Quadtree::build(std::string gridtype) { IsOk = true; } + // If we can't find the shape, then there is a big problem if (!IsOk) { report.error("quadtree shape not found (in build): " + grid_input.shape); report.exit(function); @@ -158,6 +168,9 @@ void Quadtree::build(std::string gridtype) { // Before we build the quadtree, we need to allow the user to // restrict the domain. This will only work for the spherical // grid so far: + // (as programmed, this should work ok for the sphere and + // dipole shapes, but will never work for cubesphere. For the + // cubesphere grid, it is much more complicated.) if ((grid_input.lon_min > 0.0 || grid_input.lon_max < 2.0 * cPI || @@ -414,7 +427,14 @@ int64_t Quadtree::find_point(arma_vec point, Quadtree::qtnode node) { } // -------------------------------------------------------------------------- -// +// This takes a normalized point, figures out if it is beyond the limits +// of the root node, and if it is, then moves the coordinates onto the other +// node. +// This is pretty much useful for the CubeSphere, since when you go over +// the edge of one side, you are technically then on another side. This can +// happen on the sphere also, when you go across the 0/360 line (or 0/2 line +// in normalized coordinates). If can aslo happen at the poles when you go +// over the pole. // -------------------------------------------------------------------------- arma_vec Quadtree::wrap_point_sphere(arma_vec point) { @@ -467,7 +487,8 @@ arma_vec Quadtree::wrap_point_sphere(arma_vec point) { } // -------------------------------------------------------------------------- -// +// Well, ok - the above wrap_point seems to only work for the sphere and +// dipole shape, which this is specially designed for the cubesphere // -------------------------------------------------------------------------- arma_vec Quadtree::wrap_point_cubesphere(arma_vec point) { From ce0ab93bb82a11d7545ba95afe2783446831d443 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Nov 2025 15:43:47 -0500 Subject: [PATCH 688/691] updated file --- tests/restart_cubesphere/aether.whole.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/restart_cubesphere/aether.whole.json b/tests/restart_cubesphere/aether.whole.json index 8a70fef8..7e683f29 100644 --- a/tests/restart_cubesphere/aether.whole.json +++ b/tests/restart_cubesphere/aether.whole.json @@ -15,8 +15,6 @@ "Electrodynamics" : { "File" : "UA/inputs/b20110320n_omni.bin"}, - "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], - "CubeSphere" : { "is" : true}, From a0ee54ecd0fc8957994b5e80c268fc7edb6a47ea Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Nov 2025 15:58:34 -0500 Subject: [PATCH 689/691] STY: astyle, yo --- include/advance.h | 30 +++++++------- include/aurora.h | 20 +++++----- include/bfield.h | 6 +-- include/calc_euv.h | 16 ++++---- include/calc_grid_derived.h | 6 +-- include/chemistry.h | 12 +++--- include/collisions.h | 2 +- include/electrodynamics.h | 74 +++++++++++++++++------------------ include/euv.h | 46 +++++++++++----------- include/external_msis.h | 24 ++++++------ include/file_input.h | 8 ++-- include/init_mag_grid.h | 4 +- include/inputs.h | 10 ++--- include/logfile.h | 18 ++++----- include/output.h | 46 +++++++++++----------- include/parallel.h | 30 +++++++------- include/quadtree.h | 40 +++++++++---------- include/read_collision_file.h | 18 ++++----- include/read_indices_files.h | 6 +-- include/report.h | 22 +++++------ include/sizes.h | 2 +- include/test.h | 3 +- include/times.h | 22 +++++------ include/transform.h | 23 ++++++----- src/calc_ion_drift.cpp | 4 +- src/calc_ion_temperature.cpp | 15 ++++--- src/chemistry.cpp | 38 ++++++++++-------- src/grid_spacing.cpp | 16 +++++--- src/solver_conduction.cpp | 7 ++-- 29 files changed, 291 insertions(+), 277 deletions(-) diff --git a/include/advance.h b/include/advance.h index 0f906b8c..1f287c4b 100644 --- a/include/advance.h +++ b/include/advance.h @@ -33,20 +33,20 @@ bool advance(Planets &planet, - Grid &gGrid, - Grid &mGrid, - Times &time, - Euv &euv, - Neutrals &neutrals, - Neutrals &neutralsMag, - Ions &ions, - Ions &ionsMag, - Chemistry &chemistry, - Chemistry &chemistryMag, - Electrodynamics &electrodynamics, - Electrodynamics &electrodynamicsMag, - Indices &indices, - Logfile &logfile, - Logfile &logfileMag); + Grid &gGrid, + Grid &mGrid, + Times &time, + Euv &euv, + Neutrals &neutrals, + Neutrals &neutralsMag, + Ions &ions, + Ions &ionsMag, + Chemistry &chemistry, + Chemistry &chemistryMag, + Electrodynamics &electrodynamics, + Electrodynamics &electrodynamicsMag, + Indices &indices, + Logfile &logfile, + Logfile &logfileMag); #endif // INCLUDE_ADVANCE_H_ diff --git a/include/aurora.h b/include/aurora.h index 75889cc9..85cb0873 100644 --- a/include/aurora.h +++ b/include/aurora.h @@ -12,16 +12,16 @@ **/ void read_aurora(Neutrals &neutrals, - Ions &ions); + Ions &ions); arma_vec calculate_fang(float eflux, // in ergs/cm2/s - float avee, // in keV - float Ebin, // eV - arma_vec rhoH, - std::vector Ci, - float dE, // eV - arma_vec H, - bool DoDebug); + float avee, // in keV + float Ebin, // eV + arma_vec rhoH, + std::vector Ci, + float dE, // eV + arma_vec H, + bool DoDebug); /********************************************************************** * brief Read in a file containing information about splitting ionization @@ -32,7 +32,7 @@ arma_vec calculate_fang(float eflux, // in ergs/cm2/s **/ void calc_aurora(Grid grid, - Neutrals &neutrals, - Ions &ions); + Neutrals &neutrals, + Ions &ions); #endif // INCLUDE_AURORA_H_ diff --git a/include/bfield.h b/include/bfield.h index df64fac8..a7535f2c 100644 --- a/include/bfield.h +++ b/include/bfield.h @@ -11,18 +11,18 @@ struct bfield_info_type { }; arma_vec get_magnetic_pole(int IsNorth, - Planets planet); + Planets planet); bfield_info_type get_bfield(precision_t lon, precision_t lat, precision_t alt, - bool DoDebug, + bool DoDebug, Planets planet); bfield_info_type get_dipole(precision_t lon, precision_t lat, precision_t alt, - bool DoDebug, + bool DoDebug, Planets planet); #endif // INCLUDE_BFIELD_H_ diff --git a/include/calc_euv.h b/include/calc_euv.h index 561930a2..83b3509c 100644 --- a/include/calc_euv.h +++ b/include/calc_euv.h @@ -21,16 +21,16 @@ // ------------------------------------------------------------------------- bool calc_euv(Planets planet, - Grid grid, - Times time, - Euv &euv, - Neutrals &neutrals, - Ions &ions, - Indices indices); + Grid grid, + Times time, + Euv &euv, + Neutrals &neutrals, + Ions &ions, + Indices indices); void calc_ionization_heating(Euv euv, - Neutrals &neutrals, - Ions &ions); + Neutrals &neutrals, + Ions &ions); #endif // INCLUDE_CALC_EUV_H_ diff --git a/include/calc_grid_derived.h b/include/calc_grid_derived.h index 28d5237f..98c22be0 100644 --- a/include/calc_grid_derived.h +++ b/include/calc_grid_derived.h @@ -7,7 +7,7 @@ #include // ---------------------------------------------------------------------------- -// +// // ---------------------------------------------------------------------------- std::vector calc_bin_edges(std::vector centers); @@ -19,8 +19,8 @@ arma_vec calc_bin_widths(arma_vec centers); // ---------------------------------------------------------------------------- // A helper function for mapping grids // ---------------------------------------------------------------------------- -bool grid_match(Grid gGrid, - Grid mGrid, +bool grid_match(Grid gGrid, + Grid mGrid, Quadtree gQuadtree, Quadtree mQuadtree); diff --git a/include/chemistry.h b/include/chemistry.h index 118d0189..eef015c5 100644 --- a/include/chemistry.h +++ b/include/chemistry.h @@ -72,7 +72,7 @@ class Chemistry { /// type of formula to use for reaction rate: int type; /// name of the reaction - std::string name; + std::string name; }; @@ -93,12 +93,12 @@ class Chemistry { Ions &ions); private: - bool search(std::string name, - json &headers, + bool search(std::string name, + json &headers, std::vector &error); - bool check_chemistry_file(json &headers, - std::vector> csv, + bool check_chemistry_file(json &headers, + std::vector> csv, Report &report); int read_chemistry_file(Neutrals neutrals, @@ -107,7 +107,7 @@ class Chemistry { reaction_type interpret_reaction_line(const Neutrals &neutrals, const Ions &ions, const std::vector &line, - const json &headers); + const json &headers); void find_species_id(const std::string &name, const Neutrals &neutrals, diff --git a/include/collisions.h b/include/collisions.h index 1a59a19c..98b1173c 100644 --- a/include/collisions.h +++ b/include/collisions.h @@ -11,6 +11,6 @@ #include "ions.h" void calc_ion_neutral_coll_freq(Neutrals &neutrals, - Ions &ions); + Ions &ions); #endif // INCLUDE_COLLISIONS_H_ diff --git a/include/electrodynamics.h b/include/electrodynamics.h index 13a631ab..40cd5555 100644 --- a/include/electrodynamics.h +++ b/include/electrodynamics.h @@ -54,7 +54,7 @@ class Electrodynamics { This does the following: - initialize all variables to missing values - - read in file if it exists + - read in file if it exists **/ Electrodynamics(Times time); @@ -66,12 +66,12 @@ class Electrodynamics { \param time need current time \param ions Going to set the potential and aurora **/ - + bool update(Planets planet, - Grid gGrid, - Times time, - Indices &indices, - Ions &ions); + Grid gGrid, + Times time, + Indices &indices, + Ions &ions); /************************************************************** @@ -85,7 +85,7 @@ class Electrodynamics { **/ bool check_times(double inputStartTime, double inputEndTime); - + /************************************************************** \brief used in advance.cpp to get potential, eflux, avee @@ -95,9 +95,9 @@ class Electrodynamics { **/ std::tuple get_electrodynamics(arma_cube magLat, - arma_cube magLocalTime); + arma_mat, + arma_mat> get_electrodynamics(arma_cube magLat, + arma_cube magLocalTime); /************************************************************** \brief Gets interpolation indices @@ -105,7 +105,7 @@ class Electrodynamics { Performs 2d interpolation over search vector to get indices \param vals the 2d array that needs indices - \param search The vector of values to interpolate over + \param search The vector of values to interpolate over **/ arma_mat get_interpolation_indices(arma_mat vals, arma_vec search); @@ -121,7 +121,7 @@ class Electrodynamics { \param time the time requested. **/ - + void set_time(double time); /************************************************************** @@ -195,7 +195,7 @@ class Electrodynamics { \param value Value to assign to Kp index **/ void set_kp(precision_t value); - + /************************************************************** \brief Get 2D electric potential on specified grid @@ -209,7 +209,7 @@ class Electrodynamics { with the potentials in the grids **/ arma_cube get_potential(arma_cube magLat, - arma_cube magLocalTime); + arma_cube magLocalTime); /************************************************************** \brief Get 2D electron energy flux on specified grid @@ -266,13 +266,13 @@ class Electrodynamics { with the ion avee in the grids **/ arma_mat get_ion_avee(); - + /********************************************************************** \brief Check to see if internal state of class is ok **/ - + bool is_ok(); - + private: /// This is the interpolation method for time: @@ -284,7 +284,7 @@ class Electrodynamics { /// Use the next value: const int iNext_ = 2; // Use the closest value: - const int iClosest_ = 3; + const int iClosest_ = 3; /// Interpolate: const int iInterp_ = 4; @@ -307,7 +307,7 @@ class Electrodynamics { /// A 2d array of magnetic local times needed. Can set interpolation /// coefficients in all of the grids when this is called: arma_mat mlts_needed; - + /// These are all indices that may be needed by sub-models: precision_t imf_bx_needed; precision_t imf_by_needed; @@ -340,11 +340,11 @@ class Electrodynamics { /// If we don't read in an electrodynamics file, then this should be /// set to an auroral model to use. Need to add model types. std::string auroral_model_to_use; - + /// Set the interpolation indices as a float. For each interpolation index, - /// the integer portion is the current index, and the decimal part is the + /// the integer portion is the current index, and the decimal part is the /// percentage of the distance between the current index and the next - /// index. For example, a distance midway between index 45 and 46 + /// index. For example, a distance midway between index 45 and 46 /// would give an interpolation index of 45.5. /// For time, we are assuming that all grids have the same times or that /// there are no overlaps in time, I think. @@ -378,22 +378,22 @@ class Electrodynamics { /// Potential at current time: arma_mat potential_current; - + /// Vector of 2d electron energy flux (in ergs/cm2/s): std::vector energy_flux; /// Said energy flux at the current time: arma_mat energy_flux_current; - + /// Vector of 2d electron average energy (in keV): std::vector average_energy; /// Average energy at current time: arma_mat average_energy_current; - + /// Vector of 2d ion energy flux (in ergs/cm2/s): std::vector ion_energy_flux; /// ion energy flux at current time: arma_mat ion_energy_flux_current; - + /// Vector of 2d ion average energy (in keV): std::vector ion_average_energy; /// ion average energy at current time: @@ -401,7 +401,7 @@ class Electrodynamics { /// Set to 1 if ion precipitation is included, else set to 0: int DoesIncludeIonPrecip; - + /// This sets the priority of the grid. The higher the number, the /// more important it is, so it should overwrite any regions of /// a lower priority grid. For example, you could have a global @@ -419,28 +419,28 @@ class Electrodynamics { /// is outside of the mlt range of the grid, then the /// interpolation index should be set to -1: arma_mat mlts_indices; - + }; - + /// As described above, a structure containing the grid-based /// values of electrodynamics as a function of time. This is /// vector, because we can have nested grids, or, in theory, the /// grid could change as a function of time. You can then search /// for the apropriate grid in space and time. std::vector input_electrodynamics; - + /// Because each grid has a priority, we need to go through them in /// priority order, this is the sorted indices list, so that /// grid_order[0] points to the input_electrodynamics with the /// lowest priority, grid_order[1] points to the 2nd lowest, etc. std::vector grid_order; - + /// Number of input grids for electrodynamics: int nElectrodynamicsGrids; - + /// An internal variable to hold the state of the class bool IsOk; - + /************************************************************** \brief Reads a netcdf file that has the electrodynamics specification @@ -469,13 +469,13 @@ class Electrodynamics { grids, so that the values are overwritten. To keep it "functional", we pass in the last round of values and those are moved into the output values and then the overlapping region is - overwritten (e.g., in the get_potential function, the + overwritten (e.g., in the get_potential function, the grids need to be cycled through calling get_values with the potential on that grid and the interpolation indices for the grid. \param values_current the pot/eflux/avee/etc from input_electrodynamics grid - + \param lats_indices the interpolation indices for the current grid latitudes @@ -483,8 +483,8 @@ class Electrodynamics { grid mlts \param values_old the output of this function for the last grid - **/ - + **/ + arma_mat get_values(arma_mat matToInterpolateOn, int rows, int cols); void set_all_indices_for_ie(Times time, Indices &indices); diff --git a/include/euv.h b/include/euv.h index 138e74f3..a9dd826d 100644 --- a/include/euv.h +++ b/include/euv.h @@ -8,7 +8,7 @@ * \class Euv * * \brief Defines the Extreme Ultraviolet radiation above the atmosphere - * + * * The Euv class defines the EUV environment above the atmosphere. It * does this through the use of a CSV file that contains a bunch of * information. Namely: @@ -18,7 +18,7 @@ * * \author Aaron Ridley * - * \date 2021/03/28 + * \date 2021/03/28 * **************************************************************/ @@ -27,12 +27,12 @@ class Euv { -public: + public: /// whether to actuall use euv at all: bool doUse; - - /// number of wavelengths in spectrum: + + /// number of wavelengths in spectrum: int nWavelengths; // number of lines in the EUV CSV file: @@ -59,10 +59,10 @@ class Euv { /// EUV Spectrum, lower wavelength of the bins: std::vector wavelengths_short; - + /// EUV Spectrum, upper wavelength of the bins: std::vector wavelengths_long; - + /// EUV Spectrum, energy of bin: std::vector wavelengths_energy; @@ -81,7 +81,7 @@ class Euv { std::vector solomon_hfg_c1; std::vector solomon_hfg_c2; std::vector solomon_hfg_fref; - + /// NEUVAC model linear coefficients (1-3): std::vector neuvac_s1; std::vector neuvac_s2; @@ -93,7 +93,7 @@ class Euv { /// NEUVAC model intercept: std::vector neuvac_int; - + // -------------------------------------------------------------------- // Functions: @@ -109,13 +109,13 @@ class Euv { **/ bool euvac(Times time, Indices indices); - /********************************************************************** - \brief Compute the EUV spectrum given F107 and F107a - \param time The times within the model (dt is needed) - \param indices Need the F107 and F107a - **/ - bool solomon_hfg(Times time, Indices indices); - + /********************************************************************** + \brief Compute the EUV spectrum given F107 and F107a + \param time The times within the model (dt is needed) + \param indices Need the F107 and F107a + **/ + bool solomon_hfg(Times time, Indices indices); + /********************************************************************** \brief Compute the EUV spectrum given F107 and F107a (new version) \param time The times within the model (dt is needed) @@ -135,7 +135,7 @@ class Euv { Reads through each row in the EUV CSV file and figures out whether the row is abs, ion, diss, and then figures out which neutral it is - acting on and which neutral or ion results from the action + acting on and which neutral or ion results from the action (e.g. O + photon -> O+, identifies O as ionization "loss" and O+ as an ionization "source") @@ -147,16 +147,16 @@ class Euv { /********************************************************************** \brief Check to see if internal state of class is ok **/ - + bool is_ok(); - -private: + + private: /********************************************************************** \brief Read in the EUV CSV file Read in the EUV CSV file that describes all of the wavelengths and - cross sections (and any other EUV - related things that are a + cross sections (and any other EUV - related things that are a function of wavelength) **/ bool read_file(); @@ -172,8 +172,8 @@ class Euv { \return values The values in the CSV row that matches the item (and item2) **/ bool slot_euv(std::string item, - std::string item2, - std::vector &values); + std::string item2, + std::vector &values); /// An internal variable to hold the state of the class bool IsOk; diff --git a/include/external_msis.h b/include/external_msis.h index d6285456..764557c5 100644 --- a/include/external_msis.h +++ b/include/external_msis.h @@ -8,13 +8,13 @@ * \class Msis * * \brief create an interface to the msis model - * + * * MSIS is a neutral model of the atmosphere, written in - * fortran and provided by NRL. + * fortran and provided by NRL. * * \author Aaron Ridley * - * \date 2023/04/30 + * \date 2023/04/30 * **************************************************************/ @@ -27,20 +27,20 @@ class Msis { bool set_f107(precision_t f107in, precision_t f107ain); bool set_ap(precision_t apin); bool set_locations(arma_vec longitude, - arma_vec latitude, - arma_vec altitude); + arma_vec latitude, + arma_vec altitude); bool set_locations(arma_mat longitude, - arma_mat latitude, - arma_mat altitude); + arma_mat latitude, + arma_mat altitude); bool set_locations(arma_cube longitude, - arma_cube latitude, - arma_cube altitude); + arma_cube latitude, + arma_cube altitude); arma_vec get_vec(std::string value); arma_mat get_mat(std::string value); arma_cube get_cube(std::string value); bool is_valid_species(std::string value); bool is_ok(); - + private: int iYear, iDay; @@ -54,10 +54,10 @@ class Msis { arma_cube altKm; std::vector msis_results; - bool didChange = true; + bool didChange = true; json value_lookup; bool isCompiled; - + bool reset_interface_variable_sizes(); bool reset_results(); }; diff --git a/include/file_input.h b/include/file_input.h index 460a6fe6..ee127f7e 100644 --- a/include/file_input.h +++ b/include/file_input.h @@ -31,9 +31,9 @@ std::vector> read_csv(std::ifstream &file_ptr); \param csvLines a matrix of strings **/ json put_csv_in_json_w_name(std::vector> - csvLines); + csvLines); json put_csv_in_json_wo_name(std::vector> - csvLines); + csvLines); /************************************************************** @@ -46,8 +46,8 @@ std::vector> read_ssv(std::ifstream &file_ptr); /************************************************************** \brief Reads either a comma-separated time or series of lines describing time - format is either - y, m, d, h, m, s, ms + format is either + y, m, d, h, m, s, ms or y m diff --git a/include/init_mag_grid.h b/include/init_mag_grid.h index b1af1f4c..415978a1 100644 --- a/include/init_mag_grid.h +++ b/include/init_mag_grid.h @@ -13,12 +13,12 @@ bool init_dipole_grid(Grid &mGrid, Planets planet); // Analytic solution to get from q,p dipole coords to r,theta // q coordinate along b-field line -// p l-shell +// p l-shell // return (r,theta) std::pair qp_to_r_theta(precision_t q, precision_t p); // convert mag to geographic -std::vector mag_to_geo(arma_cube magLon, +std::vector mag_to_geo(arma_cube magLon, arma_cube magLat, arma_cube magAlt, Planets planet); diff --git a/include/inputs.h b/include/inputs.h index ce273f76..7c48dbf1 100644 --- a/include/inputs.h +++ b/include/inputs.h @@ -607,12 +607,12 @@ class Inputs { **/ std::vector get_satellite_dts(); - /********************************************************************** - \brief returns settings[" - \param - **/ + /********************************************************************** + \brief returns settings[" + \param + **/ json get_tests(); - + // General get_setting functions with error checks: /********************************************************************** diff --git a/include/logfile.h b/include/logfile.h index 1fe19d5d..f413a209 100644 --- a/include/logfile.h +++ b/include/logfile.h @@ -5,7 +5,7 @@ #define INCLUDE_LOGFILE_H_ /************************************************************** - * + * * logfile.h: * * Write the logfile @@ -19,7 +19,7 @@ /** * The class Satellite is used to track the satellites * Given any time, the user can obtain the geographic location of the satellite - * + * * ASSUMPTION : The satellite csv layout is the same as the following * year mon day hr min sec lon lat alt x y z vx vy vz * (int) (int) (int) (int) (int) (int) (degree) (degree) (km) (km) (km) (km) (km/s) (km/s) (km/s) @@ -27,11 +27,11 @@ class Satellite { -public: + public: /** * \brief Initialize the satellite class - * The name of the satellite is not allowed to have any characters which can + * The name of the satellite is not allowed to have any characters which can * terminate the read of a string including white space' ', endline'\n', and '\t' * Different satellites must have different names (not only input file names) * \param csv_in The path to the satellite csv file @@ -69,7 +69,7 @@ class Satellite { // DEBUG void print(); -private: + private: // The name of the satellite std::string name; @@ -93,7 +93,7 @@ class Satellite { class Logfile { -public: + public: /** * \brief Initialize the Logfile. @@ -101,7 +101,7 @@ class Logfile { * every dt time. */ Logfile(Indices &indices, int64_t iLog); - + /** * \brief Close the file stream if not append */ @@ -117,7 +117,7 @@ class Logfile { Grid &gGrid, Times &time); -private: + private: // The name of logfile std::string logfileName; @@ -133,7 +133,7 @@ class Logfile { bool doAppend; // A randomly chosen point for test - std::vector lla {2,2,2}; + std::vector lla {2, 2, 2}; }; #endif // INCLUDE_LOGFILE_H_ diff --git a/include/output.h b/include/output.h index d6503984..2dc3d7cd 100644 --- a/include/output.h +++ b/include/output.h @@ -9,7 +9,7 @@ /************************************************************** * \class Output * \brief A containing to allow storage of variables for output - * + * * Writing output is a multi-step process now: * 1. Create a container to store the variables you want to output * 2. Define the variables to output within the container @@ -17,13 +17,13 @@ * 4. Write the output * * \author Aaron Ridley - * \date 2021/10/21 + * \date 2021/10/21 **************************************************************/ class OutputContainer { public: - + /********************************************************************** \brief initialize the output container **/ @@ -63,8 +63,8 @@ class OutputContainer { \param value the array of the data to output **/ void store_variable(std::string name, - std::string unit, - arma_cube value); + std::string unit, + arma_cube value); /********************************************************************** \brief store a variable to the list of variables to output @@ -74,9 +74,9 @@ class OutputContainer { \param value the array of the data to output **/ void store_variable(std::string name, - std::string long_name, - std::string unit, - arma_cube value); + std::string long_name, + std::string unit, + arma_cube value); /********************************************************************** \brief Get an arma_cube from the Container @@ -129,12 +129,12 @@ class OutputContainer { \brief write a file with the information in the container **/ bool write(); - + /********************************************************************** \brief write a json header file with the information in the container **/ bool write_container_header(); - + /********************************************************************** \brief write a binary file with the information in the container **/ @@ -149,27 +149,27 @@ class OutputContainer { \brief write a netcdf file with the information in the container **/ bool write_container_netcdf(); - + /********************************************************************** \brief read from a file an load into the container **/ bool read(); - + /********************************************************************** \brief display information contained in the container **/ void display(); - + /********************************************************************** \brief read a netcdf file - put the information in the container **/ bool read_container_netcdf(); - + /********************************************************************** - \brief clears the vector of variables + \brief clears the vector of variables **/ void clear_variables(); - + private: /// User can set the directory for output @@ -206,7 +206,7 @@ class OutputContainer { /// The frequency of the output for this particular container: float dt_output; - + /// This is to allow the user to select different output formats int output_type; @@ -214,7 +214,7 @@ class OutputContainer { const int binary_type = 0; const int netcdf_type = 1; const int hdf5_type = 2; - + }; /********************************************************************** @@ -238,12 +238,12 @@ class OutputContainer { **/ bool output(const Neutrals &neutrals, - const Ions &ions, - Grid &grid, - Times time, - const Planets &planet); + const Ions &ions, + Grid &grid, + Times time, + const Planets &planet); void output_binary_3d(std::ofstream &binary, - arma_cube value); + arma_cube value); #endif // INCLUDE_OUTPUT_H_ diff --git a/include/parallel.h b/include/parallel.h index 11372be3..1a363569 100644 --- a/include/parallel.h +++ b/include/parallel.h @@ -4,7 +4,7 @@ #ifndef INCLUDE_PARALLEL_H_ #define INCLUDE_PARALLEL_H_ -/// Need MPI (message passing interface) to do parallel stuff: +/// Need MPI (message passing interface) to do parallel stuff: #include "mpi.h" /// number of processors in whole simulation @@ -51,10 +51,10 @@ bool init_parallel(Quadtree &quadtree, Quadtree &quadtree_ion); **/ bool pack_border(const arma_cube &value, - precision_t *packed, - int64_t *iCounter, - int64_t nG, - int iDir); + precision_t *packed, + int64_t *iCounter, + int64_t nG, + int iDir); /********************************************************************** \brief Unpack variable buffer after message pass @@ -72,16 +72,16 @@ bool pack_border(const arma_cube &value, **/ bool unpack_border(arma_cube &value, - precision_t *packed, - int64_t *iCounter, - int64_t nG, - int iDir, - bool DoReverseX, - bool DoReverseY, - bool XbecomesY); + precision_t *packed, + int64_t *iCounter, + int64_t nG, + int iDir, + bool DoReverseX, + bool DoReverseY, + bool XbecomesY); /********************************************************************** - \brief initialize the grid variables to set up ghostcell message passing + \brief initialize the grid variables to set up ghostcell message passing \param grid the grid to set up message passing on \param nVarsToPass how many variables to pass **/ @@ -96,8 +96,8 @@ bool exchange_sides_init(Grid &grid, int64_t nVarsToPass); **/ bool exchange_one_var(Grid &grid, - arma_cube &var_to_pass, - bool doReverseSignAcrossPole); + arma_cube &var_to_pass, + bool doReverseSignAcrossPole); /********************************************************************** \brief test the exchange messages one var function diff --git a/include/quadtree.h b/include/quadtree.h index 18b584c7..d098efcc 100644 --- a/include/quadtree.h +++ b/include/quadtree.h @@ -9,14 +9,14 @@ /************************************************************** * \class Quadtree * - * \brief Defines the quadtree for blocks - * + * \brief Defines the quadtree for blocks + * * Aether is logically an i, j, k grid structure. Aether does domain * decomposition on the (i, j) coordinates and each processor works on * the full domain of the k dimension. (e.g., nn spherical * coordinates, i = longitude, j = latitude, and k = altitude.) The * quadtree takes the (i, j) dimensions and makes blocks out of them. - * + * * In the quadtree there are a number of root nodes, which are then * divided into 2 x 2 blocks. Each of those can then be subdivided * into 2 x 2 blocks. Each block resides on a separate processor. @@ -32,13 +32,13 @@ * * \author Aaron Ridley * - * \date 2022/07/05 + * \date 2022/07/05 * **************************************************************/ class Quadtree { -public: + public: /// number of blocks in each direction: const uint64_t nLR = 2; @@ -86,7 +86,7 @@ class Quadtree { /// Number of root nodes: int64_t nRootNodes; - + /// The quadtree root nodes: std::vector root_nodes; @@ -98,7 +98,7 @@ class Quadtree { arma_vec limit_high = {0.0, 0.0, 0.0}; /// For the given processor, the side that it is on: uint64_t iSide = -1; - + /********************************************************************** \brief Initializes the quadtree **/ @@ -107,7 +107,7 @@ class Quadtree { /********************************************************************** \brief Builds the quadtree **/ - void build(std::string gridtype); + void build(std::string gridtype); /********************************************************************** \brief Makes a new node on the quadtree, recursively @@ -119,18 +119,18 @@ class Quadtree { \param iSide basically the root node, or the side of the cubesphere **/ qtnode new_node(arma_vec lower_left_norm_in, - arma_vec size_right_norm_in, - arma_vec size_up_norm_in, - uint64_t &iProc_in_out, - uint64_t depth_in, - uint64_t iSide); + arma_vec size_right_norm_in, + arma_vec size_up_norm_in, + uint64_t &iProc_in_out, + uint64_t depth_in, + uint64_t iSide); /********************************************************************** \brief Get different vectors from the node \param node which node to get the vector from \param which defines the vector to get: LL = lower left; - SR = size in the right/left direction; + SR = size in the right/left direction; SU = size in the up/down direction; MID = mid point of the node; **/ @@ -154,26 +154,26 @@ class Quadtree { int64_t find_root(arma_vec point); /********************************************************************** - \brief If the point is outside of the normalized limits of the + \brief If the point is outside of the normalized limits of the quadtree, this tries to put the point back into the domain \param point the x, y, z normalized coordinate of the point. **/ arma_vec wrap_point_sphere(arma_vec point); /********************************************************************** - \brief If the point is outside of the normalized limits of the + \brief If the point is outside of the normalized limits of the quadtree, this tries to put the point back into the domain \param point the x, y, z normalized coordinate of the point. **/ arma_vec wrap_point_cubesphere(arma_vec point); - + /********************************************************************** \brief Check to see if internal state of class is ok **/ - + bool is_ok(); -private: + private: /// Defines whether the quadtree state is ok: bool IsOk = true; @@ -183,7 +183,7 @@ class Quadtree { bool IsCubeSphere = false; /// Defines whether the quadtree is a dipole or not: bool IsDipole = false; - + }; #endif // INCLUDE_QUADTREE_H_ diff --git a/include/read_collision_file.h b/include/read_collision_file.h index 64a9fb91..a11d1c85 100644 --- a/include/read_collision_file.h +++ b/include/read_collision_file.h @@ -7,27 +7,27 @@ #include "../include/aether.h" void read_collision_file(Neutrals &neutrals, - Ions &ions); + Ions &ions); void parse_nu_in_table(std::vector> csv, - Neutrals &neutrals, - Ions &ions); + Neutrals &neutrals, + Ions &ions); void parse_resonant_nu_in_table(std::vector> csv, - Neutrals &neutrals, - Ions &ions); + Neutrals &neutrals, + Ions &ions); void parse_bst_in_table(std::vector> csv, - Neutrals &neutrals, - Ions &ions); + Neutrals &neutrals, + Ions &ions); void parse_diffexp_in_table(std::vector> csv, - Neutrals &neutrals); + Neutrals &neutrals); void parse_diff0_in_table(std::vector> csv, Neutrals &neutrals); void check_collision_frequncies(Ions ions, - Neutrals neutrals); + Neutrals neutrals); #endif // INCLUDE_COLLISION_FILE_H_ diff --git a/include/read_indices_files.h b/include/read_indices_files.h index bd20e2f1..52bd6449 100644 --- a/include/read_indices_files.h +++ b/include/read_indices_files.h @@ -17,7 +17,7 @@ /********************************************************************** \brief Reads in all of the indices files and stores them in Indices - This function goes through all of the input indices files and + This function goes through all of the input indices files and reads in the files, then stores the values into the Indices class. At this point, it can read in the following file types: 1. NGDC F10.7 files. @@ -32,7 +32,7 @@ bool read_and_store_indices(Indices &indices); \param f107_file the f10.7 file to read in **/ index_file_output_struct read_f107_file(std::string f107_file, - Indices indices); + Indices indices); /********************************************************************** \brief Read the OMNIWeb file format and store in the index_file struct @@ -40,7 +40,7 @@ index_file_output_struct read_f107_file(std::string f107_file, \param indices needed to get the indices index for each variable **/ index_file_output_struct read_omni_file(std::string omni_file, - Indices indices); + Indices indices); /********************************************************************** \brief This code compares a string to return the variable index diff --git a/include/report.h b/include/report.h index e29696eb..156a434d 100644 --- a/include/report.h +++ b/include/report.h @@ -28,11 +28,11 @@ class Report { -// ----------------------------------------------------------------------- -// Public functions and variables -// ----------------------------------------------------------------------- + // ----------------------------------------------------------------------- + // Public functions and variables + // ----------------------------------------------------------------------- -public: + public: // Functions: @@ -146,9 +146,9 @@ class Report { \param cFunctionName **/ void student_checker_function_name(bool isStudent, - std::string cStudentName, - int iFunctionNumber, - std::string cFunctionName); + std::string cStudentName, + int iFunctionNumber, + std::string cFunctionName); /************************************************************** \brief Starts timer and reports when entering a function, if applicable @@ -179,10 +179,10 @@ class Report { **/ void times(); -// ----------------------------------------------------------------------- -// Private functions and variables -// ----------------------------------------------------------------------- -private: + // ----------------------------------------------------------------------- + // Private functions and variables + // ----------------------------------------------------------------------- + private: /// global verbose level of the code int iVerbose; diff --git a/include/sizes.h b/include/sizes.h index ff10b6b2..5a02b9cb 100644 --- a/include/sizes.h +++ b/include/sizes.h @@ -7,7 +7,7 @@ // This is the file that defines the number of grid points in each // direction. The entire code is based on these numbers, so you need // to recompile if you change these numbers. -// +// // These are temporary and will eventually be removed. // This is for the geographic grid: diff --git a/include/test.h b/include/test.h index d6f9b287..3b021a68 100644 --- a/include/test.h +++ b/include/test.h @@ -9,7 +9,8 @@ // Gradient tests // Cubesphere is not done nor tested -bool test_gradient(Planets planet, Quadtree quadtree, json test_config, Grid gGrid, Grid mGrid); +bool test_gradient(Planets planet, Quadtree quadtree, json test_config, + Grid gGrid, Grid mGrid); bool test_gradient_cubesphere(Planets planet, Quadtree quadtree, Grid grid); bool test_gradient_ijk(Planets planet, Grid grid, bool debug); diff --git a/include/times.h b/include/times.h index f082f31e..12b891e0 100644 --- a/include/times.h +++ b/include/times.h @@ -5,7 +5,7 @@ #define INCLUDE_TIMES_H_ /************************************************************** - * + * * times.h: * * Functions that are assocuated with keeping track of time in @@ -20,7 +20,7 @@ class Times { -public: + public: /************************************************************** \brief Initialize the Times class @@ -61,7 +61,7 @@ class Times { \brief Sets the start, restart, and current times. This sets the start time, restart time, and current time to - the input time, and initializes iStep and dt, then calls + the input time, and initializes iStep and dt, then calls increment_time, which derives a bunch of other variables. \param itime year, month, day, hour, minute, second, millisecond vector @@ -161,21 +161,21 @@ class Times { \brief Get the current time as an array **/ std::vector get_iCurrent(); - + /************************************************************** \brief Get the current simulation time (sec since start) **/ double get_simulation_time(); - + /********************************************************************** \brief Read / Write restart files for time \param dir directory to write restart files \param DoRead read the restart files if true, write if false **/ - bool restart_file(std::string dir, bool DoRead); + bool restart_file(std::string dir, bool DoRead); + + private: -private: - // ------------------------------------------------------------- // These variables are for keeping track of the time. All in seconds // since reference time (except where noted). @@ -212,7 +212,7 @@ class Times { /// Universal time in hours precision_t ut; - + /// in weird JPL units precision_t orbittime; @@ -227,13 +227,13 @@ class Times { /// This is day of year (and NOT real Julian Day!) int jDay; - + /// This is Julian day double julian_day; /// represented as YYMMDD std::string sYMD; - + /// represented as HHMMSS std::string sHMS; diff --git a/include/transform.h b/include/transform.h index fe27f452..91b275cf 100644 --- a/include/transform.h +++ b/include/transform.h @@ -16,15 +16,15 @@ std::string mkupper(std::string inString); void copy_cube_to_array(arma_cube cube_in, precision_t *array_out); void copy_mat_to_array(arma_mat mat_in, - precision_t *array_out, - bool isFortran); + precision_t *array_out, + bool isFortran); void copy_array_to_mat(precision_t *array_in, arma_mat &mat_out, bool isFortran); void copy_vector_to_array(std::vector vector_in, - int64_t nElements, - precision_t *array_out); + int64_t nElements, + precision_t *array_out); // This is needed when sending strings to Fortran. // We do this by copying the ascii numbers into an integer array, @@ -34,13 +34,18 @@ int* copy_string_to_int(std::string inString); arma_cube calc_magnitude(std::vector xyz); std::vector transform_llr_to_xyz_3d(std::vector llr); std::vector transform_xyz_to_llr_3d(std::vector xyz); -std::vector rotate_around_x_3d(std::vector XYZ_in, precision_t angle); -std::vector rotate_around_y_3d(std::vector XYZ_in, precision_t angle); -std::vector rotate_around_z_3d(std::vector XYZ_in, precision_t angle); +std::vector rotate_around_x_3d(std::vector XYZ_in, + precision_t angle); +std::vector rotate_around_y_3d(std::vector XYZ_in, + precision_t angle); +std::vector rotate_around_z_3d(std::vector XYZ_in, + precision_t angle); void transform_llr_to_xyz(precision_t llr_in[3], precision_t xyz_out[3]); -void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, precision_t xyz_out[3]); -void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, precision_t xyz_out[3]); +void transform_rot_z(precision_t xyz_in[3], precision_t angle_in, + precision_t xyz_out[3]); +void transform_rot_y(precision_t xyz_in[3], precision_t angle_in, + precision_t xyz_out[3]); void transform_float_vector_to_array(std::vector input, precision_t output[3]); diff --git a/src/calc_ion_drift.cpp b/src/calc_ion_drift.cpp index 0cc9821a..19970f1a 100644 --- a/src/calc_ion_drift.cpp +++ b/src/calc_ion_drift.cpp @@ -26,11 +26,11 @@ void Ions::calc_efield(Grid grid) { // -------------------------------------------------------------------------- void Ions::calc_exb_drift(Grid grid) { - + std::string function = "Ions::calc_exb"; static int iFunction = -1; report.enter(function, iFunction); - + arma_cube bmag2 = (grid.bfield_mag_scgc) % (grid.bfield_mag_scgc); exb_vcgc = cross_product(efield_vcgc, grid.bfield_vcgc); diff --git a/src/calc_ion_temperature.cpp b/src/calc_ion_temperature.cpp index 42c5f5b1..72f6df5b 100644 --- a/src/calc_ion_temperature.cpp +++ b/src/calc_ion_temperature.cpp @@ -27,18 +27,17 @@ void Ions::init_ion_temperature(Neutrals neutrals, Grid grid) { temperature_scgc = neutrals.temperature_scgc; - // For electron temperature, we need to check if some species are present or not. + // For electron temperature, we need to check if some species are present or not. // Do this check now & warn if needed: if ((neutrals.get_species_id("O") == -1) - || (neutrals.get_species_id("O2") == -1) - ||(neutrals.get_species_id("N2") == -1)){ - if (input.get_do_photoelectron_heating() + || (neutrals.get_species_id("O2") == -1) + || (neutrals.get_species_id("N2") == -1)) { + if (input.get_do_photoelectron_heating() || input.get_do_ionization_heating() - || input.get_do_electron_neutral_elastic_collisional_heating()) { - report.error("Your electron temperature sources require neutral O, O2, and N2 to be present."); - } + || input.get_do_electron_neutral_elastic_collisional_heating()) + report.error("Your electron temperature sources require neutral O, O2, and N2 to be present."); } - + return; } diff --git a/src/chemistry.cpp b/src/chemistry.cpp index a7713c2f..9eb2ebf7 100644 --- a/src/chemistry.cpp +++ b/src/chemistry.cpp @@ -25,7 +25,8 @@ Chemistry::Chemistry(Neutrals neutrals, std::string function = "Chemistry::Chemistry"; //record current function static int iFunction = -1; //usually -1 for report function - report.enter(function, iFunction); //keeps track of functions for: verbose levels, etc. + report.enter(function, + iFunction); //keeps track of functions for: verbose levels, etc. if (read_chemistry_file(neutrals, ions) > 0) { //searching for valid chem file report.print(0, "Could not read chemistry file!"); @@ -529,10 +530,11 @@ int Chemistry::read_chemistry_file(Neutrals neutrals, // Interpret a comma separated line of the chemical reaction file // ----------------------------------------------------------------------------- -Chemistry::reaction_type Chemistry::interpret_reaction_line(const Neutrals &neutrals, - const Ions &ions, - const std::vector &line, - const json &headers) { +Chemistry::reaction_type Chemistry::interpret_reaction_line( + const Neutrals &neutrals, + const Ions &ions, + const std::vector &line, + const json &headers) { std::string function = "Chemistry::interpret_reaction_line"; static int iFunction = -1; @@ -647,13 +649,15 @@ void Chemistry::find_species_id(const std::string &name, int iSpecies; IsNeutral = false; - id_ = neutrals.get_species_id(name); //from earth.in, starts at 0 w/ first species under "#NEUTRALS",(neutrals.cpp) + id_ = neutrals.get_species_id( + name); //from earth.in, starts at 0 w/ first species under "#NEUTRALS",(neutrals.cpp) if (id_ > -1) IsNeutral = true; else - id_ = ions.get_species_id(name);//from earth.in, starts at 0 w/ first species under "#IONS",(ions.cpp) + id_ = ions.get_species_id( + name);//from earth.in, starts at 0 w/ first species under "#IONS",(ions.cpp) report.exit(function); return; @@ -671,23 +675,23 @@ void Chemistry::display_reaction(Chemistry::reaction_type reaction) { std::cout << "Number of Sources : " << reaction.nSources << "\n"; for (i = 0; i < reaction.nLosses; i++) // First line for reaction - if (i < reaction.nLosses - 1) {// + if (i < reaction.nLosses - 1) // std::cout << reaction.losses_names[i] << " + "; - } else {// + + else // std::cout << reaction.losses_names[i] << " -> "; - } for (i = 0; i < reaction.nSources; i++) - if (i < reaction.nSources - 1) {// + if (i < reaction.nSources - 1) // std::cout << reaction.sources_names[i] << " + "; - } else {// + + else // std::cout << reaction.sources_names[i] << " (RR : " << reaction.rate << ")\n"; - } for (i = 0; i < reaction.nLosses; i++)//Second line for reaction if (i < reaction.nLosses - 1) {// std::cout << reaction.losses_ids[i] - << "(" << reaction.losses_IsNeutral[i] << ")" << " + "; + << "(" << reaction.losses_IsNeutral[i] << ")" << " + "; } else {// std::cout << reaction.losses_ids[i] << "(" << reaction.losses_IsNeutral[i] << ")" << " -> "; @@ -696,11 +700,11 @@ void Chemistry::display_reaction(Chemistry::reaction_type reaction) { for (i = 0; i < reaction.nSources; i++) if (i < reaction.nSources - 1) {// std::cout << reaction.sources_ids[i] - << "(" << reaction.sources_IsNeutral[i] << ")" << " + "; + << "(" << reaction.sources_IsNeutral[i] << ")" << " + "; } else {// std::cout << reaction.sources_ids[i] - << "(" << reaction.sources_IsNeutral[i] - << ")" << " (RR : " << reaction.rate << ")\n"; + << "(" << reaction.sources_IsNeutral[i] + << ")" << " (RR : " << reaction.rate << ")\n"; } diff --git a/src/grid_spacing.cpp b/src/grid_spacing.cpp index ad6d5b45..f1a55c92 100644 --- a/src/grid_spacing.cpp +++ b/src/grid_spacing.cpp @@ -142,12 +142,13 @@ void Grid::calc_k_grid_spacing() { radius_scgc.slice(iZ) - radius_scgc.slice(iZ - 1); // For the sphere & cubesphere, k is in meters: - if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_){ + if (iGridShape_ == iSphere_ || iGridShape_ == iCubesphere_) { dk_center_m_scgc = dk_center_scgc; dk_edge_m = dk_edge; } + // This needs to be turned into a distance for the dipole: - if (iGridShape_ == iDipole_){ + if (iGridShape_ == iDipole_) { // the dk's may be negative (not allowed). make sure they are positive // this gets rid of SO many errors... dk_center_scgc = abs(dk_center_scgc); @@ -243,14 +244,15 @@ void Grid::calc_i_grid_spacing() { di_center_m_scgc = di_center_scgc % radius_scgc; di_edge_m = di_edge % radius_scgc; - // If the shape is a sphere or dipole, then the first coordinate is longitude. - // The physical distance needs to be changed by the cos of the latitude, + // If the shape is a sphere or dipole, then the first coordinate is longitude. + // The physical distance needs to be changed by the cos of the latitude, // which is the j coordinate in the sphere (different for dipole). if (iGridShape_ == iSphere_) { di_center_m_scgc = di_center_m_scgc % abs(cos(j_center_scgc)); // edge is in-line with the j center di_edge_m = di_edge_m % abs(cos(j_center_scgc)); } + // Dipole will use cos(magLat) if (iGridShape_ == iDipole_) { di_center_m_scgc = di_center_m_scgc % abs(cos(magLat_scgc)); @@ -343,8 +345,10 @@ void Grid::calc_j_grid_spacing() { // Dipole will have different scaling... if (iGridShape_ == iDipole_) { - dj_center_m_scgc = radius_scgc % dj_center_scgc % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc) % sign(magLat_scgc); - dj_edge_m = radius_scgc % dj_edge % pow(cos(magLat_scgc), 3) / delTheta(magLat_scgc) % sign(magLat_scgc); + dj_center_m_scgc = radius_scgc % dj_center_scgc % pow(cos(magLat_scgc), + 3) / delTheta(magLat_scgc) % sign(magLat_scgc); + dj_edge_m = radius_scgc % dj_edge % pow(cos(magLat_scgc), + 3) / delTheta(magLat_scgc) % sign(magLat_scgc); } // For a stretched grid, calculate some useful quantities: diff --git a/src/solver_conduction.cpp b/src/solver_conduction.cpp index ff353a11..e6de684a 100644 --- a/src/solver_conduction.cpp +++ b/src/solver_conduction.cpp @@ -29,7 +29,7 @@ arma_vec solver_conduction(arma_vec value, int64_t nGCs, bool return_diff, // (optional) False by default (return new `value`) arma_vec source2 // (optional) Sources dependent on `value` - ) { + ) { int64_t nPts = value.n_elem; @@ -52,7 +52,7 @@ arma_vec solver_conduction(arma_vec value, conduction.zeros(); // If source2 is not given, set it to zero: - if (source2.n_elem == 0){ + if (source2.n_elem == 0) { source2.set_size(source.n_elem); source2.zeros(); } @@ -64,7 +64,8 @@ arma_vec solver_conduction(arma_vec value, arma_vec a = di / du22 % r - dl / du12 % r % r; arma_vec c = di / du22 + dl / du12; - arma_vec b = -1.0 / m - di / du22 % (1.0 + r) - dl / du12 % (1.0 - r % r) + source2 % front * dt; + arma_vec b = -1.0 / m - di / du22 % (1.0 + r) - dl / du12 % + (1.0 - r % r) + source2 % front * dt; arma_vec d = -1.0 * (value / m + source % front * dt); // Lower BCs (fixed value): From 2cd37a5d86b4495a2f819df867406c731bc96371 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Wed, 26 Nov 2025 16:28:25 -0500 Subject: [PATCH 690/691] BUG: need default to run on 1 processor --- share/run/aether.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/share/run/aether.json b/share/run/aether.json index b192b5b5..6325cc69 100644 --- a/share/run/aether.json +++ b/share/run/aether.json @@ -13,7 +13,7 @@ "EndTime" : [2011, 3, 20, 0, 1, 0], "neuGrid" : { - "Shape": "sphere4", + "Shape": "sphere", "nLonsPerBlock" : 20, "nLatsPerBlock" : 18, "nAlts" : 40, @@ -21,13 +21,12 @@ "IsUniformAlt" : false}, "ionGrid": { - "Shape": "dipole4", + "Shape": "sphere", "nLonsPerBlock": 24, - "nLatsPerBlock": 18, + "nLatsPerBlock": 22, "nAlts": 50, - "LatRange": [10, 80], - "AltRange": [80.0, 1000], - "LonRange": [0.0, 360.0]}, + "dAltScale" : 0.3, + "IsUniformAlt" : false}, "OmniwebFiles" : ["UA/inputs/omni_20110319.txt"], From 5cd781caf258f92c02bf432341d7eda69dc92183 Mon Sep 17 00:00:00 2001 From: Aaron Ridley Date: Thu, 27 Nov 2025 13:24:00 -0500 Subject: [PATCH 691/691] BUG: proper merge between the Aarons codes --- include/grid.h | 101 +++++++------- src/grid_match.cpp | 114 +++++++++------ src/solver_grid_interpolation.cpp | 225 +++++++++++++++++++++--------- 3 files changed, 282 insertions(+), 158 deletions(-) diff --git a/include/grid.h b/include/grid.h index a5f4c0b1..0f7a79c7 100644 --- a/include/grid.h +++ b/include/grid.h @@ -45,30 +45,31 @@ struct cubesphere_chars { // Grid class // ---------------------------------------------------------------------------- - struct interp_coef_t { - // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] - uint64_t iRow; - uint64_t iCol; - uint64_t iAlt; - // The coefficients along row, column and altitude - precision_t rRow; - precision_t rCol; - precision_t rAlt; - // Whether the point is within this grid or not - bool in_grid; - // If this is set to true: - bool above_grid, below_grid; - // do interpolation in lat and lon, but extrapolate in altitude - }; +struct interp_coef_t { + // The point is inside the cube of: + // [iRow, iRow+1], [iCol, iCol+1] [iAlt, iAlt+1] + uint64_t iRow; + uint64_t iCol; + uint64_t iAlt; + // The coefficients along row, column and altitude + precision_t rRow; + precision_t rCol; + precision_t rAlt; + // Whether the point is within this grid or not + bool in_grid; + // If this is set to true: + bool above_grid, below_grid; + // do interpolation in lat and lon, but extrapolate in altitude +}; - struct grid_to_grid_t { - int64_t iProcTo; - int64_t nPts; - int64_t nPtsReceive; - std::vector interpCoefs; - std::vector valueToSend; - std::vector valueToReceive; - }; +struct grid_to_grid_t { + int64_t iProcTo; + int64_t nPts; + int64_t nPtsReceive; + std::vector interpCoefs; + std::vector valueToSend; + std::vector valueToReceive; +}; class Grid { public: @@ -552,12 +553,12 @@ class Grid { * \pre Lons, Lats and Alts have the same size * \return list of interpolation coefficients */ - + std::vector get_interpolation_coefs( - const std::vector &Lons, - const std::vector &Lats, - const std::vector &Alts); - + const std::vector &Lons, + const std::vector &Lats, + const std::vector &Alts); + /** * \brief Set the interpolation coefficients for the dipole grid * \param Lons The longitude of points @@ -666,18 +667,18 @@ class Grid { // Each point is processed by the function set_interpolation_coefs and stored // in the form of this structure. // If the point is out of the grid, in_grid = false and all other members are undefined - struct interp_coef_t { - // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] - uint64_t iRow; - uint64_t iCol; - uint64_t iAlt; - // The coefficients along row, column and altitude - precision_t rRow; - precision_t rCol; - precision_t rAlt; - // Whether the point is within this grid or not - bool in_grid; - }; + //struct interp_coef_t { + // // The point is inside the cube of [iRow, iRow+1], [iCol, iCol+1], [iAlt, iAlt+1] + // uint64_t iRow; + // uint64_t iCol; + // uint64_t iAlt; + // // The coefficients along row, column and altitude + // precision_t rRow; + // precision_t rCol; + // precision_t rAlt; + // // Whether the point is within this grid or not + // bool in_grid; + //}; // Calculate the range of a spherical grid void get_sphere_grid_range(struct sphere_range &sr) const; @@ -688,18 +689,18 @@ class Grid { // Helper function for set_interpolation_coefs struct interp_coef_t get_interp_coef_sphere(const sphere_range &sr, - const precision_t lon_in, - const precision_t lat_in, - const precision_t alt_in); + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in); struct interp_coef_t get_interp_coef_cubesphere(const cubesphere_range &cr, - const precision_t lon_in, - const precision_t lat_in, - const precision_t alt_in); + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in); // (note these are magnetic coordinates) - void set_interp_coef_dipole(const dipole_range &dr, - const precision_t lon_in, - const precision_t lat_in, - const precision_t alt_in); + struct interp_coef_t get_interp_coef_dipole(const dipole_range &dr, + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in); // Processed interpolation coefficients std::vector interp_coefs; diff --git a/src/grid_match.cpp b/src/grid_match.cpp index 908baf8b..28d1c2b1 100644 --- a/src/grid_match.cpp +++ b/src/grid_match.cpp @@ -20,9 +20,8 @@ bool exchange_information(int64_t *nPointsToPass, // - if it is a different processor, send the data for (jNode = 0; jNode < nGrids ; jNode++) { if (jNode == iGrid) { - for (iPt = 0; iPt < nPointsToPass[jNode]; iPt ++) { + for (iPt = 0; iPt < nPointsToPass[jNode]; iPt ++) varToReceive[jNode][iPt] = varToSend[jNode][iPt]; - } } else { iProcTo = iMember * nGrids + jNode; // iTag is a unique id allowing all processors to @@ -74,8 +73,8 @@ bool exchange_information(int64_t *nPointsToPass, // - builds interpolators for the requested information // ----------------------------------------------------------------------------- -bool grid_match(Grid &gGrid, - Grid &mGrid, +bool grid_match(Grid &gGrid, + Grid &mGrid, Quadtree gQuadtree, Quadtree mQuadtree) { @@ -93,8 +92,10 @@ bool grid_match(Grid &gGrid, precision_t normX, normY, normZ; arma_vec norms(3); int64_t jNode, kNode; - int64_t *nPointsToPass = static_cast(malloc(nGrids * sizeof(int64_t))); - int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof(int64_t))); + int64_t *nPointsToPass = static_cast(malloc(nGrids * sizeof( + int64_t))); + int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof( + int64_t))); int64_t *nPointsDummy = static_cast(malloc(nGrids * sizeof(int64_t))); for (jNode = 0; jNode < nGrids ; jNode++) @@ -103,6 +104,7 @@ bool grid_match(Grid &gGrid, // This is not the most efficient way to do this, but the first pass, let's // just count how many points we need to send to the other processors: mGrid.gridToGridMap.set_size(mnX, mnY, mnZ); + for (iX = mGCs; iX < mnX - mGCs; iX++) { for (iY = mGCs; iY < mnY - mGCs; iY++) { for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { @@ -118,11 +120,12 @@ bool grid_match(Grid &gGrid, norms = sphere_to_cube(lon, lat); jNode = gQuadtree.find_point(norms); } - if (jNode < 0 || jNode >= nGrids) { - std::cout << "out of bounds!!! " << jNode << "\n"; - } + + if (jNode < 0 || jNode >= nGrids) + std::cout << "out of bounds!!! " << jNode << "\n"; + mGrid.gridToGridMap(iX, iY, iZ) = jNode; - nPointsToPass[jNode] = nPointsToPass[jNode]+1; + nPointsToPass[jNode] = nPointsToPass[jNode] + 1; /* std::cout << "lon, lat, node: " << lon*cRtoD << " " << lat*cRtoD << " " << norms(0) << " " @@ -134,11 +137,13 @@ bool grid_match(Grid &gGrid, } } } + MPI_Barrier(aether_comm); if (report.test_verbose(3)) { for (jNode = 0; jNode < nGrids ; jNode++) std::cout << "nPtsToPass : " << iProc << " " << nPointsToPass[jNode] << "\n"; + std::cout << "sending number of points :\n"; } @@ -150,14 +155,15 @@ bool grid_match(Grid &gGrid, for (kNode = 0; kNode < nGrids ; kNode++) nPointsDummy[kNode] = nPointsToPass[kNode]; } + MPI_Bcast(nPointsDummy, nGrids, MPI_INT64_T, jNode, aether_comm); nPointsToReceive[jNode] = nPointsDummy[iGrid]; } if (report.test_verbose(3)) { - for (jNode = 0; jNode < nGrids ; jNode++) { - std::cout << "nPtsToReceive : " << iProc << " " << jNode << " " << nPointsToReceive[jNode] << "\n"; - } + for (jNode = 0; jNode < nGrids ; jNode++) + std::cout << "nPtsToReceive : " << iProc << " " << jNode << " " << + nPointsToReceive[jNode] << "\n"; } // Now we need to create an array of send points and an array of receive points. @@ -167,24 +173,33 @@ bool grid_match(Grid &gGrid, std::vector latsToInterTo(nGrids); std::vector lonsToInterTo(nGrids); std::vector altsToInterTo(nGrids); + for (jNode = 0; jNode < nGrids ; jNode++) { - latsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - lonsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - altsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * sizeof(precision_t))); - latsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); - lonsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); - altsToInterTo[jNode] = static_cast(malloc(nPointsToReceive[jNode] * sizeof(precision_t))); + latsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * + sizeof(precision_t))); + lonsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * + sizeof(precision_t))); + altsToPass[jNode] = static_cast(malloc(nPointsToPass[jNode] * + sizeof(precision_t))); + latsToInterTo[jNode] = static_cast(malloc( + nPointsToReceive[jNode] * sizeof(precision_t))); + lonsToInterTo[jNode] = static_cast(malloc( + nPointsToReceive[jNode] * sizeof(precision_t))); + altsToInterTo[jNode] = static_cast(malloc( + nPointsToReceive[jNode] * sizeof(precision_t))); } // now, the second pass, let's store the information so we can pass it: for (jNode = 0; jNode < nGrids ; jNode++) nPointsToPass[jNode] = 0; + for (iX = mGCs; iX < mnX - mGCs; iX++) { for (iY = mGCs; iY < mnY - mGCs; iY++) { for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { lon = mGrid.geoLon_scgc(iX, iY, iZ); lat = mGrid.geoLat_scgc(iX, iY, iZ); - if (gGrid.iGridShape_ == gGrid.iSphere_) { + + if (gGrid.iGridShape_ == iSphere_) { norms(0) = lon / cPI; norms(1) = lat / cPI; norms(2) = 0.0; @@ -193,13 +208,15 @@ bool grid_match(Grid &gGrid, norms = sphere_to_cube(lon, lat); jNode = gQuadtree.find_point(norms); } + latsToPass[jNode][nPointsToPass[jNode]] = lat; lonsToPass[jNode][nPointsToPass[jNode]] = lon; altsToPass[jNode][nPointsToPass[jNode]] = mGrid.geoAlt_scgc(iX, iY, iZ); - nPointsToPass[jNode] = nPointsToPass[jNode]+1; + nPointsToPass[jNode] = nPointsToPass[jNode] + 1; } } } + bool didWork; // Pass first coordinate (lons) didWork = exchange_information(nPointsToPass, @@ -221,38 +238,45 @@ bool grid_match(Grid &gGrid, for (jNode = 0; jNode < nGrids ; jNode++) { std::cout << "Received the following points from iGrid = " << jNode << "\n"; std::cout << " -> points received : " << nPointsToReceive[jNode] << "\n"; - for (int64_t iPt = 0; iPt < nPointsToReceive[jNode]; iPt++) + + for (int64_t iPt = 0; iPt < nPointsToReceive[jNode]; iPt++) std::cout << " -> " << iPt << " " - << lonsToInterTo[jNode][iPt] << " " - << latsToInterTo[jNode][iPt] << " " - << altsToInterTo[jNode][iPt] << "\n"; + << lonsToInterTo[jNode][iPt] << " " + << latsToInterTo[jNode][iPt] << " " + << altsToInterTo[jNode][iPt] << "\n"; } } struct grid_to_grid_t oneGrid; int64_t nPts; + for (jNode = 0; jNode < nGrids ; jNode++) { // These are backwards now, since we will switch sender and reciever: oneGrid.nPts = nPointsToReceive[jNode]; oneGrid.nPtsReceive = nPointsToPass[jNode]; oneGrid.iProcTo = iMember * nGrids + jNode; + if (report.test_verbose(2)) - std::cout << "Making interpolation coefficients for : " << jNode - << "; points : " << oneGrid.nPts << "\n"; + std::cout << "Making interpolation coefficients for : " << jNode + << "; points : " << oneGrid.nPts << "\n"; + if (oneGrid.nPts > 0) { - // Interpolation function takes vectors, + // Interpolation function takes vectors, // so transfer these arrays to vectors: std::vector Lons(oneGrid.nPts); std::vector Lats(oneGrid.nPts); std::vector Alts(oneGrid.nPts); + for (int64_t iPt = 0; iPt < oneGrid.nPts; iPt++) { Lons[iPt] = lonsToInterTo[jNode][iPt]; Lats[iPt] = latsToInterTo[jNode][iPt]; Alts[iPt] = altsToInterTo[jNode][iPt]; } + oneGrid.interpCoefs = gGrid.get_interpolation_coefs(Lons, Lats, Alts); } + gGrid.gridToGridCoefs.push_back(oneGrid); } @@ -260,7 +284,7 @@ bool grid_match(Grid &gGrid, return didWork; } -bool get_data_from_other_grid(Grid &gGrid, +bool get_data_from_other_grid(Grid &gGrid, Grid &mGrid, arma_cube &gData, arma_cube &mData) { @@ -272,24 +296,33 @@ bool get_data_from_other_grid(Grid &gGrid, int64_t jNode, iPt; std::vector dataToSend(nGrids); std::vector dataToReceive(nGrids); - int64_t *nPointsToSend = static_cast(malloc(nGrids * sizeof(int64_t))); - int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof(int64_t))); + int64_t *nPointsToSend = static_cast(malloc(nGrids * sizeof( + int64_t))); + int64_t *nPointsToReceive = static_cast(malloc(nGrids * sizeof( + int64_t))); for (jNode = 0; jNode < nGrids ; jNode++) { if (report.test_verbose(2)) - std::cout << "nPts : " << jNode << " " << gGrid.gridToGridCoefs[jNode].nPts << "\n"; + std::cout << "nPts : " << jNode << " " << gGrid.gridToGridCoefs[jNode].nPts << + "\n"; + nPointsToSend[jNode] = gGrid.gridToGridCoefs[jNode].nPts; nPointsToReceive[jNode] = gGrid.gridToGridCoefs[jNode].nPtsReceive; - dataToSend[jNode] = static_cast(malloc(gGrid.gridToGridCoefs[jNode].nPts * sizeof(precision_t))); - dataToReceive[jNode] = static_cast(malloc(gGrid.gridToGridCoefs[jNode].nPtsReceive * sizeof(precision_t))); - std::vector values = gGrid.get_interpolation_values(gData, gGrid.gridToGridCoefs[jNode].interpCoefs); - + dataToSend[jNode] = static_cast(malloc( + gGrid.gridToGridCoefs[jNode].nPts * sizeof(precision_t))); + dataToReceive[jNode] = static_cast(malloc( + gGrid.gridToGridCoefs[jNode].nPtsReceive * sizeof(precision_t))); + std::vector values = gGrid.get_interpolation_values(gData, + gGrid.gridToGridCoefs[jNode].interpCoefs); + for (iPt = 0; iPt < gGrid.gridToGridCoefs[jNode].nPts; iPt++) { dataToSend[jNode][iPt] = values[iPt]; + if (report.test_verbose(2)) std::cout << "datatosend : " << iPt << " " << dataToSend[jNode][iPt] << "\n"; } } + bool didWork = exchange_information(nPointsToSend, dataToSend, nPointsToReceive, @@ -299,6 +332,7 @@ bool get_data_from_other_grid(Grid &gGrid, int64_t iZ, mnZ = mGrid.get_nZ(); int64_t mGCs = mGrid.get_nGCs(); std::vector iCounter(nGrids); + for (jNode = 0; jNode < nGrids ; jNode++) iCounter[jNode] = 0; @@ -306,13 +340,15 @@ bool get_data_from_other_grid(Grid &gGrid, for (iY = mGCs; iY < mnY - mGCs; iY++) { for (iZ = mGCs; iZ < mnZ - mGCs; iZ++) { jNode = mGrid.gridToGridMap(iX, iY, iZ); + if (report.test_verbose(2)) { - std::cout << "unpacking point : " << iX << " " << iY << " " << iZ << " " << jNode << " " - << iCounter[jNode] << " " << dataToReceive[jNode][iCounter[jNode]] << "\n"; + std::cout << "unpacking point : " << iX << " " << iY << " " << iZ << " " << + jNode << " " + << iCounter[jNode] << " " << dataToReceive[jNode][iCounter[jNode]] << "\n"; } mData(iX, iY, iZ) = dataToReceive[jNode][iCounter[jNode]]; - iCounter[jNode] = iCounter[jNode]+1; + iCounter[jNode] = iCounter[jNode] + 1; } } } diff --git a/src/solver_grid_interpolation.cpp b/src/solver_grid_interpolation.cpp index 0ec38266..e0cba3ca 100644 --- a/src/solver_grid_interpolation.cpp +++ b/src/solver_grid_interpolation.cpp @@ -3,7 +3,9 @@ #include "aether.h" -// Hepler varialbes / function begins. These are only used inside this cpp file and neither declared nor visible in any other file +// Hepler variables / function begins. +// These are only used inside this cpp file and neither declared +// nor visible in any other file // The size of a 2*2*2 arma cube const arma::SizeCube unit_cube_size = arma::size(2, 2, 2); @@ -69,17 +71,48 @@ int64_t get_cube_surface_number(const arma_vec &point_in) { } } -// Helper variables / function ends. The following are all member functions of Grid class +// Helper variables / function ends. The following are all member +// functions of Grid class // -------------------------------------------------------------------------- -// Return the index of the last element that has a value smaller than or equal to the input +// Return the index of the last element that has altitude smaller than +// or equal to the input +// -------------------------------------------------------------------------- + +uint64_t Grid::search_altitude(const precision_t alt_in) const { + // Copy from std::upper_bound. Can't directly use it + // mainly because geoAlt_scgc(0, 0, *) can't be formed as an iterator + uint64_t first, last, len; + first = nGCs; + last = nAlts - nGCs; + len = last - first; + + while (len > 0) { + uint64_t half = len >> 1; + uint64_t mid = first + half; + + if (geoAlt_scgc(0, 0, mid) > alt_in) + len = half; + + else { + first = mid + 1; + len = len - half - 1; + } + } + + return first - 1; +} + +// -------------------------------------------------------------------------- +// Return the index of the last element that has a value smaller than +// or equal to the input // - Optional argument (nGCs=0) since we cannot see grid info. // -------------------------------------------------------------------------- +// this replaces the above + uint64_t bisect_search_array(precision_t val_in, arma_vec ref_arr, int64_t nGCs = 0) { - // Copy from std::upper_bound. Can't directly use it - // mainly because geoAlt_scgc(0, 0, *) can't be formed as an iterator uint64_t first, last, len; first = nGCs; last = ref_arr.size(); @@ -181,6 +214,7 @@ void Grid::get_cubesphere_grid_range(struct cubesphere_range &cr) const { } } + // -------------------------------------------------------------------------- // Get the range of a Dipole grid // -------------------------------------------------------------------------- @@ -208,24 +242,27 @@ void Grid::get_dipole_grid_range(struct dipole_range &dr) const { // Almost the copy of interp_sphere_linear_helper // -------------------------------------------------------------------------- -struct interp_coef_t Grid::get_interp_coef_sphere( - const sphere_range &sr, - const precision_t lon_in, - const precision_t lat_in, - const precision_t alt_in) { + +struct interp_coef_t Grid::get_interp_coef_sphere(const sphere_range &sr, + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in) { + // WARNING: IF WE ARE DEALING WITH LESS THAN THE WHOLE EARTH, THEN ALL THE POINTS WITH // LONGITUDE = geo_grid_input.lon_max = settings["GeoGrid"]["MaxLon"] // OR LATITUDE = geo_grid_input.lat_max = settings["GeoGrid"]["MaxLat"] // ARE EXCLUDED. // TO FIX IT, EACH GRID SHOULD BE ABLE TO ACCESS THE MaxLon and MaxLat - // The structure which will be put into the interp_coefs. Initialize in_grid to be false + // The structure which will be put into the interp_coefs. + // Initialize in_grid to be false struct interp_coef_t coef; coef.in_grid = false; // Determine whether the point is inside this grid - // Treat north pole specially because latitude is inclusive for both -cPI/2 and cPI/2 - // Dpn't check for altitude here! + // Treat north pole specially because latitude is inclusive for + // both -cPI/2 and cPI/2 + // Don't check for altitude here! if (lon_in < sr.lon_min || lon_in >= sr.lon_max || lat_in < sr.lat_min || lat_in > sr.lat_max || (lat_in == sr.lat_max && sr.lat_max != cPI / 2)) { return coef; @@ -268,9 +305,13 @@ struct interp_coef_t Grid::get_interp_coef_sphere( coef.below_grid = false; coef.above_grid = true; } else { - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + coef.iAlt = bisect_search_array(alt_in, + geoAlt_scgc.tube(coef.iRow, coef.iCol), + nGCs); + coef.rAlt = + (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - + geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); coef.below_grid = false; coef.above_grid = false; } @@ -343,36 +384,63 @@ struct interp_coef_t Grid::get_interp_coef_cubesphere(const cubesphere_range &cr coef.iCol = static_cast(col_frac_index); coef.rCol = col_frac_index - coef.iCol; coef.iCol += nGCs - 1; - // Use binary search to find the index for altitude (handles oblate planets) - coef.iAlt = bisect_search_array(alt_in, geoAlt_scgc.tube(coef.iRow, coef.iCol), - nGCs); - coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) - / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - geoAlt_scgc(coef.iRow, - coef.iCol, coef.iAlt)); - // Put the coefficient into the vector - coef.in_grid = true; - interp_coefs.push_back(coef); + + // The altitude may not be linearly spaced, so use binary search to find + // the first element smaller than or equal to the altitude of the give point + // Implemented in search_altitude + + if (alt_in < cr.alt_min) { + coef.iAlt = nGCs; + coef.rAlt = alt_in - cr.alt_min; + coef.below_grid = true; + coef.above_grid = false; + } else { + if (alt_in > cr.alt_max) { + coef.iAlt = nAlts - nGCs; + coef.rAlt = alt_in - cr.alt_max; + coef.below_grid = false; + coef.above_grid = true; + } else { + coef.iAlt = bisect_search_array(alt_in, + geoAlt_scgc.tube(coef.iRow, coef.iCol), + nGCs); + coef.rAlt = + (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - + geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); + coef.below_grid = false; + coef.above_grid = false; + } + } + return coef; } -void Grid::set_interp_coef_dipole(const dipole_range &dr, - const precision_t lon_in, - const precision_t lat_in, - const precision_t alt_in) { - // The structure which will be put into the interp_coefs. Initialize in_grid to be false +struct interp_coef_t Grid::get_interp_coef_dipole(const dipole_range &dr, + const precision_t lon_in, + const precision_t lat_in, + const precision_t alt_in) { + + // The structure which will be put into the interp_coefs. Initialize + // in_grid to be false struct interp_coef_t coef; coef.in_grid = false; - // Determine whether the point is inside this grid - // Treat north pole specially because latitude is inclusive for both -cPI/2 and cPI/2 - if (lon_in < dr.lon_min || lon_in >= dr.lon_max || lat_in < dr.lat_min - || lat_in > dr.lat_max || (lat_in == dr.lat_max && dr.lat_max != cPI / 2) + // Determine whether the point is inside this grid Treat north pole + // specially because latitude is inclusive for both -cPI/2 and cPI/2 + if (lon_in < dr.lon_min || + lon_in >= dr.lon_max || + lat_in < dr.lat_min || + lat_in > dr.lat_max || + (lat_in == dr.lat_max && dr.lat_max != cPI / 2) || alt_in < dr.alt_min || alt_in > dr.alt_max) { - interp_coefs.push_back(coef); - return; + return coef; } + // Put the coefficient into the vector + coef.in_grid = true; + // ASSUMPTION: LONGITUDE IS LINEARLY SPACED, nGCs >= 1 // For the cell containing it, directly calculate its x index // Find y & z indices using a bisecting search @@ -383,10 +451,10 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, coef.iRow = static_cast(coef.rRow); // Calculate the fractional part, which is the ratio for Longitude coef.rRow -= coef.iRow; - // The actual x-axis index of the bottom-left of the cube used for interpolation + // The actual x-axis index of the bottom-left of the cube used for + // interpolation coef.iRow += nGCs - 1; - // Different from the sphere, latitude & altitude are not evenly spaced. // Use the bisect search function for both. @@ -395,42 +463,44 @@ void Grid::set_interp_coef_dipole(const dipole_range &dr, coef.iCol = bisect_search_array(abs(lat_in), abs(j_center_scgc.tube(coef.iRow, coef.iCol)), nGCs); - // need alt index to find lat coef - coef.iAlt = bisect_search_array(alt_in, k_center_scgc.tube(coef.iRow, - coef.iCol), - nGCs); - - // then we can do the ratios: - coef.rCol = (lat_in - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)) - / (magLat_scgc(coef.iRow, coef.iCol + 1, coef.iAlt) - - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)); - - coef.rAlt = (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) - / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); - - if (alt_in < cr.alt_min) { + // Use binary search to find the index for altitude + if (alt_in < dr.alt_min) { coef.iAlt = nGCs; coef.rAlt = 0.0; coef.below_grid = true; coef.above_grid = false; } else { - if (alt_in > cr.alt_max) { + if (alt_in > dr.alt_max) { coef.iAlt = nAlts - nGCs; coef.rAlt = 0.0; coef.below_grid = false; coef.above_grid = true; } else { - coef.iAlt = search_altitude(alt_in); - coef.rAlt = (alt_in - geoAlt_scgc(0, 0, coef.iAlt)) - / (geoAlt_scgc(0, 0, coef.iAlt + 1) - geoAlt_scgc(0, 0, coef.iAlt)); + // Use binary search to find the index for altitude (handles + // oblate planets) + + // need alt index to find lat coef + coef.iAlt = bisect_search_array(alt_in, + k_center_scgc.tube(coef.iRow, coef.iCol), + nGCs); + // then we can do the ratios: + coef.rCol = + (lat_in - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (magLat_scgc(coef.iRow, coef.iCol + 1, coef.iAlt) + - magLat_scgc(coef.iRow, coef.iCol, coef.iAlt)); + coef.rAlt = + (alt_in - geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)) + / (geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt + 1) - + geoAlt_scgc(coef.iRow, coef.iCol, coef.iAlt)); coef.below_grid = false; coef.above_grid = false; } } + return coef; } + // -------------------------------------------------------------------------- // Set the interpolation coefficients // -------------------------------------------------------------------------- @@ -458,9 +528,12 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, report.enter(function, iFunction); report.print(1, "interpolation gridtype : " + gridType); + + struct interp_coef_t coef; // If the size of Lons, Lats and Alts are not the same, return false - if (i_coords.size() != j_coords.size() || j_coords.size() != k_coords.size()) { + if (i_coords.size() != j_coords.size() || + j_coords.size() != k_coords.size()) { report.error("Length of i,j,k vectors do not match!"); return false; } @@ -468,16 +541,22 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, // Clear the previous interpolation coefficients interp_coefs.clear(); - if (iGridShape_ == iCubesphere_) { - report.print(1, "interpolation grid is cubesphere"); - + // --------------------------------------------------- + // Cubesphere + if (IsCubeSphereGrid) { // Calculate the range of the grid struct cubesphere_range cr; get_cubesphere_grid_range(cr); // Calculate the index and coefficients for each point - for (size_t i = 0; i < i_coords.size(); ++i) - set_interp_coef_cubesphere(cr, i_coords[i], j_coords[i], k_coords[i]); + for (size_t i = 0; i < i_coords.size(); ++i) { + coef = get_interp_coef_cubesphere(cr, + i_coords[i], + j_coords[i], + k_coords[i]); + interp_coefs.push_back(coef); + } + } if (iGridShape_ == iSphere_) { @@ -487,8 +566,13 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, get_sphere_grid_range(sr); // Calculate the index and coefficients for each point - for (size_t i = 0; i < i_coords.size(); ++i) - set_interp_coef_sphere(sr, i_coords[i], j_coords[i], k_coords[i]); + for (size_t i = 0; i < i_coords.size(); ++i) { + coef = get_interp_coef_sphere(sr, + i_coords[i], + j_coords[i], + k_coords[i]); + interp_coefs.push_back(coef); + } } if (iGridShape_ == iDipole_) { // IsDipole @@ -504,8 +588,9 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, int64_t iLoc, nPts = i_coords.size(); std::vector mlon(nPts), p_coord(nPts), q_coord(nPts), dipijk(3); - // these are the magnetic coordinates. A temporary step! - // this is a vector of cubes with shape (nPts, 1, 1) - avoids having to overload things + // these are the magnetic coordinates. A temporary step! this is + // a vector of cubes with shape (nPts, 1, 1) - avoids having to + // overload things std::vector magCoords; if (areLocsGeo) { @@ -561,8 +646,10 @@ bool Grid::set_interpolation_coefs(const std::vector &i_coords, } // Calculate the index and coefficients for each point - for (size_t i = 0; i < i_coords.size(); ++i) - set_interp_coef_dipole(dr, mlon[i], p_coord[i], q_coord[i]); + for (size_t i = 0; i < i_coords.size(); ++i) { + coef = get_interp_coef_dipole(dr, mlon[i], p_coord[i], q_coord[i]); + interp_coefs.push_back(coef); + } } report.exit(function);