Ejemplo n.º 1
0
 def __getattr__(self,attr):
     #print "constructing: ",attr
     if attr == "d":
         return self.d.tocsr()
     elif attr == "star":
         self.complex.construct_hodge()
         return self.star
     elif attr == "star_inv":
         self.complex.construct_hodge()
         return self.star_inv
     elif attr == "circumcenter":
         self.complex.compute_circumcenters(self.dim)
         return self.circumcenter
     elif attr == "primal_volume":
         self.complex.compute_primal_volume(self.dim)
         return self.primal_volume
     elif attr == "dual_volume":
         self.complex.compute_dual_volume()
         return self.dual_volume
     elif attr == "simplex_to_index":
         self.simplex_to_index = dict(zip([simplex(x) for x in self.simplices],xrange(len(self.simplices))))
         return self.simplex_to_index
     elif attr == "index_to_simplex":
         self.simplex_to_index = dict(zip(xrange(len(self.simplices)),[simplex(x) for x in self.simplices]))
         return self.simplex_to_index
     else:
         raise AttributeError, attr + " not found"
Ejemplo n.º 2
0
 def __getattr__(self,attr):
     #print "constructing: ",attr
     if attr == "d":
         return self.d.tocsr()
     elif attr == "star":
         self.complex.construct_hodge()
         return self.star
     elif attr == "star_inv":
         self.complex.construct_hodge()
         return self.star_inv
     elif attr == "circumcenter":
         self.complex.compute_circumcenters(self.dim)
         return self.circumcenter
     elif attr == "bary_circumcenter":
         self.complex.compute_bary_circumcenters(self.dim)
         return self.bary_circumcenter
     elif attr == "primal_volume":
         self.complex.compute_primal_volume(self.dim)
         return self.primal_volume
     elif attr == "dual_volume":
         self.complex.compute_dual_volume()
         return self.dual_volume
     elif attr == "simplex_to_index":
         self.simplex_to_index = dict((simplex(x), i) for i, x in enumerate(self.simplices))
         return self.simplex_to_index
     elif attr == "index_to_simplex":
         self.index_to_simplex = dict((i, simplex(x)) for i, x in enumerate(self.simplices))
         return self.index_to_simplex
     else:
         raise AttributeError(attr + " not found")
Ejemplo n.º 3
0
    def compute_dual_volume(self):
        """Compute dual volumes for simplices of all dimensions
        """
        for dim,data in enumerate(self):
            data.dual_volume = zeros((data.num_simplices,))

        temp_centers = zeros((self.complex_dimension()+1,self.embedding_dimension()))
        for i,s in enumerate(self.simplices):
            self.__compute_dual_volume(simplex(s),temp_centers,self.complex_dimension())
Ejemplo n.º 4
0
    def test_d_two_triangles(self):
        v,e = matrix([[0,0],[1,0],[0,1],[1,1]]),matrix([[1,3,2],[2,0,1]])
        sc  = simplicial_complex((v,e))
        
        assert_equal(sc[0].d.shape,(5,4))
        assert_equal(sc[1].d.shape,(2,5))       

        #d0
        edge01 = sc[1].simplex_to_index[simplex((0,1))]
        edge02 = sc[1].simplex_to_index[simplex((0,2))]
        edge12 = sc[1].simplex_to_index[simplex((1,2))]
        edge13 = sc[1].simplex_to_index[simplex((1,3))]
        edge23 = sc[1].simplex_to_index[simplex((2,3))]        
        
        assert_equal(sc[0].d[edge01,0],-1)
        assert_equal(sc[0].d[edge01,1], 1)

        assert_equal(sc[0].d[edge02,0],-1)
        assert_equal(sc[0].d[edge02,2], 1)

        assert_equal(sc[0].d[edge12,1],-1)
        assert_equal(sc[0].d[edge12,2], 1)

        assert_equal(sc[0].d[edge13,1],-1)
        assert_equal(sc[0].d[edge13,3], 1)

        assert_equal(sc[0].d[edge23,2],-1)
        assert_equal(sc[0].d[edge23,3], 1)

        assert_equal(sc[1].d[1,edge01], 1)
        assert_equal(sc[1].d[1,edge12], 1)
        assert_equal(sc[1].d[1,edge02],-1)

        assert_equal(sc[1].d[0,edge23],-1)
        assert_equal(sc[1].d[0,edge12],-1)
        assert_equal(sc[1].d[0,edge13], 1)
