Skip to content

Commit 2b25da5

Browse files
committed
[Reactor] Use std::span to access surfaceProductionRates
1 parent c0bc491 commit 2b25da5

File tree

6 files changed

+99
-8
lines changed

6 files changed

+99
-8
lines changed

include/cantera/base/ct_defs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <algorithm>
2828
#include <memory>
2929
#include <functional>
30+
#include <span>
3031

3132
/**
3233
* Namespace for the Cantera kernel.
@@ -45,6 +46,7 @@ using std::map;
4546
using std::set;
4647
using std::function;
4748
using std::pair;
49+
using std::span;
4850

4951
/**
5052
* @defgroup physConstants Physical Constants

include/cantera/zeroD/ReactorBase.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ class ReactorBase : public std::enable_shared_from_this<ReactorBase>
227227
//! For surfaces, this contains the production rates [kmol/m²/s] of species on the
228228
//! surface and all adjacent phases, in the order defined by the InterfaceKinetics
229229
//! object.
230-
const vector<double>& surfaceProductionRates() const {
230+
span<const double> surfaceProductionRates() const {
231231
return m_sdot;
232232
}
233233

include/cantera/zeroD/ReactorDelegator.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class ReactorAccessor
4646
virtual void setHeatRate(double q) = 0;
4747

4848
//! @copydoc ReactorBase::surfaceProductionRates
49-
virtual vector<double>& surfaceProductionRates() = 0;
49+
virtual span<double> surfaceProductionRates() = 0;
5050
};
5151

5252
//! Delegate methods of the Reactor class to external functions
@@ -167,7 +167,7 @@ class ReactorDelegator : public Delegator, public R, public ReactorAccessor
167167
}
168168
}
169169

170-
vector<double>& surfaceProductionRates() override {
170+
span<double> surfaceProductionRates() override {
171171
return R::m_sdot;
172172
}
173173

interfaces/cython/cantera/ctcxx.pxd

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,95 @@ ctypedef stdmap[string,double] Composition
2121
import numpy as np
2222
cimport numpy as np
2323

24+
from libcpp.vector cimport vector
25+
26+
# See https://github.com/cython/cython/pull/6539
27+
# TODO: Replace once Cython >= 3.1.0 is required
28+
cdef extern from "<span>" namespace "std" nogil:
29+
# Only Extent = std::dynamic_extent is supported until Cython can also
30+
# support integer templates. See https://github.com/cython/cython/pull/426
31+
cdef cppclass span[T]:
32+
ctypedef T value_type
33+
ctypedef size_t size_type
34+
ctypedef ptrdiff_t difference_type
35+
36+
size_t extent
37+
38+
cppclass iterator:
39+
iterator() except +
40+
iterator(iterator&) except +
41+
T& operator*()
42+
iterator operator++()
43+
iterator operator--()
44+
iterator operator++(int)
45+
iterator operator--(int)
46+
iterator operator+(size_type)
47+
iterator operator-(size_type)
48+
difference_type operator-(iterator)
49+
difference_type operator-(const_iterator)
50+
bint operator==(iterator)
51+
bint operator==(const_iterator)
52+
bint operator!=(iterator)
53+
bint operator!=(const_iterator)
54+
bint operator<(iterator)
55+
bint operator<(const_iterator)
56+
bint operator>(iterator)
57+
bint operator>(const_iterator)
58+
bint operator<=(iterator)
59+
bint operator<=(const_iterator)
60+
bint operator>=(iterator)
61+
bint operator>=(const_iterator)
62+
63+
cppclass reverse_iterator:
64+
reverse_iterator() except +
65+
reverse_iterator(reverse_iterator&) except +
66+
T& operator*()
67+
reverse_iterator operator++()
68+
reverse_iterator operator--()
69+
reverse_iterator operator++(int)
70+
reverse_iterator operator--(int)
71+
reverse_iterator operator+(size_type)
72+
reverse_iterator operator-(size_type)
73+
difference_type operator-(iterator)
74+
difference_type operator-(const_iterator)
75+
bint operator==(reverse_iterator)
76+
bint operator==(const_reverse_iterator)
77+
bint operator!=(reverse_iterator)
78+
bint operator!=(const_reverse_iterator)
79+
bint operator<(reverse_iterator)
80+
bint operator<(const_reverse_iterator)
81+
bint operator>(reverse_iterator)
82+
bint operator>(const_reverse_iterator)
83+
bint operator<=(reverse_iterator)
84+
bint operator<=(const_reverse_iterator)
85+
bint operator>=(reverse_iterator)
86+
bint operator>=(const_reverse_iterator)
87+
88+
span()
89+
span(T*, size_type) except + # span[It](It, size_type)
90+
span(T*, T*) except + # span[It, End](It, End)
91+
span(vector&) # span[U, N](array[T, N]& arr)
92+
span(span&)
93+
94+
T& operator[](ssize_t)
95+
96+
T& back()
97+
iterator begin()
98+
T* data()
99+
bint empty()
100+
iterator end()
101+
span[T] first(size_type)
102+
T& front()
103+
span[T] last(size_type)
104+
reverse_iterator rbegin()
105+
reverse_iterator rend()
106+
size_type size()
107+
span[T] subspan(size_type)
108+
span[T] subspan(size_type, size_type)
109+
110+
cdef size_t dynamic_extent
111+
112+
24113
cdef extern from "cantera/cython/funcWrapper.h":
25114
cdef int translate_exception()
26115

interfaces/cython/cantera/reactor.pxd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ cdef extern from "cantera/zeroD/ReactorDelegator.h" namespace "Cantera":
216216
void setExpansionRate(double)
217217
double heatRate()
218218
void setHeatRate(double)
219-
vector[double]& surfaceProductionRates()
219+
span[double] surfaceProductionRates()
220220

221221

222222
ctypedef CxxReactorAccessor* CxxReactorAccessorPtr

interfaces/cython/cantera/reactor.pyx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,8 @@ cdef class ExtensibleReactor(Reactor):
567567

568568
def __cinit__(self, *args, **kwargs):
569569
self.accessor = dynamic_cast[CxxReactorAccessorPtr](self.rbase)
570-
cdef vector[double]* sdot = \
571-
&dynamic_cast[CxxReactorAccessorPtr](self.rbase).surfaceProductionRates()
570+
cdef span[double] sdot = \
571+
dynamic_cast[CxxReactorAccessorPtr](self.rbase).surfaceProductionRates()
572572
self.surface_production_rates = <double[:sdot.size()]> sdot.data()
573573

574574
def __init__(self, *args, **kwargs):
@@ -928,8 +928,8 @@ cdef class ExtensibleReactorSurface(ReactorSurface):
928928

929929
def __init__(self, *args, **kwargs):
930930
assign_delegates(self, dynamic_cast[CxxDelegatorPtr](self.rbase))
931-
cdef vector[double]* sdot = \
932-
&dynamic_cast[CxxReactorAccessorPtr](self.rbase).surfaceProductionRates()
931+
cdef span[double] sdot = \
932+
dynamic_cast[CxxReactorAccessorPtr](self.rbase).surfaceProductionRates()
933933
self.surface_production_rates = <double[:sdot.size()]> sdot.data()
934934
super().__init__(*args, **kwargs)
935935

0 commit comments

Comments
 (0)