コード例 #1
0
def test_new_integrateX_via_straight_cutted_quad3D_polynomial(order, domain, quad_dominated, alpha, dim):
    ngsglobals.msg_level = 0

    if (quad_dominated):
        mesh = MakeUniform3DGrid(quads = True, N=1, P1=(0,0,0),P2=(1,1,1))
    else:
        cube = OrthoBrick( Pnt(0,0,0), Pnt(1,1,1) ).bc(1)
        geom = CSGeometry()
        geom.Add (cube)
        ngmesh = geom.GenerateMesh(maxh=1.3, quad_dominated=quad_dominated)
        mesh = Mesh(ngmesh)
        
    levelset = 1 - 2*x- 2*y - 2*z
    val_pos = pow(2,-alpha-3)/(pow(alpha,3)+6*alpha*alpha + 11*alpha+6)
    referencevals = {POS: val_pos, NEG: 1./(alpha+1) - val_pos}
    
    lset_approx = GridFunction(H1(mesh,order=1))
    InterpolateToP1(levelset,lset_approx)
    
    f = dim**alpha
    
    integral = Integrate(levelset_domain = { "levelset" : lset_approx, "domain_type" : domain},
                         cf=f, mesh=mesh, order = order)
    error = abs(integral - referencevals[domain])
    
    assert error < 5e-15*(order+1)*(order+1)
コード例 #2
0
def test_new_integrateX_via_straight_cutted_quad3D(order, domain,
                                                   quad_dominated):
    if (quad_dominated):
        mesh = MakeUniform3DGrid(quads=True, N=1, P1=(0, 0, 0), P2=(1, 1, 1))
    else:
        cube = OrthoBrick(Pnt(0, 0, 0), Pnt(1, 1, 1)).bc(1)
        geom = CSGeometry()
        geom.Add(cube)
        ngmesh = geom.GenerateMesh(maxh=1.3, quad_dominated=quad_dominated)
        mesh = Mesh(ngmesh)

    levelset = 1 - 2 * x - 2 * y - 2 * z
    referencevals = {POS: 1. / 48, NEG: 47. / 48, IF: sqrt(3) / 8}

    lset_approx = GridFunction(H1(mesh, order=1))
    InterpolateToP1(levelset, lset_approx)

    f = CoefficientFunction(1)

    integral = Integrate(levelset_domain={
        "levelset": lset_approx,
        "domain_type": domain
    },
                         cf=f,
                         mesh=mesh,
                         order=order)
    print("Integral: ", integral)
    error = abs(integral - referencevals[domain])

    assert error < 5e-15 * (order + 1) * (order + 1)
コード例 #3
0
def presets_load_coefficientfunction_into_gridfunction():
    # 2D
    mesh_2d = ngs.Mesh(unit_square.GenerateMesh(maxh=0.1))
    fes_scalar_2d = ngs.H1(mesh_2d, order=2)
    fes_vector_2d = ngs.HDiv(mesh_2d, order=2)
    fes_mixed_2d = ngs.FESpace([fes_vector_2d, fes_scalar_2d])

    # 3D
    geo_3d = CSGeometry()
    geo_3d.Add(OrthoBrick(Pnt(-1, 0, 0), Pnt(1, 1, 1)).bc('outer'))
    mesh_3d = ngs.Mesh(geo_3d.GenerateMesh(maxh=0.3))
    fes_scalar_3d = ngs.H1(mesh_3d, order=2)
    fes_vector_3d = ngs.HDiv(mesh_3d, order=2)
    fes_mixed_3d = ngs.FESpace([fes_vector_3d, fes_scalar_3d])

    return mesh_2d, fes_scalar_2d, fes_vector_2d, fes_mixed_2d, mesh_3d, fes_scalar_3d, fes_vector_3d, fes_mixed_3d
