3#include "dg/algorithm.h" 
   24template<
class real_type>
 
   34    template<
class BinaryFunctor>
 
   42    real_type 
operator()( real_type R, real_type Z, real_type)
 const{
 
 
   46    std::function<real_type(real_type,real_type)> m_f;
 
 
   64template<
class Derived>
 
   77        const Derived& underlying = 
static_cast<const Derived&
>(*this);
 
   78        return underlying.do_compute(R,Z);
 
 
   90        const Derived& underlying = 
static_cast<const Derived&
>(*this);
 
   91        return underlying.do_compute(R,Z);
 
 
  101    aCylindricalFunctor(
const aCylindricalFunctor&){}
 
  105    aCylindricalFunctor& operator=(
const aCylindricalFunctor&){
return *
this;}
 
 
  130    ZCutter(
double ZX, 
int sign = +1): m_heavi( ZX, sign){}
 
 
  164        m_g( R0, R1, Z0, Z1, 3, 10, 10, bcx, bcy), m_f(functor)
 
 
  168        bool negative = 
false;
 
  169        dg::create::detail::shift( negative, R, m_g.
bcx(), m_g.
x0(), m_g.
x1());
 
  170        dg::create::detail::shift( negative, Z, m_g.
bcy(), m_g.
y0(), m_g.
y1());
 
  171        if( negative) 
return -m_f(R,Z);
 
 
 
  212    std::array<CylindricalFunctor,3> p_;
 
 
  234        f0(f,fx,fy), f1(fxx,fxy,fyy)
 
 
  241        f0.reset( f,fx,fy), f1.reset(fxx,fxy,fyy);
 
 
 
  280    std::array<double, 2> X{ {0,0} }, XN(X), X_OLD(X);
 
  281    X[0] = RC, X[1] = ZC;
 
  282    double eps = 1e10, eps_old= 2e10;
 
  283    unsigned counter = 0; 
 
  284    double psipRZ = psi.
dfxy()(X[0], X[1]);
 
  285    double psipRR = psi.
dfxx()(X[0], X[1]), psipZZ = psi.
dfyy()(X[0],X[1]);
 
  286    double psipR  = psi.
dfx()(X[0], X[1]), psipZ = psi.
dfy()(X[0], X[1]);
 
  287    double D0 =  (psipZZ*psipRR - psipRZ*psipRZ);
 
  290        X[0] *= 1.0001, X[1]*=1.0001;
 
  291        psipRZ = psi.
dfxy()(X[0], X[1]);
 
  292        psipRR = psi.
dfxx()(X[0], X[1]), psipZZ = psi.
dfyy()(X[0],X[1]);
 
  293        psipR  = psi.
dfx()(X[0], X[1]), psipZ = psi.
dfy()(X[0], X[1]);
 
  294        D0 =  (psipZZ*psipRR - psipRZ*psipRZ);
 
  297    while( (eps < eps_old || eps > 1e-7) && eps > 1e-10 && counter < 100)
 
  300        XN[0] = X[0] - Dinv*(psipZZ*psipR - psipRZ*psipZ);
 
  301        XN[1] = X[1] - Dinv*(-psipRZ*psipR + psipRR*psipZ);
 
  303        eps = sqrt( (X[0]-X_OLD[0])*(X[0]-X_OLD[0]) + (X[1]-X_OLD[1])*(X[1]-X_OLD[1]));
 
  304        X_OLD = X; eps_old= eps;
 
  305        psipRZ = psi.
dfxy()(X[0], X[1]);
 
  306        psipRR = psi.
dfxx()(X[0], X[1]), psipZZ = psi.
dfyy()(X[0],X[1]);
 
  307        psipR  = psi.
dfx()(X[0], X[1]), psipZ = psi.
dfy()(X[0], X[1]);
 
  308        D0 = (psipZZ*psipRR - psipRZ*psipRZ);
 
  313    if ( counter >= 100 || D0 == 0|| std::isnan( Dinv) )
 
  315    RC = X[0], ZC = X[1];
 
  316    if( Dinv > 0 &&  psipRR > 0)
 
  318    if( Dinv > 0 &&  psipRR < 0)
 
 
  338    if( point == 3 || point == 0 )
 
 
  384        p_{{ chi_xx,chi_xy,chi_yy,divChiX,divChiY}}
 
 
  409    std::array<CylindricalFunctor,5> p_;
 
 
  436    std::array<CylindricalFunctor,3> p_;
 
 
  452        ): f0{v_x, v_y, v_z},
 
  453        m_div(div), m_divvvz(divvvz) {}
 
 
  462        f0.reset( v_x,v_y,v_z);
 
 
 
  491        return m_v.x()(R,Z)*m_w.x()(R,Z)
 
  492             + m_v.y()(R,Z)*m_w.y()(R,Z)
 
  493             + m_v.z()(R,Z)*m_w.z()(R,Z);
 
 
 
  509        return sqrt(m_s(R,Z));
 
 
 
  527template<