Ejemplo n.º 5
0
    def compute_dual_volume(self):
        """Compute dual volumes for simplices of all dimensions
        """
        for dim, data in enumerate(self):
            data.dual_volume = zeros((data.num_simplices, ))

        temp_centers = zeros(
            (self.complex_dimension() + 1, self.embedding_dimension()))
        temp_bcenters = [
            zeros(dim) for dim in range(1,
                                        self.complex_dimension() + 2)
        ]
        temp_signs = ones(self.complex_dimension() + 1)
        for i, s in enumerate(self.simplices):
            self.__compute_dual_volume(simplex(s), None, temp_centers,
                                       temp_bcenters, temp_signs,
                                       self.complex_dimension())
Ejemplo n.º 6
0
def test_get_set():
    V = array([[0,0],[1,0],[0.5,sqrt(3.0)/2.0]]) 
    S = array([[0,1,2]]) 
    sc = simplicial_complex((V,S))
    
    c0 = sc.get_cochain(0)
    assert_equal(c0[0],0)
    assert_equal(c0[0],0)
    assert_equal(c0[0],0)        
    
    c0[simplex([0],parity=0)] = 10
    c0[simplex([1],parity=0)] = 20
    c0[simplex([2],parity=1)] = 30        
    assert_equal(c0[simplex([0],parity=0)],10)
    assert_equal(c0[simplex([1],parity=1)],-20)
    assert_equal(c0[simplex([2],parity=1)],30)
    assert_equal(c0[0],10)
    assert_equal(c0[1],20)
    assert_equal(c0[2],-30)
Ejemplo n.º 7
0
    def check_skeleton(self):
        """Test the skeleton() method"""

        assert_equal(simplicial_mesh(array([[0]]),array([[0]])).skeleton(0), \
                        set([simplex([0])]))        
        assert_equal(simplicial_mesh(array([[0],[1]]),array([[0,1]])).skeleton(0), \
                        set([simplex([0]),simplex([1])]))        
        assert_equal(simplicial_mesh(array([[0],[1]]),array([[0,1]])).skeleton(1), \
                        set([simplex([0,1])]))
        assert_equal(simplicial_mesh(array([[0],[1],[2]]),array([[0,1],[1,2]])).skeleton(0),\
                        set([simplex([0]),simplex([1]),simplex([2])]))
        assert_equal(simplicial_mesh(array([[0],[1],[2]]),array([[0,1],[1,2]])).skeleton(1),\
                        set([simplex([0,1]),simplex([1,2])]))
        assert_equal(simplicial_mesh(array([[0,0],[1,0],[0,1]]),array([[0,1,2]])).skeleton(1),\
                        set([simplex([0,1]),simplex([1,2]),simplex([2,0])]))
Ejemplo n.º 8
0
 def check_boundary(self):
     """Test the boundary() method"""
     
     boundaries = []
     boundaries.append([simplex([0],parity=1),simplex([1],parity=0)])
     boundaries.append([simplex([0],parity=1),simplex([2],parity=0)])
     boundaries.append([simplex([0],parity=1),simplex([3],parity=0)])
     boundaries.append([])
     boundaries.append([simplex([0,1]),simplex([1,2]),simplex([2,0])])
     boundaries.append([simplex([0,1]),simplex([1,3]),simplex([3,2]),simplex([2,0])])
     boundaries.append([simplex([1,0,2]),simplex([0,1,3]),simplex([2,0,3]),simplex([1,2,3])])
     boundaries.append([simplex([1,0,2]),simplex([0,1,3]),simplex([2,0,3]),simplex([2,3,4]),simplex([1,4,3]),simplex([1,2,4])])
     
     cases = zip(self.meshes,boundaries)
     
     for (v,s),b in cases:
         sm = simplicial_mesh(v,s)                           
         sb = sm.boundary()
         assert_equal(sb,set(b))
         
         for x in sb:         
             assert_equal(x.parity,b[b.index(x)].parity)
