def create_cell_manager(options): print 'creating cell manager', options # create a parallel cell manager. cell_manager = ParallelCellManager(arrays_to_bin=[], max_cell_scale=options.max_cell_scale, dimension=2, load_balancing=False, initialize=False) # enable load balancing cell_manager.load_balancer = LoadBalancer(parallel_cell_manager=cell_manager) cell_manager.load_balancer.skip_iteration = 1 cell_manager.load_balancer.threshold_ratio = 10. for i,pa in enumerate(create_particles(options)): cell_manager.arrays_to_bin.append(pa) print 'parray %d:'%i, pa.get_number_of_particles() cell_manager.initialize() print 'num_particles', cell_manager.get_number_of_particles() return cell_manager
def create_cell_manager(options): print 'creating cell manager', options # create a parallel cell manager. cell_manager = ParallelCellManager(arrays_to_bin=[], max_cell_scale=options.max_cell_scale, dimension=2, load_balancing=False, initialize=False) # enable load balancing cell_manager.load_balancer = LoadBalancer( parallel_cell_manager=cell_manager) cell_manager.load_balancer.skip_iteration = 1 cell_manager.load_balancer.threshold_ratio = 10. for i, pa in enumerate(create_particles(options)): cell_manager.arrays_to_bin.append(pa) print 'parray %d:' % i, pa.get_number_of_particles() cell_manager.initialize() print 'num_particles', cell_manager.get_number_of_particles() return cell_manager
from pysph.base.particle_array import ParticleArray from pysph.parallel.parallel_cell import ParallelCellManager from pysph.solver.basic_generators import LineGenerator from pysph.base.cell import INT_INF from pysph.base.point import * pcm = ParallelCellManager(initialize=False, dimension=1) parray = ParticleArray(name="parray") if rank == 0: lg = LineGenerator(start_point=Point(0, 0, 0), end_point=Point(1.0, 0, 0), particle_spacing=0.01) x, y, z = lg.get_coords() parray.add_property({"name": "x", "data": x}) parray.add_property({"name": "y", "data": y}) parray.add_property({"name": "z", "data": z}) parray.add_property({"name": "h"}) parray.align_particles() parray.h[:] = 0.01 else: parray.add_property({"name": "x"}) parray.add_property({"name": "y"}) parray.add_property({"name": "z"}) parray.add_property({"name": "h"}) pcm.add_array_to_bin(parray) pcm.initialize()
from pysph.base.particle_array import ParticleArray from pysph.parallel.parallel_cell import ParallelCellManager from pysph.solver.basic_generators import LineGenerator from pysph.base.cell import INT_INF from pysph.base.point import * pcm = ParallelCellManager(initialize=False, dimension=1) parray = ParticleArray(name='parray') if rank == 0: lg = LineGenerator(start_point=Point(0, 0, 0), end_point=Point(1.0, 0, 0), particle_spacing=0.01) x, y, z = lg.get_coords() parray.add_property({'name': 'x', 'data': x}) parray.add_property({'name': 'y', 'data': y}) parray.add_property({'name': 'z', 'data': z}) parray.add_property({'name': 'h'}) parray.align_particles() parray.h[:] = 0.01 else: parray.add_property({'name': 'x'}) parray.add_property({'name': 'y'}) parray.add_property({'name': 'z'}) parray.add_property({'name': 'h'}) pcm.add_array_to_bin(parray) pcm.initialize()
def test(): pcm = ParallelCellManager(initialize=False) # create 2 particles, one with proc 0 another with proc 1 lg = LineGenerator(particle_spacing=0.5) lg.start_point.x = 0.0 lg.end_point.x = 10.0 lg.start_point.y = lg.start_point.z = 0.0 lg.end_point.y = lg.end_point.z = 0.0 x, y, z = lg.get_coords() num_particles = len(x) logger.info('Num particles : %d'%(len(x))) parray = ParticleArray(name='p1', x={'data':x}, y={'data':y}, z={'data':z}, h={'data':None, 'default':0.5}) # add parray to the cell manager parray.add_property({'name':'u'}) parray.add_property({'name':'v'}) parray.add_property({'name':'w'}) parray.add_property({'name':'rho'}) parray.add_property({'name':'p'}) parray = LoadBalancer.distribute_particles(parray, num_procs, 1.0)[rank] pcm.add_array_to_bin(parray) np = pcm.arrays_to_bin[0].num_real_particles nptot = comm.bcast(comm.reduce(np)) assert nptot == num_particles pcm.initialize() np = pcm.arrays_to_bin[0].num_real_particles nptot = comm.bcast(comm.reduce(np)) assert nptot == num_particles pcm.set_jump_tolerance(INT_INF()) logger.debug('%d: num_cells=%d'%(rank,len(pcm.cells_dict))) logger.debug('%d:'%rank + ('\n%d '%rank).join([str(c) for c in pcm.cells_dict.values()])) # on processor 0 move all particles from one of its cell to the next cell if rank == 0: cell = pcm.cells_dict.get(list(pcm.proc_map.cell_map.values()[0])[0]) logger.debug('Cell is %s'%(cell)) indices = [] cell.get_particle_ids(indices) indices = indices[0] logger.debug('Num particles in Cell is %d'%(indices.length)) parr = cell.arrays_to_bin[0] x, y, z = parr.get('x', 'y', 'z', only_real_particles=False) logger.debug(str(len(x)) + str(x)) logger.debug(str(indices.length) + str(indices.get_npy_array())) for i in range(indices.length): x[indices[i]] += cell.cell_size parr.set_dirty(True) pcm.update_status() logger.debug('Calling cell manager update') logger.debug('Is dirty %s'%(pcm.is_dirty)) pcm.update() np = pcm.arrays_to_bin[0].num_real_particles nptot = comm.bcast(comm.reduce(np)) assert nptot == num_particles #logger.debug('hierarchy :%s'%(pcm.hierarchy_list)) logger.debug('cells : %s'%(pcm.cells_dict)) logger.debug('num particles : %d'%(parray.get_number_of_particles())) logger.debug('real particles : %d'%(parray.num_real_particles))