42 #define PRINT_STACKTRACE
49 #include "Vector/vector_dist.hpp"
51 #include "Draw/DrawParticles.hpp"
55 typedef float real_number;
64 const real_number dp = 0.0085;
67 real_number h_swl = 0.0;
70 const real_number coeff_sound = 20.0;
73 const real_number gamma_ = 7.0;
76 const real_number H = 0.0147224318643;
79 const real_number Eta2 = 0.01 * H*H;
81 const real_number FourH2 = 4.0 * H*H;
84 const real_number visco = 0.1;
87 real_number cbar = 0.0;
90 const real_number MassFluid = 0.000614125;
93 const real_number MassBound = 0.000614125;
99 const real_number t_end = 0.001;
101 const real_number t_end = 1.5;
105 const real_number gravity = 9.81;
108 const real_number rho_zero = 1000.0;
114 const real_number CFLnumber = 0.2;
117 const real_number DtMin = 0.00001;
120 const real_number RhoMin = 700.0;
123 const real_number RhoMax = 1300.0;
126 real_number max_fluid_height = 0.0;
131 const size_t type = 0;
137 const int rho_prev = 2;
140 const int Pressure = 3;
149 const int velocity = 6;
152 const int velocity_prev = 7;
159 typedef vector_dist_gpu<3,real_number,aggregate<unsigned int,real_number, real_number, real_number, real_number, real_number[3], real_number[3], real_number[3], real_number, real_number>>
particles;
168 template<
typename Decomposition,
typename vector>
inline void addComputation(
Decomposition & dec,
173 if (vd.template getProp<type>(p) == FLUID)
174 dec.addComputationCost(v,4);
176 dec.addComputationCost(v,3);
179 template<
typename Decomposition>
inline void applyModel(
Decomposition & dec,
size_t v)
181 dec.setSubSubDomainComputationCost(v, dec.getSubSubDomainComputationCost(v) * dec.getSubSubDomainComputationCost(v));
184 real_number distributionTol()
190 template<
typename vd_type>
191 __global__
void EqState_gpu(vd_type vd, real_number B)
193 auto a = GET_PARTICLE(vd);
195 real_number rho_a = vd.template getProp<rho>(a);
196 real_number rho_frac = rho_a / rho_zero;
198 vd.template getProp<Pressure>(a) = B*( rho_frac*rho_frac*rho_frac*rho_frac*rho_frac*rho_frac*rho_frac - 1.0);
203 auto it = vd.getDomainIteratorGPU();
205 CUDA_LAUNCH(EqState_gpu,it,vd.toKernel(),B);
209 const real_number a2 = 1.0/M_PI/H/H/H;
211 inline __device__ __host__ real_number Wab(real_number r)
216 return (1.0 - 3.0/2.0*r*r + 3.0/4.0*r*r*r)*a2;
218 return (1.0/4.0*(2.0 - r)*(2.0 - r)*(2.0 - r))*a2;
224 const real_number c1 = -3.0/M_PI/H/H/H/H;
225 const real_number d1 = 9.0/4.0/M_PI/H/H/H/H;
226 const real_number c2 = -3.0/4.0/M_PI/H/H/H/H;
227 const real_number a2_4 = 0.25*a2;
229 real_number W_dap = 0.0;
233 const real_number qq=r/H;
235 real_number qq2 = qq * qq;
236 real_number fac1 = (c1*qq + d1*qq2)/r;
237 real_number b1 = (qq < 1.0f)?1.0f:0.0f;
239 real_number wqq = (2.0f - qq);
240 real_number fac2 = c2 * wqq * wqq / r;
241 real_number b2 = (qq >= 1.0f && qq < 2.0f)?1.0f:0.0f;
243 real_number factor = (b1*fac1 + b2*fac2);
245 DW.
get(0) = factor * dx.
get(0);
246 DW.
get(1) = factor * dx.
get(1);
247 DW.
get(2) = factor * dx.
get(2);
252 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)
254 const real_number qq=r/H;
259 real_number wqq1=2.0f-qq;
260 real_number wqq2=wqq1*wqq1;
262 wab=a2_4*(wqq2*wqq1);
266 real_number wqq2=qq*qq;
267 real_number wqq3=wqq2*qq;
269 wab=a2*(1.0f-1.5f*wqq2+0.75f*wqq3);
273 real_number fab=wab*W_dap;
275 const real_number tensilp1=(prs1/(rhoa*rhoa))*(prs1>0.0f? 0.01f: -0.2f);
276 const real_number tensilp2=(prs2/(rhob*rhob))*(prs2>0.0f? 0.01f: -0.2f);
278 return (fab*(tensilp1+tensilp2));
282 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)
284 const real_number dot = dr.
get(0)*dv.
get(0) + dr.
get(1)*dv.
get(1) + dr.
get(2)*dv.
get(2);
285 const real_number dot_rr2 = dot/(rr2+Eta2);
286 visc=(dot_rr2 < visc)?visc:dot_rr2;
290 const float amubar=H*dot_rr2;
291 const float robar=(rhoa+rhob)*0.5f;
292 const float pi_visc=(-visco*cbar*amubar/robar);
300 template<
typename particles_type,
typename NN_type>
301 __global__
void calc_forces_gpu(
particles_type vd, NN_type NN, real_number W_dap, real_number cbar)
304 GET_PARTICLE_SORT(a,NN);
306 real_number max_visc = 0.0f;
312 unsigned int typea = vd.template getProp<type>(a);
315 real_number rhoa = vd.template getProp<rho>(a);
318 real_number Pa = vd.template getProp<Pressure>(a);
324 force_.
get(0) = 0.0f;
325 force_.
get(1) = 0.0f;
326 force_.
get(2) = -gravity;
327 real_number drho_ = 0.0f;
330 auto Np = NN.getNNIteratorBox(NN.getCell(xa));
333 while (Np.isNext() ==
true)
336 auto b = Np.get_sort();
342 if (a == b) {++Np;
continue;};
344 unsigned int typeb = vd.template getProp<type>(b);
346 real_number massb = (typeb == FLUID)?MassFluid:MassBound;
348 real_number Pb = vd.template getProp<Pressure>(b);
349 real_number rhob = vd.template getProp<rho>(b);
354 real_number r2 = norm2(dr);
357 if (r2 < FourH2 && r2 >= 1e-16)
359 real_number r = sqrtf(r2);
366 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));
369 factor = (typea == BOUNDARY && typeb == BOUNDARY)?0.0f:factor;
371 force_.
get(0) += factor * DW.
get(0);
372 force_.
get(1) += factor * DW.
get(1);
373 force_.
get(2) += factor * DW.
get(2);
375 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));
376 scal = (typea == BOUNDARY && typeb == BOUNDARY)?0.0f:scal;
384 vd.template getProp<red>(a) = max_visc;
386 vd.template getProp<force>(a)[0] = force_.
get(0);
387 vd.template getProp<force>(a)[1] = force_.
get(1);
388 vd.template getProp<force>(a)[2] = force_.
get(2);
389 vd.template getProp<drho>(a) = drho_;
392 template<
typename CellList>
inline void calc_forces(
particles & vd,
CellList & NN, real_number & max_visc,
size_t cnt)
394 auto part = vd.getDomainIteratorGPU(96);
397 vd.updateCellListGPU<type,rho,Pressure,velocity>(NN);
399 CUDA_LAUNCH(calc_forces_gpu,part,vd.toKernel(),NN.toKernel(),W_dap,cbar);
401 vd.restoreOrder<drho,force,
red>(NN);
403 max_visc = reduce_local<red,_max_>(vd);
406 template<
typename vector_type>
407 __global__
void max_acceleration_and_velocity_gpu(
vector_type vd)
409 auto a = GET_PARTICLE(vd);
412 vd.template getProp<red>(a) = norm(acc);
415 vd.template getProp<red2>(a) = norm(vel);
418 void max_acceleration_and_velocity(
particles & vd, real_number & max_acc, real_number & max_vel)
421 auto part = vd.getDomainIteratorGPU();
423 CUDA_LAUNCH(max_acceleration_and_velocity_gpu,part,vd.toKernel());
425 max_acc = reduce_local<red,_max_>(vd);
426 max_vel = reduce_local<red2,_max_>(vd);
435 real_number calc_deltaT(
particles & vd, real_number ViscDtMax)
437 real_number Maxacc = 0.0;
438 real_number Maxvel = 0.0;
439 max_acceleration_and_velocity(vd,Maxacc,Maxvel);
442 const real_number dt_f = (Maxacc)?sqrt(H/Maxacc):std::numeric_limits<float>::max();
445 const real_number dt_cv = H/(std::max(cbar,Maxvel*10.f) + H*ViscDtMax);
448 real_number dt=real_number(CFLnumber)*std::min(dt_f,dt_cv);
449 if(dt<real_number(DtMin))
450 {dt=real_number(DtMin);}
455 template<
typename vector_dist_type>
456 __global__
void verlet_int_gpu(
vector_dist_type vd, real_number dt, real_number dt2, real_number dt205)
459 auto a = GET_PARTICLE(vd);
462 if (vd.template getProp<type>(a) == BOUNDARY)
465 real_number rhop = vd.template getProp<rho>(a);
468 vd.template getProp<velocity>(a)[0] = 0.0;
469 vd.template getProp<velocity>(a)[1] = 0.0;
470 vd.template getProp<velocity>(a)[2] = 0.0;
471 real_number rhonew = vd.template getProp<rho_prev>(a) + dt2*vd.template getProp<drho>(a);
472 vd.template getProp<rho>(a) = (rhonew < rho_zero)?rho_zero:rhonew;
474 vd.template getProp<rho_prev>(a) = rhop;
476 vd.template getProp<red>(a) = 0;
482 real_number dx = vd.template getProp<velocity>(a)[0]*dt + vd.template getProp<force>(a)[0]*dt205;
483 real_number dy = vd.template getProp<velocity>(a)[1]*dt + vd.template getProp<force>(a)[1]*dt205;
484 real_number dz = vd.template getProp<velocity>(a)[2]*dt + vd.template getProp<force>(a)[2]*dt205;
490 real_number velX = vd.template getProp<velocity>(a)[0];
491 real_number velY = vd.template getProp<velocity>(a)[1];
492 real_number velZ = vd.template getProp<velocity>(a)[2];
494 real_number rhop = vd.template getProp<rho>(a);
496 vd.template getProp<velocity>(a)[0] = vd.template getProp<velocity_prev>(a)[0] + vd.template getProp<force>(a)[0]*dt2;
497 vd.template getProp<velocity>(a)[1] = vd.template getProp<velocity_prev>(a)[1] + vd.template getProp<force>(a)[1]*dt2;
498 vd.template getProp<velocity>(a)[2] = vd.template getProp<velocity_prev>(a)[2] + vd.template getProp<force>(a)[2]*dt2;
499 vd.template getProp<rho>(a) = vd.template getProp<rho_prev>(a) + dt2*vd.template getProp<drho>(a);
504 vd.template getProp<rho>(a) < RhoMin || vd.template getProp<rho>(a) > RhoMax)
505 {vd.template getProp<red>(a) = 1;}
507 {vd.template getProp<red>(a) = 0;}
510 vd.template getProp<velocity_prev>(a)[0] = velX;
511 vd.template getProp<velocity_prev>(a)[1] = velY;
512 vd.template getProp<velocity_prev>(a)[2] = velZ;
513 vd.template getProp<rho_prev>(a) = rhop;
518 void verlet_int(
particles & vd, real_number dt)
521 auto part = vd.getDomainIteratorGPU();
523 real_number dt205 = dt*dt*0.5;
524 real_number dt2 = dt*2.0;
526 CUDA_LAUNCH(verlet_int_gpu,part,vd.toKernel(),dt,dt2,dt205);
529 remove_marked<red>(vd);
535 template<
typename vector_type>
536 __global__
void euler_int_gpu(
vector_type vd,real_number dt, real_number dt205)
539 auto a = GET_PARTICLE(vd);
542 if (vd.template getProp<type>(a) == BOUNDARY)
545 real_number rhop = vd.template getProp<rho>(a);
548 vd.template getProp<velocity>(a)[0] = 0.0;
549 vd.template getProp<velocity>(a)[1] = 0.0;
550 vd.template getProp<velocity>(a)[2] = 0.0;
551 real_number rhonew = vd.template getProp<rho>(a) + dt*vd.template getProp<drho>(a);
552 vd.template getProp<rho>(a) = (rhonew < rho_zero)?rho_zero:rhonew;
554 vd.template getProp<rho_prev>(a) = rhop;
556 vd.template getProp<red>(a) = 0;
562 real_number dx = vd.template getProp<velocity>(a)[0]*dt + vd.template getProp<force>(a)[0]*dt205;
563 real_number dy = vd.template getProp<velocity>(a)[1]*dt + vd.template getProp<force>(a)[1]*dt205;
564 real_number dz = vd.template getProp<velocity>(a)[2]*dt + vd.template getProp<force>(a)[2]*dt205;
570 real_number velX = vd.template getProp<velocity>(a)[0];
571 real_number velY = vd.template getProp<velocity>(a)[1];
572 real_number velZ = vd.template getProp<velocity>(a)[2];
573 real_number rhop = vd.template getProp<rho>(a);
575 vd.template getProp<velocity>(a)[0] = vd.template getProp<velocity>(a)[0] + vd.template getProp<force>(a)[0]*dt;
576 vd.template getProp<velocity>(a)[1] = vd.template getProp<velocity>(a)[1] + vd.template getProp<force>(a)[1]*dt;
577 vd.template getProp<velocity>(a)[2] = vd.template getProp<velocity>(a)[2] + vd.template getProp<force>(a)[2]*dt;
578 vd.template getProp<rho>(a) = vd.template getProp<rho>(a) + dt*vd.template getProp<drho>(a);
583 vd.template getProp<rho>(a) < RhoMin || vd.template getProp<rho>(a) > RhoMax)
584 {vd.template getProp<red>(a) = 1;}
586 {vd.template getProp<red>(a) = 0;}
588 vd.template getProp<velocity_prev>(a)[0] = velX;
589 vd.template getProp<velocity_prev>(a)[1] = velY;
590 vd.template getProp<velocity_prev>(a)[2] = velZ;
591 vd.template getProp<rho_prev>(a) = rhop;
594 void euler_int(
particles & vd, real_number dt)
598 auto part = vd.getDomainIteratorGPU();
600 real_number dt205 = dt*dt*0.5;
602 CUDA_LAUNCH(euler_int_gpu,part,vd.toKernel(),dt,dt205);
605 remove_marked<red>(vd);
610 template<
typename vector_type,
typename NN_type>
613 real_number tot_ker = 0.0;
619 auto itg = NN.getNNIteratorBox(NN.getCell(xp));
622 auto q = itg.get_sort();
625 if (vd.template getProp<type>(q) != FLUID)
636 real_number r = sqrt(norm2(xp - xq));
638 real_number ker = Wab(r) * (MassFluid / rho_zero);
645 *press_tmp += vd.template getProp<Pressure>(q) * ker;
656 {*press_tmp = 1.0 / tot_ker * *press_tmp;}
659 template<
typename Vector,
typename CellList>
660 inline void sensor_pressure(
Vector & vd,
669 for (
size_t i = 0 ; i < probes.size() ; i++)
673 real_number press_tmp;
676 if (vd.getDecomposition().isLocal(probes.get(i)) ==
true)
678 vd.template updateCellListGPU<type,Pressure>(NN);
681 CUDA_LAUNCH_DIM3(sensor_pressure_gpu,1,1,vd.toKernel(),NN.toKernel(),probe,(real_number *)press_tmp_.toKernel());
683 vd.template restoreOrder<>(NN);
685 press_tmp_.deviceToHost();
686 press_tmp = *(real_number *)press_tmp_.getPointer();
696 press_t.last().add(press_tmp);
700 int main(
int argc,
char* argv[])
717 openfpm_init(&argc,&argv);
719 #if !defined(CUDA_ON_CPU) && !defined(__HIP__)
720 cudaDeviceSetCacheConfig(cudaFuncCachePreferL1);
727 probes.add({0.8779f,0.3f,0.02f});
728 probes.add({0.754f,0.31f,0.02f});
732 size_t sz[3] = {207,90,66};
735 W_dap = 1.0/Wab(H/1.5);
738 size_t bc[3]={NON_PERIODIC,NON_PERIODIC,NON_PERIODIC};
743 particles vd(0,domain,bc,g,DEC_GRAN(128));
749 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});
755 max_fluid_height = fluid_it.getBoxMargins().
getHigh(2);
756 h_swl = fluid_it.getBoxMargins().
getHigh(2) - fluid_it.getBoxMargins().
getLow(2);
757 B = (coeff_sound)*(coeff_sound)*gravity*h_swl*rho_zero / gamma_;
758 cbar = coeff_sound * sqrt(gravity * h_swl);
761 while (fluid_it.isNext())
767 vd.getLastPos()[0] = fluid_it.get().get(0);
768 vd.getLastPos()[1] = fluid_it.get().get(1);
769 vd.getLastPos()[2] = fluid_it.get().get(2);
772 vd.template getLastProp<type>() = FLUID;
781 vd.template getLastProp<Pressure>() = rho_zero * gravity * (max_fluid_height - fluid_it.get().get(2));
783 vd.template getLastProp<rho>() = pow(vd.template getLastProp<Pressure>() / B + 1, 1.0/gamma_) * rho_zero;
784 vd.template getLastProp<rho_prev>() = vd.template getLastProp<rho>();
785 vd.template getLastProp<velocity>()[0] = 0.0;
786 vd.template getLastProp<velocity>()[1] = 0.0;
787 vd.template getLastProp<velocity>()[2] = 0.0;
789 vd.template getLastProp<velocity_prev>()[0] = 0.0;
790 vd.template getLastProp<velocity_prev>()[1] = 0.0;
791 vd.template getLastProp<velocity_prev>()[2] = 0.0;
798 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});
801 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});
802 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});
806 holes.add(recipient2);
807 holes.add(obstacle1);
810 while (bound_box.isNext())
814 vd.getLastPos()[0] = bound_box.get().get(0);
815 vd.getLastPos()[1] = bound_box.get().get(1);
816 vd.getLastPos()[2] = bound_box.get().get(2);
818 vd.template getLastProp<type>() = BOUNDARY;
819 vd.template getLastProp<rho>() = rho_zero;
820 vd.template getLastProp<rho_prev>() = rho_zero;
821 vd.template getLastProp<velocity>()[0] = 0.0;
822 vd.template getLastProp<velocity>()[1] = 0.0;
823 vd.template getLastProp<velocity>()[2] = 0.0;
825 vd.template getLastProp<velocity_prev>()[0] = 0.0;
826 vd.template getLastProp<velocity_prev>()[1] = 0.0;
827 vd.template getLastProp<velocity_prev>()[2] = 0.0;
834 while (obstacle_box.isNext())
838 vd.getLastPos()[0] = obstacle_box.get().get(0);
839 vd.getLastPos()[1] = obstacle_box.get().get(1);
840 vd.getLastPos()[2] = obstacle_box.get().get(2);
842 vd.template getLastProp<type>() = BOUNDARY;
843 vd.template getLastProp<rho>() = rho_zero;
844 vd.template getLastProp<rho_prev>() = rho_zero;
845 vd.template getLastProp<velocity>()[0] = 0.0;
846 vd.template getLastProp<velocity>()[1] = 0.0;
847 vd.template getLastProp<velocity>()[2] = 0.0;
849 vd.template getLastProp<velocity_prev>()[0] = 0.0;
850 vd.template getLastProp<velocity_prev>()[1] = 0.0;
851 vd.template getLastProp<velocity_prev>()[2] = 0.0;
861 vd.addComputationCosts(md);
862 vd.getDecomposition().decompose();
869 vd.hostToDevicePos();
870 vd.template hostToDeviceProp<type,rho,rho_prev,Pressure,velocity,velocity_prev>();
872 vd.ghost_get<type,rho,Pressure,velocity>(RUN_ON_DEVICE);
874 auto NN = vd.getCellListGPU(2*H / 2.0, CL_NON_SYMMETRIC | CL_GPU_REORDER_POSITION | CL_GPU_REORDER_PROPERTY | CL_GPU_RESTORE_PROPERTY, 2);
893 vd.map(RUN_ON_DEVICE);
896 vd.deviceToHostPos();
897 vd.template deviceToHostProp<type>();
901 vd.addComputationCosts(md);
902 vd.getDecomposition().decompose();
905 {std::cout <<
"REBALANCED " << it_reb << std::endl;}
908 vd.map(RUN_ON_DEVICE);
913 real_number max_visc = 0.0;
915 vd.ghost_get<type,rho,Pressure,velocity>(RUN_ON_DEVICE);
918 calc_forces(vd,NN,max_visc,cnt);
926 real_number dt = calc_deltaT(vd,max_visc);
944 vd.map(RUN_ON_DEVICE);
945 vd.ghost_get<type,rho,Pressure,velocity>(RUN_ON_DEVICE);
950 std::cout <<
"OUTPUT " << dt << std::endl;
954 vd.deviceToHostPos();
955 vd.deviceToHostProp<type,rho,rho_prev,Pressure,drho,force,velocity,velocity_prev,
red,red2>();
960 auto ito = vd.getDomainIterator();
968 vd_out.getLastPos()[0] = vd.getPos(p)[0];
969 vd_out.getLastPos()[1] = vd.getPos(p)[1];
970 vd_out.getLastPos()[2] = vd.getPos(p)[2];
972 vd_out.template getLastProp<0>() = vd.template getProp<type>(p);
974 vd_out.template getLastProp<1>()[0] = vd.template getProp<velocity>(p)[0];
975 vd_out.template getLastProp<1>()[1] = vd.template getProp<velocity>(p)[1];
976 vd_out.template getLastProp<1>()[2] = vd.template getProp<velocity>(p)[2];
981 vd_out.write_frame(
"Particles",write,VTK_WRITER | FORMAT_BINARY);
985 {std::cout <<
"TIME: " << t <<
" write " << it_time.
getwct() <<
" " << it_reb <<
" " << cnt <<
" Max visc: " << max_visc <<
" " << vd.size_local() << std::endl;}
990 {std::cout <<
"TIME: " << t <<
" " << it_time.
getwct() <<
" " << it_reb <<
" " << cnt <<
" Max visc: " << max_visc <<
" " << vd.size_local() << std::endl;}
995 std::cout <<
"Time to complete: " << tot_sim.
getwct() <<
" seconds" << std::endl;
1003 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.
auto getPos(vect_dist_key_dx vec_key) -> decltype(vPos.template get< 0 >(vec_key.getKey()))
Get the position of an element.
Model for Dynamic load balancing.
temporal buffer for reductions