diff --git a/CMakeLists.txt b/CMakeLists.txt index e37fe7311..b7b8be878 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -79,6 +79,7 @@ set(HERMES_SOURCES src/evolve_energy.cxx src/evolve_pressure.cxx src/evolve_momentum.cxx + src/external_apar.cxx src/guarded_options.cxx src/isothermal.cxx src/quasineutral.cxx @@ -138,6 +139,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 5a06834b9..f8190817c 100644 --- a/hermes-3.cxx +++ b/hermes-3.cxx @@ -46,6 +46,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..e1a78ae3f --- /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)); + + /// Saves the added field to output + void outputVars(Options& state) override; + +private: + /// Adds to the Apar_flutter field + /// + /// - fields + /// - Apar_flutter + void transform_impl(GuardedOptions& state) override; + + 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 c51a9d6ab..21cfae929 100644 --- a/src/electromagnetic.cxx +++ b/src/electromagnetic.cxx @@ -223,7 +223,7 @@ void Electromagnetic::transform_impl(GuardedOptions& 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..455f6c99b --- /dev/null +++ b/src/external_apar.cxx @@ -0,0 +1,37 @@ +#include "../include/external_apar.hxx" + +#include +#include + +ExternalApar::ExternalApar(std::string name, Options& alloptions, + Solver* UNUSED(solver)) + : Component({readWrite("fields:Apar_flutter")}) { + + // 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_impl(GuardedOptions& state) { + // Add the field member variable to Apar_flutter + add(state["fields"]["Apar_flutter"], external_apar); +} + +void ExternalApar::outputVars(Options& state) { + // 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"}}); +}