Peano
Loading...
Searching...
No Matches
VerifyTroubledness.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
5from exahype2.solvers.PDETerms import PDETerms
6
7import peano4.solversteps
8import jinja2
9
10from .kernels import check_troubledness
11
13 TemplateVerifyTroubledness = """
14 if ( {{PREDICATE}} ) {
15 const double timeStamp = fineGridCell{{REGULAR_SOLVER_NAME}}CellLabel.getTimeStamp();
16 const double timeStepSize = fineGridCell{{REGULAR_SOLVER_NAME}}CellLabel.getTimeStepSize();
17
18 bool isUnTroubled = true;
19
20 auto* luh = fineGridCell{{REGULAR_SOLVER_UNKNOWN_IDENTIFIER}}.value;
21
22 {% if USE_PAC %}
23 isUnTroubled &= kernels::{{SOLVER_NAME}}::isPhysicallyAdmissible(
24 repositories::{{SOLVER_INSTANCE}},
25 luh,
26 marker.x(),
27 marker.h(),
28 timeStamp+timeStepSize
29 );
30 {% endif %}
31
32 {% if USE_DMP %}
33 constexpr int numberOfObservables = repositories::{{SOLVER_INSTANCE}}.NumberOfDMPObservables;
34 double boundaryMinPerVariables[2*Dimensions*numberOfObservables];
35 double boundaryMaxPerVariables[2*Dimensions*numberOfObservables];
36
37 for (int d=0; d<Dimensions; d++) {
38 std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value, numberOfObservables, &boundaryMinPerVariables[d*numberOfObservables]);
39 std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+Dimensions).value+numberOfObservables, numberOfObservables, &boundaryMinPerVariables[(d+Dimensions)*numberOfObservables]);
40
41 std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+2*numberOfObservables, numberOfObservables, &boundaryMaxPerVariables[d*numberOfObservables]);
42 std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+Dimensions).value+3*numberOfObservables, numberOfObservables, &boundaryMaxPerVariables[(d+Dimensions)*numberOfObservables]);
43 }
44
45 isUnTroubled &= kernels::{{SOLVER_NAME}}::discreteMaximumPrincipleAndMinAndMaxSearch(
46 repositories::{{SOLVER_INSTANCE}},
47 luh,
48 repositories::{{SOLVER_INSTANCE}}.RelaxationParameter, //const double relaxationParameter
49 repositories::{{SOLVER_INSTANCE}}.DifferencesScaling, //const double differenceScaling
50 boundaryMinPerVariables,
51 boundaryMaxPerVariables
52 );
53 {% endif %}
54
55 if(!isUnTroubled){
56 repositories::{{SOLVER_INSTANCE}}.addTroubledCell();
57 fineGridCell{{SOLVER_NAME}}CellLabel.setTroubled_Marker(celldata::{{SOLVER_NAME}}CellLabel::Troubled_Marker::TROUBLED);
58 for(int d=0; d<2*Dimensions; d++){
59 fineGridFaces{{SOLVER_NAME}}FaceLabel(d).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::TROUBLED);
60 }
61 }
62
63 fineGridCell{{LIMITER_SOLVER_NAME}}CellLabel.setTimeStamp(timeStamp);
64 fineGridCell{{LIMITER_SOLVER_NAME}}CellLabel.setTimeStepSize(timeStepSize);
65
66 fineGridCell{{LIMITER_SOLVER_NAME}}CellLabel.setHasUpdated(true);
67 }
68"""
69
70 def __init__(self, solver, guard, use_PAC=False, use_DMP=False):
71 super(VerifyTroubledness,self).__init__(solver)
72 self.guard = guard
73
74 self.use_PAC = use_PAC
75 self.use_DMP = use_DMP
76
77 def get_body_of_operation(self,operation_name):
78 result = ""
79 if operation_name==peano4.solversteps.ActionSet.OPERATION_TOUCH_CELL_LAST_TIME:
80 d = {}
81 self._solver._init_dictionary_with_default_parameters(d)
82 self._solver.add_entries_to_text_replacement_dictionary(d)
83 d["PREDICATE" ] = self.guard
84 d["USE_PAC"] = self.use_PAC
85 d["USE_DMP"] = self.use_DMP
86 result = jinja2.Template(self.TemplateVerifyTroubledness).render(**d)
87 pass
88 return result
89
90
92 return __name__.replace(".py", "").replace(".", "_")
93
94 def get_includes(self):
95 return (
96 super(VerifyTroubledness, self).get_includes()
97 + """
98#include "kernels/"""
99 + self._solver._name
100 + """/Limiter.h"
101 """
102 )
get_body_of_operation(self, operation_name)
Return actual C++ code snippets to be inserted into C++ code.