コード例 #4
0
ファイル: test_quadchallenges.py プロジェクト: ymlou/ngsxfem
def test_new_integrateX_TPMC_case_quad3D2(order, quad_dominated, high_order):
    if quad_dominated:
        mesh = MakeUniform3DGrid(quads=True, N=10, P1=(0, 0, 0), P2=(1, 1, 1))
    else:
        geom = CSGeometry()
        geom.Add(OrthoBrick(Pnt(0, 0, 0), Pnt(1, 1, 1)).bc(1))
        ngmesh = geom.GenerateMesh(maxh=0.2134981)
        for i in range(4):
            ngmesh.Refine()
        mesh = Mesh(ngmesh)

    #phi = -4*(1-x)*(1-y)*(1-z) + 4*(1-x)*(1-y)*z -1*(1-x)*y*(1-z) - 1*(1-x)*y*z + 2*x*(1-y)*(1-z) -3 *x*(1-y)*z + 5 * x * y * (1-z) -1 *x *y*z
    phi = x * ((7 * y - 13) * z + 6) + y * (3 - 8 * z) + 8 * z - 4

    if high_order:
        print("Creating LevelSetMeshAdaptation class")
        lsetmeshadap = LevelSetMeshAdaptation(mesh,
                                              order=order,
                                              threshold=0.2,
                                              discontinuous_qn=True)
        lsetp1 = lsetmeshadap.lset_p1
        deformation = lsetmeshadap.CalcDeformation(phi)

        mesh.SetDeformation(deformation)
    else:
        lsetp1 = GridFunction(H1(mesh, order=1))
        lsetp1.Set(phi)

    f = CoefficientFunction(1)

    print("Doing integration")
    for domain in [POS, NEG, IF]:
        integral = Integrate(levelset_domain={
            "levelset": lsetp1,
            "domain_type": domain
        },
                             cf=f,
                             mesh=mesh,
                             order=order)
        print("Integral: ", integral, " ; domain = ", domain)

        if domain == IF:
            assert abs(integral - 1.82169) < 5e-3
        elif domain == NEG:
            assert abs(integral - 0.51681) < 1e-3
        else:
            assert abs(integral - 0.48319) < 1e-3
コード例 #5
0
 def _generateMesh(self, *args):
     from netgen.csg import CSGeometry, Sphere, Pnt
     from ngsolve import Mesh
     r = self.getRadius()
     geometry = CSGeometry()
     sphere = Sphere(Pnt(0, 0, 0), r).bc("sphere")
     geometry.Add(sphere)
     self.geometry = geometry
     self.mesh = Mesh(geometry.GenerateMesh(maxh=r / 5))
     ngsolve.Draw(self.mesh)
コード例 #6
0
def test_convection1d_dg():
    m = meshing.Mesh()
    m.dim = 1
    nel = 20
    pnums = []
    for i in range(0, nel + 1):
        pnums.append(m.Add(meshing.MeshPoint(Pnt(i / nel, 0, 0))))

    for i in range(0, nel):
        m.Add(meshing.Element1D([pnums[i], pnums[i + 1]], index=1))

    m.Add(meshing.Element0D(pnums[0], index=1))
    m.Add(meshing.Element0D(pnums[nel], index=2))
    m.AddPointIdentification(pnums[0],
                             pnums[nel],
                             identnr=1,
                             type=meshing.IdentificationType.PERIODIC)

    mesh = Mesh(m)

    fes = L2(mesh, order=4)

    u = fes.TrialFunction()
    v = fes.TestFunction()

    b = CoefficientFunction(1)
    bn = b * specialcf.normal(1)

    a = BilinearForm(fes)
    a += SymbolicBFI(-u * b * grad(v))
    a += SymbolicBFI(bn * IfPos(bn, u, u.Other()) * v, element_boundary=True)

    u = GridFunction(fes)
    pos = 0.5
    u0 = exp(-100 * (x - pos) * (x - pos))
    u.Set(u0)

    w = u.vec.CreateVector()

    t = 0
    tau = 1e-4
    tend = 1

    with TaskManager():
        while t < tend - tau / 2:
            a.Apply(u.vec, w)
            fes.SolveM(rho=CoefficientFunction(1), vec=w)
            u.vec.data -= tau * w
            t += tau

    l2error = sqrt(Integrate((u - u0) * (u - u0), mesh))
    print(l2error)
    assert l2error < 1e-2
コード例 #7
0
ファイル: test_backuprule.py プロジェクト: ngsxfem/ngsxfem
def test_new_integrateX_via_straight_cutted_quad3D(order, domain, quad):
    cube = OrthoBrick(Pnt(0, 0, 0), Pnt(1, 1, 1)).bc(1)
    geom = CSGeometry()
    geom.Add(cube)
    ngmesh = geom.GenerateMesh(maxh=1.3, quad_dominated=quad)
    mesh = Mesh(ngmesh)

    levelset = 1 - 2 * x - 2 * y - 2 * z
    referencevals = {POS: 1. / 48, NEG: 47. / 48, IF: sqrt(3) / 8}

    f = CoefficientFunction(1)

    integral = Integrate(levelset_domain={
        "levelset": levelset,
        "domain_type": domain
    },
                         cf=f,
                         mesh=mesh,
                         order=order)
    error = abs(integral - referencevals[domain])

    assert error < 5e-15 * (order + 1) * (order + 1)
