37 std::vector<std::shared_ptr<
Rate<T>>> rate, std::shared_ptr<REACTIONS> reactions,
39 : _x0(x0), _x1(x1), _y0(y0), _y1(y1), _z0(z0), _z1(z1),
40 _rate(rate), _reactions(reactions), _partners(partners)
42 std::size_t iReaction = 0;
43 _sizes = std::vector<std::size_t>(std::tuple_size_v<REACTIONS>);
45 using line_type = typename std::remove_reference_t<decltype(line)>;
46 _sizes[iReaction++] = std::tuple_size_v<line_type>;
48 if (std::accumulate(_sizes.begin(), _sizes.end(), std::size_t(0)) != partners.size()) {
49 throw std::invalid_argument(
"The number of species must equate the number of input lattices.");
69 f(elem, vect[std::accumulate(_sizes.begin(), _sizes.begin()+iReaction, 0) + (iReagent++)]);
83 int x0,
int x1,
int y0,
int y1,
int z0,
int z1 )
85 int newX0, newX1, newY0, newY1, newZ0, newZ1;
86 if ( util::intersect ( _x0, _x1, _y0, _y1, _z0, _z1,
87 x0, x1, y0, y1, z0, z1,
88 newX0, newX1, newY0, newY1, newZ0, newZ1 ) ) {
90 for (
int iX=newX0-1; iX<=newX1+1; ++iX) {
91 for (
int iY=newY0-1; iY<=newY1+1; ++iY) {
92 for (
int iZ=newZ0-1; iZ<=newZ1+1; ++iZ) {
95 std::vector<T> fields_asSingleVector;
96 functOverReactions(_partners, [&](
auto& elem,
auto& component){
97 fields_asSingleVector.push_back( elem.getField(component, iX, iY, iZ) );
98 elem.resetSource(component, iX, iY, iZ);
102 std::size_t iPartner = 0;
103 std::vector<std::tuple<T,BlockStructureD<3>*>> ratePartner;
104 for (std::size_t iReaction=0; iReaction<_sizes.size(); ++iReaction) {
105 auto reagents_begin = fields_asSingleVector.begin() + std::accumulate(_sizes.begin(), _sizes.begin()+iReaction, 0);
106 std::vector<T> reagents = { reagents_begin, reagents_begin + _sizes[iReaction] };
107 T rate_thisReaction = _rate[iReaction]->compute(reagents);
108 for (std::size_t iReagent=0; iReagent<_sizes[iReaction]; ++iReagent) {
109 ratePartner.push_back(std::make_tuple(rate_thisReaction, _partners[iPartner++]));
114 functOverReactions(ratePartner, [&](
auto& elem,
auto& component){
115 elem.incrementSource(std::get<1>(component), std::get<0>(component) * elem.getStoichioCoeff(), iX, iY, iZ);
128 std::vector<std::shared_ptr<
Rate<T>>> rate, REACTIONS&& reactions)
130 _rate(rate), _reactions(std::make_shared<REACTIONS>(reactions))
ReactionGenerator3D(int x0_, int x1_, int y0_, int y1_, int z0_, int z1_, std::vector< std::shared_ptr< Rate< T > > > rate, REACTIONS &&reactions)
ReactionPostProcessor3D(int x0, int x1, int y0, int y1, int z0, int z1, std::vector< std::shared_ptr< Rate< T > > > rate, std::shared_ptr< REACTIONS > reactions, std::vector< BlockStructureD< 3 > * > partners)