@@ -86,22 +86,44 @@ def test_function_assignment():
8686
8787@pytest .mark .skipcomplex
8888def test_project ():
89- mesh = UnitIntervalMesh ( 10 )
89+ mesh = UnitSquareMesh ( 10 , 10 )
9090 X = SpatialCoordinate (mesh )
91- space = FunctionSpace (mesh , "Lagrange" , 1 )
92- test = TestFunction (space )
91+ space_a = FunctionSpace (mesh , "Lagrange" , 1 )
92+ space_b = FunctionSpace (mesh , "Discontinuous Lagrange" , 0 )
93+ test_a = TestFunction (space_a )
9394
94- u = Function (space , name = "u" ).interpolate (X [0 ] - 0.5 )
95- zeta = Function (space , name = "tlm_u" ).interpolate (X [0 ])
95+ u = Function (space_a , name = "u" ).interpolate (X [0 ] - 0.5 )
96+ zeta = Function (space_a , name = "tlm_u" ).interpolate (X [0 ])
9697 u .block_variable .tlm_value = zeta .copy (deepcopy = True )
9798
98- space_0 = FunctionSpace (mesh , "Discontinuous Lagrange" , 0 )
99+ with reverse_over_forward ():
100+ v = Function (space_b , name = "v" ).project (u )
101+ J = assemble (v * v * dx )
102+
103+ _ = compute_gradient (J .block_variable .tlm_value , Control (u ))
104+ adj_value = u .block_variable .adj_value
105+ assert np .allclose (adj_value .dat .data_ro ,
106+ assemble (2 * inner (Function (space_b ).project (zeta ), test_a ) * dx ).dat .data_ro )
107+
108+
109+ @pytest .mark .skipcomplex
110+ def test_supermesh_project ():
111+ mesh_a = UnitSquareMesh (10 , 10 )
112+ mesh_b = UnitSquareMesh (5 , 20 )
113+ X_a = SpatialCoordinate (mesh_a )
114+ space_a = FunctionSpace (mesh_a , "Lagrange" , 1 )
115+ space_b = FunctionSpace (mesh_b , "Discontinuous Lagrange" , 0 )
116+ test_a = TestFunction (space_a )
117+
118+ u = Function (space_a , name = "u" ).interpolate (X_a [0 ] - 0.5 )
119+ zeta = Function (space_a , name = "tlm_u" ).interpolate (X_a [0 ])
120+ u .block_variable .tlm_value = zeta .copy (deepcopy = True )
99121
100122 with reverse_over_forward ():
101- v = Function (space_0 , name = "v" ).project (u )
123+ v = Function (space_b , name = "v" ).project (u )
102124 J = assemble (v * v * dx )
103125
104126 _ = compute_gradient (J .block_variable .tlm_value , Control (u ))
105127 adj_value = u .block_variable .adj_value
106128 assert np .allclose (adj_value .dat .data_ro ,
107- assemble (2 * inner (Function (space_0 ).project (zeta ), test ) * dx ).dat .data_ro )
129+ assemble (2 * inner (Function (space_a ).project (Function ( space_b ). project ( zeta )), test_a ) * dx ).dat .data_ro )
0 commit comments