@@ -47,112 +47,39 @@ class CmpExpression : public Expression<CmpExpression<ELeft,ERight>> {
4747 }
4848 }
4949
50+ template <typename ... Args>
5051 KOKKOS_INLINE_FUNCTION
51- Real eval ( int i ) const {
52+ Real eval (Args... args ) const {
5253 if constexpr (scalar_left) {
5354 switch (m_cmp) {
54- case Comparison::EQ: return m_left == m_right.eval (i );
55- case Comparison::NE: return m_left != m_right.eval (i );
56- case Comparison::GT: return m_left > m_right.eval (i );
57- case Comparison::GE: return m_left >= m_right.eval (i );
58- case Comparison::LT: return m_left < m_right.eval (i );
59- case Comparison::LE: return m_left <= m_right.eval (i );
55+ case Comparison::EQ: return m_left == m_right.eval (args... );
56+ case Comparison::NE: return m_left != m_right.eval (args... );
57+ case Comparison::GT: return m_left > m_right.eval (args... );
58+ case Comparison::GE: return m_left >= m_right.eval (args... );
59+ case Comparison::LT: return m_left < m_right.eval (args... );
60+ case Comparison::LE: return m_left <= m_right.eval (args... );
6061 default :
6162 EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
6263 }
6364 } else if constexpr (scalar_right) {
6465 switch (m_cmp) {
65- case Comparison::EQ: return m_left.eval (i ) == m_right;
66- case Comparison::NE: return m_left.eval (i ) != m_right;
67- case Comparison::GT: return m_left.eval (i ) > m_right;
68- case Comparison::GE: return m_left.eval (i ) >= m_right;
69- case Comparison::LT: return m_left.eval (i ) < m_right;
70- case Comparison::LE: return m_left.eval (i ) <= m_right;
66+ case Comparison::EQ: return m_left.eval (args... ) == m_right;
67+ case Comparison::NE: return m_left.eval (args... ) != m_right;
68+ case Comparison::GT: return m_left.eval (args... ) > m_right;
69+ case Comparison::GE: return m_left.eval (args... ) >= m_right;
70+ case Comparison::LT: return m_left.eval (args... ) < m_right;
71+ case Comparison::LE: return m_left.eval (args... ) <= m_right;
7172 default :
7273 EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
7374 }
7475 } else {
7576 switch (m_cmp) {
76- case Comparison::EQ: return m_left.eval (i) == m_right.eval (i);
77- case Comparison::NE: return m_left.eval (i) != m_right.eval (i);
78- case Comparison::GT: return m_left.eval (i) > m_right.eval (i);
79- case Comparison::GE: return m_left.eval (i) >= m_right.eval (i);
80- case Comparison::LT: return m_left.eval (i) < m_right.eval (i);
81- case Comparison::LE: return m_left.eval (i) <= m_right.eval (i);
82- default :
83- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
84- }
85- }
86- }
87- KOKKOS_INLINE_FUNCTION
88- Real eval (int i,int j) const {
89- if constexpr (scalar_left) {
90- switch (m_cmp) {
91- case Comparison::EQ: return m_left == m_right.eval (i,j);
92- case Comparison::NE: return m_left != m_right.eval (i,j);
93- case Comparison::GT: return m_left > m_right.eval (i,j);
94- case Comparison::GE: return m_left >= m_right.eval (i,j);
95- case Comparison::LT: return m_left < m_right.eval (i,j);
96- case Comparison::LE: return m_left <= m_right.eval (i,j);
97- default :
98- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
99- }
100- } else if constexpr (scalar_right) {
101- switch (m_cmp) {
102- case Comparison::EQ: return m_left.eval (i,j) == m_right;
103- case Comparison::NE: return m_left.eval (i,j) != m_right;
104- case Comparison::GT: return m_left.eval (i,j) > m_right;
105- case Comparison::GE: return m_left.eval (i,j) >= m_right;
106- case Comparison::LT: return m_left.eval (i,j) < m_right;
107- case Comparison::LE: return m_left.eval (i,j) <= m_right;
108- default :
109- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
110- }
111- } else {
112- switch (m_cmp) {
113- case Comparison::EQ: return m_left.eval (i,j) == m_right.eval (i,j);
114- case Comparison::NE: return m_left.eval (i,j) != m_right.eval (i,j);
115- case Comparison::GT: return m_left.eval (i,j) > m_right.eval (i,j);
116- case Comparison::GE: return m_left.eval (i,j) >= m_right.eval (i,j);
117- case Comparison::LT: return m_left.eval (i,j) < m_right.eval (i,j);
118- case Comparison::LE: return m_left.eval (i,j) <= m_right.eval (i,j);
119- default :
120- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
121- }
122- }
123- }
124- KOKKOS_INLINE_FUNCTION
125- Real eval (int i, int j, int k) const {
126- if constexpr (scalar_left) {
127- switch (m_cmp) {
128- case Comparison::EQ: return m_left == m_right.eval (i,j,k);
129- case Comparison::NE: return m_left != m_right.eval (i,j,k);
130- case Comparison::GT: return m_left > m_right.eval (i,j,k);
131- case Comparison::GE: return m_left >= m_right.eval (i,j,k);
132- case Comparison::LT: return m_left < m_right.eval (i,j,k);
133- case Comparison::LE: return m_left <= m_right.eval (i,j,k);
134- default :
135- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
136- }
137- } else if constexpr (scalar_right) {
138- switch (m_cmp) {
139- case Comparison::EQ: return m_left.eval (i,j,k) == m_right;
140- case Comparison::NE: return m_left.eval (i,j,k) != m_right;
141- case Comparison::GT: return m_left.eval (i,j,k) > m_right;
142- case Comparison::GE: return m_left.eval (i,j,k) >= m_right;
143- case Comparison::LT: return m_left.eval (i,j,k) < m_right;
144- case Comparison::LE: return m_left.eval (i,j,k) <= m_right;
145- default :
146- EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
147- }
148- } else {
149- switch (m_cmp) {
150- case Comparison::EQ: return m_left.eval (i,j,k) == m_right.eval (i,j,k);
151- case Comparison::NE: return m_left.eval (i,j,k) != m_right.eval (i,j,k);
152- case Comparison::GT: return m_left.eval (i,j,k) > m_right.eval (i,j,k);
153- case Comparison::GE: return m_left.eval (i,j,k) >= m_right.eval (i,j,k);
154- case Comparison::LT: return m_left.eval (i,j,k) < m_right.eval (i,j,k);
155- case Comparison::LE: return m_left.eval (i,j,k) <= m_right.eval (i,j,k);
77+ case Comparison::EQ: return m_left.eval (args...) == m_right.eval (args...);
78+ case Comparison::NE: return m_left.eval (args...) != m_right.eval (args...);
79+ case Comparison::GT: return m_left.eval (args...) > m_right.eval (args...);
80+ case Comparison::GE: return m_left.eval (args...) >= m_right.eval (args...);
81+ case Comparison::LT: return m_left.eval (args...) < m_right.eval (args...);
82+ case Comparison::LE: return m_left.eval (args...) <= m_right.eval (args...);
15683 default :
15784 EKAT_KERNEL_ERROR_MSG (" Internal error! Unsupported cmp operator.\n " );
15885 }
0 commit comments