numerics 0.1.0
Loading...
Searching...
No Matches
scalar_field_2d.hpp
Go to the documentation of this file.
1/// @file pde/scalar_field_2d.hpp
2/// @brief Scalar field on a 2D uniform interior grid.
3///
4/// ScalarField2D owns a Grid2D (geometry) and a flat Vector (values).
5/// Node (i,j) sits at ((i+1)*h, (j+1)*h); the boundary ring is implicitly
6/// zero (Dirichlet) -- BCs are enforced by the operator, not the field.
7///
8/// @code
9/// num::Grid2D grid{64, 1.0/65};
10/// num::ScalarField2D u(grid, [=](double x, double y) {
11/// return num::gaussian2d(x, y, 0.5, 0.5, 0.06);
12/// });
13/// @endcode
14#pragma once
15
16#include "fields/grid2d.hpp"
17#include "core/vector.hpp"
18
19namespace num {
20
22 public:
24 : grid_(g)
25 , data_(static_cast<idx>(g.size())) {}
26
27 /// Construct and fill from callable f(x, y) -> real.
28 template<typename F>
29 ScalarField2D(Grid2D g, F&& f) : ScalarField2D(g) { fill(std::forward<F>(f)); }
30
31 const Grid2D& grid() const { return grid_; }
32 int N() const { return grid_.N; }
33 double h() const { return grid_.h; }
34
35 real& operator()(int i, int j) { return data_[static_cast<idx>(i) * grid_.N + j]; }
36 real operator()(int i, int j) const { return data_[static_cast<idx>(i) * grid_.N + j]; }
37
38 /// Fill every interior node (i,j) with f((i+1)*h, (j+1)*h).
39 template<typename F>
40 void fill(F&& f) {
41 for (int i = 0; i < grid_.N; ++i)
42 for (int j = 0; j < grid_.N; ++j)
43 data_[static_cast<idx>(i) * grid_.N + j] = f(grid_.x(i), grid_.y(j));
44 }
45
46 /// Satisfy VecField concept: exposes the underlying flat vector.
47 Vector& vec() { return data_; }
48 const Vector& vec() const { return data_; }
49
50 real* data() { return data_.data(); }
51 const real* data() const { return data_.data(); }
52 idx size() const { return data_.size(); }
53
54 private:
55 Grid2D grid_;
56 Vector data_;
57};
58
59} // namespace num
constexpr idx size() const noexcept
Definition vector.hpp:80
const Vector & vec() const
const real * data() const
ScalarField2D(Grid2D g, F &&f)
Construct and fill from callable f(x, y) -> real.
void fill(F &&f)
Fill every interior node (i,j) with f((i+1)*h, (j+1)*h).
real & operator()(int i, int j)
real operator()(int i, int j) const
const Grid2D & grid() const
Vector & vec()
Satisfy VecField concept: exposes the underlying flat vector.
2D uniform interior grid: geometry only, no field data.
double real
Definition types.hpp:10
std::size_t idx
Definition types.hpp:11
int N
interior nodes per side
Definition grid2d.hpp:14
double x(int i) const
Definition grid2d.hpp:17
double y(int j) const
Definition grid2d.hpp:18
double h
grid spacing = 1/(N+1)
Definition grid2d.hpp:15
Vector operations.