Ejemplo n.º 9
0
 def test_hodge_star(self):
     """Test the hodge * operator"""
     regular_cases = []
     #Unit line segment
     regular_cases.append((matrix([[0],[1]]),matrix([[0,1]]),[1,1],[0.5,1]))
     #One regular triangle, edge length 1
     regular_cases.append((matrix([[0,0],[1,0],[0.5,sqrt(3.0)/2.0]]),matrix([[0,1,2]]), [1, 1, sqrt(3.0)/4.0],\
                         [sqrt(3.0)/12.0,sqrt(3.0)/6.0,1]))
     # One regular tet, edge length sqrt(2)
     regular_cases.append((matrix([[0, 0, 0], [0, 1, 1], [1, 0, 1], [1, 1, 0]]),matrix([[0,1,2,3]]),\
                         [1, sqrt(2.0),sqrt(3.0/4.0), 1.0/3.0],[1.0/12.0,sqrt(2.0)/12.0,sqrt(3.0/36.0),1]))
     
     for v,e,primal,dual in regular_cases:
         sc = simplicial_complex((v,e))
         for dim in range(sc.complex_dimension() + 1):
             (n,m) = sc[dim].star.shape
             for i in range(n):                    
                 assert_almost_equal( sc[dim].star[i,i], dual[dim]/primal[dim] )
     
     
     multi_cases = []
     #two line segments
     multi_cases.append((matrix([[0],[1],[2]]),matrix([[0,1],[1,2]]), \
                     [([0],0.5),([1],1.0),([2],0.5),([0,1],1),([1,2],1)]))
     #three line segments
     multi_cases.append((matrix([[0],[1],[2],[3]]),matrix([[0,1],[1,2],[2,3]]), \
                     [([0],0.5),([1],1.0),([2],1),([3],0.5),([0,1],1),([1,2],1),([2,3],1)]))
     #two triangles
     multi_cases.append((matrix([[0,0],[1.0,0],[0.5,sqrt(3.0)/2.0],[1.5,sqrt(3.0)/2.0]]), \
                     matrix([[0,1,2],[1,3,2]]), \
                     [([0],sqrt(3.0)/12.0),([1],2*sqrt(3.0)/12.0),([2],2*sqrt(3.0)/12.0), ([3],sqrt(3.0)/12.0), \
                     ([0,1],sqrt(3.0)/6.0),([0,2],sqrt(3.0)/6.0),([1,2],2*sqrt(3.0)/6.0),([1,3],sqrt(3.0)/6.0), \
                     ([2,3],sqrt(3.0)/6.0),([0,1,2],4.0/sqrt(3.0)),([1,2,3],4.0/sqrt(3.0))]))
     #three triangles
     multi_cases.append((matrix([[0,0],[1.0,0],[0.5,sqrt(3.0)/2.0],[1.5,sqrt(3.0)/2.0],[2,0]]), \
                     matrix([[0,1,2],[1,3,2],[1,4,3]]), \
                     [([0],sqrt(3.0)/12.0),([1],3*sqrt(3.0)/12.0),([2],2*sqrt(3.0)/12.0), ([3],2*sqrt(3.0)/12.0), \
                     ([4],sqrt(3.0)/12.0),([0,1],sqrt(3.0)/6.0),([0,2],sqrt(3.0)/6.0),([1,2],2*sqrt(3.0)/6.0),
                     ([1,3],2*sqrt(3.0)/6.0), ([1,4],sqrt(3.0)/6.0),([3,4],sqrt(3.0)/6.0),\
                     ([2,3],sqrt(3.0)/6.0),([0,1,2],4.0/sqrt(3.0)),([1,2,3],4.0/sqrt(3.0)),([1,4,3],4.0/sqrt(3.0))]))
     
     
     for v,e,t_list in multi_cases:        
         sc = simplicial_complex((v,e))
         for s,ratio in t_list:
             data = sc[len(s)-1]
             index = data.simplex_to_index[simplex(s)]
             assert_almost_equal(ratio,data.star[index,index])
           
         
     #use the same multi_cases, but add dimensions and translate the vertices    
     #TODO rotate also
     random.seed(0)
     for v,e,t_list in multi_cases:
     
         (rows,cols) = v.shape
         v = concatenate([v,zeros((rows,4))],1)            
         v += rand(1,cols +4) #translate
         
         sc = simplicial_complex((v,e))
         for s,ratio in t_list:
             data = sc[len(s)-1]
             index = data.simplex_to_index[simplex(s)]
             assert_almost_equal(ratio,data.star[index,index])
         
     #Test sign of dual star,  check that:   ** = -1 ^(k (n-k))
     for v,e,t_list in multi_cases:
         sc = simplicial_complex((v,e))
         for dim,data in enumerate(sc):
             n = sc.complex_dimension()
             k = dim
             assert_almost_equal((data.star * data.star_inv).todense(), \
                                 ((-1)**(k*(n-k))*sparse.identity(data.num_simplices)).todense())
