Extension: Geometries
#include "dg/geometries/geometries.h"
Loading...
Searching...
No Matches
taylor.h
Go to the documentation of this file.
1#pragma once
2
3#include <iostream>
4#include <fstream>
5#include <cmath>
6#include <vector>
7
8#include "dg/algorithm.h"
10#include "magnetic_field.h"
11
12
17namespace dg
18{
19namespace geo
20{
26namespace taylor
27{
31
37struct Psip : public aCylindricalFunctor<Psip>
38{
43 Psip( solovev::Parameters gp): R0_(gp.R_0), c_(gp.c) {
44 cs_ = sqrt( c_[11]*c_[11]-c_[10]*c_[10]);
45 }
46 double do_compute(double R, double Z) const
47 {
48 double Rn = R/R0_, Zn = Z/R0_;
49 double j1_c12 = std::cyl_bessel_j( 1, c_[11]*Rn);
50 double y1_c12 = std::cyl_neumann( 1, c_[11]*Rn);
51 double j1_cs = std::cyl_bessel_j( 1, cs_*Rn);
52 double y1_cs = std::cyl_neumann( 1, cs_*Rn);
53 return R0_*(
54 1.0*Rn*j1_c12
55 + c_[0]*Rn*y1_c12
56 + c_[1]*Rn*j1_cs*cos(c_[10]*Zn)
57 + c_[2]*Rn*y1_cs*cos(c_[10]*Zn)
58 + c_[3]*cos(c_[11]*sqrt(Rn*Rn+Zn*Zn))
59 + c_[4]*cos(c_[11]*Zn)
60 + c_[5]*Rn*j1_c12*Zn
61 + c_[6]*Rn*y1_c12*Zn
62 + c_[7]*Rn*j1_cs*sin(c_[10]*Zn)
63 + c_[8]*Rn*y1_cs*sin(c_[10]*Zn)
64 + c_[9]*sin(c_[11]*Zn));
65
66 }
67 private:
68 double R0_, cs_;
69 std::vector<double> c_;
70};
71
75struct PsipR: public aCylindricalFunctor<PsipR>
76{
78 PsipR( solovev::Parameters gp): R0_(gp.R_0), c_(gp.c) {
79 cs_=sqrt(c_[11]*c_[11]-c_[10]*c_[10]);
80
81 }
82 double do_compute(double R, double Z) const
83 {
84 double Rn=R/R0_, Zn=Z/R0_;
85 double j1_c12R = std::cyl_bessel_j(1, c_[11]*Rn) + c_[11]/2.*Rn*(
86 std::cyl_bessel_j(0, c_[11]*Rn) - std::cyl_bessel_j(2,c_[11]*Rn));
87 double y1_c12R = std::cyl_neumann(1, c_[11]*Rn) + c_[11]/2.*Rn*(
88 std::cyl_neumann(0, c_[11]*Rn) - std::cyl_neumann(2,c_[11]*Rn));
89 double j1_csR = std::cyl_bessel_j(1, cs_*Rn) + cs_/2.*Rn*(
90 std::cyl_bessel_j(0, cs_*Rn) - std::cyl_bessel_j(2, cs_*Rn));
91 double y1_csR = std::cyl_neumann(1, cs_*Rn) + cs_/2.*Rn*(
92 std::cyl_neumann(0, cs_*Rn) - std::cyl_neumann(2, cs_*Rn));
93 double RZbar = sqrt( Rn*Rn+Zn*Zn);
94 double cosR = -c_[11]*Rn/RZbar*sin(c_[11]*RZbar);
95 return (
96 1.0*j1_c12R
97 + c_[0]*y1_c12R
98 + c_[1]*j1_csR*cos(c_[10]*Zn)
99 + c_[2]*y1_csR*cos(c_[10]*Zn)
100 + c_[3]*cosR
101 + c_[5]*j1_c12R*Zn
102 + c_[6]*y1_c12R*Zn
103 + c_[7]*j1_csR*sin(c_[10]*Zn)
104 + c_[8]*y1_csR*sin(c_[10]*Zn) );
105 }
106 private:
107 double R0_, cs_;
108 std::vector<double> c_;
109};
113struct PsipRR: public aCylindricalFunctor<PsipRR>
114{
116 PsipRR( solovev::Parameters gp ): R0_(gp.R_0), c_(gp.c) {
117 cs_ = sqrt( c_[11]*c_[11]-c_[10]*c_[10]);
118 }
119 double do_compute(double R, double Z) const
120 {
121 double Rn=R/R0_, Zn=Z/R0_;
122 double j1_c12R = c_[11]*(std::cyl_bessel_j(0, c_[11]*Rn) - Rn*c_[11]*std::cyl_bessel_j(1, c_[11]*Rn));
123 double y1_c12R = c_[11]*(std::cyl_neumann( 0, c_[11]*Rn) - Rn*c_[11]*std::cyl_neumann(1, c_[11]*Rn));
124 double j1_csR = cs_*(std::cyl_bessel_j(0, cs_*Rn) - Rn*cs_*std::cyl_bessel_j(1, cs_*Rn));
125 double y1_csR = cs_*(std::cyl_neumann( 0, cs_*Rn) - Rn*cs_*std::cyl_neumann( 1, cs_*Rn));
126 double RZbar = sqrt(Rn*Rn+Zn*Zn);
127 double cosR = -c_[11]/(RZbar*RZbar)*(c_[11]*Rn*Rn*cos(c_[11]*RZbar) +Zn*Zn*sin(c_[11]*RZbar)/RZbar);
128 return 1./R0_*(
129 1.0*j1_c12R
130 + c_[0]*y1_c12R
131 + c_[1]*j1_csR*cos(c_[10]*Zn)
132 + c_[2]*y1_csR*cos(c_[10]*Zn)
133 + c_[3]*cosR
134 + c_[5]*j1_c12R*Zn
135 + c_[6]*y1_c12R*Zn
136 + c_[7]*j1_csR*sin(c_[10]*Zn)
137 + c_[8]*y1_csR*sin(c_[10]*Zn) );
138 }
139 private:
140 double R0_, cs_;
141 std::vector<double> c_;
142};
146struct PsipZ: public aCylindricalFunctor<PsipZ>
147{
149 PsipZ( solovev::Parameters gp ): R0_(gp.R_0), c_(gp.c) {
150 cs_ = sqrt( c_[11]*c_[11]-c_[10]*c_[10]);
151 }
152 double do_compute(double R, double Z) const
153 {
154 double Rn = R/R0_, Zn = Z/R0_;
155 double j1_c12 = std::cyl_bessel_j( 1, c_[11]*Rn);
156 double y1_c12 = std::cyl_neumann( 1, c_[11]*Rn);
157 double j1_cs = std::cyl_bessel_j( 1, cs_*Rn);
158 double y1_cs = std::cyl_neumann( 1, cs_*Rn);
159 return (
160 - c_[1]*Rn*j1_cs*c_[10]*sin(c_[10]*Zn)
161 - c_[2]*Rn*y1_cs*c_[10]*sin(c_[10]*Zn)
162 - c_[3]*c_[11]*Zn/sqrt(Rn*Rn+Zn*Zn)*sin(c_[11]*sqrt(Rn*Rn+Zn*Zn))
163 - c_[4]*c_[11]*sin(c_[11]*Zn)
164 + c_[5]*Rn*j1_c12
165 + c_[6]*Rn*y1_c12
166 + c_[7]*Rn*j1_cs*c_[10]*cos(c_[10]*Zn)
167 + c_[8]*Rn*y1_cs*c_[10]*cos(c_[10]*Zn)
168 + c_[9]*c_[11]*cos(c_[11]*Zn));
169 }
170 private:
171 double R0_,cs_;
172 std::vector<double> c_;
173};
177struct PsipZZ: public aCylindricalFunctor<PsipZZ>
178{
180 PsipZZ( solovev::Parameters gp): R0_(gp.R_0), c_(gp.c) {
181 cs_ = sqrt( c_[11]*c_[11]-c_[10]*c_[10]);
182 }
183 double do_compute(double R, double Z) const
184 {
185 double Rn = R/R0_, Zn = Z/R0_;
186 double j1_cs = std::cyl_bessel_j( 1, cs_*Rn);
187 double y1_cs = std::cyl_neumann( 1, cs_*Rn);
188 double RZbar = sqrt(Rn*Rn+Zn*Zn);
189 double cosZ = -c_[11]/(RZbar*RZbar)*(c_[11]*Zn*Zn*cos(c_[11]*RZbar) +Rn*Rn*sin(c_[11]*RZbar)/RZbar);
190 return 1./R0_*(
191 - c_[1]*Rn*j1_cs*c_[10]*c_[10]*cos(c_[10]*Zn)
192 - c_[2]*Rn*y1_cs*c_[10]*c_[10]*cos(c_[10]*Zn)
193 + c_[3]*cosZ
194 - c_[4]*c_[11]*c_[11]*cos(c_[11]*Zn)
195 - c_[7]*Rn*j1_cs*c_[10]*c_[10]*sin(c_[10]*Zn)
196 - c_[8]*Rn*y1_cs*c_[10]*c_[10]*sin(c_[10]*Zn)
197 - c_[9]*c_[11]*c_[11]*sin(c_[11]*Zn));
198 }
199 private:
200 double R0_, cs_;
201 std::vector<double> c_;
202};
206struct PsipRZ: public aCylindricalFunctor<PsipRZ>
207{
209 PsipRZ( solovev::Parameters gp ): R0_(gp.R_0), c_(gp.c) {
210 cs_ = sqrt( c_[11]*c_[11]-c_[10]*c_[10]);
211 }
212 double do_compute(double R, double Z) const
213 {
214 double Rn=R/R0_, Zn=Z/R0_;
215 double j1_c12R = std::cyl_bessel_j(1, c_[11]*Rn) + c_[11]/2.*Rn*(
216 std::cyl_bessel_j(0, c_[11]*Rn) - std::cyl_bessel_j(2,c_[11]*Rn));
217 double y1_c12R = std::cyl_neumann( 1, c_[11]*Rn) + c_[11]/2.*Rn*(
218 std::cyl_neumann( 0, c_[11]*Rn) - std::cyl_neumann( 2,c_[11]*Rn));
219 double j1_csR = std::cyl_bessel_j(1, cs_*Rn) + cs_/2.*Rn*(
220 std::cyl_bessel_j(0, cs_*Rn) - std::cyl_bessel_j(2, cs_*Rn));
221 double y1_csR = std::cyl_neumann( 1, cs_*Rn) + cs_/2.*Rn*(
222 std::cyl_neumann( 0, cs_*Rn) - std::cyl_neumann(2, cs_*Rn));
223 double RZbar = sqrt(Rn*Rn+Zn*Zn);
224 double cosRZ = -c_[11]*Rn*Zn/(RZbar*RZbar*RZbar)*( c_[11]*RZbar*cos(c_[11]*RZbar) -sin(c_[11]*RZbar) );
225 return 1./R0_*(
226 - c_[1]*j1_csR*c_[10]*sin(c_[10]*Zn)
227 - c_[2]*y1_csR*c_[10]*sin(c_[10]*Zn)
228 + c_[3]*cosRZ
229 + c_[5]*j1_c12R
230 + c_[6]*y1_c12R
231 + c_[7]*j1_csR*c_[10]*cos(c_[10]*Zn)
232 + c_[8]*y1_csR*c_[10]*cos(c_[10]*Zn) );
233 }
234 private:
235 double R0_, cs_;
236 std::vector<double> c_;
237};
238
244struct Ipol: public aCylindricalFunctor<Ipol>
245{
247 Ipol( solovev::Parameters gp ): c12_(gp.c[11]), psip_(gp) { }
248 double do_compute(double R, double Z) const
249 {
250 return c12_*psip_(R,Z);
251
252 }
253 private:
254 double c12_;
255 Psip psip_;
256};
260struct IpolR: public aCylindricalFunctor<IpolR>
261{
263 IpolR( solovev::Parameters gp ): c12_(gp.c[11]), psipR_(gp) { }
264 double do_compute(double R, double Z) const
265 {
266 return c12_*psipR_(R,Z);
267 }
268 private:
269 double c12_;
270 PsipR psipR_;
271};
275struct IpolZ: public aCylindricalFunctor<IpolZ>
276{
278 IpolZ( solovev::Parameters gp ): c12_(gp.c[11]), psipZ_(gp) { }
279 double do_compute(double R, double Z) const
280 {
281 return c12_*psipZ_(R,Z);
282 }
283 private:
284 double c12_;
285 PsipZ psipZ_;
286};
287
289{
290 return CylindricalFunctorsLvl2( Psip(gp), PsipR(gp), PsipZ(gp),PsipRR(gp), PsipRZ(gp), PsipZZ(gp));
291}
296
298
299} //namespace taylor
314} //namespace geo
315
316}//namespace dg
317
@ none
no modification
@ solovev
dg::geo::solovev::Psip
@ taylor
dg::geo::taylor::Psip
CylindricalFunctorsLvl2 createPsip(solovev::Parameters gp)
Definition taylor.h:288
CylindricalFunctorsLvl1 createIpol(solovev::Parameters gp)
Definition taylor.h:292
dg::geo::TokamakMagneticField createTaylorField(dg::geo::solovev::Parameters gp)
Create a Taylor Magnetic field.
Definition taylor.h:308
dg::geo::solovev::Parameters Parameters
bring Parameters into the taylor namespace
Definition taylor.h:30
This struct bundles a function and its first derivatives.
Definition fluxfunctions.h:185
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:94
A tokamak field as given by R0, Psi and Ipol plus Meta-data like shape and equilibrium.
Definition magnetic_field.h:165
Represent functions written in cylindrical coordinates that are independent of the angle phi serving ...
Definition fluxfunctions.h:66
Constructs and display geometric parameters for the solovev and taylor fields.
Definition solovev_parameters.h:43
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
Definition taylor.h:245
Ipol(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:247
double do_compute(double R, double Z) const
Definition taylor.h:248
Definition taylor.h:261
double do_compute(double R, double Z) const
Definition taylor.h:264
IpolR(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:263
Definition taylor.h:276
double do_compute(double R, double Z) const
Definition taylor.h:279
IpolZ(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:278
Definition taylor.h:38
Psip(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:43
double do_compute(double R, double Z) const
Definition taylor.h:46
Definition taylor.h:76
double do_compute(double R, double Z) const
Definition taylor.h:82
PsipR(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:78
Definition taylor.h:114
PsipRR(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:116
double do_compute(double R, double Z) const
Definition taylor.h:119
Definition taylor.h:207
double do_compute(double R, double Z) const
Definition taylor.h:212
PsipRZ(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:209
Definition taylor.h:147
PsipZ(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:149
double do_compute(double R, double Z) const
Definition taylor.h:152
Definition taylor.h:178
double do_compute(double R, double Z) const
Definition taylor.h:183
PsipZZ(solovev::Parameters gp)
Construct from given geometric parameters.
Definition taylor.h:180