UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
container.hh
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2// Modified version of Voro++'s source file
3
4// Voro++, a 3D cell-based Voronoi library
5//
6// Author : Chris H. Rycroft (LBL / UC Berkeley)
7// Email : chr@alum.mit.edu
8// Date : August 30th 2011
9
13#ifndef VOROPP_CONTAINER_HH
14#define VOROPP_CONTAINER_HH
15
16#include <cstdio>
17#include <vector>
18
19#include "config.hh"
20#include "common.hh"
21#include "v_base.hh"
22#include "cell.hh"
23#include "c_loops.hh"
24#include "v_compute.hh"
25#include "rad_option.hh"
26
27namespace voro {
28
34class wall {
35 public:
36 virtual ~wall() {}
39 virtual bool point_inside(double x,double y,double z) const = 0;
42 virtual bool cut_cell(voronoicell &c,double x,double y,double z) const = 0;
45 virtual bool cut_cell(voronoicell_neighbor &c,double x,double y,double z) const = 0;
46};
47
55class wall_list {
56 public:
62 wall_list();
63 wall_list(const wall_list& Other) = delete;
65 wall_list(wall_list&& Other) noexcept : walls(Other.walls), wep(Other.wep), wel(Other.wel), current_wall_size(Other.current_wall_size)
66 {
67 Other.walls = nullptr;
68 }
70 {
71 if (this != &Other)
72 {
73 walls = Other.walls;
74 wep = Other.wep;
75 wel = Other.wel;
76 current_wall_size = Other.current_wall_size;
77 Other.walls = nullptr;
78 }
79 return *this;
80 }
81 ~wall_list();
84 inline void add_wall(wall *w) {
86 *(wep++)=w;
87 }
90 inline void add_wall(wall &w) {add_wall(&w);}
91 void add_wall(wall_list &wl);
96 inline bool point_inside_walls(double x,double y,double z) const {
97 for(wall **wp=walls;wp<wep;wp++) if(!((*wp)->point_inside(x,y,z))) return false;
98 return true;
99 }
106 template<class c_class>
107 bool apply_walls(c_class &c,double x,double y,double z) const {
108 for(wall **wp=walls;wp<wep;wp++) if(!((*wp)->cut_cell(c,x,y,z))) return false;
109 return true;
110 }
111 void deallocate();
112 protected:
119};
120
136class container_base : public voro_base, public wall_list {
137 public:
139 const double ax;
141 const double bx;
143 const double ay;
145 const double by;
147 const double az;
149 const double bz;
152 const bool xperiodic;
155 const bool yperiodic;
158 const bool zperiodic;
161 int **id;
165 double **p;
168 int *co;
174 int *mem;
181 const int ps;
182 container_base(double ax_,double bx_,double ay_,double by_,double az_,double bz_,
183 int nx_,int ny_,int nz_,bool xperiodic_,bool yperiodic_,bool zperiodic_,
184 int init_mem,int ps_);
188 ax(Other.ax), bx(Other.bx), ay(Other.ay), by(Other.by), az(Other.az), bz(Other.bz),
189 xperiodic(Other.xperiodic), yperiodic(Other.yperiodic), zperiodic(Other.zperiodic),
190 id(Other.id), p(Other.p), co(Other.co), mem(Other.mem), ps(Other.ps)
191 {
192 Other.id = nullptr;
193 Other.p = nullptr;
194 Other.co = nullptr;
195 Other.mem = nullptr;
196 }
197 // Note: Move assignment not implemented due to const members on this class (and it has not been needed yet)
199
201 bool point_inside(double x,double y,double z) const;
202 void region_count() const;
224 template<class v_cell>
225 inline bool initialize_voronoicell(v_cell &c,int ijk,int q,int ci,int cj,int ck,
226 int &i,int &j,int &k,double &x,double &y,double &z,int &disp) const {
227 double x1,x2,y1,y2,z1,z2,*pp=p[ijk]+ps*q;
228 x=*(pp++);y=*(pp++);z=*pp;
229 if(xperiodic) {x1=-(x2=0.5*(bx-ax));i=nx;} else {x1=ax-x;x2=bx-x;i=ci;}
230 if(yperiodic) {y1=-(y2=0.5*(by-ay));j=ny;} else {y1=ay-y;y2=by-y;j=cj;}
231 if(zperiodic) {z1=-(z2=0.5*(bz-az));k=nz;} else {z1=az-z;z2=bz-z;k=ck;}
232 c.init(x1,x2,y1,y2,z1,z2);
233 if(!apply_walls(c,x,y,z)) return false;
234 disp=ijk-i-nx*(j+ny*k);
235 return true;
236 }
247 inline void initialize_search(int ci,int cj,int ck,int ijk,int &i,int &j,int &k,int &disp) const {
248 i=xperiodic?nx:ci;
249 j=yperiodic?ny:cj;
250 k=zperiodic?nz:ck;
251 disp=ijk-i-nx*(j+ny*k);
252 }
260 inline void frac_pos(double x,double y,double z,double ci,double cj,double ck,
261 double &fx,double &fy,double &fz) const {
262 fx=x-ax-boxx*ci;
263 fy=y-ay-boxy*cj;
264 fz=z-az-boxz*ck;
265 }
279 inline int region_index(int ci,int cj,int ck,int ei,int ej,int ek,double &qx,double &qy,double &qz,int &disp) const {
280 if(xperiodic) {if(ci+ei<nx) {ei+=nx;qx=-(bx-ax);} else if(ci+ei>=(nx<<1)) {ei-=nx;qx=bx-ax;} else qx=0;}
281 if(yperiodic) {if(cj+ej<ny) {ej+=ny;qy=-(by-ay);} else if(cj+ej>=(ny<<1)) {ej-=ny;qy=by-ay;} else qy=0;}
282 if(zperiodic) {if(ck+ek<nz) {ek+=nz;qz=-(bz-az);} else if(ck+ek>=(nz<<1)) {ek-=nz;qz=bz-az;} else qz=0;}
283 return disp+ei+nx*(ej+ny*ek);
284 }
287 inline int total_particles() const {
288 int tp=*co;
289 for(int *cop=co+1;cop<co+nxyz;cop++) tp+=*cop;
290 return tp;
291 }
292 protected:
293 void add_particle_memory(int i);
294 bool put_locate_block(int &ijk,double &x,double &y,double &z);
295 inline bool put_remap(int &ijk,double &x,double &y,double &z) const;
296 inline bool remap(int &ai,int &aj,int &ak,int &ci,int &cj,int &ck,double &x,double &y,double &z,int &ijk) const;
297};
298
305class container : public container_base, public radius_mono {
306 public:
307 container(double ax_,double bx_,double ay_,double by_,double az_,double bz_,
308 int nx_,int ny_,int nz_,bool xperiodic_,bool yperiodic_,bool zperiodic_,int init_mem);
310
311 void clear();
312 void put(int n,double x,double y,double z);
313 void put(particle_order &vo,int n,double x,double y,double z);
316 bool find_voronoi_cell(double x,double y,double z,double &rx,double &ry,double &rz,int &pid,voro_compute<container>& vc) const;
317
326 template<class v_cell,class c_loop>
328 return vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
329 }
338 template<class v_cell>
339 inline bool compute_cell(v_cell &c,int ijk,int q,voro_compute<container>& vc) const {
340 int k=ijk/nxy,ijkt=ijk-nxy*k,j=ijkt/nx,i=ijkt-j*nx;
341 return vc.compute_cell(c,ijk,q,i,j,k);
342 }
351 template<class v_cell>
352 inline bool compute_ghost_cell(v_cell &c,double x,double y,double z,voro_compute<container>& vc) {
353 int ijk;
354 if(put_locate_block(ijk,x,y,z)) {
355 double *pp=p[ijk]+3*co[ijk]++;
356 *(pp++)=x;*(pp++)=y;*pp=z;
357 bool q=compute_cell(c,ijk,co[ijk]-1,vc);
358 co[ijk]--;
359 return q;
360 }
361 return false;
362 }
363 private:
364 friend class voro_compute<container>;
365};
366
374 public:
375 container_poly(double ax_,double bx_,double ay_,double by_,double az_,double bz_,
376 int nx_,int ny_,int nz_,bool xperiodic_,bool yperiodic_,bool zperiodic_,int init_mem);
378
379 void clear();
380 void put(int n,double x,double y,double z,double r);
381 void put(particle_order &vo,int n,double x,double y,double z,double r);
392 template<class v_cell,class c_loop>
394 return vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
395 }
404 template<class v_cell>
405 inline bool compute_cell(v_cell &c,int ijk,int q,voro_compute<container>& vc) const {
406 int k=ijk/nxy,ijkt=ijk-nxy*k,j=ijkt/nx,i=ijkt-j*nx;
407 return vc.compute_cell(c,ijk,q,i,j,k);
408 }
418 template<class v_cell>
419 inline bool compute_ghost_cell(v_cell &c,double x,double y,double z,double r,voro_compute<container>& vc) {
420 int ijk;
421 if(put_locate_block(ijk,x,y,z)) {
422 double *pp=p[ijk]+4*co[ijk]++,tm=max_radius;
423 *(pp++)=x;*(pp++)=y;*(pp++)=z;*pp=r;
424 if(r>max_radius) max_radius=r;
425 bool q=compute_cell(c,ijk,co[ijk]-1);
426 co[ijk]--;max_radius=tm;
427 return q;
428 }
429 return false;
430 }
431 bool find_voronoi_cell(double x,double y,double z,double &rx,double &ry,double &rz,int &pid,voro_compute<container>& vc) const;
432 private:
433 friend class voro_compute<container_poly>;
434};
435
436}
437
438#endif
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
Header file for the loop classes.
Header file for the voronoicell and related classes.
Class for representing a particle system in a three-dimensional rectangular box.
Definition container.hh:136
bool put_remap(int &ijk, double &x, double &y, double &z) const
Definition container.cc:189
const bool yperiodic
Definition container.hh:155
double ** p
Definition container.hh:165
bool put_locate_block(int &ijk, double &x, double &y, double &z)
Definition container.cc:169
const int ps
Definition container.hh:181
const double bz
Definition container.hh:149
int ** id
Definition container.hh:161
bool remap(int &ai, int &aj, int &ak, int &ci, int &cj, int &ck, double &x, double &y, double &z, int &ijk) const
Definition container.cc:218
~container_base()
Definition container.cc:47
int * mem
Definition container.hh:174
int total_particles() const
Definition container.hh:287
const bool xperiodic
Definition container.hh:152
const double az
Definition container.hh:147
bool initialize_voronoicell(v_cell &c, int ijk, int q, int ci, int cj, int ck, int &i, int &j, int &k, double &x, double &y, double &z, int &disp) const
Definition container.hh:225
container_base & operator=(const container_base &Other)=delete
container_base(container_base &&Other) noexcept
Definition container.hh:187
container_base & operator=(container_base &&Other)=delete
int * co
Definition container.hh:168
void add_particle_memory(int i)
Definition container.cc:320
const double ax
Definition container.hh:139
const double ay
Definition container.hh:143
void region_count() const
Definition container.cc:345
const bool zperiodic
Definition container.hh:158
void frac_pos(double x, double y, double z, double ci, double cj, double ck, double &fx, double &fy, double &fz) const
Definition container.hh:260
bool point_inside(double x, double y, double z) const
Definition container.cc:413
container_base(container_base &Other)=delete
const double by
Definition container.hh:145
int region_index(int ci, int cj, int ck, int ei, int ej, int ek, double &qx, double &qy, double &qz, int &disp) const
Definition container.hh:279
void initialize_search(int ci, int cj, int ck, int ijk, int &i, int &j, int &k, int &disp) const
Definition container.hh:247
const double bx
Definition container.hh:141
Extension of the container_base class for computing radical Voronoi tessellations.
Definition container.hh:373
void clear()
Definition container.cc:358
bool compute_cell(v_cell &c, int ijk, int q, voro_compute< container > &vc) const
Definition container.hh:405
voro_compute< container_poly > make_compute() const
Definition container.cc:69
bool find_voronoi_cell(double x, double y, double z, double &rx, double &ry, double &rz, int &pid, voro_compute< container > &vc) const
Definition container.cc:290
void put(int n, double x, double y, double z, double r)
Definition container.cc:118
bool compute_cell(v_cell &c, c_loop &vl, voro_compute< container > &vc) const
Definition container.hh:393
void compute_all_cells(voro_compute< container > &vc)
Definition container.cc:378
double sum_cell_volumes(voro_compute< container > &vc)
Definition container.cc:400
bool compute_ghost_cell(v_cell &c, double x, double y, double z, double r, voro_compute< container > &vc)
Definition container.hh:419
Extension of the container_base class for computing regular Voronoi tessellations.
Definition container.hh:305
void clear()
Definition container.cc:352
bool compute_ghost_cell(v_cell &c, double x, double y, double z, voro_compute< container > &vc)
Definition container.hh:352
void put(int n, double x, double y, double z)
Definition container.cc:105
voro_compute< container > make_compute() const
Definition container.cc:63
double sum_cell_volumes(voro_compute< container > &vc)
Definition container.cc:388
bool find_voronoi_cell(double x, double y, double z, double &rx, double &ry, double &rz, int &pid, voro_compute< container > &vc) const
Definition container.cc:252
bool compute_cell(v_cell &c, c_loop &vl, voro_compute< container > &vc) const
Definition container.hh:327
void compute_all_cells(voro_compute< container > &vc)
Definition container.cc:367
bool compute_cell(v_cell &c, int ijk, int q, voro_compute< container > &vc) const
Definition container.hh:339
A class for storing ordering information when particles are added to a container.
Definition c_loops.hh:44
Class containing all of the routines that are specific to computing the regular Voronoi tessellation.
Definition rad_option.hh:27
Class containing all of the routines that are specific to computing the radical Voronoi tessellation.
Definition rad_option.hh:89
double max_radius
Definition rad_option.hh:100
Class containing data structures common across all particle container classes.
Definition v_base.hh:28
const double boxy
Definition v_base.hh:46
const int nxyz
Definition v_base.hh:42
const int ny
Definition v_base.hh:33
const int nx
Definition v_base.hh:31
const int nxy
Definition v_base.hh:39
const int nz
Definition v_base.hh:35
const double boxx
Definition v_base.hh:44
const double boxz
Definition v_base.hh:48
Template for carrying out Voronoi cell computations.
Definition v_compute.hh:42
Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information.
Definition cell.hh:327
Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information.
Definition cell.hh:222
A class for storing a list of pointers to walls.
Definition container.hh:55
wall_list()
Definition container.cc:419
wall ** wel
Definition container.hh:116
wall_list(const wall_list &Other)=delete
void deallocate()
Definition container.cc:435
wall_list(wall_list &&Other) noexcept
Definition container.hh:65
wall_list & operator=(wall_list &&Other)
Definition container.hh:69
int current_wall_size
Definition container.hh:118
~wall_list()
Definition container.cc:424
bool point_inside_walls(double x, double y, double z) const
Definition container.hh:96
void add_wall(wall &w)
Definition container.hh:90
bool apply_walls(c_class &c, double x, double y, double z) const
Definition container.hh:107
wall_list & operator=(const wall_list &Other)=delete
wall ** wep
Definition container.hh:61
wall ** walls
Definition container.hh:58
void add_wall(wall *w)
Definition container.hh:84
void increase_wall_memory()
Definition container.cc:440
Pure virtual class from which wall objects are derived.
Definition container.hh:34
virtual ~wall()
Definition container.hh:36
virtual bool cut_cell(voronoicell &c, double x, double y, double z) const =0
virtual bool cut_cell(voronoicell_neighbor &c, double x, double y, double z) const =0
virtual bool point_inside(double x, double y, double z) const =0
Header file for the small helper functions.
Master configuration file for setting various compile-time options.
Definition c_loops.cc:15
Header file for the classes encapsulating functionality for the regular and radical Voronoi tessellat...
Header file for the base Voronoi container class.
Header file for the voro_compute template and related classes.