コード例 #8
0
def discretize_ngsolve():
    from ngsolve import (ngsglobals, Mesh, H1, CoefficientFunction, LinearForm,
                         SymbolicLFI, BilinearForm, SymbolicBFI, grad,
                         TaskManager)
    from netgen.csg import CSGeometry, OrthoBrick, Pnt
    import numpy as np

    ngsglobals.msg_level = 1

    geo = CSGeometry()
    obox = OrthoBrick(Pnt(-1, -1, -1), Pnt(1, 1, 1)).bc("outer")

    b = []
    b.append(
        OrthoBrick(Pnt(-1, -1, -1), Pnt(0.0, 0.0,
                                        0.0)).mat("mat1").bc("inner"))
    b.append(
        OrthoBrick(Pnt(-1, 0, -1), Pnt(0.0, 1.0, 0.0)).mat("mat2").bc("inner"))
    b.append(
        OrthoBrick(Pnt(0, -1, -1), Pnt(1.0, 0.0, 0.0)).mat("mat3").bc("inner"))
    b.append(
        OrthoBrick(Pnt(0, 0, -1), Pnt(1.0, 1.0, 0.0)).mat("mat4").bc("inner"))
    b.append(
        OrthoBrick(Pnt(-1, -1, 0), Pnt(0.0, 0.0, 1.0)).mat("mat5").bc("inner"))
    b.append(
        OrthoBrick(Pnt(-1, 0, 0), Pnt(0.0, 1.0, 1.0)).mat("mat6").bc("inner"))
    b.append(
        OrthoBrick(Pnt(0, -1, 0), Pnt(1.0, 0.0, 1.0)).mat("mat7").bc("inner"))
    b.append(
        OrthoBrick(Pnt(0, 0, 0), Pnt(1.0, 1.0, 1.0)).mat("mat8").bc("inner"))
    box = (obox - b[0] - b[1] - b[2] - b[3] - b[4] - b[5] - b[6] - b[7])

    geo.Add(box)
    for bi in b:
        geo.Add(bi)
    # domain 0 is empty!

    mesh = Mesh(geo.GenerateMesh(maxh=0.3))

    # H1-conforming finite element space
    V = H1(mesh, order=NGS_ORDER, dirichlet="outer")
    v = V.TestFunction()
    u = V.TrialFunction()

    # Coeff as array: variable coefficient function (one CoefFct. per domain):
    sourcefct = CoefficientFunction([1 for i in range(9)])

    with TaskManager():
        # the right hand side
        f = LinearForm(V)
        f += SymbolicLFI(sourcefct * v)
        f.Assemble()

        # the bilinear-form
        mats = []
        coeffs = [[0, 1, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 1, 0],
                  [0, 0, 0, 1, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 0]]
        for c in coeffs:
            diffusion = CoefficientFunction(c)
            a = BilinearForm(V, symmetric=False)
            a += SymbolicBFI(diffusion * grad(u) * grad(v),
                             definedon=(np.where(np.array(c) == 1)[0] +
                                        1).tolist())
            a.Assemble()
            mats.append(a.mat)

    from pymor.bindings.ngsolve import NGSolveVectorSpace, NGSolveMatrixOperator, NGSolveVisualizer

    space = NGSolveVectorSpace(V)
    op = LincombOperator(
        [NGSolveMatrixOperator(m, space, space) for m in mats], [
            ProjectionParameterFunctional('diffusion', (len(coeffs), ), (i, ))
            for i in range(len(coeffs))
        ])

    h1_0_op = op.assemble([1] * len(coeffs)).with_(name='h1_0_semi')

    F = space.zeros()
    F._list[0].real_part.impl.vec.data = f.vec
    F = VectorOperator(F)

    return StationaryModel(op,
                           F,
                           visualizer=NGSolveVisualizer(mesh, V),
                           products={'h1_0_semi': h1_0_op},
                           parameter_space=CubicParameterSpace(
                               op.parameter_type, 0.1, 1.))
