def __init__(self, size, dim=3, m=None, Consts=(0.3, 2.0), ocl_context=None): self.__dim = np.int(dim) self.__size = np.int(size) if ocl_context == None: self.__occ = occ.OpenCLcontext( size, dim, (occ.OCLC_X | occ.OCLC_A | occ.OCLC_M)) else: self.__occ = ocl_context self.__R = self.__occ.dtype(Consts[0]) self.__B = self.__occ.dtype(Consts[1]) self.__A = np.zeros((size, dim), dtype=self.__occ.dtype) if m != None: self.__occ.M_cla.set(self.__dtype(m), queue=self.__occ.CL_queue) self.__init_prog_cl()
def gravity_cluster(): if not test_pyopencl(): print("") print("Attention !!! ") print( " This demo works only with PyOpenCL: \n http://mathema.tician.de/software/pyopencl \n http://www.khronos.org/opencl/ \n " ) print(" Please install the package: python-pyopencl for continuing") print("") return G = 0.000001 steps = 100000000 n = 3000 dt = 0.04 pset = ps.ParticlesSet(n, dtype=np.float32) cs = clu.RandGalaxyCluster() print("Building initial galaxy .... ") cs.insert3(pset.X, M=pset.M, V=pset.V, G=G) try: occx = occ.OpenCLcontext( pset.size, pset.dim, (occ.OCLC_X | occ.OCLC_V | occ.OCLC_A | occ.OCLC_M)) except: print("") print("ERROR !!! ") print(" Please verify your opencl installation ") print(" Probably you must install your GPU OpenCL drivers") print("") return grav = gr.GravityOCL(pset.size, Consts=G, ocl_context=occx) grav.set_masses(pset.M) grav.update_force(pset) solver = els.EulerSolverOCL(grav, pset, dt, ocl_context=occx) a = aogl.AnimatedGl() a.draw_particles.set_draw_model(a.draw_particles.DRAW_MODEL_VECTOR) a.ode_solver = solver a.pset = pset a.steps = steps a.build_animation() a.start() return
def __init__(self, force, p_set, dt, ocl_context=None): super(EulerSolverOCL, self).__init__(force, p_set, dt) if ocl_context is None: self.__occ = occ.OpenCLcontext( self.pset.size, self.pset.dim, (occ.OCLC_X | occ.OCLC_V | occ.OCLC_A)) else: self.__occ = ocl_context self.__init_prog_cl()
def __init__(self , size , dim=3 , m=None , Consts=1.0 , ocl_context=None ): self.__dim = np.int( dim ) self.__size = np.int( size ) if ocl_context == None : self.__occ = occ.OpenCLcontext( size , dim , ( occ.OCLC_V | occ.OCLC_A | occ.OCLC_M ) ) else : self.__occ = ocl_context self.__dtype = self.__occ.dtype self.__K = self.__occ.dtype( Consts ) self.__A = np.zeros( ( size , dim ) , dtype=self.__occ.dtype ) self.__F = np.zeros( ( size , dim ) , dtype=self.__occ.dtype ) if m != None : self.set_masses( m ) self.__init_prog_cl()
def __init__(self, size, dim=3, m=None, Consts=(0.3, 2.0), domain=(-5.5, 5.5), ocl_context=None): self.__dim = np.int(dim) self.__size = np.int(size) if ocl_context == None: self.__occ = occ.OpenCLcontext( size, dim, (occ.OCLC_X | occ.OCLC_A | occ.OCLC_M)) else: self.__occ = ocl_context self.__R = self.__occ.dtype(Consts[0]) self.__B = self.__occ.dtype(Consts[1]) self.__A = np.zeros((size, dim), dtype=self.__occ.dtype) self.__Ix = np.zeros(size, dtype=np.uint32) self.__occ.add_array_by_name("Ix", dtype=np.uint32) self.__n_sub_dom = np.uint32((domain[1] - domain[0]) / (2.0 * self.__R) + 1.0) self.__sub_d_vec = np.zeros(self.__n_sub_dom + 1, dtype=self.__occ.dtype) self.__sub_d_bd[:] = np.arange(self.__n_sub_dom + 1) * (2.0 * self.__R) self.__sub_d_ind = np.zeros(self.__n_sub_dom + 1, dtype=np.uint32) if m != None: self.__occ.M_cla.set(self.__dtype(m), queue=self.__occ.CL_queue) self.__init_prog_cl()
def fountain(): """ Fountain demo """ steps = 10000000 dt = 0.005 pcnt = 100000 fl = True if test_pyopencl(): print("OpenCL is installed and enabled ") print(" Try, at least, 200000 particles ") while fl: try: print(" ") pcnt = int(raw_input('How many particles: ')) except: print("Please insert a number! ") else: fl = False pset = ps.ParticlesSet(pcnt, dtype=np.float32) pset.M[:] = 0.1 pset.X[:, 2] = 0.7 * np.random.rand(pset.size) grav = cf.ConstForce(pset.size, dim=pset.dim, u_force=(0.0, 0.0, -10.0)) occx = None if test_pyopencl(): occx = occ.OpenCLcontext( pset.size, pset.dim, (occ.OCLC_X | occ.OCLC_V | occ.OCLC_A | occ.OCLC_M)) drag = dr.DragOCL(pset.size, dim=pset.dim, Consts=0.01, ocl_context=occx) else: drag = dr.Drag(pset.size, dim=pset.dim, Consts=0.01) multi = mf.MultipleForce(pset.size, dim=pset.dim) multi.append_force(grav) multi.append_force(drag) multi.set_masses(pset.M) #solver = mds.MidpointSolver( multi , pset , dt ) if test_pyopencl(): solver = els.EulerSolverOCL(multi, pset, dt, ocl_context=occx) else: solver = els.EulerSolver(multi, pset, dt) solver.update_force() default_pos.sim_time = solver.get_sim_time() bd = (-100.0, 100.0, -100.0, 100.0, 0.0, 100.0) bound = db.DefaultBoundary(bd, dim=3, defualt_pos=default_pos) pset.set_boundary(bound) a = aogl.AnimatedGl() a.ode_solver = solver a.pset = pset a.steps = steps a.draw_particles.set_draw_model(a.draw_particles.DRAW_MODEL_VECTOR) a.init_rotation(-80, [0.7, 0.05, 0]) a.build_animation() a.start() return
def bubble(): """ Pseudo bubble simulation """ ocl_ok = test_pyopencl() if ocl_ok: pcnt = 9000 r_min = 0.5 occx = occ.OpenCLcontext(pcnt, 3) else: pcnt = 700 r_min = 1.5 steps = 1000000 dt = 0.01 rand_c = rc.RandCluster() pset = ps.ParticlesSet(pcnt, dtype=np.float32) rand_c.insert3(X=pset.X, M=pset.M, start_indx=0, n=pset.size, radius=3.0, mass_rng=(0.5, 0.8), r_min=0.0) if ocl_ok: bubble = pb.PseudoBubbleOCL(pset.size, pset.dim, Consts=(r_min, 10)) drag = dr.DragOCL(pset.size, pset.dim, Consts=0.01) else: bubble = pb.PseudoBubble(pset.size, pset.dim, Consts=(r_min, 10)) drag = dr.Drag(pset.size, pset.dim, Consts=0.01) constf = cf.ConstForce(pset.size, dim=pset.dim, u_force=[0, 0, -10.0]) multif = mf.MultipleForce(pset.size, pset.dim) multif.append_force(bubble) multif.append_force(constf) multif.append_force(drag) multif.set_masses(pset.M) #solver = els.EulerSolver( multif , pset , dt ) #solver = lps.LeapfrogSolver( multif , pset , dt ) solver = svs.StormerVerletSolver(multif, pset, dt) #solver = rks.RungeKuttaSolver( lennard_jones , pset , dt ) #solver = mds.MidpointSolver( lennard_jones , pset , dt ) bound = rb.ReboundBoundary(bound=(-5.0, 5.0)) pset.set_boundary(bound) a = aogl.AnimatedGl() a.ode_solver = solver a.pset = pset a.steps = steps if ocl_ok: a.draw_particles.set_draw_model(a.draw_particles.DRAW_MODEL_VECTOR) a.init_rotation(-80, [0.7, 0.05, 0]) a.build_animation() a.start() return