ngsolve 6.2.2506.post216.dev0__cp314-cp314-manylinux_2_28_x86_64.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.
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvcc +22 -0
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngs_nvlink +17 -0
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngscxx +15 -0
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsld +11 -0
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngsolve.tcl +648 -0
- ngsolve-6.2.2506.post216.dev0.data/data/bin/ngspy +2 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/analytic_integrals.hpp +10 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/arnoldi.hpp +55 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bandmatrix.hpp +334 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basematrix.hpp +963 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/basevector.hpp +1268 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbequations.hpp +2807 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bdbintegrator.hpp +1660 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bem_diffops.hpp +475 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bessel.hpp +1064 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bilinearform.hpp +966 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bla.hpp +29 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockalloc.hpp +95 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/blockjacobi.hpp +328 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/bspline.hpp +116 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/calcinverse.hpp +141 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cg.hpp +368 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/chebyshev.hpp +44 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cholesky.hpp +720 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/clapack.h +7254 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/code_generation.hpp +296 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient.hpp +2033 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_impl.hpp +19 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/coefficient_stdmath.hpp +167 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/commutingAMG.hpp +106 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/comp.hpp +79 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compatibility.hpp +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/complex_wrapper.hpp +101 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/compressedfespace.hpp +110 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/contact.hpp +239 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_core.hpp +216 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_linalg.hpp +185 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngbla.hpp +317 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_ngstd.hpp +414 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/cuda_profiler.hpp +240 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diagonalmatrix.hpp +160 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/differentialoperator.hpp +276 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop.hpp +1286 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffop_impl.hpp +328 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/diffopwithfactor.hpp +123 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/discontinuous.hpp +84 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/dump.hpp +949 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ectypes.hpp +121 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigen.hpp +60 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/eigensystem.hpp +18 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elasticity_equations.hpp +595 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementbyelement.hpp +201 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtopology.hpp +1760 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/elementtransformation.hpp +339 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/evalfunc.hpp +405 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/expr.hpp +1693 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfe.hpp +175 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetfespace.hpp +180 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facethofe.hpp +111 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/facetsurffespace.hpp +112 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fe_interfaces.hpp +32 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fem.hpp +87 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fesconvert.hpp +14 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/fespace.hpp +1454 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/finiteelement.hpp +286 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalinterfacespace.hpp +77 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/globalspace.hpp +115 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/gridfunction.hpp +525 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1amg.hpp +124 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe.hpp +188 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofe_impl.hpp +1262 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo.hpp +148 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofefo_impl.hpp +185 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1hofespace.hpp +167 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lofe.hpp +1240 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/h1lumping.hpp +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurl_equations.hpp +1381 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfe.hpp +2241 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlcurlfespace.hpp +78 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe.hpp +259 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlfe_utils.hpp +107 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdiv_dshape.hpp +857 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhdivfes.hpp +308 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe.hpp +175 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofe_impl.hpp +1871 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurlhofespace.hpp +193 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hcurllofe.hpp +1146 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdiv_equations.hpp +880 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivfe.hpp +2923 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivdivsurfacespace.hpp +76 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe.hpp +206 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfe_utils.hpp +717 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivfes.hpp +75 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe.hpp +447 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofe_impl.hpp +1107 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofefo.hpp +229 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhofespace.hpp +177 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivhosurfacefespace.hpp +106 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hdivlofe.hpp +773 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hidden.hpp +74 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/householder.hpp +181 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_ams_precond.hpp +123 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/hypre_precond.hpp +73 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integrator.hpp +2012 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/integratorcf.hpp +253 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/interpolate.hpp +49 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrule.hpp +2542 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/intrules_SauterSchwab.hpp +25 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/irspace.hpp +49 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/jacobi.hpp +153 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/kernels.hpp +724 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe.hpp +194 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofe_impl.hpp +564 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofefo.hpp +542 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/l2hofespace.hpp +344 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/la.hpp +38 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linalg_kernels.hpp +70 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/linearform.hpp +266 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/matrix.hpp +2145 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/memusage.hpp +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/meshaccess.hpp +1359 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mgpre.hpp +204 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mp_coefficient.hpp +145 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mptools.hpp +2281 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multigrid.hpp +42 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/multivector.hpp +447 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mumpsinverse.hpp +187 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/mycomplex.hpp +361 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ng_lapack.hpp +1661 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngblas.hpp +1232 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_defines.hpp +30 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_stdcpp_include.hpp +106 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngs_utils.hpp +121 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsobject.hpp +1019 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngsstream.hpp +113 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/ngstd.hpp +72 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe.hpp +96 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/nodalhofe_impl.hpp +141 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfe.hpp +223 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetfespace.hpp +98 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/normalfacetsurfacefespace.hpp +84 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/order.hpp +251 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallel_matrices.hpp +222 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/paralleldofs.hpp +340 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelngs.hpp +23 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/parallelvector.hpp +269 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pardisoinverse.hpp +200 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/periodic.hpp +129 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/plateaufespace.hpp +25 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pml.hpp +275 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/pmltrafo.hpp +631 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/postproc.hpp +142 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/potentialtools.hpp +22 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/precomp.hpp +60 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/preconditioner.hpp +602 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/prolongation.hpp +380 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_comp.hpp +107 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_fem.hpp +89 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_linalg.hpp +58 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/python_ngstd.hpp +386 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol.hpp +4896 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_tet.hpp +395 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/recursive_pol_trig.hpp +492 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/reorderedfespace.hpp +81 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sample_sort.hpp +105 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/scalarfe.hpp +335 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/shapefunction_utils.hpp +113 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/simd_complex.hpp +329 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/smoother.hpp +253 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/solve.hpp +89 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsecholesky.hpp +317 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsefactorization_interface.hpp +159 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix.hpp +1052 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_dyn.hpp +90 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/sparsematrix_impl.hpp +1055 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/special_matrix.hpp +463 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/specialelement.hpp +125 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/statushandler.hpp +33 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/stringops.hpp +12 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/superluinverse.hpp +136 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symbolicintegrator.hpp +850 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/symmetricmatrix.hpp +144 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfe.hpp +224 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tangentialfacetfespace.hpp +91 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensor.hpp +522 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorcoefficient.hpp +446 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tensorproductintegrator.hpp +113 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe.hpp +128 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thcurlfe_impl.hpp +380 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe.hpp +80 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/thdivfe_impl.hpp +492 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpdiffop.hpp +461 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpfes.hpp +133 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tpintrule.hpp +224 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/triangular.hpp +465 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe.hpp +245 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/tscalarfe_impl.hpp +1029 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/umfpackinverse.hpp +148 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/unifiedvector.hpp +103 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vector.hpp +1452 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/voxelcoefficientfunction.hpp +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vtkoutput.hpp +198 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/vvector.hpp +208 -0
- ngsolve-6.2.2506.post216.dev0.data/data/include/netgen/webgui.hpp +92 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/NGSolveConfig.cmake +102 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets-release.cmake +89 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/cmake/ngsolve/ngsolve-targets.cmake +180 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngbla.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngcomp.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngfem.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngla.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsbem.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngscudalib.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngsolve.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/netgen_mesher.libs/libngstd.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/TensorProductTools.py +210 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__console.py +94 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__expr.py +181 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/__init__.py +148 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/_scikit_build_core_dependencies.py +30 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/bvp.py +78 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__init__.py +1 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/__main__.py +4 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/config/config.py +60 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/__init__.py +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_1d.py +80 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_1d_2d.py +73 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_1d.py +72 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/TensorProduct/tp_dg_2d_2d.py +66 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/__init__.py +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/__init__.py +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hhj.py +44 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/hybrid_dg.py +53 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/mixed.py +30 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/nonlin.py +29 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pickling.py +26 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/pml.py +31 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/taskmanager.py +20 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/tdnns.py +47 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG-skeleton.py +45 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDG.py +38 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGlap.py +42 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/howto/timeDGwave.py +61 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/__init__.py +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/adaptive.py +123 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/cmagnet.py +59 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/elasticity.py +76 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/navierstokes.py +74 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.ipynb +170 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/intro/poisson.py +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/__init__.py +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_cmagnet.py +87 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_navierstokes.py +117 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_poisson.py +89 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/demos/mpi/mpi_timeDG.py +82 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/directsolvers.py +14 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/eigenvalues.py +364 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/internal.py +89 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/krylovspace.py +1182 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/meshes.py +748 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngs2petsc.py +310 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscuda.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngscxx.py +42 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/ngslib.so +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/nonlinearsolvers.py +203 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/preconditioners.py +11 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solve_implementation.py +168 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/__init__.py +7 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/solvers/cudss.py +112 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timestepping.py +185 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/timing.py +108 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/utils.py +167 -0
- ngsolve-6.2.2506.post216.dev0.data/data/lib/python3.14/site-packages/ngsolve/webgui.py +671 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.geo +17 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/beam.vol +240 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.in2d +41 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/chip.vol +614 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.geo +12 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coil.vol +2560 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.geo +24 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/coilshield.vol +3179 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.geo +19 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/cube.vol +1832 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d10_DGdoubleglazing.pde +50 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d11_chip_nitsche.pde +40 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d1_square.pde +43 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d2_chip.pde +35 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d3_helmholtz.pde +22 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d4_cube.pde +46 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d5_beam.pde +74 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d6_shaft.pde +73 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d7_coil.pde +50 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d8_coilshield.pde +49 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/d9_hybridDG.pde +72 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.in2d +27 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/doubleglazing.vol +737 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/piezo2d40round4.vol.gz +0 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.geo +73 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/shaft.vol +4291 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.in2d +17 -0
- ngsolve-6.2.2506.post216.dev0.data/data/share/ngsolve/square.vol +149 -0
- ngsolve-6.2.2506.post216.dev0.dist-info/METADATA +14 -0
- ngsolve-6.2.2506.post216.dev0.dist-info/RECORD +306 -0
- ngsolve-6.2.2506.post216.dev0.dist-info/WHEEL +5 -0
- ngsolve-6.2.2506.post216.dev0.dist-info/licenses/LICENSE +504 -0
- ngsolve-6.2.2506.post216.dev0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
#ifndef FILE_SIMD_COMPLEX
|
|
2
|
+
#define FILE_SIMD_COMPLEX
|
|
3
|
+
|
|
4
|
+
/**************************************************************************/
|
|
5
|
+
/* File: simd.hpp */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 06. Nov. 16 */
|
|
8
|
+
/**************************************************************************/
|
|
9
|
+
|
|
10
|
+
#include <core/simd.hpp>
|
|
11
|
+
|
|
12
|
+
namespace ngcore
|
|
13
|
+
{
|
|
14
|
+
|
|
15
|
+
INLINE SIMD<mask64> Mask128 (int64_t nr)
|
|
16
|
+
{
|
|
17
|
+
#ifdef __CUDA_ARCH__
|
|
18
|
+
return 2*nr;
|
|
19
|
+
|
|
20
|
+
#else // __CUDA_ARCH__
|
|
21
|
+
#ifdef __AVX512F__
|
|
22
|
+
|
|
23
|
+
return _mm512_cmpgt_epi64_mask(_mm512_set1_epi64(nr),
|
|
24
|
+
_mm512_set_epi64(3, 3, 2, 2, 1, 1, 0, 0));
|
|
25
|
+
|
|
26
|
+
#elif defined(__AVX__)
|
|
27
|
+
|
|
28
|
+
return my_mm256_cmpgt_epi64(_mm256_set1_epi64x(nr),
|
|
29
|
+
_mm256_set_epi64x(1, 1, 0, 0));
|
|
30
|
+
|
|
31
|
+
#elif defined NETGEN_ARCH_AMD64
|
|
32
|
+
return _mm_cmpgt_epi32(_mm_set1_epi32(nr),
|
|
33
|
+
_mm_set_epi32(0, 0, 0, 0));
|
|
34
|
+
#else
|
|
35
|
+
return 2*nr;
|
|
36
|
+
#endif
|
|
37
|
+
#endif // __CUDA_ARCH__
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
template <int N>
|
|
43
|
+
class SIMD<Complex, N>
|
|
44
|
+
{
|
|
45
|
+
SIMD<double,N> re, im;
|
|
46
|
+
public:
|
|
47
|
+
SIMD () = default;
|
|
48
|
+
SIMD (SIMD<double,N> _r, SIMD<double,N> _i = 0.0) : re(_r), im(_i) { ; }
|
|
49
|
+
SIMD (Complex c) : re(c.real()), im(c.imag()) { ; }
|
|
50
|
+
SIMD (double d) : re(d), im(0.0) { ; }
|
|
51
|
+
static constexpr int Size() { return SIMD<double>::Size(); }
|
|
52
|
+
|
|
53
|
+
auto real() const { return re; }
|
|
54
|
+
auto imag() const { return im; }
|
|
55
|
+
auto & real() { return re; }
|
|
56
|
+
auto & imag() { return im; }
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
auto Lo() const
|
|
60
|
+
{
|
|
61
|
+
if constexpr (N == 2) return Complex(re.Lo(), im.Lo());
|
|
62
|
+
else return SIMD<Complex,N/2> (re.Lo(), im.Lo());
|
|
63
|
+
}
|
|
64
|
+
auto Hi() const
|
|
65
|
+
{
|
|
66
|
+
if constexpr (N == 2) return Complex(re.Hi(), im.Hi());
|
|
67
|
+
else return SIMD<Complex,N/2> (re.Hi(), im.Hi());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Numbers in SIMD structure are not necessarily in same order as in memory
|
|
71
|
+
// for instance:
|
|
72
|
+
// [x0,y0,x1,y1,x2,y2,x3,y3] -> [x0,x2,x1,x3,y0,y2,y1,y3]
|
|
73
|
+
void LoadFast (Complex * p)
|
|
74
|
+
{
|
|
75
|
+
SIMD<double,N> c1((double*)p);
|
|
76
|
+
SIMD<double,N> c2((double*)(p+SIMD<double>::Size()/2));
|
|
77
|
+
std::tie(re,im) = Unpack(c1,c2);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void StoreFast (Complex * p)
|
|
81
|
+
{
|
|
82
|
+
auto [h1,h2] = Unpack(re,im);
|
|
83
|
+
h1.Store((double*)p);
|
|
84
|
+
h2.Store((double*)(p+SIMD<double,N>::Size()/2));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
void LoadFast (Complex * p, int nr)
|
|
88
|
+
{
|
|
89
|
+
SIMD<double> c1((double*)p, Mask128(nr));
|
|
90
|
+
SIMD<double> c2((double*)(p+SIMD<double>::Size()/2), Mask128(nr-SIMD<double>::Size()/2));
|
|
91
|
+
std::tie(re,im) = Unpack(c1,c2);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
void StoreFast (Complex * p, int nr)
|
|
95
|
+
{
|
|
96
|
+
auto [h1,h2] = Unpack(re,im);
|
|
97
|
+
h1.Store((double*)p, Mask128(nr));
|
|
98
|
+
h2.Store((double*)(p+SIMD<double>::Size()/2), Mask128(nr-SIMD<double>::Size()/2));
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
// templatize all with N ???
|
|
103
|
+
template <int N>
|
|
104
|
+
inline SIMD<double, N> Real(SIMD<Complex, N> a) { return a.real(); }
|
|
105
|
+
template <int N>
|
|
106
|
+
inline SIMD<double, N> Imag(SIMD<Complex, N> a) { return a.imag(); }
|
|
107
|
+
|
|
108
|
+
template <int N> INLINE auto operator+ (SIMD<Complex, N> a, SIMD<Complex, N> b)
|
|
109
|
+
{ return SIMD<Complex, N> (a.real()+b.real(), a.imag()+b.imag()); }
|
|
110
|
+
template <int N> INLINE auto operator+ (SIMD<Complex, N> a, SIMD<double, N> b)
|
|
111
|
+
{ return SIMD<Complex, N> (a.real()+b, a.imag()); }
|
|
112
|
+
template <int N> INLINE auto operator+ (SIMD<double, N> b, SIMD<Complex, N> a)
|
|
113
|
+
{ return SIMD<Complex, N> (a.real()+b, a.imag()); }
|
|
114
|
+
template <int N> INLINE auto operator+ (SIMD<Complex, N> a, double b)
|
|
115
|
+
{ return SIMD<Complex, N> (a.real()+b, a.imag()); }
|
|
116
|
+
template <int N> INLINE auto operator+ (double b, SIMD<Complex, N> a)
|
|
117
|
+
{ return SIMD<Complex, N> (a.real()+b, a.imag()); }
|
|
118
|
+
template <int N> INLINE auto operator+ (SIMD<Complex, N> a, Complex b)
|
|
119
|
+
{ return a + SIMD<Complex, N> (b); }
|
|
120
|
+
template <int N> INLINE auto operator+ (Complex b, SIMD<Complex, N> a)
|
|
121
|
+
{ return a + SIMD<Complex, N> (b); }
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
template <int N> INLINE auto operator- (SIMD<Complex, N> a, SIMD<Complex, N> b)
|
|
125
|
+
{ return SIMD<Complex, N> (a.real()-b.real(), a.imag()-b.imag()); }
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
template <int N>
|
|
129
|
+
INLINE auto operator- (SIMD<Complex, N> a)
|
|
130
|
+
{ return SIMD<Complex, N>(-a.real(), -a.imag()); }
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
template <int N> INLINE auto operator* (SIMD<Complex, N> a, SIMD<Complex, N> b)
|
|
134
|
+
{ return SIMD<Complex, N> (a.real()*b.real()-a.imag()*b.imag(),
|
|
135
|
+
a.real()*b.imag()+a.imag()*b.real()); }
|
|
136
|
+
template <int N> INLINE auto operator* (SIMD<double, N> a, SIMD<Complex, N> b)
|
|
137
|
+
{ return SIMD<Complex, N> (a*b.real(), a*b.imag()); }
|
|
138
|
+
template <int N> INLINE auto operator* (SIMD<Complex, N> b, SIMD<double, N> a)
|
|
139
|
+
{ return SIMD<Complex, N> (a*b.real(), a*b.imag()); }
|
|
140
|
+
|
|
141
|
+
template <int N> INLINE auto operator* (double a, SIMD<Complex, N> b)
|
|
142
|
+
{ return SIMD<Complex, N> (a*b.real(), a*b.imag()); }
|
|
143
|
+
template <int N> INLINE auto operator* (SIMD<Complex, N> b, double a)
|
|
144
|
+
{ return SIMD<Complex, N> (a*b.real(), a*b.imag()); }
|
|
145
|
+
template <int N> INLINE auto operator* (Complex a, SIMD<Complex, N> b)
|
|
146
|
+
{ return SIMD<Complex, N> (a)*b; }
|
|
147
|
+
template <int N> INLINE auto operator* (SIMD<Complex, N> b, Complex a)
|
|
148
|
+
{ return SIMD<Complex, N> (a)*b; }
|
|
149
|
+
template <int N> INLINE auto operator* (SIMD<double, N> b, Complex a)
|
|
150
|
+
{ return SIMD<Complex, N> (a.real()*b, a.imag()*b); }
|
|
151
|
+
template <int N> INLINE auto operator* (Complex a, SIMD<double, N> b)
|
|
152
|
+
{ return SIMD<Complex, N> (a.real()*b, a.imag()*b); }
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
template <int N>
|
|
156
|
+
INLINE SIMD<Complex, N> & operator+= (SIMD<Complex, N> & a, SIMD<Complex, N> b)
|
|
157
|
+
{ a.real()+=b.real(); a.imag()+=b.imag(); return a; }
|
|
158
|
+
template <int N>
|
|
159
|
+
INLINE SIMD<Complex, N> & operator-= (SIMD<Complex, N> & a, SIMD<Complex, N> b)
|
|
160
|
+
{ a.real()-=b.real(); a.imag()-=b.imag(); return a; }
|
|
161
|
+
|
|
162
|
+
template <int N>
|
|
163
|
+
INLINE SIMD<Complex, N> & operator*= (SIMD<Complex, N> & a, double b)
|
|
164
|
+
{ a.real()*= b; a.imag() *= b; return a; }
|
|
165
|
+
template <int N>
|
|
166
|
+
INLINE SIMD<Complex, N> & operator*= (SIMD<Complex, N> & a, Complex b)
|
|
167
|
+
{ a = a*SIMD<Complex, N>(b); return a; }
|
|
168
|
+
template <int N>
|
|
169
|
+
INLINE SIMD<Complex, N> & operator*= (SIMD<Complex, N> & a, SIMD<double> b)
|
|
170
|
+
{ a.real()*= b; a.imag() *= b; return a; }
|
|
171
|
+
template <int N>
|
|
172
|
+
INLINE SIMD<Complex, N> & operator*= (SIMD<Complex, N> & a, SIMD<Complex, N> b)
|
|
173
|
+
{ a = a*b; return a; }
|
|
174
|
+
|
|
175
|
+
template <int N>
|
|
176
|
+
INLINE SIMD<Complex, N> Inv (SIMD<Complex, N> a)
|
|
177
|
+
{
|
|
178
|
+
SIMD<double> n2 = a.real()*a.real()+a.imag()*a.imag();
|
|
179
|
+
return SIMD<Complex, N> (a.real()/n2, -a.imag()/n2);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
template <int N> INLINE auto operator/ (double a, SIMD<Complex, N> b)
|
|
183
|
+
{ return a * Inv(b); }
|
|
184
|
+
|
|
185
|
+
template <int N> INLINE auto operator/ (Complex a, SIMD<Complex, N> b)
|
|
186
|
+
{ return a * Inv(b); }
|
|
187
|
+
|
|
188
|
+
template <int N> INLINE auto operator/ (SIMD<Complex, N> a, SIMD<Complex, N> b)
|
|
189
|
+
{ return a * Inv(b); }
|
|
190
|
+
|
|
191
|
+
template <int N> INLINE auto operator/ (SIMD<Complex, N> a, SIMD<double, N> b)
|
|
192
|
+
{ return a * (1.0/b); }
|
|
193
|
+
|
|
194
|
+
template <int N>
|
|
195
|
+
INLINE Complex HSum (SIMD<Complex, N> sc)
|
|
196
|
+
{
|
|
197
|
+
auto [re,im] = HSum(sc.real(), sc.imag());
|
|
198
|
+
return Complex(re,im);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
template <int N>
|
|
202
|
+
INLINE auto HSum (SIMD<Complex, N> sc1, SIMD<Complex, N> sc2)
|
|
203
|
+
{
|
|
204
|
+
auto [re1,im1,re2,im2] = HSum(sc1.real(), sc1.imag(), sc2.real(), sc2.imag());
|
|
205
|
+
return std::tuple(Complex(re1,im1), Complex(re2,im2));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
template <int N>
|
|
209
|
+
ostream & operator<< (ostream & ost, SIMD<Complex, N> c)
|
|
210
|
+
{
|
|
211
|
+
ost << c.real() << ", " << c.imag();
|
|
212
|
+
return ost;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
template <typename FUNC, int N>
|
|
217
|
+
SIMD<Complex, N> SIMDComplexWrapper (SIMD<Complex, N> x, FUNC f)
|
|
218
|
+
{
|
|
219
|
+
Complex hx[N];
|
|
220
|
+
x.StoreFast(hx);
|
|
221
|
+
for (auto & hxi : hx) hxi = f(hxi);
|
|
222
|
+
x.LoadFast(hx);
|
|
223
|
+
return x;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
template <int N>
|
|
227
|
+
inline SIMD<Complex, N> cos (SIMD<Complex, N> x)
|
|
228
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return cos(c); }); }
|
|
229
|
+
|
|
230
|
+
template <int N>
|
|
231
|
+
inline SIMD<Complex, N> sin (SIMD<Complex, N> x)
|
|
232
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return sin(c); }); }
|
|
233
|
+
|
|
234
|
+
template <int N>
|
|
235
|
+
inline SIMD<Complex, N> tan (SIMD<Complex, N> x)
|
|
236
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return tan(c); }); }
|
|
237
|
+
|
|
238
|
+
template <int N>
|
|
239
|
+
inline SIMD<Complex, N> atan (SIMD<Complex, N> x)
|
|
240
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return atan(c); }); }
|
|
241
|
+
|
|
242
|
+
template <int N>
|
|
243
|
+
inline SIMD<Complex, N> acos (SIMD<Complex, N> x)
|
|
244
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return acos(c); }); }
|
|
245
|
+
|
|
246
|
+
template <int N>
|
|
247
|
+
inline SIMD<Complex, N> asin (SIMD<Complex, N> x)
|
|
248
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return asin(c); }); }
|
|
249
|
+
|
|
250
|
+
template <int N>
|
|
251
|
+
inline SIMD<Complex, N> cosh (SIMD<Complex, N> x)
|
|
252
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return cosh(c); }); }
|
|
253
|
+
|
|
254
|
+
template <int N>
|
|
255
|
+
inline SIMD<Complex, N> sinh (SIMD<Complex, N> x)
|
|
256
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return sinh(c); }); }
|
|
257
|
+
|
|
258
|
+
template <int N>
|
|
259
|
+
inline SIMD<Complex, N> exp (SIMD<Complex, N> x)
|
|
260
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return exp(c); }); }
|
|
261
|
+
|
|
262
|
+
template <int N>
|
|
263
|
+
inline SIMD<Complex, N> log (SIMD<Complex, N> x)
|
|
264
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return log(c); }); }
|
|
265
|
+
|
|
266
|
+
template <int N>
|
|
267
|
+
inline SIMD<Complex, N> sqrt (SIMD<Complex, N> x)
|
|
268
|
+
{ return SIMDComplexWrapper (x, [](Complex c) { return sqrt(c); }); }
|
|
269
|
+
|
|
270
|
+
template <int N>
|
|
271
|
+
inline SIMD<Complex, N> Conj (SIMD<Complex, N> x)
|
|
272
|
+
{ return SIMD<Complex, N> (x.real(), -x.imag()); }
|
|
273
|
+
|
|
274
|
+
template <int N>
|
|
275
|
+
INLINE SIMD<Complex, N> IfPos (SIMD<Complex, N> a, SIMD<Complex, N> b, SIMD<Complex, N> c)
|
|
276
|
+
{
|
|
277
|
+
return SIMD<Complex, N> (IfPos (a.real(), b.real(), c.real()),
|
|
278
|
+
IfPos (a.real(), b.imag(), c.imag()));
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
template <int N>
|
|
283
|
+
INLINE SIMD<Complex, N> If (SIMD<mask64, N> a, SIMD<Complex, N> b, SIMD<Complex, N> c)
|
|
284
|
+
{
|
|
285
|
+
return SIMD<Complex, N> (If (a, b.real(), c.real()),
|
|
286
|
+
If (a, b.imag(), c.imag()));
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
template <typename T, size_t S> class MakeSimdCl;
|
|
293
|
+
|
|
294
|
+
template <size_t S>
|
|
295
|
+
class MakeSimdCl<Complex,S>
|
|
296
|
+
{
|
|
297
|
+
std::array<Complex,S> a;
|
|
298
|
+
public:
|
|
299
|
+
MakeSimdCl (std::array<Complex,S> aa) : a(aa) { ; }
|
|
300
|
+
auto Get() const
|
|
301
|
+
{
|
|
302
|
+
std::array<double,S> ar, ai;
|
|
303
|
+
for (int j = 0; j < S; j++)
|
|
304
|
+
{
|
|
305
|
+
ar[j] = ngbla::Real(a[j]);
|
|
306
|
+
ai[j] = ngbla::Imag(a[j]);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return SIMD<Complex,S> (MakeSimd(ar), MakeSimd(ai));
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
namespace ngbla
|
|
318
|
+
{
|
|
319
|
+
template <typename T> struct is_scalar_type;
|
|
320
|
+
template <int N>
|
|
321
|
+
struct is_scalar_type<ngcore::SIMD<double,N>> { static constexpr bool value = true; };
|
|
322
|
+
|
|
323
|
+
template <typename T> struct is_scalar_type;
|
|
324
|
+
template <int N>
|
|
325
|
+
struct is_scalar_type<ngcore::SIMD<ngcore::Complex,N>> { static constexpr bool value = true; };
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
#endif
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
#ifndef FILE_SMOOTHER
|
|
2
|
+
#define FILE_SMOOTHER
|
|
3
|
+
|
|
4
|
+
/*********************************************************************/
|
|
5
|
+
/* File: smoother.hh */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 20. Apr. 2000 */
|
|
8
|
+
/*********************************************************************/
|
|
9
|
+
|
|
10
|
+
namespace ngmg
|
|
11
|
+
{
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
Smoothing iteration for multigrid method.
|
|
15
|
+
Pure virtual base class.
|
|
16
|
+
*/
|
|
17
|
+
class NGS_DLL_HEADER Smoother
|
|
18
|
+
{
|
|
19
|
+
protected:
|
|
20
|
+
/// additive or multiplicative smoothing
|
|
21
|
+
int additive;
|
|
22
|
+
/// should coarse levels be updated, too ?
|
|
23
|
+
int updateall;
|
|
24
|
+
///
|
|
25
|
+
Flags flags;
|
|
26
|
+
public:
|
|
27
|
+
/// Constructor
|
|
28
|
+
Smoother();
|
|
29
|
+
/// Constructor
|
|
30
|
+
Smoother(const Flags & aflags);
|
|
31
|
+
/// Destructor
|
|
32
|
+
virtual ~Smoother();
|
|
33
|
+
|
|
34
|
+
/// Update smoother (fine level or all levels)
|
|
35
|
+
virtual void Update (bool force_update = 0) = 0;
|
|
36
|
+
|
|
37
|
+
/// Do steps iterations of pre-smoothing
|
|
38
|
+
virtual void PreSmooth (int level, ngla::BaseVector & u,
|
|
39
|
+
const ngla::BaseVector & f, int steps) const = 0;
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
/// Do steps iterations of pre-smoothing
|
|
43
|
+
virtual void PreSmoothResiduum (int level, ngla::BaseVector & u,
|
|
44
|
+
const ngla::BaseVector & f,
|
|
45
|
+
ngla::BaseVector & res,
|
|
46
|
+
int steps) const
|
|
47
|
+
{
|
|
48
|
+
PreSmooth (level, u, f, steps);
|
|
49
|
+
Residuum (level, u, f, res);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
/// Do steps iterations of post-smoothing
|
|
54
|
+
virtual void PostSmooth (int level, ngla::BaseVector & u,
|
|
55
|
+
const ngla::BaseVector & f, int steps) const = 0;
|
|
56
|
+
/// Apply the preconditioning action (additive or multiplicative)
|
|
57
|
+
virtual void Precond (int level, const ngla::BaseVector & f, ngla::BaseVector & u) const;
|
|
58
|
+
|
|
59
|
+
///
|
|
60
|
+
virtual void Residuum (int level, ngla::BaseVector & u,
|
|
61
|
+
const ngla::BaseVector & f,
|
|
62
|
+
ngla::BaseVector & d) const = 0;
|
|
63
|
+
|
|
64
|
+
///
|
|
65
|
+
void SetAdditive () { additive = 1; }
|
|
66
|
+
///
|
|
67
|
+
void SetUpdateAll (int ua) { updateall = ua; }
|
|
68
|
+
///
|
|
69
|
+
void SetMultiplicative () { additive = 0; }
|
|
70
|
+
///
|
|
71
|
+
int Additive () const { return additive; }
|
|
72
|
+
|
|
73
|
+
///
|
|
74
|
+
virtual AutoVector CreateVector(int level) const = 0;
|
|
75
|
+
|
|
76
|
+
virtual Array<MemoryUsage> GetMemoryUsage () const { return Array<MemoryUsage>(); }
|
|
77
|
+
private:
|
|
78
|
+
MemoryTracer mt = { "Smoother" };
|
|
79
|
+
public:
|
|
80
|
+
const MemoryTracer& GetMemoryTracer() const { return mt; }
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
Gauss-Seidel smoother.
|
|
86
|
+
Common relaxation of unknowns in node.
|
|
87
|
+
*/
|
|
88
|
+
class GSSmoother : public Smoother
|
|
89
|
+
{
|
|
90
|
+
///
|
|
91
|
+
// const MeshAccess & ma;
|
|
92
|
+
///
|
|
93
|
+
const BilinearForm & biform;
|
|
94
|
+
///
|
|
95
|
+
Array<shared_ptr<BaseJacobiPrecond>> jac;
|
|
96
|
+
|
|
97
|
+
public:
|
|
98
|
+
///
|
|
99
|
+
GSSmoother (const MeshAccess & ama,
|
|
100
|
+
const BilinearForm & abiform);
|
|
101
|
+
///
|
|
102
|
+
virtual ~GSSmoother();
|
|
103
|
+
|
|
104
|
+
///
|
|
105
|
+
virtual void Update (bool force_update = 0);
|
|
106
|
+
///
|
|
107
|
+
virtual void PreSmooth (int level, ngla::BaseVector & u,
|
|
108
|
+
const ngla::BaseVector & f, int steps) const;
|
|
109
|
+
///
|
|
110
|
+
virtual void PostSmooth (int level, ngla::BaseVector & u,
|
|
111
|
+
const ngla::BaseVector & f, int steps) const;
|
|
112
|
+
|
|
113
|
+
virtual void PreSmoothResiduum (int level, ngla::BaseVector & u,
|
|
114
|
+
const ngla::BaseVector & f,
|
|
115
|
+
ngla::BaseVector & res,
|
|
116
|
+
int steps) const;
|
|
117
|
+
|
|
118
|
+
///
|
|
119
|
+
virtual void Residuum (int level, ngla::BaseVector & u,
|
|
120
|
+
const ngla::BaseVector & f, ngla::BaseVector & d) const;
|
|
121
|
+
///
|
|
122
|
+
virtual AutoVector CreateVector(int level) const;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
Anisotropic smoother.
|
|
128
|
+
Common relaxation of vertically aligned nodes.
|
|
129
|
+
*/
|
|
130
|
+
class AnisotropicSmoother : public Smoother
|
|
131
|
+
{
|
|
132
|
+
///
|
|
133
|
+
const MeshAccess & ma;
|
|
134
|
+
///
|
|
135
|
+
const BilinearForm & biform;
|
|
136
|
+
///
|
|
137
|
+
Array<shared_ptr<BaseBlockJacobiPrecond>> jac;
|
|
138
|
+
|
|
139
|
+
public:
|
|
140
|
+
///
|
|
141
|
+
AnisotropicSmoother (const MeshAccess & ama,
|
|
142
|
+
const BilinearForm & abiform);
|
|
143
|
+
///
|
|
144
|
+
virtual ~AnisotropicSmoother();
|
|
145
|
+
|
|
146
|
+
///
|
|
147
|
+
virtual void Update (bool forace_update = 0);
|
|
148
|
+
///
|
|
149
|
+
virtual void PreSmooth (int level, ngla::BaseVector & u,
|
|
150
|
+
const ngla::BaseVector & f, int steps) const;
|
|
151
|
+
///
|
|
152
|
+
virtual void PostSmooth (int level, ngla::BaseVector & u,
|
|
153
|
+
const ngla::BaseVector & f, int steps) const;
|
|
154
|
+
///
|
|
155
|
+
virtual void Residuum (int level, ngla::BaseVector & u,
|
|
156
|
+
const ngla::BaseVector & f, ngla::BaseVector & d) const;
|
|
157
|
+
///
|
|
158
|
+
virtual AutoVector CreateVector(int level) const;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
Block-Gauss-Seidel smoother.
|
|
167
|
+
Blocks are defined by underlying FESpace.
|
|
168
|
+
*/
|
|
169
|
+
class BlockSmoother : public Smoother
|
|
170
|
+
{
|
|
171
|
+
///
|
|
172
|
+
// const MeshAccess & ma;
|
|
173
|
+
///
|
|
174
|
+
const BilinearForm & biform;
|
|
175
|
+
///
|
|
176
|
+
const LinearForm * constraint;
|
|
177
|
+
///
|
|
178
|
+
Array<shared_ptr<BaseBlockJacobiPrecond>> jac;
|
|
179
|
+
///
|
|
180
|
+
Array<shared_ptr<BaseMatrix>> inv;
|
|
181
|
+
///
|
|
182
|
+
shared_ptr<Array<int>> direct;
|
|
183
|
+
shared_ptr<Array<int>> userdefined_direct;
|
|
184
|
+
|
|
185
|
+
Array<shared_ptr<Table<int>>> smoothing_blocks;
|
|
186
|
+
|
|
187
|
+
public:
|
|
188
|
+
///
|
|
189
|
+
BlockSmoother (const MeshAccess & ama,
|
|
190
|
+
const BilinearForm & abiform, const Flags & aflags);
|
|
191
|
+
///
|
|
192
|
+
BlockSmoother (const MeshAccess & ama,
|
|
193
|
+
const BilinearForm & abiform,
|
|
194
|
+
const LinearForm & aconstraint, const Flags & aflags);
|
|
195
|
+
///
|
|
196
|
+
virtual ~BlockSmoother();
|
|
197
|
+
|
|
198
|
+
///
|
|
199
|
+
virtual void Update (bool forace_update = 0);
|
|
200
|
+
///
|
|
201
|
+
virtual void PreSmooth (int level, BaseVector & u,
|
|
202
|
+
const BaseVector & f, int steps) const;
|
|
203
|
+
///
|
|
204
|
+
virtual void PreSmoothResiduum (int level, ngla::BaseVector & u,
|
|
205
|
+
const ngla::BaseVector & f,
|
|
206
|
+
ngla::BaseVector & res,
|
|
207
|
+
int steps) const;
|
|
208
|
+
|
|
209
|
+
///
|
|
210
|
+
virtual void PostSmooth (int level, ngla::BaseVector & u,
|
|
211
|
+
const ngla::BaseVector & f, int steps) const;
|
|
212
|
+
///
|
|
213
|
+
virtual void Precond (int level, const ngla::BaseVector & f, ngla::BaseVector & u) const;
|
|
214
|
+
///
|
|
215
|
+
virtual void Residuum (int level, ngla::BaseVector & u,
|
|
216
|
+
const ngla::BaseVector & f, ngla::BaseVector & d) const;
|
|
217
|
+
///
|
|
218
|
+
virtual AutoVector CreateVector(int level) const;
|
|
219
|
+
|
|
220
|
+
virtual Array<MemoryUsage> GetMemoryUsage () const;
|
|
221
|
+
|
|
222
|
+
void SetDirectSolverCluster(shared_ptr<Array<int>> cluster)
|
|
223
|
+
{ userdefined_direct = cluster; }
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
#ifdef XXX_OBSOLETE
|
|
231
|
+
/**
|
|
232
|
+
Matrix - vector multiplication by smoothing step.
|
|
233
|
+
*/
|
|
234
|
+
class SmoothingPreconditioner : public ngla::BaseMatrix
|
|
235
|
+
{
|
|
236
|
+
///
|
|
237
|
+
const Smoother & smoother;
|
|
238
|
+
///
|
|
239
|
+
int level;
|
|
240
|
+
public:
|
|
241
|
+
///
|
|
242
|
+
SmoothingPreconditioner (const Smoother & asmoother,
|
|
243
|
+
int alevel = 0);
|
|
244
|
+
///
|
|
245
|
+
virtual void Mult (const ngla::BaseVector & f, ngla::BaseVector & u) const;
|
|
246
|
+
///
|
|
247
|
+
virtual AutoVector CreateVector () const;
|
|
248
|
+
};
|
|
249
|
+
#endif
|
|
250
|
+
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
#endif
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#ifndef FILE_SOLVE
|
|
2
|
+
#define FILE_SOLVE
|
|
3
|
+
|
|
4
|
+
/*********************************************************************/
|
|
5
|
+
/* File: solve.hpp */
|
|
6
|
+
/* Author: Joachim Schoeberl */
|
|
7
|
+
/* Date: 25. Mar. 2000 */
|
|
8
|
+
/*********************************************************************/
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
NGS Solvers: BVP, Instationary, ...
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
#include <ngstd.hpp>
|
|
17
|
+
#include <nginterface.h>
|
|
18
|
+
|
|
19
|
+
#include <comp.hpp>
|
|
20
|
+
#include <multigrid.hpp>
|
|
21
|
+
|
|
22
|
+
struct Tcl_Interp;
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/*
|
|
26
|
+
#ifdef WIN32
|
|
27
|
+
#define LOCAL_EXPORTS __declspec(dllexport)
|
|
28
|
+
#else
|
|
29
|
+
#define LOCAL_EXPORTS
|
|
30
|
+
#endif
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
A collection of solvers.
|
|
35
|
+
Numerical procedures NumProc, e.g. for
|
|
36
|
+
the solution of boundary value problems NumProcBVP or
|
|
37
|
+
eigen value problems NumProcEVP, and many many more.
|
|
38
|
+
*/
|
|
39
|
+
namespace ngsolve
|
|
40
|
+
{
|
|
41
|
+
using namespace std;
|
|
42
|
+
|
|
43
|
+
using namespace ngstd;
|
|
44
|
+
using namespace ngla;
|
|
45
|
+
using namespace ngfem;
|
|
46
|
+
using namespace ngcomp;
|
|
47
|
+
using namespace ngmg;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
/*
|
|
52
|
+
#include "numproc.hpp"
|
|
53
|
+
#include "pde.hpp"
|
|
54
|
+
*/
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/*
|
|
58
|
+
#ifdef WIN32
|
|
59
|
+
// trick from http://social.msdn.microsoft.com/Forums/en/vclanguage/thread/ab642c88-2d2d-4f5d-9fd7-2341442d5a46
|
|
60
|
+
// all new/delete allocation is done from ngsolve heap
|
|
61
|
+
|
|
62
|
+
NGS_DLL_HEADER void * __cdecl my_operator_new_replacement(size_t _count);
|
|
63
|
+
NGS_DLL_HEADER void __cdecl my_operator_delete_replacement(void * _ptr);
|
|
64
|
+
NGS_DLL_HEADER void * __cdecl my_operator_new_array_replacement(size_t _count);
|
|
65
|
+
NGS_DLL_HEADER void __cdecl my_operator_delete_array_replacement(void * _ptr);
|
|
66
|
+
|
|
67
|
+
#ifndef NGS_EXPORTS
|
|
68
|
+
inline void * __cdecl operator new(size_t _count) {
|
|
69
|
+
return my_operator_new_replacement(_count);
|
|
70
|
+
}
|
|
71
|
+
inline void __cdecl operator delete(void * _ptr) {
|
|
72
|
+
my_operator_delete_replacement(_ptr);
|
|
73
|
+
}
|
|
74
|
+
inline void * __cdecl operator new[](size_t _count) {
|
|
75
|
+
return my_operator_new_array_replacement(_count);
|
|
76
|
+
}
|
|
77
|
+
inline void __cdecl operator delete[](void * _ptr) {
|
|
78
|
+
my_operator_delete_array_replacement(_ptr);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#endif
|
|
82
|
+
|
|
83
|
+
#endif
|
|
84
|
+
*/
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
#endif
|