22import  sympy 
33import  symfem 
44from  symfem  import  create_element 
5- from  symfem .core .finite_element  import  CiarletElement 
5+ from  symfem .core .finite_element  import  CiarletElement ,  DirectElement 
66from  symfem .core .symbolic  import  subs , x , PiecewiseFunction 
77from  symfem .core .vectors  import  vsub 
88from  utils  import  test_elements , all_symequal 
@@ -20,6 +20,67 @@ def test_all_tested():
2020                raise  ValueError (f"{ e .names [0 ]} { r }  )
2121
2222
23+ @pytest .mark .parametrize ( 
24+     ("cell_type" , "element_type" , "order" , "variant" ), 
25+     [[reference , element , order , variant ] 
26+      for  reference , i  in  test_elements .items () for  element , j  in  i .items () 
27+      for  variant , k  in  j .items () for  order  in  k ]) 
28+ def  test_independence (
29+     elements_to_test , cells_to_test , cell_type , element_type , order , variant ,
30+     speed 
31+ ):
32+     """Test that DirectElements have independent basis functions.""" 
33+     if  elements_to_test  !=  "ALL"  and  element_type  not  in elements_to_test :
34+         pytest .skip ()
35+     if  cells_to_test  !=  "ALL"  and  cell_type  not  in cells_to_test :
36+         pytest .skip ()
37+     if  speed  ==  "fast" :
38+         if  order  >  2 :
39+             pytest .skip ()
40+         if  order  ==  2  and  cell_type  in  ["tetrahedron" , "hexahedron" , "prism" , "pyramid" ]:
41+             pytest .skip ()
42+ 
43+     space  =  create_element (cell_type , element_type , order , variant )
44+ 
45+     # Only run this test for DirectElements 
46+     if  not  isinstance (space , DirectElement ):
47+         pytest .skip ()
48+ 
49+     basis  =  space .get_basis_functions ()
50+     all_terms  =  set ()
51+ 
52+     try :
53+         basis [0 ].as_coefficients_dict ()
54+         scalar  =  True 
55+     except  AttributeError :
56+         scalar  =  False 
57+ 
58+     if  scalar :
59+         for  f  in  basis :
60+             for  term  in  f .as_coefficients_dict ():
61+                 all_terms .add (term )
62+         mat  =  [[0  for  i  in  all_terms ] for  j  in  basis ]
63+         for  i , t  in  enumerate (all_terms ):
64+             for  j , f  in  enumerate (basis ):
65+                 fd  =  f .as_coefficients_dict ()
66+                 if  t  in  fd :
67+                     mat [j ][i ] =  fd [t ]
68+     else :
69+         for  f  in  basis :
70+             for  fi , fpart  in  enumerate (f ):
71+                 for  term  in  fpart .as_coefficients_dict ():
72+                     all_terms .add ((fi , term ))
73+         mat  =  [[0  for  i  in  all_terms ] for  j  in  basis ]
74+         for  i , (fi , t ) in  enumerate (all_terms ):
75+             for  j , f  in  enumerate (basis ):
76+                 fd  =  f [fi ].as_coefficients_dict ()
77+                 if  t  in  fd :
78+                     mat [j ][i ] =  fd [t ]
79+     mat  =  sympy .Matrix (mat )
80+ 
81+     assert  mat .rank () ==  mat .rows 
82+ 
83+ 
2384@pytest .mark .parametrize ( 
2485    ("cell_type" , "element_type" , "order" , "variant" ), 
2586    [[reference , element , order , variant ] 
0 commit comments