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>
471 template<
class v_cell>
473 int k=ijk/
nxy,ijkt=ijk-
nxy*k,j=ijkt/
nx,i=ijkt-j*
nx;
489 container_poly(
double ax_,
double bx_,
double ay_,
double by_,
double az_,
double bz_,
490 int nx_,
int ny_,
int nz_,
bool xperiodic_,
bool yperiodic_,
bool zperiodic_,
int init_mem);
492 void put(
int n,
double x,
double y,
double z,
double r);
494 void import(FILE *fp=stdin);
503 inline void import(
const char* filename) {
504 FILE *fp=safe_fopen(filename,
"r");
518 FILE *fp=safe_fopen(filename,
"r");
527 template<
class c_loop>
532 fprintf(fp,
"%d %g %g %g %g\n",
id[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
546 FILE *fp=safe_fopen(filename,
"w");
553 template<
class c_loop>
558 fprintf(fp,
"// id %d\nsphere{<%g,%g,%g>,%g}\n",
559 id[vl.ijk][vl.q],*pp,pp[1],pp[2],pp[3]);
571 FILE *fp=safe_fopen(filename,
"w");
579 template<
class c_loop>
583 pp=
p[vl.ijk]+
ps*vl.q;
598 FILE *fp=safe_fopen(filename,
"w");
606 template<
class c_loop>
610 fprintf(fp,
"// cell %d\n",
id[vl.ijk][vl.q]);
611 pp=
p[vl.ijk]+
ps*vl.q;
626 FILE *fp=safe_fopen(filename,
"w");
635 template<
class c_loop>
637 int ijk,q;
double *pp;
641 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
647 ijk=vl.ijk;q=vl.q;pp=
p[ijk]+
ps*q;
660 template<
class v_cell,
class c_loop>
672 template<
class v_cell>
674 int k=ijk/
nxy,ijkt=ijk-
nxy*k,j=ijkt/
nx,i=ijkt-j*
nx;
678 void print_custom(
const char *format,
const char *filename);
679 bool find_voronoi_cell(
double x,
double y,
double z,
double &rx,
double &ry,
double &rz,
int &pid);