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#pragma once
4
5#include "core/vector.hpp"
6#include "fields/grid2d.hpp"
7
8namespace num {
9
11 public:
13 : grid_(g),
14 data_(static_cast<idx>(g.size())) {}
15
16 template<typename F>
18 : ScalarField2D(g) {
19 fill(std::forward<F>(f));
20 }
21
22 const Grid2D& grid() const { return grid_; }
23 int N() const { return grid_.N; }
24 double h() const { return grid_.h; }
25
26 real& operator()(int i, int j) { return data_[static_cast<idx>(i) * grid_.N + j]; }
27 real operator()(int i, int j) const {
28 return data_[static_cast<idx>(i) * grid_.N + j];
29 }
30
31 template<typename F>
32 void fill(F&& f) {
33 for (int i = 0; i < grid_.N; ++i)
34 for (int j = 0; j < grid_.N; ++j)
35 data_[static_cast<idx>(i) * grid_.N + j] = f(grid_.x(i), grid_.y(j));
36 }
37
38 Vector& vec() { return data_; }
39 const Vector& vec() const { return data_; }
40
41 real* data() { return data_.data(); }
42 const real* data() const { return data_.data(); }
43 idx size() const { return data_.size(); }
44
45 private:
46 Grid2D grid_;
47 Vector data_;
48};
49
50} // namespace num
constexpr idx size() const noexcept
Definition vector.hpp:83
const Vector & vec() const
const real * data() const
ScalarField2D(Grid2D g, F &&f)
real & operator()(int i, int j)
real operator()(int i, int j) const
const Grid2D & grid() const
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
Dense vector storage and operations.