|
8 | 8 | from firedrake.functionspace import FunctionSpace, VectorFunctionSpace, TensorFunctionSpace |
9 | 9 | from firedrake.preconditioners.fdm import tabulate_exterior_derivative |
10 | 10 | from firedrake.preconditioners.hiptmair import curl_to_grad |
11 | | -from ufl import H1, H2, HCurl, inner, dx, JacobianDeterminant |
| 11 | +from ufl import H1, H2, inner, dx, JacobianDeterminant |
12 | 12 | from pyop2.utils import as_tuple |
13 | 13 | import numpy |
14 | 14 |
|
@@ -94,17 +94,17 @@ def initialize(self, pc): |
94 | 94 |
|
95 | 95 | tdim = V.mesh().topological_dimension() |
96 | 96 | if tdim >= 2 and V.finat_element.formdegree == tdim-1: |
97 | | - get_divergence = appctx.get("get_divergence_mat", get_divergence_mat) |
98 | 97 | A, P = pc.getOperators() |
99 | 98 | allow_repeated = P.getISAllowRepeated() |
| 99 | + get_divergence = appctx.get("get_divergence_mat", get_divergence_mat) |
100 | 100 | divergence = get_divergence(V, mat_type="is", allow_repeated=allow_repeated) |
101 | 101 | try: |
102 | 102 | div_args, div_kwargs = divergence |
103 | 103 | except ValueError: |
104 | 104 | div_args = (divergence,) |
105 | 105 | div_kwargs = dict() |
106 | 106 | bddcpc.setBDDCDivergenceMat(*div_args, **div_kwargs) |
107 | | - elif sobolev_space == HCurl: |
| 107 | + elif tdim >= 2 and V.finat_element.formdegree == 1: |
108 | 108 | get_gradient = appctx.get("get_discrete_gradient", get_discrete_gradient) |
109 | 109 | gradient = get_gradient(V) |
110 | 110 | try: |
@@ -141,13 +141,9 @@ def get_vertex_dofs(V): |
141 | 141 | def get_divergence_mat(V, mat_type="aij", allow_repeated=False): |
142 | 142 | from firedrake import assemble |
143 | 143 | degree = max(as_tuple(V.ufl_element().degree())) |
144 | | - |
145 | 144 | Q = TensorFunctionSpace(V.mesh(), "DG", 0, variant=f"integral({degree-1})", shape=V.value_shape[:-1]) |
146 | | - # d = {HCurl: curl, HDiv: div}[V.ufl_element().sobolev_space] |
147 | | - # b = inner(d(TrialFunction(V)), TestFunction(Q)) * dx(degree=degree-1) |
148 | | - # B = assemble(b, mat_type=mat_type).petscmat |
149 | | - |
150 | 145 | B = tabulate_exterior_derivative(V, Q, mat_type=mat_type, allow_repeated=allow_repeated) |
| 146 | + |
151 | 147 | Jdet = JacobianDeterminant(V.mesh()) |
152 | 148 | s = assemble(inner(TrialFunction(Q)*(1/Jdet), TestFunction(Q))*dx(degree=0), diagonal=True) |
153 | 149 | with s.dat.vec as svec: |
|
0 commit comments