Skip to content

Commit abdcc91

Browse files
committed
compiler: Add new petsc types for utilising petscsections
1 parent f57ea60 commit abdcc91

5 files changed

Lines changed: 74 additions & 19 deletions

File tree

devito/petsc/iet/builder.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ class ConstrainedBCMixin:
345345
"""
346346
"""
347347
def _create_dmda_calls(self, dmda):
348+
sobjs = self.solver_objs
348349
# TODO: CLEAN UP
349350
dmda_create = self._create_dmda(dmda)
350351
# TODO: probs need to set the dm options prefix the same as snes?
@@ -355,10 +356,34 @@ def _create_dmda_calls(self, dmda):
355356
dm_mat_type = petsc_call('DMSetMatType', [dmda, 'MATSHELL'])
356357

357358
set_constraints = petsc_call(
358-
self.callback_builder._constrain_bc_efunc.name, []
359+
self.callback_builder._constrain_bc_efunc.name, [dmda]
360+
)
361+
362+
get_local_section = petsc_call('DMGetLocalSection', [dmda, Byref(sobjs['lsection'])])
363+
364+
get_point_sf = petsc_call('DMGetPointSF', [dmda, Byref(sobjs['sf'])])
365+
366+
create_global_section = petsc_call(
367+
'PetscSectionCreateGlobalSection', [sobjs['lsection'], sobjs['sf'], 'PETSC_TRUE', 'PETSC_FALSE', 'PETSC_FALSE', Byref(sobjs['gsection'])]
368+
)
369+
370+
dm_set_global_section = petsc_call('DMSetGlobalSection', [dmda, sobjs['gsection']])
371+
372+
dm_create_section_sf = petsc_call('DMCreateSectionSF', [dmda, sobjs['lsection'], sobjs['gsection']])
373+
374+
return (
375+
dmda_create,
376+
da_create_section,
377+
dm_set_from_opts,
378+
dm_setup,
379+
dm_mat_type,
380+
set_constraints,
381+
get_local_section,
382+
get_point_sf,
383+
create_global_section,
384+
dm_set_global_section,
385+
dm_create_section_sf
359386
)
360-
# OBVS CLEANUP
361-
return dmda_create, da_create_section, dm_set_from_opts, dm_setup, dm_mat_type, set_constraints
362387

363388

364389
class ConstrainedBCBuilder(ConstrainedBCMixin, BuilderBase):

devito/petsc/iet/passes.py

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
BaseCallbackBuilder, CoupledCallbackBuilder, populate_matrix_context,
2323
get_user_struct_fields
2424
)
25-
from devito.petsc.iet.type_builder import BaseTypeBuilder, CoupledTypeBuilder, objs
25+
from devito.petsc.iet.type_builder import BaseTypeBuilder, CoupledTypeBuilder, ConstrainedBCTypeBuilder, objs
2626
from devito.petsc.iet.builder import BuilderBase, CoupledBuilder, ConstrainedBCBuilder, make_core_petsc_calls
2727
from devito.petsc.iet.solve import Solve, CoupledSolve
2828
from devito.petsc.iet.time_dependence import TimeDependent, TimeIndependent
@@ -264,11 +264,14 @@ def __init__(self, inject_solve, iters, comm, section_mapper, **kwargs):
264264

265265
@cached_property
266266
def type_builder(self):
267-
return (
268-
CoupledTypeBuilder(**self.common_kwargs)
269-
if self.coupled else
270-
BaseTypeBuilder(**self.common_kwargs)
271-
)
267+
if self.coupled and self.constrain_bc:
268+
return NotImplementedError
269+
elif self.coupled:
270+
return CoupledTypeBuilder(**self.common_kwargs)
271+
elif self.constrain_bc:
272+
return ConstrainedBCTypeBuilder(**self.common_kwargs)
273+
else:
274+
return BaseTypeBuilder(**self.common_kwargs)
272275

273276
@cached_property
274277
def time_dependence(self):
@@ -280,17 +283,12 @@ def time_dependence(self):
280283
def callback_builder(self):
281284
return CoupledCallbackBuilder(**self.common_kwargs) \
282285
if self.coupled else BaseCallbackBuilder(**self.common_kwargs)
283-
284-
# @cached_property
285-
# def builder(self):
286-
# return CoupledBuilder(**self.common_kwargs) \
287-
# if self.coupled else BuilderBase(**self.common_kwargs)
288286

289287
@cached_property
290288
def builder(self):
291289
if self.coupled and self.constrain_bc:
292-
# TODO: implement CoupledConstrainedBCBuilder
293-
return CoupledBuilder(**self.common_kwargs)
290+
# TODO: implement CoupledConstrainedBCBuilder
291+
return NotImplementedError
294292
elif self.coupled:
295293
return CoupledBuilder(**self.common_kwargs)
296294
elif self.constrain_bc:

devito/petsc/iet/type_builder.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
PetscBundle, DM, Mat, CallbackVec, Vec, KSP, PC, SNES, PetscInt, StartPtr,
99
PointerIS, PointerDM, VecScatter, JacobianStruct, SubMatrixStruct, CallbackDM,
1010
PetscMPIInt, PetscErrorCode, PointerMat, MatReuse, CallbackPointerDM,
11-
CallbackPointerIS, CallbackMat, DummyArg, NofSubMats
11+
CallbackPointerIS, CallbackMat, DummyArg, NofSubMats, PetscSectionGlobal, PetscSectionLocal, PetscSF
1212
)
1313

1414

@@ -199,6 +199,21 @@ def _target_dependent(self, base_dict):
199199
)
200200

201201

202+
class ConstrainedBCTypeBuilder(BaseTypeBuilder):
203+
def _extend_build(self, base_dict):
204+
sreg = self.sregistry
205+
base_dict['lsection'] = PetscSectionLocal(
206+
name=sreg.make_name(prefix='lsection')
207+
)
208+
base_dict['gsection'] = PetscSectionGlobal(
209+
name=sreg.make_name(prefix='gsection')
210+
)
211+
base_dict['sf'] = PetscSF(
212+
name=sreg.make_name(prefix='sf')
213+
)
214+
return base_dict
215+
216+
202217
subdms = PointerDM(name='subdms')
203218
fields = PointerIS(name='fields')
204219
submats = PointerMat(name='submats')

devito/petsc/types/dimension.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def _arg_values(self, grid=None, **kwargs):
2929
g_x_M = decomp.glb_max
3030
# print(g_x_M)
3131
val = decomp.index_glb_to_loc_unsafe(g_x_M - grtkn)
32-
print(val)
32+
# print(val)
3333

3434

3535
return {self.name: int(val)}

devito/petsc/types/object.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,22 @@ class SingleIS(PetscObject):
193193
dtype = CustomDtype('IS')
194194

195195

196+
class PetscSectionGlobal(PetscObject):
197+
dtype = CustomDtype('PetscSection')
198+
199+
@property
200+
def _C_free(self):
201+
return petsc_call('PetscSectionDestroy', [Byref(self.function)])
202+
203+
204+
class PetscSectionLocal(PetscObject):
205+
dtype = CustomDtype('PetscSection')
206+
207+
208+
class PetscSF(PetscObject):
209+
dtype = CustomDtype('PetscSF')
210+
211+
196212
class PETScStruct(LocalCompositeObject):
197213

198214
@property
@@ -340,5 +356,6 @@ class NofSubMats(Scalar, LocalType):
340356
Vec: 1,
341357
Mat: 2,
342358
SNES: 3,
343-
DM: 4,
359+
PetscSectionGlobal: 4,
360+
DM: 5,
344361
}

0 commit comments

Comments
 (0)