def SetUp (maxh = 0.3, order = 0, condense = False, jump = 1, nref = 0): def make_geo(): geometry = CSGeometry() box = OrthoBrick(Pnt(-1,-1,-1),Pnt(2,1,2)).bc("outer") core = OrthoBrick(Pnt(0,-0.05,0),Pnt(0.8,0.05,1))- \ OrthoBrick(Pnt(0.1,-1,0.1),Pnt(0.7,1,0.9))- \ OrthoBrick(Pnt(0.5,-1,0.4),Pnt(1,1,0.6)).mat("core") coil = (Cylinder(Pnt(0.05,0,0), Pnt(0.05,0,1), 0.3) - \ Cylinder(Pnt(0.05,0,0), Pnt(0.05,0,1), 0.15)) * \ OrthoBrick (Pnt(-1,-1,0.3),Pnt(1,1,0.7)).mat("coil") geometry.Add ((box-core-coil).mat("air")) geometry.Add (core) geometry.Add (coil) return geometry geo = make_geo() comm = mpi_world if comm.rank==0: # ngsglobals.msg_level = 0 ngmesh = geo.GenerateMesh(maxh=maxh) # ngsglobals.msg_level = 1 if comm.size > 1: ngmesh.Distribute(comm) else: from netgen.meshing import Mesh as NGMesh ngmesh = NGMesh.Receive(comm) ngmesh.SetGeometry(geo) for k in range(nref): ngmesh.Refine() mesh = Mesh(ngmesh) ngsglobals.msg_level = 0 mesh.Curve(3) ngsglobals.msg_level = 1 HC = HCurl(mesh, order=order, dirichlet="outer") mur = { "core" : jump, "coil" : 1, "air" : 1 } mu0 = 1.257e-6 nu_coef = [ 1/(mu0*mur[mat]) for mat in mesh.GetMaterials() ] nu = CoefficientFunction(nu_coef) alpha = nu beta = 1e-6 * nu sigma, tau = HC.TnT() a = BilinearForm(HC) a += alpha * curl(sigma) * curl(tau) * dx a += beta * sigma * tau * dx f = LinearForm(HC) f += SymbolicLFI(CoefficientFunction((y,0.05-x,0)) * tau, definedon=mesh.Materials("coil")) return mesh, HC, a, f, alpha, beta
def make1DMesh(maxh): netmesh = NetMesh() netmesh.dim = 1 start = -5 L = 10 N = int(L/maxh)+1 pnums = [] for i in range(0, N + 1): pnums.append(netmesh.Add(MeshPoint(Pnt(start + L * i / N, 0, 0)))) for i in range(0, N): netmesh.Add(Element1D([pnums[i], pnums[i + 1]], index=i+1)) netmesh.SetMaterial(i+1, 'top'+str(i+1)) netmesh.Add(Element0D(pnums[0], index=1)) netmesh.Add(Element0D(pnums[N], index=2)) return netmesh
def Make1DMesh(start, end, maxh, periodic=False): netmesh = NetMesh() netmesh.dim = 1 L = end-start N = int(L/maxh)+1 pnums = [] for i in range(0, N + 1): pnums.append(netmesh.Add(MeshPoint(Pnt(start + L * i / N, 0, 0)))) for i in range(0, N): netmesh.Add(Element1D([pnums[i], pnums[i + 1]])) # netmesh.SetMaterial(i+1, 'top'+str(i+1)) # netmesh.Add(Element1D([pnums[i], pnums[i + 1]], index=1)) netmesh.Add(Element0D(pnums[0], index=1)) netmesh.Add(Element0D(pnums[N], index=2)) netmesh.SetMaterial(1, 'top') if periodic: netmesh.AddPointIdentification(pnums[0], pnums[-1], 1, 2) return netmesh
def Mesh1D(elements, interval=(0, 1), periodic=False): """ generate an equidistant 1D mesh with N cells """ N = elements left = interval[0] right = interval[1] mesh = NGMesh(dim=1) pids = [] for i in range(N + 1): pids.append( mesh.Add(MeshPoint(Pnt(left + i / N * (right - left), 0, 0)))) for i in range(N): mesh.Add(Element1D([pids[i], pids[i + 1]], index=1)) mesh.Add(Element0D(pids[0], index=1)) mesh.Add(Element0D(pids[N], index=2)) mesh.SetBCName(0, "left") mesh.SetBCName(1, "right") if periodic: mesh.AddPointIdentification(pids[0], pids[N], 1, 2) ngsmesh = NGSMesh(mesh) return ngsmesh
# cut off above 1.0 result_gridfunc.Set(IfPos(c0-1.0,1.0,c0)) total_mass = Integrate(result_gridfunc,mesh,VOL) print() if usegeo == "circle": geo = SplineGeometry() MakeCircle(geo, (0,0), 1) mesh = Mesh(geo.GenerateMesh(maxh=maxh)) mesh.Curve(order) elif usegeo == "square": mesh = Mesh(unit_square.GenerateMesh(maxh=maxh)) elif usegeo == "1d": netmesh = NetMesh() netmesh.dim = 1 N = 1000 pnums = [] for i in range(0, N + 1): pnums.append(netmesh.Add(MeshPoint(Pnt(i * 1 / N, 0, 0)))) for i in range(0, N): netmesh.Add(Element1D([pnums[i], pnums[i + 1]], index=1)) netmesh.Add(Element0D(pnums[0], index=1)) netmesh.Add(Element0D(pnums[N], index=2)) mesh = Mesh(netmesh) UV = H1(mesh, order=order, dirichlet=[1,2,3,4])
from netgen.meshing import Mesh as NGMesh comm = mpi_world dim, geo = 2, geom2d.SplineGeometry() geo.AddRectangle((0, 0), (10, 1), leftdomain=1, rightdomain=0, bcs=("left", "outer", "outer", "outer")) geo.SetMaterial(1, "mat") if comm.rank == 0: ngm = geo.GenerateMesh(maxh=0.05) ngm.Distribute(comm) else: ngm = NGMesh.Receive(comm) ngm.SetGeometry(geo) mesh = Mesh(ngm) multidim = dim V = H1(mesh, order=1, dirichlet="left", dim=multidim) trials, tests = V.TnT() u = CoefficientFunction(tuple(trials[k] for k in range(dim))) gradu = CoefficientFunction(tuple( grad(trials)[i, j] for i in range(dim) for j in range(dim)), dims=(dim, dim)) epsu = 0.5 * (gradu + gradu.trans) ut = CoefficientFunction(tuple(tests[k] for k in range(dim))) gradut = CoefficientFunction(tuple( grad(tests)[i, j] for i in range(dim) for j in range(dim)), dims=(dim, dim))
from netgen.geom2d import unit_square, MakeCircle, SplineGeometry from netgen.meshing import Element0D, Element1D, Element2D, MeshPoint, FaceDescriptor, Mesh from netgen.csg import Pnt quads = True N = 5 mesh = Mesh() mesh.SetGeometry(unit_square) mesh.dim = 2 pnums = [] for i in range(N + 1): for j in range(N + 1): pnums.append(mesh.Add(MeshPoint(Pnt(i / N, j / N, 0)))) mesh.SetMaterial(1, "mat") for j in range(N): for i in range(N): if quads: mesh.Add( Element2D(1, [ pnums[i + j * (N + 1)], pnums[i + (j + 1) * (N + 1)], pnums[i + 1 + (j + 1) * (N + 1)], pnums[i + 1 + j * (N + 1)] ])) else: mesh.Add( Element2D(1, [ pnums[i + j * (N + 1)], pnums[i + (j + 1) * (N + 1)], pnums[i + 1 + j * (N + 1)]
from netgen.geom2d import unit_square from netgen.geom2d import * geo = SplineGeometry() pnts = [ (0,0), (1,0), (1,1), (0,1) ] pnums = [geo.AppendPoint(*p) for p in pnts] lbot = geo.Append ( ["line", pnums[0], pnums[1]],bc="bot") # geo.Append ( ["line", pnums[3], pnums[2]], leftdomain=0, rightdomain=1, bc="top") geo.Append ( ["line", pnums[3], pnums[2]], leftdomain=0, rightdomain=1, copy=lbot, bc="top") lright = geo.Append ( ["line", pnums[1], pnums[2]], bc="right") geo.Append ( ["line", pnums[0], pnums[3]], leftdomain=0, rightdomain=1, copy=lright, bc="left") ngmesh = geo.GenerateMesh(maxh=0.05) if comm.size>1: ngmesh.Distribute(comm) else: from netgen.meshing import Mesh as NGMesh ngmesh = NGMesh.Receive(comm) mesh = Mesh(ngmesh) V = L2(mesh, order=4) u,v = V.TnT() # b = CoefficientFunction( (0.2 + 0.5 * (y-0.5), 0.5 * (0.5-x)) ) b = CoefficientFunction( (0.3 + (y-0.5), (0.5-x)) ) bn = b*specialcf.normal(2) a = BilinearForm(V) a += SymbolicBFI (-u * b*grad(v)) a += SymbolicBFI ( bn*IfPos(bn, u, u.Other()) * (v-v.Other()), VOL, skeleton=True) a += SymbolicBFI ( bn*IfPos(bn, u, 0) * v, BND, skeleton=True)
def MakeUniform3DGrid(quads = False, N=5, P1=(0,0,0),P2=(1,1,1)): if not quads: raise BaseException("Only hex cube so far...") Lx = P2[0]-P1[0] Ly = P2[1]-P1[1] Lz = P2[2]-P1[2] cube = OrthoBrick( Pnt(P1[0],P1[1],P1[2]), Pnt(P2[0],P2[1],P2[2]) ).bc(1) geom = CSGeometry() geom.Add (cube) netmesh = NetMesh() netmesh.SetGeometry(geom) netmesh.dim = 3 pids = [] for i in range(N+1): for j in range(N+1): for k in range(N+1): pids.append (netmesh.Add (MeshPoint(Pnt(P1[0] + Lx * i / N, P1[1] + Ly * j / N, P1[2] + Lz * k / N)))) for i in range(N): for j in range(N): for k in range(N): base = i * (N+1)*(N+1) + j*(N+1) + k baseup = base+(N+1)*(N+1) pnum = [base,base+1,base+(N+1)+1,base+(N+1), baseup, baseup+1, baseup+(N+1)+1, baseup+(N+1)] elpids = [pids[p] for p in pnum] netmesh.Add (Element3D(1,elpids)) def AddSurfEls (p1, dx, dy, facenr): for i in range(N): for j in range(N): base = p1 + i*dx+j*dy pnum = [base, base+dx, base+dx+dy, base+dy] elpids = [pids[p] for p in pnum] netmesh.Add (Element2D(facenr,elpids)) netmesh.Add (FaceDescriptor(surfnr=1,domin=1,bc=1)) AddSurfEls (0, 1, N+1, facenr=1) netmesh.Add (FaceDescriptor(surfnr=2,domin=1,bc=1)) AddSurfEls (0, (N+1)*(N+1), 1, facenr=2) netmesh.Add (FaceDescriptor(surfnr=3,domin=1,bc=1)) AddSurfEls (0, N+1, (N+1)*(N+1), facenr=3) netmesh.Add (FaceDescriptor(surfnr=4,domin=1,bc=1)) AddSurfEls ((N+1)**3-1, -(N+1), -1, facenr=1) netmesh.Add (FaceDescriptor(surfnr=5,domin=1,bc=1)) AddSurfEls ((N+1)**3-1, -(N+1)*(N+1), -(N+1), facenr=1) netmesh.Add (FaceDescriptor(surfnr=6,domin=1,bc=1)) AddSurfEls ((N+1)**3-1, -1, -(N+1)*(N+1), facenr=1) netmesh.Compress() mesh = NGSMesh(netmesh) mesh.ngmesh.Save("tmp.vol.gz") mesh = NGSMesh("tmp.vol.gz") return mesh
order = 1 maxh = 0.1 tau = 0.005 tend = -1 usegeo = "1d" if usegeo == "circle": geo = SplineGeometry() geo.AddCircle ( (0.0, 0.0), r=1, bc="cyl") netgenMesh = geo.GenerateMesh(maxh=maxh) elif usegeo == "1d": netgenMesh = Make1DMesh(-1, 1, maxh) elif usegeo == "test": netgenMesh = NetMesh() netgenMesh.dim = 1 start = -1 L = 2 N = 3 # Nof elements ? yep pnums = [] for i in range(0, N + 1): pnums.append(netgenMesh.Add(MeshPoint(Pnt(start + L * i / N, 0, 0)))) for i in range(0, N): netgenMesh.Add(Element1D([pnums[i], pnums[i + 1]])) # netgenMesh.Add(Element0D(pnums[0], index=1)) # netgenMesh.Add(Element0D(pnums[N], index=2)) mesh = Mesh(netgenMesh)
# EX 4: sub-communicators from ngsolve import * ngsglobals.msg_level = 1 comm = mpi_world if comm.rank in [1,2]: sub_comm = comm.SubComm([1,2]) if sub_comm.rank == 0: from netgen.geom2d import unit_square mesh = unit_square.GenerateMesh(maxh=0.1) if sub_comm.size > 1: mesh.Distribute(sub_comm) else: from netgen.meshing import Mesh as NGMesh mesh = NGMesh.Receive(sub_comm) mesh = Mesh(mesh) print("rank", comm.rank, ", sub-comm rank", sub_comm.rank, "local NV =", mesh.nv, ", and NE =", mesh.ne) V = H1(mesh, order=1, dirichlet=".*") print("rank", comm.rank, ", sub-comm rank", sub_comm.rank, "has", V.ndof, "of", V.ndofglobal, "dofs!") else: print("rank", comm.rank, "is bored, give me some work!")
def MakeUniform2DGrid(quads=False, N=5, P1=(0, 0), P2=(1, 1)): geom = SplineGeometry() geom.AddRectangle(P1, P2, bc=1) Lx = P2[0] - P1[0] Ly = P2[1] - P1[1] netmesh = NetMesh() netmesh.SetGeometry(geom) netmesh.dim = 2 pnums = [] for i in range(N + 1): for j in range(N + 1): pnums.append( netmesh.Add( MeshPoint(Pnt(P1[0] + Lx * i / N, P1[1] + Ly * j / N, 0)))) netmesh.Add(FaceDescriptor(surfnr=1, domin=1, bc=1)) netmesh.SetMaterial(1, "mat") for j in range(N): for i in range(N): if quads: netmesh.Add( Element2D(1, [ pnums[i + j * (N + 1)], pnums[i + (j + 1) * (N + 1)], pnums[i + 1 + (j + 1) * (N + 1)], pnums[i + 1 + j * (N + 1)] ])) else: netmesh.Add( Element2D(1, [ pnums[i + j * (N + 1)], pnums[i + (j + 1) * (N + 1)], pnums[i + 1 + j * (N + 1)] ])) netmesh.Add( Element2D(1, [ pnums[i + (j + 1) * (N + 1)], pnums[i + 1 + (j + 1) * (N + 1)], pnums[i + 1 + j * (N + 1)] ])) for j in range(N): netmesh.Add( Element1D([pnums[N + j * (N + 1)], pnums[N + (j + 1) * (N + 1)]], index=1)) netmesh.Add( Element1D([pnums[0 + j * (N + 1)], pnums[0 + (j + 1) * (N + 1)]], index=1)) for i in range(N): netmesh.Add(Element1D([pnums[i], pnums[i + 1]], index=1)) netmesh.Add( Element1D([pnums[i + N * (N + 1)], pnums[i + 1 + N * (N + 1)]], index=1)) netmesh.SetGeometry(geom) netmesh.Compress() mesh = NGSMesh(netmesh) mesh.ngmesh.Save("tmp.vol.gz") mesh = NGSMesh("tmp.vol.gz") return mesh
def GenerateCubeMesh(n): # create a n x n x n mesh of cubes mesh = Mesh() pids = [] for i in range(n + 1): for j in range(n + 1): for k in range(n + 1): pids.append(mesh.Add(MeshPoint(Pnt(i / n, j / n, k / n)))) for i in range(n): for j in range(n): for k in range(n): base = i * (n + 1) * (n + 1) + j * (n + 1) + k baseup = base + (n + 1) * (n + 1) pnum = [ base, base + 1, base + (n + 1) + 1, base + (n + 1), baseup, baseup + 1, baseup + (n + 1) + 1, baseup + (n + 1) ] elpids = [pids[p] for p in pnum] mesh.Add(Element3D(1, elpids)) def AddSurfEls(p1, dx, dy, facenr): for i in range(n): for j in range(n): base = p1 + i * dx + j * dy pnum = [base, base + dx, base + dx + dy, base + dy] elpids = [pids[p] for p in pnum] mesh.Add(Element2D(facenr, elpids)) # Face X = 0 mesh.Add(FaceDescriptor(surfnr=1, domin=1, bc=1)) AddSurfEls(0, 1, n + 1, facenr=1) # Face Y = 0 mesh.Add(FaceDescriptor(surfnr=2, domin=1, bc=2)) AddSurfEls(0, (n + 1) * (n + 1), 1, facenr=2) # Face Z = 0 mesh.Add(FaceDescriptor(surfnr=3, domin=1, bc=3)) AddSurfEls(0, n + 1, (n + 1) * (n + 1), facenr=3) # Face X = 1 mesh.Add(FaceDescriptor(surfnr=4, domin=1, bc=4)) AddSurfEls((n + 1)**3 - 1, -(n + 1), -1, facenr=4) # Face Z = 1 mesh.Add(FaceDescriptor(surfnr=5, domin=1, bc=5)) AddSurfEls((n + 1)**3 - 1, -(n + 1) * (n + 1), -(n + 1), facenr=5) # Face Y = 1 mesh.Add(FaceDescriptor(surfnr=6, domin=1, bc=6)) AddSurfEls((n + 1)**3 - 1, -1, -(n + 1) * (n + 1), facenr=6) # Set names for the above boundary parts (0-based indexing!) mesh.SetBCName(0, 'X0') mesh.SetBCName(1, 'Y0') mesh.SetBCName(2, 'Z0') mesh.SetBCName(3, 'X1') mesh.SetBCName(4, 'Z1') mesh.SetBCName(5, 'Y1') return mesh