Ejemplo n.º 10
0
    def test_d_one_triangle(self):
        #sorted test
        v,e = matrix([[0,0],[1,0],[0,1]]),matrix([[0,1,2]])
        sc  = simplicial_complex((v,e))
        assert_equal(sc[0].d.shape,(3,3))

        #d0
        row = sc[1].simplex_to_index[simplex((0,1))]
        assert_equal(sc[0].d[row,0],-1)
        assert_equal(sc[0].d[row,1], 1)

        row = sc[1].simplex_to_index[simplex((1,2))]
        assert_equal(sc[0].d[row,1],-1)
        assert_equal(sc[0].d[row,2], 1)

        row = sc[1].simplex_to_index[simplex((0,2))]
        assert_equal(sc[0].d[row,0],-1)
        assert_equal(sc[0].d[row,2], 1)

        #d1
        col = sc[1].simplex_to_index[simplex((0,1))]
        assert_equal(sc[1].d[0,col], 1)

        col = sc[1].simplex_to_index[simplex((0,2))]
        assert_equal(sc[1].d[0,col],-1)

        col = sc[1].simplex_to_index[simplex((1,2))]
        assert_equal(sc[1].d[0,col], 1)

        #reversed test
        v,e = matrix([[0,0],[1,0],[0,1]]),matrix([[0,2,1]])
        sc  = simplicial_complex((v,e))
        assert_equal(sc[0].d.shape,(3,3))

        #d0
        row = sc[1].simplex_to_index[simplex((0,1))]
        assert_equal(sc[0].d[row,0],-1)
        assert_equal(sc[0].d[row,1], 1)

        row = sc[1].simplex_to_index[simplex((1,2))]
        assert_equal(sc[0].d[row,1],-1)
        assert_equal(sc[0].d[row,2], 1)

        row = sc[1].simplex_to_index[simplex((0,2))]
        assert_equal(sc[0].d[row,0],-1)
        assert_equal(sc[0].d[row,2], 1)

        #d1
        col = sc[1].simplex_to_index[simplex((0,1))]
        assert_equal(sc[1].d[0,col],-1)

        col = sc[1].simplex_to_index[simplex((0,2))]
        assert_equal(sc[1].d[0,col], 1)

        col = sc[1].simplex_to_index[simplex((1,2))]
        assert_equal(sc[1].d[0,col],-1)
