From 6bb9e95146a561c0c153fb6c7128a1530472adc4 Mon Sep 17 00:00:00 2001 From: Ben Dudson Date: Wed, 10 Sep 2025 08:35:13 -0700 Subject: [PATCH] external_apar: Add component to modify Apar_flutter Reads a variable "external_apar" from the mesh file, then adds it to the "Apar_flutter" state variable in the `transform` function. --- CMakeLists.txt | 2 ++ hermes-3.cxx | 1 + include/external_apar.hxx | 29 +++++++++++++++++++++++++++ src/electromagnetic.cxx | 2 +- src/external_apar.cxx | 41 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 include/external_apar.hxx create mode 100644 src/external_apar.cxx diff --git a/CMakeLists.txt b/CMakeLists.txt index c70322c9b..360571a72 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -65,6 +65,7 @@ set(HERMES_SOURCES src/evolve_energy.cxx src/evolve_pressure.cxx src/evolve_momentum.cxx + src/external_apar.cxx src/isothermal.cxx src/quasineutral.cxx src/diamagnetic_drift.cxx @@ -122,6 +123,7 @@ set(HERMES_SOURCES include/evolve_energy.hxx include/evolve_momentum.hxx include/evolve_pressure.hxx + include/external_apar.hxx include/fixed_density.hxx include/fixed_fraction_ions.hxx include/fixed_velocity.hxx diff --git a/hermes-3.cxx b/hermes-3.cxx index 9893fa6c6..0997b8daa 100644 --- a/hermes-3.cxx +++ b/hermes-3.cxx @@ -41,6 +41,7 @@ #include "include/evolve_energy.hxx" #include "include/evolve_momentum.hxx" #include "include/evolve_pressure.hxx" +#include "include/external_apar.hxx" #include "include/fixed_density.hxx" #include "include/fixed_fraction_ions.hxx" #include "include/fixed_fraction_radiation.hxx" diff --git a/include/external_apar.hxx b/include/external_apar.hxx new file mode 100644 index 000000000..e19516393 --- /dev/null +++ b/include/external_apar.hxx @@ -0,0 +1,29 @@ +#pragma once +#ifndef EXTERNAL_APAR_H +#define EXTERNAL_APAR_H + +#include "component.hxx" + +/// Adds an external contribution to the Apar flutter +/// +struct ExternalApar : public Component { + ExternalApar(std::string name, Options& alloptions, Solver* UNUSED(solver)); + + /// Adds to the Apar_flutter field + /// + /// - fields + /// - Apar_flutter + void transform(Options& state) override; + + /// Saves the added field to output + void outputVars(Options& state) override; + +private: + Field3D external_apar; ///< The external field +}; + +namespace { +RegisterComponent registercomponentexternalapar("external_apar"); +} + +#endif // EXTERNAL_APAR_H diff --git a/src/electromagnetic.cxx b/src/electromagnetic.cxx index 3bb7386be..fc188d06d 100644 --- a/src/electromagnetic.cxx +++ b/src/electromagnetic.cxx @@ -214,7 +214,7 @@ void Electromagnetic::transform(Options &state) { // Ensure that guard cells are communicated Apar.getMesh()->communicate(Apar_flutter); - set(state["fields"]["Apar_flutter"], Apar_flutter); + add(state["fields"]["Apar_flutter"], Apar_flutter); #if 0 // Create a vector A from covariant components diff --git a/src/external_apar.cxx b/src/external_apar.cxx new file mode 100644 index 000000000..661634bb1 --- /dev/null +++ b/src/external_apar.cxx @@ -0,0 +1,41 @@ +#include "../include/external_apar.hxx" + +#include +#include + +ExternalApar::ExternalApar(std::string name, Options& alloptions, + Solver* UNUSED(solver)) { + AUTO_TRACE(); + + // Read a 3D field from the input e.g. mesh file + // Store in member variable + bout::globals::mesh->get(external_apar, "external_apar"); + + // Normalise + const Options& units = alloptions["units"]; + const BoutReal rho_s0 = units["meters"]; + const BoutReal Bnorm = units["Tesla"]; + external_apar /= Bnorm * rho_s0; +} + +void ExternalApar::transform(Options& state) { + AUTO_TRACE(); + + // Add the field member variable to Apar_flutter + add(state["fields"]["Apar_flutter"], external_apar); +} + +void ExternalApar::outputVars(Options& state) { + AUTO_TRACE(); + + // Normalisations + auto Bnorm = get(state["Bnorm"]); + auto rho_s0 = get(state["rho_s0"]); + + set_with_attrs(state["external_apar"], external_apar, + {{"units", "Tm"}, + {"conversion", Bnorm * rho_s0}, + {"standard_name", "External Apar"}, + {"long_name", "External Apar"}, + {"source", "external_apar"}}); +}