@@ -532,3 +532,34 @@ def test_submesh_assemble_quad_triangle():
532532 a_ref = c_ref * inner (TrialFunction (V_q ), TestFunction (V_t )) * ds_q (label_interf )
533533 A_ref = assemble (a_ref )
534534 assert np .allclose (A .M [0 ][1 ].values , A_ref .M .values )
535+
536+
537+ @pytest .mark .parallel (3 )
538+ def test_assemble_parent_coefficient ():
539+ subdomain_id = 999
540+ nx = 4
541+ mesh = UnitSquareMesh (2 * nx , nx , quadrilateral = True , reorder = False )
542+ x , y = SpatialCoordinate (mesh )
543+ M = FunctionSpace (mesh , "DG" , 0 )
544+ marker = Function (M ).interpolate (conditional (Or (x > 0.5 , y > 0.5 ), 1 , 0 ))
545+ mesh = RelabeledMesh (mesh , [marker ], [subdomain_id ])
546+ submesh = Submesh (mesh , mesh .topological_dimension , subdomain_id , ignore_halo = True , reorder = False )
547+
548+ def expr (m ):
549+ x = SpatialCoordinate (m )
550+ return 1 + dot (x , x )
551+
552+ Vsub = FunctionSpace (submesh , "CG" , 1 )
553+ vsub = TestFunction (Vsub )
554+ usub = TrialFunction (Vsub )
555+
556+ Q = FunctionSpace (mesh , "DG" , 0 )
557+ q = Function (Q ).interpolate (expr (mesh ))
558+ A = assemble (inner (grad (usub ) * q , grad (vsub ))* dx (domain = submesh ))
559+
560+ Qsub = FunctionSpace (submesh , "DG" , 0 )
561+ qsub = Function (Qsub ).interpolate (expr (submesh ))
562+ A_ref = assemble (inner (grad (usub ) * qsub , grad (vsub ))* dx )
563+
564+ A_ref .petscmat .axpy (- 1 , A .petscmat )
565+ assert np .isclose (A_ref .petscmat .norm (PETSc .NormType .NORM_FROBENIUS ), 0 )
0 commit comments