64 #include "Vector/vector_dist.hpp"
65 #include "Draw/DrawParticles.hpp"
66 #include "OdeIntegrators/OdeIntegrators.hpp"
67 #include "Operators/Vector/vector_dist_operators.hpp"
69 typedef float real_number;
78 const real_number dp = 0.0085;
81 real_number h_swl = 0.0;
84 const real_number coeff_sound = 20.0;
87 const real_number gamma_ = 7.0;
90 const real_number H = 0.0147224318643;
93 const real_number Eta2 = 0.01 * H*H;
96 const real_number visco = 0.1;
99 real_number cbar = 0.0;
102 const real_number MassFluid = 0.000614125;
105 const real_number MassBound = 0.000614125;
109 const real_number t_end = 0.001;
111 const real_number t_end = 1.5;
115 const real_number gravity = 9.81;
118 const real_number RhoZero = 1000.0;
124 const real_number CFLnumber = 0.2;
127 const real_number DtMin = 0.00001;
130 const real_number RhoMin = 700.0;
133 const real_number RhoMax = 1300.0;
136 real_number max_fluid_height = 0.0;
141 const size_t TYPE = 0;
147 const int RHO_PREV = 2;
150 const int PRESSURE = 3;
159 const int VELOCITY = 6;
162 const int VELOCITY_PREV = 7;
165 const int VELOCITY_TMP = 11;
168 const int RHO_TMP = 10;
175 typedef vector_dist_gpu<3,real_number,aggregate<size_t,real_number, real_number, real_number, real_number, VectorS<3, real_number>,
VectorS<3, real_number>,
VectorS<3, real_number>, real_number, real_number, real_number,
VectorS<3, real_number>>>
particles;
185 size_t odeintIteration;
192 struct sph_state_type_ofp_ker{
193 sph_state_type_ofp_ker(){
197 typedef
size_t size_type;
198 typedef
int is_state_vector;
199 aggregate<scalar_kernel, vector_kernel, vector_kernel> data;
201 __host__ __device__
size_t size()
const
202 {
return data.
get<0>().size(); }
211 struct sph_state_type_ofp_gpu{
212 sph_state_type_ofp_gpu(){
214 typedef size_t size_type;
215 typedef int is_state_vector;
223 {
return data.get<0>().size(); }
225 void resize(
size_t n)
227 data.get<0>().resize(n);
228 data.get<1>().resize(n);
229 data.get<2>().resize(n);
231 sph_state_type_ofp_ker toKernel()
const
233 sph_state_type_ofp_ker s2_ker;
234 s2_ker.data.get<0>()=data.get<0>().getVector().toKernel();
235 s2_ker.data.get<1>()=data.get<1>().getVector().toKernel();
236 s2_ker.data.get<2>()=data.get<2>().getVector().toKernel();
243 : std::true_type { };
268 template<
typename vector_dist_type,
typename CellList_type>
271 CellList_type &cellList;
276 vectorDist(vectorDist)
279 void operator()( sph_state_type_ofp_gpu &X , sph_state_type_ofp_gpu &dxdt ,
const double t)
281 double dt05 = dt*0.5;
284 auto posExpression = getV<POS_PROP, comp_dev>(vectorDist);
285 auto forceExpression = getV<FORCE, comp_dev>(vectorDist);
286 auto drhoExpression = getV<DRHO, comp_dev>(vectorDist);
287 auto typeExpression = getV<TYPE, comp_dev>(vectorDist);
289 auto rhoExpression = getV<RHO, comp_dev>(vectorDist);
290 auto rho_prevExpression = getV<RHO_PREV, comp_dev>(vectorDist);
292 auto velocityExpression = getV<VELOCITY, comp_dev>(vectorDist);
293 auto velocity_prevExpression = getV<VELOCITY_PREV, comp_dev>(vectorDist);
295 if (odeintIteration < 40) {
296 X.data.get<0>() = rho_prevExpression;
297 X.data.get<2>() = velocity_prevExpression;
299 dxdt.data.get<0>() = 2*drhoExpression;
300 dxdt.data.get<1>() = velocityExpression + forceExpression*dt05 * typeExpression;
301 dxdt.data.get<2>() = forceExpression*2 * typeExpression;
306 dxdt.data.get<0>() = drhoExpression;
307 dxdt.data.get<1>() = velocityExpression + forceExpression*dt05 * typeExpression;
308 dxdt.data.get<2>() = forceExpression * typeExpression;
317 template<
typename Decomposition,
typename vector>
318 inline void addComputation(
324 if (vectorDist.template getProp<TYPE>(p) == FLUID)
325 dec.addComputationCost(v,4);
327 dec.addComputationCost(v,3);
330 template<
typename Decomposition>
inline void applyModel(
Decomposition & dec,
size_t v)
332 dec.setSubSubDomainComputationCost(v, dec.getSubSubDomainComputationCost(v) * dec.getSubSubDomainComputationCost(v));
335 real_number distributionTol()
341 template<
typename vd_type>
342 __global__
void EqState_gpu(vd_type vectorDist, real_number B)
344 auto a = GET_PARTICLE(vectorDist);
346 real_number rho_a = vectorDist.template getProp<RHO>(a);
347 real_number rho_frac = rho_a / RhoZero;
349 vectorDist.template getProp<PRESSURE>(a) = B*( rho_frac*rho_frac*rho_frac*rho_frac*rho_frac*rho_frac*rho_frac - 1.0);
352 inline void EqState(
particles & vectorDist)
354 auto it = vectorDist.getDomainIteratorGPU();
356 CUDA_LAUNCH(EqState_gpu,it,vectorDist.toKernel(),B);
360 const real_number a2 = 1.0/M_PI/H/H/H;
362 inline __device__ __host__ real_number Wab(real_number r)
367 return (1.0 - 3.0/2.0*r*r + 3.0/4.0*r*r*r)*a2;
369 return (1.0/4.0*(2.0 - r)*(2.0 - r)*(2.0 - r))*a2;
375 const real_number c1 = -3.0/M_PI/H/H/H/H;
376 const real_number d1 = 9.0/4.0/M_PI/H/H/H/H;
377 const real_number c2 = -3.0/4.0/M_PI/H/H/H/H;
378 const real_number a2_4 = 0.25*a2;
380 real_number W_dap = 0.0;
384 const real_number qq=r/H;
386 real_number qq2 = qq * qq;
387 real_number fac1 = (c1*qq + d1*qq2)/r;
388 real_number b1 = (qq < 1.0f)?1.0f:0.0f;
390 real_number wqq = (2.0f - qq);
391 real_number fac2 = c2 * wqq * wqq / r;
392 real_number b2 = (qq >= 1.0f && qq < 2.0f)?1.0f:0.0f;
394 real_number factor = (b1*fac1 + b2*fac2);
396 DW.
get(0) = factor * dx.
get(0);
397 DW.
get(1) = factor * dx.
get(1);
398 DW.
get(2) = factor * dx.
get(2);
402 inline __device__ __host__ real_number Tensile(real_number r, real_number rhoa, real_number rhob, real_number prs1, real_number prs2, real_number W_dap)
404 const real_number qq=r/H;
409 real_number wqq1=2.0f-qq;
410 real_number wqq2=wqq1*wqq1;
412 wab=a2_4*(wqq2*wqq1);
416 real_number wqq2=qq*qq;
417 real_number wqq3=wqq2*qq;
419 wab=a2*(1.0f-1.5f*wqq2+0.75f*wqq3);
423 real_number fab=wab*W_dap;
425 const real_number tensilp1=(prs1/(rhoa*rhoa))*(prs1>0.0f? 0.01f: -0.2f);
426 const real_number tensilp2=(prs2/(rhob*rhob))*(prs2>0.0f? 0.01f: -0.2f);
428 return (fab*(tensilp1+tensilp2));
432 inline __device__ __host__ real_number Pi(
const Point<3,real_number> & dr, real_number rr2,
Point<3,real_number> & dv, real_number rhoa, real_number rhob, real_number massb, real_number cbar, real_number & visc)
434 const real_number dot = dr.
get(0)*dv.
get(0) + dr.
get(1)*dv.
get(1) + dr.
get(2)*dv.
get(2);
435 const real_number dot_rr2 = dot/(rr2+Eta2);
436 visc=(dot_rr2 < visc)?visc:dot_rr2;
440 const float amubar=H*dot_rr2;
441 const float robar=(rhoa+rhob)*0.5f;
442 const float pi_visc=(-visco*cbar*amubar/robar);
450 template<
typename particles_type,
typename CellList_type>
451 __global__
void calc_forces_gpu(
particles_type vectorDist, CellList_type cellList, real_number W_dap, real_number cbar)
453 auto a = GET_PARTICLE(vectorDist);
455 real_number max_visc = 0.0f;
461 unsigned int typea = vectorDist.template getProp<TYPE>(a);
464 real_number rhoa = vectorDist.template getProp<RHO>(a);
467 real_number Pa = vectorDist.template getProp<PRESSURE>(a);
474 force_.
get(0) = 0.0f;
475 force_.
get(1) = 0.0f;
476 force_.
get(2) = -gravity;
477 real_number drho_ = 0.0f;
480 auto Np = cellList.getNNIteratorBox(cellList.getCell(xa));
483 while (Np.isNext() ==
true)
491 if (a == b) {++Np;
continue;};
493 unsigned int typeb = vectorDist.template getProp<TYPE>(b);
495 real_number massb = (typeb == FLUID)?MassFluid:MassBound;
497 real_number Pb = vectorDist.template getProp<PRESSURE>(b);
498 real_number rhob = vectorDist.template getProp<RHO>(b);
503 real_number r2 = norm2(dr);
506 if (r2 < 4.0*H*H && r2 >= 1e-16)
508 real_number r = sqrt(r2);
515 real_number factor = - massb*((Pa + Pb) / (rhoa * rhob) + Tensile(r,rhoa,rhob,Pa,Pb,W_dap) + Pi(dr,r2,v_rel,rhoa,rhob,massb,cbar,max_visc));
519 factor = (typea != FLUID)?0.0f:factor;
521 force_.
get(0) += factor * DW.
get(0);
522 force_.
get(1) += factor * DW.
get(1);
523 force_.
get(2) += factor * DW.
get(2);
525 real_number scal = massb*(v_rel.
get(0)*DW.
get(0)+v_rel.
get(1)*DW.
get(1)+v_rel.
get(2)*DW.
get(2));
526 scal = (typea == BOUNDARY && typeb == BOUNDARY)?0.0f:scal;
534 vectorDist.template getProp<RED>(a) = max_visc;
536 vectorDist.template getProp<FORCE>(a)[0] = force_.
get(0);
537 vectorDist.template getProp<FORCE>(a)[1] = force_.
get(1);
538 vectorDist.template getProp<FORCE>(a)[2] = force_.
get(2);
539 vectorDist.template getProp<DRHO>(a) = drho_;
542 template<
typename CellList>
inline void calc_forces(
particles & vectorDist,
CellList & cellList, real_number & max_visc,
size_t cnt)
544 auto part = vectorDist.getDomainIteratorGPU(32);
547 vectorDist.updateCellListGPU(cellList);
549 CUDA_LAUNCH(calc_forces_gpu,part,vectorDist.toKernel(),cellList.toKernel(),W_dap,cbar);
551 max_visc = reduce_local<RED,_max_>(vectorDist);
554 template<
typename vector_type>
555 __global__
void max_acceleration_and_velocity_gpu(
vector_type vectorDist)
557 auto a = GET_PARTICLE(vectorDist);
560 vectorDist.template getProp<RED>(a) = norm(acc);
563 vectorDist.template getProp<RED2>(a) = norm(vel);
566 template<
typename vector_type>
570 printf(
"Check GPU %d %p %f\n", i, &vector.get<0>(i), vector.get<0>(i));
575 void max_acceleration_and_velocity(
particles & vectorDist, real_number & max_acc, real_number & max_vel)
578 auto part = vectorDist.getDomainIteratorGPU();
580 CUDA_LAUNCH(max_acceleration_and_velocity_gpu,part,vectorDist.toKernel());
582 max_acc = reduce_local<RED,_max_>(vectorDist);
583 max_vel = reduce_local<RED2,_max_>(vectorDist);
592 real_number calc_deltaT(
particles & vectorDist, real_number ViscDtMax)
594 real_number Maxacc = 0.0;
595 real_number Maxvel = 0.0;
596 max_acceleration_and_velocity(vectorDist,Maxacc,Maxvel);
599 const real_number dt_f = (Maxacc)?sqrt(H/Maxacc):std::numeric_limits<float>::max();
602 const real_number dt_cv = H/(std::max(cbar,Maxvel*10.f) + H*ViscDtMax);
605 real_number dt=real_number(CFLnumber)*std::min(dt_f,dt_cv);
606 if(dt<real_number(DtMin))
607 {dt=real_number(DtMin);}
613 template<
typename vector_dist_type>
616 auto p = GET_PARTICLE(vectorDist);
619 if (vectorDist.template getProp<TYPE>(p) == BOUNDARY)
621 real_number rho = vectorDist.template getProp<RHO>(p);
623 vectorDist.template getProp<RHO>(p) = RhoZero;
629 if (vectorDist.
getPos(p)[0] < 0.0 || vectorDist.
getPos(p)[1] < 0.0 || vectorDist.
getPos(p)[2] < 0.0 ||
630 vectorDist.
getPos(p)[0] > 1.61 || vectorDist.
getPos(p)[1] > 0.68 || vectorDist.
getPos(p)[2] > 0.50 ||
631 vectorDist.template getProp<RHO>(p) < RhoMin || vectorDist.template getProp<RHO>(p) > RhoMax)
632 {vectorDist.template getProp<RED>(p) = 1;}
638 void checkPosPrpLimits(
particles & vectorDist)
640 auto redExpression = getV<RED, comp_dev>(vectorDist);
644 auto part = vectorDist.getDomainIteratorGPU();
645 CUDA_LAUNCH(checkPosPrpLimits_ker,part,vectorDist.toKernel());
649 remove_marked<RED>(vectorDist);
656 template<
typename vector_type,
typename CellList_type>
659 real_number tot_ker = 0.0;
665 auto itg = cellList.getNNIteratorBox(cellList.getCell(xp));
671 if (vectorDist.template getProp<TYPE>(q) != FLUID)
682 real_number r = sqrt(norm2(xp - xq));
684 real_number ker = Wab(r) * (MassFluid / RhoZero);
691 *press_tmp += vectorDist.template getProp<PRESSURE>(q) * ker;
702 {*press_tmp = 1.0 / tot_ker * *press_tmp;}
705 template<
typename Vector,
typename CellList>
706 inline void sensor_pressure(
Vector & vectorDist,
715 for (
size_t i = 0 ; i < probes.size() ; i++)
719 real_number press_tmp;
722 if (vectorDist.getDecomposition().isLocal(probes.get(i)) ==
true)
724 vectorDist.updateCellListGPU(cellList);
727 CUDA_LAUNCH_DIM3(sensor_pressure_gpu,1,1,vectorDist.toKernel(),cellList.toKernel(),probe,(real_number *)press_tmp_.toKernel());
730 press_tmp_.deviceToHost();
731 press_tmp = *(real_number *)press_tmp_.getPointer();
741 press_t.last().add(press_tmp);
745 int main(
int argc,
char* argv[])
748 openfpm_init(&argc,&argv);
754 probes.add({0.8779f,0.3f,0.02f});
755 probes.add({0.754f,0.31f,0.02f});
759 size_t sz[3] = {207,90,66};
762 W_dap = 1.0/Wab(H/1.5);
765 size_t bc[3]={NON_PERIODIC,NON_PERIODIC,NON_PERIODIC};
770 particles vectorDist(0,domain,bc,g,DEC_GRAN(512));
776 Box<3,real_number> fluid_box({dp/2.0f,dp/2.0f,dp/2.0f},{0.4f+dp/2.0f,0.67f-dp/2.0f,0.3f+dp/2.0f});
782 max_fluid_height = fluid_it.getBoxMargins().
getHigh(2);
783 h_swl = fluid_it.getBoxMargins().
getHigh(2) - fluid_it.getBoxMargins().
getLow(2);
784 B = (coeff_sound)*(coeff_sound)*gravity*h_swl*RhoZero / gamma_;
785 cbar = coeff_sound * sqrt(gravity * h_swl);
788 while (fluid_it.isNext())
794 vectorDist.getLastPos()[0] = fluid_it.get().get(0);
795 vectorDist.getLastPos()[1] = fluid_it.get().get(1);
796 vectorDist.getLastPos()[2] = fluid_it.get().get(2);
799 vectorDist.template getLastProp<TYPE>() = FLUID;
808 vectorDist.template getLastProp<PRESSURE>() = RhoZero * gravity * (max_fluid_height - fluid_it.get().get(2));
810 vectorDist.template getLastProp<RHO>() = pow(vectorDist.template getLastProp<PRESSURE>() / B + 1, 1.0/gamma_) * RhoZero;
811 vectorDist.template getLastProp<RHO_PREV>() = vectorDist.template getLastProp<RHO>();
812 vectorDist.template getLastProp<VELOCITY>()[0] = 0.0;
813 vectorDist.template getLastProp<VELOCITY>()[1] = 0.0;
814 vectorDist.template getLastProp<VELOCITY>()[2] = 0.0;
816 vectorDist.template getLastProp<VELOCITY_PREV>()[0] = 0.0;
817 vectorDist.template getLastProp<VELOCITY_PREV>()[1] = 0.0;
818 vectorDist.template getLastProp<VELOCITY_PREV>()[2] = 0.0;
825 Box<3,real_number> recipient1({0.0f,0.0f,0.0f},{1.6f+dp/2.0f,0.67f+dp/2.0f,0.4f+dp/2.0f});
828 Box<3,real_number> obstacle1({0.9f,0.24f-dp/2.0f,0.0f},{1.02f+dp/2.0f,0.36f,0.45f+dp/2.0f});
829 Box<3,real_number> obstacle2({0.9f+dp,0.24f+dp/2.0f,0.0f},{1.02f-dp/2.0f,0.36f-dp,0.45f-dp/2.0f});
833 holes.add(recipient2);
834 holes.add(obstacle1);
837 while (bound_box.isNext())
841 vectorDist.getLastPos()[0] = bound_box.get().get(0);
842 vectorDist.getLastPos()[1] = bound_box.get().get(1);
843 vectorDist.getLastPos()[2] = bound_box.get().get(2);
845 vectorDist.template getLastProp<TYPE>() = BOUNDARY;
846 vectorDist.template getLastProp<RHO>() = RhoZero;
847 vectorDist.template getLastProp<RHO_PREV>() = RhoZero;
848 vectorDist.template getLastProp<VELOCITY>()[0] = 0.0;
849 vectorDist.template getLastProp<VELOCITY>()[1] = 0.0;
850 vectorDist.template getLastProp<VELOCITY>()[2] = 0.0;
852 vectorDist.template getLastProp<VELOCITY_PREV>()[0] = 0.0;
853 vectorDist.template getLastProp<VELOCITY_PREV>()[1] = 0.0;
854 vectorDist.template getLastProp<VELOCITY_PREV>()[2] = 0.0;
861 while (obstacle_box.isNext())
865 vectorDist.getLastPos()[0] = obstacle_box.get().get(0);
866 vectorDist.getLastPos()[1] = obstacle_box.get().get(1);
867 vectorDist.getLastPos()[2] = obstacle_box.get().get(2);
869 vectorDist.template getLastProp<TYPE>() = BOUNDARY;
870 vectorDist.template getLastProp<RHO>() = RhoZero;
871 vectorDist.template getLastProp<RHO_PREV>() = RhoZero;
872 vectorDist.template getLastProp<VELOCITY>()[0] = 0.0;
873 vectorDist.template getLastProp<VELOCITY>()[1] = 0.0;
874 vectorDist.template getLastProp<VELOCITY>()[2] = 0.0;
876 vectorDist.template getLastProp<VELOCITY_PREV>()[0] = 0.0;
877 vectorDist.template getLastProp<VELOCITY_PREV>()[1] = 0.0;
878 vectorDist.template getLastProp<VELOCITY_PREV>()[2] = 0.0;
888 vectorDist.addComputationCosts(md);
889 vectorDist.getDecomposition().decompose();
896 vectorDist.hostToDevicePos();
897 vectorDist.template hostToDeviceProp<TYPE,RHO,RHO_PREV,PRESSURE,VELOCITY,VELOCITY_PREV>();
899 vectorDist.ghost_get<TYPE,RHO,PRESSURE,VELOCITY>(RUN_ON_DEVICE);
901 auto cellList = vectorDist.getCellListGPU(2*H, CL_NON_SYMMETRIC, 2);
904 boost::numeric::odeint::euler<sph_state_type_ofp_gpu, double, sph_state_type_ofp_gpu, double, boost::numeric::odeint::vector_space_algebra_ofp_gpu,boost::numeric::odeint::ofp_operations> eulerOdeint;
907 RHSFunctor<decltype(vectorDist), decltype(cellList)> rhsFunctor(vectorDist, cellList);
910 sph_state_type_ofp_gpu X;
912 auto posExpression = getV<POS_PROP, comp_dev>(vectorDist);
913 auto forceExpression = getV<FORCE, comp_dev>(vectorDist);
914 auto drhoExpression = getV<DRHO, comp_dev>(vectorDist);
915 auto typeExpression = getV<TYPE, comp_dev>(vectorDist);
917 auto rhoExpression = getV<RHO, comp_dev>(vectorDist);
918 auto rho_tmpExpression = getV<RHO_TMP, comp_dev>(vectorDist);
919 auto rho_prevExpression = getV<RHO_PREV, comp_dev>(vectorDist);
921 auto velocityExpression = getV<VELOCITY, comp_dev>(vectorDist);
922 auto velocity_tmpExpression = getV<VELOCITY_TMP, comp_dev>(vectorDist);
923 auto velocity_prevExpression = getV<VELOCITY_PREV, comp_dev>(vectorDist);
926 X.data.get<0>() = rhoExpression;
927 X.data.get<1>() = posExpression;
928 X.data.get<2>() = velocityExpression;
950 vectorDist.map(RUN_ON_DEVICE);
953 vectorDist.deviceToHostPos();
954 vectorDist.template deviceToHostProp<TYPE>();
958 vectorDist.addComputationCosts(md);
959 vectorDist.getDecomposition().decompose();
962 {std::cout <<
"REBALANCED " << it_reb << std::endl;}
965 vectorDist.map(RUN_ON_DEVICE);
970 real_number max_visc = 0.0;
972 vectorDist.ghost_get<TYPE,RHO,PRESSURE,VELOCITY>(RUN_ON_DEVICE);
975 calc_forces(vectorDist,cellList,max_visc,cnt);
983 dt = calc_deltaT(vectorDist,max_visc);
990 if (odeintIteration < 40) {
991 X.data.get<0>() = rho_prevExpression;
992 X.data.get<2>() = velocity_prevExpression;
994 X.data.get<0>() = rhoExpression;
995 X.data.get<2>() = velocityExpression;
998 X.data.get<1>() = posExpression;
1000 rho_tmpExpression = rhoExpression;
1001 velocity_tmpExpression = velocityExpression;
1003 eulerOdeint.do_step(rhsFunctor, X, t, dt);
1005 rhoExpression=X.data.get<0>();
1006 posExpression = X.data.get<1>();
1007 velocityExpression = X.data.get<2>();
1009 rho_prevExpression = rho_tmpExpression;
1010 velocity_prevExpression = velocity_tmpExpression;
1012 if (odeintIteration == 40) {
1015 odeintIteration = 0;
1018 checkPosPrpLimits(vectorDist);
1026 vectorDist.map(RUN_ON_DEVICE);
1027 vectorDist.ghost_get<TYPE,RHO,PRESSURE,VELOCITY>(RUN_ON_DEVICE);
1032 std::cout <<
"OUTPUT " << dt << std::endl;
1036 vectorDist.deviceToHostPos();
1037 vectorDist.deviceToHostProp<TYPE,RHO,RHO_PREV,PRESSURE,DRHO,FORCE,VELOCITY,VELOCITY_PREV,RED,RED2>();
1039 vectorDist.write_frame(
"Geometry",write);
1043 {std::cout <<
"TIME: " << t <<
" write " << it_time.
getwct() <<
" " << it_reb <<
" " << cnt <<
" Max visc: " << max_visc <<
" " << vectorDist.size_local() << std::endl;}
1048 {std::cout <<
"TIME: " << t <<
" " << it_time.
getwct() <<
" " << it_reb <<
" " << cnt <<
" Max visc: " << max_visc <<
" " << vectorDist.size_local() << std::endl;}
1053 std::cout <<
"Time to complete: " << tot_sim.
getwct() <<
" seconds" << std::endl;
1060 int main(
int argc,
char* argv[])
This class represent an N-dimensional box.
__device__ __host__ T getLow(int i) const
get the i-coordinate of the low bound interval of the box
__device__ __host__ T getHigh(int i) const
get the high interval of the box
Class for FAST cell list implementation.
This class define the domain decomposition interface.
static PointIteratorSkin< dim, T, typename vd_type::Decomposition_type > DrawSkin(vd_type &vd, size_t(&sz)[dim], Box< dim, T > &domain, Box< dim, T > &sub_A, Box< dim, T > &sub_B)
Draw particles in a box B excluding the area of a second box A (B - A)
static PointIterator< dim, T, typename vd_type::Decomposition_type > DrawBox(vd_type &vd, size_t(&sz)[dim], Box< dim, T > &domain, Box< dim, T > &sub)
Draw particles in a box.
This class implement the point shape in an N-dimensional space.
__device__ __host__ const T & get(unsigned int i) const
Get coordinate.
void execute()
Execute all the requests.
void sum(T &num)
Sum the numbers across all processors and get the result.
size_t getProcessUnitID()
Get the process unit id.
void max(T &num)
Get the maximum number across all processors (or reduction with infinity norm)
Implementation of VCluster class.
Sparse Matrix implementation stub object when OpenFPM is compiled with no linear algebra support.
Implementation of 1-D std::vector like structure.
Class for cpu time benchmarking.
void stop()
Stop the timer.
void start()
Start the timer.
double getwct()
Return the elapsed real time.
Main class that encapsulate a vector properties operand to be used for expressions construction.
auto getPos(vect_dist_key_dx vec_key) -> decltype(vPos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
convert a type into constant type
Model for Dynamic load balancing.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
__device__ __host__ boost::mpl::at< type, boost::mpl::int_< i > >::type & get()
get the properties i