class Mumps(): A = None ctx = None x = None def __init__(self, A, **kwagrs): self.ctx = DMumpsContext() self.A = A.tocsc() self.ctx.set_icntl(14, 60) self.ctx.set_centralized_sparse(A) # print 'Factoring' self.ctx.set_silent() # print 'Done' self.ctx.run(job=4) # Factorization def solve(self,b): # print 'Solving' self.x = b.copy() self.ctx.set_rhs(self.x) self.ctx.run(job=3) # Solve # print 'Done' return self.x def clean(self): self.ctx.destroy()
class MUMPSSolver(LinearSolver): """ Interface to MUMPS solver. """ name = 'ls.mumps' __metaclass__ = SolverMeta _parameters = [] def __init__(self, conf, **kwargs): try: from mumps import DMumpsContext except ImportError: self.mumps = None msg = 'cannot import MUMPS!' raise ImportError(msg) LinearSolver.__init__(self, conf, **kwargs) self.mumps = DMumpsContext() self.mumps_presolved = False @standard_call def __call__(self, rhs, x0=None, conf=None, eps_a=None, eps_r=None, i_max=None, mtx=None, status=None, **kwargs): context = self.mumps if not self.mumps_presolved: self.presolve(mtx) out = rhs.copy() context.set_rhs(out) context.run(job=3) # Solve return out def presolve(self, mtx): is_new, mtx_digest = _is_new_matrix(mtx, self.mtx_digest) if is_new: mtx_coo = mtx.tocoo() context = self.mumps if not self.conf.verbose: context.set_silent() context.set_shape(mtx_coo.shape[0]) context.set_centralized_assembled(mtx_coo.row + 1, mtx_coo.col + 1, mtx_coo.data) context.run(job=1) # Analyze context.run(job=2) # Factorize self.mumps_presolved = True self.mtx_digest = mtx_digest def __del__(self): if self.mumps is not None: self.mumps.destroy()
simulator = pickle.load(f) simulator.add_time(n) #writer = VTKMeshWriter(simulation=simulator.run) #writer.run() writer = VTKMeshWriter() simulator.run(ctx=ctx, writer=writer) else: ctx = DMumpsContext() ctx.set_silent() with open(args.mesh, 'rb') as f: mesh = pickle.load(f) # 导入地质网格模型 mesh.fluid_relative_permeability_0 = water mesh.fluid_relative_permeability_1 = oil simulator = TwoFluidsWithGeostressSimulator(mesh, args) writer = VTKMeshWriter(simulation=simulator.run, args=(ctx, None)) writer.run() #writer = VTKMeshWriter() #simulator.run(ctx=ctx, writer=writer) ctx.destroy() # 保存程序终止状态,用于后续计算测试 with open(args.save, 'wb') as f: pickle.dump(simulator, f, protocol=pickle.HIGHEST_PROTOCOL)
def picard_iteration(self, maxit=10): GD = self.GD e0 = 1.0 k = 0 while e0 > 1e-10: # 构建总系统 A, F, isBdDof = self.get_total_system() # 处理边界条件, 这里是 0 边界 gdof = len(isBdDof) bdIdx = np.zeros(gdof, dtype=np.int_) bdIdx[isBdDof] = 1 Tbd = diags(bdIdx) T = diags(1 - bdIdx) A = T @ A @ T + Tbd F[isBdDof] = 0.0 # 求解 if False: x = spsolve(A, F) else: ctx = DMumpsContext() if ctx.myid == 0: ctx.set_centralized_sparse(A) x = F.copy() ctx.set_rhs(x) # Modified in place ctx.run(job=6) # Analysis + Factorization + Solve ctx.destroy() # Cleanup vgdof = self.vspace.number_of_global_dofs() pgdof = self.pspace.number_of_global_dofs() cgdof = self.cspace.number_of_global_dofs() e0 = 0.0 start = 0 end = vgdof self.cv[:] = x[start:end] start = end end += pgdof e0 += np.sum((self.cp - x[start:end])**2) self.cp[:] = x[start:end] start = end end += pgdof e0 += np.sum((self.cs - x[start:end])**2) self.cs[:] = x[start:end] e0 = np.sqrt(e0) # 误差的 l2 norm k += 1 for i in range(GD): start = end end += cgdof self.cu[:, i] = x[start:end] print(e0) if k >= maxit: print('picard iteration arrive max iteration with error:', e0) break
F = space.source_vector(pde.source, dim=2) bc = NeumannBC(space, pde.neumann, threshold=pde.is_neumann_boundary) F = bc.apply(F) bc = DirichletBC(space, pde.dirichlet, threshold=pde.is_dirichlet_boundary) A, F = bc.apply(A, F, uh) ctx = DMumpsContext() ctx.set_silent() if ctx.myid == 0: ctx.set_centralized_sparse(A) x = F.copy() ctx.set_rhs(x) # Modified in place ctx.run(job=6) # Analysis + Factorization + Solve ctx.destroy() # Cleanup uh.T.flat[:] = x # uh.T.flat[:] = spsolve(A, F) # (2, gdof ).flat uI = space.interpolation(pde.displacement, dim=2) e = uh - uI #error = np.sqrt(np.mean(e**2)) error = sum(np.sqrt(np.sum(e**2, axis=-1))) / sum( np.sqrt(np.sum(uI**2, axis=-1))) print('error:\n', error) bc = mesh.entity_barycenter('edge') isBdEdge = pde.is_dirichlet_boundary(bc)