WARPXM v1.10.0
Loading...
Searching...
No Matches
corona_equilibrium.h
Go to the documentation of this file.
1#pragma once
2
3// WARPXM includes
5
6// STL includes
7#include <cmath>
8#include <memory>
9
10namespace wxm
11{
12namespace apps
13{
14namespace functions
15{
16namespace mhd
17{
26{
27public:
33
39
44 void setup(const WxCryptSet& wxc) override;
45
51 const std::vector<int>& getOutputVariableIndexes(int flag) const override
52 {
53 return _mhd_fluid;
54 }
55
63 void evaluate_function(const real* q,
64 const real* aux,
65 const solverVariables_t* pSV,
66 real* result) const override;
67
76 void bc_q(const real* q_in,
77 const real* aux_in,
78 const real* aux_out,
79 const solverVariables_t* pFV,
80 real* q_out) const override;
81
82protected:
83 std::vector<int> _mhd_fluid;
84
85 std::string _coordinate_system;
86 std::string _core_type;
87 int _ir, _ith, _iz; // r, theta, and z indices
88
89 real _gas_gamma; // gamma
90 real _Ai; // mass
91 real _Zi; // charge
92 real _T; // uniform temperature
93 real _a; // pinch radius
94 real _Ib; // current at radius b
95 real _b; // radius b
96 real _wct; // (omega_c tau)
97
98 real _pert; // perturbation fraction on pressure
99 real _lambda; // wavelength of perturbation in z-coordinate
100
101 // pointer to subapplications
102 std::unique_ptr<WmApplication> _vz_app;
103 std::unique_ptr<WmApplication> _vr_app;
104 std::unique_ptr<WmApplication> _vth_app;
105
106 // Viete function for alpha = 5/3
107 real viete(real r, real rp) const
108 {
109 // Handle the case when r=0
110 if (r == 0.0)
111 {
112 return 0.0; // Will be handled separately in the calling function
113 }
114
115 // Calculate using the algorithm but avoid standard complex library
116 // We'll implement the complex arithmetic directly
117
118 // Calculate the squared ratio (rp / r)^2
119 real ratio = rp / r;
120 real ratio_squared = ratio * ratio;
121
122 // Compute the argument for arccos: 6 * sqrt(3) / 5 * (r / rp)^2
123 real arccos_arg_real = 6.0 * std::sqrt(3.0) / 5.0 * (r / rp) * (r / rp);
124
125 // For complex arccos, we need to handle when arccos_arg_real > 1
126 // If arccos_arg_real <= 1, we can use the standard arccos
127 // If arccos_arg_real > 1, we use the formula:
128 // acos(z) = 0 - i*log(z + i*sqrt(z^2 - 1))
129
130 real angle_real;
131 real angle_imag;
132
133 if (arccos_arg_real <= 1.0)
134 {
135 // Real case
136 angle_real = std::acos(arccos_arg_real) / 3.0;
137 angle_imag = 0.0;
138 }
139 else
140 {
141 // Complex case
142 // For z > 1, acos(z) = 0 - i*log(z + sqrt(z^2 - 1))
143 real temp = std::sqrt(arccos_arg_real * arccos_arg_real - 1.0);
144 angle_real = 0.0;
145 angle_imag = -std::log(arccos_arg_real + temp) / 3.0;
146 }
147
148 // Compute the cosine of the complex angle
149 // cos(a + bi) = cos(a)*cosh(b) - i*sin(a)*sinh(b)
150 real cos_term_real = std::cos(angle_real) * std::cosh(angle_imag);
151 real cos_term_imag = -std::sin(angle_real) * std::sinh(angle_imag);
152
153 // Calculate the final result: (rp/r)^2 * (2/sqrt(3)) * cos_term
154 real scale = ratio_squared * (2.0 / std::sqrt(3.0));
155 real result_real = scale * cos_term_real;
156
157 // Return only the real part
158 return result_real;
159 }
160
161private:
162 CoronaEquilibrium& operator=(const CoronaEquilibrium& var);
164};
165
166} // namespace mhd
167} // namespace functions
168} // namespace apps
169} // namespace wxm
Base Class for physics applications.
Definition: wmapplication.h:93
WxCryptSet extends WxCrypt by providing, in addition to name-value pairs, an set of named WxCryptSets...
Definition: wxcryptset.h:35
Corona Equilibrium for Ideal MHD.
Definition: corona_equilibrium.h:26
real _lambda
Definition: corona_equilibrium.h:99
real _a
Definition: corona_equilibrium.h:93
void evaluate_function(const real *q, const real *aux, const solverVariables_t *pSV, real *result) const override
Redefinition of the function evaluator.
std::unique_ptr< WmApplication > _vr_app
Definition: corona_equilibrium.h:103
int _ith
Definition: corona_equilibrium.h:87
const std::vector< int > & getOutputVariableIndexes(int flag) const override
Grab output variable indices.
Definition: corona_equilibrium.h:51
std::string _coordinate_system
Definition: corona_equilibrium.h:85
real _Ai
Definition: corona_equilibrium.h:90
real _b
Definition: corona_equilibrium.h:95
real viete(real r, real rp) const
Definition: corona_equilibrium.h:107
void setup(const WxCryptSet &wxc) override
Setup.
std::string _core_type
Definition: corona_equilibrium.h:86
real _Ib
Definition: corona_equilibrium.h:94
int _iz
Definition: corona_equilibrium.h:87
real _gas_gamma
Definition: corona_equilibrium.h:89
real _pert
Definition: corona_equilibrium.h:98
std::vector< int > _mhd_fluid
Definition: corona_equilibrium.h:83
real _Zi
Definition: corona_equilibrium.h:91
real _T
Definition: corona_equilibrium.h:92
std::unique_ptr< WmApplication > _vz_app
Definition: corona_equilibrium.h:102
std::unique_ptr< WmApplication > _vth_app
Definition: corona_equilibrium.h:104
real _wct
Definition: corona_equilibrium.h:96
int _ir
Definition: corona_equilibrium.h:87
void bc_q(const real *q_in, const real *aux_in, const real *aux_out, const solverVariables_t *pFV, real *q_out) const override
Redefinition of the bc.
list apps
Definition: shock_tube.py:33
warpy mhd
Definition: mhd_shock.py:32
Base namespace for everything not included in the global namespace.
Definition: field_source.h:8
Definition: wmapplication.h:38
#define real
Definition: wmoclunstructuredreconstruction.h:11