def calculate_force(self, particle, node=None): if node is None: node = self.root force = Vector2d(0, 0) if len(node.particles) == 0: return force if (node.type == 2) and (node.particles[0] != particle): tmp_f = forces.base_force(particle, node.particles[0]) # print(particle.name, node.name, node.depth, len(node.particles)) force += tmp_f cm = node.get_cm() if (node.type == 1) and (mac.mac(particle, node)): # print(particle.name, node.name) # print(particle.name, node.name, node.depth, len(node.particles)) tmp_f = forces.base_force(particle, Particle(r=cm, v=node.get_mv(), mass=node.mass)) force += tmp_f if (node.type == 1) and not(mac.mac(particle, node)): for child in node.children: force += self.calculate_force(particle, child) return force
def calculate_force(self, particle, node=None): if node is None: node = self.root force = Vector2d(0, 0) if len(node.particles) == 0: return force # if (node.type == 2) and (abs(node.particles[0].r - particle.r) != 0): if (node.type == 2) and (node.particles[0] != particle): tmp_f = forces.base_force(particle, node.particles[0]) # print(particle.name, node.name, node.depth, len(node.particles)) # if particle.name == constants.median: # tmp_brute_f = Vector2d() # for particle_brute in node.particles: # tmp_brute_f += forces.base_force(particle, particle_brute) # # len_error = (abs(tmp_f) - abs(tmp_brute_f)) / (abs(tmp_brute_f) + constants.epsilon) # print(len_error, '|', tmp_f, '|', tmp_brute_f) force += tmp_f cm = node.get_cm() if (node.type == 1) and (mac.mac(particle, node)): # print(particle.name, node.name) # print(particle.name, node.name, node.depth, len(node.particles)) tmp_f = forces.base_force( particle, Particle(r=cm, v=node.get_mv(), mass=node.mass, name='aprox')) a = 0.1 b = 0.8 tmp_color = ((b - a) * np.random.random() + a, (b - a) * np.random.random() + a, (b - a) * np.random.random() + a) self.save_particles += len(node.particles) - 1 for particle_color in node.particles: particle_color.color = tmp_color if particle.name == constants.median: tmp_brute_f = Vector2d() for particle_brute in node.particles: tmp_brute_f += forces.base_force(particle, particle_brute) len_error = (abs(tmp_f) - abs(tmp_brute_f)) / ( abs(tmp_brute_f) + constants.epsilon) print(len_error, '|', tmp_f, '|', abs(tmp_f), '|', tmp_brute_f, '|', abs(tmp_brute_f)) force += tmp_f if (node.type == 1) and not (mac.mac(particle, node)): for child in node.children: force += self.calculate_force(particle, child) return force
if not os.path.exists(save_path): os.makedirs(save_path) particles = io_xyz.read(input_path, mode='Nick') print('Number of particles before: ', len(particles)) (center, radii, rotation) = getMinVolEllipse( np.array([[particle.r.x, particle.r.y, particle.r.z] for particle in particles], dtype='float32')) for particle in particles: particle.force = Vector3d() for i, p1 in enumerate(particles): print(i) for p2 in particles[i + 1:]: tmp_force = forces.base_force(p1, p2) p1.force += tmp_force p2.force += -tmp_force for particle in particles: R = np.sqrt(particle.r.y ** 2 + particle.r.z ** 2) velocity = np.sqrt(abs(particle.force) * R / particle.mass) e = Vector3d() e.x = particle.r.x e.y = particle.r.y e.z = 0 tmp_vel = e * (1 / abs(e)) * velocity # rotate pi/2 tmp = tmp_vel.x
# if particle != particle2: # brute_force += forces.base_force(particle, particle2) # # r = particle.r - cm # r = np.dot(rot, [r.x, r.y]) # r = Vector2d(r[0], r[1]) # tmp_v = r * (1/abs(r)) * abs((r.dot(brute_force)/abs(r))) # particle.v = tmp_v * 0.1 ######## # Nice! for i, particle in enumerate(particles): print(i) brute_force = Vector2d(0, 0) for particle2 in particles: if particle != particle2: brute_force += forces.base_force(particle, particle2) r = particle.r - cm r = np.dot(rot, [r.x, r.y]) r = Vector2d(r[0], r[1]) # tmp_v = r * (1/abs(r)) * np.sqrt(abs((r.dot(brute_force)))/particle.mass) tmp_v = r * (1 / abs(r)) * np.sqrt( abs(brute_force) * abs(r) / particle.mass) angle_a = np.pi / 24 angle_b = np.pi / 12 # particle.v = tmp_v.rotate(np.random.sample() * 2 * angle - angle) particle.v = tmp_v.rotate(np.random.sample() * angle_b + (angle_b - angle_a)) ######## # for i, particle in enumerate(particles): # brute_force = Vector2d(0, 0)