Exemple #1
0
def main(solver, N: int, dt: float, T: float, theta: float) -> Tuple[float, float, float, float]:
    """Run monodomain MMS."""
    mesh = UnitSquareMesh(N, N)
    time = Constant(0.0)
    lam = Constant(1.0)
    cell_model = NoCellModel()

    ac_str = "(8*pi*pi*lam*sin(t) + (lam + 1)*cos(t))*cos(2*pi*x[0])*cos(2*pi*x[1])/(lam + 1)"
    stimulus = Expression(ac_str, t=time, lam=lam, degree=3)

    parameters = solver.default_parameters()
    _solver = solver(mesh, time, 1.0, I_s=stimulus, parameters=parameters)

    vs0 = Function(_solver.V)
    vs_, vs = _solver.solution_fields()
    vs_.assign(vs0)

    for timestep, (v_, v) in _solver.solve(0, T, dt):
        continue

    v_exact = Expression(
        "sin(t)*cos(2*pi*x[0])*cos(2*pi*x[1])",
        t=T,
        degree=3
    )

    # compute errors
    # v, s = vs.split(deepcopy=True)
    v_error = errornorm(v_exact, v, "L2", degree_rise=2)
    return (v_error, mesh.hmin(), dt, T)
def main(N: int, dt: float, T: float, theta: float) -> Tuple[float, float, float, float]:
    """Set up solver and return errors and mesh size."""
    mesh = UnitSquareMesh(N, N)
    time = Constant(0.0)
    ac_str = "(8*pi*pi*lam*sin(t) + (lam + 1)*cos(t))*cos(2*pi*x[0])*cos(2*pi*x[1])/(lam + 1)"
    stimulus = Expression(ac_str, t=time, lam=Constant(1), degree=3)
    M_i = Constant(1.0)
    # Set up solver
    parameters = BasicMonodomainSolver.default_parameters()
    parameters["theta"] = theta
    solver = BasicMonodomainSolver(mesh, time, M_i, I_s=stimulus, parameters=parameters)

    v_exact  = Expression("sin(t)*cos(2*pi*x[0])*cos(2*pi*x[1])", t=T, degree=3)

    # Define initial conditions
    v_, v = solver.solution_fields()

    # Solve
    solutions = solver.solve(0, T, dt)
    for interval, fields in solutions:
        continue

    # Compute errors
    v_error = errornorm(v_exact, v, "L2", degree_rise=2)
    return v_error, mesh.hmin(), dt, T
def main(N: int, dt: float, T: float,
         theta: float) -> Tuple[float, float, float, float, float]:
    """Run bidomain MMA."""
    # Create data
    mesh = UnitSquareMesh(N, N)
    time = Constant(0.0)
    ac_str = "cos(t)*cos(2*pi*x[0])*cos(2*pi*x[1]) + 4*pi*pi*cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)"
    stimulus = Expression(ac_str, t=time, degree=5)
    M_i = 1.
    M_e = 1.0

    # Set-up solver
    parameters = BidomainSolver.default_parameters()
    parameters["theta"] = theta
    parameters["linear_solver_type"] = "direct"
    parameters["use_avg_u_constraint"] = True
    parameters["Chi"] = 1.0
    parameters["Cm"] = 1.0
    solver = BidomainSolver(mesh,
                            time,
                            M_i,
                            M_e,
                            I_s=stimulus,
                            parameters=parameters)

    # Define exact solution (Note: v is returned at end of time
    # interval(s), u is computed at somewhere in the time interval
    # depending on theta)
    v_exact = Expression("cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)", t=T, degree=3)
    u_exact = Expression("-cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)/2.0",
                         t=T - (1. - theta) * dt,
                         degree=3)

    # Define initial condition(s)
    v_, vu = solver.solution_fields()

    # Solve
    solutions = solver.solve(0, T, dt)
    for interval, fields in solutions:
        continue

    # Compute errors
    v, u = vu.split(deepcopy=True)[:2]
    v_error = errornorm(v_exact, v, "L2", degree_rise=2)
    u_error = errornorm(u_exact, u, "L2", degree_rise=2)
    return v_error, u_error, mesh.hmin(), dt, T
Exemple #4
0
def main(solver, N: int, dt: float, T: float,
         theta: float) -> Tuple[float, float, float, float, float]:
    # Create cardiac model
    mesh = UnitSquareMesh(N, N)
    time = Constant(0.0)
    cell_model = NoCellModel()

    ac_str = "cos(t)*cos(2*pi*x[0])*cos(2*pi*x[1]) + 4*pow(pi, 2)*cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)"
    stimulus = Expression(ac_str, t=time, degree=5)

    ps = solver.default_parameters()
    ps["Chi"] = 1.0
    ps["Cm"] = 1.0
    _solver = solver(mesh, time, 1.0, 1.0, stimulus, parameters=ps)

    # Define exact solution (Note: v is returned at end of time
    # interval(s), u is computed at somewhere in the time interval
    # depending on theta)

    v_exact = Expression("cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)", t=T, degree=5)
    u_exact = Expression("-cos(2*pi*x[0])*cos(2*pi*x[1])*sin(t)/2.0",
                         t=T - (1 - theta) * dt,
                         degree=5)

    # Define initial condition(s)
    vs0 = Function(_solver.V)
    vs_, *_ = _solver.solution_fields()
    vs_.assign(vs0)

    # Solve
    for _, (vs_, vur) in _solver.solve(0, T, dt):
        continue

    # Compute errors
    v, u, *_ = vur.split(deepcopy=True)
    v_error = errornorm(v_exact, v, "L2", degree_rise=5)
    u_error = errornorm(u_exact, u, "L2", degree_rise=5)
    return v_error, u_error, mesh.hmin(), dt, T