Peano
kernels.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 
4 import jinja2
5 
7  return """
8  // reset cell and face labels for limiting
9  fineGridCell{{SOLVER_NAME}}CellLabel.setTroubled_Marker(celldata::{{SOLVER_NAME}}CellLabel::Troubled_Marker::ADER);
10 
11  for(int d=0; d<DIMENSIONS; d++){
12  fineGridFaces{{SOLVER_NAME}}FaceLabel(d).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::ADER);
13  fineGridFaces{{SOLVER_NAME}}FaceLabel(d+DIMENSIONS).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::ADER);
14  }
15 """
16 
18  return """
19  constexpr int numberOfObservables = repositories::{{SOLVER_INSTANCE}}.NumberOfDMPObservables;
20  double localMinPerVariables[numberOfObservables], localMaxPerVariables[numberOfObservables];
21  generated::kernels::limiter::findCellLocalMinAndMax(
22  fineGridCell{{SOLVER_NAME}}Q_old.value,
23  repositories::{{SOLVER_INSTANCE}},
24  localMinPerVariables, localMaxPerVariables
25  );
26 
27  for(int d=0; d<DIMENSIONS; d++){
28  //Projection of cell local min and max
29  std::copy_n(localMinPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+numberOfObservables);
30  std::copy_n(localMinPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+DIMENSIONS).value);
31  std::copy_n(localMaxPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+3*numberOfObservables);
32  std::copy_n(localMaxPerVariables, numberOfObservables, fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+DIMENSIONS).value+2*numberOfObservables);
33  }
34 """
35 
36 def check_troubledness(usePAC, useDMP, useTroubledMarkers):
37  templatePAC = """
38  isUnTroubled &= generated::kernels::limiter::isPhysicallyAdmissible(
39  luh,
40  repositories::{{SOLVER_INSTANCE}},
41  marker.x(),
42  marker.h(),
43  timeStamp+timeStepSize
44  );
45  """
46  template_DMP = """
47  constexpr int numberOfObservables = repositories::{{SOLVER_INSTANCE}}.NumberOfDMPObservables;
48  double boundaryMinPerVariables[2*DIMENSIONS*numberOfObservables];
49  double boundaryMaxPerVariables[2*DIMENSIONS*numberOfObservables];
50 
51  for(int d=0; d<DIMENSIONS; d++){
52  std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value, numberOfObservables, &boundaryMinPerVariables[d*numberOfObservables]);
53  std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+DIMENSIONS).value+numberOfObservables, numberOfObservables, &boundaryMinPerVariables[(d+DIMENSIONS)*numberOfObservables]);
54 
55  std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d).value+2*numberOfObservables, numberOfObservables, &boundaryMaxPerVariables[d*numberOfObservables]);
56  std::copy_n(fineGridFaces{{SOLVER_NAME}}Q_min_and_max(d+DIMENSIONS).value+3*numberOfObservables, numberOfObservables, &boundaryMaxPerVariables[(d+DIMENSIONS)*numberOfObservables]);
57  }
58 
59  isUnTroubled &= generated::kernels::limiter::discreteMaximumPrincipleAndMinAndMaxSearch(
60  luh,
61  repositories::{{SOLVER_INSTANCE}},
62  repositories::{{SOLVER_INSTANCE}}.RelaxationParameter, //const double relaxationParameter
63  repositories::{{SOLVER_INSTANCE}}.DifferencesScaling, //const double differenceScaling
64  boundaryMinPerVariables,
65  boundaryMaxPerVariables
66  );
67 """
68  template_set_troubled_markers = """
69  if(!isUnTroubled){
70  repositories::{{SOLVER_INSTANCE}}.addTroubledCell();
71  fineGridCell{{SOLVER_NAME}}CellLabel.setTroubled_Marker(celldata::{{SOLVER_NAME}}CellLabel::Troubled_Marker::TROUBLED);
72  for(int d=0; d<2*DIMENSIONS; d++){
73  fineGridFaces{{SOLVER_NAME}}FaceLabel(d).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::TROUBLED);
74  }
75  }
76  else{
77  fineGridCell{{SOLVER_NAME}}CellLabel.setTroubled_Marker(celldata::{{SOLVER_NAME}}CellLabel::Troubled_Marker::REGULAR);
78  for(int d=0; d<2*DIMENSIONS; d++){
79  fineGridFaces{{SOLVER_NAME}}FaceLabel(d).setTroubled_Marker(facedata::{{SOLVER_NAME}}FaceLabel::Troubled_Marker::REGULAR);
80  }
81  }
82 
83 """
84  return ("""
85  bool isUnTroubled = true;
86 """ + (templatePAC if usePAC else "")
87  + (template_DMP if useDMP else "")
88  + (template_set_troubled_markers if useTroubledMarkers else "")
89  )
def check_troubledness(usePAC, useDMP, useTroubledMarkers)
Definition: kernels.py:36
def compute_local_min_and_max_and_project()
Definition: kernels.py:17