4 _DEFAULT_LOAD_STORE_COMPUTE_FLAG,
5 derive_load_store_compute_flag,
9READ_AND_DISCARD = Task.DataAccess.READ_AND_DISCARD
10WRITE = Task.DataAccess.WRITE
11READ_AND_WRITE = Task.DataAccess.READ_AND_WRITE
12TEMPORARY = Task.DataAccess.TEMPORARY
16 """Minimal stand-in for peano4.api.datamodel.PatchToDoubleArrayWithSmartPointer:
17 derive_load_store_compute_flag() only ever needs somewhere to write
18 load_store_compute_flag to."""
26 """Minimal stand-in for a peano4.api.datamodel.Patch, with a generator
27 attribute like the real thing has."""
38 return Step(name=name, add_user_defined_actions=
False)
42 step.use_cell(submodel)
43 step.cell_data_access[submodel] = qualifier
47 step.use_face(submodel)
48 step.face_data_access[submodel] = qualifier
52 step.use_vertex(submodel)
53 step.vertex_data_access[submodel] = qualifier
57 """The exact "this Step is active" expression, for asserting against -
58 built the same way the production code builds it, so these tests break
59 if that expression's shape ever changes."""
61 "peano4::parallel::Node::getInstance().getCurrentProgramStep() == "
62 f
"repositories::StepRepository::toProgramStep(repositories::StepRepository::Steps::{step.name})"
66def _flag(use, load, store) -> str:
67 return f
"::peano4::grid::constructLoadStoreComputeFlag({use}, {load}, {store})"
73 _use_cell(step, submodel, READ_AND_DISCARD)
75 derive_load_store_compute_flag([step])
78 assert submodel.generator.load_store_compute_flag ==
_flag(active, active,
"false")
86 derive_load_store_compute_flag([step])
89 assert submodel.generator.load_store_compute_flag ==
_flag(active,
"false", active)
97 derive_load_store_compute_flag([step])
100 assert submodel.generator.load_store_compute_flag ==
_flag(active, active, active)
108 derive_load_store_compute_flag([step])
111 assert submodel.generator.load_store_compute_flag ==
_flag(active,
"false",
"false")
115 """One Step reads, a different Step (elsewhere) writes the same
116 submodel: use has both, load only the reader's term, store only the
121 _use_cell(reader, submodel, READ_AND_DISCARD)
124 derive_load_store_compute_flag([reader, writer])
126 active_reader =
_active(reader)
127 active_writer =
_active(writer)
128 assert submodel.generator.load_store_compute_flag ==
_flag(
129 f
"{active_reader} or {active_writer}", active_reader, active_writer
134 writer =
_make_step(
"SetupSimulation_InitialCondition")
135 reader =
_make_step(
"TimeStep_Reconstruction")
138 _use_cell(reader, submodel, READ_AND_DISCARD)
140 derive_load_store_compute_flag([writer, reader])
142 active_writer =
_active(writer)
143 active_reader =
_active(reader)
144 assert submodel.generator.load_store_compute_flag ==
_flag(
145 f
"{active_writer} or {active_reader}", active_reader, active_writer
155 _use_face(step, face_submodel, READ_AND_DISCARD)
158 derive_load_store_compute_flag([step])
161 assert cell_submodel.generator.load_store_compute_flag ==
_flag(active,
"false", active)
162 assert face_submodel.generator.load_store_compute_flag ==
_flag(active, active,
"false")
163 assert vertex_submodel.generator.load_store_compute_flag ==
_flag(active, active, active)
172 derive_load_store_compute_flag([step])
174 assert used_submodel.generator.load_store_compute_flag
is not None
175 assert unused_submodel.generator.load_store_compute_flag
is None
179 """A submodel's generator starts out at the factory default (never
180 customised by anyone) - the derived flag should replace it outright,
181 not get AND-combined with it."""
184 submodel.generator.load_store_compute_flag = _DEFAULT_LOAD_STORE_COMPUTE_FLAG
187 derive_load_store_compute_flag([step])
190 assert submodel.generator.load_store_compute_flag ==
_flag(active,
"false", active)
194 """A task graph author (or an earlier call to this function) already
195 set a custom load_store_compute_flag - the newly derived expression
196 must be AND-combined with it, existing first, new one parenthesised."""
199 submodel.generator.load_store_compute_flag =
"someCustomExpression"
202 derive_load_store_compute_flag([step])
205 new_flag =
_flag(active,
"false", active)
206 assert submodel.generator.load_store_compute_flag == f
"someCustomExpression and ({new_flag})"
214 derive_load_store_compute_flag([step])
216 assert '#include "repositories/StepRepository.h"' in submodel.generator.includes
217 assert '#include "repositories/SolverRepository.h"' in submodel.generator.includes
218 assert '#include "peano4/parallel/Node.h"' in submodel.generator.includes
227 derive_load_store_compute_flag([step])
229 assert unused_submodel.generator.includes ==
""
237 derive_load_store_compute_flag([step])
238 derive_load_store_compute_flag([step])
240 assert submodel.generator.includes.count(
'#include "repositories/StepRepository.h"') == 1
241 assert submodel.generator.includes.count(
'#include "repositories/SolverRepository.h"') == 1
242 assert submodel.generator.includes.count(
'#include "peano4/parallel/Node.h"') == 1
246 """Stand-in for a peano4.api.toolbox.GridSelector with one distinct
247 guard per kind, so tests can tell which routine was used."""
265 _use_cell(reader, submodel, READ_AND_DISCARD)
267 derive_load_store_compute_flag([writer, reader])
269 active_writer =
_active(writer)
270 active_reader =
_active(reader)
271 assert submodel.generator.load_store_compute_flag ==
_flag(
272 f
"(cellGuard) and ({active_writer} or {active_reader})",
273 f
"(cellGuard) and ({active_reader})",
274 f
"(cellGuard) and ({active_writer})",
284 derive_load_store_compute_flag([step])
287 assert submodel.generator.load_store_compute_flag ==
_flag(
288 f
"(cellGuard) and ({active})",
"(cellGuard) and (false)",
"(cellGuard) and (false)"
297 for submodel
in (cell_submodel, face_submodel, vertex_submodel):
299 _use_cell(step, cell_submodel, READ_AND_WRITE)
300 _use_face(step, face_submodel, READ_AND_WRITE)
303 derive_load_store_compute_flag([step])
306 for submodel, guard
in (
307 (cell_submodel,
"cellGuard"),
308 (face_submodel,
"faceGuard"),
309 (vertex_submodel,
"vertexGuard"),
311 predicate = f
"({guard}) and ({active})"
312 assert submodel.generator.load_store_compute_flag ==
_flag(predicate, predicate, predicate)
318 submodel.grid_selector =
None
319 _use_cell(step, submodel, READ_AND_WRITE)
321 derive_load_store_compute_flag([step])
324 assert submodel.generator.load_store_compute_flag ==
_flag(active, active, active)
328 """End-to-end with the real classes: a peano4.api.datamodel.Patch
329 carrying a peano4.api.toolbox.FineGridSelector."""
338 derive_load_store_compute_flag([step])
340 predicate = f
"(not marker.hasBeenRefined()) and ({_active(step)})"
341 store_predicate = f
"(not marker.willBeRefined()) and ({_active(step)})"
342 assert patch.generator.load_store_compute_flag ==
_flag(predicate, predicate, store_predicate)
346 """A selector without its own store guard stores whenever it loads."""
351 def createVertexGuard(self):
354 def createFaceGuard(self):
357 def createCellGuard(self):
362 patch.grid_selector = _Selector()
365 derive_load_store_compute_flag([step])
367 predicate = f
"(cellGuard) and ({_active(step)})"
368 assert patch.generator.load_store_compute_flag ==
_flag(predicate, predicate, predicate)
Patch implementation of a degree of freedom.
Minimal stand-in for peano4.api.datamodel.PatchToDoubleArrayWithSmartPointer: derive_load_store_compu...
Stand-in for a peano4.api.toolbox.GridSelector with one distinct guard per kind, so tests can tell wh...
Minimal stand-in for a peano4.api.datamodel.Patch, with a generator attribute like the real thing has...
The Python-side model of "what happens during one mesh sweep".
The task graph abstraction allows users to formalise their solver steps over small task graphs which ...
test_touched_submodel_gets_step_repository_includes()
_use_cell(step, submodel, qualifier)
test_read_and_discard_only_contributes_to_use_and_load()
test_grid_selector_guard_is_combined_with_false_predicate()
test_terms_across_different_phases_use_each_steps_own_name()
test_store_guard_defaults_to_guard()
A selector without its own store guard stores whenever it loads.
test_no_grid_selector_leaves_predicates_untouched()
test_write_only_contributes_to_use_and_store()
test_grid_selector_guard_matches_kind_of_submodel()
test_grid_selector_guard_is_combined_with_each_predicate()
str _active(step)
The exact "this Step is active" expression, for asserting against - built the same way the production...
_use_face(step, submodel, qualifier)
test_fine_grid_selector_restricts_patch_to_unrefined_cells()
End-to-end with the real classes: a peano4.api.datamodel.Patch carrying a peano4.api....
test_read_and_write_contributes_to_all_three()
test_factory_default_is_overwritten_not_combined()
A submodel's generator starts out at the factory default (never customised by anyone) - the derived f...
test_untouched_submodel_gets_no_includes()
test_submodel_never_used_is_left_untouched()
test_pre_existing_custom_expression_is_combined_with_and()
A task graph author (or an earlier call to this function) already set a custom load_store_compute_fla...
_use_vertex(step, submodel, qualifier)
test_cell_face_and_vertex_are_derived_independently()
test_includes_are_not_duplicated_on_repeated_calls()
test_terms_from_different_steps_are_ored_together()
One Step reads, a different Step (elsewhere) writes the same submodel: use has both,...
test_temporary_contributes_only_to_use()
str _flag(use, load, store)