numerics
Loading...
Searching...
No Matches
fields.hpp
Go to the documentation of this file.
1/// @file pde/fields.hpp
2/// @brief 3D scalar and vector fields on Cartesian grids, with PDE field solvers.
3///
4/// ScalarField3D -- potential φ(x,y,z) on a uniform grid with trilinear sampling.
5/// VectorField3D -- three ScalarField3D components; sample() returns trilinear (fx,fy,fz).
6/// FieldSolver -- static PDE utilities (Poisson solve, gradient, divergence, curl).
7/// MagneticSolver -- static utilities for J = -σ∇φ and B = ∇×A via vector Poisson.
8#pragma once
9
10#include "spatial/grid3d.hpp"
12#include <array>
13#include <vector>
14
15namespace num {
16
17// ============================================================
18// ScalarField3D
19// ============================================================
20
22public:
23 /// @param nx,ny,nz Grid resolution
24 /// @param dx Cell size [m]
25 /// @param ox,oy,oz World-space origin
26 ScalarField3D(int nx, int ny, int nz, float dx,
27 float ox = 0.0f, float oy = 0.0f, float oz = 0.0f);
28
29 Grid3D& grid() { return grid_; }
30 const Grid3D& grid() const { return grid_; }
31
32 int nx() const { return grid_.nx(); }
33 int ny() const { return grid_.ny(); }
34 int nz() const { return grid_.nz(); }
35 float dx() const { return static_cast<float>(grid_.dx()); }
36 float ox() const { return ox_; }
37 float oy() const { return oy_; }
38 float oz() const { return oz_; }
39
40 void set(int i, int j, int k, double v) { grid_.set(i,j,k,v); }
41 void fill(double v) { grid_.fill(v); }
42
43 /// Trilinear interpolation at world position (x,y,z).
44 /// Returns 0 outside the grid domain.
45 float sample(float x, float y, float z) const;
46
47private:
48 Grid3D grid_;
49 float ox_, oy_, oz_;
50};
51
52// ============================================================
53// VectorField3D
54// ============================================================
55
57 ScalarField3D x, y, z; ///< x, y, z components on the same grid layout
58
59 VectorField3D(int nx, int ny, int nz, float dx,
60 float ox = 0.0f, float oy = 0.0f, float oz = 0.0f);
61
62 /// Trilinear-interpolated field vector at world position.
63 std::array<float, 3> sample(float px, float py, float pz) const;
64
65 /// Multiply all components by scalar s.
66 void scale(float s);
67};
68
69// ============================================================
70// FieldSolver
71// ============================================================
72
74public:
75 /// Solve ∆φ = source with φ=0 on all boundaries (Dirichlet).
76 /// φ is both the initial guess and the output solution.
77 /// Internally solves the SPD system (−∆)φ = −source via matrix-free CG.
79 const ScalarField3D& source,
80 double tol = 1e-6,
81 int max_iter = 500);
82
83 /// Compute ∇φ via central finite differences (one-sided at boundaries).
85
86 /// Compute ∇·f via central finite differences.
88
89 /// Compute ∇×A via central finite differences (one-sided at boundaries).
90 static VectorField3D curl(const VectorField3D& A);
91};
92
93// ============================================================
94// MagneticSolver
95// ============================================================
96
98public:
99 static constexpr double MU0 = 1.2566370614e-6; ///< μ₀ [H/m]
100
101 /// Compute current density J = −σ∇φ [A/m²].
103 const ScalarField3D& phi);
104
105 /// Solve for static magnetic field B given current density J.
106 /// Solves ∆A = −μ₀J (Coulomb gauge, Dirichlet A=0) via three CG solves,
107 /// then returns B = ∇×A.
109 double tol = 1e-6,
110 int max_iter = 500);
111};
112
113} // namespace num
static VectorField3D gradient(const ScalarField3D &phi)
Compute ∇φ via central finite differences (one-sided at boundaries).
Definition fields.cpp:95
static SolverResult solve_poisson(ScalarField3D &phi, const ScalarField3D &source, double tol=1e-6, int max_iter=500)
Definition fields.cpp:68
static VectorField3D curl(const VectorField3D &A)
Compute ∇×A via central finite differences (one-sided at boundaries).
Definition fields.cpp:109
static ScalarField3D divergence(const VectorField3D &f)
Compute ∇·f via central finite differences.
Definition fields.cpp:102
double dx() const
Definition grid3d.hpp:23
int ny() const
Definition grid3d.hpp:21
int nz() const
Definition grid3d.hpp:22
int nx() const
Definition grid3d.hpp:20
void fill(real v)
Definition grid3d.cpp:9
void set(int i, int j, int k, real v)
Definition grid3d.hpp:29
static VectorField3D solve_magnetic_field(const VectorField3D &J, double tol=1e-6, int max_iter=500)
Definition fields.cpp:136
static VectorField3D current_density(const ScalarField3D &sigma, const ScalarField3D &phi)
Compute current density J = −σ∇φ [A/m²].
Definition fields.cpp:120
static constexpr double MU0
μ₀ [H/m]
Definition fields.hpp:99
void set(int i, int j, int k, double v)
Definition fields.hpp:40
float oy() const
Definition fields.hpp:37
float ox() const
Definition fields.hpp:36
int nx() const
Definition fields.hpp:32
float dx() const
Definition fields.hpp:35
float sample(float x, float y, float z) const
Definition fields.cpp:19
int ny() const
Definition fields.hpp:33
const Grid3D & grid() const
Definition fields.hpp:30
Grid3D & grid()
Definition fields.hpp:29
float oz() const
Definition fields.hpp:38
int nz() const
Definition fields.hpp:34
void fill(double v)
Definition fields.hpp:41
3D Cartesian scalar grid backed by num::Vector storage.
constexpr real phi
Golden ratio.
Definition math.hpp:42
constexpr T ipow(T x) noexcept
Compute x^N at compile time via repeated squaring.
constexpr real e
Definition math.hpp:41
Umbrella include for all linear solvers.
std::array< float, 3 > sample(float px, float py, float pz) const
Trilinear-interpolated field vector at world position.
Definition fields.cpp:51
ScalarField3D z
x, y, z components on the same grid layout
Definition fields.hpp:57
ScalarField3D x
Definition fields.hpp:57
void scale(float s)
Multiply all components by scalar s.
Definition fields.cpp:55
ScalarField3D y
Definition fields.hpp:57