Ejemplo n.º 11
0
    def test_d_two_tets(self):
        """
        Check d0,d1,d2 for a mesh with two tets
        """
        v,e = matrix([[0,0,0],[1,0,0],[0,1,0],[0,0,1],[1,1,1]]),matrix([[0,1,2,3],[1,2,3,4]])
        sc  = simplicial_complex((v,e))
        
        assert_equal(sc[0].d.shape,(9,5))
        assert_equal(sc[1].d.shape,(7,9))
        assert_equal(sc[2].d.shape,(2,7))

        #d0
        edge01 = sc[1].simplex_to_index[simplex((0,1))]
        edge02 = sc[1].simplex_to_index[simplex((0,2))]
        edge03 = sc[1].simplex_to_index[simplex((0,3))]
        edge12 = sc[1].simplex_to_index[simplex((1,2))]
        edge13 = sc[1].simplex_to_index[simplex((1,3))]
        edge23 = sc[1].simplex_to_index[simplex((2,3))]        
        edge14 = sc[1].simplex_to_index[simplex((1,4))]
        edge24 = sc[1].simplex_to_index[simplex((2,4))]
        edge34 = sc[1].simplex_to_index[simplex((3,4))]
        
        assert_equal(sc[0].d[edge01,0],-1)
        assert_equal(sc[0].d[edge01,1], 1)

        assert_equal(sc[0].d[edge02,0],-1)
        assert_equal(sc[0].d[edge02,2], 1)

        assert_equal(sc[0].d[edge03,0],-1)
        assert_equal(sc[0].d[edge03,3], 1)

        assert_equal(sc[0].d[edge12,1],-1)
        assert_equal(sc[0].d[edge12,2], 1)

        assert_equal(sc[0].d[edge13,1],-1)
        assert_equal(sc[0].d[edge13,3], 1)

        assert_equal(sc[0].d[edge23,2],-1)
        assert_equal(sc[0].d[edge23,3], 1)

        assert_equal(sc[0].d[edge14,1],-1)
        assert_equal(sc[0].d[edge14,4], 1)

        assert_equal(sc[0].d[edge24,2],-1)
        assert_equal(sc[0].d[edge24,4], 1)

        assert_equal(sc[0].d[edge34,3],-1)
        assert_equal(sc[0].d[edge34,4], 1)

        face123 = sc[2].simplex_to_index[simplex((1,2,3))]
        face023 = sc[2].simplex_to_index[simplex((0,2,3))]
        face013 = sc[2].simplex_to_index[simplex((0,1,3))]
        face012 = sc[2].simplex_to_index[simplex((0,1,2))]
        face124 = sc[2].simplex_to_index[simplex((1,2,4))]
        face134 = sc[2].simplex_to_index[simplex((1,3,4))]
        face234 = sc[2].simplex_to_index[simplex((2,3,4))]

        #d1
        assert_equal(sc[1].d[face012,edge12], 1)
        assert_equal(sc[1].d[face012,edge02],-1)
        assert_equal(sc[1].d[face012,edge01], 1)

        assert_equal(sc[1].d[face023,edge23], 1)
        assert_equal(sc[1].d[face023,edge03],-1)
        assert_equal(sc[1].d[face023,edge02], 1)

        assert_equal(sc[1].d[face013,edge13], 1)
        assert_equal(sc[1].d[face013,edge03],-1)
        assert_equal(sc[1].d[face013,edge01], 1)

        assert_equal(sc[1].d[face012,edge12], 1)
        assert_equal(sc[1].d[face012,edge02],-1)
        assert_equal(sc[1].d[face012,edge12], 1)

        assert_equal(sc[1].d[face124,edge24], 1)
        assert_equal(sc[1].d[face124,edge14],-1)
        assert_equal(sc[1].d[face124,edge12], 1)

        assert_equal(sc[1].d[face134,edge34], 1)
        assert_equal(sc[1].d[face134,edge14],-1)
        assert_equal(sc[1].d[face134,edge13], 1)

        assert_equal(sc[1].d[face234,edge34], 1)
        assert_equal(sc[1].d[face234,edge24],-1)
        assert_equal(sc[1].d[face234,edge23], 1)

        #d2
        assert_equal(sc[2].d[0,face123], 1)
        assert_equal(sc[2].d[0,face023],-1)
        assert_equal(sc[2].d[0,face013], 1)
        assert_equal(sc[2].d[0,face012],-1)

        assert_equal(sc[2].d[1,face234], 1)
        assert_equal(sc[2].d[1,face134],-1)
        assert_equal(sc[2].d[1,face124], 1)
        assert_equal(sc[2].d[1,face123],-1)
