#ifndef NUFI_SOLVER_H #define NUFI_SOLVER_H #include #include #include #include #include #include #include "nufi/fields.h" //dont remove #include "nufi/parameters.h" #include "nufi/poisson_problem.h" using namespace dealii; class NuFISolver { public: NuFISolver(); void run(); double eval_rho(unsigned int n, double x, const PoissonProblem<1> &poisson, const std::vector> &phi_history, unsigned int Nv = Parameters::NV) const; double eval_ftilda(unsigned int n, double x, double u, const PoissonProblem<1> &poisson, const std::vector> &phi_history) const; double eval_f(unsigned int n, double x, double u, const PoissonProblem<1> &poisson, const std::vector> &phi_history) const; private: unsigned int Nt = std::floor(Parameters::TMAX / Parameters::DT); unsigned int Nx = Parameters::CALC_NX; double Lx = Parameters::LX; double x_min = Parameters::X_DOMAIN_LEFT; double x_max = Parameters::X_DOMAIN_RIGHT; std::vector rho; unsigned int order; PoissonProblem<1> poisson; }; template class ChargeDensity_NuFI : public Function { public: ChargeDensity_NuFI(const double *rho_values, unsigned int Nx) : Function(), rho(rho_values), Nx(Nx) {} virtual double value(const Point &p, [[maybe_unused]] const unsigned int component = 0) const override { const double x = p[0]; // Map x -> grid index const double L = Parameters::LX; const double dx = L / (Nx - 1); int i = static_cast(std::floor((x - Parameters::X_DOMAIN_LEFT) / dx)); // periodic wrap i = (i % Nx + Nx) % Nx; return rho[i]; } private: const double *rho; const unsigned int Nx; }; #endif