#include #include #include #include #include /// Example of advection-diffusion equation on http://e6.ijs.si/medusa/features using namespace mm; // NOLINT template void solve() { typedef Vec vec; BallShape c(0.0, 1.0); BallShape hole(0.1, 0.3); double dx = 0.001*dim*dim*dim; DomainDiscretization domain = (c-hole).discretizeBoundaryWithStep(dx); GeneralFill fill; domain.fill(fill, dx); prn(domain.size()); int N = domain.size(); Monomials mon(2); domain.findSupport(FindClosest(2*mon.size())); RBFFD, vec, ScaleToClosest> approx({}, mon); auto storage = domain.template computeShapes(approx); Eigen::SparseMatrix M(N, N); Eigen::VectorXd rhs(N); rhs.setZero(); auto op = storage.implicitOperators(M, rhs); M.reserve(storage.supportSizes()); for (int i : domain.interior()) { 8.0*op.grad(i, -1) + 2.0*op.lap(i) = -1.0; } for (int i : domain.boundary()) { op.value(i) = 0.0; } Eigen::BiCGSTAB> solver; solver.preconditioner().setDroptol(1e-4); solver.preconditioner().setFillfactor(20); solver.compute(M); ScalarFieldd u = solver.solve(rhs); std::ofstream out_file(format("web_example_%dd_data.m", dim)); out_file << "positions = " << domain.positions() << ";" << std::endl; out_file << "solution = " << u << ";" << std::endl; out_file.close(); } int main() { solve<1>(); solve<2>(); solve<3>(); return 0; }