41#include "MR_rect_tree.hpp"
42#include "MR_cell_cplx.hpp"
43#include "MR_rt_to_cc.hpp"
46typedef mjr::tree15b2d6rT tt_t;
47typedef mjr::MRccT5 cc_t;
48typedef mjr::MR_rt_to_cc<tt_t, cc_t> tc_t;
51tt_t::rrpt_t trefoil(tt_t::drpt_t xvec) {
52 double u = xvec[0] * std::numbers::pi;
53 double v = xvec[1] * std::numbers::pi;
55 double x = r * std::sin(3 * u) / (2 + std::cos(v));
56 double y = r * (std::sin(u) + 2 * std::sin(2 * u)) / (2 + std::cos(v + std::numbers::pi * 2 / 3));
57 double z = r / 2 * (std::cos(u) - 2 * std::cos(2 * u)) * (2 + std::cos(v)) * (2 + std::cos(v + std::numbers::pi * 2 / 3)) / 4;
58 double dxdu = (3*r*std::cos(3*u))/(std::cos(v)+2);
59 double dxdv = (r*std::sin(3*u)*std::sin(v))/(std::cos(v)+2)/(std::cos(v)+2);
60 double dydu = (r*(4*std::cos(2*u)+std::cos(u)))/(std::cos(v+(2*std::numbers::pi)/3)+2);
61 double dydv = (r*(2*std::sin(2*u)+std::sin(u))*std::sin(v+(2*std::numbers::pi)/3))/
62 ((std::cos(v+(2*std::numbers::pi)/3)+2)*(std::cos(v+(2*std::numbers::pi)/3)+2));
63 double dzdu = (r*(4*std::sin(2*u)-std::sin(u))*(std::cos(v)+2)*(std::cos(v+(2*std::numbers::pi)/3)+2))/8;
64 double dzdv = (-(r*(std::cos(u)-2*std::cos(2*u))*(std::cos(v)+2)*std::sin(v+(2*std::numbers::pi)/3))/8) -
65 (r*(std::cos(u)-2*std::cos(2*u))*std::sin(v)*(std::cos(v+(2*std::numbers::pi)/3)+2))/8;
66 double nx = dydu*dzdv-dydv*dzdu;
67 double ny = dxdv*dzdu-dxdu*dzdv;
68 double nz = dxdu*dydv-dxdv*dydu;
69 double nm = std::sqrt(nx*nx+ny*ny+nz*nz);
70 nm = (nm > 0 ? nm : 1);
74 return {x, y, z, nx, ny, nz};
83 tree.refine_grid(7, trefoil);
87 tc_t::construct_geometry_fans(ccplx,
90 {{tc_t::val_src_spc_t::FRANGE, 0},
91 {tc_t::val_src_spc_t::FRANGE, 1},
92 {tc_t::val_src_spc_t::FRANGE, 2}});
94 ccplx.create_named_datasets({
"u",
"v",
"x(u,v)",
"y(u,v)",
"z(u,v)",
"nx",
"ny",
"nz"},
95 {{
"NORMALS", {5, 6, 7}}});
97 ccplx.write_xml_vtk(
"trefoil.vtu",
"trefoil");