Extension: Geometries
#include "dg/geometries/geometries.h"
Loading...
Searching...
No Matches
magnetic_field.h
Go to the documentation of this file.
1#pragma once
2
3#include <map>
4#include "fluxfunctions.h"
5
10namespace dg
11{
12namespace geo
13{
30
32enum class equilibrium
33{
34 solovev,
35 taylor,
37 guenter,
38 toroidal,
40};
42enum class modifier
43{
44 none,
45 heaviside,
46 sol_pfr,
48 // TODO There should be the "circular" parameter from feltor and should there be a "heavisideX"?
49};
56enum class description
57{
58 standardO,
59 standardX,
60 doubleX,
61 none,
62 square,
64};
66inline const std::map<std::string, equilibrium> str2equilibrium{
67 {"solovev", equilibrium::solovev},
68 {"taylor", equilibrium::taylor},
69 {"polynomial", equilibrium::polynomial},
70 {"guenter", equilibrium::guenter},
71 {"toroidal", equilibrium::toroidal},
72 {"circular", equilibrium::circular}
73};
74inline const std::map<std::string, modifier> str2modifier{
75 {"none", modifier::none},
76 {"heaviside", modifier::heaviside},
77 {"sol_pfr", modifier::sol_pfr},
78 {"sol_pfr_2X", modifier::sol_pfr_2X}
79};
80inline const std::map<std::string, description> str2description{
81 {"standardO", description::standardO},
82 {"standardX", description::standardX},
83 {"doubleX", description::doubleX},
84 {"square", description::square},
85 {"none", description::none},
86 {"centeredX", description::centeredX}
87};
89
90//Meta-data about magnetic fields
91//
101{
106 m_a = 1, m_elongation = 1, m_triangularity = 0;
107 m_equilibrium = equilibrium::toroidal;
108 m_modifier = modifier::none;
109 m_description = description::none;
110 }
122 equilibrium equ, modifier mod, description des): m_a(a),
123 m_elongation(elongation),
124 m_triangularity( triangularity),
125 m_equilibrium( equ),
126 m_modifier(mod), m_description( des){}
132 double a() const{return m_a;}
138 double elongation() const{return m_elongation;}
144 double triangularity() const{return m_triangularity;}
146 equilibrium getEquilibrium() const{return m_equilibrium;}
148 modifier getModifier() const{return m_modifier;}
150 description getDescription() const{return m_description;}
151 private:
152 double m_a,
153 m_elongation,
154 m_triangularity;
155 equilibrium m_equilibrium;
156 modifier m_modifier;
157 description m_description;
158};
159
172{
177 ): m_R0(R0), m_psip(psip), m_ipol(ipol), m_params(gp){}
178 void set( double R0, const CylindricalFunctorsLvl2& psip, const
180 {
181 m_R0=R0;
182 m_psip=psip;
183 m_ipol=ipol;
184 m_params = gp;
185 }
187 double R0()const {return m_R0;}
189 const CylindricalFunctor& psip()const{return m_psip.f();}
191 const CylindricalFunctor& psipR()const{return m_psip.dfx();}
193 const CylindricalFunctor& psipZ()const{return m_psip.dfy();}
195 const CylindricalFunctor& psipRR()const{return m_psip.dfxx();}
197 const CylindricalFunctor& psipRZ()const{return m_psip.dfxy();}
199 const CylindricalFunctor& psipZZ()const{return m_psip.dfyy();}
201 const CylindricalFunctor& ipol()const{return m_ipol.f();}
203 const CylindricalFunctor& ipolR()const{return m_ipol.dfx();}
205 const CylindricalFunctor& ipolZ()const{return m_ipol.dfy();}
206
207 const CylindricalFunctorsLvl2& get_psip() const{return m_psip;}
208 const CylindricalFunctorsLvl1& get_ipol() const{return m_ipol;}
214 const MagneticFieldParameters& params() const{return m_params;}
215
216 private:
217 double m_R0;
221};
222
224inline CylindricalFunctorsLvl1 periodify( const CylindricalFunctorsLvl1& in, double R0, double R1, double Z0, double Z1, bc bcx, bc bcy)
225{
226 return CylindricalFunctorsLvl1(
227 Periodify( in.f(), R0, R1, Z0, Z1, bcx, bcy),
228 Periodify( in.dfx(), R0, R1, Z0, Z1, inverse(bcx), bcy),
229 Periodify( in.dfy(), R0, R1, Z0, Z1, bcx, inverse(bcy)));
230}
231inline CylindricalFunctorsLvl2 periodify( const CylindricalFunctorsLvl2& in, double R0, double R1, double Z0, double Z1, bc bcx, bc bcy)
232{
233 return CylindricalFunctorsLvl2(
234 Periodify( in.f(), R0, R1, Z0, Z1, bcx, bcy),
235 Periodify( in.dfx(), R0, R1, Z0, Z1, inverse(bcx), bcy),
236 Periodify( in.dfy(), R0, R1, Z0, Z1, bcx, inverse(bcy)),
237 Periodify( in.dfxx(), R0, R1, Z0, Z1, bcx, bcy),
238 Periodify( in.dfxy(), R0, R1, Z0, Z1, inverse(bcx), inverse(bcy)),
239 Periodify( in.dfyy(), R0, R1, Z0, Z1, bcx, bcy));
240}
242
257inline TokamakMagneticField periodify( const TokamakMagneticField& mag, double R0, double R1, double Z0, double Z1, dg::bc bcx, dg::bc bcy)
258{
259 return TokamakMagneticField( mag.R0(),
260 periodify( mag.get_psip(), R0, R1, Z0, Z1, bcx, bcy),
261 //what if Dirichlet BC in the current? Won't that generate a NaN?
262 periodify( mag.get_ipol(), R0, R1, Z0, Z1, bcx, bcy), mag.params());
263}
264
266struct LaplacePsip : public aCylindricalFunctor<LaplacePsip>
267{
268 LaplacePsip( const TokamakMagneticField& mag): m_mag(mag) { }
269 double do_compute(double R, double Z) const
270 {
271 return m_mag.psipR()(R,Z)/R+ m_mag.psipRR()(R,Z) + m_mag.psipZZ()(R,Z);
272 }
273 private:
275};
276
278struct Bmodule : public aCylindricalFunctor<Bmodule>
279{
280 Bmodule( const TokamakMagneticField& mag): m_mag(mag) { }
281 double do_compute(double R, double Z) const
282 {
283 double psipR = m_mag.psipR()(R,Z), psipZ = m_mag.psipZ()(R,Z), ipol = m_mag.ipol()(R,Z);
284 return m_mag.R0()/R*sqrt(ipol*ipol+psipR*psipR +psipZ*psipZ);
285 }
286 private:
288};
289
292struct Btor : public aCylindricalFunctor<Btor>
293{
294 Btor( const TokamakMagneticField& mag): m_mag(mag) { }
295 double do_compute(double R, double Z) const
296 {
297 double ipol = m_mag.ipol()(R,Z);
298 return m_mag.R0()*ipol/R;
299 }
300 private:
302};
303
304
312struct InvB : public aCylindricalFunctor<InvB>
313{
314 InvB( const TokamakMagneticField& mag): m_mag(mag){ }
315 double do_compute(double R, double Z) const
316 {
317 double psipR = m_mag.psipR()(R,Z), psipZ = m_mag.psipZ()(R,Z), ipol = m_mag.ipol()(R,Z);
318 return R/(m_mag.R0()*sqrt(ipol*ipol + psipR*psipR +psipZ*psipZ)) ;
319 }
320 private:
322};
323
326struct InvBtor : public aCylindricalFunctor<InvBtor>
327{
328 InvBtor( const TokamakMagneticField& mag): m_mag(mag) { }
329 double do_compute(double R, double Z) const
330 {
331 double ipol = m_mag.ipol()(R,Z);
332 return R/m_mag.R0()/ipol;
333 }
334 private:
336};
337
345struct LnB : public aCylindricalFunctor<LnB>
346{
347 LnB(const TokamakMagneticField& mag): m_mag(mag) { }
348 double do_compute(double R, double Z) const
349 {
350 double psipR = m_mag.psipR()(R,Z), psipZ = m_mag.psipZ()(R,Z), ipol = m_mag.ipol()(R,Z);
351 return log(m_mag.R0()/R*sqrt(ipol*ipol + psipR*psipR +psipZ*psipZ)) ;
352 }
353 private:
355};
356
367struct BR: public aCylindricalFunctor<BR>
368{
369 BR(const TokamakMagneticField& mag): m_invB(mag), m_mag(mag) { }
370 double do_compute(double R, double Z) const
371 {
372 double Rn = R/m_mag.R0();
373 double invB = m_invB(R,Z);
374 return -1./R/invB + invB/Rn/Rn*(m_mag.ipol()(R,Z)*m_mag.ipolR()(R,Z) + m_mag.psipR()(R,Z)*m_mag.psipRR()(R,Z) + m_mag.psipZ()(R,Z)*m_mag.psipRZ()(R,Z));
375 }
376 private:
377 InvB m_invB;
379};
380
389struct BZ: public aCylindricalFunctor<BZ>
390{
391 BZ(const TokamakMagneticField& mag ): m_mag(mag), m_invB(mag) { }
392 double do_compute(double R, double Z) const
393 {
394 double Rn = R/m_mag.R0();
395 return (m_invB(R,Z)/Rn/Rn)*(m_mag.ipol()(R,Z)*m_mag.ipolZ()(R,Z) + m_mag.psipR()(R,Z)*m_mag.psipRZ()(R,Z) + m_mag.psipZ()(R,Z)*m_mag.psipZZ()(R,Z));
396 }
397 private:
399 InvB m_invB;
400};
401
408struct ToroidalBR: public aCylindricalFunctor<ToroidalBR>
409{
410 ToroidalBR(const TokamakMagneticField& mag): m_mag(mag) { }
411 double do_compute(double R, double Z) const
412 {
413 return m_mag.R0() / R *m_mag.ipolR()(R,Z) - m_mag.R0() * m_mag.ipol()(R,Z)/ R / R;
414 }
415 private:
417};
418
425struct ToroidalBZ: public aCylindricalFunctor<ToroidalBZ>
426{
427 ToroidalBZ(const TokamakMagneticField& mag ): m_mag(mag) { }
428 double do_compute(double R, double Z) const
429 {
430 return m_mag.R0() / R *m_mag.ipolZ()(R,Z);
431 }
432 private:
434};
435
440struct CurvatureNablaBR: public aCylindricalFunctor<CurvatureNablaBR>
441{
442 CurvatureNablaBR(const TokamakMagneticField& mag, int sign): m_invB(mag), m_bZ(mag) {
443 if( sign >0)
444 m_sign = +1.;
445 else
446 m_sign = -1;
447 }
448 double do_compute( double R, double Z) const
449 {
450 return -m_sign*m_invB(R,Z)*m_invB(R,Z)*m_bZ(R,Z);
451 }
452 private:
453 double m_sign;
454 InvB m_invB;
455 BZ m_bZ;
456};
457
462struct CurvatureNablaBZ: public aCylindricalFunctor<CurvatureNablaBZ>
463{
464 CurvatureNablaBZ( const TokamakMagneticField& mag, int sign): m_invB(mag), m_bR(mag) {
465 if( sign >0)
466 m_sign = +1.;
467 else
468 m_sign = -1;
469 }
470 double do_compute( double R, double Z) const
471 {
472 return m_sign*m_invB(R,Z)*m_invB(R,Z)*m_bR(R,Z);
473 }
474 private:
475 double m_sign;
476 InvB m_invB;
477 BR m_bR;
478};
479
484struct CurvatureKappaR: public aCylindricalFunctor<CurvatureKappaR>
485{
488 double do_compute( double, double) const
489 {
490 return 0.;
491 }
492 private:
493};
494
499struct CurvatureKappaZ: public aCylindricalFunctor<CurvatureKappaZ>
500{
501 CurvatureKappaZ( const TokamakMagneticField& mag, int sign): m_invB(mag) {
502 if( sign >0)
503 m_sign = +1.;
504 else
505 m_sign = -1;
506 }
507 double do_compute( double R, double Z) const
508 {
509 return -m_sign*m_invB(R,Z)/R;
510 }
511 private:
512 double m_sign;
513 InvB m_invB;
514};
515
520struct DivCurvatureKappa: public aCylindricalFunctor<DivCurvatureKappa>
521{
522 DivCurvatureKappa( const TokamakMagneticField& mag, int sign): m_invB(mag), m_bZ(mag){
523 if( sign >0)
524 m_sign = +1.;
525 else
526 m_sign = -1;
527 }
528 double do_compute( double R, double Z) const
529 {
530 return m_sign*m_bZ(R,Z)*m_invB(R,Z)*m_invB(R,Z)/R;
531 }
532 private:
533 double m_sign;
534 InvB m_invB;
535 BZ m_bZ;
536};
537
542struct DivCurvatureNablaB: public aCylindricalFunctor<DivCurvatureNablaB>
543{
544 DivCurvatureNablaB( const TokamakMagneticField& mag, int sign): m_div(mag, sign){ }
545 double do_compute( double R, double Z) const
546 {
547 return -m_div(R,Z);
548 }
549 private:
550 DivCurvatureKappa m_div;
551};
555struct TrueCurvatureNablaBR: public aCylindricalFunctor<TrueCurvatureNablaBR>
556{
557 TrueCurvatureNablaBR(const TokamakMagneticField& mag): m_R0(mag.R0()), m_mag(mag), m_invB(mag), m_bZ(mag) { }
558 double do_compute( double R, double Z) const
559 {
560 double invB = m_invB(R,Z), ipol = m_mag.ipol()(R,Z);
561 return -invB*invB*invB*ipol*m_R0/R*m_bZ(R,Z);
562 }
563 private:
564 double m_R0;
566 InvB m_invB;
567 BZ m_bZ;
568};
569
573struct TrueCurvatureNablaBZ: public aCylindricalFunctor<TrueCurvatureNablaBZ>
574{
575 TrueCurvatureNablaBZ(const TokamakMagneticField& mag): m_R0(mag.R0()), m_mag(mag), m_invB(mag), m_bR(mag) { }
576 double do_compute( double R, double Z) const
577 {
578 double invB = m_invB(R,Z), ipol = m_mag.ipol()(R,Z);
579 return invB*invB*invB*ipol*m_R0/R*m_bR(R,Z);
580 }
581 private:
582 double m_R0;
584 InvB m_invB;
585 BR m_bR;
586};
587
591struct TrueCurvatureNablaBP: public aCylindricalFunctor<TrueCurvatureNablaBP>
592{
593 TrueCurvatureNablaBP(const TokamakMagneticField& mag): m_mag(mag), m_invB(mag),m_bR(mag), m_bZ(mag) { }
594 double do_compute( double R, double Z) const
595 {
596 double invB = m_invB(R,Z);
597 return m_mag.R0()*invB*invB*invB/R/R*(m_mag.psipZ()(R,Z)*m_bZ(R,Z) + m_mag.psipR()(R,Z)*m_bR(R,Z));
598 }
599 private:
601 InvB m_invB;
602 BR m_bR;
603 BZ m_bZ;
604};
605
607struct TrueCurvatureKappaR: public aCylindricalFunctor<TrueCurvatureKappaR>
608{
609 TrueCurvatureKappaR( const TokamakMagneticField& mag):m_mag(mag), m_invB(mag), m_bZ(mag){ }
610 double do_compute( double R, double Z) const
611 {
612 double invB = m_invB(R,Z);
613 return m_mag.R0()*invB*invB/R*(m_mag.ipolZ()(R,Z) - m_mag.ipol()(R,Z)*invB*m_bZ(R,Z));
614 }
615 private:
617 InvB m_invB;
618 BZ m_bZ;
619};
620
622struct TrueCurvatureKappaZ: public aCylindricalFunctor<TrueCurvatureKappaZ>
623{
624 TrueCurvatureKappaZ( const TokamakMagneticField& mag):m_mag(mag), m_invB(mag), m_bR(mag){ }
625 double do_compute( double R, double Z) const
626 {
627 double invB = m_invB(R,Z);
628 return m_mag.R0()*invB*invB/R*( - m_mag.ipolR()(R,Z) + m_mag.ipol()(R,Z)*invB*m_bR(R,Z));
629 }
630 private:
632 InvB m_invB;
633 BR m_bR;
634};
636struct TrueCurvatureKappaP: public aCylindricalFunctor<TrueCurvatureKappaP>
637{
638 TrueCurvatureKappaP( const TokamakMagneticField& mag):m_mag(mag), m_invB(mag), m_bR(mag), m_bZ(mag){ }
639 double do_compute( double R, double Z) const
640 {
641 double invB = m_invB(R,Z);
642 return m_mag.R0()*invB*invB/R/R*(
643 + invB*m_mag.psipZ()(R,Z)*m_bZ(R,Z) + invB *m_mag.psipR()(R,Z)*m_bR(R,Z)
644 + m_mag.psipR()(R,Z)/R - m_mag.psipRR()(R,Z) - m_mag.psipZZ()(R,Z));
645 }
646 private:
648 InvB m_invB;
649 BR m_bR;
650 BZ m_bZ;
651};
652
654struct TrueDivCurvatureKappa: public aCylindricalFunctor<TrueDivCurvatureKappa>
655{
656 TrueDivCurvatureKappa( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag), m_bR(mag), m_bZ(mag){}
657 double do_compute( double R, double Z) const
658 {
659 double invB = m_invB(R,Z);
660 return m_mag.R0()*invB*invB*invB/R*( m_mag.ipolR()(R,Z)*m_bZ(R,Z) - m_mag.ipolZ()(R,Z)*m_bR(R,Z) );
661 }
662 private:
664 InvB m_invB;
665 BR m_bR;
666 BZ m_bZ;
667};
668
670struct TrueDivCurvatureNablaB: public aCylindricalFunctor<TrueDivCurvatureNablaB>
671{
673 double do_compute( double R, double Z) const {
674 return - m_div(R,Z);
675 }
676 private:
678};
684struct ToroidalCurvatureNablaBR: public aCylindricalFunctor<ToroidalCurvatureNablaBR>
685{
687 double do_compute( double R, double Z) const
688 {
689 double ipol = m_mag.ipol()(R,Z), ipolZ = m_mag.ipolZ()(R,Z);
690 return -R*ipolZ/m_mag.R0()/ipol/ipol;
691 }
692 private:
694};
695
700struct ToroidalCurvatureNablaBZ: public aCylindricalFunctor<ToroidalCurvatureNablaBZ>
701{
703 double do_compute( double R, double Z) const
704 {
705 double ipol = m_mag.ipol()(R,Z), ipolR = m_mag.ipolR()(R,Z);
706 return +R*ipolR/m_mag.R0()/ipol/ipol - 1./m_mag.R0()/ipol;
707 }
708 private:
710};
711
716struct ToroidalCurvatureKappaR: public aCylindricalFunctor<ToroidalCurvatureKappaR>
717{
720 double do_compute( double, double) const
721 {
722 return 0.;
723 }
724 private:
725};
726
731struct ToroidalCurvatureKappaZ: public aCylindricalFunctor<ToroidalCurvatureKappaZ>
732{
734 double do_compute( double R, double Z) const
735 {
736 double ipol = m_mag.ipol()(R,Z);
737 return -1/m_mag.R0()/ipol;
738 }
739 private:
741};
742
747struct ToroidalDivCurvatureKappa: public aCylindricalFunctor<ToroidalDivCurvatureKappa>
748{
750 double do_compute( double R, double Z) const
751 {
752 double ipol = m_mag.ipol()(R,Z), ipolZ = m_mag.ipolZ()(R,Z);
753 return ipolZ / m_mag.R0()/ ipol/ipol;
754 }
755 private:
757};
759
765struct GradLnB: public aCylindricalFunctor<GradLnB>
766{
767 GradLnB( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag), m_bR(mag), m_bZ(mag) { }
768 double do_compute( double R, double Z) const
769 {
770 double invB = m_invB(R,Z);
771 return m_mag.R0()*invB*invB*(m_bR(R,Z)*m_mag.psipZ()(R,Z)-m_bZ(R,Z)*m_mag.psipR()(R,Z))/R ;
772 }
773 private:
775 InvB m_invB;
776 BR m_bR;
777 BZ m_bZ;
778};
785struct Divb: public aCylindricalFunctor<Divb>
786{
787 Divb( const TokamakMagneticField& mag): m_gradLnB(mag) { }
788 double do_compute( double R, double Z) const
789 {
790 return -m_gradLnB(R,Z);
791 }
792 private:
793 GradLnB m_gradLnB;
794};
795
801struct ToroidalGradLnB: public aCylindricalFunctor<ToroidalGradLnB>
802{
803 ToroidalGradLnB( const TokamakMagneticField& mag): m_mag(mag) { }
804 double do_compute( double R, double Z) const
805 {
806 double ipol = m_mag.ipol()(R,Z), ipolR = m_mag.ipolR()(R,Z), psipZ = m_mag.psipZ()(R,Z);
807 return ipolR * psipZ / ipol /ipol - psipZ/ipol/R;
808 }
809 private:
811};
818struct ToroidalDivb: public aCylindricalFunctor<ToroidalDivb>
819{
820 ToroidalDivb( const TokamakMagneticField& mag): m_torgradLnB(mag) { }
821 double do_compute( double R, double Z) const
822 {
823 return -m_torgradLnB(R,Z);
824 }
825 private:
826 ToroidalGradLnB m_torgradLnB;
827};
828
830struct BFieldP: public aCylindricalFunctor<BFieldP>
831{
832 BFieldP( const TokamakMagneticField& mag): m_mag(mag){}
833 double do_compute( double R, double Z) const
834 {
835 return m_mag.R0()*m_mag.ipol()(R,Z)/R/R;
836 }
837 private:
838
840};
841
843struct BFieldR: public aCylindricalFunctor<BFieldR>
844{
845 BFieldR( const TokamakMagneticField& mag): m_mag(mag){}
846 double do_compute( double R, double Z) const
847 {
848 return m_mag.R0()/R*m_mag.psipZ()(R,Z);
849 }
850 private:
852
853};
854
856struct BFieldZ: public aCylindricalFunctor<BFieldZ>
857{
858 BFieldZ( const TokamakMagneticField& mag): m_mag(mag){}
859 double do_compute( double R, double Z) const
860 {
861 return -m_mag.R0()/R*m_mag.psipR()(R,Z);
862 }
863 private:
865};
866
868struct BFieldT: public aCylindricalFunctor<BFieldT>
869{
870 BFieldT( const TokamakMagneticField& mag): m_R0(mag.R0()), m_fieldR(mag), m_fieldZ(mag){}
871 double do_compute(double R, double Z) const
872 {
873 double r2 = (R-m_R0)*(R-m_R0) + Z*Z;
874 return m_fieldR(R,Z)*(-Z/r2) + m_fieldZ(R,Z)*(R-m_R0)/r2;
875 }
876 private:
877 double m_R0;
878 BFieldR m_fieldR;
879 BFieldZ m_fieldZ;
880};
881
883struct BHatR: public aCylindricalFunctor<BHatR>
884{
885 BHatR( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag){ }
886 double do_compute( double R, double Z) const
887 {
888 return m_invB(R,Z)*m_mag.R0()/R*m_mag.psipZ()(R,Z);
889 }
890 private:
892 InvB m_invB;
893
894};
895
897struct BHatZ: public aCylindricalFunctor<BHatZ>
898{
899 BHatZ( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag){ }
900 double do_compute( double R, double Z) const
901 {
902 return -m_invB(R,Z)*m_mag.R0()/R*m_mag.psipR()(R,Z);
903 }
904 private:
906 InvB m_invB;
907};
908
910struct BHatP: public aCylindricalFunctor<BHatP>
911{
912 BHatP( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag){ }
913 double do_compute( double R, double Z) const
914 {
915 return m_invB(R,Z)*m_mag.R0()*m_mag.ipol()(R,Z)/R/R;
916 }
917 private:
919 InvB m_invB;
920};
921
923struct ToroidalBHatR: public aCylindricalFunctor<ToroidalBHatR>
924{
925 ToroidalBHatR( const TokamakMagneticField& mag): m_mag(mag){ }
926 double do_compute( double R, double Z) const
927 {
928 return m_mag.psipZ()(R,Z)/m_mag.ipol()(R,Z);
929 }
930 private:
932
933};
934
936struct ToroidalBHatZ: public aCylindricalFunctor<ToroidalBHatZ>
937{
938 ToroidalBHatZ( const TokamakMagneticField& mag): m_mag(mag){ }
939 double do_compute( double R, double Z) const
940 {
941 return -m_mag.psipR()(R,Z)/m_mag.ipol()(R,Z);
942 }
943 private:
945};
946
948struct ToroidalBHatP: public aCylindricalFunctor<ToroidalBHatP>
949{
950 ToroidalBHatP( const TokamakMagneticField& mag): m_mag(mag){ }
951 double do_compute( double R, double) const
952 {
953 return 1./R;
954 }
955 private:
957};
958
959
969 if( sign > 0)
970 return CylindricalVectorLvl1( Constant(0), Constant(0), [](double x, double){ return 1./x;}, Constant(0), Constant(0));
971 return CylindricalVectorLvl1( Constant(0), Constant(0), [](double x, double){ return -1./x;}, Constant(0), Constant(0));
972}
993 return CylindricalVectorLvl0( CurvatureKappaR(mag, sign), CurvatureKappaZ(mag, sign), Constant(0));
994}
1025
1026
1028struct BHatRR: public aCylindricalFunctor<BHatRR>
1029{
1030 BHatRR( const TokamakMagneticField& mag): m_invB(mag), m_br(mag), m_mag(mag){}
1031 double do_compute( double R, double Z) const
1032 {
1033 double psipZ = m_mag.psipZ()(R,Z);
1034 double psipRZ = m_mag.psipRZ()(R,Z);
1035 double binv = m_invB(R,Z);
1036 return -psipZ*m_mag.R0()*binv/R/R + psipRZ*binv*m_mag.R0()/R
1037 -psipZ*m_mag.R0()/R*binv*binv*m_br(R,Z);
1038 }
1039 private:
1040 InvB m_invB;
1041 BR m_br;
1043};
1045struct BHatRZ: public aCylindricalFunctor<BHatRZ>
1046{
1047 BHatRZ( const TokamakMagneticField& mag): m_invB(mag), m_bz(mag), m_mag(mag){}
1048 double do_compute( double R, double Z) const
1049 {
1050 double psipZ = m_mag.psipZ()(R,Z);
1051 double psipZZ = m_mag.psipZZ()(R,Z);
1052 double binv = m_invB(R,Z);
1053 return m_mag.R0()/R*( psipZZ*binv -binv*binv*m_bz(R,Z)*psipZ );
1054 }
1055 private:
1056 InvB m_invB;
1057 BZ m_bz;
1059};
1061struct BHatZR: public aCylindricalFunctor<BHatZR>
1062{
1063 BHatZR( const TokamakMagneticField& mag): m_invB(mag), m_br(mag), m_mag(mag){}
1064 double do_compute( double R, double Z) const
1065 {
1066 double psipR = m_mag.psipR()(R,Z);
1067 double psipRR = m_mag.psipRR()(R,Z);
1068 double binv = m_invB(R,Z);
1069 return +psipR*m_mag.R0()*binv/R/R - psipRR*binv*m_mag.R0()/R
1070 +psipR*m_mag.R0()/R*binv*binv*m_br(R,Z);
1071 }
1072 private:
1073 InvB m_invB;
1074 BR m_br;
1076};
1078struct BHatZZ: public aCylindricalFunctor<BHatZZ>
1079{
1080 BHatZZ( const TokamakMagneticField& mag): m_invB(mag), m_bz(mag), m_mag(mag){}
1081 double do_compute( double R, double Z) const
1082 {
1083 double psipR = m_mag.psipR()(R,Z);
1084 double psipRZ = m_mag.psipRZ()(R,Z);
1085 double binv = m_invB(R,Z);
1086 return -m_mag.R0()/R*( psipRZ*binv -binv*binv*m_bz(R,Z)*psipR );
1087 }
1088 private:
1089 InvB m_invB;
1090 BZ m_bz;
1092};
1094struct BHatPR: public aCylindricalFunctor<BHatPR>
1095{
1096 BHatPR( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag), m_br(mag){ }
1097 double do_compute( double R, double Z) const
1098 {
1099 double binv = m_invB(R,Z);
1100 double ipol = m_mag.ipol()(R,Z);
1101 double ipolR = m_mag.ipolR()(R,Z);
1102 return -binv*binv*m_br(R,Z)*m_mag.R0()*ipol/R/R
1103 - 2./R/R/R*binv*m_mag.R0()*ipol
1104 + binv *m_mag.R0()/R/R*ipolR;
1105 }
1106 private:
1108 InvB m_invB;
1109 BR m_br;
1110};
1112struct BHatPZ: public aCylindricalFunctor<BHatPZ>
1113{
1114 BHatPZ( const TokamakMagneticField& mag): m_mag(mag), m_invB(mag), m_bz(mag){ }
1115 double do_compute( double R, double Z) const
1116 {
1117 double binv = m_invB(R,Z);
1118 double ipol = m_mag.ipol()(R,Z);
1119 double ipolZ = m_mag.ipolZ()(R,Z);
1120 return -binv*binv*m_bz(R,Z)*m_mag.R0()*ipol/R/R
1121 + binv *m_mag.R0()/R/R*ipolZ;
1122 }
1123 private:
1125 InvB m_invB;
1126 BZ m_bz;
1127};
1128
1130struct DivVVP: public aCylindricalFunctor<DivVVP>
1131{
1132 DivVVP( const TokamakMagneticField& mag): m_mag(mag),
1133 m_bhatP(mag){ }
1134 double do_compute( double R, double Z) const
1135 {
1136 double ipol = m_mag.ipol()(R,Z), ipolR = m_mag.ipolR()(R,Z),
1137 ipolZ = m_mag.ipolZ()(R,Z);
1138 double psipR = m_mag.psipR()(R,Z), psipZ = m_mag.psipZ()(R,Z);
1139 double bphi = m_bhatP(R,Z);
1140 return -(psipZ*(ipolR/R - 2.*ipol/R/R) - ipolZ/R*psipR)/
1141 (ipol*ipol + psipR*psipR + psipZ*psipZ)/bphi/bphi;
1142 }
1143 private:
1145 BHatP m_bhatP;
1146};
1147
1155 return CylindricalVectorLvl1( BHatR(mag), BHatZ(mag), BHatP(mag),
1156 Divb(mag), DivVVP(mag)
1157 );
1158}
1170
1177struct RhoP: public aCylindricalFunctor<RhoP>
1178{
1179 RhoP( const TokamakMagneticField& mag): m_mag(mag){
1180 double RO = m_mag.R0(), ZO = 0;
1181 try{
1182 findOpoint( mag.get_psip(), RO, ZO);
1183 m_psipmin = m_mag.psip()(RO, ZO);
1184 } catch ( dg::Error& err)
1185 {
1186 m_psipmin = 1.;
1188 m_psipmin = -10;
1189 }
1190 }
1191 double do_compute( double R, double Z) const
1192 {
1193 return sqrt( 1.-m_mag.psip()(R,Z)/m_psipmin ) ;
1194 }
1195 private:
1196 double m_psipmin;
1198
1199};
1200
1203{
1205 double do_compute( double R, double Z) const
1206 {
1207 double psipR = m_mag.psipR()(R,Z), psipZ = m_mag.psipZ()(R,Z), ipol = m_mag.ipol()(R,Z);
1208 double psip2 = psipR*psipR+psipZ*psipZ;
1209 if( psip2 == 0)
1210 psip2 = 1e-16;
1211 return (ipol*ipol + psip2)/R/R/psip2;
1212 }
1213 private:
1215};
1216
1220struct WallDirection : public dg::geo::aCylindricalFunctor<WallDirection>
1221{
1230 vertical, std::vector<double> horizontal) : m_vertical(vertical),
1231 m_horizontal(horizontal), m_BR( mag), m_BZ(mag){}
1239 dg::Grid2d walls) : m_vertical({walls.x0(), walls.x1()}),
1240 m_horizontal({walls.y0(), walls.y1()}), m_BR( mag), m_BZ(mag){}
1241 double do_compute ( double R, double Z) const
1242 {
1243 std::vector<double> v_dist(1,1e100), h_dist(1,1e100);
1244 for( auto v : m_vertical)
1245 v_dist.push_back( R-v );
1246 for( auto h : m_horizontal)
1247 h_dist.push_back( Z-h );
1248 double v_min = *std::min_element( v_dist.begin(), v_dist.end(),
1249 [](double a, double b){ return fabs(a) < fabs(b);} );
1250 double h_min = *std::min_element( h_dist.begin(), h_dist.end(),
1251 [](double a, double b){ return fabs(a) < fabs(b);} );
1252 if( fabs(v_min) < fabs(h_min) ) // if vertical R wall is closer
1253 {
1254 double br = m_BR( R,Z);
1255 return v_min*br < 0 ? +1 : -1;
1256 }
1257 else //horizontal Z wall is closer
1258 {
1259 double bz = m_BZ( R,Z);
1260 return h_min*bz < 0 ? +1 : -1;
1261 }
1262 }
1263 private:
1264 std::vector<double> m_vertical, m_horizontal;
1265 dg::geo::BFieldR m_BR;
1266 dg::geo::BFieldZ m_BZ;
1267};
1269
1270} //namespace geo
1271} //namespace dg
1272
bc inverse(bc bound)
modifier
How flux-function is modified.
Definition magnetic_field.h:43
CylindricalVectorLvl0 createCurvatureNablaB(const TokamakMagneticField &mag, int sign)
Approximate curvature vector field (CurvatureNablaBR, CurvatureNablaBZ, Constant(0))
Definition magnetic_field.h:981
CylindricalVectorLvl0 createGradPsip(const TokamakMagneticField &mag)
Gradient Psip vector field (PsipR, PsipZ, 0)
Definition magnetic_field.h:1022
CylindricalVectorLvl0 createTrueCurvatureNablaB(const TokamakMagneticField &mag)
True curvature vector field (TrueCurvatureNablaBR, TrueCurvatureNablaBZ, TrueCurvatureNablaBP)
Definition magnetic_field.h:1012
CylindricalVectorLvl0 createTrueCurvatureKappa(const TokamakMagneticField &mag)
True curvature vector field (TrueCurvatureKappaR, TrueCurvatureKappaZ, TrueCurvatureKappaP)
Definition magnetic_field.h:1002
CylindricalVectorLvl0 createCurvatureKappa(const TokamakMagneticField &mag, int sign)
Approximate curvature vector field (CurvatureKappaR, CurvatureKappaZ, Constant(0))
Definition magnetic_field.h:992
equilibrium
How flux-function is computed. Decides how to construct magnetic field.
Definition magnetic_field.h:33
description
How flux function looks like. Decider on whether and what flux aligned grid to construct.
Definition magnetic_field.h:57
TokamakMagneticField periodify(const TokamakMagneticField &mag, double R0, double R1, double Z0, double Z1, dg::bc bcx, dg::bc bcy)
Use dg::geo::Periodify to periodify every function in the magnetic field.
Definition magnetic_field.h:257
CylindricalVectorLvl1 createToroidalBHat(const TokamakMagneticField &mag)
Contravariant components of the magnetic toroidal unit vector field and its Divergence and derivative...
Definition magnetic_field.h:1165
CylindricalVectorLvl1 createBHat(const TokamakMagneticField &mag)
Contravariant components of the magnetic unit vector field and its Divergence and derivative in cylin...
Definition magnetic_field.h:1154
CylindricalVectorLvl1 createEPhi(int sign)
Contravariant components of the unit vector field (0, 0, ) and its Divergence and derivative (0,...
Definition magnetic_field.h:968
@ none
no modification
@ sol_pfr
Psip is dampened in the SOL and PFR regions but not in the closed field line region.
@ sol_pfr_2X
Psip is dampened in the SOL and PFR regions of each of 2 X-points but not in the closed field line re...
@ heaviside
Psip is dampened to a constant outside a critical value.
@ solovev
dg::geo::solovev::Psip
@ taylor
dg::geo::taylor::Psip
@ polynomial
dg::geo::polynomial::Psip
@ guenter
dg::geo::guenter::Psip
@ toroidal
dg::geo::createToroidalField
@ circular
dg::geo::circular::Psip
@ square
closed flux surfaces centered around an O-point and bordered by a square with four X-points in the co...
@ none
no shaping: Purely toroidal magnetic field
@ standardO
closed flux surfaces centered around an O-point located near (R_0, 0); flux-aligned grids can be cons...
@ doubleX
closed flux surfaces centered around an O-point located near (R_0, 0) and bordered by a separatrix wi...
@ centeredX
one X-point in the middle, no O-point, only open flux surfaces, X-grids cannot be constructed
@ standardX
closed flux surfaces centered around an O-point located near (R_0, 0) and bordered by a separatrix wi...
int findOpoint(const CylindricalFunctorsLvl2 &psi, double &RC, double &ZC)
This function finds O-points of psi.
Definition fluxfunctions.h:335
real_type x0() const
real_type x1() const
Definition magnetic_field.h:831
double do_compute(double R, double Z) const
Definition magnetic_field.h:833
BFieldP(const TokamakMagneticField &mag)
Definition magnetic_field.h:832
Definition magnetic_field.h:844
BFieldR(const TokamakMagneticField &mag)
Definition magnetic_field.h:845
double do_compute(double R, double Z) const
Definition magnetic_field.h:846
Definition magnetic_field.h:869
BFieldT(const TokamakMagneticField &mag)
Definition magnetic_field.h:870
double do_compute(double R, double Z) const
Definition magnetic_field.h:871
Definition magnetic_field.h:857
double do_compute(double R, double Z) const
Definition magnetic_field.h:859
BFieldZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:858
Definition magnetic_field.h:911
double do_compute(double R, double Z) const
Definition magnetic_field.h:913
BHatP(const TokamakMagneticField &mag)
Definition magnetic_field.h:912
Definition magnetic_field.h:1095
BHatPR(const TokamakMagneticField &mag)
Definition magnetic_field.h:1096
double do_compute(double R, double Z) const
Definition magnetic_field.h:1097
Definition magnetic_field.h:1113
double do_compute(double R, double Z) const
Definition magnetic_field.h:1115
BHatPZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:1114
Definition magnetic_field.h:884
BHatR(const TokamakMagneticField &mag)
Definition magnetic_field.h:885
double do_compute(double R, double Z) const
Definition magnetic_field.h:886
Definition magnetic_field.h:1029
BHatRR(const TokamakMagneticField &mag)
Definition magnetic_field.h:1030
double do_compute(double R, double Z) const
Definition magnetic_field.h:1031
Definition magnetic_field.h:1046
double do_compute(double R, double Z) const
Definition magnetic_field.h:1048
BHatRZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:1047
Definition magnetic_field.h:898
BHatZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:899
double do_compute(double R, double Z) const
Definition magnetic_field.h:900
Definition magnetic_field.h:1062
BHatZR(const TokamakMagneticField &mag)
Definition magnetic_field.h:1063
double do_compute(double R, double Z) const
Definition magnetic_field.h:1064
Definition magnetic_field.h:1079
double do_compute(double R, double Z) const
Definition magnetic_field.h:1081
BHatZZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:1080
Definition magnetic_field.h:368
double do_compute(double R, double Z) const
Definition magnetic_field.h:370
BR(const TokamakMagneticField &mag)
Definition magnetic_field.h:369
Definition magnetic_field.h:390
BZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:391
double do_compute(double R, double Z) const
Definition magnetic_field.h:392
Definition magnetic_field.h:279
Bmodule(const TokamakMagneticField &mag)
Definition magnetic_field.h:280
double do_compute(double R, double Z) const
Definition magnetic_field.h:281
Definition magnetic_field.h:293
double do_compute(double R, double Z) const
Definition magnetic_field.h:295
Btor(const TokamakMagneticField &mag)
Definition magnetic_field.h:294
Definition fluxfunctions.h:113
Approximate .
Definition magnetic_field.h:485
CurvatureKappaR()
Definition magnetic_field.h:486
double do_compute(double, double) const
Definition magnetic_field.h:488
CurvatureKappaR(const TokamakMagneticField &, int=+1)
Definition magnetic_field.h:487
Approximate .
Definition magnetic_field.h:500
double do_compute(double R, double Z) const
Definition magnetic_field.h:507
CurvatureKappaZ(const TokamakMagneticField &mag, int sign)
Definition magnetic_field.h:501
Approximate .
Definition magnetic_field.h:441
CurvatureNablaBR(const TokamakMagneticField &mag, int sign)
Definition magnetic_field.h:442
double do_compute(double R, double Z) const
Definition magnetic_field.h:448
Approximate .
Definition magnetic_field.h:463
CurvatureNablaBZ(const TokamakMagneticField &mag, int sign)
Definition magnetic_field.h:464
double do_compute(double R, double Z) const
Definition magnetic_field.h:470
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
const CylindricalFunctor & dfxy() const
Definition fluxfunctions.h:254
const CylindricalFunctor & dfy() const
Definition fluxfunctions.h:250
const CylindricalFunctor & dfx() const
Definition fluxfunctions.h:248
const CylindricalFunctor & dfxx() const
Definition fluxfunctions.h:252
const CylindricalFunctor & f() const
Definition fluxfunctions.h:246
const CylindricalFunctor & dfyy() const
Definition fluxfunctions.h:256
Definition fluxfunctions.h:415
This struct bundles a vector field and its divergence.
Definition fluxfunctions.h:443
Approximate .
Definition magnetic_field.h:521
DivCurvatureKappa(const TokamakMagneticField &mag, int sign)
Definition magnetic_field.h:522
double do_compute(double R, double Z) const
Definition magnetic_field.h:528
Approximate .
Definition magnetic_field.h:543
double do_compute(double R, double Z) const
Definition magnetic_field.h:545
DivCurvatureNablaB(const TokamakMagneticField &mag, int sign)
Definition magnetic_field.h:544
Definition magnetic_field.h:1131
double do_compute(double R, double Z) const
Definition magnetic_field.h:1134
DivVVP(const TokamakMagneticField &mag)
Definition magnetic_field.h:1132
Definition magnetic_field.h:786
double do_compute(double R, double Z) const
Definition magnetic_field.h:788
Divb(const TokamakMagneticField &mag)
Definition magnetic_field.h:787
Definition magnetic_field.h:766
GradLnB(const TokamakMagneticField &mag)
Definition magnetic_field.h:767
double do_compute(double R, double Z) const
Definition magnetic_field.h:768
Inertia factor .
Definition magnetic_field.h:1203
Hoo(dg::geo::TokamakMagneticField mag)
Definition magnetic_field.h:1204
double do_compute(double R, double Z) const
Definition magnetic_field.h:1205
Definition magnetic_field.h:313
InvB(const TokamakMagneticField &mag)
Definition magnetic_field.h:314
double do_compute(double R, double Z) const
Definition magnetic_field.h:315
Definition magnetic_field.h:327
double do_compute(double R, double Z) const
Definition magnetic_field.h:329
InvBtor(const TokamakMagneticField &mag)
Definition magnetic_field.h:328
Definition magnetic_field.h:267
double do_compute(double R, double Z) const
Definition magnetic_field.h:269
LaplacePsip(const TokamakMagneticField &mag)
Definition magnetic_field.h:268
Definition magnetic_field.h:346
double do_compute(double R, double Z) const
Definition magnetic_field.h:348
LnB(const TokamakMagneticField &mag)
Definition magnetic_field.h:347
Meta-data about the magnetic field in particular the flux function.
Definition magnetic_field.h:101
double a() const
The minor radius.
Definition magnetic_field.h:132
modifier getModifier() const
the way the flux function is modified
Definition magnetic_field.h:148
MagneticFieldParameters(double a, double elongation, double triangularity, equilibrium equ, modifier mod, description des)
Constructor.
Definition magnetic_field.h:121
description getDescription() const
how the flux function looks
Definition magnetic_field.h:150
double elongation() const
Definition magnetic_field.h:138
double triangularity() const
Definition magnetic_field.h:144
equilibrium getEquilibrium() const
the way the flux function is computed
Definition magnetic_field.h:146
MagneticFieldParameters()
Default values are for a Toroidal field.
Definition magnetic_field.h:105
Definition magnetic_field.h:1178
double do_compute(double R, double Z) const
Definition magnetic_field.h:1191
RhoP(const TokamakMagneticField &mag)
Definition magnetic_field.h:1179
A tokamak field as given by R0, Psi and Ipol plus Meta-data like shape and equilibrium.
Definition magnetic_field.h:172
const CylindricalFunctor & psipR() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:191
const CylindricalFunctorsLvl2 & get_psip() const
Definition magnetic_field.h:207
const CylindricalFunctor & psipRR() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:195
TokamakMagneticField()
as long as the field stays empty the access functions are undefined
Definition magnetic_field.h:174
const CylindricalFunctor & ipol() const
the current
Definition magnetic_field.h:201
const CylindricalFunctor & ipolR() const
Definition magnetic_field.h:203
const CylindricalFunctor & psipZZ() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:199
const CylindricalFunctorsLvl1 & get_ipol() const
Definition magnetic_field.h:208
const MagneticFieldParameters & params() const
Access Meta-data of the field.
Definition magnetic_field.h:214
const CylindricalFunctor & psipZ() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:193
double R0() const
Definition magnetic_field.h:187
const CylindricalFunctor & ipolZ() const
Definition magnetic_field.h:205
void set(double R0, const CylindricalFunctorsLvl2 &psip, const CylindricalFunctorsLvl1 &ipol, MagneticFieldParameters gp)
Definition magnetic_field.h:178
const CylindricalFunctor & psipRZ() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:197
const CylindricalFunctor & psip() const
, where R, Z are cylindrical coordinates
Definition magnetic_field.h:189
TokamakMagneticField(double R0, const CylindricalFunctorsLvl2 &psip, const CylindricalFunctorsLvl1 &ipol, MagneticFieldParameters gp)
Definition magnetic_field.h:175
Definition magnetic_field.h:949
double do_compute(double R, double) const
Definition magnetic_field.h:951
ToroidalBHatP(const TokamakMagneticField &mag)
Definition magnetic_field.h:950
Definition magnetic_field.h:924
double do_compute(double R, double Z) const
Definition magnetic_field.h:926
ToroidalBHatR(const TokamakMagneticField &mag)
Definition magnetic_field.h:925
Definition magnetic_field.h:937
double do_compute(double R, double Z) const
Definition magnetic_field.h:939
ToroidalBHatZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:938
Definition magnetic_field.h:409
ToroidalBR(const TokamakMagneticField &mag)
Definition magnetic_field.h:410
double do_compute(double R, double Z) const
Definition magnetic_field.h:411
Definition magnetic_field.h:426
double do_compute(double R, double Z) const
Definition magnetic_field.h:428
ToroidalBZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:427
Toroidal Approximate .
Definition magnetic_field.h:717
ToroidalCurvatureKappaR()
Definition magnetic_field.h:718
ToroidalCurvatureKappaR(const TokamakMagneticField &)
Definition magnetic_field.h:719
double do_compute(double, double) const
Definition magnetic_field.h:720
Toroidal Approximate .
Definition magnetic_field.h:732
ToroidalCurvatureKappaZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:733
double do_compute(double R, double Z) const
Definition magnetic_field.h:734
Toroidal Approximate .
Definition magnetic_field.h:685
ToroidalCurvatureNablaBR(const TokamakMagneticField &mag)
Definition magnetic_field.h:686
double do_compute(double R, double Z) const
Definition magnetic_field.h:687
Toroidal Approximate .
Definition magnetic_field.h:701
double do_compute(double R, double Z) const
Definition magnetic_field.h:703
ToroidalCurvatureNablaBZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:702
Toroidal Approximate .
Definition magnetic_field.h:748
double do_compute(double R, double Z) const
Definition magnetic_field.h:750
ToroidalDivCurvatureKappa(const TokamakMagneticField &mag)
Definition magnetic_field.h:749
Definition magnetic_field.h:819
ToroidalDivb(const TokamakMagneticField &mag)
Definition magnetic_field.h:820
double do_compute(double R, double Z) const
Definition magnetic_field.h:821
Definition magnetic_field.h:802
double do_compute(double R, double Z) const
Definition magnetic_field.h:804
ToroidalGradLnB(const TokamakMagneticField &mag)
Definition magnetic_field.h:803
True .
Definition magnetic_field.h:637
TrueCurvatureKappaP(const TokamakMagneticField &mag)
Definition magnetic_field.h:638
double do_compute(double R, double Z) const
Definition magnetic_field.h:639
True .
Definition magnetic_field.h:608
double do_compute(double R, double Z) const
Definition magnetic_field.h:610
TrueCurvatureKappaR(const TokamakMagneticField &mag)
Definition magnetic_field.h:609
True .
Definition magnetic_field.h:623
TrueCurvatureKappaZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:624
double do_compute(double R, double Z) const
Definition magnetic_field.h:625
True .
Definition magnetic_field.h:592
double do_compute(double R, double Z) const
Definition magnetic_field.h:594
TrueCurvatureNablaBP(const TokamakMagneticField &mag)
Definition magnetic_field.h:593
True .
Definition magnetic_field.h:556
double do_compute(double R, double Z) const
Definition magnetic_field.h:558
TrueCurvatureNablaBR(const TokamakMagneticField &mag)
Definition magnetic_field.h:557
True .
Definition magnetic_field.h:574
double do_compute(double R, double Z) const
Definition magnetic_field.h:576
TrueCurvatureNablaBZ(const TokamakMagneticField &mag)
Definition magnetic_field.h:575
True .
Definition magnetic_field.h:655
double do_compute(double R, double Z) const
Definition magnetic_field.h:657
TrueDivCurvatureKappa(const TokamakMagneticField &mag)
Definition magnetic_field.h:656
True .
Definition magnetic_field.h:671
double do_compute(double R, double Z) const
Definition magnetic_field.h:673
TrueDivCurvatureNablaB(const TokamakMagneticField &mag)
Definition magnetic_field.h:672
Determine if poloidal field points towards or away from the nearest wall.
Definition magnetic_field.h:1221
WallDirection(dg::geo::TokamakMagneticField mag, std::vector< double > vertical, std::vector< double > horizontal)
Allocate lines.
Definition magnetic_field.h:1229
WallDirection(dg::geo::TokamakMagneticField mag, dg::Grid2d walls)
Allocate lines.
Definition magnetic_field.h:1238
double do_compute(double R, double Z) const
Definition magnetic_field.h:1241
Represent functions written in cylindrical coordinates that are independent of the angle phi serving ...
Definition fluxfunctions.h:66