ngsolve 6.2.2506.post74.dev0__cp314-cp314-macosx_10_15_universal2.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.

Files changed (315) hide show
  1. netgen/include/analytic_integrals.hpp +10 -0
  2. netgen/include/arnoldi.hpp +55 -0
  3. netgen/include/bandmatrix.hpp +334 -0
  4. netgen/include/basematrix.hpp +957 -0
  5. netgen/include/basevector.hpp +1268 -0
  6. netgen/include/bdbequations.hpp +2805 -0
  7. netgen/include/bdbintegrator.hpp +1660 -0
  8. netgen/include/bem_diffops.hpp +475 -0
  9. netgen/include/bessel.hpp +1064 -0
  10. netgen/include/bilinearform.hpp +963 -0
  11. netgen/include/bla.hpp +29 -0
  12. netgen/include/blockalloc.hpp +95 -0
  13. netgen/include/blockjacobi.hpp +328 -0
  14. netgen/include/bspline.hpp +116 -0
  15. netgen/include/calcinverse.hpp +141 -0
  16. netgen/include/cg.hpp +368 -0
  17. netgen/include/chebyshev.hpp +44 -0
  18. netgen/include/cholesky.hpp +720 -0
  19. netgen/include/clapack.h +7254 -0
  20. netgen/include/code_generation.hpp +296 -0
  21. netgen/include/coefficient.hpp +2033 -0
  22. netgen/include/coefficient_impl.hpp +19 -0
  23. netgen/include/coefficient_stdmath.hpp +167 -0
  24. netgen/include/commutingAMG.hpp +106 -0
  25. netgen/include/comp.hpp +79 -0
  26. netgen/include/compatibility.hpp +41 -0
  27. netgen/include/complex_wrapper.hpp +73 -0
  28. netgen/include/compressedfespace.hpp +110 -0
  29. netgen/include/contact.hpp +235 -0
  30. netgen/include/diagonalmatrix.hpp +154 -0
  31. netgen/include/differentialoperator.hpp +276 -0
  32. netgen/include/diffop.hpp +1286 -0
  33. netgen/include/diffop_impl.hpp +328 -0
  34. netgen/include/diffopwithfactor.hpp +123 -0
  35. netgen/include/discontinuous.hpp +84 -0
  36. netgen/include/dump.hpp +949 -0
  37. netgen/include/ectypes.hpp +121 -0
  38. netgen/include/eigen.hpp +60 -0
  39. netgen/include/eigensystem.hpp +18 -0
  40. netgen/include/elasticity_equations.hpp +595 -0
  41. netgen/include/elementbyelement.hpp +195 -0
  42. netgen/include/elementtopology.hpp +1760 -0
  43. netgen/include/elementtransformation.hpp +339 -0
  44. netgen/include/evalfunc.hpp +405 -0
  45. netgen/include/expr.hpp +1686 -0
  46. netgen/include/facetfe.hpp +175 -0
  47. netgen/include/facetfespace.hpp +180 -0
  48. netgen/include/facethofe.hpp +111 -0
  49. netgen/include/facetsurffespace.hpp +112 -0
  50. netgen/include/fe_interfaces.hpp +32 -0
  51. netgen/include/fem.hpp +87 -0
  52. netgen/include/fesconvert.hpp +14 -0
  53. netgen/include/fespace.hpp +1449 -0
  54. netgen/include/finiteelement.hpp +286 -0
  55. netgen/include/globalinterfacespace.hpp +77 -0
  56. netgen/include/globalspace.hpp +115 -0
  57. netgen/include/gridfunction.hpp +525 -0
  58. netgen/include/h1amg.hpp +124 -0
  59. netgen/include/h1hofe.hpp +188 -0
  60. netgen/include/h1hofe_impl.hpp +1262 -0
  61. netgen/include/h1hofefo.hpp +148 -0
  62. netgen/include/h1hofefo_impl.hpp +185 -0
  63. netgen/include/h1hofespace.hpp +167 -0
  64. netgen/include/h1lofe.hpp +1240 -0
  65. netgen/include/h1lumping.hpp +41 -0
  66. netgen/include/hcurl_equations.hpp +1381 -0
  67. netgen/include/hcurlcurlfe.hpp +2241 -0
  68. netgen/include/hcurlcurlfespace.hpp +78 -0
  69. netgen/include/hcurlfe.hpp +259 -0
  70. netgen/include/hcurlfe_utils.hpp +107 -0
  71. netgen/include/hcurlhdiv_dshape.hpp +857 -0
  72. netgen/include/hcurlhdivfes.hpp +308 -0
  73. netgen/include/hcurlhofe.hpp +175 -0
  74. netgen/include/hcurlhofe_impl.hpp +1871 -0
  75. netgen/include/hcurlhofespace.hpp +193 -0
  76. netgen/include/hcurllofe.hpp +1146 -0
  77. netgen/include/hdiv_equations.hpp +880 -0
  78. netgen/include/hdivdivfe.hpp +2923 -0
  79. netgen/include/hdivdivsurfacespace.hpp +76 -0
  80. netgen/include/hdivfe.hpp +206 -0
  81. netgen/include/hdivfe_utils.hpp +717 -0
  82. netgen/include/hdivfes.hpp +75 -0
  83. netgen/include/hdivhofe.hpp +447 -0
  84. netgen/include/hdivhofe_impl.hpp +1107 -0
  85. netgen/include/hdivhofefo.hpp +229 -0
  86. netgen/include/hdivhofespace.hpp +177 -0
  87. netgen/include/hdivhosurfacefespace.hpp +106 -0
  88. netgen/include/hdivlofe.hpp +773 -0
  89. netgen/include/hidden.hpp +74 -0
  90. netgen/include/householder.hpp +181 -0
  91. netgen/include/hypre_ams_precond.hpp +123 -0
  92. netgen/include/hypre_precond.hpp +73 -0
  93. netgen/include/integrator.hpp +2012 -0
  94. netgen/include/integratorcf.hpp +253 -0
  95. netgen/include/interpolate.hpp +49 -0
  96. netgen/include/intrule.hpp +2542 -0
  97. netgen/include/intrules_SauterSchwab.hpp +25 -0
  98. netgen/include/irspace.hpp +49 -0
  99. netgen/include/jacobi.hpp +153 -0
  100. netgen/include/kernels.hpp +762 -0
  101. netgen/include/l2hofe.hpp +194 -0
  102. netgen/include/l2hofe_impl.hpp +564 -0
  103. netgen/include/l2hofefo.hpp +542 -0
  104. netgen/include/l2hofespace.hpp +344 -0
  105. netgen/include/la.hpp +38 -0
  106. netgen/include/linearform.hpp +266 -0
  107. netgen/include/matrix.hpp +2140 -0
  108. netgen/include/memusage.hpp +41 -0
  109. netgen/include/meshaccess.hpp +1359 -0
  110. netgen/include/mgpre.hpp +204 -0
  111. netgen/include/mp_coefficient.hpp +145 -0
  112. netgen/include/mptools.hpp +2281 -0
  113. netgen/include/multigrid.hpp +42 -0
  114. netgen/include/multivector.hpp +447 -0
  115. netgen/include/mumpsinverse.hpp +187 -0
  116. netgen/include/mycomplex.hpp +361 -0
  117. netgen/include/ng_lapack.hpp +1661 -0
  118. netgen/include/ngblas.hpp +1232 -0
  119. netgen/include/ngs_defines.hpp +30 -0
  120. netgen/include/ngs_stdcpp_include.hpp +106 -0
  121. netgen/include/ngs_utils.hpp +121 -0
  122. netgen/include/ngsobject.hpp +1019 -0
  123. netgen/include/ngsstream.hpp +113 -0
  124. netgen/include/ngstd.hpp +72 -0
  125. netgen/include/nodalhofe.hpp +96 -0
  126. netgen/include/nodalhofe_impl.hpp +141 -0
  127. netgen/include/normalfacetfe.hpp +223 -0
  128. netgen/include/normalfacetfespace.hpp +98 -0
  129. netgen/include/normalfacetsurfacefespace.hpp +84 -0
  130. netgen/include/order.hpp +251 -0
  131. netgen/include/parallel_matrices.hpp +222 -0
  132. netgen/include/paralleldofs.hpp +340 -0
  133. netgen/include/parallelngs.hpp +23 -0
  134. netgen/include/parallelvector.hpp +269 -0
  135. netgen/include/pardisoinverse.hpp +200 -0
  136. netgen/include/periodic.hpp +129 -0
  137. netgen/include/plateaufespace.hpp +25 -0
  138. netgen/include/pml.hpp +275 -0
  139. netgen/include/pmltrafo.hpp +631 -0
  140. netgen/include/postproc.hpp +142 -0
  141. netgen/include/potentialtools.hpp +22 -0
  142. netgen/include/precomp.hpp +60 -0
  143. netgen/include/preconditioner.hpp +602 -0
  144. netgen/include/prolongation.hpp +377 -0
  145. netgen/include/python_comp.hpp +107 -0
  146. netgen/include/python_fem.hpp +89 -0
  147. netgen/include/python_linalg.hpp +58 -0
  148. netgen/include/python_ngstd.hpp +386 -0
  149. netgen/include/recursive_pol.hpp +4896 -0
  150. netgen/include/recursive_pol_tet.hpp +395 -0
  151. netgen/include/recursive_pol_trig.hpp +492 -0
  152. netgen/include/reorderedfespace.hpp +81 -0
  153. netgen/include/sample_sort.hpp +105 -0
  154. netgen/include/scalarfe.hpp +335 -0
  155. netgen/include/shapefunction_utils.hpp +113 -0
  156. netgen/include/simd_complex.hpp +329 -0
  157. netgen/include/smoother.hpp +253 -0
  158. netgen/include/solve.hpp +89 -0
  159. netgen/include/sparsecholesky.hpp +313 -0
  160. netgen/include/sparsematrix.hpp +1038 -0
  161. netgen/include/sparsematrix_dyn.hpp +90 -0
  162. netgen/include/sparsematrix_impl.hpp +1013 -0
  163. netgen/include/special_matrix.hpp +463 -0
  164. netgen/include/specialelement.hpp +125 -0
  165. netgen/include/statushandler.hpp +33 -0
  166. netgen/include/stringops.hpp +12 -0
  167. netgen/include/superluinverse.hpp +136 -0
  168. netgen/include/symbolicintegrator.hpp +850 -0
  169. netgen/include/symmetricmatrix.hpp +144 -0
  170. netgen/include/tangentialfacetfe.hpp +224 -0
  171. netgen/include/tangentialfacetfespace.hpp +91 -0
  172. netgen/include/tensor.hpp +522 -0
  173. netgen/include/tensorcoefficient.hpp +446 -0
  174. netgen/include/tensorproductintegrator.hpp +113 -0
  175. netgen/include/thcurlfe.hpp +128 -0
  176. netgen/include/thcurlfe_impl.hpp +380 -0
  177. netgen/include/thdivfe.hpp +80 -0
  178. netgen/include/thdivfe_impl.hpp +492 -0
  179. netgen/include/tpdiffop.hpp +461 -0
  180. netgen/include/tpfes.hpp +133 -0
  181. netgen/include/tpintrule.hpp +224 -0
  182. netgen/include/triangular.hpp +465 -0
  183. netgen/include/tscalarfe.hpp +245 -0
  184. netgen/include/tscalarfe_impl.hpp +1029 -0
  185. netgen/include/umfpackinverse.hpp +148 -0
  186. netgen/include/vector.hpp +1273 -0
  187. netgen/include/voxelcoefficientfunction.hpp +41 -0
  188. netgen/include/vtkoutput.hpp +198 -0
  189. netgen/include/vvector.hpp +208 -0
  190. netgen/include/webgui.hpp +92 -0
  191. netgen/libngbla.dylib +0 -0
  192. netgen/libngcomp.dylib +0 -0
  193. netgen/libngfem.dylib +0 -0
  194. netgen/libngla.dylib +0 -0
  195. netgen/libngsbem.dylib +0 -0
  196. netgen/libngsolve.dylib +0 -0
  197. netgen/libngstd.dylib +0 -0
  198. ngsolve/TensorProductTools.py +210 -0
  199. ngsolve/__console.py +94 -0
  200. ngsolve/__expr.py +181 -0
  201. ngsolve/__init__.py +148 -0
  202. ngsolve/__init__.pyi +233 -0
  203. ngsolve/_scikit_build_core_dependencies.py +30 -0
  204. ngsolve/bla.pyi +1153 -0
  205. ngsolve/bvp.py +78 -0
  206. ngsolve/bvp.pyi +32 -0
  207. ngsolve/cmake/NGSolveConfig.cmake +102 -0
  208. ngsolve/cmake/ngsolve-targets-release.cmake +79 -0
  209. ngsolve/cmake/ngsolve-targets.cmake +163 -0
  210. ngsolve/comp/__init__.pyi +5449 -0
  211. ngsolve/comp/pml.pyi +89 -0
  212. ngsolve/config/__init__.py +1 -0
  213. ngsolve/config/__init__.pyi +43 -0
  214. ngsolve/config/__main__.py +4 -0
  215. ngsolve/config/config.py +60 -0
  216. ngsolve/config/config.pyi +45 -0
  217. ngsolve/demos/TensorProduct/__init__.py +0 -0
  218. ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
  219. ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
  220. ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
  221. ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
  222. ngsolve/demos/__init__.py +0 -0
  223. ngsolve/demos/howto/__init__.py +0 -0
  224. ngsolve/demos/howto/hhj.py +44 -0
  225. ngsolve/demos/howto/hybrid_dg.py +53 -0
  226. ngsolve/demos/howto/mixed.py +30 -0
  227. ngsolve/demos/howto/nonlin.py +29 -0
  228. ngsolve/demos/howto/pickling.py +26 -0
  229. ngsolve/demos/howto/pml.py +31 -0
  230. ngsolve/demos/howto/taskmanager.py +20 -0
  231. ngsolve/demos/howto/tdnns.py +47 -0
  232. ngsolve/demos/howto/timeDG-skeleton.py +45 -0
  233. ngsolve/demos/howto/timeDG.py +38 -0
  234. ngsolve/demos/howto/timeDGlap.py +42 -0
  235. ngsolve/demos/howto/timeDGwave.py +61 -0
  236. ngsolve/demos/intro/__init__.py +0 -0
  237. ngsolve/demos/intro/adaptive.py +123 -0
  238. ngsolve/demos/intro/cmagnet.py +59 -0
  239. ngsolve/demos/intro/elasticity.py +76 -0
  240. ngsolve/demos/intro/navierstokes.py +74 -0
  241. ngsolve/demos/intro/poisson.ipynb +170 -0
  242. ngsolve/demos/intro/poisson.py +41 -0
  243. ngsolve/demos/mpi/__init__.py +0 -0
  244. ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
  245. ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
  246. ngsolve/demos/mpi/mpi_poisson.py +89 -0
  247. ngsolve/demos/mpi/mpi_timeDG.py +82 -0
  248. ngsolve/directsolvers.py +26 -0
  249. ngsolve/directsolvers.pyi +15 -0
  250. ngsolve/eigenvalues.py +364 -0
  251. ngsolve/eigenvalues.pyi +30 -0
  252. ngsolve/fem.pyi +1647 -0
  253. ngsolve/internal.py +89 -0
  254. ngsolve/krylovspace.py +1013 -0
  255. ngsolve/krylovspace.pyi +298 -0
  256. ngsolve/la.pyi +1230 -0
  257. ngsolve/meshes.py +748 -0
  258. ngsolve/ngs2petsc.py +310 -0
  259. ngsolve/ngscxx.py +42 -0
  260. ngsolve/ngslib.so +0 -0
  261. ngsolve/ngstd.pyi +59 -0
  262. ngsolve/nonlinearsolvers.py +203 -0
  263. ngsolve/nonlinearsolvers.pyi +95 -0
  264. ngsolve/preconditioners.py +11 -0
  265. ngsolve/preconditioners.pyi +7 -0
  266. ngsolve/solve.pyi +109 -0
  267. ngsolve/solve_implementation.py +168 -0
  268. ngsolve/solve_implementation.pyi +42 -0
  269. ngsolve/solvers.py +7 -0
  270. ngsolve/solvers.pyi +14 -0
  271. ngsolve/timestepping.py +185 -0
  272. ngsolve/timestepping.pyi +28 -0
  273. ngsolve/timing.py +108 -0
  274. ngsolve/timing.pyi +54 -0
  275. ngsolve/utils.py +167 -0
  276. ngsolve/utils.pyi +273 -0
  277. ngsolve/webgui.py +670 -0
  278. ngsolve-6.2.2506.post74.dev0.data/data/Netgen.icns +0 -0
  279. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngscxx +17 -0
  280. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsld +13 -0
  281. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngsolve.tcl +648 -0
  282. ngsolve-6.2.2506.post74.dev0.data/data/bin/ngspy +2 -0
  283. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.geo +17 -0
  284. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/beam.vol +240 -0
  285. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.in2d +41 -0
  286. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/chip.vol +614 -0
  287. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.geo +12 -0
  288. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coil.vol +2560 -0
  289. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
  290. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
  291. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.geo +19 -0
  292. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/cube.vol +1832 -0
  293. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
  294. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
  295. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
  296. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
  297. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
  298. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
  299. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
  300. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
  301. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
  302. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
  303. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
  304. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
  305. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
  306. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
  307. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.geo +73 -0
  308. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
  309. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.in2d +17 -0
  310. ngsolve-6.2.2506.post74.dev0.data/data/share/ngsolve/square.vol +149 -0
  311. ngsolve-6.2.2506.post74.dev0.dist-info/METADATA +13 -0
  312. ngsolve-6.2.2506.post74.dev0.dist-info/RECORD +315 -0
  313. ngsolve-6.2.2506.post74.dev0.dist-info/WHEEL +5 -0
  314. ngsolve-6.2.2506.post74.dev0.dist-info/licenses/LICENSE +504 -0
  315. ngsolve-6.2.2506.post74.dev0.dist-info/top_level.txt +2 -0
