module; #include export module mean_field:physics.gravity; export import :fem; export namespace mean_field::physics { struct GravitySolveOptions final { double relativeTolerance{1.0e-12}; double absoluteTolerance{1.0e-15}; int maximumIterations{1000}; }; struct GravitySolution { mfem::ParGridFunction gradPhi; mfem::ParGridFunction phi; explicit GravitySolution(fem::FEM &fem) : gradPhi(fem.gravityFluxFes.get()), phi(fem.gravityPotentialFes.get()) { } }; GravitySolution solve_gravity_field( fem::FEM &f, const GravitySolveOptions &options, const mfem::GridFunction &rho, const mfem::GridFunction &displacement ); GravitySolution solve_gravity_field( fem::FEM &f, const utils::Args &args, const mfem::GridFunction &rho, const mfem::GridFunction &displacement ); mfem::DenseMatrix compute_quadrupole_moment_tensor( const fem::FEM &fem, const mfem::GridFunction &rho, const mfem::Vector &com ); double l2_multipole_potential( const fem::FEM &fem, double total_mass, const mfem::Vector &phys_x ); } // namespace mean_field::physics