Esempio n. 1
0
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
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
        # 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])
Esempio n. 6
0
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))
Esempio n. 7
0
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)]
Esempio n. 8
0
    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)
Esempio n. 9
0
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 
Esempio n. 10
0
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)
Esempio n. 11
0
# 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
Esempio n. 13
0
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