9#include "dg/algorithm.h"
67 Psip(
const Parameters& gp ): m_R0(gp.R_0), mA(gp.A), m_pp(gp.pp), mc(gp.c) {
68 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
80 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
83 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
86 (*m_prev)[2] = m_R0*m_pp*(mc[0] + Rn2 * ((lgRn * mA) / 2. + mc[1] +
88 (-4 * mc[3] - 9 * mc[4] +
89 Zn * (Zn * (8 * mc[5] - 140 * mc[6]) -
94 Zn * (-120 * Zn * mc[6] - 80 * mc[11]))
96 (0.125 - mA / 8. + mc[3] +
97 Rn2 * (mc[5] - 15 * lgRn * mc[6]) +
98 Zn * (Zn * (-12 * mc[5] + 75 * mc[6]) +
99 3 * mc[10] - 45 * mc[11]) +
101 Zn * (180 * Zn * mc[6] + 60 * mc[11]))))\
106 Zn * (8 * Zn * mc[6] + 8 * mc[11])))))
108 (*m_prev)[0] = R, (*m_prev)[1] = Z;
112 double m_R0, mA, m_pp;
113 std::vector<double> mc;
114 std::shared_ptr<std::array<double,3>> m_prev;
139 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
143 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
145 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
146 double Zn = Z / m_R0;
148 (*m_prev)[2] = m_pp * (mA * Rn * (0.5 + lgRn - Rn2 / 2.) +
149 Rn * (2 * mc[1] - mc[2] -
150 8 * Zn * Zn * mc[3] +
154 Zn * (-240 * Zn * mc[6] - 160 * mc[11])
156 Zn * (2 * mc[8] - 3 * mc[9] +
158 Zn * (Zn * (16 * mc[5] - 400 * mc[6]) -
159 8 * mc[10] - 80 * mc[11]))) +
160 Rn2 * (0.5 + 4 * mc[3] + 3 * mc[4] +
161 Rn2 * (6 * mc[5] - 15 * mc[6] -
163 Zn * (Zn * (-48 * mc[5] + 480 * mc[6]) +
164 12 * mc[10] - 120 * mc[11]) +
166 Zn * (720 * Zn * mc[6] + 240 * mc[11]))))
168 (*m_prev)[0] = R, (*m_prev)[1] = Z;
172 double m_R0, mA, m_pp;
173 std::vector<double> mc;
174 std::shared_ptr<std::array<double,3>> m_prev;
197 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
201 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
203 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
204 double Zn = Z / m_R0;
206 (*m_prev)[2] = m_pp/m_R0 * (mA * (1.5 + lgRn - (3 * Rn2) / 2.) + 2 * mc[1] -
207 3 * mc[2] - 8 * Zn * Zn * mc[3] +
211 Zn * (-240 * Zn * mc[6] - 160 * mc[11]))))
212 + Zn * (2 * mc[8] - 9 * mc[9] +
214 Zn * (Zn * (16 * mc[5] - 640 * mc[6]) -
215 8 * mc[10] - 240 * mc[11]))) +
216 Rn2 * (1.5 + 12 * mc[3] + 21 * mc[4] +
217 Rn2 * (30 * mc[5] - 165 * mc[6] -
218 450 * lgRn * mc[6]) +
219 Zn * (Zn * (-144 * mc[5] + 2160 * mc[6]) +
220 36 * mc[10] - 120 * mc[11]) +
222 Zn * (2160 * Zn * mc[6] + 720 * mc[11])))
224 (*m_prev)[0] = R, (*m_prev)[1] = Z;
228 double m_R0, mA, m_pp;
229 std::vector<double> mc;
230 std::shared_ptr<std::array<double,3>> m_prev;
250 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
254 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
256 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
257 double Zn = Z / m_R0;
259 (*m_prev)[2] = m_pp * (mc[7] + Rn2 * (mc[8] - 3 * lgRn * mc[9] +
260 Rn2 * (3 * mc[10] - 45 * mc[11] +
261 60 * lgRn * mc[11])) +
262 Zn * (2 * mc[2] + Rn2 *
263 (-8 * mc[3] + (-18 - 24 * lgRn) * mc[4] +
264 Rn2 * (-24 * mc[5] + 150 * mc[6] +
265 360 * lgRn * mc[6])) +
267 Rn2 * (-12 * mc[10] - 240 * lgRn * mc[11]) +
269 Rn2 * (32 * mc[5] - 560 * mc[6] -
270 480 * lgRn * mc[6]) +
271 Zn * (48 * Zn * mc[6] + 40 * mc[11]))))
273 (*m_prev)[0] = R, (*m_prev)[1] = Z;
279 std::vector<double> mc;
280 std::shared_ptr<std::array<double,3>> m_prev;
297 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
301 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
303 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
304 double Zn = Z / m_R0;
306 (*m_prev)[2] = m_pp/m_R0 * (2 * mc[2] + 24 * Zn * Zn * mc[4] +
307 Zn * (6 * mc[9] + Zn * Zn *
308 (240 * Zn * mc[6] + 160 * mc[11])) +
309 Rn2 * (-8 * mc[3] + (-18 - 24 * lgRn) * mc[4] +
310 Rn2 * (-24 * mc[5] + 150 * mc[6] +
311 360 * lgRn * mc[6]) +
312 Zn * (Zn * (96 * mc[5] - 1680 * mc[6] -
313 1440 * lgRn * mc[6]) - 24 * mc[10] -
314 480 * lgRn * mc[11]))
316 (*m_prev)[0] = R, (*m_prev)[1] = Z;
321 std::vector<double> mc;
322 std::shared_ptr<std::array<double,3>> m_prev;
341 m_prev = std::make_shared< std::array<double,3>>(std::array<double,3>{ 0,0,0});
345 if( R == (*m_prev)[0] && Z == (*m_prev)[1])
347 double Rn = R / m_R0, Rn2 = Rn * Rn, lgRn = log(Rn);
348 double Zn = Z / m_R0;
350 (*m_prev)[2] = m_pp/m_R0 * (Rn * (2 * mc[8] - 3 * mc[9] - 6 * lgRn * mc[9] +
351 Rn2 * (Zn * (-96 * mc[5] + 960 * mc[6] +
352 1440 * lgRn * mc[6]) + 12 * mc[10] -
353 120 * mc[11] + 240 * lgRn * mc[11]) +
354 Zn * (-16 * mc[3] + (-60 - 48 * lgRn) * mc[4] +
355 Zn * (Zn * (64 * mc[5] - 1600 * mc[6] -
356 960 * lgRn * mc[6]) - 24 * mc[10] -
357 240 * mc[11] - 480 * lgRn * mc[11])))
359 (*m_prev)[0] = R, (*m_prev)[1] = Z;
364 std::vector<double> mc;
365 std::shared_ptr<std::array<double,3>> m_prev;
381 Ipol(
const Parameters &gp,
const std::function<
double(
double,
double)>& psip ): m_R0(gp.R_0), m_A(gp.A), m_pp(gp.pp), m_pi(gp.pi), m_psip(psip) {
387 return m_pi*sqrt(-2.*m_A* m_psip(R,Z) /m_R0/m_pp + 1.);
390 double m_R0, m_A, m_pp, m_pi;
391 std::function<double(
double,
double)> m_psip;
402 IpolR(
const Parameters& gp,
const std::function<
double(
double,
double)>& psip, std::function<
double(
double,
double)> psipR ):
403 m_R0(gp.R_0), m_A(gp.A), m_pp(gp.pp), m_pi(gp.pi), m_psip(psip), m_psipR(psipR) {
409 return -m_pi/sqrt(-2.*m_A* m_psip(R,Z) /m_R0/m_pp + 1.)*(m_A*m_psipR(R,Z)/m_R0/m_pp);
412 double m_R0, m_A, m_pp, m_pi;
413 std::function<double(
double,
double)> m_psip, m_psipR;
424 IpolZ(
const Parameters& gp,
const std::function<
double(
double,
double)>& psip, std::function<
double(
double,
double)> psipZ ):
425 m_R0(gp.R_0), m_A(gp.A), m_pp(gp.pp), m_pi(gp.pi), m_psip(psip), m_psipZ(psipZ) {
431 return -m_pi/sqrt(-2.*m_A* m_psip(R,Z) /m_R0/m_pp + 1.)*(m_A*m_psipZ(R,Z)/m_R0/m_pp);
434 double m_R0, m_A, m_pp, m_pi;
435 std::function<double(
double,
double)> m_psip, m_psipZ;
@ heaviside
Psip is dampened to a constant outside a critical value.
@ solovev
dg::geo::solovev::Psip
dg::geo::CylindricalFunctorsLvl2 createPsip(const std::function< bool(double, double)> predicate, const CylindricalFunctorsLvl2 &psip, double psi0, double alpha, double sign=-1)
Definition modified.h:175
dg::geo::CylindricalFunctorsLvl1 createIpol(const Parameters &gp, const CylindricalFunctorsLvl1 &psip)
Definition solovev.h:443
dg::geo::TokamakMagneticField createSolovevField(const dg::geo::solovev::Parameters &gp)
Create a Solovev Magnetic field.
Definition solovev.h:464
dg::geo::CylindricalFunctorsLvl2 createPsip(const Parameters &gp)
Definition solovev.h:438
dg::geo::TokamakMagneticField createModifiedSolovevField(const dg::geo::solovev::Parameters &gp, double psi0, double alpha, double sign=-1)
DEPRECATED Create a modified Solovev Magnetic field.
Definition solovev.h:490
This struct bundles a function and its first derivatives.
Definition fluxfunctions.h:185
const CylindricalFunctor & dfx() const
Definition fluxfunctions.h:208
const CylindricalFunctor & f() const
Definition fluxfunctions.h:206
const CylindricalFunctor & dfy() const
Definition fluxfunctions.h:210
This struct bundles a function and its first and second derivatives.
Definition fluxfunctions.h:222
Meta-data about the magnetic field in particular the flux function.
Definition magnetic_field.h:101
A tokamak field as given by R0, Psi and Ipol plus Meta-data like shape and equilibrium.
Definition magnetic_field.h:172
Represent functions written in cylindrical coordinates that are independent of the angle phi serving ...
Definition fluxfunctions.h:66
double do_compute(double R, double Z) const
Definition solovev.h:385
Ipol(const Parameters &gp, const std::function< double(double, double)> &psip)
Construct from given geometric parameters.
Definition solovev.h:381
IpolR(const Parameters &gp, const std::function< double(double, double)> &psip, std::function< double(double, double)> psipR)
Construct from given geometric parameters.
Definition solovev.h:402
double do_compute(double R, double Z) const
Definition solovev.h:407
IpolZ(const Parameters &gp, const std::function< double(double, double)> &psip, std::function< double(double, double)> psipZ)
Construct from given geometric parameters.
Definition solovev.h:424
double do_compute(double R, double Z) const
Definition solovev.h:429
Constructs and display geometric parameters for the solovev and taylor fields.
Definition solovev_parameters.h:43
double pp
prefactor for Psi_p
Definition solovev_parameters.h:46
double R_0
major tokamak radius
Definition solovev_parameters.h:45
double a
little tokamak radius
Definition solovev_parameters.h:48
std::string description
Definition solovev_parameters.h:52
double elongation
elongation of the magnetic surfaces
Definition solovev_parameters.h:49
double triangularity
triangularity of the magnetic surfaces
Definition solovev_parameters.h:50
double do_compute(double R, double Z) const
Definition solovev.h:70
Psip(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:67
double do_compute(double R, double Z) const
Definition solovev.h:141
PsipR(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:138
double do_compute(double R, double Z) const
Definition solovev.h:199
PsipRR(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:196
double do_compute(double R, double Z) const
Definition solovev.h:343
PsipRZ(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:340
double do_compute(double R, double Z) const
Definition solovev.h:252
PsipZ(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:249
PsipZZ(const Parameters &gp)
Construct from given geometric parameters.
Definition solovev.h:296
double do_compute(double R, double Z) const
Definition solovev.h:299