コード例 #1
0
    def setUp(self):
        magnet1 = MagnetModel(0.1, 0.6, 0.8)
        magnet2 = MagnetModel(1.1, -0.3, 1.8)
        magnet3 = MagnetModel(-0.1, 0.45, -0.4)

        self.magnets = [magnet1, magnet2, magnet3]

        self.plane_distance = 0.25
        self.friction = 0.3
        self.gravity_pullback = 0.5

        self.pendulum = PendulumModel(self.friction, self.gravity_pullback,
                                      self.plane_distance)
        self.pendulum.magnets = self.magnets
コード例 #2
0
    def setUp(self):
        magnet1 = MagnetModel(1.0, 0.0, 1.5)
        magnet2 = MagnetModel(-1.0, 1.0, 1.5)
        magnet3 = MagnetModel(-1.0, -1.0, 1.5)
        magnet4 = MagnetModel(0.0, 0.0, 0.5)

        self.magnets = [magnet1, magnet2, magnet3, magnet4]

        self.plane_distance = 0.25
        self.friction = 0.3
        self.gravity_pullback = 0.5

        self.pendulum = PendulumModel(self.friction, self.gravity_pullback,
                                      self.plane_distance)
        self.pendulum.magnets = self.magnets

        self.time_step = 0.01
        self.integrator = EulerIntegrator(self.time_step)

        self.r = 255
        self.g = 0
        self.b = 0
        self.image_generator = BasicImageGenerator(self.r, self.g, self.b)

        self.size = 5
        self.resolution = 640
        self.basins_generator = BasinsGenerator(self.size, self.resolution)
        self.basins_generator.pendulum_model = self.pendulum
        self.basins_generator.integrator = self.integrator
        self.basins_generator.image_generator = self.image_generator
コード例 #3
0
 def setUp(self):
     magnet1 = MagnetModel(0.1, 0.6, 0.8)
     magnet2 = MagnetModel(1.1, -0.3, 1.8)
     magnet3 = MagnetModel(-0.1, 0.45, -0.4)
     
     self.magnets = [magnet1, magnet2,  magnet3]
     
     self.plane_distance = 0.25        
     self.friction = 0.3
     self.gravity_pullback = 0.5
     
     self.pendulum = PendulumModel(self.friction, self.gravity_pullback, self.plane_distance)
     self.pendulum.magnets = self.magnets
コード例 #4
0
class TestPendulumModel(unittest.TestCase):
    def setUp(self):
        magnet1 = MagnetModel(0.1, 0.6, 0.8)
        magnet2 = MagnetModel(1.1, -0.3, 1.8)
        magnet3 = MagnetModel(-0.1, 0.45, -0.4)

        self.magnets = [magnet1, magnet2, magnet3]

        self.plane_distance = 0.25
        self.friction = 0.3
        self.gravity_pullback = 0.5

        self.pendulum = PendulumModel(self.friction, self.gravity_pullback,
                                      self.plane_distance)
        self.pendulum.magnets = self.magnets

    def test_pendulum_model_initalization(self):
        self.assertEqual(self.pendulum.friction, self.friction)
        self.assertEqual(self.pendulum.gravity_pullback, self.gravity_pullback)
        self.assertEqual(self.pendulum.plane_distance, self.plane_distance)
        self.assertEqual(len(self.pendulum.magnets), len(self.magnets))

    def test_prepare_gpu_source(self):
        self.pendulum.prepare_gpu_source()

        gpu_source = """
            __device__ inline void diff_eq(float &ax, float &ay, float &x, float &y, float &vx, float &vy) { 
                
                const float kf = 0.3f;
                const float kg = 0.5f;
                const float d2 = 0.25f * 0.25f;
                 
                const int n = 3; 
      
                const float xm[n] = {0.1f, 1.1f, -0.1f};
                const float ym[n] = {0.6f, -0.3f, 0.45f};
                const float km[n] = {0.8f, 1.8f, -0.4f};                
                
                float amx = 0.0f;
                float amy = 0.0f;
                             
                for (int i = 0 ; i < n ; i++) {
                    float deltaX = xm[i] - x;
                    float deltaY = ym[i] - y;
                    
                    float dist = sqrtf(deltaX * deltaX + deltaY * deltaY + d2);
                    float distPow3 = dist * dist * dist;
                
                    amx += km[i] * deltaX / distPow3;
                    amy += km[i] * deltaY / distPow3;
                }
                      
                ax = -kf * vx - kg * x + amx;
                ay = -kf * vy - kg * y + amy;
            }
    
            __device__ int determineMagnet(float &x, float &y, float delta) {
                bool m0dx = ((0.1f - delta) <= x) && (x <= (0.1f + delta));
                bool m0dy = ((0.6f - delta) <= y) && (y <= (0.6f + delta));
   
                if (m0dx && m0dy) {
                    return 0;
                } 
            
                bool m1dx = ((1.1f - delta) <= x) && (x <= (1.1f + delta));
                bool m1dy = ((-0.3f - delta) <= y) && (y <= (-0.3f + delta));
   
                if (m1dx && m1dy) {
                    return 1;
                } 
            
                bool m2dx = ((-0.1f - delta) <= x) && (x <= (-0.1f + delta));
                bool m2dy = ((0.45f - delta) <= y) && (y <= (0.45f + delta));
   
                if (m2dx && m2dy) {
                    return 2;
                }  
                                           
                return -1; 
            }
            """

        gpu_source = "".join(gpu_source.split())
        pendulum_gpu_source = "".join(self.pendulum.gpu_source.split())

        self.assertEqual(pendulum_gpu_source, gpu_source)
