32#include <deal.II/base/exceptions.h>
33#include <deal.II/base/function.h>
34#include <deal.II/base/parameter_handler.h>
35#include <deal.II/base/point.h>
37#include <deal.II/lac/full_matrix.h>
38#include <deal.II/lac/vector.h>
77 dealii::LogStream::Prefix prefix_startup(
"Startup",
saplog);
78 dealii::LogStream::Prefix prefix(
"PhysicalParameters",
saplog);
79 saplog <<
"Declaring parameters" << std::endl;
80 prm.enter_subsection(
"Physical parameters");
94 prm.leave_subsection();
107 dealii::LogStream::Prefix prefix_startup(
"Startup",
saplog);
108 dealii::LogStream::Prefix prefix(
"PhysicalParameters",
saplog);
109 saplog <<
"Parsing parameters" << std::endl;
110 prm.enter_subsection(
"Physical parameters");
116 prm.leave_subsection();
151 template <
unsigned int dim>
163 const unsigned int system_size)
164 : dealii::Function<dim>(system_size)
165 , prm{physical_parameters}
166 , lms_indices{
PDESystem::create_lms_indices(system_size)}
207 dealii::Vector<double> &f)
const override
209 AssertDimension(f.size(), this->n_components);
212 for (
unsigned int i = 0; i < f.size(); ++i)
230 const std::vector<std::array<unsigned int, 3>> lms_indices;
240 template <
unsigned int dim>
253 const unsigned int system_size)
254 : dealii::Function<dim>(system_size)
255 , prm{physical_parameters}
256 , lms_indices{
PDESystem::create_lms_indices(system_size)}
320 [[maybe_unused]]
const std::vector<dealii::Point<dim>> &points,
321 [[maybe_unused]]
const unsigned int boundary_id,
322 [[maybe_unused]] std::vector<dealii::Vector<double>> &bc_values)
const
324 AssertDimension(points.size(), bc_values.size());
325 AssertDimension(bc_values[0].size(), this->n_components);
327 for (
unsigned int q_index = 0; q_index < points.size(); ++q_index)
331 if (boundary_id == 0)
335 else if (boundary_id == 1)
339 else if (boundary_id == 2)
343 else if (boundary_id == 3)
360 const std::vector<std::array<unsigned int, 3>> lms_indices;
370 template <
unsigned int dim>
380 : dealii::Function<dim>(1)
381 , prm{physical_parameters}
410 const std::vector<dealii::Point<dim>> &points,
411 std::vector<double> &scattering_frequencies,
412 [[maybe_unused]]
const unsigned int component = 0)
const override
414 AssertDimension(scattering_frequencies.size(), points.size());
416 for (
unsigned int q_index = 0; q_index < points.size(); ++q_index)
420 scattering_frequencies[q_index] = 100.;
439 template <
unsigned int dim>
440 class Source :
public dealii::Function<dim>
451 unsigned int system_size)
452 : dealii::Function<dim>(system_size)
453 , prm{physical_parameters}
454 , lms_indices{
PDESystem::create_lms_indices(system_size)}
473 dealii::Vector<double> &source_values)
const override
475 AssertDimension(source_values.size(), this->n_components);
478 for (
unsigned int i = 0; i < source_values.size(); ++i)
483 const double p0 = 1.;
484 const double Q = 0.1;
485 const double sig_p = 0.1;
486 const double sig_x = 0.001;
489 const double x = point[0];
490 const double p = std::exp(point[1]);
493 const unsigned int l = lms_indices[i][0];
494 const unsigned int m = lms_indices[i][1];
495 const unsigned int s = lms_indices[i][2];
498 if (l == 0 && m == 0 && s == 0)
503 Q / (std::sqrt(std::numbers::pi) * sig_p * sig_x) *
504 std::exp(-(p - p0) * (p - p0) / (2. * sig_p * sig_p)) *
505 std::exp(-x * x / (2. * sig_x * sig_x));
510 source_values[i] = 0.;
525 const std::vector<std::array<unsigned int, 3>> lms_indices;
535 template <
unsigned int dim>
545 : dealii::Function<dim>(3)
546 , prm{physical_parameters}
585 dealii::Vector<double> &magnetic_field)
const override
587 AssertDimension(magnetic_field.size(), this->n_components);
591 magnetic_field[0] = 0.;
592 magnetic_field[1] = 0.;
593 magnetic_field[2] = 0.;
611 template <
unsigned int dim>
621 : dealii::Function<dim>(3)
622 , prm{physical_parameters}
640 dealii::Vector<double> &velocity)
const override
642 AssertDimension(velocity.size(), this->n_components);
648 const double d_sh = 0.001;
649 const double u_sh = 0.1;
653 u_sh / (2 * r) * ((1 - r) * std::tanh(point[0] / d_sh) + (1 + r));
675 [[maybe_unused]]
const std::vector<dealii::Point<dim>> &points,
676 std::vector<double> &divergence)
const
678 AssertDimension(divergence.size(), points.size());
680 for (
unsigned int q_index = 0; q_index < points.size(); ++q_index)
687 const double d_sh = 0.001;
688 const double u_sh = 0.1;
690 const double x = points[q_index][0];
693 divergence[q_index] =
694 u_sh / (2 * r) * (1 - r) / d_sh *
695 (1 - std::tanh(x / d_sh) * std::tanh(x / d_sh));
718 const std::vector<dealii::Point<dim>> &points,
719 std::vector<dealii::Vector<double>> &material_derivatives)
const
721 AssertDimension(material_derivatives.size(), points.size());
722 AssertDimension(material_derivatives[0].size(), this->n_components);
724 for (
unsigned int q_index = 0; q_index < points.size(); ++q_index)
733 const double d_sh = 0.001;
734 const double u_sh = 0.1;
736 const double x = points[q_index][0];
739 material_derivatives[q_index][0] =
740 u_sh * u_sh / (4 * r * r) / d_sh * (1 - r) *
741 ((1 - r) * std::tanh(x / d_sh) + (1 + r)) *
742 (1 - std::tanh(x / d_sh) * std::tanh(x / d_sh));
743 material_derivatives[q_index][1] = 0.;
744 material_derivatives[q_index][2] = 0.;
766 std::vector<dealii::FullMatrix<double>> &jacobians)
const
768 AssertDimension(jacobians.size(), points.size());
769 AssertDimension(jacobians[0].m(), this->n_components);
770 AssertDimension(jacobians[0].n(), this->n_components);
772 for (
unsigned int q_index = 0; q_index < points.size(); ++q_index)
779 const double d_sh = 0.001;
780 const double u_sh = 0.1;
782 const double x = points[q_index][0];
785 jacobians[q_index][0][0] =
786 u_sh / (2 * r) * (1 - r) / d_sh *
787 (1 - std::tanh(x / d_sh) * std::tanh(x / d_sh));
788 jacobians[q_index][0][1] = 0.;
789 jacobians[q_index][0][2] = 0.;
791 jacobians[q_index][1][0] = 0.;
792 jacobians[q_index][1][1] = 0.;
793 jacobians[q_index][1][2] = 0.;
795 jacobians[q_index][2][0] = 0.;
796 jacobians[q_index][2][1] = 0.;
797 jacobians[q_index][2][2] = 0.;
Class to implement user defined parameters.
Definition config.h:56
void declare_parameters(dealii::ParameterHandler &prm)
Declare parameters in parameter file.
Definition config.h:75
PhysicalParameters()=default
void parse_parameters(dealii::ParameterHandler &prm)
Parse parameters from parameter file.
Definition config.h:105
void material_derivative_list(const std::vector< dealii::Point< dim > > &points, std::vector< dealii::Vector< double > > &material_derivatives) const
Evaluate the material derivative of the velocity field.
Definition config.h:717
BackgroundVelocityField(const PhysicalParameters &physical_parameters)
Constructor.
Definition config.h:620
void vector_value(const dealii::Point< dim > &point, dealii::Vector< double > &velocity) const override
Evaluate the velocity field at a point p.
Definition config.h:639
void divergence_list(const std::vector< dealii::Point< dim > > &points, std::vector< double > &divergence) const
Evaluate the divergence of the velocity field.
Definition config.h:674
void jacobian_list(const std::vector< dealii::Point< dim > > &points, std::vector< dealii::FullMatrix< double > > &jacobians) const
Evaluate the Jacobian matrix of the velocity field.
Definition config.h:765
BoundaryValueFunction(const PhysicalParameters &physical_parameters, const unsigned int system_size)
Constructor.
Definition config.h:252
void bc_vector_value_list(const std::vector< dealii::Point< dim > > &points, const unsigned int boundary_id, std::vector< dealii::Vector< double > > &bc_values) const
Values of the distribution function at the boundary specified by boundary_id.
Definition config.h:319
InitialValueFunction(const PhysicalParameters &physical_parameters, const unsigned int system_size)
Constructor.
Definition config.h:162
void vector_value(const dealii::Point< dim > &point, dealii::Vector< double > &f) const override
Evaluate the initial condition at point p.
Definition config.h:206
void vector_value(const dealii::Point< dim > &point, dealii::Vector< double > &magnetic_field) const override
Evaluate the magnetic field at a point p.
Definition config.h:584
MagneticField(const PhysicalParameters &physical_parameters)
Constructor.
Definition config.h:544
Calculate the matrices of the PDE system.
Definition pde-system.h:58
void value_list(const std::vector< dealii::Point< dim > > &points, std::vector< double > &scattering_frequencies, const unsigned int component=0) const override
Evaluate the scattering frequency.
Definition config.h:409
ScatteringFrequency(const PhysicalParameters &physical_parameters)
Constructor.
Definition config.h:379
Source(const PhysicalParameters &physical_parameters, unsigned int system_size)
Constructor.
Definition config.h:450
void vector_value(const dealii::Point< dim > &point, dealii::Vector< double > &source_values) const override
Evaluate the source term.
Definition config.h:472
Namespace for the Vlasov-Fokker-Planck module.
Definition config.h:123
VFPFlags
Flags to activate the different terms of the VFP equation.
Definition vfp-flags.h:75
@ time_independent_fields
Definition vfp-flags.h:109
@ source
Definition vfp-flags.h:128
@ momentum
Definition vfp-flags.h:116
@ time_evolution
Definition vfp-flags.h:81
@ time_independent_source
Definition vfp-flags.h:137
@ collision
Definition vfp-flags.h:93
@ spatial_advection
Definition vfp-flags.h:87
constexpr unsigned int dimension
Definition config.h:127
constexpr VFPFlags vfp_flags
Definition config.h:135
Namespace for Sapphire++.
Definition config.h:51
sapphirepp::Utils::SapphireppLogStream saplog
The standard log stream for Sapphire++.
Definition sapphirepp-logstream.cpp:46
Define sapphirepp::VFP::PDESystem.
Define sapphirepp::Utils::SapphireppLogStream and sapphirepp::saplog.
Define sapphirepp::VFP::VFPFlags and other enums used by the sapphirepp::VFP module.