Peano
Loading...
Searching...
No Matches
SaveNewCellData.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3
4from .AbstractLimiterActionSet import AbstractLimiterActionSet
5
6import peano4.solversteps
7import jinja2
9 TemplateSaveNewCellData = """
10 if ( {{PREDICATE}} ) {
11
12 {% if USE_DMP %}
13 //resetting local min and max
14 constexpr int numberOfObservables = repositories::{{SOLVER_INSTANCE}}.NumberOfDMPObservables;
15 double localMinPerVariables[numberOfObservables], localMaxPerVariables[numberOfObservables];
16
17 kernels::{{SOLVER_NAME}}::findCellLocalMinAndMax(
18 repositories::{{SOLVER_INSTANCE}},
19 fineGridCell{{REGULAR_SOLVER_UNKNOWN_IDENTIFIER}}_old.value,
20 localMinPerVariables, localMaxPerVariables
21 );
22
23 for(int d=0; d<Dimensions; d++){
24 //Projection of cell local min and max
25 std::copy_n(localMinPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+numberOfObservables);
26 std::copy_n(localMinPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+Dimensions).value);
27 std::copy_n(localMaxPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+3*numberOfObservables);
28 std::copy_n(localMaxPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+Dimensions).value+2*numberOfObservables);
29 }
30 {% endif %}
31
32 {% if RESET_TROUBLED_MARKERS %}
33 //resetting troubled markers
34 fineGridCell{{SOLVER_NAME}}CellLabel.setTroubled_Marker(celldata::{{SOLVER_NAME}}CellLabel::Troubled_Marker::REGULAR);
35 for(int d=0; d<2*Dimensions; d++){
36 fineGridFaces{{SOLVER_NAME}}FaceLabel(d).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::REGULAR);
37 }
38 {% endif %}
39
40 {% if TRAMSMIT_CELL_TIMESTAMPS %}
41 //set timestamp for both cells to be the max of the two possible timestamps
42 const double timeStamp = std::max(
43 fineGridCell{{LIMITER_SOLVER_NAME}}CellLabel.getTimeStamp(),
44 fineGridCell{{REGULAR_SOLVER_NAME}}CellLabel.getTimeStamp()
45 );
46 fineGridCell{{LIMITER_SOLVER_NAME}}CellLabel.setTimeStamp(timeStamp);
47 fineGridCell{{REGULAR_SOLVER_NAME}}CellLabel.setTimeStamp(timeStamp);
48 {% endif %}
49 }
50"""
51
52 def __init__(self, solver, guard, use_DMP=False, reset_troubled_markers=False, transmit_cell_timestamps=False):
53 super(SaveNewCellData, self).__init__(solver)
54 self.guard = guard
55 self._use_DMP = use_DMP
56 self._reset_troubled_markers = reset_troubled_markers
57 self._transmit_cell_timestamps = transmit_cell_timestamps
58
59 def get_body_of_operation(self,operation_name):
60 result = ""
61 if operation_name==peano4.solversteps.ActionSet.OPERATION_TOUCH_CELL_FIRST_TIME:
62 d = {}
63 self._solver._init_dictionary_with_default_parameters(d)
64 self._solver.add_entries_to_text_replacement_dictionary(d)
65 d[ "PREDICATE" ] = self.guard
66 d["USE_DMP"] = self._use_DMP
67 d["RESET_TROUBLED_MARKERS"] = self._reset_troubled_markers
68 d["TRAMSMIT_CELL_TIMESTAMPS"] = self._transmit_cell_timestamps
69 result = jinja2.Template(self.TemplateSaveNewCellData).render(**d)
70 return result
71
73 return __name__.replace(".py", "").replace(".", "_")
74
75 def get_includes(self):
76 return (
77 super(SaveNewCellData, self).get_includes()
78 + """
79#include "kernels/"""
80 + self._solver._name
81 + """/Limiter.h"
82 """
83 )
__init__(self, solver, guard, use_DMP=False, reset_troubled_markers=False, transmit_cell_timestamps=False)
get_body_of_operation(self, operation_name)
Return actual C++ code snippets to be inserted into C++ code.
get_includes(self)
Return include statements that you need.