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
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