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
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)
""" from hermes1d import Node, Element, Mesh, DiscreteProblem from numpy import zeros a = 0. b = 1. N = 10 nodes = [Node((b-a)/N * i) for i in range(N)] elements = [Element(nodes[i], nodes[i+1], order=1) for i in range(N-1)] m1 = Mesh(nodes, elements) m1.set_bc(left=True, value=1) elements = [Element(nodes[i], nodes[i+1], order=1) for i in range(N-1)] m2 = Mesh(nodes, elements) m2.set_bc(left=True, value=2) d = DiscreteProblem(meshes=[m1, m2]) k = 1.0 def F(i, Y, t): if i == 0: 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:
# define nodes: nodes = [Node(x) for x in x_values] # define elements of the 1st mesh elements = [Element(nodes[i], nodes[i+1], order=2) for i in range(N)] m1 = Mesh(nodes, elements) m1.set_bc(left=True, value=0) # define elements of the 2nd mesh elements = [Element(nodes[i], nodes[i+1], order=1) for i in range(N)] m2 = Mesh(nodes, elements) m2.set_bc(left=True, value=1) # definition of the ODE system: d = DiscreteProblem(meshes=[m1, m2]) # definition of the RHS: def F(i, Y, t): if i == 0: return Y[1] elif i == 1: return -Y[0] raise ValueError("Wrong i (i=%d)." % (i)) # definition of the Jacobian matrix def DFDY(i, j, Y, t): if i == 0 and j == 0: return 0. elif i == 0 and j == 1: return 1.