Proto  3.2
Proto_CompositeOp.H
Go to the documentation of this file.
1 #pragma once
2 #ifndef _PROTO_COMPOSITE_OP_
3 #define _PROTO_COMPOSITE_OP_
4 
5 #include "Proto.H"
6 
7 namespace Proto
8 {
9  template<typename T, std::size_t... I>
10  auto tupleFromVector(const std::vector<T>& v, std::index_sequence<I...>) {
11  return std::make_tuple(v[I]...);
12  }
13 
14  template<typename T, std::size_t N>
15  auto tupleFromVector(const std::vector<T>& v) {
16  PROTO_ASSERT(v.size() < N,
17  "Vector size %u is smaller than expected size %u", v.size(), N);
18  return tupleFromVector<T>(v, std::make_index_sequence<N>{});
19  }
20  template<unsigned int NDOMAINS>
22  {
23  public:
24 
25  inline virtual std::array<Box, NDOMAINS> domains(const Box &rangeBox) const = 0;
26 
27  inline virtual Box range(const std::array<Box, NDOMAINS> &domainBoxes) const = 0;
28 
29  template<typename... Args>
30  inline Box getRange(Box first, Args... boxes)
31  {
32  static_assert((std::is_same_v<Box, Args>&& ...), "All arguments must be of type Box");
33  std::vector<Box> domains;
34  domains.push_back(first);
35  (domains.push_back(boxes), ...);
36  PROTO_ASSERT(domains.size() == NDOMAINS,
37  "Incorrect number of domains (%u should be %u)", domains.size(), NDOMAINS);
38  std::array<Box, NDOMAINS> domainArray;
39  std::copy_n(domains.begin(), NDOMAINS, domainArray.begin());
40  return range(domainArray);
41  }
42  inline Box domainUnion(const Box& rangeBox) const
43  {
44  Box unionBox;
45  for (auto B : domains(rangeBox))
46  {
47  unionBox += B;
48  }
49  return unionBox;
50  }
51  inline Point ghost()
52  {
53  Box B(Point::Zeros());
54  auto doms = domains(B);
55  for (auto di : doms)
56  {
57  B += di;
58  }
59  Point H = B.high();
60  Point L = B.low();
61  Point g;
62  for (int ii = 0; ii < DIM; ii++)
63  {
64  g[ii] = max(abs(H[ii]), abs(L[ii]));
65  }
66  return g;
67  }
68 
69  protected:
70 
71  template<typename... Srcs>
72  inline std::array<Box, NDOMAINS> getDomains(Srcs&... sources)
73  {
74  std::vector<Box> domains;
75  (domains.push_back(sources.box()), ...); //C++17 fold expression
76  PROTO_ASSERT(domains.size() == NDOMAINS,
77  "incorrect number of arguments (detected %u, should be %u)",
78  domains.size(), NDOMAINS);
79  std::array<Box, NDOMAINS> domainArray;
80  std::copy_n(domains.begin(), NDOMAINS, domainArray.begin());
81  return domainArray;
82  }
83  };
84 }
85 #include "operators/Proto_ConvolveOp.H"
86 #include "operators/Proto_DeconvolveOp.H"
87 #include "operators/Proto_ConvolveFaceOp.H"
88 #include "operators/Proto_DeconvolveFaceOp.H"
89 #include "operators/Proto_ConvolveEdgeOp.H"
90 #include "operators/Proto_DeconvolveEdgeOp.H"
91 
92 #include "operators/Proto_FaceAverageDiffOp.H"
93 #include "operators/Proto_ProductOrQuotientAverageOp.H"
94 #include "operators/Proto_ProductAverageOp.H"
95 #include "operators/Proto_CellAverageProductOp.H"
96 #include "operators/Proto_FaceAverageProductOp.H"
97 #include "operators/Proto_EdgeAverageProductOp.H"
98 #include "operators/Proto_QuotientAverageOp.H"
99 #include "operators/Proto_CellAverageQuotientOp.H"
100 #include "operators/Proto_FaceAverageQuotientOp.H"
101 
102 #include "operators/Proto_MatrixProductOp.H"
103 #include "operators/Proto_FaceAverageMatrixProductOp.H"
104 #include "operators/Proto_CellAverageMatrixProductOp.H"
105 #include "operators/Proto_FaceAverageTensorQuotientOp.H"
106 
107 #include "operators/Proto_CrossProductOp.H"
108 #include "operators/Proto_EdgeAverageCrossProductOp.H"
109 
110 #include "operators/Proto_FaceAverageSurfaceTransformOp.H"
111 #include "operators/Proto_FaceAverageAdjugateMatrixOp.H"
112 #include "operators/Proto_MappedFaceAverageDiffOp.H"
113 #endif
ACCEL_DECORATION Point high() const
Access High Corner.
Definition: Proto_Box.H:174
Point ghost()
Definition: Proto_CompositeOp.H:51
std::array< Box, NDOMAINS > getDomains(Srcs &... sources)
Definition: Proto_CompositeOp.H:72
virtual Box range(const std::array< Box, NDOMAINS > &domainBoxes) const =0
Box domainUnion(const Box &rangeBox) const
Definition: Proto_CompositeOp.H:42
virtual std::array< Box, NDOMAINS > domains(const Box &rangeBox) const =0
An interval in DIM dimensional space.
Definition: Proto_Box.H:29
ACCEL_DECORATION Point low() const
Access Low Corner.
Definition: Proto_Box.H:167
#define PROTO_ASSERT(stmt, args...)
Definition: Proto_PAssert.H:48
static ACCEL_DECORATION Point Zeros()
Get Zeros.
Definition: Proto_Array.H:17
auto tupleFromVector(const std::vector< T > &v, std::index_sequence< I... >)
Definition: Proto_CompositeOp.H:10
Integer Valued Vector.
Definition: Proto_Point.H:24
Definition: Proto_CompositeOp.H:21
Box getRange(Box first, Args... boxes)
Definition: Proto_CompositeOp.H:30