Ejemplo n.º 12
0
    def test_d_one_tet(self):
        v,e = matrix([[0,0,0],[1,0,0],[0,1,0],[0,0,1]]),matrix([[3,2,1,0]])
        sc  = simplicial_complex((v,e))
        
        assert_equal(sc[0].d.shape,(6,4))
        assert_equal(sc[1].d.shape,(4,6))
        assert_equal(sc[2].d.shape,(1,4))

        #d0
        edge01 = sc[1].simplex_to_index[simplex((0,1))]
        edge02 = sc[1].simplex_to_index[simplex((0,2))]
        edge03 = sc[1].simplex_to_index[simplex((0,3))]
        edge12 = sc[1].simplex_to_index[simplex((1,2))]
        edge13 = sc[1].simplex_to_index[simplex((1,3))]
        edge23 = sc[1].simplex_to_index[simplex((2,3))]        
        
        assert_equal(sc[0].d[edge01,0],-1)
        assert_equal(sc[0].d[edge01,1], 1)

        assert_equal(sc[0].d[edge02,0],-1)
        assert_equal(sc[0].d[edge02,2], 1)

        assert_equal(sc[0].d[edge03,0],-1)
        assert_equal(sc[0].d[edge03,3], 1)

        assert_equal(sc[0].d[edge12,1],-1)
        assert_equal(sc[0].d[edge12,2], 1)

        assert_equal(sc[0].d[edge13,1],-1)
        assert_equal(sc[0].d[edge13,3], 1)

        assert_equal(sc[0].d[edge23,2],-1)
        assert_equal(sc[0].d[edge23,3], 1)

        face123 = sc[2].simplex_to_index[simplex((1,2,3))]
        face023 = sc[2].simplex_to_index[simplex((0,2,3))]
        face013 = sc[2].simplex_to_index[simplex((0,1,3))]
        face012 = sc[2].simplex_to_index[simplex((0,1,2))]

        #d1
        assert_equal(sc[1].d[face012,edge12], 1)
        assert_equal(sc[1].d[face012,edge02],-1)
        assert_equal(sc[1].d[face012,edge01], 1)

        assert_equal(sc[1].d[face023,edge23], 1)
        assert_equal(sc[1].d[face023,edge03],-1)
        assert_equal(sc[1].d[face023,edge02], 1)

        assert_equal(sc[1].d[face013,edge13], 1)
        assert_equal(sc[1].d[face013,edge03],-1)
        assert_equal(sc[1].d[face013,edge01], 1)

        assert_equal(sc[1].d[face012,edge12], 1)
        assert_equal(sc[1].d[face012,edge02],-1)
        assert_equal(sc[1].d[face012,edge12], 1)

        #d2
        assert_equal(sc[2].d[0,face123], 1)
        assert_equal(sc[2].d[0,face023],-1)
        assert_equal(sc[2].d[0,face013], 1)
        assert_equal(sc[2].d[0,face012],-1)
Ejemplo n.º 13
0
    def check_skeleton(self):
        """Test the skeleton() method"""

        assert_equal(simplicial_mesh(array([[0]]),array([[0]])).skeleton(0), \
                        set([simplex([0])]))
        assert_equal(simplicial_mesh(array([[0],[1]]),array([[0,1]])).skeleton(0), \
                        set([simplex([0]),simplex([1])]))
        assert_equal(simplicial_mesh(array([[0],[1]]),array([[0,1]])).skeleton(1), \
                        set([simplex([0,1])]))
        assert_equal(simplicial_mesh(array([[0],[1],[2]]),array([[0,1],[1,2]])).skeleton(0),\
                        set([simplex([0]),simplex([1]),simplex([2])]))
        assert_equal(simplicial_mesh(array([[0],[1],[2]]),array([[0,1],[1,2]])).skeleton(1),\
                        set([simplex([0,1]),simplex([1,2])]))
        assert_equal(simplicial_mesh(array([[0,0],[1,0],[0,1]]),array([[0,1,2]])).skeleton(1),\
                        set([simplex([0,1]),simplex([1,2]),simplex([2,0])]))
Ejemplo n.º 14
0
    def check_boundary(self):
        """Test the boundary() method"""

        boundaries = []
        boundaries.append([simplex([0], parity=1), simplex([1], parity=0)])
        boundaries.append([simplex([0], parity=1), simplex([2], parity=0)])
        boundaries.append([simplex([0], parity=1), simplex([3], parity=0)])
        boundaries.append([])
        boundaries.append([simplex([0, 1]), simplex([1, 2]), simplex([2, 0])])
        boundaries.append([
            simplex([0, 1]),
            simplex([1, 3]),
            simplex([3, 2]),
            simplex([2, 0])
        ])
        boundaries.append([
            simplex([1, 0, 2]),
            simplex([0, 1, 3]),
            simplex([2, 0, 3]),
            simplex([1, 2, 3])
        ])
        boundaries.append([
            simplex([1, 0, 2]),
            simplex([0, 1, 3]),
            simplex([2, 0, 3]),
            simplex([2, 3, 4]),
            simplex([1, 4, 3]),
            simplex([1, 2, 4])
        ])

        cases = zip(self.meshes, boundaries)

        for (v, s), b in cases:
            sm = simplicial_mesh(v, s)
            sb = sm.boundary()
            assert_equal(sb, set(b))

            for x in sb:
                assert_equal(x.parity, b[b.index(x)].parity)