1 // Voro++, a 3D cell-based Voronoi library 2 // 3 // Author : Chris H. Rycroft (LBL / UC Berkeley) 4 // Email : chr@alum.mit.edu 5 // Date : August 30th 2011 6 7 /** \file unitcell.hh 8 * \brief Header file for the unitcell class. */ 9 10 #ifndef VOROPP_UNITCELL_HH 11 #define VOROPP_UNITCELL_HH 12 13 #include <vector> 14 using namespace std; 15 16 #include "config.hh" 17 #include "cell.hh" 18 19 namespace voro { 20 21 /** \brief Class for computation of the unit Voronoi cell associated with 22 * a 3D non-rectangular periodic domain. */ 23 class unitcell { 24 public: 25 /** The x coordinate of the first vector defining the periodic 26 * domain. */ 27 const double bx; 28 /** The x coordinate of the second vector defining the periodic 29 * domain. */ 30 const double bxy; 31 /** The y coordinate of the second vector defining the periodic 32 * domain. */ 33 const double by; 34 /** The x coordinate of the third vector defining the periodic 35 * domain. */ 36 const double bxz; 37 /** The y coordinate of the third vector defining the periodic 38 * domain. */ 39 const double byz; 40 /** The z coordinate of the third vector defining the periodic 41 * domain. */ 42 const double bz; 43 /** The computed unit Voronoi cell corresponding the given 44 * 3D non-rectangular periodic domain geometry. */ 45 voronoicell unit_voro; 46 unitcell(double bx_,double bxy_,double by_,double bxz_,double byz_,double bz_); 47 /** Draws an outline of the domain in Gnuplot format. 48 * \param[in] filename the filename to write to. */ draw_domain_gnuplot(const char * filename)49 inline void draw_domain_gnuplot(const char* filename) { 50 FILE *fp(safe_fopen(filename,"w")); 51 draw_domain_gnuplot(fp); 52 fclose(fp); 53 } 54 void draw_domain_gnuplot(FILE *fp=stdout); 55 /** Draws an outline of the domain in Gnuplot format. 56 * \param[in] filename the filename to write to. */ draw_domain_pov(const char * filename)57 inline void draw_domain_pov(const char* filename) { 58 FILE *fp(safe_fopen(filename,"w")); 59 draw_domain_pov(fp); 60 fclose(fp); 61 } 62 void draw_domain_pov(FILE *fp=stdout); 63 bool intersects_image(double dx,double dy,double dz,double &vol); 64 void images(vector<int> &vi,vector<double> &vd); 65 protected: 66 /** The maximum y-coordinate that could possibly cut the 67 * computed unit Voronoi cell. */ 68 double max_uv_y; 69 /** The maximum z-coordinate that could possibly cut the 70 * computed unit Voronoi cell. */ 71 double max_uv_z; 72 private: 73 inline void unit_voro_apply(int i,int j,int k); 74 bool unit_voro_intersect(int l); 75 inline bool unit_voro_test(int i,int j,int k); 76 }; 77 78 } 79 80 #endif 81