コード例 #9
0
ファイル: tracefem3d.py プロジェクト: mhochsteger/ngsxfem
"""
from math import pi
# ngsolve stuff
from ngsolve import *
# visualization stuff
from ngsolve.internal import *
# basic xfem functionality
from xfem import *
from xfem.lsetcurv import *

# from netgen.geom2d import SplineGeometry
from netgen.csg import CSGeometry, OrthoBrick, Pnt

# geometry
cube = CSGeometry()
cube.Add (OrthoBrick(Pnt(-1.41,-1.41,-1.41), Pnt(1.41,1.41,1.41)))
mesh = Mesh (cube.GenerateMesh(maxh=0.6, quad_dominated=False))

levelset = sqrt(x*x+y*y+z*z)-1

for i in range(1):
   lsetp1 = GridFunction(H1(mesh,order=1))
   InterpolateToP1(levelset,lsetp1)
   RefineAtLevelSet(lsetp1)
   mesh.Refine()
   
order = 3

# class to compute the mesh transformation needed for higher order accuracy
#  * order: order of the mesh deformation function
#  * threshold: barrier for maximum deformation (to ensure shape regularity)
コード例 #10
0
# integration on lset domains

from math import pi
# ngsolve stuff
from ngsolve import *
# basic xfem functionality
from xfem import *

from netgen.csg import CSGeometry, OrthoBrick, Pnt
cube = OrthoBrick(Pnt(0, 0, 0), Pnt(1, 1, 1)).bc(1)
geom = CSGeometry()
geom.Add(cube)
ngmesh = geom.GenerateMesh(maxh=1, quad_dominated=True)
mesh = Mesh(ngmesh)


def binary_pow(x, a):
    if a == 0:
        return 0 * x + 1
    elif a == 1:
        return x
    else:
        print("Invalid argument a")


#levelset coefficients
c = [[[1, -2], [-2, 0]], [[-2, 0], [0, 0]]]

#levelset = 1-2*x-2*y-2*z #(sqrt(x*x+y*y+z*z)-0.5)
levelset = sum([
    c[alpha][beta][gamma] * binary_pow(x, alpha) * binary_pow(y, beta) *
コード例 #11
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)]
コード例 #12
0
ファイル: make_uniform3D_grid.py プロジェクト: ymlou/ngsxfem
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 
コード例 #13
0
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
コード例 #14
0
          (x * x + z * z - 4) * (x * x + z * z - 4) + (y * y + z * z - 4) *
          (y * y + z * z - 4)) - 4).Compile(),
    # geometry from 'Dziuk, Elliott, Finite element methods for surface PDEs, Acta Numerica, 2013', pp. 318-319:
    "dziukelliott":
    sqrt(0.25 * x * x + y * y + 4.0 * z * z / ((1 + 0.5 * sin(pi * x)) *
                                               (1 + 0.5 * sin(pi * x)))) - 1.0,
    # geometry from 'Dziuk, Finite elements for the beltrami operator on arbitrary surfaces':
    "dziuk88":
    sqrt((x - z * z) * (x - z * z) + y * y + z * z) - 1.0,
    # the unit sphere
    "sphere":
    sqrt(x * x + y * y + z * z) - 1.0,
    # torus with parameters as in 'Grande, Reusken, A higher order finite element method for partial differential euqations on surface, SINUM, 2016'
    "torus":
    sqrt(z * z + (sqrt(x * x + y * y) - 1.0) *
         (sqrt(x * x + y * y) - 1.0)) - 0.6,
    # gyroid from Lehrenfeld, CMAME, 2016
    "gyroid":
    cos(pi * x) * sin(pi * y) + cos(pi * y) * sin(pi * z) +
    cos(pi * z) * sin(pi * x),
}

BoundingBoxes = {
    "cheese": OrthoBrick(Pnt(-2.5, -2.5, -2.5), Pnt(2.5, 2.5, 2.5)),
    "dziukelliott": OrthoBrick(Pnt(-2.5, -1.5, -1.5), Pnt(2.5, 1.5, 1.5)),
    "dziuk88": OrthoBrick(Pnt(-2, -2, -2), Pnt(2, 2, 2)),
    "sphere": OrthoBrick(Pnt(-1.5, -1.5, -1.5), Pnt(1.5, 1.5, 1.5)),
    "torus": OrthoBrick(Pnt(-2, -2, -2), Pnt(2, 2, 2)),
    "gyroid": OrthoBrick(Pnt(-1, -1, -1), Pnt(1, 1, 1)),
}