def test_volume(volumes):

    geo = pulse.HeartGeometry.from_file(pulse.mesh_paths["simple_ellipsoid"])
    V_cg2 = dolfin.VectorFunctionSpace(geo.mesh, "CG", 2)
    u = dolfin_adjoint.Function(V_cg2)
    volume_obs = VolumeObservation(mesh=geo.mesh,
                                   dmu=geo.ds(geo.markers["ENDO"]),
                                   description="Test LV volume")

    model_volume = volume_obs(u).vector().get_local()[0]
    target = OptimizationTarget(volumes, volume_obs, collect=True)
    if np.isscalar(volumes):
        volumes = (volumes, )

    fs = []
    for t, v in zip(target, volumes):
        fun = dolfin.project(t.assign(u), t._V)
        f = fun.vector().get_local()[0]
        fs.append(f)
        g = (model_volume - v)**2
        assert abs(f - g) < 1e-12

    # We collect the data
    assert np.all(
        np.subtract(
            np.squeeze([v.get_local()
                        for v in target.collector["data"]]), volumes) < 1e-12)
    assert np.all(
        np.subtract(
            np.squeeze([v.get_local() for v in target.collector["model"]]),
            model_volume) < 1e-12)
    assert np.all(np.subtract(target.collector["functional"], fs) < 1e-12)
Ejemplo n.º 2
0
def main():

    problem, control = fixtures.create_problem()
    geo = problem.geometry
    V_cg2 = dolfin.VectorFunctionSpace(geo.mesh, "CG", 2)
    u = dolfin.Function(V_cg2)
    volume_obs = VolumeObservation(mesh=geo.mesh,
                                   dmu=geo.ds(geo.markers["ENDO"]),
                                   description="Test LV volume")

    model_volume = volume_obs(u).vector().get_local()[0]
    print(model_volume)
    volumes = (2.7, 2.9)
    # volumes = (2.7,)
    target = OptimizationTarget(volumes, volume_obs, collect=True)

    lvp = [0.5, 1.0]
    # lvp = [0.5]
    bcs = BoundaryObservation(bc=problem.bcs.neumann[0], data=lvp)

    assimilator = Assimilator(problem, target, bcs, control)
    assimilator.assimilate()

    from IPython import embed

    embed()
    exit()
def test_volume_observation_is_same_as_geometry_cavity_volume_zero():

    problem, control = fixtures.create_problem("R_0")
    u, p = dolfin.split(problem.state)

    volume_obs = VolumeObservation(mesh=geo.mesh,
                                   dmu=geo.ds(geo.markers["ENDO"]))
    assert abs(problem.geometry.cavity_volume(u=u) -
               float(volume_obs(u))) < 1e-12
def test_volume_CG2(approx):

    u = dolfin_adjoint.Function(V_cg2)
    volume_obs = VolumeObservation(
        mesh=geo.mesh,
        dmu=geo.ds(geo.markers["ENDO"]),
        approx=approx,
        description="Test LV volume",
    )

    v1 = volume_obs()
    assert norm(v1.vector().get_local() - 2.51130402) < 1e-8
    v2 = volume_obs(u)
    assert norm(v2.vector().get_local() - 2.51130402) < 1e-8