1 
2 
3 // DO NOT EDIT !
4 // This file is generated using the MantaFlow preprocessor (prep generate).
5 
6 // ----------------------------------------------------------------------------
7 //
8 // MantaFlow fluid solver framework
9 // Copyright 2016-2017 Kiwon Um, Nils Thuerey
10 //
11 // This program is free software, distributed under the terms of the
12 // Apache License, Version 2.0
13 // http://www.apache.org/licenses/LICENSE-2.0
14 //
15 // Affine Particle-In-Cell
16 //
17 // ----------------------------------------------------------------------------
18 
19 #include "particle.h"
20 #include "grid.h"
21 
22 namespace Manta {
23 
24 struct knApicMapLinearVec3ToMACGrid : public KernelBase {
knApicMapLinearVec3ToMACGridManta::knApicMapLinearVec3ToMACGrid25   knApicMapLinearVec3ToMACGrid(const BasicParticleSystem &p,
26                                MACGrid &mg,
27                                MACGrid &vg,
28                                const ParticleDataImpl<Vec3> &vp,
29                                const ParticleDataImpl<Vec3> &cpx,
30                                const ParticleDataImpl<Vec3> &cpy,
31                                const ParticleDataImpl<Vec3> &cpz,
32                                const ParticleDataImpl<int> *ptype,
33                                const int exclude)
34       : KernelBase(p.size()),
35         p(p),
36         mg(mg),
37         vg(vg),
38         vp(vp),
39         cpx(cpx),
40         cpy(cpy),
41         cpz(cpz),
42         ptype(ptype),
43         exclude(exclude)
44   {
45     runMessage();
46     run();
47   }
opManta::knApicMapLinearVec3ToMACGrid48   inline void op(IndexInt idx,
49                  const BasicParticleSystem &p,
50                  MACGrid &mg,
51                  MACGrid &vg,
52                  const ParticleDataImpl<Vec3> &vp,
53                  const ParticleDataImpl<Vec3> &cpx,
54                  const ParticleDataImpl<Vec3> &cpy,
55                  const ParticleDataImpl<Vec3> &cpz,
56                  const ParticleDataImpl<int> *ptype,
57                  const int exclude)
58   {
59     if (!p.isActive(idx) || (ptype && ((*ptype)[idx] & exclude)))
60       return;
61     const IndexInt dX[2] = {0, vg.getStrideX()};
62     const IndexInt dY[2] = {0, vg.getStrideY()};
63     const IndexInt dZ[2] = {0, vg.getStrideZ()};
64 
65     const Vec3 &pos = p[idx].pos, &vel = vp[idx];
66     const IndexInt fi = static_cast<IndexInt>(pos.x), fj = static_cast<IndexInt>(pos.y),
67                    fk = static_cast<IndexInt>(pos.z);
68     const IndexInt ci = static_cast<IndexInt>(pos.x - 0.5),
69                    cj = static_cast<IndexInt>(pos.y - 0.5),
70                    ck = static_cast<IndexInt>(pos.z - 0.5);
71     const Real wfi = clamp(pos.x - fi, Real(0), Real(1)),
72                wfj = clamp(pos.y - fj, Real(0), Real(1)),
73                wfk = clamp(pos.z - fk, Real(0), Real(1));
74     const Real wci = clamp(Real(pos.x - ci - 0.5), Real(0), Real(1)),
75                wcj = clamp(Real(pos.y - cj - 0.5), Real(0), Real(1)),
76                wck = clamp(Real(pos.z - ck - 0.5), Real(0), Real(1));
77     // TODO: check index for safety
78     {  // u-face
79       const IndexInt gidx = fi * dX[1] + cj * dY[1] + ck * dZ[1];
80       const Vec3 gpos(fi, cj + 0.5, ck + 0.5);
81       const Real wi[2] = {Real(1) - wfi, wfi};
82       const Real wj[2] = {Real(1) - wcj, wcj};
83       const Real wk[2] = {Real(1) - wck, wck};
84       for (int i = 0; i < 2; ++i)
85         for (int j = 0; j < 2; ++j)
86           for (int k = 0; k < 2; ++k) {
87             const Real w = wi[i] * wj[j] * wk[k];
88             mg[gidx + dX[i] + dY[j] + dZ[k]].x += w;
89             vg[gidx + dX[i] + dY[j] + dZ[k]].x += w * vel.x;
90             vg[gidx + dX[i] + dY[j] + dZ[k]].x += w * dot(cpx[idx], gpos + Vec3(i, j, k) - pos);
91           }
92     }
93     {  // v-face
94       const IndexInt gidx = ci * dX[1] + fj * dY[1] + ck * dZ[1];
95       const Vec3 gpos(ci + 0.5, fj, ck + 0.5);
96       const Real wi[2] = {Real(1) - wci, wci};
97       const Real wj[2] = {Real(1) - wfj, wfj};
98       const Real wk[2] = {Real(1) - wck, wck};
99       for (int i = 0; i < 2; ++i)
100         for (int j = 0; j < 2; ++j)
101           for (int k = 0; k < 2; ++k) {
102             const Real w = wi[i] * wj[j] * wk[k];
103             mg[gidx + dX[i] + dY[j] + dZ[k]].y += w;
104             vg[gidx + dX[i] + dY[j] + dZ[k]].y += w * vel.y;
105             vg[gidx + dX[i] + dY[j] + dZ[k]].y += w * dot(cpy[idx], gpos + Vec3(i, j, k) - pos);
106           }
107     }
108     if (!vg.is3D())
109       return;
110     {  // w-face
111       const IndexInt gidx = ci * dX[1] + cj * dY[1] + fk * dZ[1];
112       const Vec3 gpos(ci + 0.5, cj + 0.5, fk);
113       const Real wi[2] = {Real(1) - wci, wci};
114       const Real wj[2] = {Real(1) - wcj, wcj};
115       const Real wk[2] = {Real(1) - wfk, wfk};
116       for (int i = 0; i < 2; ++i)
117         for (int j = 0; j < 2; ++j)
118           for (int k = 0; k < 2; ++k) {
119             const Real w = wi[i] * wj[j] * wk[k];
120             mg[gidx + dX[i] + dY[j] + dZ[k]].z += w;
121             vg[gidx + dX[i] + dY[j] + dZ[k]].z += w * vel.z;
122             vg[gidx + dX[i] + dY[j] + dZ[k]].z += w * dot(cpz[idx], gpos + Vec3(i, j, k) - pos);
123           }
124     }
125   }
getArg0Manta::knApicMapLinearVec3ToMACGrid126   inline const BasicParticleSystem &getArg0()
127   {
128     return p;
129   }
130   typedef BasicParticleSystem type0;
getArg1Manta::knApicMapLinearVec3ToMACGrid131   inline MACGrid &getArg1()
132   {
133     return mg;
134   }
135   typedef MACGrid type1;
getArg2Manta::knApicMapLinearVec3ToMACGrid136   inline MACGrid &getArg2()
137   {
138     return vg;
139   }
140   typedef MACGrid type2;
getArg3Manta::knApicMapLinearVec3ToMACGrid141   inline const ParticleDataImpl<Vec3> &getArg3()
142   {
143     return vp;
144   }
145   typedef ParticleDataImpl<Vec3> type3;
getArg4Manta::knApicMapLinearVec3ToMACGrid146   inline const ParticleDataImpl<Vec3> &getArg4()
147   {
148     return cpx;
149   }
150   typedef ParticleDataImpl<Vec3> type4;
getArg5Manta::knApicMapLinearVec3ToMACGrid151   inline const ParticleDataImpl<Vec3> &getArg5()
152   {
153     return cpy;
154   }
155   typedef ParticleDataImpl<Vec3> type5;
getArg6Manta::knApicMapLinearVec3ToMACGrid156   inline const ParticleDataImpl<Vec3> &getArg6()
157   {
158     return cpz;
159   }
160   typedef ParticleDataImpl<Vec3> type6;
getArg7Manta::knApicMapLinearVec3ToMACGrid161   inline const ParticleDataImpl<int> *getArg7()
162   {
163     return ptype;
164   }
165   typedef ParticleDataImpl<int> type7;
getArg8Manta::knApicMapLinearVec3ToMACGrid166   inline const int &getArg8()
167   {
168     return exclude;
169   }
170   typedef int type8;
runMessageManta::knApicMapLinearVec3ToMACGrid171   void runMessage()
172   {
173     debMsg("Executing kernel knApicMapLinearVec3ToMACGrid ", 3);
174     debMsg("Kernel range"
175                << " size " << size << " ",
176            4);
177   };
runManta::knApicMapLinearVec3ToMACGrid178   void run()
179   {
180     const IndexInt _sz = size;
181     for (IndexInt i = 0; i < _sz; i++)
182       op(i, p, mg, vg, vp, cpx, cpy, cpz, ptype, exclude);
183   }
184   const BasicParticleSystem &p;
185   MACGrid &mg;
186   MACGrid &vg;
187   const ParticleDataImpl<Vec3> &vp;
188   const ParticleDataImpl<Vec3> &cpx;
189   const ParticleDataImpl<Vec3> &cpy;
190   const ParticleDataImpl<Vec3> &cpz;
191   const ParticleDataImpl<int> *ptype;
192   const int exclude;
193 };
194 
apicMapPartsToMAC(const FlagGrid & flags,MACGrid & vel,const BasicParticleSystem & parts,const ParticleDataImpl<Vec3> & partVel,const ParticleDataImpl<Vec3> & cpx,const ParticleDataImpl<Vec3> & cpy,const ParticleDataImpl<Vec3> & cpz,MACGrid * mass=NULL,const ParticleDataImpl<int> * ptype=NULL,const int exclude=0)195 void apicMapPartsToMAC(const FlagGrid &flags,
196                        MACGrid &vel,
197                        const BasicParticleSystem &parts,
198                        const ParticleDataImpl<Vec3> &partVel,
199                        const ParticleDataImpl<Vec3> &cpx,
200                        const ParticleDataImpl<Vec3> &cpy,
201                        const ParticleDataImpl<Vec3> &cpz,
202                        MACGrid *mass = NULL,
203                        const ParticleDataImpl<int> *ptype = NULL,
204                        const int exclude = 0)
205 {
206   // affine map
207   // let's assume that the particle mass is constant, 1.0
208   const bool freeMass = !mass;
209   if (!mass)
210     mass = new MACGrid(flags.getParent());
211   else
212     mass->clear();
213 
214   vel.clear();
215   knApicMapLinearVec3ToMACGrid(parts, *mass, vel, partVel, cpx, cpy, cpz, ptype, exclude);
216   mass->stomp(VECTOR_EPSILON);
217   vel.safeDivide(*mass);
218 
219   if (freeMass)
220     delete mass;
221 }
_W_0(PyObject * _self,PyObject * _linargs,PyObject * _kwds)222 static PyObject *_W_0(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
223 {
224   try {
225     PbArgs _args(_linargs, _kwds);
226     FluidSolver *parent = _args.obtainParent();
227     bool noTiming = _args.getOpt<bool>("notiming", -1, 0);
228     pbPreparePlugin(parent, "apicMapPartsToMAC", !noTiming);
229     PyObject *_retval = 0;
230     {
231       ArgLocker _lock;
232       const FlagGrid &flags = *_args.getPtr<FlagGrid>("flags", 0, &_lock);
233       MACGrid &vel = *_args.getPtr<MACGrid>("vel", 1, &_lock);
234       const BasicParticleSystem &parts = *_args.getPtr<BasicParticleSystem>("parts", 2, &_lock);
235       const ParticleDataImpl<Vec3> &partVel = *_args.getPtr<ParticleDataImpl<Vec3>>(
236           "partVel", 3, &_lock);
237       const ParticleDataImpl<Vec3> &cpx = *_args.getPtr<ParticleDataImpl<Vec3>>("cpx", 4, &_lock);
238       const ParticleDataImpl<Vec3> &cpy = *_args.getPtr<ParticleDataImpl<Vec3>>("cpy", 5, &_lock);
239       const ParticleDataImpl<Vec3> &cpz = *_args.getPtr<ParticleDataImpl<Vec3>>("cpz", 6, &_lock);
240       MACGrid *mass = _args.getPtrOpt<MACGrid>("mass", 7, NULL, &_lock);
241       const ParticleDataImpl<int> *ptype = _args.getPtrOpt<ParticleDataImpl<int>>(
242           "ptype", 8, NULL, &_lock);
243       const int exclude = _args.getOpt<int>("exclude", 9, 0, &_lock);
244       _retval = getPyNone();
245       apicMapPartsToMAC(flags, vel, parts, partVel, cpx, cpy, cpz, mass, ptype, exclude);
246       _args.check();
247     }
248     pbFinalizePlugin(parent, "apicMapPartsToMAC", !noTiming);
249     return _retval;
250   }
251   catch (std::exception &e) {
252     pbSetError("apicMapPartsToMAC", e.what());
253     return 0;
254   }
255 }
256 static const Pb::Register _RP_apicMapPartsToMAC("", "apicMapPartsToMAC", _W_0);
257 extern "C" {
PbRegister_apicMapPartsToMAC()258 void PbRegister_apicMapPartsToMAC()
259 {
260   KEEP_UNUSED(_RP_apicMapPartsToMAC);
261 }
262 }
263 
264 struct knApicMapLinearMACGridToVec3 : public KernelBase {
knApicMapLinearMACGridToVec3Manta::knApicMapLinearMACGridToVec3265   knApicMapLinearMACGridToVec3(ParticleDataImpl<Vec3> &vp,
266                                ParticleDataImpl<Vec3> &cpx,
267                                ParticleDataImpl<Vec3> &cpy,
268                                ParticleDataImpl<Vec3> &cpz,
269                                const BasicParticleSystem &p,
270                                const MACGrid &vg,
271                                const FlagGrid &flags,
272                                const ParticleDataImpl<int> *ptype,
273                                const int exclude)
274       : KernelBase(vp.size()),
275         vp(vp),
276         cpx(cpx),
277         cpy(cpy),
278         cpz(cpz),
279         p(p),
280         vg(vg),
281         flags(flags),
282         ptype(ptype),
283         exclude(exclude)
284   {
285     runMessage();
286     run();
287   }
opManta::knApicMapLinearMACGridToVec3288   inline void op(IndexInt idx,
289                  ParticleDataImpl<Vec3> &vp,
290                  ParticleDataImpl<Vec3> &cpx,
291                  ParticleDataImpl<Vec3> &cpy,
292                  ParticleDataImpl<Vec3> &cpz,
293                  const BasicParticleSystem &p,
294                  const MACGrid &vg,
295                  const FlagGrid &flags,
296                  const ParticleDataImpl<int> *ptype,
297                  const int exclude) const
298   {
299     if (!p.isActive(idx) || (ptype && ((*ptype)[idx] & exclude)))
300       return;
301 
302     vp[idx] = cpx[idx] = cpy[idx] = cpz[idx] = Vec3(Real(0));
303     const IndexInt dX[2] = {0, vg.getStrideX()}, dY[2] = {0, vg.getStrideY()},
304                    dZ[2] = {0, vg.getStrideZ()};
305     const Real gw[2] = {-Real(1), Real(1)};
306 
307     const Vec3 &pos = p[idx].pos;
308     const IndexInt fi = static_cast<IndexInt>(pos.x), fj = static_cast<IndexInt>(pos.y),
309                    fk = static_cast<IndexInt>(pos.z);
310     const IndexInt ci = static_cast<IndexInt>(pos.x - 0.5),
311                    cj = static_cast<IndexInt>(pos.y - 0.5),
312                    ck = static_cast<IndexInt>(pos.z - 0.5);
313     const Real wfi = clamp(pos.x - fi, Real(0), Real(1)),
314                wfj = clamp(pos.y - fj, Real(0), Real(1)),
315                wfk = clamp(pos.z - fk, Real(0), Real(1));
316     const Real wci = clamp(Real(pos.x - ci - 0.5), Real(0), Real(1)),
317                wcj = clamp(Real(pos.y - cj - 0.5), Real(0), Real(1)),
318                wck = clamp(Real(pos.z - ck - 0.5), Real(0), Real(1));
319     // TODO: check index for safety
320     {  // u
321       const IndexInt gidx = fi * dX[1] + cj * dY[1] + ck * dZ[1];
322       const Real wx[2] = {Real(1) - wfi, wfi};
323       const Real wy[2] = {Real(1) - wcj, wcj};
324       const Real wz[2] = {Real(1) - wck, wck};
325       for (int i = 0; i < 2; ++i)
326         for (int j = 0; j < 2; ++j)
327           for (int k = 0; k < 2; ++k) {
328             const IndexInt vidx = gidx + dX[i] + dY[j] + dZ[k];
329             Real vgx = vg[vidx].x;
330             vp[idx].x += wx[i] * wy[j] * wz[k] * vgx;
331             cpx[idx].x += gw[i] * wy[j] * wz[k] * vgx;
332             cpx[idx].y += wx[i] * gw[j] * wz[k] * vgx;
333             cpx[idx].z += wx[i] * wy[j] * gw[k] * vgx;
334           }
335     }
336     {  // v
337       const IndexInt gidx = ci * dX[1] + fj * dY[1] + ck * dZ[1];
338       const Real wx[2] = {Real(1) - wci, wci};
339       const Real wy[2] = {Real(1) - wfj, wfj};
340       const Real wz[2] = {Real(1) - wck, wck};
341       for (int i = 0; i < 2; ++i)
342         for (int j = 0; j < 2; ++j)
343           for (int k = 0; k < 2; ++k) {
344             const IndexInt vidx = gidx + dX[i] + dY[j] + dZ[k];
345             Real vgy = vg[vidx].y;
346             vp[idx].y += wx[i] * wy[j] * wz[k] * vgy;
347             cpy[idx].x += gw[i] * wy[j] * wz[k] * vgy;
348             cpy[idx].y += wx[i] * gw[j] * wz[k] * vgy;
349             cpy[idx].z += wx[i] * wy[j] * gw[k] * vgy;
350           }
351     }
352     if (!vg.is3D())
353       return;
354     {  // w
355       const IndexInt gidx = ci * dX[1] + cj * dY[1] + fk * dZ[1];
356       const Real wx[2] = {Real(1) - wci, wci};
357       const Real wy[2] = {Real(1) - wcj, wcj};
358       const Real wz[2] = {Real(1) - wfk, wfk};
359       for (int i = 0; i < 2; ++i)
360         for (int j = 0; j < 2; ++j)
361           for (int k = 0; k < 2; ++k) {
362             const IndexInt vidx = gidx + dX[i] + dY[j] + dZ[k];
363             Real vgz = vg[vidx].z;
364             vp[idx].z += wx[i] * wy[j] * wz[k] * vgz;
365             cpz[idx].x += gw[i] * wy[j] * wz[k] * vgz;
366             cpz[idx].y += wx[i] * gw[j] * wz[k] * vgz;
367             cpz[idx].z += wx[i] * wy[j] * gw[k] * vgz;
368           }
369     }
370   }
getArg0Manta::knApicMapLinearMACGridToVec3371   inline ParticleDataImpl<Vec3> &getArg0()
372   {
373     return vp;
374   }
375   typedef ParticleDataImpl<Vec3> type0;
getArg1Manta::knApicMapLinearMACGridToVec3376   inline ParticleDataImpl<Vec3> &getArg1()
377   {
378     return cpx;
379   }
380   typedef ParticleDataImpl<Vec3> type1;
getArg2Manta::knApicMapLinearMACGridToVec3381   inline ParticleDataImpl<Vec3> &getArg2()
382   {
383     return cpy;
384   }
385   typedef ParticleDataImpl<Vec3> type2;
getArg3Manta::knApicMapLinearMACGridToVec3386   inline ParticleDataImpl<Vec3> &getArg3()
387   {
388     return cpz;
389   }
390   typedef ParticleDataImpl<Vec3> type3;
getArg4Manta::knApicMapLinearMACGridToVec3391   inline const BasicParticleSystem &getArg4()
392   {
393     return p;
394   }
395   typedef BasicParticleSystem type4;
getArg5Manta::knApicMapLinearMACGridToVec3396   inline const MACGrid &getArg5()
397   {
398     return vg;
399   }
400   typedef MACGrid type5;
getArg6Manta::knApicMapLinearMACGridToVec3401   inline const FlagGrid &getArg6()
402   {
403     return flags;
404   }
405   typedef FlagGrid type6;
getArg7Manta::knApicMapLinearMACGridToVec3406   inline const ParticleDataImpl<int> *getArg7()
407   {
408     return ptype;
409   }
410   typedef ParticleDataImpl<int> type7;
getArg8Manta::knApicMapLinearMACGridToVec3411   inline const int &getArg8()
412   {
413     return exclude;
414   }
415   typedef int type8;
runMessageManta::knApicMapLinearMACGridToVec3416   void runMessage()
417   {
418     debMsg("Executing kernel knApicMapLinearMACGridToVec3 ", 3);
419     debMsg("Kernel range"
420                << " size " << size << " ",
421            4);
422   };
operator ()Manta::knApicMapLinearMACGridToVec3423   void operator()(const tbb::blocked_range<IndexInt> &__r) const
424   {
425     for (IndexInt idx = __r.begin(); idx != (IndexInt)__r.end(); idx++)
426       op(idx, vp, cpx, cpy, cpz, p, vg, flags, ptype, exclude);
427   }
runManta::knApicMapLinearMACGridToVec3428   void run()
429   {
430     tbb::parallel_for(tbb::blocked_range<IndexInt>(0, size), *this);
431   }
432   ParticleDataImpl<Vec3> &vp;
433   ParticleDataImpl<Vec3> &cpx;
434   ParticleDataImpl<Vec3> &cpy;
435   ParticleDataImpl<Vec3> &cpz;
436   const BasicParticleSystem &p;
437   const MACGrid &vg;
438   const FlagGrid &flags;
439   const ParticleDataImpl<int> *ptype;
440   const int exclude;
441 };
442 
apicMapMACGridToParts(ParticleDataImpl<Vec3> & partVel,ParticleDataImpl<Vec3> & cpx,ParticleDataImpl<Vec3> & cpy,ParticleDataImpl<Vec3> & cpz,const BasicParticleSystem & parts,const MACGrid & vel,const FlagGrid & flags,const ParticleDataImpl<int> * ptype=NULL,const int exclude=0)443 void apicMapMACGridToParts(ParticleDataImpl<Vec3> &partVel,
444                            ParticleDataImpl<Vec3> &cpx,
445                            ParticleDataImpl<Vec3> &cpy,
446                            ParticleDataImpl<Vec3> &cpz,
447                            const BasicParticleSystem &parts,
448                            const MACGrid &vel,
449                            const FlagGrid &flags,
450                            const ParticleDataImpl<int> *ptype = NULL,
451                            const int exclude = 0)
452 {
453   knApicMapLinearMACGridToVec3(partVel, cpx, cpy, cpz, parts, vel, flags, ptype, exclude);
454 }
_W_1(PyObject * _self,PyObject * _linargs,PyObject * _kwds)455 static PyObject *_W_1(PyObject *_self, PyObject *_linargs, PyObject *_kwds)
456 {
457   try {
458     PbArgs _args(_linargs, _kwds);
459     FluidSolver *parent = _args.obtainParent();
460     bool noTiming = _args.getOpt<bool>("notiming", -1, 0);
461     pbPreparePlugin(parent, "apicMapMACGridToParts", !noTiming);
462     PyObject *_retval = 0;
463     {
464       ArgLocker _lock;
465       ParticleDataImpl<Vec3> &partVel = *_args.getPtr<ParticleDataImpl<Vec3>>(
466           "partVel", 0, &_lock);
467       ParticleDataImpl<Vec3> &cpx = *_args.getPtr<ParticleDataImpl<Vec3>>("cpx", 1, &_lock);
468       ParticleDataImpl<Vec3> &cpy = *_args.getPtr<ParticleDataImpl<Vec3>>("cpy", 2, &_lock);
469       ParticleDataImpl<Vec3> &cpz = *_args.getPtr<ParticleDataImpl<Vec3>>("cpz", 3, &_lock);
470       const BasicParticleSystem &parts = *_args.getPtr<BasicParticleSystem>("parts", 4, &_lock);
471       const MACGrid &vel = *_args.getPtr<MACGrid>("vel", 5, &_lock);
472       const FlagGrid &flags = *_args.getPtr<FlagGrid>("flags", 6, &_lock);
473       const ParticleDataImpl<int> *ptype = _args.getPtrOpt<ParticleDataImpl<int>>(
474           "ptype", 7, NULL, &_lock);
475       const int exclude = _args.getOpt<int>("exclude", 8, 0, &_lock);
476       _retval = getPyNone();
477       apicMapMACGridToParts(partVel, cpx, cpy, cpz, parts, vel, flags, ptype, exclude);
478       _args.check();
479     }
480     pbFinalizePlugin(parent, "apicMapMACGridToParts", !noTiming);
481     return _retval;
482   }
483   catch (std::exception &e) {
484     pbSetError("apicMapMACGridToParts", e.what());
485     return 0;
486   }
487 }
488 static const Pb::Register _RP_apicMapMACGridToParts("", "apicMapMACGridToParts", _W_1);
489 extern "C" {
PbRegister_apicMapMACGridToParts()490 void PbRegister_apicMapMACGridToParts()
491 {
492   KEEP_UNUSED(_RP_apicMapMACGridToParts);
493 }
494 }
495 
496 }  // namespace Manta
497