ngsolve/ngs2petsc.py ADDED
@@ -0,0 +1,310 @@
1
+ import ngsolve as ngs
2
+ import netgen.meshing as ngm
3
+ import petsc4py.PETSc as psc
4
+ from mpi4py import MPI
5
+ import numpy as np
6
+
7
+ #PETSc Matrix
8
+
9
+ def CreatePETScMatrix (ngs_mat, freedofs=None):
10
+ locmat = ngs_mat.local_mat
11
+ eh, ew = locmat.entrysizes
12
+ if eh != ew: raise Exception ("only square entries are allowed")
13
+
14
+ val,col,ind = locmat.CSR()
15
+ ind = np.array(ind).astype(psc.IntType)
16
+ col = np.array(col).astype(psc.IntType)
17
+ apsc_loc = psc.Mat().createBAIJ(size=(eh*locmat.height, eh*locmat.width), bsize=eh, csr=(ind,col,val), comm=MPI.COMM_SELF)
18
+
19
+ if freedofs is not None:
20
+ locfree = np.flatnonzero(freedofs).astype(psc.IntType)
21
+ isfree_loc = psc.IS().createBlock(indices=locfree, bsize=eh)
22
+ apsc_loc = apsc_loc.createSubMatrices(isfree_loc)[0]
23
+
24
+ comm = MPI.COMM_WORLD
25
+ if comm.Get_size() > 1:
26
+ pardofs = ngs_mat.row_pardofs
27
+ comm = pardofs.comm.mpi4py
28
+ globnums, nglob = pardofs.EnumerateGlobally(freedofs)
29
+ if freedofs is not None:
30
+ globnums = np.array(globnums, dtype=psc.IntType)[freedofs]
31
+ lgmap = psc.LGMap().create(indices=globnums, bsize=eh, comm=comm)
32
+ mat = psc.Mat().create(comm=comm)
33
+ mat.setSizes(size=nglob*eh, bsize=eh)
34
+ mat.setType(psc.Mat.Type.IS)
35
+ mat.setLGMap(lgmap)
36
+ mat.setISLocalMat(apsc_loc)
37
+ mat.assemble()
38
+ mat.convert("mpiaij")
39
+ return mat
40
+ else:
41
+ if freedofs is not None:
42
+ mat = apsc_loc
43
+ mat.assemble()
44
+ mat.convert("seqaij")
45
+ return mat
46
+
47
+
48
+ #PETSc Vector
49
+
50
+ class VectorMapping:
51
+ def __init__ (self, pardofs, freedofs=None):
52
+ self.pardofs = pardofs
53
+ self.freedofs = freedofs
54
+ comm = pardofs.comm.mpi4py
55
+ globnums, self.nglob = pardofs.EnumerateGlobally(freedofs)
56
+ self.es = self.pardofs.entrysize
57
+ if self.freedofs is not None:
58
+ globnums = np.array(globnums, dtype=psc.IntType)[freedofs]
59
+ self.locfree = np.flatnonzero(freedofs).astype(psc.IntType)
60
+ self.isetlocfree = psc.IS().createBlock (indices=self.locfree, bsize=self.es, comm=comm)
61
+ else:
62
+ self.isetlocfree = None
63
+ self.iset = psc.IS().createBlock (indices=globnums, bsize=self.es, comm=comm)
64
+
65
+ def CreatePETScVector (self):
66
+ return psc.Vec().createMPI(self.pardofs.ndofglobal, comm=MPI.COMM_WORLD)
67
+
68
+ def CreateNGSolveVector (self):
69
+ return ngs.la.CreateParallelVector(self.pardofs)
70
+
71
+ def N2P (self, ngs_vector, psc_vector=None):
72
+ if psc_vector is None:
73
+ psc_vector = psc.Vec().createMPI(self.nglob*self.es, bsize=self.es, comm=MPI.COMM_WORLD)
74
+ ngs_vector.Distribute()
75
+ locvec = psc.Vec().createWithArray(ngs_vector.FV().NumPy(), comm=MPI.COMM_SELF)
76
+ if "n2p_scat" not in self.__dict__:
77
+ self.n2p_scat = psc.Scatter().create(locvec, self.isetlocfree, psc_vector, self.iset)
78
+ psc_vector.set(0)
79
+ self.n2p_scat.scatter (locvec, psc_vector, addv=psc.InsertMode.ADD) # 1 max, 2 sum+keep
80
+ return psc_vector
81
+
82
+ def P2N (self, psc_vector, ngs_vector=None):
83
+ if ngs_vector is None:
84
+ ngs_vector = ngs.la.CreateParallelVector(self.pardofs)
85
+
86
+ ngs_vector.SetParallelStatus(ngs.la.PARALLEL_STATUS.CUMULATED)
87
+ ngs_vector[:] = 0.0
88
+ locvec = psc.Vec().createWithArray(ngs_vector.FV().NumPy(), comm=MPI.COMM_SELF)
89
+ if "p2n_scat" not in self.__dict__:
90
+ self.p2n_scat = psc.Scatter().create(psc_vector, self.iset, locvec, self.isetlocfree)
91
+ self.p2n_scat.scatter (psc_vector, locvec, addv=psc.InsertMode.INSERT)
92
+ return ngs_vector
93
+
94
+
95
+ #PETSc Preconditioner
96
+
97
+ class PETScPreconditioner(ngs.BaseMatrix):
98
+ def __init__(self,mat,freedofs=None, solverParameters=None):
99
+ ngs.BaseMatrix.__init__(self)
100
+ self.ngsmat = mat
101
+ self.vecmap = VectorMapping (mat.row_pardofs, freedofs)
102
+ self.pscmat = CreatePETScMatrix (mat, freedofs)
103
+ self.precond = psc.PC().create(comm=self.pscmat.getComm())
104
+
105
+ self.precond.setOperators(self.pscmat)
106
+ options_object = psc.Options()
107
+ if solverParameters is not None:
108
+ for optName, optValue in solverParameters.items():
109
+ options_object[optName] = optValue
110
+
111
+ self.precond.setOptionsPrefix(None) # optionsPrefix)
112
+ self.precond.setFromOptions()
113
+ self.precond.setUp()
114
+ self.pscx, self.pscy = self.pscmat.createVecs()
115
+
116
+ def Shape(self):
117
+ return self.ngsmat.shape
118
+ def CreateVector(self,col):
119
+ return self.ngsmat.CreateVector(not col)
120
+
121
+ def Mult(self,x,y):
122
+ self.vecmap.N2P(x,self.pscx)
123
+ self.precond.apply(self.pscx, self.pscy)
124
+ self.vecmap.P2N(self.pscy, y)
125
+
126
+ def MultTrans(self,x,y):
127
+ self.vecmap.N2P(x,self.pscx)
128
+ self.precond.applyTranspose(self.pscx, self.pscy)
129
+ self.vecmap.P2N(self.pscy, y)
130
+
131
+
132
+ from ngsolve.comp import RegisterPreconditioner
133
+
134
+ # for backward compatibility
135
+ def MakeGAMGPreconditioner(mat, freedofs, flags):
136
+ flags.Set("pc_type", "gamg")
137
+ return PETScPreconditioner(mat, freedofs, flags)
138
+
139
+ RegisterPreconditioner ("gamg", MakeGAMGPreconditioner)
140
+
141
+
142
+ def MakePETScPreconditioner(mat, freedofs, flags):
143
+ return PETScPreconditioner(mat, freedofs, flags)
144
+
145
+ RegisterPreconditioner ("petsc", MakePETScPreconditioner, docflags = { \
146
+ "pc_type" : "type of PETSc preconditioner",
147
+ "levels" : "AMG levels" })
148
+
149
+
150
+ #PETSc DMPlex
151
+
152
+ FACE_SETS_LABEL = "Face Sets"
153
+ CELL_SETS_LABEL = "Cell Sets"
154
+ EDGE_SETS_LABEL = "Edge Sets"
155
+
156
+ class DMPlexMapping:
157
+ def __init__(self,mesh=None,name="Default"):
158
+ self.name = name
159
+ print(type(mesh))
160
+ if type(mesh) is ngs.comp.Mesh or type(mesh) is ngm.Mesh:
161
+ self.createPETScDMPlex(mesh)
162
+ elif type(mesh) is psc.DMPlex:
163
+ self.createNGSMesh(mesh)
164
+ else:
165
+ raise ValueError("Mesh format not recognised.")
166
+ def createNGSMesh(self,plex):
167
+ ngmesh = ngm.Mesh(dim=plex.getCoordinateDim())
168
+ self.ngmesh = ngmesh
169
+ if plex.getDimension() == 2:
170
+ coordinates = plex.getCoordinates().getArray().reshape([-1,2])
171
+ self.ngmesh.AddPoints(coordinates)
172
+ cstart,cend = plex.getHeightStratum(0)
173
+ vstart, vend = plex.getHeightStratum(2)
174
+ cells = []
175
+ for i in range(cstart,cend):
176
+ sIndex = plex.getCone(i)
177
+ s1 = plex.getCone(sIndex[0])-vstart
178
+ s2 = plex.getCone(sIndex[1])-vstart
179
+ if np.linalg.det(np.array([coordinates[s1[1]]-coordinates[s1[0]],coordinates[s2[1]]-coordinates[s1[1]]])) < 0.:
180
+ cells = cells+[[s1[1],s1[0],s2[1]]]
181
+ else:
182
+ cells = cells+[[s1[0],s1[1],s2[1]]]
183
+
184
+ fd = ngmesh.Add(ngm.FaceDescriptor(bc=1))
185
+ self.ngmesh.AddElements(dim=plex.getDimension(), index=1, data=np.asarray(cells,dtype=np.int32), base=0)
186
+
187
+ def createPETScDMPlex(self,mesh):
188
+ if type(mesh) is ngs.comp.Mesh:
189
+ self.ngmesh = mesh.ngmesh
190
+ else:
191
+ self.ngmesh = mesh
192
+ comm = mesh.comm
193
+ if self.ngmesh.dim == 3:
194
+ if comm.rank == 0:
195
+ V = self.ngmesh.Coordinates()
196
+ T = self.ngmesh.Elements3D().NumPy()["nodes"]
197
+ T = np.array([list(np.trim_zeros(a, 'b')) for a in list(T)])-1
198
+ surfMesh, dim = False, 3
199
+ if len(T) == 0:
200
+ surfMesh, dim = True, 2
201
+ T = self.ngmesh.Elements2D().NumPy()["nodes"]
202
+ T = np.array([list(np.trim_zeros(a, 'b')) for a in list(T)])-1
203
+ plex = psc.DMPlex().createFromCellList(dim, T, V)
204
+ plex.setName(self.name)
205
+ vStart, vEnd = plex.getDepthStratum(0)
206
+ if surfMesh:
207
+ for e in self.ngmesh.Elements1D():
208
+ join = plex.getJoin([vStart+v.nr-1 for v in e.vertices])
209
+ plex.setLabelValue(FACE_SETS_LABEL, join[0], int(e.surfaces[1]))
210
+ else:
211
+ for e in self.ngmesh.Elements2D():
212
+ join = plex.getFullJoin([vStart+v.nr-1 for v in e.vertices])
213
+ plex.setLabelValue(FACE_SETS_LABEL, join[0], int(e.index))
214
+ for e in self.ngmesh.Elements1D():
215
+ join = plex.getJoin([vStart+v.nr-1 for v in e.vertices])
216
+ plex.setLabelValue(EDGE_SETS_LABEL, join[0], int(e.index))
217
+ self.plex = plex
218
+ else:
219
+ plex = psc.DMPlex().createFromCellList(3,
220
+ np.zeros((0, 4), dtype=np.int32),
221
+ np.zeros((0, 3), dtype=np.double))
222
+ self.plex = plex
223
+ elif self.ngmesh.dim == 2:
224
+ if comm.rank == 0:
225
+ V = self.ngmesh.Coordinates()
226
+ T = self.ngmesh.Elements2D().NumPy()["nodes"]
227
+ T = np.array([list(np.trim_zeros(a, 'b')) for a in list(T)])-1
228
+ plex = psc.DMPlex().createFromCellList(2, T, V)
229
+ plex.setName(self.name)
230
+ vStart, vEnd = plex.getDepthStratum(0) # vertices
231
+ for e in self.ngmesh.Elements1D():
232
+ join = plex.getJoin([vStart+v.nr-1 for v in e.vertices])
233
+ plex.setLabelValue(FACE_SETS_LABEL, join[0], int(e.index))
234
+ if not ((1 == self.ngmesh.Elements2D().NumPy()["index"]).all()):
235
+ for e in self.ngmesh.Elements2D():
236
+ join = plex.getFullJoin([vStart+v.nr-1 for v in e.vertices])
237
+ plex.setLabelValue(CELL_SETS_LABEL, join[0], int(e.index))
238
+
239
+ self.plex = plex
240
+ else:
241
+ plex = psc.DMPlex().createFromCellList(2,
242
+ np.zeros((0, 3), dtype=np.int32),
243
+ np.zeros((0, 2), dtype=np.double))
244
+ self.plex = plex
245
+
246
+
247
+ #Krylov Solver
248
+
249
+ counter = 0
250
+
251
+ class KrylovSolver():
252
+ """
253
+ Inspired by Firedrake solver class.
254
+ """
255
+ global counter
256
+ counter += 1
257
+ def __init__(self, a, fes, p=None, solver_parameters=None,options_prefix=None):
258
+ self.fes = fes
259
+ a.Assemble()
260
+ Amat = a.mat
261
+ if p is not None:
262
+ p.Assemble()
263
+ Pmat = p.mat
264
+ else:
265
+ Pmat = None
266
+ if not isinstance(Amat, ngs.la.SparseMatrixd):
267
+ raise TypeError("Provided operator is a '%s', not an la.SparseMatrixd" % type(Amat).__name__)
268
+ if Pmat is not None and not isinstance(Pmat, ngs.la.SparseMatrixd):
269
+ raise TypeError("Provided preconditioner is a '%s', not an la.SparseMatrixd" % type(Pmat).__name__)
270
+
271
+ self.solver_parameters = solver_parameters
272
+ self.options_prefix = options_prefix
273
+ options_object = psc.Options()
274
+ for optName, optValue in self.solver_parameters.items():
275
+ options_object[optName] = optValue
276
+
277
+ #Creating the PETSc Matrix
278
+ Asc = CreatePETScMatrix(Amat, fes.FreeDofs())
279
+ self.A = Asc
280
+ self.comm = MPI.COMM_WORLD
281
+ #Setting up the preconditioner
282
+ if Pmat is not None:
283
+ Psc = CreatePETScMatrix(Pmat, fes.FreeDofs())
284
+ self.P = Psc
285
+ else:
286
+ self.P = Asc
287
+ #Setting options prefix
288
+ self.A.setOptionsPrefix(self.options_prefix)
289
+ self.P.setOptionsPrefix(self.options_prefix)
290
+ self.A.setFromOptions()
291
+ self.P.setFromOptions()
292
+
293
+ self.ksp = psc.KSP().create(comm=self.comm)
294
+
295
+ # Operator setting must come after null space has been
296
+ # applied
297
+ self.ksp.setOperators(A=self.A, P=self.P)
298
+ # Set from options now (we're not allowed to change parameters
299
+ # anyway).
300
+ self.ksp.setOptionsPrefix(self.options_prefix)
301
+ self.ksp.setFromOptions()
302
+ def solve(self, f):
303
+ f.Assemble()
304
+ u = ngs.GridFunction(self.fes)
305
+ self.vmap = VectorMapping(self.fes.ParallelDofs(), self.fes.FreeDofs())
306
+ upsc, fpsc = self.A.createVecs()
307
+ self.vmap.N2P(f.vec, fpsc)
308
+ self.ksp.solve(fpsc, upsc)
309
+ self.vmap.P2N(upsc, u.vec);
310
+ return u
ngsolve/ngscxx.py ADDED
@@ -0,0 +1,42 @@
1
+ from shutil import which
2
+ import glob
3
+ import pathlib
4
+ import subprocess
5
+ import sys
6
+ import sysconfig
7
+
8
+ import netgen.config as ngc
9
+ import ngsolve.config as ngsc
10
+
11
+ def find_compiler():
12
+ compiler = which(ngsc.CMAKE_CXX_COMPILER) or which(ngsc.CMAKE_CXX_COMPILER).split('/')[-1] or which('g++') or which('c++') or which('clang++')
13
+ if compiler is None:
14
+ raise RuntimeError("No compiler found")
15
+ ccache = which('ccache')
16
+ if ccache:
17
+ return [ccache, compiler]
18
+ else:
19
+ return [compiler]
20
+
21
+ def find_includes():
22
+ for prefix in [ngc.CMAKE_INSTALL_PREFIX]:
23
+ files = sorted(pathlib.Path(prefix).glob('include/nglib.h'))
24
+ if len(files):
25
+ return "-I"+str(files[0].parent)
26
+
27
+ if __name__ == '__main__':
28
+ compiler = find_compiler()
29
+ flags = []
30
+ flags.append(ngc.ngcore_compile_options)
31
+ for d in ngc.ngcore_compile_definitions.split(';') + ngsc.NGSOLVE_COMPILE_DEFINITIONS.split(';'):
32
+ flags.append(f"-D{d}")
33
+
34
+ for o in ngsc.NGSOLVE_COMPILE_OPTIONS.split(';'):
35
+ if o.startswith("$<$<COMPILE_LANGUAGE:CXX>:"):
36
+ o = o.split(':')[2].split('>')[0]
37
+ flags.append(o)
38
+
39
+ flags.append(find_includes())
40
+ flags.append(f"-I{sysconfig.get_path('include')}")
41
+
42
+ subprocess.run(compiler + flags + sys.argv[1:])
ngsolve/ngslib.so ADDED
Binary file
ngsolve/ngstd.pyi ADDED
@@ -0,0 +1,59 @@
1
+ """
2
+ pybind ngstd
3
+ """
4
+ from __future__ import annotations
5
+ import collections.abc
6
+ import pyngcore.pyngcore
7
+ import typing
8
+ __all__: list[str] = ['Archive', 'DummyArgument', 'HeapReset', 'IntRange', 'LocalHeap', 'TestFlagsConversion']
9
+ class Archive:
10
+ def __and__(self, array: pyngcore.pyngcore.Array_I_S) -> Archive:
11
+ ...
12
+ def __init__(self, filename: str, write: bool, binary: bool) -> None:
13
+ ...
14
+ class DummyArgument:
15
+ def __bool__(self) -> bool:
16
+ ...
17
+ def __repr__(self) -> str:
18
+ ...
19
+ class HeapReset:
20
+ """
21
+ stores heap-pointer on init, and resets it on exit
22
+ """
23
+ def __init__(self, lh: LocalHeap) -> None:
24
+ ...
25
+ class IntRange:
26
+ def __contains__(self, arg0: typing.SupportsInt) -> bool:
27
+ ...
28
+ def __init__(self, arg0: typing.SupportsInt, arg1: typing.SupportsInt) -> None:
29
+ ...
30
+ def __iter__(self) -> collections.abc.Iterator[int]:
31
+ ...
32
+ def __str__(self) -> str:
33
+ ...
34
+ @property
35
+ def start(self) -> int:
36
+ ...
37
+ @property
38
+ def step(self) -> int:
39
+ ...
40
+ @property
41
+ def stop(self) -> int:
42
+ ...
43
+ class LocalHeap:
44
+ """
45
+ A heap for fast memory allocation
46
+ """
47
+ def __init__(self, size: typing.SupportsInt = 1000000, name: str = 'PyLocalHeap') -> None:
48
+ ...
49
+ class _MemoryView:
50
+ def __getstate__(self) -> tuple:
51
+ ...
52
+ def __setstate__(self, arg0: tuple) -> None:
53
+ ...
54
+ def TestFlagsConversion(flags: pyngcore.pyngcore.Flags) -> None:
55
+ ...
56
+ def _PickleMemory(pickler: typing.Any, view: ...) -> None:
57
+ ...
58
+ def _UnpickleMemory(unpickler: typing.Any) -> None:
59
+ ...
@@ -0,0 +1,203 @@
1
+ from ngsolve.la import InnerProduct
2
+ from math import sqrt
3
+ from ngsolve import Projector, Norm
4
+ from .utils import TimeFunction
5
+
6
+ class NewtonSolver:
7
+ def __init__(self, a, u, rhs=None, freedofs=None,
8
+ inverse="", solver=None, lin_solver_cls=None,
9
+ lin_solver_args=None):
10
+ self.a, self.u, self.inverse = a, u, inverse
11
+ self.w = u.vec.CreateVector()
12
+ self.r = u.vec.CreateVector()
13
+ self.rhs = rhs
14
+ self.uh = u.vec.CreateVector()
15
+ self.inv = None if solver is None else solver
16
+ self.lin_solver_cls = lin_solver_cls
17
+ self.lin_solver_args = lin_solver_args
18
+ if lin_solver_cls is not None:
19
+ assert solver is None
20
+ if solver or lin_solver_cls:
21
+ self.inverse = "given"
22
+ else:
23
+ self.freedofs = freedofs or u.space.FreeDofs(a.condense)
24
+
25
+ @TimeFunction
26
+ def Solve(self, maxit=100, maxerr=1e-11, dampfactor=1,
27
+ printing=False, callback=None, linesearch=False,
28
+ printenergy=False, print_wrong_direction=False):
29
+ numit = 0
30
+ err = 1.
31
+ a, u, w, r,uh = self.a, self.u, self.w, self.r, self.uh
32
+ for it in range(maxit):
33
+ numit += 1
34
+ if printing:
35
+ print("Newton iteration ", it)
36
+ if printenergy:
37
+ print("Energy: ", a.Energy(u.vec))
38
+
39
+ a.AssembleLinearization(u.vec)
40
+ a.Apply(u.vec, r)
41
+
42
+ self._UpdateInverse()
43
+ if self.rhs is not None:
44
+ r.data -= self.rhs.vec
45
+ if a.condense:
46
+ r.data += a.harmonic_extension_trans * r
47
+ w.data = self.inv * r
48
+ w.data += a.harmonic_extension * w
49
+ w.data += a.inner_solve * r
50
+ else:
51
+ w.data = self.inv * r
52
+
53
+ err2 = InnerProduct(w,r)
54
+ if print_wrong_direction:
55
+ if err2 < 0:
56
+ print("wrong direction")
57
+ err = sqrt(abs(err2))
58
+ if printing:
59
+ print("err = ", err)
60
+
61
+ tau = min(1, numit*dampfactor)
62
+
63
+ if linesearch:
64
+ uh.data = u.vec - tau*w
65
+ energy = a.Energy(u.vec)
66
+ while a.Energy(uh) > energy+(max(1e-14*abs(energy),maxerr)) and tau > 1e-10:
67
+ tau *= 0.5
68
+ uh.data = u.vec - tau * w
69
+ if printing:
70
+ print ("tau = ", tau)
71
+ print ("energy uh = ", a.Energy(uh))
72
+ u.vec.data = uh
73
+
74
+ else:
75
+ u.vec.data -= tau * w
76
+ if callback is not None:
77
+ callback(it, err)
78
+ if abs(err) < maxerr: break
79
+ else:
80
+ print("Warning: Newton might not converge! Error = ", err)
81
+ return (-1,numit)
82
+ return (0,numit)
83
+
84
+ def SetDirichlet(self, dirichletvalues):
85
+ a, u, w, r = self.a, self.u, self.w, self.r
86
+ a.AssembleLinearization(u.vec)
87
+ self._UpdateInverse()
88
+ w.data = dirichletvalues-u.vec
89
+ r.data = a.mat * w
90
+ w.data -= self.inv*r
91
+ u.vec.data += w
92
+
93
+ def _UpdateInverse(self):
94
+ if self.inverse == "given":
95
+ if self.lin_solver_cls is not None and self.inv is None:
96
+ self.inv = self.lin_solver_cls(mat=self.a.mat, **(self.lin_solver_args or {}))
97
+ else:
98
+ self.inv.Update()
99
+ else:
100
+ if self.inverse == "sparsecholesky" and self.inv is not None:
101
+ self.inv.Update()
102
+ else:
103
+ self.inv = self.a.mat.Inverse(self.freedofs,
104
+ inverse=self.inverse)
105
+
106
+
107
+ def Newton(a, u, freedofs=None, maxit=100, maxerr=1e-11, inverse="", \
108
+ dirichletvalues=None, dampfactor=1, printing=True, callback=None):
109
+ """
110
+ Newton's method for solving non-linear problems of the form A(u)=0.
111
+
112
+ Parameters
113
+ ----------
114
+ a : BilinearForm
115
+ The BilinearForm of the non-linear variational problem. It does not have to be assembled.
116
+
117
+ u : GridFunction
118
+ The GridFunction where the solution is saved. The values are used as initial guess for Newton's method.
119
+
120
+ freedofs : BitArray
121
+ The FreeDofs on which the assembled matrix is inverted. If argument is 'None' then the FreeDofs of the underlying FESpace is used.
122
+
123
+ maxit : int
124
+ Number of maximal iteration for Newton. If the maximal number is reached before the maximal error Newton might no converge and a warning is displayed.
125
+
126
+ maxerr : float
127
+ The maximal error which Newton should reach before it stops. The error is computed by the square root of the inner product of the residuum and the correction.
128
+
129
+ inverse : string
130
+ A string of the sparse direct solver which should be solved for inverting the assembled Newton matrix.
131
+
132
+ dampfactor : float
133
+ Set the damping factor for Newton's method. If dampfactor is 1 then no damping is done. If value is < 1 then the damping is done by the formula 'min(1,dampfactor*numit)' for the correction, where 'numit' denotes the Newton iteration.
134
+
135
+ printing : bool
136
+ Set if Newton's method should print informations about the actual iteration like the error.
137
+
138
+ Returns
139
+ -------
140
+ (int, int)
141
+ List of two integers. The first one is 0 if Newton's method did converge, -1 otherwise. The second one gives the number of Newton iterations needed.
142
+
143
+ """
144
+ solver = NewtonSolver(a=a, u=u, freedofs=freedofs, inverse=inverse)
145
+ if dirichletvalues is not None:
146
+ solver.SetDirichlet(dirichletvalues)
147
+ return solver.Solve(maxit=maxit, maxerr=maxerr,
148
+ dampfactor=dampfactor,
149
+ printing=printing,
150
+ callback=callback,
151
+ linesearch=False,
152
+ printenergy=False)
153
+
154
+
155
+ def NewtonMinimization(a, u, freedofs=None, maxit=100, maxerr=1e-11, inverse="", dampfactor=1, linesearch=False, printing=True, callback=None):
156
+ """
157
+ Newton's method for solving non-linear problems of the form A(u)=0 involving energy integrators.
158
+
159
+
160
+ Parameters
161
+ ----------
162
+ a : BilinearForm
163
+ The BilinearForm of the non-linear variational problem. It does not have to be assembled.
164
+
165
+ u : GridFunction
166
+ The GridFunction where the solution is saved. The values are used as initial guess for Newton's method.
167
+
168
+ freedofs : BitArray
169
+ The FreeDofs on which the assembled matrix is inverted. If argument is 'None' then the FreeDofs of the underlying FESpace is used.
170
+
171
+ maxit : int
172
+ Number of maximal iteration for Newton. If the maximal number is reached before the maximal error Newton might no converge and a warning is displayed.
173
+
174
+ maxerr : float
175
+ The maximal error which Newton should reach before it stops. The error is computed by the square root of the inner product of the residuum and the correction.
176
+
177
+ inverse : string
178
+ A string of the sparse direct solver which should be solved for inverting the assembled Newton matrix.
179
+
180
+ dampfactor : float
181
+ Set the damping factor for Newton's method. If dampfactor is 1 then no damping is done. If value is < 1 then the damping is done by the formula 'min(1,dampfactor*numit)' for the correction, where 'numit' denotes the Newton iteration.
182
+
183
+ linesearch : bool
184
+ If True then linesearch is used to guarantee that the energy decreases in every Newton iteration.
185
+
186
+ printing : bool
187
+ Set if Newton's method should print informations about the actual iteration like the error.
188
+
189
+ Returns
190
+ -------
191
+ (int, int)
192
+ List of two integers. The first one is 0 if Newton's method did converge, -1 otherwise. The second one gives the number of Newton iterations needed.
193
+
194
+ """
195
+ solver = NewtonSolver(a=a, u=u, freedofs=freedofs, inverse=inverse)
196
+ return solver.Solve(maxit=maxit, maxerr=maxerr,
197
+ dampfactor=dampfactor,
198
+ printing=printing,
199
+ callback=callback,
200
+ linesearch=linesearch,
201
+ printenergy=printing,
202
+ print_wrong_direction=False)
203
+