class Geometry3d>
 
  531    using host_vector = 
typename Geometry3d::host_vector;
 
  533    std::array<host_vector,3> bt;
 
  542    t.
idx(0,0) = 0, t.
idx(0,1) = t.
idx(1,0) = 1,
 
  543        t.
idx(0,2) = t.
idx(2,0) = 2;
 
  544    t.
idx(1,1) = 3, t.
idx(1,2) = t.
idx(2,1) = 4;
 
 
  560template<
class Geometry3d>
 
  564    using host_vector = 
typename Geometry3d::host_vector;
 
 
DG_DEVICE T zero(T, Ts ...)
void axpby(value_type alpha, const ContainerType1 &x, value_type1 beta, ContainerType &y)
void pointwiseDot(value_type alpha, const ContainerType1 &x1, const ContainerType2 &x2, value_type1 beta, ContainerType &y)
auto evaluate(Functor &&f, const Topology &g)
dg::SparseTensor< typename Geometry3d::host_vector > createAlignmentTensor(const dg::geo::CylindricalVectorLvl0 &bhat, const Geometry3d &g)
Definition fluxfunctions.h:528
dg::SparseTensor< typename Geometry3d::host_vector > createProjectionTensor(const dg::geo::CylindricalVectorLvl0 &bhat, const Geometry3d &g)
Definition fluxfunctions.h:561
void findXpoint(const CylindricalFunctorsLvl2 &psi, double &RC, double &ZC)
This function finds X-points of psi.
Definition fluxfunctions.h:353
int findOpoint(const CylindricalFunctorsLvl2 &psi, double &RC, double &ZC)
This function finds O-points of psi.
Definition fluxfunctions.h:335
int findCriticalPoint(const CylindricalFunctorsLvl2 &psi, double &RC, double &ZC)
This function finds critical points of psi (any point with vanishing gradient, including the X-point ...
Definition fluxfunctions.h:278
void pushForward(const Functor1 &vR, const Functor2 &vZ, const Functor3 &vPhi, container &vx, container &vy, container &vz, const Geometry &g)
int idx(unsigned i, unsigned j) const
std::vector< container > & values()
const container & value(size_t i, size_t j) const
Definition fluxfunctions.h:113
Constant(double c)
Definition fluxfunctions.h:114
double do_compute(double, double) const
Definition fluxfunctions.h:115
This struct bundles a function and its first derivatives.
Definition fluxfunctions.h:185
void reset(CylindricalFunctor f, CylindricalFunctor fx, CylindricalFunctor fy)
copy given functors
Definition fluxfunctions.h:199
CylindricalFunctorsLvl1(CylindricalFunctor f, CylindricalFunctor fx, CylindricalFunctor fy)
Construct with given functors.
Definition fluxfunctions.h:195
const CylindricalFunctor & dfx() const
Definition fluxfunctions.h:208
const CylindricalFunctor & f() const
Definition fluxfunctions.h:206
const CylindricalFunctor & dfy() const
Definition fluxfunctions.h:210
CylindricalFunctorsLvl1()
the access functions are undefined as long as the class remains empty
Definition fluxfunctions.h:187
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
CylindricalFunctorsLvl2(CylindricalFunctor f, CylindricalFunctor fx, CylindricalFunctor fy, CylindricalFunctor fxx, CylindricalFunctor fxy, CylindricalFunctor fyy)
Construct with given functors.
Definition fluxfunctions.h:231
CylindricalFunctorsLvl2()
the access functions are undefined as long as the class remains empty
Definition fluxfunctions.h:224
const CylindricalFunctor & dfx() const
Definition fluxfunctions.h:248
const CylindricalFunctor & dfxx() const
Definition fluxfunctions.h:252
void reset(CylindricalFunctor f, CylindricalFunctor fx, CylindricalFunctor fy, CylindricalFunctor fxx, CylindricalFunctor fxy, CylindricalFunctor fyy)
Replace with given Functors.
Definition fluxfunctions.h:237
const CylindricalFunctor & f() const
Definition fluxfunctions.h:246
const CylindricalFunctor & dfyy() const
Definition fluxfunctions.h:256
Definition fluxfunctions.h:364
void reset(CylindricalFunctor chi_xx, CylindricalFunctor chi_xy, CylindricalFunctor chi_yy, CylindricalFunctor divChiX, CylindricalFunctor divChiY)
replace with given functors
Definition fluxfunctions.h:388
const CylindricalFunctor & yy() const
yy component
Definition fluxfunctions.h:403
const CylindricalFunctor & divY() const
is the y-component of the divergence of the tensor
Definition fluxfunctions.h:407
CylindricalSymmTensorLvl1(CylindricalFunctor chi_xx, CylindricalFunctor chi_xy, CylindricalFunctor chi_yy, CylindricalFunctor divChiX, CylindricalFunctor divChiY)
Copy given functors.
Definition fluxfunctions.h:381
CylindricalSymmTensorLvl1()
Initialize with the identity tensor.
Definition fluxfunctions.h:368
const CylindricalFunctor & xy() const
xy component
Definition fluxfunctions.h:401
const CylindricalFunctor & divX() const
is the x-component of the divergence of the tensor
Definition fluxfunctions.h:405
const CylindricalFunctor & xx() const
xy component
Definition fluxfunctions.h:399
Definition fluxfunctions.h:415
const CylindricalFunctor & z() const
z-component of the vector
Definition fluxfunctions.h:434
CylindricalVectorLvl0(CylindricalFunctor v_x, CylindricalFunctor v_y, CylindricalFunctor v_z)
Copy given Functors.
Definition fluxfunctions.h:418
const CylindricalFunctor & y() const
y-component of the vector
Definition fluxfunctions.h:432
void reset(CylindricalFunctor v_x, CylindricalFunctor v_y, CylindricalFunctor v_z)
replace with given functors
Definition fluxfunctions.h:422
const CylindricalFunctor & x() const
x-component of the vector
Definition fluxfunctions.h:430
CylindricalVectorLvl0()
Definition fluxfunctions.h:416
This struct bundles a vector field and its divergence.
Definition fluxfunctions.h:443
void reset(CylindricalFunctor v_x, CylindricalFunctor v_y, CylindricalFunctor v_z, CylindricalFunctor div, CylindricalFunctor divvvz)
replace with given functors
Definition fluxfunctions.h:455
const CylindricalFunctor & y() const
y-component of the vector
Definition fluxfunctions.h:471
const CylindricalFunctor & x() const
x-component of the vector
Definition fluxfunctions.h:469
const CylindricalFunctor & div() const
Definition fluxfunctions.h:475
CylindricalVectorLvl1(CylindricalFunctor v_x, CylindricalFunctor v_y, CylindricalFunctor v_z, CylindricalFunctor div, CylindricalFunctor divvvz)
Copy given Functors.
Definition fluxfunctions.h:447
const CylindricalFunctor & divvvz() const
Definition fluxfunctions.h:477
const CylindricalFunctor & z() const
z-component of the vector
Definition fluxfunctions.h:473
CylindricalVectorLvl1()
the access functions are undefined as long as the class remains empty
Definition fluxfunctions.h:445
This function extends another function beyond the grid boundaries.
Definition fluxfunctions.h:143
Periodify(CylindricalFunctor functor, dg::Grid2d g)
Construct from grid.
Definition fluxfunctions.h:150
Periodify(CylindricalFunctor functor, double R0, double R1, double Z0, double Z1, dg::bc bcx, dg::bc bcy)
provide 2d grid boundaries by hand
Definition fluxfunctions.h:162
double do_compute(double R, double Z) const
Definition fluxfunctions.h:166
Inject both 2d and 3d operator() to a 2d functor.
Definition fluxfunctions.h:26
RealCylindricalFunctor()
Definition fluxfunctions.h:27
real_type operator()(real_type R, real_type Z, real_type) const
Definition fluxfunctions.h:42
real_type operator()(real_type R, real_type Z) const
Definition fluxfunctions.h:38
RealCylindricalFunctor(BinaryFunctor f)
Construct from any binary functor.
Definition fluxfunctions.h:35
Return scalar product of two vector fields .
Definition fluxfunctions.h:487
double do_compute(double R, double Z) const
Definition fluxfunctions.h:489
ScalarProduct(CylindricalVectorLvl0 v, CylindricalVectorLvl0 w)
Definition fluxfunctions.h:488
Return norm of scalar product of two vector fields .
Definition fluxfunctions.h:505
SquareNorm(CylindricalVectorLvl0 v, CylindricalVectorLvl0 w)
Definition fluxfunctions.h:506
double do_compute(double R, double Z) const
Definition fluxfunctions.h:507
Definition fluxfunctions.h:129
double do_compute(double, double Z) const
Definition fluxfunctions.h:131
ZCutter(double ZX, int sign=+1)
Definition fluxfunctions.h:130
Represent functions written in cylindrical coordinates that are independent of the angle phi serving ...
Definition fluxfunctions.h:66
double operator()(double R, double Z) const
do_compute(R,Z)
Definition fluxfunctions.h:75
double operator()(double R, double Z, double) const
do_compute(R,Z)
Definition fluxfunctions.h:88