10 #ifndef VOROPP_CONTAINER_HH
11 #define VOROPP_CONTAINER_HH
36 virtual bool point_inside(
double x,
double y,
double z) = 0;
76 for(
wall **wp=
walls;wp<
wep;wp++)
if(!((*wp)->point_inside(x,y,z)))
return false;
85 template<
class c_
class>
87 for(
wall **wp=
walls;wp<
wep;wp++)
if(!((*wp)->cut_cell(c,x,y,z)))
return false;
161 container_base(
double ax_,
double bx_,
double ay_,
double by_,
double az_,
double bz_,
162 int nx_,
int ny_,
int nz_,
bool xperiodic_,
bool yperiodic_,
bool zperiodic_,
163 int init_mem,
int ps_);
188 template<
class v_cell>
190 int &i,
int &j,
int &k,
double &x,
double &y,
double &z,
int &disp) {
191 double x1,x2,y1,y2,z1,z2,*pp=
p[ijk]+
ps*q;
192 x=*(pp++);y=*(pp++);z=*pp;
196 c.init(x1,x2,y1,y2,z1,z2);
198 disp=ijk-i-
nx*(j+
ny*k);
215 disp=ijk-i-
nx*(j+
ny*k);
224 inline void frac_pos(
double x,
double y,
double z,
double ci,
double cj,
double ck,
225 double &fx,
double &fy,
double &fz) {
243 inline int region_index(
int ci,
int cj,
int ck,
int ei,
int ej,
int ek,
double &qx,
double &qy,
double &qz,
int &disp) {
247 return disp+ei+
nx*(ej+
ny*ek);
253 FILE *fp=safe_fopen(filename,
"w");
261 FILE *fp=safe_fopen(filename,
"w");
269 for(
int *cop=
co+1;cop<
co+
nxyz;cop++) tp+=*cop;
275 inline bool put_remap(
int &ijk,
double &x,
double &y,
double &z);
276 inline bool remap(
int &ai,
int &aj,
int &ak,
int &ci,
int &cj,
int &ck,
double &x,
double &y,
double &z,
int &ijk);
287 container(
double ax_,
double bx_,
double ay_,
double by_,
double az_,
double bz_,
288 int nx_,
int ny_,
int nz_,
bool xperiodic_,
bool yperiodic_,
bool zperiodic_,
int init_mem);
290 void put(
int n,
double x,
double y,
double z);
292 void import(FILE *fp=stdin);
301 inline void import(
const char* filename) {
302 FILE *fp=safe_fopen(filename,
"r");
316 FILE *fp=safe_fopen(filename,
"r");
325 template<
class c_loop>
330 fprintf(fp,
"%d %g %g %g\n",
id[vl.ijk][vl.q],*pp,pp[1],pp[2]);
342 FILE *fp=safe_fopen(filename,
"w");
349 template<
class c_loop>
354 fprintf(fp,
"// id %d\nsphere{<%g,%g,%g>,s}\n",
355 id[vl.ijk][vl.q],*pp,pp[1],pp[2]);
367 FILE *fp=safe_fopen(filename,
"w");
375 template<
class c_loop>
379 pp=
p[vl.ijk]+
ps*vl.q;
394 FILE *fp=safe_fopen(filename,
"w");
402 template<
class c_loop>
406 fprintf(fp,
"// cell %d\n",
id[vl.ijk][vl.q]);
407 pp=
p[vl.ijk]+
ps*vl.q;
422 FILE *fp=safe_fopen(filename,
"w");
431 template<
class c_loop>
433 int ijk,q;
double *pp;
437 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
438 c.
output_custom(format,
id[ijk][q],*pp,pp[1],pp[2],default_radius,fp);
443 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
444 c.
output_custom(format,
id[ijk][q],*pp,pp[1],pp[2],default_radius,fp);
449 void print_custom(
const char *format,
const char *filename);
450 bool find_voronoi_cell(
double x,
double y,
double z,
double &rx,
double &ry,
double &rz,
int &pid);
459 template<
class v_cell,
class c_loop>
461 return vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
471 template<
class v_cell>
473 int k=ijk/
nxy,ijkt=ijk-
nxy*k,j=ijkt/
nx,i=ijkt-j*
nx;
474 return vc.compute_cell(c,ijk,q,i,j,k);
484 template<
class v_cell>
488 double *pp=
p[ijk]+3*
co[ijk]++;
489 *(pp++)=x;*(pp++)=y;*pp=z;
509 container_poly(
double ax_,
double bx_,
double ay_,
double by_,
double az_,
double bz_,
510 int nx_,
int ny_,
int nz_,
bool xperiodic_,
bool yperiodic_,
bool zperiodic_,
int init_mem);
512 void put(
int n,
double x,
double y,
double z,
double r);
514 void import(FILE *fp=stdin);
523 inline void import(
const char* filename) {
524 FILE *fp=safe_fopen(filename,
"r");
538 FILE *fp=safe_fopen(filename,
"r");
547 template<
class c_loop>
552 fprintf(fp,
"%d %g %g %g %g\n",
id[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
566 FILE *fp=safe_fopen(filename,
"w");
573 template<
class c_loop>
578 fprintf(fp,
"// id %d\nsphere{<%g,%g,%g>,%g}\n",
579 id[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
591 FILE *fp=safe_fopen(filename,
"w");
599 template<
class c_loop>
603 pp=
p[vl.ijk]+
ps*vl.q;
618 FILE *fp=safe_fopen(filename,
"w");
626 template<
class c_loop>
630 fprintf(fp,
"// cell %d\n",
id[vl.ijk][vl.q]);
631 pp=
p[vl.ijk]+
ps*vl.q;
646 FILE *fp=safe_fopen(filename,
"w");
655 template<
class c_loop>
657 int ijk,q;
double *pp;
661 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
667 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
680 template<
class v_cell,
class c_loop>
682 return vc.compute_cell(c,vl.ijk,vl.q,vl.i,vl.j,vl.k);
692 template<
class v_cell>
694 int k=ijk/
nxy,ijkt=ijk-
nxy*k,j=ijkt/
nx,i=ijkt-j*
nx;
695 return vc.compute_cell(c,ijk,q,i,j,k);
706 template<
class v_cell>
711 *(pp++)=x;*(pp++)=y;*(pp++)=z;*pp=r;
720 void print_custom(
const char *format,
const char *filename);
721 bool find_voronoi_cell(
double x,
double y,
double z,
double &rx,
double &ry,
double &rz,
int &pid);
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)
Extension of the voronoicell_base class to represent a Voronoi cell with neighbor information...
bool remap(int &ai, int &aj, int &ak, int &ci, int &cj, int &ck, double &x, double &y, double &z, int &ijk)
Class for looping over all of the particles in a container.
void draw_gnuplot(double x, double y, double z, FILE *fp=stdout)
double sum_cell_volumes()
void draw_cells_gnuplot(FILE *fp=stdout)
bool put_remap(int &ijk, double &x, double &y, double &z)
Class containing all of the routines that are specific to computing the radical Voronoi tessellation...
void draw_cells_gnuplot(const char *filename)
void draw_cells_pov(FILE *fp=stdout)
void increase_wall_memory()
Header file for the classes encapsulating functionality for the regular and radical Voronoi tessellat...
Header file for the loop classes.
Class containing data structures common across all particle container classes.
void draw_particles(FILE *fp=stdout)
void draw_particles_pov(c_loop &vl, FILE *fp)
void draw_domain_gnuplot(const char *filename)
void draw_particles_pov(c_loop &vl, FILE *fp)
A class for storing a list of pointers to walls.
Header file for the voronoicell and related classes.
Master configuration file for setting various compile-time options.
void draw_domain_gnuplot(FILE *fp=stdout)
int region_index(int ci, int cj, int ck, int ei, int ej, int ek, double &qx, double &qy, double &qz, int &disp)
Header file for the voro_compute template and related classes.
Extension of the container_base class for computing regular Voronoi tessellations.
bool find_voronoi_cell(double x, double y, double z, double &rx, double &ry, double &rz, int &pid)
void draw_cells_gnuplot(c_loop &vl, FILE *fp)
void draw_cells_pov(c_loop &vl, FILE *fp)
container_base(double ax_, double bx_, double ay_, double by_, double az_, double bz_, int nx_, int ny_, int nz_, bool xperiodic_, bool yperiodic_, bool zperiodic_, int init_mem, int ps_)
void draw_domain_pov(const char *filename)
bool put_locate_block(int &ijk, double &x, double &y, double &z)
bool compute_ghost_cell(v_cell &c, double x, double y, double z)
container(double ax_, double bx_, double ay_, double by_, double az_, double bz_, int nx_, int ny_, int nz_, bool xperiodic_, bool yperiodic_, bool zperiodic_, int init_mem)
void draw_cells_pov(const char *filename)
void print_custom(c_loop &vl, const char *format, FILE *fp)
void draw_particles(const char *filename)
bool contains_neighbor(const char *format)
bool point_inside_walls(double x, double y, double z)
void draw_particles_pov(FILE *fp=stdout)
bool compute_cell(v_cell &c, int ijk, int q)
bool find_voronoi_cell(double x, double y, double z, double &rx, double &ry, double &rz, int &pid)
void draw_pov(double x, double y, double z, FILE *fp=stdout)
bool apply_walls(c_class &c, double x, double y, double z)
Class for representing a particle system in a three-dimensional rectangular box.
double sum_cell_volumes()
bool compute_cell(v_cell &c, int ijk, int q)
void initialize_search(int ci, int cj, int ck, int ijk, int &i, int &j, int &k, int &disp)
void put(int n, double x, double y, double z)
bool compute_cell(v_cell &c, c_loop &vl)
container_poly(double ax_, double bx_, double ay_, double by_, double az_, double bz_, int nx_, int ny_, int nz_, bool xperiodic_, bool yperiodic_, bool zperiodic_, int init_mem)
virtual bool point_inside(double x, double y, double z)=0
Pure virtual class from which wall objects are derived.
Header file for the base Voronoi container class.
Header file for the small helper functions.
Extension of the container_base class for computing radical Voronoi tessellations.
void draw_particles_pov(const char *filename)
void output_custom(const char *format, FILE *fp=stdout)
void draw_cells_pov(c_loop &vl, FILE *fp)
void draw_particles(c_loop &vl, FILE *fp)
Extension of the voronoicell_base class to represent a Voronoi cell without neighbor information...
void draw_particles_pov(const char *filename)
bool compute_ghost_cell(v_cell &c, double x, double y, double z, double r)
void put(int n, double x, double y, double z, double r)
void draw_cells_gnuplot(FILE *fp=stdout)
Template for carrying out Voronoi cell computations.
void draw_particles(FILE *fp=stdout)
void draw_cells_pov(FILE *fp=stdout)
void draw_particles_pov(FILE *fp=stdout)
void draw_cells_gnuplot(c_loop &vl, FILE *fp)
void print_custom(c_loop &vl, const char *format, FILE *fp)
bool compute_cell(v_cell &c, c_loop &vl)
void add_particle_memory(int i)
void draw_cells_pov(const char *filename)
void draw_particles(c_loop &vl, FILE *fp)
A class for storing ordering information when particles are added to a container. ...
void frac_pos(double x, double y, double z, double ci, double cj, double ck, double &fx, double &fy, double &fz)
virtual bool cut_cell(voronoicell &c, double x, double y, double z)=0
void draw_particles(const char *filename)
void draw_domain_pov(FILE *fp=stdout)
Class containing all of the routines that are specific to computing the regular Voronoi tessellation...
void draw_cells_gnuplot(const char *filename)
bool point_inside(double x, double y, double z)