print("\n".join(["Input mesh should have at least two materials and ", "two boundary attributes! (See schematic in ex17.cpp)\n"])) sys.exit() # 3. Refine the mesh to increase the resolution. ref_levels = int(np.floor(np.log(5000./mesh.GetNE())/np.log(2.)/dim)) for x in range(ref_levels): mesh.UniformRefinement(); # Since NURBS meshes do not support DG integrators, we convert them to # regular polynomial mesh of the specified (solution) order. if (mesh.NURBSext): mesh.SetCurvature(order) # 4. Define a DG vector finite element space on the mesh. Here, we use # Gauss-Lobatto nodal basis because it gives rise to a sparser matrix # compared to the default Gauss-Legendre nodal basis. fec = mfem.DG_FECollection(order, dim, mfem.BasisType.GaussLobatto) fespace = mfem.FiniteElementSpace(mesh, fec, dim) print('Number of finite element unknowns: '+ str(fespace.GetVSize())) print('Assembling:') # 5. In this example, the Dirichlet boundary conditions are defined by # marking boundary attributes 1 and 2 in the marker Array 'dir_bdr'. # These b.c. are imposed weakly, by adding the appropriate boundary # integrators over the marked 'dir_bdr' to the bilinear and linear forms. # With this DG formulation, there are no essential boundary conditions. ess_tdof_list = intArray() dir_bdr = intArray(mesh.bdr_attributes.Max()) dir_bdr.Assign(0) dir_bdr[0] = 1 # boundary attribute 1 is Dirichlet dir_bdr[1] = 1 # boundary attribute 2 is Dirichlet
print( "Unknown ODE solver type: " + str(ode_solver_type)) exit # 4. Refine the mesh to increase the resolution. In this example we do # 'ref_levels' of uniform refinement, where 'ref_levels' is a # command-line parameter. If the mesh is of NURBS type, we convert it to # a (piecewise-polynomial) high-order mesh. for lev in range(ref_levels): mesh.UniformRefinement(); if mesh.NURBSext: mesh.SetCurvature(max(order, 1)) bb_min, bb_max = mesh.GetBoundingBox(max(order, 1)); # 5. Define the discontinuous DG finite element space of the given # polynomial order on the refined mesh. fec = mfem.DG_FECollection(order, dim) fes = mfem.FiniteElementSpace(mesh, fec) print("Number of unknowns: " + str(fes.GetVSize())) # # Define coefficient using VecotrPyCoefficient and PyCoefficient # A user needs to define EvalValue method # class velocity_coeff(mfem.VectorPyCoefficient): def EvalValue(self, x): dim = len(x) center = (bb_min + bb_max)/2.0 # map to the reference [-1,1] domain X = 2 * (x - center) / (bb_max - bb_min)