Beispiel #1
0
 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
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #5
0
    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.')