ngsolve 6.2.2506.post74.dev0__cp314-cp314-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/analytic_integrals.hpp +10 -0
- netgen/include/arnoldi.hpp +55 -0
- netgen/include/bandmatrix.hpp +334 -0
- netgen/include/basematrix.hpp +957 -0
- netgen/include/basevector.hpp +1268 -0
- netgen/include/bdbequations.hpp +2805 -0
- netgen/include/bdbintegrator.hpp +1660 -0
- netgen/include/bem_diffops.hpp +475 -0
- netgen/include/bessel.hpp +1064 -0
- netgen/include/bilinearform.hpp +963 -0
- netgen/include/bla.hpp +29 -0
- netgen/include/blockalloc.hpp +95 -0
- netgen/include/blockjacobi.hpp +328 -0
- netgen/include/bspline.hpp +116 -0
- netgen/include/calcinverse.hpp +141 -0
- netgen/include/cg.hpp +368 -0
- netgen/include/chebyshev.hpp +44 -0
- netgen/include/cholesky.hpp +720 -0
- netgen/include/clapack.h +7254 -0
- netgen/include/code_generation.hpp +296 -0
- netgen/include/coefficient.hpp +2033 -0
- netgen/include/coefficient_impl.hpp +19 -0
- netgen/include/coefficient_stdmath.hpp +167 -0
- netgen/include/commutingAMG.hpp +106 -0
- netgen/include/comp.hpp +79 -0
- netgen/include/compatibility.hpp +41 -0
- netgen/include/complex_wrapper.hpp +73 -0
- netgen/include/compressedfespace.hpp +110 -0
- netgen/include/contact.hpp +235 -0
- netgen/include/diagonalmatrix.hpp +154 -0
- netgen/include/differentialoperator.hpp +276 -0
- netgen/include/diffop.hpp +1286 -0
- netgen/include/diffop_impl.hpp +328 -0
- netgen/include/diffopwithfactor.hpp +123 -0
- netgen/include/discontinuous.hpp +84 -0
- netgen/include/dump.hpp +949 -0
- netgen/include/ectypes.hpp +121 -0
- netgen/include/eigen.hpp +60 -0
- netgen/include/eigensystem.hpp +18 -0
- netgen/include/elasticity_equations.hpp +595 -0
- netgen/include/elementbyelement.hpp +195 -0
- netgen/include/elementtopology.hpp +1760 -0
- netgen/include/elementtransformation.hpp +339 -0
- netgen/include/evalfunc.hpp +405 -0
- netgen/include/expr.hpp +1686 -0
- netgen/include/facetfe.hpp +175 -0
- netgen/include/facetfespace.hpp +180 -0
- netgen/include/facethofe.hpp +111 -0
- netgen/include/facetsurffespace.hpp +112 -0
- netgen/include/fe_interfaces.hpp +32 -0
- netgen/include/fem.hpp +87 -0
- netgen/include/fesconvert.hpp +14 -0
- netgen/include/fespace.hpp +1449 -0
- netgen/include/finiteelement.hpp +286 -0
- netgen/include/globalinterfacespace.hpp +77 -0
- netgen/include/globalspace.hpp +115 -0
- netgen/include/gridfunction.hpp +525 -0
- netgen/include/h1amg.hpp +124 -0
- netgen/include/h1hofe.hpp +188 -0
- netgen/include/h1hofe_impl.hpp +1262 -0
- netgen/include/h1hofefo.hpp +148 -0
- netgen/include/h1hofefo_impl.hpp +185 -0
- netgen/include/h1hofespace.hpp +167 -0
- netgen/include/h1lofe.hpp +1240 -0
- netgen/include/h1lumping.hpp +41 -0
- netgen/include/hcurl_equations.hpp +1381 -0
- netgen/include/hcurlcurlfe.hpp +2241 -0
- netgen/include/hcurlcurlfespace.hpp +78 -0
- netgen/include/hcurlfe.hpp +259 -0
- netgen/include/hcurlfe_utils.hpp +107 -0
- netgen/include/hcurlhdiv_dshape.hpp +857 -0
- netgen/include/hcurlhdivfes.hpp +308 -0
- netgen/include/hcurlhofe.hpp +175 -0
- netgen/include/hcurlhofe_impl.hpp +1871 -0
- netgen/include/hcurlhofespace.hpp +193 -0
- netgen/include/hcurllofe.hpp +1146 -0
- netgen/include/hdiv_equations.hpp +880 -0
- netgen/include/hdivdivfe.hpp +2923 -0
- netgen/include/hdivdivsurfacespace.hpp +76 -0
- netgen/include/hdivfe.hpp +206 -0
- netgen/include/hdivfe_utils.hpp +717 -0
- netgen/include/hdivfes.hpp +75 -0
- netgen/include/hdivhofe.hpp +447 -0
- netgen/include/hdivhofe_impl.hpp +1107 -0
- netgen/include/hdivhofefo.hpp +229 -0
- netgen/include/hdivhofespace.hpp +177 -0
- netgen/include/hdivhosurfacefespace.hpp +106 -0
- netgen/include/hdivlofe.hpp +773 -0
- netgen/include/hidden.hpp +74 -0
- netgen/include/householder.hpp +181 -0
- netgen/include/hypre_ams_precond.hpp +123 -0
- netgen/include/hypre_precond.hpp +73 -0
- netgen/include/integrator.hpp +2012 -0
- netgen/include/integratorcf.hpp +253 -0
- netgen/include/interpolate.hpp +49 -0
- netgen/include/intrule.hpp +2542 -0
- netgen/include/intrules_SauterSchwab.hpp +25 -0
- netgen/include/irspace.hpp +49 -0
- netgen/include/jacobi.hpp +153 -0
- netgen/include/kernels.hpp +762 -0
- netgen/include/l2hofe.hpp +194 -0
- netgen/include/l2hofe_impl.hpp +564 -0
- netgen/include/l2hofefo.hpp +542 -0
- netgen/include/l2hofespace.hpp +344 -0
- netgen/include/la.hpp +38 -0
- netgen/include/linearform.hpp +266 -0
- netgen/include/matrix.hpp +2140 -0
- netgen/include/memusage.hpp +41 -0
- netgen/include/meshaccess.hpp +1359 -0
- netgen/include/mgpre.hpp +204 -0
- netgen/include/mp_coefficient.hpp +145 -0
- netgen/include/mptools.hpp +2281 -0
- netgen/include/multigrid.hpp +42 -0
- netgen/include/multivector.hpp +447 -0
- netgen/include/mumpsinverse.hpp +187 -0
- netgen/include/mycomplex.hpp +361 -0
- netgen/include/ng_lapack.hpp +1661 -0
- netgen/include/ngblas.hpp +1232 -0
- netgen/include/ngs_defines.hpp +30 -0
- netgen/include/ngs_stdcpp_include.hpp +106 -0
- netgen/include/ngs_utils.hpp +121 -0
- netgen/include/ngsobject.hpp +1019 -0
- netgen/include/ngsstream.hpp +113 -0
- netgen/include/ngstd.hpp +72 -0
- netgen/include/nodalhofe.hpp +96 -0
- netgen/include/nodalhofe_impl.hpp +141 -0
- netgen/include/normalfacetfe.hpp +223 -0
- netgen/include/normalfacetfespace.hpp +98 -0
- netgen/include/normalfacetsurfacefespace.hpp +84 -0
- netgen/include/order.hpp +251 -0
- netgen/include/parallel_matrices.hpp +222 -0
- netgen/include/paralleldofs.hpp +340 -0
- netgen/include/parallelngs.hpp +23 -0
- netgen/include/parallelvector.hpp +269 -0
- netgen/include/pardisoinverse.hpp +200 -0
- netgen/include/periodic.hpp +129 -0
- netgen/include/plateaufespace.hpp +25 -0
- netgen/include/pml.hpp +275 -0
- netgen/include/pmltrafo.hpp +631 -0
- netgen/include/postproc.hpp +142 -0
- netgen/include/potentialtools.hpp +22 -0
- netgen/include/precomp.hpp +60 -0
- netgen/include/preconditioner.hpp +602 -0
- netgen/include/prolongation.hpp +377 -0
- netgen/include/python_comp.hpp +107 -0
- netgen/include/python_fem.hpp +89 -0
- netgen/include/python_linalg.hpp +58 -0
- netgen/include/python_ngstd.hpp +386 -0
- netgen/include/recursive_pol.hpp +4896 -0
- netgen/include/recursive_pol_tet.hpp +395 -0
- netgen/include/recursive_pol_trig.hpp +492 -0
- netgen/include/reorderedfespace.hpp +81 -0
- netgen/include/sample_sort.hpp +105 -0
- netgen/include/scalarfe.hpp +335 -0
- netgen/include/shapefunction_utils.hpp +113 -0
- netgen/include/simd_complex.hpp +329 -0
- netgen/include/smoother.hpp +253 -0
- netgen/include/solve.hpp +89 -0
- netgen/include/sparsecholesky.hpp +313 -0
- netgen/include/sparsematrix.hpp +1038 -0
- netgen/include/sparsematrix_dyn.hpp +90 -0
- netgen/include/sparsematrix_impl.hpp +1013 -0
- netgen/include/special_matrix.hpp +463 -0
- netgen/include/specialelement.hpp +125 -0
- netgen/include/statushandler.hpp +33 -0
- netgen/include/stringops.hpp +12 -0
- netgen/include/superluinverse.hpp +136 -0
- netgen/include/symbolicintegrator.hpp +850 -0
- netgen/include/symmetricmatrix.hpp +144 -0
- netgen/include/tangentialfacetfe.hpp +224 -0
- netgen/include/tangentialfacetfespace.hpp +91 -0
- netgen/include/tensor.hpp +522 -0
- netgen/include/tensorcoefficient.hpp +446 -0
- netgen/include/tensorproductintegrator.hpp +113 -0
- netgen/include/thcurlfe.hpp +128 -0
- netgen/include/thcurlfe_impl.hpp +380 -0
- netgen/include/thdivfe.hpp +80 -0
- netgen/include/thdivfe_impl.hpp +492 -0
- netgen/include/tpdiffop.hpp +461 -0
- netgen/include/tpfes.hpp +133 -0
- netgen/include/tpintrule.hpp +224 -0
- netgen/include/triangular.hpp +465 -0
- netgen/include/tscalarfe.hpp +245 -0
- netgen/include/tscalarfe_impl.hpp +1029 -0
- netgen/include/umfpackinverse.hpp +148 -0
- netgen/include/vector.hpp +1273 -0
- netgen/include/voxelcoefficientfunction.hpp +41 -0
- netgen/include/vtkoutput.hpp +198 -0
- netgen/include/vvector.hpp +208 -0
- netgen/include/webgui.hpp +92 -0
- netgen/lib/libngsolve.lib +0 -0
- netgen/libngsolve.dll +0 -0
- netgen/ngscxx.bat +4 -0
- netgen/ngsld.bat +6 -0
- ngsolve/TensorProductTools.py +210 -0
- ngsolve/__console.py +94 -0
- ngsolve/__expr.py +181 -0
- ngsolve/__init__.py +148 -0
- ngsolve/_scikit_build_core_dependencies.py +30 -0
- ngsolve/bvp.py +78 -0
- ngsolve/cmake/NGSolveConfig.cmake +102 -0
- ngsolve/cmake/ngsolve-targets-release.cmake +19 -0
- ngsolve/cmake/ngsolve-targets.cmake +164 -0
- ngsolve/config/__init__.py +1 -0
- ngsolve/config/__main__.py +4 -0
- ngsolve/config/config.py +60 -0
- 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 +59 -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 +117 -0
- ngsolve/demos/mpi/mpi_poisson.py +89 -0
- ngsolve/demos/mpi/mpi_timeDG.py +82 -0
- ngsolve/directsolvers.py +26 -0
- ngsolve/eigenvalues.py +364 -0
- ngsolve/internal.py +89 -0
- ngsolve/krylovspace.py +1013 -0
- ngsolve/meshes.py +748 -0
- ngsolve/ngs2petsc.py +310 -0
- ngsolve/ngscxx.py +42 -0
- ngsolve/ngslib.lib +0 -0
- ngsolve/ngslib.pyd +0 -0
- ngsolve/nonlinearsolvers.py +203 -0
- ngsolve/preconditioners.py +11 -0
- ngsolve/solve_implementation.py +168 -0
- ngsolve/solvers.py +7 -0
- ngsolve/timestepping.py +185 -0
- ngsolve/timing.py +108 -0
- ngsolve/utils.py +167 -0
- ngsolve/webgui.py +670 -0
- ngsolve-6.2.2506.post74.dev0.data/data/Scripts/ngsolve.tcl +648 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.geo +17 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.vol +240 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.in2d +41 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.vol +614 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.geo +12 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.vol +2560 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.geo +19 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.vol +1832 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.geo +73 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.in2d +17 -0
- ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.vol +149 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/METADATA +14 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/RECORD +288 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/WHEEL +5 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/licenses/LICENSE +504 -0
- ngsolve-6.2.2506.post74.dev0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import functools
|
|
2
|
+
|
|
3
|
+
from ngsolve import (
|
|
4
|
+
BilinearForm,
|
|
5
|
+
GridFunction,
|
|
6
|
+
CoefficientFunction,
|
|
7
|
+
Region,
|
|
8
|
+
BND,
|
|
9
|
+
Preconditioner,
|
|
10
|
+
)
|
|
11
|
+
from .nonlinearsolvers import NewtonSolver
|
|
12
|
+
from .krylovspace import GMResSolver, LinearSolver
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Dirichlet:
|
|
16
|
+
def __init__(self, cf, region):
|
|
17
|
+
self.cf = cf
|
|
18
|
+
self.region = region
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Application:
|
|
22
|
+
def __init__(self, a: BilinearForm, gf: GridFunction):
|
|
23
|
+
self.a = a
|
|
24
|
+
self.gf = gf
|
|
25
|
+
|
|
26
|
+
def Solve(
|
|
27
|
+
self,
|
|
28
|
+
rhs,
|
|
29
|
+
*args,
|
|
30
|
+
dirichlet = None,
|
|
31
|
+
pre = None,
|
|
32
|
+
printrates: bool = False,
|
|
33
|
+
**kwargs,
|
|
34
|
+
):
|
|
35
|
+
raise NotImplementedError("Solve method must be implemented in subclasses")
|
|
36
|
+
|
|
37
|
+
def __eq__(self, other):
|
|
38
|
+
return Equation(self, other)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class NonLinearApplication(Application):
|
|
42
|
+
def Solve(
|
|
43
|
+
self,
|
|
44
|
+
rhs=None,
|
|
45
|
+
dirichlet = None,
|
|
46
|
+
printing: bool = False,
|
|
47
|
+
**kwargs,
|
|
48
|
+
):
|
|
49
|
+
solver_args = {}
|
|
50
|
+
|
|
51
|
+
if rhs is not None and rhs != 0:
|
|
52
|
+
rhs.Assemble()
|
|
53
|
+
solver_args["rhs"] = rhs
|
|
54
|
+
if "freedofs" in kwargs:
|
|
55
|
+
solver_args["freedofs"] = kwargs.pop("freedofs")
|
|
56
|
+
if "inverse" in kwargs:
|
|
57
|
+
solver_args["inverse"] = kwargs.pop("inverse")
|
|
58
|
+
solver = NewtonSolver(self.a, self.gf, **solver_args)
|
|
59
|
+
if dirichlet is not None:
|
|
60
|
+
dirichlet_gf = GridFunction(self.gf.space)
|
|
61
|
+
if isinstance(dirichlet, list):
|
|
62
|
+
for i in range(len(dirichlet)):
|
|
63
|
+
if dirichlet[i] is not None:
|
|
64
|
+
if isinstance(dirichlet[i], Dirichlet):
|
|
65
|
+
dirichlet_gf.components[i].Set(
|
|
66
|
+
dirichlet[i].cf, definedon=dirichlet[i].region
|
|
67
|
+
)
|
|
68
|
+
else:
|
|
69
|
+
dirichlet_gf.components[i].Set(dirichlet[i], BND)
|
|
70
|
+
elif isinstance(dirichlet, Dirichlet):
|
|
71
|
+
dirichlet_gf.Set(dirichlet.cf, definedon=dirichlet.region)
|
|
72
|
+
else:
|
|
73
|
+
dirichlet_gf.Set(dirichlet, BND)
|
|
74
|
+
solver.SetDirichlet(dirichlet_gf.vec)
|
|
75
|
+
solver.Solve(printing=printing, **kwargs)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class LinearApplication(Application):
|
|
79
|
+
def Assemble(self):
|
|
80
|
+
if not hasattr(self, "vec"):
|
|
81
|
+
self.vec = self.gf.vec.CreateVector()
|
|
82
|
+
self.a.Apply(self.gf.vec, self.vec)
|
|
83
|
+
|
|
84
|
+
def Solve(
|
|
85
|
+
self,
|
|
86
|
+
rhs,
|
|
87
|
+
*args,
|
|
88
|
+
dirichlet = None,
|
|
89
|
+
pre = None,
|
|
90
|
+
lin_solver=None,
|
|
91
|
+
lin_solver_args = None,
|
|
92
|
+
printrates: bool = False,
|
|
93
|
+
):
|
|
94
|
+
self.a.Assemble()
|
|
95
|
+
for arg in args:
|
|
96
|
+
if isinstance(arg, Dirichlet) or isinstance(arg, CoefficientFunction):
|
|
97
|
+
assert dirichlet is None, "Only one dirichlet condition can be set"
|
|
98
|
+
dirichlet = arg
|
|
99
|
+
if isinstance(arg, Preconditioner):
|
|
100
|
+
assert pre is None, "Only one preconditioner can be set"
|
|
101
|
+
pre = arg
|
|
102
|
+
if isinstance(arg, type) and issubclass(arg, LinearSolver):
|
|
103
|
+
assert lin_solver is None, "Only one linear solver can be set"
|
|
104
|
+
lin_solver = arg
|
|
105
|
+
rhs.Assemble()
|
|
106
|
+
if dirichlet is not None:
|
|
107
|
+
if isinstance(dirichlet, list):
|
|
108
|
+
for i in range(len(dirichlet)):
|
|
109
|
+
if dirichlet[i] is not None:
|
|
110
|
+
if isinstance(dirichlet[i], Dirichlet):
|
|
111
|
+
self.gf.components[i].Set(
|
|
112
|
+
dirichlet[i].cf, definedon=dirichlet[i].region
|
|
113
|
+
)
|
|
114
|
+
else:
|
|
115
|
+
self.gf.components[i].Set(dirichlet[i], BND)
|
|
116
|
+
elif isinstance(dirichlet, Dirichlet):
|
|
117
|
+
self.gf.Set(dirichlet.cf, definedon=dirichlet.region)
|
|
118
|
+
else:
|
|
119
|
+
self.gf.Set(dirichlet, BND)
|
|
120
|
+
rhs.vec.data += -self.a.mat * self.gf.vec
|
|
121
|
+
else:
|
|
122
|
+
self.gf.vec[:] = 0.0
|
|
123
|
+
if self.a.condense:
|
|
124
|
+
rhs.vec.data += self.a.harmonic_extension_trans * rhs.vec
|
|
125
|
+
if pre is None and lin_solver is None:
|
|
126
|
+
ainv = self.a.mat.Inverse(self.a.space.FreeDofs(self.a.condense))
|
|
127
|
+
else:
|
|
128
|
+
if lin_solver is None:
|
|
129
|
+
lin_solver = GMResSolver
|
|
130
|
+
if lin_solver_args is None:
|
|
131
|
+
lin_solver_args = {}
|
|
132
|
+
if pre is None:
|
|
133
|
+
freedofs = self.a.space.FreeDofs(self.a.condense)
|
|
134
|
+
else:
|
|
135
|
+
freedofs = None
|
|
136
|
+
if "printrates" not in lin_solver_args:
|
|
137
|
+
lin_solver_args["printrates"] = printrates
|
|
138
|
+
ainv = lin_solver(
|
|
139
|
+
mat=self.a.mat, pre=pre, freedofs=freedofs, **lin_solver_args
|
|
140
|
+
)
|
|
141
|
+
self.gf.vec.data += ainv * rhs.vec
|
|
142
|
+
if self.a.condense:
|
|
143
|
+
self.gf.vec.data += self.a.harmonic_extension * self.gf.vec
|
|
144
|
+
self.gf.vec.data += self.a.inner_solve * rhs.vec
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class Equation:
|
|
148
|
+
def __init__(self, lhs, rhs):
|
|
149
|
+
self.lhs = lhs
|
|
150
|
+
self.rhs = rhs
|
|
151
|
+
|
|
152
|
+
@functools.wraps(Application.Solve)
|
|
153
|
+
def Solve(self, *args, **kwargs):
|
|
154
|
+
self.lhs.Solve(self.rhs, *args, **kwargs)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _create_lin_appl(self, gfu: GridFunction) -> LinearApplication:
|
|
158
|
+
if not isinstance(gfu, GridFunction):
|
|
159
|
+
raise TypeError("gfu must be a GridFunction")
|
|
160
|
+
return LinearApplication(self, gfu)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
BilinearForm.__mul__ = _create_lin_appl
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@functools.wraps(Application.Solve)
|
|
167
|
+
def Solve(eq: Equation, *args, **kwargs):
|
|
168
|
+
eq.Solve(*args, **kwargs)
|
ngsolve/solvers.py
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
from ngsolve.eigenvalues import PINVIT, LOBPCG
|
|
2
|
+
from ngsolve.krylovspace import CG, QMR, MinRes, PreconditionedRichardson, GMRes
|
|
3
|
+
from ngsolve.krylovspace import CGSolver
|
|
4
|
+
from ngsolve.nonlinearsolvers import Newton, NewtonMinimization
|
|
5
|
+
from ngsolve.bvp import BVP
|
|
6
|
+
from ngsolve.directsolvers import SuperLU
|
|
7
|
+
|
ngsolve/timestepping.py
ADDED
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
|
|
2
|
+
import ngsolve as ngs
|
|
3
|
+
from typing import Type, Optional, Union, Callable
|
|
4
|
+
|
|
5
|
+
class ImplicitEuler:
|
|
6
|
+
def __init__(self,
|
|
7
|
+
equation: ngs.comp.SumOfIntegrals,
|
|
8
|
+
dt: Union[float, ngs.Parameter],
|
|
9
|
+
time: ngs.Parameter = ngs.Parameter(0),
|
|
10
|
+
pc_cls: Type = ngs.preconditioners.MultiGrid,
|
|
11
|
+
pc_args: Optional[dict] = None,
|
|
12
|
+
lin_solver_cls: Type = ngs.solvers.CGSolver,
|
|
13
|
+
lin_solver_args: Optional[dict] = None):
|
|
14
|
+
|
|
15
|
+
self.time = time
|
|
16
|
+
proxies = equation.GetProxies()
|
|
17
|
+
udts = list(filter(lambda u: u.dt_order == 1, proxies))
|
|
18
|
+
self.gfu_old = ngs.GridFunction(udts[0].space)
|
|
19
|
+
self.dt = ngs.Parameter(dt) if (isinstance(dt, float) or isinstance(dt, int)) else dt
|
|
20
|
+
replacements = {}
|
|
21
|
+
for udt in udts:
|
|
22
|
+
replacements[udt] = 1/self.dt * (udt.anti_dt - udt.anti_dt.ReplaceFunction(self.gfu_old))
|
|
23
|
+
self.bfmstar = ngs.BilinearForm(equation.Replace(replacements))
|
|
24
|
+
self.bfmstar.Assemble()
|
|
25
|
+
self.c = pc_cls(self.bfmstar, **(pc_args or {}))
|
|
26
|
+
self._lin_solver_cls = lin_solver_cls
|
|
27
|
+
self._lin_solver_args = lin_solver_args
|
|
28
|
+
|
|
29
|
+
def Integrate(self, u_start: ngs.GridFunction,
|
|
30
|
+
end_time: float,
|
|
31
|
+
start_time: Optional[float] = None,
|
|
32
|
+
newton_args: Optional[dict] = None,
|
|
33
|
+
callback: Optional[Callable] = None):
|
|
34
|
+
u = u_start
|
|
35
|
+
if start_time is not None:
|
|
36
|
+
self.time.Set(start_time)
|
|
37
|
+
while self.time.Get() < end_time * (1-1e-10):
|
|
38
|
+
dt = min(self.dt.Get(), end_time - self.time.Get())
|
|
39
|
+
self.time.Set(self.time.Get() + dt)
|
|
40
|
+
self.Step(u, dt=dt, newton_args=newton_args)
|
|
41
|
+
if callback is not None:
|
|
42
|
+
callback(self.time.Get(), u)
|
|
43
|
+
return u
|
|
44
|
+
|
|
45
|
+
def Step(self, u: ngs.GridFunction, dt: Optional[float] = None,
|
|
46
|
+
newton_args: Optional[dict] = None):
|
|
47
|
+
if dt is not None:
|
|
48
|
+
self.dt.Set(dt)
|
|
49
|
+
self.gfu_old.vec.data = u.vec
|
|
50
|
+
lin_solver = self._lin_solver_cls(mat=self.bfmstar.mat,
|
|
51
|
+
pre=self.c,
|
|
52
|
+
**(self._lin_solver_args or {}))
|
|
53
|
+
newton = ngs.nonlinearsolvers.NewtonSolver(a=self.bfmstar,
|
|
54
|
+
u=u,
|
|
55
|
+
solver=lin_solver)
|
|
56
|
+
newton.Solve(**(newton_args or {}))
|
|
57
|
+
|
|
58
|
+
class Newmark:
|
|
59
|
+
def __init__(self,
|
|
60
|
+
equation: ngs.comp.SumOfIntegrals,
|
|
61
|
+
dt: Union[float, ngs.Parameter],
|
|
62
|
+
time: ngs.Parameter = ngs.Parameter(0),
|
|
63
|
+
pc_cls: Type = ngs.preconditioners.MultiGrid,
|
|
64
|
+
pc_args: Optional[dict] = None,
|
|
65
|
+
lin_solver_cls: Type = ngs.solvers.CGSolver,
|
|
66
|
+
lin_solver_args: Optional[dict] = None):
|
|
67
|
+
self.time = time
|
|
68
|
+
proxies = equation.GetProxies()
|
|
69
|
+
udt2 = list(filter(lambda u: u.dt_order == 2, proxies))
|
|
70
|
+
if len(udt2) != 1:
|
|
71
|
+
raise ValueError("Only u.dt.dt allowed as time derivatives in newmark!")
|
|
72
|
+
udt2 = udt2[0]
|
|
73
|
+
self.gfu_old = ngs.GridFunction(udt2.space)
|
|
74
|
+
self.gfv_old = ngs.GridFunction(udt2.space)
|
|
75
|
+
self.gfa_old = ngs.GridFunction(udt2.space)
|
|
76
|
+
self.dt = ngs.Parameter(dt) if (isinstance(dt, float) or isinstance(dt, int)) else dt
|
|
77
|
+
self.bfmstar = ngs.BilinearForm(udt2.space)
|
|
78
|
+
u = udt2.anti_dt.anti_dt
|
|
79
|
+
vel_new = 2/self.dt * (u-self.gfu_old) - self.gfv_old
|
|
80
|
+
acc_new = 2/self.dt * (vel_new-self.gfv_old) - self.gfa_old
|
|
81
|
+
self.bfmstar += equation.Replace({ udt2: acc_new })
|
|
82
|
+
self.bfmstar.Assemble()
|
|
83
|
+
self.c = pc_cls(self.bfmstar, **(pc_args or {}))
|
|
84
|
+
self._lin_solver_cls = lin_solver_cls
|
|
85
|
+
self._lin_solver_args = lin_solver_args
|
|
86
|
+
|
|
87
|
+
def Integrate(self, u: ngs.GridFunction,
|
|
88
|
+
end_time: float,
|
|
89
|
+
v: Optional[ngs.GridFunction] = None,
|
|
90
|
+
a: Optional[ngs.GridFunction] = None,
|
|
91
|
+
start_time: Optional[float] = None,
|
|
92
|
+
newton_args: Optional[dict] = None,
|
|
93
|
+
callback: Optional[Callable] = None):
|
|
94
|
+
if start_time is not None:
|
|
95
|
+
self.time.Set(start_time)
|
|
96
|
+
if v is None:
|
|
97
|
+
v = ngs.GridFunction(u.space)
|
|
98
|
+
if a is None:
|
|
99
|
+
a = ngs.GridFunction(u.space)
|
|
100
|
+
while self.time.Get() < end_time * (1-1e-10):
|
|
101
|
+
dt = min(self.dt.Get(), end_time - self.time.Get())
|
|
102
|
+
self.time.Set(self.time.Get() + dt)
|
|
103
|
+
self.Step(u, v, a, dt=dt, newton_args=newton_args)
|
|
104
|
+
if callback is not None:
|
|
105
|
+
callback(self.time.Get(), u)
|
|
106
|
+
return u
|
|
107
|
+
|
|
108
|
+
def Step(self, u: ngs.GridFunction,
|
|
109
|
+
v: ngs.GridFunction,
|
|
110
|
+
a: ngs.GridFunction,
|
|
111
|
+
dt: Optional[float] = None,
|
|
112
|
+
newton_args: Optional[dict] = None):
|
|
113
|
+
if dt is not None:
|
|
114
|
+
self.dt.Set(dt)
|
|
115
|
+
self.gfu_old.vec.data = u.vec
|
|
116
|
+
self.gfv_old.vec.data = v.vec
|
|
117
|
+
self.gfa_old.vec.data = a.vec
|
|
118
|
+
lin_solver = self._lin_solver_cls(mat=self.bfmstar.mat,
|
|
119
|
+
pre=self.c,
|
|
120
|
+
**(self._lin_solver_args or {}))
|
|
121
|
+
newton = ngs.nonlinearsolvers.NewtonSolver(a=self.bfmstar,
|
|
122
|
+
u=u,
|
|
123
|
+
solver=lin_solver)
|
|
124
|
+
newton.Solve(**(newton_args or {}))
|
|
125
|
+
v.vec.data = 2/self.dt.Get() * (u.vec - self.gfu_old.vec) - self.gfv_old.vec
|
|
126
|
+
a.vec.data = 2/self.dt.Get() * (v.vec - self.gfv_old.vec) - self.gfa_old.vec
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
class CrankNicolson:
|
|
130
|
+
def __init__(self,
|
|
131
|
+
equation: ngs.comp.SumOfIntegrals,
|
|
132
|
+
dt: Union[float, ngs.Parameter],
|
|
133
|
+
time: ngs.Parameter = ngs.Parameter(0),
|
|
134
|
+
pc_cls: Type = ngs.preconditioners.MultiGrid,
|
|
135
|
+
pc_args: Optional[dict] = None,
|
|
136
|
+
lin_solver_cls: Type = ngs.solvers.CGSolver,
|
|
137
|
+
lin_solver_args: Optional[dict] = None):
|
|
138
|
+
self.time = time
|
|
139
|
+
proxies = equation.GetProxies()
|
|
140
|
+
fes = proxies[0].space
|
|
141
|
+
self.dt = ngs.Parameter(dt) if (isinstance(dt, float) or isinstance(dt, int)) else dt
|
|
142
|
+
self.gfu_old = ngs.GridFunction(fes)
|
|
143
|
+
replacements = {}
|
|
144
|
+
for p in proxies:
|
|
145
|
+
if p.dt_order == 1:
|
|
146
|
+
replacements[p] = 1/self.dt * (p.anti_dt - p.anti_dt.ReplaceFunction(self.gfu_old))
|
|
147
|
+
terms = 0.5 * equation.Replace(replacements)
|
|
148
|
+
for p in proxies:
|
|
149
|
+
if p.dt_order == 0:
|
|
150
|
+
replacements[p] = p.ReplaceFunction(self.gfu_old)
|
|
151
|
+
terms += 0.5 * equation.Replace(replacements)
|
|
152
|
+
self.bfmstar = ngs.BilinearForm(terms)
|
|
153
|
+
self.bfmstar.Assemble()
|
|
154
|
+
self.c = pc_cls(self.bfmstar, **(pc_args or {}))
|
|
155
|
+
self._lin_solver_cls = lin_solver_cls
|
|
156
|
+
self._lin_solver_args = lin_solver_args
|
|
157
|
+
|
|
158
|
+
def Integrate(self, u_start: ngs.GridFunction,
|
|
159
|
+
end_time: float,
|
|
160
|
+
start_time: Optional[float] = None,
|
|
161
|
+
newton_args: Optional[dict] = None,
|
|
162
|
+
callback: Optional[Callable] = None):
|
|
163
|
+
u = u_start
|
|
164
|
+
if start_time is not None:
|
|
165
|
+
self.time.Set(start_time)
|
|
166
|
+
while self.time.Get() < end_time * (1-1e-10):
|
|
167
|
+
dt = min(self.dt.Get(), end_time - self.time.Get())
|
|
168
|
+
self.time.Set(self.time.Get() + dt)
|
|
169
|
+
self.Step(u, dt=dt, newton_args=newton_args)
|
|
170
|
+
if callback is not None:
|
|
171
|
+
callback(self.time.Get(), u)
|
|
172
|
+
return u
|
|
173
|
+
|
|
174
|
+
def Step(self, u: ngs.GridFunction, dt: Optional[float] = None,
|
|
175
|
+
newton_args: Optional[dict] = None):
|
|
176
|
+
if dt is not None:
|
|
177
|
+
self.dt.Set(dt)
|
|
178
|
+
self.gfu_old.vec.data = u.vec
|
|
179
|
+
lin_solver = self._lin_solver_cls(mat=self.bfmstar.mat,
|
|
180
|
+
pre=self.c,
|
|
181
|
+
**(self._lin_solver_args or {}))
|
|
182
|
+
newton = ngs.nonlinearsolvers.NewtonSolver(a=self.bfmstar,
|
|
183
|
+
u=u,
|
|
184
|
+
solver=lin_solver)
|
|
185
|
+
newton.Solve(**(newton_args or {}))
|
ngsolve/timing.py
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pickle
|
|
3
|
+
from ngsolve import TaskManager
|
|
4
|
+
|
|
5
|
+
class Timing():
|
|
6
|
+
"""
|
|
7
|
+
Class for timing analysis of performance critical functions. Some
|
|
8
|
+
classes export a C++ function as __timing__, which returns a map
|
|
9
|
+
of performance critical parts with their timings. The class can save
|
|
10
|
+
these maps, load them and compare them. It can be saved as a benchmark
|
|
11
|
+
to be compared against.
|
|
12
|
+
|
|
13
|
+
2 overloaded __init__ functions:
|
|
14
|
+
|
|
15
|
+
1. __init__(name,obj,parallel=True,serial=True)
|
|
16
|
+
2. __init__(filename)
|
|
17
|
+
|
|
18
|
+
Parameters
|
|
19
|
+
----------
|
|
20
|
+
|
|
21
|
+
name (str): Name for the timed class (for output formatting and
|
|
22
|
+
saving/loading of results)
|
|
23
|
+
obj (NGSolve object): Some NGSolve class which has the __timing__
|
|
24
|
+
functionality implemented. Currently supported classes:
|
|
25
|
+
FESpace
|
|
26
|
+
filename (str): Filename to load a previously saved Timing
|
|
27
|
+
parallel (bool=True): Time in parallel (using TaskManager)
|
|
28
|
+
serial (bool=True): Time not in parallel (not using TaskManager)
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
def __init__(self,name=None,obj=None,filename=None,parallel=True,serial=True):
|
|
32
|
+
assert (not name and not obj and filename) or (name and obj and not filename)
|
|
33
|
+
if filename:
|
|
34
|
+
myself = pickle.load(open(filename,"rb"))
|
|
35
|
+
self.timings = myself.timings
|
|
36
|
+
self.name = myself.name
|
|
37
|
+
self.timings_par = myself.timings_par
|
|
38
|
+
else:
|
|
39
|
+
if serial:
|
|
40
|
+
self.timings = obj.__timing__()
|
|
41
|
+
else:
|
|
42
|
+
self.timings = None
|
|
43
|
+
if parallel:
|
|
44
|
+
with TaskManager():
|
|
45
|
+
self.timings_par = obj.__timing__()
|
|
46
|
+
else:
|
|
47
|
+
self.timings_par = None
|
|
48
|
+
self.name = name
|
|
49
|
+
|
|
50
|
+
def __str__(self):
|
|
51
|
+
string = "Timing for " + self.name + ":"
|
|
52
|
+
if self.timings:
|
|
53
|
+
for key, value in self.timings:
|
|
54
|
+
string += "\n" + key + ": " + value
|
|
55
|
+
if self.timings_par:
|
|
56
|
+
for key, value in self.timings_par:
|
|
57
|
+
string += "\n" + key + " parallel: " + value
|
|
58
|
+
return string
|
|
59
|
+
|
|
60
|
+
def Save(self, folder):
|
|
61
|
+
""" Saves the pickled results in folder 'folder' """
|
|
62
|
+
if not os.path.exists(folder):
|
|
63
|
+
os.makedirs(folder)
|
|
64
|
+
if folder[-1] == "/":
|
|
65
|
+
pickle.dump(self,open(folder + self.name + ".dat","wb"))
|
|
66
|
+
else:
|
|
67
|
+
pickle.dump(self,open(folder + "/" + self.name + ".dat","wb"))
|
|
68
|
+
|
|
69
|
+
def CompareTo(self,folder):
|
|
70
|
+
"""
|
|
71
|
+
Compares the timing with the one saved in folder 'folder' with filename
|
|
72
|
+
'name.dat'.
|
|
73
|
+
"""
|
|
74
|
+
try:
|
|
75
|
+
if folder[-1] == "/":
|
|
76
|
+
other = Timing(filename=folder + self.name + ".dat")
|
|
77
|
+
else:
|
|
78
|
+
other = Timing(filename=folder + "/" + self.name + ".dat")
|
|
79
|
+
except:
|
|
80
|
+
raise Exception("Other timing couldn't be loaded!")
|
|
81
|
+
result = []
|
|
82
|
+
dict_self = { key : value for key,value in self.timings }
|
|
83
|
+
dict_other = { key : value for key,value in other.timings }
|
|
84
|
+
for i, val in enumerate(self.timings):
|
|
85
|
+
try:
|
|
86
|
+
result.append((val[0], dict_self[val[0]]/dict_other[val[0]]))
|
|
87
|
+
except KeyError:
|
|
88
|
+
print("WARNING: No timing for '", val[0], "' in other file!")
|
|
89
|
+
dict_self_par = { key : value for key,value in self.timings_par }
|
|
90
|
+
dict_other_par = { key : value for key,value in other.timings_par }
|
|
91
|
+
for i,val in enumerate(self.timings_par):
|
|
92
|
+
try:
|
|
93
|
+
result.append((val[0]+" parallel", dict_self_par[val[0]]/dict_other_par[val[0]]))
|
|
94
|
+
except KeyError:
|
|
95
|
+
print("WARNING: No timing for '",val[0],"' with parallel in other file!")
|
|
96
|
+
return result
|
|
97
|
+
|
|
98
|
+
def CompareToBenchmark(self):
|
|
99
|
+
""" Compares the timing with the one stored as benchmark"""
|
|
100
|
+
return self.CompareTo("benchmark")
|
|
101
|
+
|
|
102
|
+
def SaveBenchmark(self):
|
|
103
|
+
""" Makes the timing the new benchmark for that object. """
|
|
104
|
+
self.Save("benchmark")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
__all__ = ["Timing"]
|
|
108
|
+
|
ngsolve/utils.py
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
from ngsolve.ngstd import IntRange
|
|
2
|
+
from ngsolve.fem import *
|
|
3
|
+
from ngsolve.comp import *
|
|
4
|
+
from ngsolve.bla import Norm
|
|
5
|
+
from netgen import TimeFunction, Timer
|
|
6
|
+
|
|
7
|
+
x = CoordCF(0)
|
|
8
|
+
y = CoordCF(1)
|
|
9
|
+
z = CoordCF(2)
|
|
10
|
+
|
|
11
|
+
dx = DifferentialSymbol(VOL)
|
|
12
|
+
ds = DifferentialSymbol(BND)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def Laplace (coef):
|
|
16
|
+
return BFI("laplace", coef=coef)
|
|
17
|
+
|
|
18
|
+
def Mass (coef):
|
|
19
|
+
return BFI("mass", coef=coef)
|
|
20
|
+
|
|
21
|
+
def Source (coef):
|
|
22
|
+
return LFI("source", coef=coef)
|
|
23
|
+
|
|
24
|
+
def Neumann (coef):
|
|
25
|
+
return LFI("neumann", coef=coef)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
# VectorFacet = TangentialFacetFESpace
|
|
29
|
+
def VectorFacet (mesh, **args):
|
|
30
|
+
print ("deprecated warning: VectorFacet is renamed to TangentialFacetFESpace")
|
|
31
|
+
return TangentialFacetFESpace(mesh, **args)
|
|
32
|
+
|
|
33
|
+
def grad(func):
|
|
34
|
+
try:
|
|
35
|
+
# now in C++ code
|
|
36
|
+
# if "normal vector" in str(func):
|
|
37
|
+
# return specialcf.Weingarten(func.dim)
|
|
38
|
+
if func.derivname == "grad":
|
|
39
|
+
return func.Deriv()
|
|
40
|
+
except:
|
|
41
|
+
pass
|
|
42
|
+
add = func.Operator("grad")
|
|
43
|
+
if add:
|
|
44
|
+
return add
|
|
45
|
+
# if func.derivname != "grad":
|
|
46
|
+
raise Exception("cannot form grad")
|
|
47
|
+
# return func.Deriv()
|
|
48
|
+
|
|
49
|
+
def Grad(func):
|
|
50
|
+
""" Jacobi-matrix"""
|
|
51
|
+
# now in C++ code
|
|
52
|
+
# if "normal vector" in str(func):
|
|
53
|
+
# return specialcf.Weingarten(func.dim)
|
|
54
|
+
try:
|
|
55
|
+
return func.Operator("Grad")
|
|
56
|
+
except:
|
|
57
|
+
return grad(func).trans
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def curl(func):
|
|
62
|
+
if func.derivname == "curl":
|
|
63
|
+
return func.Deriv()
|
|
64
|
+
add = func.Operator("curl")
|
|
65
|
+
if add:
|
|
66
|
+
return add
|
|
67
|
+
raise Exception("cannot form curl")
|
|
68
|
+
|
|
69
|
+
def div(func):
|
|
70
|
+
if func.derivname == "div":
|
|
71
|
+
return func.Deriv()
|
|
72
|
+
try:
|
|
73
|
+
return func.Operator("div")
|
|
74
|
+
except:
|
|
75
|
+
pass
|
|
76
|
+
try:
|
|
77
|
+
return Trace(grad(func))
|
|
78
|
+
except:
|
|
79
|
+
pass
|
|
80
|
+
#if func.derivname == "grad" and len(func.dims)==2: # should check for square
|
|
81
|
+
# return Trace(grad(func))
|
|
82
|
+
raise Exception("cannot form div")
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def ConstantCF(val):
|
|
86
|
+
print ("Warning: ConstantCF deprecated, just use CoefficientFunction(val)")
|
|
87
|
+
return CoefficientFunction(val)
|
|
88
|
+
|
|
89
|
+
def DomainConstantCF(values):
|
|
90
|
+
print ("Warning: DomainConstantCF deprecated, just use CoefficientFunction([values])")
|
|
91
|
+
return CoefficientFunction(values)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def Deviator(mat):
|
|
95
|
+
return mat - 1/mat.dims[0]*Trace(mat)*Id(mat.dims[0])
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def PyId(dim):
|
|
99
|
+
return CoefficientFunction( tuple( [1 if i==j else 0 for i in range(dim) for j in range(dim)]), dims=(dim,dim) )
|
|
100
|
+
|
|
101
|
+
def PyTrace(mat):
|
|
102
|
+
return sum( [mat[i,i] for i in range(mat.dims[0]) ])
|
|
103
|
+
|
|
104
|
+
def PyDet(mat):
|
|
105
|
+
if mat.dims[0] == 1:
|
|
106
|
+
return mat[0,0]
|
|
107
|
+
elif mat.dims[0] == 2:
|
|
108
|
+
return mat[0,0]*mat[1,1]-mat[0,1]*mat[1,0]
|
|
109
|
+
elif mat.dims[0] == 3:
|
|
110
|
+
return mat[0,0]*(mat[1,1]*mat[2,2]-mat[1,2]*mat[2,1]) \
|
|
111
|
+
+mat[1,0]*(mat[2,1]*mat[0,2]-mat[2,2]*mat[0,1]) \
|
|
112
|
+
+mat[2,0]*(mat[0,1]*mat[1,2]-mat[0,2]*mat[1,1])
|
|
113
|
+
|
|
114
|
+
def PyCross(a,b):
|
|
115
|
+
return CoefficientFunction( (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) )
|
|
116
|
+
|
|
117
|
+
def PyCof(m):
|
|
118
|
+
if m.dims[0] == 1:
|
|
119
|
+
return CoefficientFunction(1, dims=(1,1))
|
|
120
|
+
elif m.dims[0] == 2:
|
|
121
|
+
return CoefficientFunction( (m[1,1], -m[1,0], -m[0,1], m[0,0]), dims=(2,2) )
|
|
122
|
+
elif m.dims[0] == 3:
|
|
123
|
+
return CoefficientFunction(
|
|
124
|
+
( m[1,1]*m[2,2]-m[2,1]*m[1,2],
|
|
125
|
+
-m[1,0]*m[2,2]+m[2,0]*m[1,2],
|
|
126
|
+
m[1,0]*m[2,1]-m[2,0]*m[1,1],
|
|
127
|
+
|
|
128
|
+
-m[0,1]*m[2,2]+m[2,1]*m[0,2],
|
|
129
|
+
m[0,0]*m[2,2]-m[2,0]*m[0,2],
|
|
130
|
+
-m[0,0]*m[2,1]+m[2,0]*m[0,1],
|
|
131
|
+
|
|
132
|
+
m[0,1]*m[1,2]-m[1,1]*m[0,2],
|
|
133
|
+
-m[0,0]*m[1,2]+m[1,0]*m[0,2],
|
|
134
|
+
m[0,0]*m[1,1]-m[1,0]*m[0,1] ), dims=(3,3) )
|
|
135
|
+
|
|
136
|
+
def PyInv(m):
|
|
137
|
+
return 1/Det(m)*Cof(m).trans
|
|
138
|
+
|
|
139
|
+
def PySym(m):
|
|
140
|
+
return 0.5*(m+m.trans)
|
|
141
|
+
|
|
142
|
+
def PySkew(m):
|
|
143
|
+
return 0.5*(m-m.trans)
|
|
144
|
+
|
|
145
|
+
def OuterProduct(a, b):
|
|
146
|
+
# return CoefficientFunction( (a,), dims=(a.dim,1)) * CoefficientFunction( (b,), dims=(b.dim,1)).trans
|
|
147
|
+
# return CoefficientFunction(a, dims=(a.dim,1)) * CoefficientFunction(b, dims=(1, b.dim))
|
|
148
|
+
return a.Reshape((a.dim,1)) * b.Reshape((1, b.dim))
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
PrivateSpace = Hidden
|
|
152
|
+
# def PrivateSpace(fes):
|
|
153
|
+
# TODO: make space wrapper which also works after refinement
|
|
154
|
+
# fes.SetCouplingType(IntRange(0,fes.ndof), COUPLING_TYPE.HIDDEN_DOF)
|
|
155
|
+
# return Compress(fes)
|
|
156
|
+
# return Hidden(fes)
|
|
157
|
+
|
|
158
|
+
def Normalize (v):
|
|
159
|
+
return 1/Norm(v) * v
|
|
160
|
+
|
|
161
|
+
def printonce (*args):
|
|
162
|
+
from mpi4py.MPI import COMM_WORLD
|
|
163
|
+
if COMM_WORLD.rank == 0:
|
|
164
|
+
print (*args)
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
def dt(u): return u.dt
|