예제 #1
0
    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
예제 #2
0
파일: bh_tree.py 프로젝트: Stasiche/Space
    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
예제 #3
0
파일: test228.py 프로젝트: Stasiche/Space
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
예제 #4
0
파일: diplom2.py 프로젝트: Stasiche/Space
#         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)