diff --git a/test/test_new_world_grudge.py b/test/test_new_world_grudge.py index 5379dfcfb2e95e1b39c69310a981bcf50a97c15d..3c4ab986c13eee1cfc7067ccd4f78b48f9548a32 100644 --- a/test/test_new_world_grudge.py +++ b/test/test_new_world_grudge.py @@ -45,6 +45,50 @@ import logging logger = logging.getLogger(__name__) +# {{{ inverse metric + +@pytest.mark.parametrize("dim", [2, 3]) +def test_inverse_metric(actx_factory, dim): + actx = actx_factory() + + mesh = mgen.generate_regular_rect_mesh( + a=(-0.5,)*dim, b=(0.5,)*dim, + nelements_per_axis=(6,)*dim, order=4 + ) + + def m(x): + result = np.empty_like(x) + result[0] = ( + 1.5*x[0] + np.cos(x[0]) + + 0.1*np.sin(10*x[1])) + result[1] = ( + 0.05*np.cos(10*x[0]) + + 1.3*x[1] + np.sin(x[1])) + if len(x) == 3: + result[2] = x[2] + return result + + from meshmode.mesh.processing import map_mesh + mesh = map_mesh(mesh, m) + + dcoll = DiscretizationCollection(actx, mesh, order=4) + + from grudge.geometry import \ + forward_metric_derivative_mat, inverse_metric_derivative_mat + + mat = forward_metric_derivative_mat(actx, dcoll).dot( + inverse_metric_derivative_mat(actx, dcoll)) + + for i in range(mesh.dim): + for j in range(mesh.dim): + tgt = 1 if i == j else 0 + + err = actx.np.linalg.norm(mat[i, j] - tgt, ord=np.inf) + logger.info("error[%d, %d]: %.5e", i, j, err) + assert err < 1.0e-12, (i, j, err) + +# }}} + # {{{ mass operator @pytest.mark.parametrize("ambient_dim", [1, 2, 3])