def test_discrete_problem2(): n1 = Node(0) n2 = Node(1) n3 = Node(2) n4 = Node(3) e1 = Element(n1, n2, order=1) e2 = Element(n2, n3, order=1) e3 = Element(n3, n4, order=1) nodes = (n1, n2, n3, n4) elements = (e1, e2, e3) m1 = Mesh(nodes, elements) m1.set_bc(left=True, value=1) d = DiscreteProblem(meshes=[m1]) def F(i, Y, t): if i == 0: return -Y[0] raise ValueError("Wrong i (i=%d)." % (i)) def DFDY(i, j, Y, t): if i == 0 and j == 0: return -1 raise ValueError("Wrong i, j (i=%d, j=%d)." % (i, j)) d.define_ode(F, DFDY) d.assign_dofs() Y = zeros((d.ndofs,)) J = d.assemble_J(Y) F = d.assemble_F() x = d.solve(J, F)
def _test_discrete_problem1(): n1 = Node(0) n2 = Node(1) n3 = Node(2) n4 = Node(3) e1 = Element(n1, n2, order=1) e2 = Element(n2, n3, order=1) e3 = Element(n3, n4, order=1) nodes = (n1, n2, n3, n4) elements = (e1, e2, e3) m1 = Mesh(nodes, elements) m1.set_bc(left=True, value=0) e4 = Element(n1, n2, order=1) e5 = Element(n2, n3, order=1) e6 = Element(n3, n4, order=1) elements = (e4, e5, e6) m2 = Mesh(nodes, elements) m2.set_bc(left=True, value=1) d = DiscreteProblem(meshes=[m1, m2]) def F(i, Y, t): if i == 0: return Y[1] elif i == 1: k = 2.0 return -k**2 * Y[0] raise ValueError("Wrong i (i=%d)." % (i)) def DFDY(i, j, Y, t): k = 2.0 if i == 0 and j == 0: return 0. elif i == 0 and j == 1: return 1. elif i == 1 and j == 0: return -k**2 elif i == 1 and j == 1: return 0. raise ValueError("Wrong i, j (i=%d, j=%d)." % (i, j)) d.set_rhs(F, DFDY) d.assign_dofs() J = d.assemble_J() F = d.assemble_F() x = d.solve(J, F)
def test_mesh9(): n1 = Node(1) n2 = Node(3) n3 = Node(4) n4 = Node(5) e1 = Element(n1, n2, order=3) e2 = Element(n2, n3, order=1) e3 = Element(n3, n4, order=2) nodes = (n1, n2, n3, n4) elements = (e1, e2, e3) m1 = Mesh(nodes, elements) m1.set_bc(left=False, value=1) e4 = Element(n1, n2, order=3) e5 = Element(n2, n3, order=1) e6 = Element(n3, n4, order=2) elements = (e4, e5, e6) m2 = Mesh(nodes, elements) m2.set_bc(left=True, value=1) d = DiscreteProblem(meshes=[m1, m2]) ndofs = d.assign_dofs() assert m1.elements[0].dofs[0] == 0 assert m1.elements[0].dofs[1] == 1 assert m1.elements[0].dofs[2] == 3 assert m1.elements[0].dofs[3] == 4 assert m1.elements[1].dofs[0] == 1 assert m1.elements[1].dofs[1] == 2 assert m1.elements[2].dofs[0] == 2 assert m1.elements[2].dofs[1] == -1 assert m1.elements[2].dofs[2] == 5 assert m2.elements[0].dofs[0] == -1 assert m2.elements[0].dofs[1] == 0 + 6 assert m2.elements[0].dofs[2] == 3 + 6 assert m2.elements[0].dofs[3] == 4 + 6 assert m2.elements[1].dofs[0] == 0 + 6 assert m2.elements[1].dofs[1] == 1 + 6 assert m2.elements[2].dofs[0] == 1 + 6 assert m2.elements[2].dofs[1] == 2 + 6 assert m2.elements[2].dofs[2] == 5 + 6 assert ndofs == 12 assert d.get_mesh_number(0) == 0 assert d.get_mesh_number(4) == 0 assert d.get_mesh_number(5) == 0 assert d.get_mesh_number(6) == 1 assert d.get_mesh_number(11) == 1
return -Y[0]+Y[1] elif i == 1: return Y[1] raise ValueError("Wrong i (i=%d)." % (i)) def DFDY(i, j, Y, t): if i == 0 and j == 0: return -1 elif i == 0 and j == 1: return 1 elif i == 1 and j == 0: return 0 elif i == 1 and j == 1: return 1 raise ValueError("Wrong i, j (i=%d, j=%d)." % (i, j)) d.define_ode(F, DFDY) d.assign_dofs() Y = zeros(d.ndofs) J = d.assemble_J(Y) error = 1e10 i = 0 while error > 1e-10: F = d.assemble_F(Y) dY = d.solve(J, F) error = d.calculate_error_l2_norm(dY) print "it=%d, l2_norm=%e" % (i, error) Y += dY i += 1 x = Y from pylab import plot, legend, show sln1, sln2 = d.linearize(x, 5)
return 0 elif i == 1 and j == 0: return -2 elif i == 1 and j == 1: return 2 elif i == 1 and j == 2: return 0 elif i == 2 and j == 0: return 1 elif i == 2 and j == 1: return 1 elif i == 2 and j == 2: return 4 raise ValueError("Wrong i, j (i=%d, j=%d)." % (i, j)) d.define_ode(F, DFDY) ndofs = d.assign_dofs() Y = zeros(ndofs) J = d.assemble_J(Y) error = 1e10 i = 0 while error > 1e-4: F = d.assemble_F(Y) dY = d.solve(J, F) error = d.calculate_error_l2_norm(dY) print "it=%d, l2_norm=%e" % (i, error) Y += dY i += 1 x = Y from pylab import plot, legend, show sln1, sln2, sln3 = d.linearize(x, 5)