Skip to content

Commit f3d4d2d

Browse files
committed
misc: Move vecset to function inside iet/utils.py
1 parent 19fddbe commit f3d4d2d

4 files changed

Lines changed: 22 additions & 34 deletions

File tree

devito/petsc/iet/routines.py

Lines changed: 6 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from devito.petsc.types import PETScArray, PetscBundle
1717
from devito.petsc.iet.nodes import (PETScCallable, FormFunctionCallback,
1818
MatShellSetOp, PetscMetaData)
19-
from devito.petsc.iet.utils import petsc_call, petsc_struct
19+
from devito.petsc.iet.utils import petsc_call, petsc_struct, zero_vector
2020
from devito.petsc.utils import solver_mapper
2121
from devito.petsc.types import (DM, Mat, CallbackVec, Vec, KSP, PC, SNES,
2222
PetscInt, StartPtr, PointerIS, PointerDM, VecScatter,
@@ -99,13 +99,6 @@ def initialguesses(self):
9999
def user_struct_callback(self):
100100
return self._user_struct_callback
101101

102-
@property
103-
def zero_memory(self):
104-
"""Indicates whether the memory of the output
105-
vector should be set to zero before the computation
106-
in the callback."""
107-
return True
108-
109102
@property
110103
def fielddata(self):
111104
return self.injectsolve.expr.rhs.fielddata
@@ -169,7 +162,7 @@ def _create_matvec_body(self, body, jacobian):
169162
'DMGetApplicationContext', [dmda, Byref(ctx._C_symbol)]
170163
)
171164

172-
zero_y_memory = self.zero_vector(objs['Y'])
165+
zero_y_memory = zero_vector(objs['Y']) if jacobian.zero_memory else None
173166

174167
dm_get_local_xvec = petsc_call(
175168
'DMGetLocalVector', [dmda, Byref(xlocal)]
@@ -188,9 +181,7 @@ def _create_matvec_body(self, body, jacobian):
188181
'DMGetLocalVector', [dmda, Byref(ylocal)]
189182
)
190183

191-
zero_ylocal_memory = petsc_call(
192-
'VecSet', [ylocal, 0.0]
193-
)
184+
zero_ylocal_memory = zero_vector(ylocal)
194185

195186
vec_get_array_y = petsc_call(
196187
'VecGetArray', [ylocal, Byref(y_matvec._C_symbol)]
@@ -320,7 +311,7 @@ def _create_formfunc_body(self, body):
320311
'DMGetApplicationContext', [dmda, Byref(ctx._C_symbol)]
321312
)
322313

323-
zero_f_memory = self.zero_vector(objs['F'])
314+
zero_f_memory = zero_vector(objs['F'])
324315

325316
dm_get_local_xvec = petsc_call(
326317
'DMGetLocalVector', [dmda, Byref(objs['xloc'])]
@@ -652,12 +643,6 @@ def _uxreplace_efuncs(self):
652643
mapper.update({k: visitor.visit(v)})
653644
return mapper
654645

655-
def zero_vector(self, vec):
656-
"""
657-
Zeros the memory of the output vector before computation
658-
"""
659-
return petsc_call('VecSet', [vec, 0.0]) if self.zero_memory else None
660-
661646
def dereference_funcs(self, struct, fields):
662647
return tuple(
663648
[Dereference(i, struct) for i in
@@ -691,13 +676,6 @@ def main_matvec_callback(self):
691676
def main_formfunc_callback(self):
692677
return self._main_formfunc_callback
693678

694-
@property
695-
def zero_memory(self):
696-
"""Indicates whether the memory of the output
697-
vector should be set to zero before the computation
698-
in the callback."""
699-
return False
700-
701679
def _make_core(self):
702680
for sm in self.fielddata.jacobian.nonzero_submatrices:
703681
self._make_matvec(sm, prefix=f'{sm.name}_MatMult')
@@ -730,9 +708,7 @@ def _whole_matvec_body(self):
730708

731709
nonzero_submats = self.jacobian.nonzero_submatrices
732710

733-
zero_y_memory = petsc_call(
734-
'VecSet', [objs['Y'], 0.0]
735-
)
711+
zero_y_memory = zero_vector(objs['Y'])
736712

737713
calls = ()
738714
for sm in nonzero_submats:
@@ -815,9 +791,7 @@ def _whole_formfunc_body(self, body):
815791
'DMGetApplicationContext', [dmda, Byref(ctx._C_symbol)]
816792
)
817793

818-
zero_f_memory = petsc_call(
819-
'VecSet', [objs['F'], 0.0]
820-
)
794+
zero_f_memory = zero_vector(objs['F'])
821795

822796
dm_get_local_xvec = petsc_call(
823797
'DMGetLocalVector', [dmda, Byref(objs['xloc'])]

devito/petsc/iet/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ def petsc_struct(name, fields, pname, liveness='lazy', modifier=None):
1818
modifier=modifier)
1919

2020

21+
def zero_vector(vec):
22+
return petsc_call('VecSet', [vec, 0.0])
23+
24+
2125
# Mapping special Eq operations to their corresponding IET Expression subclass types.
2226
# These operations correspond to subclasses of Eq utilised within PETScSolve.
2327
petsc_iet_mapper = {OpPetsc: PetscMetaData}

devito/petsc/types/types.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,10 @@ def row_target(self):
382382
def col_target(self):
383383
return self.target
384384

385+
@property
386+
def zero_memory(self):
387+
return True
388+
385389
def _build_matvecs(self):
386390
matvecs = []
387391
for eq in self.exprs:
@@ -516,8 +520,9 @@ def __init__(self, name, matvecs, scdiag, row_target,
516520
self.col_idx = col_idx
517521
self.linear_idx = linear_idx
518522

519-
def is_diag(self):
520-
return self.row_idx == self.col_idx
523+
@property
524+
def zero_memory(self):
525+
return False
521526

522527
def __repr__(self):
523528
return (f"<SubMatrixBlock {self.name}>")

examples/petsc/cfd/01_navierstokes.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,8 @@ def neumann_right(eq, subdomain):
297297
# Pressure norm check
298298
tol = 1e-3
299299
assert np.sum((pn1.data[0]-pn1.data[1])**2/np.maximum(pn1.data[0]**2, 1e-10)) < tol
300+
301+
from devito import norm
302+
print(norm(u1))
303+
print(norm(v1))
304+
print(norm(pn1))

0 commit comments

Comments
 (0)