Hi, I was wondering whether I can abuse similar solutions (e.g. previous time steps), to speedup the solution of my system.
Below is a minimal example of a pulsating acoustic sphere, where I am probing the response of the domain to different frequencies. Can the solver access the previous solution? How would I have to modify this implementation to get more efficient simulations? Does the solver do that automatically?
Thank you
import dolfinx
import numpy as np
import ufl
import gmsh
from mpi4py import MPI
from dolfinx.fem.petsc import LinearProblem
# mesh
gmsh.initialize()
gmsh.model.add("Pulsating-Sphere")
box = gmsh.model.occ.add_rectangle(0.0, 0.0, 0.0, 1., 1.)
circ = gmsh.model.occ.add_disk(0.0, 0.0, 0.0, 0.2, 0.2, )
gmsh.model.occ.cut([(2, box)], [(2, circ)])
gmsh.model.occ.synchronize()
surfs = gmsh.model.occ.get_entities(2)
gmsh.model.add_physical_group(2, [s[1] for s in surfs])
lines = gmsh.model.occ.get_entities(1)
for line in lines:
com = np.array(gmsh.model.occ.get_center_of_mass(*line))
if not np.greater(com[:2], np.zeros(2, )).all():
continue
if not np.less(com[:2], np.ones(2, )).all():
continue
gmsh.model.add_physical_group(1, [line[1]], tag=42)
gmsh.model.add_physical_group(1, [l[1] for l in lines])
gmsh.option.setNumber("Mesh.MeshSizeMax", 343. / 500. / 15.)
gmsh.model.occ.synchronize()
gmsh.model.mesh.generate(2)
msh, ct, ft = dolfinx.io.gmshio.model_to_mesh(
gmsh.model, MPI.COMM_SELF, 0
)
ds = ufl.Measure("ds", msh, subdomain_data=ft)
# variational problem
v = dolfinx.fem.FunctionSpace(
msh, ufl.FiniteElement("Lagrange", msh.ufl_cell(), 2)
)
p = ufl.TrialFunction(v)
xi = ufl.TestFunction(v)
p_sol = dolfinx.fem.Function(v)
p_sol.name = "p"
# physics constants
v0 = 1e-3
s = 1j * 1.2 * 343.
# solve different systems
for f in np.linspace(450., 500., 50):
k = f * 2. * np.pi / 343.
ks = k ** 2
lhs = (
ufl.inner(ufl.grad(p), ufl.grad(xi)) * ufl.dx
- (ks * ufl.inner(p, xi) * ufl.dx)
- (s * k * 0.5 * (1 + 1j) * ufl.inner(p, xi) * ufl.ds)
)
rhs = s * k * ufl.inner(v0, xi) * ds(42)
problem = LinearProblem(
lhs,
rhs,
u=p_sol,
petsc_options={
"ksp_type": "preonly",
"pc_type": "cholesky",
"pc_factor_mat_solver_type": "mumps",
},
)
problem.solve()