Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F83053752
loops.cc
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sat, Sep 14, 23:12
Size
2 KB
Mime Type
text/x-c
Expires
Mon, Sep 16, 23:12 (2 d)
Engine
blob
Format
Raw Data
Handle
20787915
Attached To
rLAMMPS lammps
loops.cc
View Options
// Example code demonstrating the loop classes
//
// Author : Chris H. Rycroft (LBL / UC Berkeley)
// Email : chr@alum.mit.edu
// Date : August 30th 2011
#include "voro++.hh"
using namespace voro;
// Constants determining the configuration of the tori
const double dis=1.25,mjrad=2.5,mirad=0.95,trad=mjrad+mirad;
// Set the number of particles that are going to be randomly introduced
const int particles=100000;
// This function returns a random double between 0 and 1
double rnd() {return double(rand())/RAND_MAX;}
int main() {
int i;
double x,y,z,r;
voronoicell c;
// Create a container as a non-periodic 10 by 10 by 10 box
container con(-5,5,-5,5,-5,5,26,26,26,false,false,false,8);
particle_order po;
// Randomly add particles into the container
for(i=0;i<particles;i++) {
x=10*rnd()-5;
y=10*rnd()-5;
z=10*rnd()-5;
// If the particle lies within the first torus, store it in the
// ordering class when adding to the container
r=sqrt((x-dis)*(x-dis)+y*y);
if((r-mjrad)*(r-mjrad)+z*z<mirad) con.put(po,i,x,y,z);
else con.put(i,x,y,z);
}
// Compute Voronoi cells for the first torus. Here, the points
// previously stored in the ordering class are looped over.
FILE *f1=safe_fopen("loops1_m.pov","w");
FILE *f2=safe_fopen("loops1_v.pov","w");
c_loop_order clo(con,po);
if(clo.start()) do if(con.compute_cell(c,clo)) {
// Get the position of the current particle under consideration
clo.pos(x,y,z);
// Save a POV-Ray mesh to one file and a cylinder/sphere
// representation to the other file
c.draw_pov_mesh(x,y,z,f1);
c.draw_pov(x,y,z,f2);
} while (clo.inc());
fclose(f1);
fclose(f2);
// Compute Voronoi cells for the second torus. Here, the subset loop is
// used to search over the blocks overlapping the torus, and then each
// particle is individually tested.
f1=safe_fopen("loops2_m.pov","w");
f2=safe_fopen("loops2_v.pov","w");
c_loop_subset cls(con);
cls.setup_box(-dis-trad,-dis+trad,-mirad,mirad,-trad,trad,false);
if(cls.start()) do {
// Get the position of the current particle under consideration
cls.pos(x,y,z);
// Test whether this point is within the torus, and if so,
// compute and save the Voronoi cell
r=sqrt((x+dis)*(x+dis)+z*z);
if((r-mjrad)*(r-mjrad)+y*y<mirad&&con.compute_cell(c,cls)) {
c.draw_pov_mesh(x,y,z,f1);
c.draw_pov(x,y,z,f2);
}
} while (cls.inc());
fclose(f1);
fclose(f2);
}
Event Timeline
Log In to Comment