ngsolve 6.2.2405.post37.dev1__cp39-cp39-win_amd64.whl → 6.2.2405.post45.dev1__cp39-cp39-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ngsolve might be problematic. Click here for more details.
- netgen/include/sparsematrix.hpp +5 -2
- netgen/include/statushandler.hpp +7 -0
- netgen/include/umfpackinverse.hpp +57 -29
- netgen/libngsolve.dll +0 -0
- ngsolve/cmake/NGSolveConfig.cmake +1 -1
- ngsolve/config/config.py +5 -5
- ngsolve/config.py +5 -5
- ngsolve/demos/TensorProduct/__init__.py +0 -0
- ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
- ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
- ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
- ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
- ngsolve/demos/__init__.py +0 -0
- ngsolve/demos/howto/__init__.py +0 -0
- ngsolve/demos/howto/hhj.py +44 -0
- ngsolve/demos/howto/hybrid_dg.py +53 -0
- ngsolve/demos/howto/mixed.py +30 -0
- ngsolve/demos/howto/nonlin.py +29 -0
- ngsolve/demos/howto/pickling.py +26 -0
- ngsolve/demos/howto/pml.py +31 -0
- ngsolve/demos/howto/taskmanager.py +20 -0
- ngsolve/demos/howto/tdnns.py +47 -0
- ngsolve/demos/howto/timeDG-skeleton.py +45 -0
- ngsolve/demos/howto/timeDG.py +38 -0
- ngsolve/demos/howto/timeDGlap.py +42 -0
- ngsolve/demos/howto/timeDGwave.py +61 -0
- ngsolve/demos/intro/__init__.py +0 -0
- ngsolve/demos/intro/adaptive.py +123 -0
- ngsolve/demos/intro/cmagnet.py +62 -0
- ngsolve/demos/intro/elasticity.py +76 -0
- ngsolve/demos/intro/navierstokes.py +74 -0
- ngsolve/demos/intro/poisson.ipynb +170 -0
- ngsolve/demos/intro/poisson.py +41 -0
- ngsolve/demos/mpi/__init__.py +0 -0
- ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
- ngsolve/demos/mpi/mpi_navierstokes.py +115 -0
- ngsolve/demos/mpi/mpi_poisson.py +89 -0
- ngsolve/demos/mpi/mpi_timeDG.py +79 -0
- ngsolve/ngslib.pyd +0 -0
- {ngsolve-6.2.2405.post37.dev1.dist-info → ngsolve-6.2.2405.post45.dev1.dist-info}/METADATA +2 -2
- {ngsolve-6.2.2405.post37.dev1.dist-info → ngsolve-6.2.2405.post45.dev1.dist-info}/RECORD +73 -42
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/Scripts/ngsolve.tcl +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/beam.geo +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/beam.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/chip.in2d +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/chip.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/coil.geo +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/coil.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/coilshield.geo +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/coilshield.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/cube.geo +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/cube.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d10_DGdoubleglazing.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d11_chip_nitsche.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d1_square.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d2_chip.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d3_helmholtz.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d4_cube.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d5_beam.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d6_shaft.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d7_coil.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d8_coilshield.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/d9_hybridDG.pde +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/doubleglazing.in2d +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/doubleglazing.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/shaft.geo +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/shaft.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/square.in2d +0 -0
- {ngsolve-6.2.2405.post37.dev1.data → ngsolve-6.2.2405.post45.dev1.data}/data/share/ngsolve/square.vol +0 -0
- {ngsolve-6.2.2405.post37.dev1.dist-info → ngsolve-6.2.2405.post45.dev1.dist-info}/LICENSE +0 -0
- {ngsolve-6.2.2405.post37.dev1.dist-info → ngsolve-6.2.2405.post45.dev1.dist-info}/WHEEL +0 -0
- {ngsolve-6.2.2405.post37.dev1.dist-info → ngsolve-6.2.2405.post45.dev1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from ngsolve import *
|
|
2
|
+
import netgen.geom2d
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (netgen.geom2d.unit_square.GenerateMesh(maxh=0.1))
|
|
5
|
+
|
|
6
|
+
v = FESpace ("h1ho", mesh, order=4, dirichlet=[1])
|
|
7
|
+
v2 = L2(mesh,order=2)
|
|
8
|
+
u = GridFunction (v)
|
|
9
|
+
u2 = GridFunction(v)
|
|
10
|
+
vec = u.vec
|
|
11
|
+
data = [v,v2,u,u2,u.vec]
|
|
12
|
+
|
|
13
|
+
import pickle
|
|
14
|
+
pickler = pickle.Pickler(open ("1.dat", "wb"))
|
|
15
|
+
pickler.dump (data)
|
|
16
|
+
del pickler
|
|
17
|
+
|
|
18
|
+
unpickler = pickle.Unpickler(open("1.dat","rb"))
|
|
19
|
+
fes,fes2,w,w2,z = unpickler.load()
|
|
20
|
+
|
|
21
|
+
assert fes.mesh is fes2.mesh
|
|
22
|
+
assert w.space is w2.space
|
|
23
|
+
|
|
24
|
+
assert len(z) == len(u.vec)
|
|
25
|
+
for i in range(len(u.vec)):
|
|
26
|
+
assert u.vec[i] == z[i]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from netgen.geom2d import SplineGeometry
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
geo = SplineGeometry()
|
|
5
|
+
geo.AddCircle( (0,0), 1.4, leftdomain=2)
|
|
6
|
+
geo.AddCircle( (0,0), 1, leftdomain=1, rightdomain=2)
|
|
7
|
+
geo.SetMaterial(1, "inner")
|
|
8
|
+
geo.SetMaterial(2, "pml")
|
|
9
|
+
mesh = Mesh(geo.GenerateMesh (maxh=0.1))
|
|
10
|
+
|
|
11
|
+
mesh.SetPML(pml.Radial(rad=1,alpha=1j,origin=(0,0)), "pml")
|
|
12
|
+
|
|
13
|
+
fes = H1(mesh, order=4, complex=True)
|
|
14
|
+
u = fes.TrialFunction()
|
|
15
|
+
v = fes.TestFunction()
|
|
16
|
+
|
|
17
|
+
omega = 10
|
|
18
|
+
|
|
19
|
+
a = BilinearForm(fes)
|
|
20
|
+
a += (grad(u)*grad(v)-omega*omega*u*v)*dx
|
|
21
|
+
|
|
22
|
+
f = LinearForm(fes)
|
|
23
|
+
f += exp(-20**2*((x-0.3)*(x-0.3)+y*y))*v*dx
|
|
24
|
+
|
|
25
|
+
a.Assemble()
|
|
26
|
+
f.Assemble()
|
|
27
|
+
|
|
28
|
+
gfu = GridFunction(fes)
|
|
29
|
+
gfu.vec.data = a.mat.Inverse() * f.vec
|
|
30
|
+
|
|
31
|
+
Draw(gfu)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from netgen.csg import unit_cube
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (unit_cube.GenerateMesh(maxh=0.4))
|
|
5
|
+
for l in range(3):
|
|
6
|
+
mesh.Refine()
|
|
7
|
+
|
|
8
|
+
fes = H1(mesh, order=3)
|
|
9
|
+
u,v = fes.TnT()
|
|
10
|
+
a = BilinearForm(fes)
|
|
11
|
+
a += grad(u) * grad(v) * dx
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
print('sequential assembly...')
|
|
15
|
+
a.Assemble()
|
|
16
|
+
|
|
17
|
+
print('parallel assembly...')
|
|
18
|
+
with TaskManager():
|
|
19
|
+
a.Assemble()
|
|
20
|
+
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#
|
|
2
|
+
# The tangential-displacement normal-normal-stress continuous method for elasticity
|
|
3
|
+
#
|
|
4
|
+
# A.S. Pechstein and J. Schoeberl:
|
|
5
|
+
# Tangential-displacement and normal-normal-stress continuous mixed finite elements for elasticity.
|
|
6
|
+
# Mathematical Models and Methods in Applied Sciences 21(8), 1761–1782, 2011.
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
from ngsolve import *
|
|
10
|
+
from netgen.geom2d import SplineGeometry
|
|
11
|
+
|
|
12
|
+
geo = SplineGeometry()
|
|
13
|
+
geo.AddRectangle( (0, 0), (10, 1), bcs = ("bottom", "right", "top", "left"))
|
|
14
|
+
mesh = Mesh( geo.GenerateMesh(maxh=0.5))
|
|
15
|
+
|
|
16
|
+
order = 3
|
|
17
|
+
V = HDivDiv(mesh, order=order-1, dirichlet="bottom|right|top", plus = True)
|
|
18
|
+
Q = HCurl(mesh, order=order, dirichlet="left", type1 = True)
|
|
19
|
+
X = V*Q
|
|
20
|
+
|
|
21
|
+
print ("ndof-V:", V.ndof, ", ndof-Q:", Q.ndof)
|
|
22
|
+
|
|
23
|
+
sigma, u = X.TrialFunction()
|
|
24
|
+
tau, v = X.TestFunction()
|
|
25
|
+
|
|
26
|
+
n = specialcf.normal(2)
|
|
27
|
+
|
|
28
|
+
def tang(u): return u-(u*n)*n
|
|
29
|
+
|
|
30
|
+
a = BilinearForm(X, symmetric=True)
|
|
31
|
+
a += (InnerProduct (sigma, tau) + div(sigma)*v + div(tau)*u - 1e-10 * u*v)*dx
|
|
32
|
+
a += (-(sigma*n) * tang(v) - (tau*n)*tang(u))*dx(element_boundary=True)
|
|
33
|
+
a.Assemble()
|
|
34
|
+
|
|
35
|
+
f = LinearForm(X)
|
|
36
|
+
f += 1 * v[1] * dx
|
|
37
|
+
f.Assemble()
|
|
38
|
+
|
|
39
|
+
u = GridFunction(X)
|
|
40
|
+
u.vec.data = a.mat.Inverse(X.FreeDofs(), inverse="sparsecholesky") * f.vec
|
|
41
|
+
|
|
42
|
+
Draw (u.components[0], mesh, name="sigma")
|
|
43
|
+
Draw (u.components[1], mesh, name="disp")
|
|
44
|
+
|
|
45
|
+
Draw (u.components[0][0], mesh, name="s11")
|
|
46
|
+
|
|
47
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
from netgen.geom2d import unit_square
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (unit_square.GenerateMesh(maxh=0.1))
|
|
5
|
+
|
|
6
|
+
fes = L2(mesh, order=4)
|
|
7
|
+
|
|
8
|
+
u = fes.TrialFunction()
|
|
9
|
+
v = fes.TestFunction()
|
|
10
|
+
|
|
11
|
+
b = CoefficientFunction( (y-0.5,0.5-x) )
|
|
12
|
+
bn = b*specialcf.normal(2)
|
|
13
|
+
|
|
14
|
+
ubnd = CoefficientFunction(0)
|
|
15
|
+
|
|
16
|
+
a = BilinearForm(fes)
|
|
17
|
+
a += (-u * b*grad(v)) .Compile()*dx
|
|
18
|
+
|
|
19
|
+
# the skeleton-formulation, sum over edges:
|
|
20
|
+
a += bn*IfPos(bn, u, u.Other()) * (v-v.Other()) * dx(skeleton=True)
|
|
21
|
+
a += bn*IfPos(bn, u, ubnd) * v * ds(skeleton=True)
|
|
22
|
+
|
|
23
|
+
# or the element-boundary formulation
|
|
24
|
+
# note the bnd-value in the .Other operator
|
|
25
|
+
# a += bn*IfPos(bn, u, u.Other(bnd=ubnd)) * v * dx(element_boundary=True)
|
|
26
|
+
|
|
27
|
+
u = GridFunction(fes)
|
|
28
|
+
u.Set(exp (-40 * ( (x-0.7)*(x-0.7) + (y-0.7)*(y-0.7) )))
|
|
29
|
+
|
|
30
|
+
w = u.vec.CreateVector()
|
|
31
|
+
|
|
32
|
+
Draw (u, autoscale=False, sd=2)
|
|
33
|
+
|
|
34
|
+
t = 0
|
|
35
|
+
tau = 1e-3
|
|
36
|
+
tend = 10
|
|
37
|
+
|
|
38
|
+
with TaskManager():
|
|
39
|
+
while t < tend:
|
|
40
|
+
a.Apply (u.vec, w)
|
|
41
|
+
fes.SolveM (rho=CoefficientFunction(1), vec=w)
|
|
42
|
+
u.vec.data -= tau * w
|
|
43
|
+
t += tau
|
|
44
|
+
Redraw()
|
|
45
|
+
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from netgen.geom2d import unit_square
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (unit_square.GenerateMesh(maxh=0.1))
|
|
5
|
+
|
|
6
|
+
fes = L2(mesh, order=4)
|
|
7
|
+
|
|
8
|
+
u = fes.TrialFunction()
|
|
9
|
+
v = fes.TestFunction()
|
|
10
|
+
|
|
11
|
+
b = CoefficientFunction( (y-0.5,0.5-x) )
|
|
12
|
+
bn = b*specialcf.normal(2)
|
|
13
|
+
|
|
14
|
+
ubnd = CoefficientFunction(0)
|
|
15
|
+
|
|
16
|
+
a = BilinearForm(fes)
|
|
17
|
+
a += -u * b*grad(v) * dx
|
|
18
|
+
a += bn*IfPos(bn, u, u.Other(bnd=ubnd)) * v * dx(element_boundary=True)
|
|
19
|
+
|
|
20
|
+
u = GridFunction(fes)
|
|
21
|
+
u.Set(exp (-40 * ( (x-0.7)*(x-0.7) + (y-0.7)*(y-0.7) )))
|
|
22
|
+
|
|
23
|
+
w = u.vec.CreateVector()
|
|
24
|
+
|
|
25
|
+
Draw (u, autoscale=False, sd=2)
|
|
26
|
+
|
|
27
|
+
t = 0
|
|
28
|
+
tau = 1e-3
|
|
29
|
+
tend = 10
|
|
30
|
+
|
|
31
|
+
with TaskManager():
|
|
32
|
+
while t < tend:
|
|
33
|
+
a.Apply (u.vec, w)
|
|
34
|
+
fes.SolveM (rho=CoefficientFunction(1), vec=w)
|
|
35
|
+
u.vec.data -= tau * w
|
|
36
|
+
t += tau
|
|
37
|
+
Redraw()
|
|
38
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from netgen.geom2d import unit_square
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (unit_square.GenerateMesh(maxh=0.05))
|
|
5
|
+
|
|
6
|
+
order=2
|
|
7
|
+
fes = L2(mesh, order=order)
|
|
8
|
+
|
|
9
|
+
u = fes.TrialFunction()
|
|
10
|
+
v = fes.TestFunction()
|
|
11
|
+
|
|
12
|
+
u0 = exp (-40 * ( (x-0.5)*(x-0.5) + (y-0.5)*(y-0.5) ))
|
|
13
|
+
|
|
14
|
+
n = specialcf.normal(2)
|
|
15
|
+
h = specialcf.mesh_size
|
|
16
|
+
|
|
17
|
+
a = BilinearForm(fes)
|
|
18
|
+
a += grad(u) * grad(v) * dx
|
|
19
|
+
cf1 = -0.5 * InnerProduct(grad(u), n)*(v-v.Other(bnd=0))
|
|
20
|
+
cf2 = -0.5 * InnerProduct(grad(v), n)*(u-u.Other(bnd=u0))
|
|
21
|
+
cf3 = 2*( (order+1)**2)/h * (u-u.Other(bnd=u0)) * v
|
|
22
|
+
a += (cf1+cf2+cf3)*dx(element_boundary=True)
|
|
23
|
+
|
|
24
|
+
u = GridFunction(fes)
|
|
25
|
+
u.Set(u0)
|
|
26
|
+
|
|
27
|
+
w = u.vec.CreateVector()
|
|
28
|
+
|
|
29
|
+
Draw (u, mesh, "u")
|
|
30
|
+
|
|
31
|
+
tau = 2e-6
|
|
32
|
+
tend = 0.5
|
|
33
|
+
|
|
34
|
+
t = 0
|
|
35
|
+
with TaskManager():
|
|
36
|
+
while t < tend:
|
|
37
|
+
a.Apply (u.vec, w)
|
|
38
|
+
fes.SolveM (rho=CoefficientFunction(1), vec=w)
|
|
39
|
+
u.vec.data -= tau * w
|
|
40
|
+
t += tau
|
|
41
|
+
Redraw()
|
|
42
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from netgen.geom2d import unit_square
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
mesh = Mesh (unit_square.GenerateMesh(maxh=0.05))
|
|
5
|
+
|
|
6
|
+
order=4
|
|
7
|
+
fes1 = L2(mesh, order=order)
|
|
8
|
+
fes = fes1*fes1*fes1
|
|
9
|
+
|
|
10
|
+
p,ux,uy = fes.TrialFunction()
|
|
11
|
+
q,vx,vy = fes.TestFunction()
|
|
12
|
+
|
|
13
|
+
u0 = exp (-400 * ( (x-0.5)*(x-0.5) + (y-0.5)*(y-0.5) ))
|
|
14
|
+
|
|
15
|
+
n = specialcf.normal(2)
|
|
16
|
+
|
|
17
|
+
v = CoefficientFunction( (vx, vy) )
|
|
18
|
+
u = CoefficientFunction( (ux, uy) )
|
|
19
|
+
|
|
20
|
+
a1 = BilinearForm(fes)
|
|
21
|
+
a1 += grad(p) * v * dx
|
|
22
|
+
a1 += -0.5 * (p - p.Other()) * (v*n) * dx(element_boundary = True)
|
|
23
|
+
|
|
24
|
+
a2 = BilinearForm(fes)
|
|
25
|
+
a2 += -grad(q) * u * dx
|
|
26
|
+
a2 += 0.5 * (q - q.Other()) * (u*n) * dx(element_boundary = True)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
u = GridFunction(fes)
|
|
30
|
+
u.components[0].Set(u0)
|
|
31
|
+
|
|
32
|
+
res = u.vec.CreateVector()
|
|
33
|
+
w = u.vec.CreateVector()
|
|
34
|
+
|
|
35
|
+
Draw (u.components[1], mesh, "ux")
|
|
36
|
+
Draw (u.components[2], mesh, "uy")
|
|
37
|
+
Draw (u.components[0], mesh, "p")
|
|
38
|
+
SetVisualization(min=-0.1, max=0.1, deformation=True)
|
|
39
|
+
|
|
40
|
+
tau = 1e-3
|
|
41
|
+
tend = 3
|
|
42
|
+
|
|
43
|
+
t = 0
|
|
44
|
+
nd = fes1.ndof
|
|
45
|
+
|
|
46
|
+
input ("<press enter>")
|
|
47
|
+
|
|
48
|
+
with TaskManager():
|
|
49
|
+
while t < tend:
|
|
50
|
+
a1.Apply (u.vec, w)
|
|
51
|
+
fes1.SolveM (rho=CoefficientFunction(1), vec=w.Range(nd,2*nd))
|
|
52
|
+
fes1.SolveM (rho=CoefficientFunction(1), vec=w.Range(2*nd,3*nd))
|
|
53
|
+
u.vec.data -= tau * w
|
|
54
|
+
|
|
55
|
+
a2.Apply (u.vec, w)
|
|
56
|
+
fes1.SolveM (rho=CoefficientFunction(1), vec=w.Range(0,nd))
|
|
57
|
+
u.vec.data -= tau * w
|
|
58
|
+
|
|
59
|
+
t += tau
|
|
60
|
+
Redraw()
|
|
61
|
+
|
|
File without changes
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
from ngsolve import *
|
|
2
|
+
from netgen.geom2d import SplineGeometry
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# point numbers 0, 1, ... 11
|
|
6
|
+
# sub-domain numbers (1), (2), (3)
|
|
7
|
+
#
|
|
8
|
+
#
|
|
9
|
+
# 7-------------6
|
|
10
|
+
# | |
|
|
11
|
+
# | (2) |
|
|
12
|
+
# | |
|
|
13
|
+
# 3------4-------------5------2
|
|
14
|
+
# | |
|
|
15
|
+
# | 11 |
|
|
16
|
+
# | / \ |
|
|
17
|
+
# | 10 (3) 9 |
|
|
18
|
+
# | \ / (1) |
|
|
19
|
+
# | 8 |
|
|
20
|
+
# | |
|
|
21
|
+
# 0---------------------------1
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
def MakeGeometry():
|
|
25
|
+
geometry = SplineGeometry()
|
|
26
|
+
|
|
27
|
+
# point coordinates ...
|
|
28
|
+
pnts = [ (0,0), (1,0), (1,0.6), (0,0.6), \
|
|
29
|
+
(0.2,0.6), (0.8,0.6), (0.8,0.8), (0.2,0.8), \
|
|
30
|
+
(0.5,0.15), (0.65,0.3), (0.5,0.45), (0.35,0.3) ]
|
|
31
|
+
pnums = [geometry.AppendPoint(*p) for p in pnts]
|
|
32
|
+
|
|
33
|
+
# start-point, end-point, boundary-condition, domain on left side, domain on right side:
|
|
34
|
+
lines = [ (0,1,1,1,0), (1,2,2,1,0), (2,5,2,1,0), (5,4,2,1,2), (4,3,2,1,0), (3,0,2,1,0), \
|
|
35
|
+
(5,6,2,2,0), (6,7,2,2,0), (7,4,2,2,0), \
|
|
36
|
+
(8,9,2,3,1), (9,10,2,3,1), (10,11,2,3,1), (11,8,2,3,1) ]
|
|
37
|
+
|
|
38
|
+
for p1,p2,bc,left,right in lines:
|
|
39
|
+
geometry.Append( ["line", pnums[p1], pnums[p2]], bc=bc, leftdomain=left, rightdomain=right)
|
|
40
|
+
return geometry
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
mesh = Mesh(MakeGeometry().GenerateMesh (maxh=0.2))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
fes = H1(mesh, order=3, dirichlet=[1], autoupdate=True)
|
|
48
|
+
u = fes.TrialFunction()
|
|
49
|
+
v = fes.TestFunction()
|
|
50
|
+
|
|
51
|
+
# one heat conductivity coefficient per sub-domain
|
|
52
|
+
lam = CoefficientFunction([1, 1000, 10])
|
|
53
|
+
a = BilinearForm(fes, symmetric=False)
|
|
54
|
+
a += lam*grad(u)*grad(v)*dx
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# heat-source in sub-domain 3
|
|
58
|
+
f = LinearForm(fes)
|
|
59
|
+
f += CoefficientFunction([0, 0, 1])*v*dx
|
|
60
|
+
|
|
61
|
+
c = MultiGridPreconditioner(a, inverse = "sparsecholesky")
|
|
62
|
+
|
|
63
|
+
gfu = GridFunction(fes, autoupdate=True)
|
|
64
|
+
Draw (gfu)
|
|
65
|
+
|
|
66
|
+
# finite element space and gridfunction to represent
|
|
67
|
+
# the heatflux:
|
|
68
|
+
space_flux = HDiv(mesh, order=2, autoupdate=True)
|
|
69
|
+
gf_flux = GridFunction(space_flux, "flux", autoupdate=True)
|
|
70
|
+
|
|
71
|
+
def SolveBVP():
|
|
72
|
+
a.Assemble()
|
|
73
|
+
f.Assemble()
|
|
74
|
+
inv = CGSolver(a.mat, c.mat)
|
|
75
|
+
gfu.vec.data = inv * f.vec
|
|
76
|
+
Redraw (blocking=True)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
l = []
|
|
81
|
+
|
|
82
|
+
def CalcError():
|
|
83
|
+
flux = lam * grad(gfu)
|
|
84
|
+
# interpolate finite element flux into H(div) space:
|
|
85
|
+
gf_flux.Set (flux)
|
|
86
|
+
|
|
87
|
+
# Gradient-recovery error estimator
|
|
88
|
+
err = 1/lam*(flux-gf_flux)*(flux-gf_flux)
|
|
89
|
+
elerr = Integrate (err, mesh, VOL, element_wise=True)
|
|
90
|
+
|
|
91
|
+
maxerr = max(elerr)
|
|
92
|
+
l.append ( (fes.ndof, sqrt(sum(elerr)) ))
|
|
93
|
+
print ("maxerr = ", maxerr)
|
|
94
|
+
|
|
95
|
+
for el in mesh.Elements():
|
|
96
|
+
mesh.SetRefinementFlag(el, elerr[el.nr] > 0.25*maxerr)
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
with TaskManager():
|
|
100
|
+
while fes.ndof < 100000:
|
|
101
|
+
SolveBVP()
|
|
102
|
+
CalcError()
|
|
103
|
+
mesh.Refine()
|
|
104
|
+
|
|
105
|
+
SolveBVP()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
## import matplotlib.pyplot as plt
|
|
111
|
+
|
|
112
|
+
## plt.yscale('log')
|
|
113
|
+
## plt.xscale('log')
|
|
114
|
+
## plt.xlabel("ndof")
|
|
115
|
+
## plt.ylabel("H1 error-estimate")
|
|
116
|
+
## ndof,err = zip(*l)
|
|
117
|
+
## plt.plot(ndof,err, "-*")
|
|
118
|
+
|
|
119
|
+
## plt.ion()
|
|
120
|
+
## plt.show()
|
|
121
|
+
|
|
122
|
+
## input("<press enter to quit>")
|
|
123
|
+
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
from netgen.csg import *
|
|
2
|
+
from ngsolve import *
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def MakeGeometry():
|
|
6
|
+
geometry = CSGeometry()
|
|
7
|
+
box = OrthoBrick(Pnt(-1,-1,-1),Pnt(2,1,2)).bc("outer")
|
|
8
|
+
|
|
9
|
+
core = OrthoBrick(Pnt(0,-0.05,0),Pnt(0.8,0.05,1))- \
|
|
10
|
+
OrthoBrick(Pnt(0.1,-1,0.1),Pnt(0.7,1,0.9))- \
|
|
11
|
+
OrthoBrick(Pnt(0.5,-1,0.4),Pnt(1,1,0.6)).maxh(0.2).mat("core")
|
|
12
|
+
|
|
13
|
+
coil = (Cylinder(Pnt(0.05,0,0), Pnt(0.05,0,1), 0.3) - \
|
|
14
|
+
Cylinder(Pnt(0.05,0,0), Pnt(0.05,0,1), 0.15)) * \
|
|
15
|
+
OrthoBrick (Pnt(-1,-1,0.3),Pnt(1,1,0.7)).maxh(0.2).mat("coil")
|
|
16
|
+
|
|
17
|
+
geometry.Add ((box-core-coil).mat("air"))
|
|
18
|
+
geometry.Add (core)
|
|
19
|
+
geometry.Add (coil)
|
|
20
|
+
return geometry
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
ngmesh = MakeGeometry().GenerateMesh(maxh=0.5)
|
|
25
|
+
ngmesh.Save("coil.vol")
|
|
26
|
+
mesh = Mesh(ngmesh)
|
|
27
|
+
|
|
28
|
+
# curve elements for geometry approximation
|
|
29
|
+
mesh.Curve(5)
|
|
30
|
+
|
|
31
|
+
ngsglobals.msg_level = 5
|
|
32
|
+
|
|
33
|
+
fes = HCurl(mesh, order=4, dirichlet="outer", nograds = True)
|
|
34
|
+
|
|
35
|
+
# u and v refer to trial and test-functions in the definition of forms below
|
|
36
|
+
u = fes.TrialFunction()
|
|
37
|
+
v = fes.TestFunction()
|
|
38
|
+
|
|
39
|
+
mur = mesh.MaterialCF({ "core" : 1000 }, default=1)
|
|
40
|
+
mu0 = 1.257e-6
|
|
41
|
+
nu = 1/(mu0*mur)
|
|
42
|
+
|
|
43
|
+
a = BilinearForm(fes, symmetric=True)
|
|
44
|
+
a += nu*curl(u)*curl(v)*dx + 1e-6*nu*u*v*dx
|
|
45
|
+
|
|
46
|
+
c = Preconditioner(a, type="bddc")
|
|
47
|
+
# c = Preconditioner(a, type="multigrid", flags = { "smoother" : "block" } )
|
|
48
|
+
|
|
49
|
+
f = LinearForm(fes)
|
|
50
|
+
f += CoefficientFunction((y,0.05-x,0)) * v * dx("coil")
|
|
51
|
+
|
|
52
|
+
u = GridFunction(fes)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
with TaskManager():
|
|
56
|
+
a.Assemble()
|
|
57
|
+
f.Assemble()
|
|
58
|
+
solver = CGSolver(mat=a.mat, pre=c.mat)
|
|
59
|
+
u.vec.data = solver * f.vec
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
Draw (u.Deriv(), mesh, "B-field", draw_surf=False)
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
#
|
|
2
|
+
# geometric non-linear elasticity with Neo-Hooke hyperelastic material
|
|
3
|
+
#
|
|
4
|
+
# featuring automatic differentiation in SymbolicEnergy
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
import netgen.geom2d as geom2d
|
|
8
|
+
from ngsolve import *
|
|
9
|
+
|
|
10
|
+
geo = geom2d.SplineGeometry()
|
|
11
|
+
pnums = [ geo.AddPoint (x,y,maxh=0.01) for x,y in [(0,0), (1,0), (1,0.1), (0,0.1)] ]
|
|
12
|
+
for p1,p2,bc in [(0,1,"bot"), (1,2,"right"), (2,3,"top"), (3,0,"left")]:
|
|
13
|
+
geo.Append(["line", pnums[p1], pnums[p2]], bc=bc)
|
|
14
|
+
mesh = Mesh(geo.GenerateMesh(maxh=0.05))
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
E, nu = 210, 0.2
|
|
18
|
+
mu = E / 2 / (1+nu)
|
|
19
|
+
lam = E * nu / ((1+nu)*(1-2*nu))
|
|
20
|
+
|
|
21
|
+
fes = H1(mesh, order=2, dirichlet="left", dim=mesh.dim)
|
|
22
|
+
# fes = VectorH1(mesh, order=2, dirichlet="left")
|
|
23
|
+
|
|
24
|
+
u = fes.TrialFunction()
|
|
25
|
+
|
|
26
|
+
force = CoefficientFunction( (0,1/2) )
|
|
27
|
+
|
|
28
|
+
I = Id(mesh.dim)
|
|
29
|
+
F = I + Grad(u)
|
|
30
|
+
C = F.trans * F
|
|
31
|
+
E = 0.5 * (C-I)
|
|
32
|
+
|
|
33
|
+
def Pow(a, b):
|
|
34
|
+
return a**b # exp (log(a)*b)
|
|
35
|
+
|
|
36
|
+
def NeoHooke (C):
|
|
37
|
+
return 0.5 * mu * (Trace(C-I) + 2*mu/lam * Pow(Det(C),-lam/2/mu) - 1)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
factor = Parameter(1)
|
|
42
|
+
|
|
43
|
+
a = BilinearForm(fes, symmetric=False)
|
|
44
|
+
a += Variation (NeoHooke(C).Compile()*dx)
|
|
45
|
+
a += Variation ((-factor * InnerProduct(force,u) ).Compile()*dx)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
u = GridFunction(fes)
|
|
49
|
+
u.vec[:] = 0
|
|
50
|
+
|
|
51
|
+
res = u.vec.CreateVector()
|
|
52
|
+
w = u.vec.CreateVector()
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
for loadstep in range(10):
|
|
56
|
+
|
|
57
|
+
print ("loadstep", loadstep)
|
|
58
|
+
factor.Set (loadstep+1)
|
|
59
|
+
|
|
60
|
+
for it in range(5):
|
|
61
|
+
print ("Newton iteration", it)
|
|
62
|
+
print ("energy = ", a.Energy(u.vec))
|
|
63
|
+
a.Apply(u.vec, res)
|
|
64
|
+
a.AssembleLinearization(u.vec)
|
|
65
|
+
inv = a.mat.Inverse(fes.FreeDofs() )
|
|
66
|
+
w.data = inv*res
|
|
67
|
+
print ("err^2 = ", InnerProduct (w,res))
|
|
68
|
+
u.vec.data -= w
|
|
69
|
+
|
|
70
|
+
Draw (u, mesh, "displacement")
|
|
71
|
+
SetVisualization (deformation=True)
|
|
72
|
+
input ("<press a key>")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from ngsolve import *
|
|
2
|
+
|
|
3
|
+
# viscosity
|
|
4
|
+
nu = 0.001
|
|
5
|
+
|
|
6
|
+
# timestepping parameters
|
|
7
|
+
tau = 0.001
|
|
8
|
+
tend = 10
|
|
9
|
+
|
|
10
|
+
from netgen.geom2d import SplineGeometry
|
|
11
|
+
geo = SplineGeometry()
|
|
12
|
+
geo.AddRectangle( (0, 0), (2, 0.41), bcs = ("wall", "outlet", "wall", "inlet"))
|
|
13
|
+
geo.AddCircle ( (0.2, 0.2), r=0.05, leftdomain=0, rightdomain=1, bc="cyl", maxh=0.02)
|
|
14
|
+
mesh = Mesh( geo.GenerateMesh(maxh=0.07))
|
|
15
|
+
|
|
16
|
+
mesh.Curve(3)
|
|
17
|
+
|
|
18
|
+
V = VectorH1(mesh,order=3, dirichlet="wall|cyl|inlet")
|
|
19
|
+
Q = H1(mesh,order=2)
|
|
20
|
+
|
|
21
|
+
X = V*Q
|
|
22
|
+
|
|
23
|
+
u,p = X.TrialFunction()
|
|
24
|
+
v,q = X.TestFunction()
|
|
25
|
+
|
|
26
|
+
stokes = nu*InnerProduct(grad(u), grad(v))+div(u)*q+div(v)*p - 1e-10*p*q
|
|
27
|
+
a = BilinearForm(X, symmetric=True)
|
|
28
|
+
a += stokes*dx
|
|
29
|
+
a.Assemble()
|
|
30
|
+
|
|
31
|
+
# nothing here ...
|
|
32
|
+
f = LinearForm(X)
|
|
33
|
+
f.Assemble()
|
|
34
|
+
|
|
35
|
+
# gridfunction for the solution
|
|
36
|
+
gfu = GridFunction(X)
|
|
37
|
+
|
|
38
|
+
# parabolic inflow at inlet:
|
|
39
|
+
uin = CoefficientFunction( (1.5*4*y*(0.41-y)/(0.41*0.41), 0) )
|
|
40
|
+
gfu.components[0].Set(uin, definedon=mesh.Boundaries("inlet"))
|
|
41
|
+
|
|
42
|
+
# solve Stokes problem for initial conditions:
|
|
43
|
+
inv_stokes = a.mat.Inverse(X.FreeDofs())
|
|
44
|
+
|
|
45
|
+
res = f.vec.CreateVector()
|
|
46
|
+
res.data = f.vec - a.mat*gfu.vec
|
|
47
|
+
gfu.vec.data += inv_stokes * res
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
# matrix for implicit Euler
|
|
51
|
+
mstar = BilinearForm(X, symmetric=True)
|
|
52
|
+
mstar += (u*v + tau*stokes)*dx
|
|
53
|
+
mstar.Assemble()
|
|
54
|
+
inv = mstar.mat.Inverse(X.FreeDofs(), inverse="sparsecholesky")
|
|
55
|
+
|
|
56
|
+
# the non-linear term
|
|
57
|
+
conv = BilinearForm(X, nonassemble = True)
|
|
58
|
+
conv += (grad(u) * u) * v * dx
|
|
59
|
+
|
|
60
|
+
# for visualization
|
|
61
|
+
Draw (Norm(gfu.components[0]), mesh, "velocity", sd=3)
|
|
62
|
+
|
|
63
|
+
# implicit Euler/explicit Euler splitting method:
|
|
64
|
+
t = 0
|
|
65
|
+
with TaskManager():
|
|
66
|
+
while t < tend:
|
|
67
|
+
print ("t=", t, end="\r")
|
|
68
|
+
|
|
69
|
+
conv.Apply (gfu.vec, res)
|
|
70
|
+
res.data += a.mat*gfu.vec
|
|
71
|
+
gfu.vec.data -= tau * inv * res
|
|
72
|
+
|
|
73
|
+
t = t + tau
|
|
74
|
+
Redraw()
|