def A(self): u = firedrake.TrialFunction(self.target.function_space()) v = firedrake.TestFunction(self.target.function_space()) a = firedrake.inner(u, v)*firedrake.dx if self.use_slate_for_inverse: a = firedrake.Tensor(a).inv A = firedrake.assemble(a, bcs=self.bcs, form_compiler_parameters=self.form_compiler_parameters) return A
def V_approx_inv_mass(self, V, DG): """ Approximate inverse mass. Computes (cellwise) (V, V)^{-1} (V, DG). :arg V: a function space :arg DG: the DG space :returns: A PETSc Mat mapping from V -> DG. """ key = V.dim() try: return self._V_approx_inv_mass[key] except KeyError: a = firedrake.Tensor(firedrake.inner(firedrake.TestFunction(V), firedrake.TrialFunction(V))*firedrake.dx) b = firedrake.Tensor(firedrake.inner(firedrake.TestFunction(V), firedrake.TrialFunction(DG))*firedrake.dx) M = firedrake.assemble(a.inv * b) M.force_evaluation() return self._V_approx_inv_mass.setdefault(key, M.petscmat)
def DG_inv_mass(self, DG): """ Inverse DG mass matrix :arg DG: the DG space :returns: A PETSc Mat. """ key = DG.dim() try: return self._DG_inv_mass[key] except KeyError: M = firedrake.assemble(firedrake.Tensor(firedrake.inner(firedrake.TestFunction(DG), firedrake.TrialFunction(DG))*firedrake.dx).inv) M.force_evaluation() return self._DG_inv_mass.setdefault(key, M.petscmat)
def DG_inv_mass(self, DG): """ Inverse DG mass matrix :arg DG: the DG space :returns: A PETSc Mat. """ cache = self.caches[DG.ufl_element()] key = DG.dim() try: return cache._DG_inv_mass[key] except KeyError: M = firedrake.assemble(firedrake.Tensor(firedrake.inner(firedrake.TrialFunction(DG), firedrake.TestFunction(DG))*firedrake.dx).inv) return cache._DG_inv_mass.setdefault(key, M.petscmat)
if it % freq_res == 0 or t == sim_time: if verbose: contours = fd.tripcolor(c0) plt.xlabel(r'$x$') plt.ylabel(r'$y$') plt.colorbar(contours) plt.show() # Computed flux, scalar, and trace c_h, q_h, lamb = w.split() c_h.rename("c_h") c_h.assign(c0) q_h.rename("q_h") # # scalar post-process # ch_star, lamb_pp = ch_pp.split() # ch_star.rename("ch_pp") A = fd.Tensor(a_pp) b = fd.Tensor(L_pp) ch_star = fd.assemble((A.inv * b).blocks[0]) ch_star.rename("ch_star") # print results outfile.write(c_h, q_h, ch_star, time=t) print('-- write results @ t= {}'.format(t)) print(f'DOF = {W.dim()}') print(f'DOF = {W.sub(2).dim()}') print('* normal termination.')