14 Eigen::Matrix<bool, 3, 1> dd;
20 assert(data.size() == 3);
21 init((
double)data[0], (
double)data[1], (
double)data[2], dd);
24 else if (data.is_object())
26 Eigen::MatrixXd fun, pts;
29 std::string rbf =
"multiquadric";
32 fun = resources.
read_matrix(data[
"function"].get<std::string>());
33 pts = resources.
read_matrix(data[
"points"].get<std::string>());
36 if (data.contains(
"coordinate"))
37 coord = data[
"coordinate"];
40 pts = pts.block(0, 0, pts.rows(), 2).eval();
42 is_tri = data.contains(
"triangles");
47 if (data.contains(
"rbf"))
49 const std::string tmp = data[
"rbf"];
52 if (data.contains(
"epsilon"))
53 eps = data[
"epsilon"];
56 if (data.contains(
"dimension"))
59 auto &tmp = data[
"dimension"];
60 assert(tmp.is_array());
61 for (
size_t k = 0; k < tmp.size(); ++k)
66 init(pts, tri, fun, coord, dd);
68 init(pts, fun, rbf, eps, coord, dd);
82 return val.transpose();
84 Eigen::RowVector3d res;
86 if (coordiante_0 >= 0)
88 Eigen::RowVector2d pt2;
89 pt2 << pt(coordiante_0), pt(coordiante_1);
92 res = tri_func.interpolate(pt2);
94 res = rbf_func.interpolate(pt2);
99 res = tri_func.interpolate(pt);
101 res = rbf_func.interpolate(pt);
115 val = Eigen::MatrixXd::Constant(pts.rows(), pts.cols(),
rhs_);
120 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
122 for (
long i = 0; i < pts.rows(); ++i)
139 val = Eigen::MatrixXd::Zero(pts.rows(), mesh.
dimension());
141 for (
long i = 0; i < pts.rows(); ++i)
169 bc_.back().init(value, dd);
173 void PointBasedTensorProblem::add_function(
const int bc_tag,
const Eigen::MatrixXd &func,
const Eigen::MatrixXd &pts,
const Eigen::MatrixXi &tri,
const int coord,
const Eigen::Matrix<bool, 3, 1> &dd,
const bool is_neumann)
179 neumann_bc_.back().init(pts.block(0, 0, pts.rows(), 2), tri, func, coord, dd);
187 bc_.back().init(pts.block(0, 0, pts.rows(), 2), tri, func, coord, dd);
191 void PointBasedTensorProblem::add_function(
const int bc_tag,
const Eigen::MatrixXd &func,
const Eigen::MatrixXd &pts,
const std::string &rbf,
const double eps,
const int coord,
const Eigen::Matrix<bool, 3, 1> &dd,
const bool is_neumann)
198 neumann_bc_.back().init(pts.block(0, 0, pts.rows(), 2), func, rbf, eps, coord, dd);
200 neumann_bc_.back().init(pts, func, rbf, eps, coord, dd);
209 bc_.back().init(pts.block(0, 0, pts.rows(), 2), func, rbf, eps, coord, dd);
211 bc_.back().init(pts, func, rbf, eps, coord, dd);
224 return bc_[b].is_dirichet_dim(dim);
237 if (params.contains(
"scaling"))
242 if (params.contains(
"rhs"))
244 rhs_ = params[
"rhs"];
247 if (params.contains(
"translation"))
249 const auto &j_translation = params[
"translation"];
251 assert(j_translation.is_array());
252 assert(j_translation.size() == 3);
254 for (
int k = 0; k < 3; ++k)
258 if (params.contains(
"boundary_ids"))
261 auto j_boundary = params[
"boundary_ids"];
269 const auto ff = j_boundary[i][
"value"];
270 const bool all_d =
bc_[i].init(ff, resources);
275 if (params.contains(
"neumann_boundary_ids"))
278 auto j_boundary = params[
"neumann_boundary_ids"];
286 const auto ff = j_boundary[i][
"value"];
const std::string & name() const
std::vector< int > boundary_ids_
std::vector< int > neumann_boundary_ids_
Read-only interface to a hierarchical collection of simulation resources.
virtual Eigen::MatrixXi read_int_matrix(const std::string &path) const =0
virtual Eigen::MatrixXd read_matrix(const std::string &path) const =0
Abstract mesh class to capture 2d/3d conforming and non-conforming meshes.
virtual int get_boundary_id(const int primitive) const
Get the boundary selection of an element (face in 3d, edge in 2d)
int dimension() const
utily for dimension
bool init(const json &data, const io::ResourceIO &resources)
Eigen::RowVector3d operator()(const Eigen::RowVector3d &pt) const
void dirichlet_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const override
void rhs(const assembler::Assembler &assembler, const Eigen::MatrixXd &pts, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const override
bool all_dimensions_dirichlet_
void add_constant(const int bc_tag, const Eigen::Vector3d &value)
bool all_dimensions_dirichlet(const int fe_space_id) const override
Eigen::Vector3d translation_
void neumann_bc(const mesh::Mesh &mesh, const Eigen::MatrixXi &global_ids, const Eigen::MatrixXd &uv, const Eigen::MatrixXd &pts, const Eigen::MatrixXd &normals, const double t, Eigen::MatrixXd &val, const int fe_space_id=-1) const override
void set_parameters(const json ¶ms, const io::ResourceIO &resources) override
std::vector< BCValue > neumann_bc_
void add_function(const int bc_tag, const Eigen::MatrixXd &func, const Eigen::MatrixXd &pts, const Eigen::MatrixXi &tri, const int coord)
bool is_dimension_dirichet(const int tag, const int dim, const int fe_space_id=-1) const override
PointBasedTensorProblem(const std::string &name)
std::vector< BCValue > bc_