std::unique_ptr<dg::geo::aGenerator2d> generator;
js["magnetic_field"]["params"]);
std::string type = js["grid"]["generator"]["type"].asString();
int mode = 0;
if( type != "dsp")
mode = js["grid"]["generator"]["mode"].asInt();
std::cout << "Constructing "<<type<<" grid ... \n";
if( type == "flux")
generator = std::make_unique<dg::geo::FluxGenerator>( mag.
get_psip(),
mag.
get_ipol(), psi_0, psi_1, mag.
R0(), 0., mode,
false);
else if( type == "orthogonal")
{
double psi_init = js["grid"]["generator"]["firstline"].asDouble();
if( mode == 0 || mode == 1)
generator = std::make_unique<dg::geo::SimpleOrthogonal>(
mag.
get_psip(), psi_0, psi_1, mag.
R0(), 0., psi_init, mode);
if( mode > 1)
{
generator = std::make_unique<dg::geo::SimpleOrthogonal>(
mag.
get_psip(), lc, psi_0, psi_1, mag.
R0(), 0., psi_init,
mode%2);
}
}
else if( type == "separatrix-orthogonal")
{
double fx = js["grid"]["generator"]["fx"].asDouble();
generator = std::make_unique<dg::geo::SeparatrixOrthogonalAdaptor>(
mag.
get_psip(), monitor_chi, psi_0, RX, ZX, mag.
R0(), 0., mode,
false, fx);
}
else if ( type == "dsp")
{
double boxscaleRm = js["grid"][ "scaleR"].get( 0u, 1.05).asDouble();
double boxscaleRp = js["grid"][ "scaleR"].get( 1u, 1.05).asDouble();
double boxscaleZm = js["grid"][ "scaleZ"].get( 0u, 1.05).asDouble();
double boxscaleZp = js["grid"][ "scaleZ"].get( 1u, 1.05).asDouble();
const double Rmin=mag.
R0()-boxscaleRm*mag.
params().
a();
const double Zmin=-boxscaleZm*mag.
params().
a();
const double Rmax=mag.
R0()+boxscaleRp*mag.
params().
a();
const double Zmax=boxscaleZp*mag.
params().
a();
generator = std::make_unique<dg::geo::DSPGenerator>( mag,
Rmin, Rmax, Zmin, Zmax, 2.*M_PI/(double)Nz);
}
else if( type == "ribeiro-flux")
generator = std::make_unique<dg::geo::RibeiroFluxGenerator>( mag.
get_psip(),
psi_0, psi_1, mag.
R0(), 0., mode,
false);
else if( type == "ribeiro")
generator = std::make_unique<dg::geo::Ribeiro>( mag.
get_psip(),
psi_0, psi_1, mag.
R0(), 0., mode,
false);