def test_voxelizationRoutine(): # Test if FileNotFoundError is raised with pytest.raises(FileNotFoundError): voxelizationRoutine(12597856985475) # create an temporary input file for user defined statistics cwd = os.getcwd() json_dir = cwd + '/json_files' dump_dir = cwd + '/dump_files' stat_inp = cwd + '/stat_input.json' # create an temporary 'json' directory for reading files from to_write = { 'Equivalent diameter': { 'std': 0.531055, 'mean': 2.76736, 'cutoff_min': 1.0, 'cutoff_max': 2.0 }, 'Aspect ratio': { 'mean': 2.5 }, 'Orientation': { 'sigma': 28.8, 'mean': 87.4 }, 'RVE': { 'side_length': 3, 'voxel_per_side': 10 }, 'Simulation': { 'nsteps': 1000, 'periodicity': 'True', 'output_units': 'mm' } } with open(stat_inp, 'w') as outfile: json.dump(to_write, outfile, indent=2) particleStatGenerator(stat_inp) # create an temporary 'dump' directory for reading files from with open(json_dir + '/RVE_data.json') as json_file: RVE_data = json.load(json_file) with open(json_dir + '/particle_data.json') as json_file: particle_data = json.load(json_file) sim_box = Simulation_Box(RVE_data['RVE_size'], RVE_data['RVE_size'], RVE_data['RVE_size']) Particles = particle_generator(particle_data, sim_box) write_dump(Particles, sim_box, len(Particles)) voxelizationRoutine(0) assert os.path.isfile(json_dir + '/nodeDict.json') assert os.path.isfile(json_dir + '/elmtDict.json') assert os.path.isfile(json_dir + '/elmtSetDict.json') os.remove(stat_inp) shutil.rmtree(json_dir) shutil.rmtree(dump_dir)
def test_voxelizationRoutine(): # create an temporary input file for user defined statistics cwd = os.getcwd() json_dir = cwd + '/json_files' dump_dir = cwd + '/dump_files' stat_inp = cwd + '/input_test.json' # create an temporary 'json' directory for reading files from to_write = { 'Grain type': 'Elongated', 'Equivalent diameter': { 'std': 0.531055, 'mean': 2.76736, 'cutoff_min': 1.0, 'cutoff_max': 2.0 }, 'Aspect ratio': { 'std': 0.3, 'mean': 2.5, 'cutoff_min': 2.0, 'cutoff_max': 4.0 }, 'Tilt angle': { 'std': 28.8, 'mean': 87.4, "cutoff_min": 75.0, "cutoff_max": 105.0 }, 'RVE': { "sideX": 3, "sideY": 3, "sideZ": 3, "Nx": 15, "Ny": 15, "Nz": 15 }, 'Simulation': { 'periodicity': 'True', 'output_units': 'mm' } } with open(stat_inp, 'w') as outfile: json.dump(to_write, outfile, indent=2) RVEcreator(stat_inp) # create an temporary 'dump' directory for reading files from with open(json_dir + '/RVE_data.json') as json_file: RVE_data = json.load(json_file) with open(json_dir + '/particle_data.json') as json_file: particle_data = json.load(json_file) sim_box = Simulation_Box(RVE_data['RVE_sizeX'], RVE_data['RVE_sizeY'], RVE_data['RVE_sizeZ']) sim_box.sim_ts = 500 Particles = particle_generator(particle_data, sim_box) write_dump(Particles, sim_box, len(Particles)) voxelizationRoutine() assert os.path.isfile(json_dir + '/nodeDict.json') assert os.path.isfile(json_dir + '/elmtDict.json') assert os.path.isfile(json_dir + '/elmtSetDict.json') os.remove(stat_inp) shutil.rmtree(json_dir) shutil.rmtree(dump_dir)
def particle_grow(sim_box, Ellipsoids, periodicity, nsteps): """ Initializes the :class:`entities.Octree` class and performs recursive subdivision with collision checks and response for the ellipsoids. At each time step of the simulation it increases the size of the ellipsoid by a factor, which depends on the user-defined value for total number of time steps. :param sim_box: Simulation box representing RVE. :type sim_box: :obj:`entities.Simulation_Box` :param Ellipsoids: Ellipsoids for the packing routine. :type Ellipsoids: list :param periodicity: Status of periodicity. :type periodicity: boolean :param nsteps: Total simulation steps. :type nsteps: int .. note:: :meth:`kanapy.input_output.write_dump` function is called at each time step of the simulation to write output (.dump) files. By default, periodic images are written to the output file, but this option can be disabled within the function. """ # Reduce the size of the particles to (1/nsteps)th of its original size for ell in Ellipsoids: ell.a, ell.b, ell.c = ell.oria / nsteps, ell.orib / nsteps, ell.oric / nsteps # Simulation loop for particle growth and interaction steps for i in tqdm(range(nsteps + 1)): # Initialize Octree and test for collision between ellipsoids tree = Octree( 0, Cuboid(sim_box.left, sim_box.top, sim_box.right, sim_box.bottom, sim_box.front, sim_box.back), Ellipsoids) tree.update() # Dump the ellipsoid information to be read by OVITO (Includes duplicates at periodic boundaries) write_dump(Ellipsoids, sim_box, len(Ellipsoids)) # Delete duplicates if existing (Active only if periodicity is True) # find all the items which are not duplicates inter_ell = [ell for ell in Ellipsoids if not isinstance(ell.id, str)] Ellipsoids = inter_ell # Dump the ellipsoid information to be read by OVITO (Doesn't include duplicates at periodic boundaries) #write_dump(Ellipsoids, sim_box, len(Ellipsoids)) dups = [] # Loop over the ellipsoids: move, set Bbox, & check for wall collision / PBC for ellipsoid in Ellipsoids: # Move the ellipsoid according to collision status ellipsoid.move() # grow the ellipsoid ellipsoid.growth(nsteps) # Check for wall collision or create duplicates ell_dups = ellipsoid.wallCollision(sim_box, periodicity) dups.extend(ell_dups) # Update the BBox of the ellipsoid ellipsoid.set_cub() # Update the actual list with duplicates Ellipsoids.extend(dups) # Update the simulation time sim_box.sim_ts += 1 return