コード例 #5
0
class TestPendulumModel(unittest.TestCase):
    
    def setUp(self):
        magnet1 = MagnetModel(0.1, 0.6, 0.8)
        magnet2 = MagnetModel(1.1, -0.3, 1.8)
        magnet3 = MagnetModel(-0.1, 0.45, -0.4)
        
        self.magnets = [magnet1, magnet2,  magnet3]
        
        self.plane_distance = 0.25        
        self.friction = 0.3
        self.gravity_pullback = 0.5
        
        self.pendulum = PendulumModel(self.friction, self.gravity_pullback, self.plane_distance)
        self.pendulum.magnets = self.magnets
    
    def test_pendulum_model_initalization(self):
        self.assertEqual(self.pendulum.friction, self.friction)
        self.assertEqual(self.pendulum.gravity_pullback, self.gravity_pullback)
        self.assertEqual(self.pendulum.plane_distance, self.plane_distance)
        self.assertEqual(len(self.pendulum.magnets), len(self.magnets))

    def test_prepare_gpu_source(self):
        self.pendulum.prepare_gpu_source()
        
        gpu_source = """
            __device__ inline void diff_eq(float &ax, float &ay, float &x, float &y, float &vx, float &vy) { 
                
                const float kf = 0.3f;
                const float kg = 0.5f;
                const float d2 = 0.25f * 0.25f;
                 
                const int n = 3; 
      
                const float xm[n] = {0.1f, 1.1f, -0.1f};
                const float ym[n] = {0.6f, -0.3f, 0.45f};
                const float km[n] = {0.8f, 1.8f, -0.4f};                
                
                float amx = 0.0f;
                float amy = 0.0f;
                             
                for (int i = 0 ; i < n ; i++) {
                    float deltaX = xm[i] - x;
                    float deltaY = ym[i] - y;
                    
                    float dist = sqrtf(deltaX * deltaX + deltaY * deltaY + d2);
                    float distPow3 = dist * dist * dist;
                
                    amx += km[i] * deltaX / distPow3;
                    amy += km[i] * deltaY / distPow3;
                }
                      
                ax = -kf * vx - kg * x + amx;
                ay = -kf * vy - kg * y + amy;
            }
    
            __device__ int determineMagnet(float &x, float &y, float delta) {
                bool m0dx = ((0.1f - delta) <= x) && (x <= (0.1f + delta));
                bool m0dy = ((0.6f - delta) <= y) && (y <= (0.6f + delta));
   
                if (m0dx && m0dy) {
                    return 0;
                } 
            
                bool m1dx = ((1.1f - delta) <= x) && (x <= (1.1f + delta));
                bool m1dy = ((-0.3f - delta) <= y) && (y <= (-0.3f + delta));
   
                if (m1dx && m1dy) {
                    return 1;
                } 
            
                bool m2dx = ((-0.1f - delta) <= x) && (x <= (-0.1f + delta));
                bool m2dy = ((0.45f - delta) <= y) && (y <= (0.45f + delta));
   
                if (m2dx && m2dy) {
                    return 2;
                }  
                                           
                return -1; 
            }
            """
            
        gpu_source = "".join(gpu_source.split())
        pendulum_gpu_source = "".join(self.pendulum.gpu_source.split())
 
        self.assertEqual(pendulum_gpu_source, gpu_source)