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